aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgtags2
-rw-r--r--CMakeLists.txt5
-rw-r--r--Makefile.am45
-rw-r--r--NEWS113
-rw-r--r--THANKS3
-rw-r--r--configure.ac24
-rw-r--r--contrib/Makefile.am8
-rw-r--r--contrib/extractor/CMakeLists.txt21
-rw-r--r--contrib/extractor/Makefile471
-rw-r--r--contrib/extractor/Makefile.am10
-rw-r--r--contrib/extractor/README.linux12
-rw-r--r--contrib/extractor/System.cpp122
-rw-r--r--contrib/extractor/ad.exebin158720 -> 159744 bytes
-rw-r--r--contrib/extractor/adt.cpp539
-rw-r--r--contrib/extractor/adt.h141
-rw-r--r--contrib/extractor/libmpq/CMakeLists.txt13
-rw-r--r--contrib/extractor/libmpq/Makefile17
-rw-r--r--contrib/extractor/libmpq/Makefile.am23
-rw-r--r--contrib/extractor/libmpq/mpq.cpp2
-rw-r--r--contrib/vmap_debugger/ModelContainerView.cpp4
-rw-r--r--contrib/vmap_extract_assembler_bin/vmap_assembler.exebin184320 -> 293888 bytes
-rw-r--r--contrib/vmap_extract_assembler_bin/vmapextract_v2.exebin233472 -> 217088 bytes
-rw-r--r--contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt318
-rw-r--r--contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt421
-rw-r--r--contrib/vmap_extractor_v2/stormlib/Makefile58
-rw-r--r--contrib/vmap_extractor_v2/stormlib/bzip2/Makefile205
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/Makefile175
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in175
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/configure212
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile25
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile14
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/model.cpp159
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/model.h65
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/modelheaders.h344
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp6
-rw-r--r--dep/Makefile.am4
-rw-r--r--dep/include/Makefile.am60
-rw-r--r--dep/include/mersennetwister/MersenneTwister.h2
-rw-r--r--dep/lib/Makefile.am14
-rw-r--r--dep/src/Makefile.am4
-rw-r--r--dep/src/sockets/Makefile.am4
-rw-r--r--doc/Makefile.am4
-rw-r--r--sql/Makefile.am4
-rw-r--r--sql/TBC-WLK converter/Readme.txt8
-rw-r--r--sql/TBC-WLK converter/TBC-WLK_characters.sql375
-rw-r--r--sql/TBC-WLK converter/TBC-WLK_world.sql9136
-rw-r--r--sql/TBC-WLK converter/TBC-WLK_world_run_only_once.sql189
-rw-r--r--sql/characters.sql333
-rw-r--r--sql/mangos.sql17847
-rw-r--r--sql/realmd.sql27
-rw-r--r--sql/tools/Makefile.am4
-rw-r--r--sql/trinityscript_script_texts.sql463
-rw-r--r--sql/updates/1026_mangos_7113_01_characters_character_achievement_progress.sql3
-rw-r--r--sql/updates/1028_mangos_7141_01_world_instance_template.sql12
-rw-r--r--sql/updates/1028_mangos_7147_01_world_creature_template.sql4
-rw-r--r--sql/updates/1028_mangos_7150_01_world_playercreateinfo_spell.sql10
-rw-r--r--sql/updates/1073_world_scripts.sql2
-rw-r--r--sql/updates/1074_world_scripts.sql2
-rw-r--r--sql/updates/1084_mangos_7168_01_world_command.sql6
-rw-r--r--sql/updates/1094_mangos_7193_01_world_trinity_string.sql3
-rw-r--r--sql/updates/1108_mangos_7196_02_world_spell_bonus_data.sql233
-rw-r--r--sql/updates/1108_mangos_7198_01_characters_characters.sql27
-rw-r--r--sql/updates/1108_mangos_7199_01_world_spell_bonus_data.sql11
-rw-r--r--sql/updates/1135_mangos_7207_01_world_creature.sql4
-rw-r--r--sql/updates/1135_mangos_7207_02_world_gameobject.sql4
-rw-r--r--sql/updates/1135_mangos_7207_03_characters_corpse.sql4
-rw-r--r--sql/updates/1140_mangos_7209_01_world_spell_bonus_data.sql5
-rw-r--r--sql/updates/1185_mangos_7214_01_world_command.sql8
-rw-r--r--sql/updates/1185_mangos_7214_02_world_trinity_string.sql5
-rw-r--r--sql/updates/1185_mangos_7214_03_world_spell_proc_event.sql865
-rw-r--r--sql/updates/1206_world_scripts.sql1
-rw-r--r--sql/updates/1207_world_scripts.sql2
-rw-r--r--sql/updates/1237_mangos_7230_01_world_spell_bonus_data.sql9
-rw-r--r--sql/updates/1248_mangos_7235_01_world_command.sql5
-rw-r--r--sql/updates/1288_mangos_7242_01_world_spell_bonus_data.sql7
-rw-r--r--sql/updates/1293_mangos_7249_01_world_spell_proc_event.sql3
-rw-r--r--sql/updates/1296_mangos_7252_01_world_command.sql6
-rw-r--r--sql/updates/1296_mangos_7252_02_world_trinity_string.sql14
-rw-r--r--sql/updates/1299_mangos_7255_01_characters_characters.sql10
-rw-r--r--sql/updates/1307_world.sql1
-rw-r--r--sql/updates/1312_world.sql16
-rw-r--r--sql/updates/1327_world.sql4
-rw-r--r--sql/updates/1351_world.sql784
-rw-r--r--sql/updates/1396_mangos_7267_01_characters_auctionhouse.sql4
-rw-r--r--sql/updates/1414_world_scripts.sql121
-rw-r--r--sql/updates/1423_mangos_7290_01_world_command.sql5
-rw-r--r--sql/updates/1426_mangos_7292_01_world_points_of_interest.sql13
-rw-r--r--sql/updates/1426_mangos_7292_02_world_locales_points_of_interest.sql15
-rw-r--r--sql/updates/1463_mangos_7303_01_world_pools.sql39
-rw-r--r--sql/updates/1470_world_scripts.sql4
-rw-r--r--sql/updates/1484_mangos_7307_01_characters_arena_team_member.sql4
-rw-r--r--sql/updates/1495_mangos_7312_01_world_trinity_string.sql5
-rw-r--r--sql/updates/1497_mangos_7314_01_characters_guild_rank.sql3
-rw-r--r--sql/updates/1525_world_scripts.sql2
-rw-r--r--sql/updates/1531_mangos_7324_01_characters_character_spell.sql13
-rw-r--r--sql/updates/1531_mangos_7324_02_characters_character_aura.sql13
-rw-r--r--sql/updates/1555_mangos_7331_01_world_command.sql65
-rw-r--r--sql/updates/1558_world_spell_linked_spell.sql5
-rw-r--r--sql/updates/1559_world.sql11
-rw-r--r--sql/updates/1570_world.sql3
-rw-r--r--sql/updates/2.4.3_updates/1018_world.sql (renamed from sql/updates/1018_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/1026_world.sql (renamed from sql/updates/1026_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/1028_world_scripts.sql (renamed from sql/updates/1028_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/102_world.sql (renamed from sql/updates/102_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/1069_world_scripts.sql (renamed from sql/updates/1069_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/1073_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/1074_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/112_world_scripts.sql (renamed from sql/updates/112_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/116_world.sql (renamed from sql/updates/116_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/117_world_scripts.sql (renamed from sql/updates/117_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/11_characters.sql (renamed from sql/updates/11_characters.sql)3
-rw-r--r--sql/updates/2.4.3_updates/120_world.sql (renamed from sql/updates/120_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/123_world_scripts.sql (renamed from sql/updates/123_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/125_world_scripts.sql (renamed from sql/updates/125_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/133_world_scripts.sql (renamed from sql/updates/133_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/140_world.sql (renamed from sql/updates/140_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/145_world_scripts.sql (renamed from sql/updates/145_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/146_world.sql (renamed from sql/updates/146_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/147_world.sql (renamed from sql/updates/147_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/152_world.sql (renamed from sql/updates/152_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/153_world.sql (renamed from sql/updates/153_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/171_world.sql (renamed from sql/updates/171_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/172_world_scripts.sql (renamed from sql/updates/172_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/175_world_scripts.sql (renamed from sql/updates/175_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/176_world.sql (renamed from sql/updates/176_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/182_world.sql (renamed from sql/updates/182_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/212_world_scripts.sql (renamed from sql/updates/212_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/220_characters.sql (renamed from sql/updates/220_characters.sql)3
-rw-r--r--sql/updates/2.4.3_updates/230_world.sql (renamed from sql/updates/230_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/230_world_blacktemple.sql (renamed from sql/updates/230_world_blacktemple.sql)3
-rw-r--r--sql/updates/2.4.3_updates/230_world_scripts.sql (renamed from sql/updates/230_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/230_world_serpent_shrine.sql (renamed from sql/updates/230_world_serpent_shrine.sql)1
-rw-r--r--sql/updates/2.4.3_updates/231_world_scripts.sql (renamed from sql/updates/231_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/233_world.sql (renamed from sql/updates/233_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/238_world.sql1
-rw-r--r--sql/updates/2.4.3_updates/240_world.sql (renamed from sql/updates/240_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/241_world.sql (renamed from sql/updates/241_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/247_world.sql (renamed from sql/updates/247_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/262_characters.sql (renamed from sql/updates/262_characters.sql)1
-rw-r--r--sql/updates/2.4.3_updates/262_realmd.sql (renamed from sql/updates/262_realmd.sql)1
-rw-r--r--sql/updates/2.4.3_updates/262_world.sql (renamed from sql/updates/262_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/273_world_scripts.sql (renamed from sql/updates/273_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/285_world.sql (renamed from sql/updates/285_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/287_world_scripts.sql (renamed from sql/updates/287_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/329_world.sql (renamed from sql/updates/329_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/332_world.sql (renamed from sql/updates/332_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/333_world.sql (renamed from sql/updates/333_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/334_world.sql (renamed from sql/updates/334_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/341_world.sql1
-rw-r--r--sql/updates/2.4.3_updates/356_world.sql (renamed from sql/updates/356_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/373_world_scripts.sql (renamed from sql/updates/373_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/377_world_scripts.sql (renamed from sql/updates/377_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/389_world.sql (renamed from sql/updates/389_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/400_world.sql (renamed from sql/updates/400_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/410_characters.sql (renamed from sql/updates/410_characters.sql)1
-rw-r--r--sql/updates/2.4.3_updates/426_world_scripts.sql (renamed from sql/updates/426_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/427_world_scripts.sql (renamed from sql/updates/427_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/444_world.sql (renamed from sql/updates/444_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/452_world.sql (renamed from sql/updates/452_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/455_world.sql (renamed from sql/updates/455_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/45_characters.sql (renamed from sql/updates/45_characters.sql)1
-rw-r--r--sql/updates/2.4.3_updates/471_world.sql (renamed from sql/updates/471_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/480_world_scripts.sql (renamed from sql/updates/480_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/488_world_scripts.sql (renamed from sql/updates/488_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/502_world_scripts.sql (renamed from sql/updates/502_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/505_world.sql (renamed from sql/updates/505_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/506_world.sql (renamed from sql/updates/506_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/513_world_scripts.sql (renamed from sql/updates/513_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/519_world.sql (renamed from sql/updates/519_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/537_world.sql (renamed from sql/updates/537_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/541_characters.sql (renamed from sql/updates/541_characters.sql)1
-rw-r--r--sql/updates/2.4.3_updates/541_world.sql (renamed from sql/updates/541_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/542_characters.sql (renamed from sql/updates/542_characters.sql)1
-rw-r--r--sql/updates/2.4.3_updates/54_world.sql (renamed from sql/updates/54_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/551_world.sql (renamed from sql/updates/551_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/566_world.sql (renamed from sql/updates/566_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/571_world.sql (renamed from sql/updates/571_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/572_world.sql (renamed from sql/updates/572_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/575_world_scripts.sql (renamed from sql/updates/575_world_scripts.sql)1
-rw-r--r--sql/updates/2.4.3_updates/57_world_scripts.sql (renamed from sql/updates/57_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/583_world_scripts.sql (renamed from sql/updates/583_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/586_world_scripts.sql (renamed from sql/updates/586_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/588_world.sql (renamed from sql/updates/588_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/608_world.sql (renamed from sql/updates/608_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/615_world.sql (renamed from sql/updates/615_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/636_world_scripts.sql (renamed from sql/updates/636_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/640_world.sql (renamed from sql/updates/640_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/645_world_scripts.sql (renamed from sql/updates/645_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/667_world_scripts.sql (renamed from sql/updates/667_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/66_world_scripts.sql (renamed from sql/updates/66_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/676_world.sql (renamed from sql/updates/676_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/679_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/683_world_scripts.sql2
-rw-r--r--sql/updates/2.4.3_updates/686_world_scripts.sql (renamed from sql/updates/686_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/68_world.sql (renamed from sql/updates/68_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/691_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/692_world.sql5
-rw-r--r--sql/updates/2.4.3_updates/708_world_scripts.sql2
-rw-r--r--sql/updates/2.4.3_updates/70_world_scripts.sql (renamed from sql/updates/70_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/722_world_script_texts.sql (renamed from sql/updates/722_world_script_texts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/724_world.sql3
-rw-r--r--sql/updates/2.4.3_updates/725_characters.sql5
-rw-r--r--sql/updates/2.4.3_updates/725_world.sql31
-rw-r--r--sql/updates/2.4.3_updates/728_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/733_characters.sql1
-rw-r--r--sql/updates/2.4.3_updates/739_characters.sql1
-rw-r--r--sql/updates/2.4.3_updates/741_characters.sql (renamed from sql/updates/741_characters.sql)1
-rw-r--r--sql/updates/2.4.3_updates/741_world.sql (renamed from sql/updates/741_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/747_world.sql (renamed from sql/updates/747_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/748_world_scripts.sql3
-rw-r--r--sql/updates/2.4.3_updates/758_world_scripts.sql6
-rw-r--r--sql/updates/2.4.3_updates/762_world.sql (renamed from sql/updates/762_world.sql)5
-rw-r--r--sql/updates/2.4.3_updates/764_world_scripts.sql123
-rw-r--r--sql/updates/2.4.3_updates/765_world_scripts.sql (renamed from sql/updates/765_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/773_world_scripts.sql (renamed from sql/updates/773_world_scripts.sql)9
-rw-r--r--sql/updates/2.4.3_updates/780_characters.sql (renamed from sql/updates/780_characters.sql)3
-rw-r--r--sql/updates/2.4.3_updates/783_world.sql (renamed from sql/updates/783_world.sql)7
-rw-r--r--sql/updates/2.4.3_updates/785_world.sql (renamed from sql/updates/785_world.sql)5
-rw-r--r--sql/updates/2.4.3_updates/789_world.sql1
-rw-r--r--sql/updates/2.4.3_updates/78_world.sql (renamed from sql/updates/78_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/79_characters.sql (renamed from sql/updates/79_characters.sql)3
-rw-r--r--sql/updates/2.4.3_updates/79_world.sql (renamed from sql/updates/79_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/807_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/817_world_scripts.sql (renamed from sql/updates/817_world_scripts.sql)9
-rw-r--r--sql/updates/2.4.3_updates/822_world_scripts.sql3
-rw-r--r--sql/updates/2.4.3_updates/826_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/82_world_scripts.sql (renamed from sql/updates/82_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/833_world_scripts.sql2
-rw-r--r--sql/updates/2.4.3_updates/834_world_scripts.sql (renamed from sql/updates/834_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/837_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/838_world_scripts.sql4
-rw-r--r--sql/updates/2.4.3_updates/839_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/83_realmd.sql (renamed from sql/updates/83_realmd.sql)3
-rw-r--r--sql/updates/2.4.3_updates/840_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/841_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/842_world.sql (renamed from sql/updates/842_world.sql)3
-rw-r--r--sql/updates/2.4.3_updates/84_world.sql (renamed from sql/updates/84_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/850_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/852_world_scripts.sql2
-rw-r--r--sql/updates/2.4.3_updates/857_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/863_world_scripts.sql (renamed from sql/updates/863_world_scripts.sql)9
-rw-r--r--sql/updates/2.4.3_updates/86_world_scripts.sql (renamed from sql/updates/86_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/871_world.sql (renamed from sql/updates/871_world.sql)5
-rw-r--r--sql/updates/2.4.3_updates/884_world.sql (renamed from sql/updates/884_world.sql)7
-rw-r--r--sql/updates/2.4.3_updates/905_world_scripts.sql (renamed from sql/updates/905_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/90_world.sql (renamed from sql/updates/90_world.sql)1
-rw-r--r--sql/updates/2.4.3_updates/917_world.sql (renamed from sql/updates/917_world.sql)7
-rw-r--r--sql/updates/2.4.3_updates/919_world.sql2
-rw-r--r--sql/updates/2.4.3_updates/927_characters.sql (renamed from sql/updates/927_characters.sql)3
-rw-r--r--sql/updates/2.4.3_updates/930_characters.sql (renamed from sql/updates/930_characters.sql)5
-rw-r--r--sql/updates/2.4.3_updates/933_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/935_world_scripts.sql6
-rw-r--r--sql/updates/2.4.3_updates/940_world_scripts.sql2
-rw-r--r--sql/updates/2.4.3_updates/945_world_scripts.sql (renamed from sql/updates/945_world_scripts.sql)22
-rw-r--r--sql/updates/2.4.3_updates/947_world_scripts.sql (renamed from sql/updates/947_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/948_world_scripts.sql (renamed from sql/updates/948_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/950_world_scripts.sql (renamed from sql/updates/950_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/951_world_scripts.sql (renamed from sql/updates/951_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/952_world_scripts.sql (renamed from sql/updates/952_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/953_world_scripts.sql (renamed from sql/updates/953_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/954_world_scripts.sql (renamed from sql/updates/954_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/955_world_scripts.sql (renamed from sql/updates/955_world_scripts.sql)15
-rw-r--r--sql/updates/2.4.3_updates/956_world_scripts.sql (renamed from sql/updates/956_world_scripts.sql)11
-rw-r--r--sql/updates/2.4.3_updates/957_world_scripts.sql (renamed from sql/updates/957_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/963_world_scripts.sql (renamed from sql/updates/963_world_scripts.sql)17
-rw-r--r--sql/updates/2.4.3_updates/965_world_scripts.sql (renamed from sql/updates/965_world_scripts.sql)3
-rw-r--r--sql/updates/2.4.3_updates/966_world_scripts.sql (renamed from sql/updates/966_world_scripts.sql)7
-rw-r--r--sql/updates/2.4.3_updates/970_world_scripts.sql (renamed from sql/updates/970_world_scripts.sql)8
-rw-r--r--sql/updates/2.4.3_updates/973_world_scripts.sql1
-rw-r--r--sql/updates/2.4.3_updates/CMakeLists.txt171
-rw-r--r--sql/updates/238_world.sql2
-rw-r--r--sql/updates/341_world.sql2
-rw-r--r--sql/updates/679_world_scripts.sql2
-rw-r--r--sql/updates/683_world_scripts.sql3
-rw-r--r--sql/updates/691_world_scripts.sql2
-rw-r--r--sql/updates/692_world.sql8
-rw-r--r--sql/updates/708_world_scripts.sql3
-rw-r--r--sql/updates/724_world.sql4
-rw-r--r--sql/updates/725_characters.sql6
-rw-r--r--sql/updates/725_world.sql31
-rw-r--r--sql/updates/728_world_scripts.sql2
-rw-r--r--sql/updates/7332_01_mangos_command.sql6
-rw-r--r--sql/updates/733_characters.sql2
-rw-r--r--sql/updates/739_characters.sql2
-rw-r--r--sql/updates/748_world_scripts.sql3
-rw-r--r--sql/updates/758_world_scripts.sql6
-rw-r--r--sql/updates/764_world_scripts.sql124
-rw-r--r--sql/updates/789_world.sql2
-rw-r--r--sql/updates/805_world_scripts.sql123
-rw-r--r--sql/updates/807_world_scripts.sql2
-rw-r--r--sql/updates/822_world_scripts.sql4
-rw-r--r--sql/updates/826_world_scripts.sql2
-rw-r--r--sql/updates/833_world_scripts.sql3
-rw-r--r--sql/updates/837_world_scripts.sql2
-rw-r--r--sql/updates/838_world_scripts.sql5
-rw-r--r--sql/updates/839_world_scripts.sql2
-rw-r--r--sql/updates/840_world_scripts.sql2
-rw-r--r--sql/updates/841_world_scripts.sql2
-rw-r--r--sql/updates/850_world_scripts.sql2
-rw-r--r--sql/updates/852_world_scripts.sql3
-rw-r--r--sql/updates/857_world_scripts.sql2
-rw-r--r--sql/updates/875_mangos_7047_01_characters_character_spell.sql10
-rw-r--r--sql/updates/875_mangos_7059_01_characters_pet_spell.sql4
-rw-r--r--sql/updates/919_world.sql3
-rw-r--r--sql/updates/933_world_scripts.sql2
-rw-r--r--sql/updates/935_world_scripts.sql7
-rw-r--r--sql/updates/940_world_scripts.sql3
-rw-r--r--sql/updates/973_world_scripts.sql2
-rw-r--r--sql/updates/CMakeLists.txt222
-rw-r--r--sql/world.sql10633
-rw-r--r--sql/world_scripts_full.sql191
-rw-r--r--sql/world_scripts_structure.sql28
-rw-r--r--sql/world_spell_full.sql4
-rw-r--r--src/CMakeLists.txt4
-rw-r--r--src/Makefile.am10
-rw-r--r--src/bindings/Makefile.am12
-rw-r--r--src/bindings/interface/Makefile.am4
-rw-r--r--src/bindings/interface/ScriptMgr.cpp4
-rw-r--r--src/bindings/interface/ScriptMgr.h4
-rw-r--r--src/bindings/interface/Scripts/sc_default.cpp4
-rw-r--r--src/bindings/interface/Scripts/sc_defines.cpp4
-rw-r--r--src/bindings/interface/Scripts/sc_defines.h4
-rw-r--r--src/bindings/interface/config.h4
-rw-r--r--src/bindings/interface/system.cpp4
-rw-r--r--src/bindings/scripts/CMakeLists.txt12
-rw-r--r--src/bindings/scripts/Makefile.am16
-rw-r--r--src/bindings/scripts/ScriptMgr.cpp187
-rw-r--r--src/bindings/scripts/ScriptMgr.h2
-rw-r--r--src/bindings/scripts/VC71/71ScriptDev2.vcproj144
-rw-r--r--src/bindings/scripts/VC80/80ScriptDev2.vcproj148
-rw-r--r--src/bindings/scripts/VC90/90ScriptDev2.vcproj176
-rw-r--r--src/bindings/scripts/docs/EventAI.txt29
-rw-r--r--src/bindings/scripts/include/precompiled.cpp2
-rw-r--r--src/bindings/scripts/include/precompiled.h2
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp65
-rw-r--r--src/bindings/scripts/include/sc_creature.h4
-rw-r--r--src/bindings/scripts/include/sc_gossip.h55
-rw-r--r--src/bindings/scripts/include/sc_instance.h2
-rw-r--r--src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp14
-rw-r--r--src/bindings/scripts/scripts/boss/boss_emeriss.cpp2
-rw-r--r--src/bindings/scripts/scripts/boss/boss_lethon.cpp2
-rw-r--r--src/bindings/scripts/scripts/boss/boss_taerar.cpp2
-rw-r--r--src/bindings/scripts/scripts/boss/boss_ysondre.cpp2
-rw-r--r--src/bindings/scripts/scripts/creature/mob_event_ai.cpp151
-rw-r--r--src/bindings/scripts/scripts/creature/mob_event_ai.h82
-rw-r--r--src/bindings/scripts/scripts/creature/mob_generic_creature.cpp2
-rw-r--r--src/bindings/scripts/scripts/creature/simple_ai.cpp55
-rw-r--r--src/bindings/scripts/scripts/creature/simple_ai.h14
-rw-r--r--src/bindings/scripts/scripts/examples/example_creature.cpp261
-rw-r--r--src/bindings/scripts/scripts/examples/example_escort.cpp220
-rw-r--r--src/bindings/scripts/scripts/examples/example_gossip_codebox.cpp88
-rw-r--r--src/bindings/scripts/scripts/examples/example_misc.cpp65
-rw-r--r--src/bindings/scripts/scripts/go/go_scripts.cpp20
-rw-r--r--src/bindings/scripts/scripts/guard/guard_ai.cpp18
-rw-r--r--src/bindings/scripts/scripts/guard/guard_ai.h2
-rw-r--r--src/bindings/scripts/scripts/guard/guards.cpp882
-rw-r--r--src/bindings/scripts/scripts/item/item_scripts.cpp2
-rw-r--r--src/bindings/scripts/scripts/npc/npc_escortAI.cpp2
-rw-r--r--src/bindings/scripts/scripts/npc/npc_escortAI.h2
-rw-r--r--src/bindings/scripts/scripts/npc/npc_innkeeper.cpp2
-rw-r--r--src/bindings/scripts/scripts/npc/npc_professions.cpp4
-rw-r--r--src/bindings/scripts/scripts/npc/npcs_special.cpp240
-rw-r--r--src/bindings/scripts/scripts/zone/alterac_mountains/alterac_mountains.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp5
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_pandemonius.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_darkweaver_syth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/def_sethekk_halls.h2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/instance_sethekk_halls.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp40
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/def_shadow_labyrinth.h2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/azshara/azshara.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azshara/boss_azuregos.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp225
-rw-r--r--src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/black_temple.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_bloodboil.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp65
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_mother_shahraz.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_teron_gorefiend.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/def_black_temple.h2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/illidari_council.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/blackrock_depths.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_anubshiah.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp18
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_general_angerforge.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_grizzle.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_magmus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/boss_moira_bronzebeard.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_drakkisath.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_gyth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_halycon.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_highlord_omokk.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_quartermaster_zigris.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_rend_blackhand.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_the_beast.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_spire/boss_warmaster_voone.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_chromaggus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_ebonroc.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_firemaw.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_flamegor.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_nefarian.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_razorgore.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackwing_lair/instance_blackwing_lair.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp279
-rw-r--r--src/bindings/scripts/scripts/zone/blasted_lands/blasted_lands.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blasted_lands/boss_kruul.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/borean_tundra/borean_tundra.cpp105
-rw-r--r--src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/dark_portal.cpp19
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp31
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_archimonde.cpp396
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/def_hyjal.h2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp37
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/def_old_hillsbrad.h2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp25
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp18
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/def_steam_vault.h2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_hungarfen.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/dun_morogh/dun_morogh.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/eastern_plaguelands/eastern_plaguelands.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/elwynn_forest/elwynn_forest.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp41
-rw-r--r--src/bindings/scripts/scripts/zone/felwood/felwood.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/feralas/feralas.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp126
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp21
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h24
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_broggok.cpp54
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_the_maker.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/def_magtheridons_lair.h2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp77
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp17
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp135
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/def_shattered_halls.h2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/ironforge/ironforge.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/isle_of_queldanas/isle_of_queldanas.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_curator.cpp118
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_maiden_of_virtue.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_netherspite.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp52
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_shade_of_aran.cpp9
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp38
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp302
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/def_karazhan.h2
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp34
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/karazhan.cpp48
-rw-r--r--src/bindings/scripts/scripts/zone/loch_modan/loch_modan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp551
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp367
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp143
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp145
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h13
-rw-r--r--src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp86
-rw-r--r--src/bindings/scripts/scripts/zone/maraudon/boss_celebras_the_cursed.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/maraudon/boss_landslide.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/maraudon/boss_noxxion.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/maraudon/boss_princess_theradras.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_baron_geddon.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_garr.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_gehennas.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_golemagg.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_lucifron.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_magmadar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_majordomo_executus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/boss_sulfuron_harbinger.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/def_molten_core.h2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/instance_molten_core.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/molten_core/molten_core.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/mulgore/mulgore.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_four_horsemen.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp25
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_highlord_mograine.cpp179
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_loatheb.cpp72
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_maexxna.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_thaddius.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp14
-rw-r--r--src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/orgrimmar/orgrimmar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp95
-rw-r--r--src/bindings/scripts/scripts/zone/razorfen_kraul/razorfen_kraul.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_buru.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ossirian.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_rajaxx.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp24
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp37
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_herod.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp23
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp78
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_mograine_and_whitemane.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_scorn.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/def_scarlet_monastery.h8
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_darkmaster_gandling.cpp20
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_death_knight_darkreaver.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_illucia_barov.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_instructor_malicia.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_jandice_barov.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_kormok.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_lord_alexei_barov.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_ras_frostwhisper.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_the_ravenian.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/boss_vectus.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/def_scholomance.h5
-rw-r--r--src/bindings/scripts/scripts/zone/scholomance/instance_scholomance.cpp92
-rw-r--r--src/bindings/scripts/scripts/zone/searing_gorge/searing_gorge.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/def_shadowfang_keep.h2
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/shadowmoon_valley/boss_doomwalker.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/silithus/silithus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/silvermoon/silvermoon_city.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stormwind/stormwind_city.cpp35
-rw-r--r--src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_baron_rivendare.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_baroness_anastari.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_cannon_master_willey.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_magistrate_barthilas.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_maleki_the_pallid.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_nerubenkan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_order_of_silver_hand.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_postmaster_malown.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_ramstein_the_gorger.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/def_stratholme.h2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/instance_stratholme.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp18
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp18
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/def_arcatraz.h2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/instance_arcatraz.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_high_botanist_freywinn.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_laj.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_warp_splinter.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp16
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/the_eye.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/instance_mechanar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_fankriss.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp34
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_viscidus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/def_temple_of_ahnqiraj.h2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/terokkar_forest/terokkar_forest.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/thunder_bluff/thunder_bluff.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tirisfal_glades/tirisfal_glades.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/uldaman/boss_ironaya.cpp14
-rw-r--r--src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/uldaman/uldaman.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/undercity/undercity.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/boss_keleseth.cpp341
-rw-r--r--src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/def_utgarde_keep.h28
-rw-r--r--src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp234
-rw-r--r--src/bindings/scripts/scripts/zone/wailing_caverns/instance_wailing_caverns.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/westfall/westfall.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/winterspring/winterspring.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulfarrak/zulfarrak.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_gahzranka.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_hakkar.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_hazzarah.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_jindo.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp14
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp24
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_wushoolay.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/def_zulgurub.h2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/instance_zulgurub.cpp2
-rw-r--r--src/bindings/scripts/system.cpp4
-rw-r--r--src/framework/Dynamic/FactoryHolder.h4
-rw-r--r--src/framework/Dynamic/ObjectRegistry.h4
-rw-r--r--src/framework/GameSystem/Grid.h4
-rw-r--r--src/framework/GameSystem/GridLoader.h4
-rw-r--r--src/framework/GameSystem/GridRefManager.h4
-rw-r--r--src/framework/GameSystem/GridReference.h4
-rw-r--r--src/framework/GameSystem/NGrid.h26
-rw-r--r--src/framework/GameSystem/TypeContainer.h4
-rw-r--r--src/framework/GameSystem/TypeContainerFunctions.h4
-rw-r--r--src/framework/GameSystem/TypeContainerFunctionsPtr.h4
-rw-r--r--src/framework/GameSystem/TypeContainerVisitor.h4
-rw-r--r--src/framework/Makefile.am4
-rw-r--r--src/framework/Network/SocketDefines.h4
-rw-r--r--src/framework/Platform/CompilerDefs.h4
-rw-r--r--src/framework/Platform/Define.h4
-rw-r--r--src/framework/Policies/CreationPolicy.h4
-rw-r--r--src/framework/Policies/ObjectLifeTime.cpp4
-rw-r--r--src/framework/Policies/ObjectLifeTime.h8
-rw-r--r--src/framework/Policies/Singleton.h4
-rw-r--r--src/framework/Policies/SingletonImp.h4
-rw-r--r--src/framework/Policies/ThreadingModel.h4
-rw-r--r--src/framework/Utilities/ByteConverter.h4
-rw-r--r--src/framework/Utilities/Callback.h4
-rw-r--r--src/framework/Utilities/CountedReference/Reference.h4
-rw-r--r--src/framework/Utilities/CountedReference/ReferenceHolder.h4
-rw-r--r--src/framework/Utilities/CountedReference/ReferenceImpl.h4
-rw-r--r--src/framework/Utilities/EventProcessor.cpp4
-rw-r--r--src/framework/Utilities/EventProcessor.h4
-rw-r--r--src/framework/Utilities/LinkedList.h4
-rw-r--r--src/framework/Utilities/LinkedReference/RefManager.h4
-rw-r--r--src/framework/Utilities/LinkedReference/Reference.h18
-rw-r--r--src/framework/Utilities/TypeList.h4
-rw-r--r--src/framework/Utilities/UnorderedMap.h4
-rw-r--r--src/game/AccountMgr.cpp10
-rw-r--r--src/game/AccountMgr.h4
-rw-r--r--src/game/AchievementMgr.cpp1272
-rw-r--r--src/game/AchievementMgr.h176
-rw-r--r--src/game/AddonHandler.cpp69
-rw-r--r--src/game/AddonHandler.h4
-rw-r--r--src/game/AggressorAI.cpp4
-rw-r--r--src/game/AggressorAI.h4
-rw-r--r--src/game/AnimalRandomMovementGenerator.h4
-rw-r--r--src/game/ArenaTeam.cpp56
-rw-r--r--src/game/ArenaTeam.h19
-rw-r--r--src/game/ArenaTeamHandler.cpp6
-rw-r--r--src/game/AuctionHouseBot.cpp52
-rw-r--r--src/game/AuctionHouseBot.h9
-rw-r--r--src/game/AuctionHouseHandler.cpp656
-rw-r--r--src/game/AuctionHouseMgr.cpp692
-rw-r--r--src/game/AuctionHouseMgr.h180
-rw-r--r--src/game/Bag.cpp6
-rw-r--r--src/game/Bag.h7
-rw-r--r--src/game/BattleGround.cpp151
-rw-r--r--src/game/BattleGround.h81
-rw-r--r--src/game/BattleGroundAA.cpp6
-rw-r--r--src/game/BattleGroundAA.h6
-rw-r--r--src/game/BattleGroundAB.cpp16
-rw-r--r--src/game/BattleGroundAB.h8
-rw-r--r--src/game/BattleGroundAV.cpp7
-rw-r--r--src/game/BattleGroundAV.h6
-rw-r--r--src/game/BattleGroundBE.cpp12
-rw-r--r--src/game/BattleGroundBE.h8
-rw-r--r--src/game/BattleGroundDS.cpp63
-rw-r--r--src/game/BattleGroundDS.h47
-rw-r--r--src/game/BattleGroundEY.cpp14
-rw-r--r--src/game/BattleGroundEY.h8
-rw-r--r--src/game/BattleGroundHandler.cpp149
-rw-r--r--src/game/BattleGroundMgr.cpp676
-rw-r--r--src/game/BattleGroundMgr.h108
-rw-r--r--src/game/BattleGroundNA.cpp12
-rw-r--r--src/game/BattleGroundNA.h8
-rw-r--r--src/game/BattleGroundRL.cpp12
-rw-r--r--src/game/BattleGroundRL.h10
-rw-r--r--src/game/BattleGroundRV.cpp63
-rw-r--r--src/game/BattleGroundRV.h47
-rw-r--r--src/game/BattleGroundSA.cpp68
-rw-r--r--src/game/BattleGroundSA.h52
-rw-r--r--src/game/BattleGroundWS.cpp13
-rw-r--r--src/game/BattleGroundWS.h8
-rw-r--r--src/game/CMakeLists.txt24
-rw-r--r--src/game/Calendar.cpp17
-rw-r--r--src/game/Calendar.h26
-rw-r--r--src/game/CalendarHandler.cpp159
-rw-r--r--src/game/Cell.h8
-rw-r--r--src/game/CellImpl.h4
-rw-r--r--src/game/Channel.cpp12
-rw-r--r--src/game/Channel.h11
-rw-r--r--src/game/ChannelHandler.cpp4
-rw-r--r--src/game/ChannelMgr.h6
-rw-r--r--src/game/CharacterHandler.cpp366
-rw-r--r--src/game/Chat.cpp274
-rw-r--r--src/game/Chat.h51
-rw-r--r--src/game/ChatHandler.cpp6
-rw-r--r--src/game/CombatHandler.cpp4
-rw-r--r--src/game/ConfusedMovementGenerator.cpp4
-rw-r--r--src/game/ConfusedMovementGenerator.h4
-rw-r--r--src/game/Corpse.cpp39
-rw-r--r--src/game/Corpse.h10
-rw-r--r--src/game/Creature.cpp131
-rw-r--r--src/game/Creature.h66
-rw-r--r--src/game/CreatureAI.cpp4
-rw-r--r--src/game/CreatureAI.h7
-rw-r--r--src/game/CreatureAIImpl.h4
-rw-r--r--src/game/CreatureAIRegistry.cpp4
-rw-r--r--src/game/CreatureAIRegistry.h4
-rw-r--r--src/game/CreatureAISelector.cpp4
-rw-r--r--src/game/CreatureAISelector.h4
-rw-r--r--src/game/CreatureGroups.cpp4
-rw-r--r--src/game/CreatureGroups.h4
-rw-r--r--src/game/Debugcmds.cpp91
-rw-r--r--src/game/DestinationHolder.cpp4
-rw-r--r--src/game/DestinationHolder.h4
-rw-r--r--src/game/DestinationHolderImp.h23
-rw-r--r--src/game/DuelHandler.cpp4
-rw-r--r--src/game/DynamicObject.cpp8
-rw-r--r--src/game/DynamicObject.h8
-rw-r--r--src/game/FleeingMovementGenerator.cpp25
-rw-r--r--src/game/FleeingMovementGenerator.h4
-rw-r--r--src/game/FollowerRefManager.h4
-rw-r--r--src/game/FollowerReference.cpp4
-rw-r--r--src/game/FollowerReference.h4
-rw-r--r--src/game/Formulas.h79
-rw-r--r--src/game/GameEvent.cpp194
-rw-r--r--src/game/GameEvent.h7
-rw-r--r--src/game/GameObject.cpp177
-rw-r--r--src/game/GameObject.h48
-rw-r--r--src/game/GlobalEvents.cpp6
-rw-r--r--src/game/GlobalEvents.h4
-rw-r--r--src/game/GossipDef.cpp106
-rw-r--r--src/game/GossipDef.h43
-rw-r--r--src/game/GridDefines.h6
-rw-r--r--src/game/GridNotifiers.cpp30
-rw-r--r--src/game/GridNotifiers.h123
-rw-r--r--src/game/GridNotifiersImpl.h122
-rw-r--r--src/game/GridStates.cpp4
-rw-r--r--src/game/GridStates.h4
-rw-r--r--src/game/Group.cpp58
-rw-r--r--src/game/Group.h20
-rw-r--r--src/game/GroupHandler.cpp69
-rw-r--r--src/game/GroupRefManager.h4
-rw-r--r--src/game/GroupReference.cpp4
-rw-r--r--src/game/GroupReference.h4
-rw-r--r--src/game/GuardAI.cpp4
-rw-r--r--src/game/GuardAI.h4
-rw-r--r--src/game/Guild.cpp79
-rw-r--r--src/game/Guild.h24
-rw-r--r--src/game/GuildHandler.cpp8
-rw-r--r--src/game/HomeMovementGenerator.cpp7
-rw-r--r--src/game/HomeMovementGenerator.h4
-rw-r--r--src/game/HostilRefManager.cpp4
-rw-r--r--src/game/HostilRefManager.h4
-rw-r--r--src/game/IdleMovementGenerator.cpp4
-rw-r--r--src/game/IdleMovementGenerator.h4
-rw-r--r--src/game/InstanceData.cpp4
-rw-r--r--src/game/InstanceData.h4
-rw-r--r--src/game/InstanceSaveMgr.cpp31
-rw-r--r--src/game/InstanceSaveMgr.h4
-rw-r--r--src/game/Item.cpp62
-rw-r--r--src/game/Item.h49
-rw-r--r--src/game/ItemEnchantmentMgr.cpp4
-rw-r--r--src/game/ItemEnchantmentMgr.h4
-rw-r--r--src/game/ItemHandler.cpp204
-rw-r--r--src/game/ItemPrototype.h126
-rw-r--r--src/game/LFGHandler.cpp4
-rw-r--r--src/game/Language.h208
-rw-r--r--src/game/Level0.cpp6
-rw-r--r--src/game/Level1.cpp456
-rw-r--r--src/game/Level2.cpp763
-rw-r--r--src/game/Level3.cpp704
-rw-r--r--src/game/LootHandler.cpp24
-rw-r--r--src/game/LootMgr.cpp234
-rw-r--r--src/game/LootMgr.h61
-rw-r--r--src/game/Mail.cpp12
-rw-r--r--src/game/Mail.h4
-rw-r--r--src/game/Makefile.am564
-rw-r--r--src/game/Map.cpp127
-rw-r--r--src/game/Map.h44
-rw-r--r--src/game/MapInstanced.cpp4
-rw-r--r--src/game/MapInstanced.h4
-rw-r--r--src/game/MapManager.cpp12
-rw-r--r--src/game/MapManager.h25
-rw-r--r--src/game/MapRefManager.h2
-rw-r--r--src/game/MapReference.h2
-rw-r--r--src/game/MiscHandler.cpp160
-rw-r--r--src/game/MovementGenerator.cpp4
-rw-r--r--src/game/MovementGenerator.h4
-rw-r--r--src/game/MovementGeneratorImpl.h4
-rw-r--r--src/game/MovementHandler.cpp342
-rw-r--r--src/game/NPCHandler.cpp56
-rw-r--r--src/game/NPCHandler.h5
-rw-r--r--src/game/NullCreatureAI.cpp4
-rw-r--r--src/game/NullCreatureAI.h4
-rw-r--r--src/game/Object.cpp184
-rw-r--r--src/game/Object.h34
-rw-r--r--src/game/ObjectAccessor.cpp107
-rw-r--r--src/game/ObjectAccessor.h36
-rw-r--r--src/game/ObjectDefines.h8
-rw-r--r--src/game/ObjectGridLoader.cpp6
-rw-r--r--src/game/ObjectGridLoader.h4
-rw-r--r--src/game/ObjectMgr.cpp1241
-rw-r--r--src/game/ObjectMgr.h162
-rw-r--r--src/game/ObjectPosSelector.cpp157
-rw-r--r--src/game/ObjectPosSelector.h155
-rw-r--r--src/game/Opcodes.cpp2257
-rw-r--r--src/game/Opcodes.h407
-rw-r--r--src/game/OutdoorPvP.cpp10
-rw-r--r--src/game/OutdoorPvP.h2
-rw-r--r--src/game/OutdoorPvPEP.cpp2
-rw-r--r--src/game/OutdoorPvPEP.h2
-rw-r--r--src/game/OutdoorPvPHP.cpp2
-rw-r--r--src/game/OutdoorPvPHP.h2
-rw-r--r--src/game/OutdoorPvPMgr.cpp2
-rw-r--r--src/game/OutdoorPvPMgr.h2
-rw-r--r--src/game/OutdoorPvPNA.cpp2
-rw-r--r--src/game/OutdoorPvPNA.h2
-rw-r--r--src/game/OutdoorPvPObjectiveAI.cpp2
-rw-r--r--src/game/OutdoorPvPObjectiveAI.h2
-rw-r--r--src/game/OutdoorPvPSI.cpp6
-rw-r--r--src/game/OutdoorPvPSI.h2
-rw-r--r--src/game/OutdoorPvPTF.cpp2
-rw-r--r--src/game/OutdoorPvPZM.cpp2
-rw-r--r--src/game/OutdoorPvPZM.h2
-rw-r--r--src/game/Path.h4
-rw-r--r--src/game/Pet.cpp651
-rw-r--r--src/game/Pet.h70
-rw-r--r--src/game/PetAI.cpp8
-rw-r--r--src/game/PetAI.h4
-rw-r--r--src/game/PetHandler.cpp265
-rw-r--r--src/game/PetitionsHandler.cpp12
-rw-r--r--src/game/Player.cpp3626
-rw-r--r--src/game/Player.h444
-rw-r--r--src/game/PlayerDump.cpp4
-rw-r--r--src/game/PlayerDump.h27
-rw-r--r--src/game/PointMovementGenerator.cpp4
-rw-r--r--src/game/PointMovementGenerator.h4
-rw-r--r--src/game/PoolHandler.cpp720
-rw-r--r--src/game/PoolHandler.h103
-rw-r--r--src/game/PossessedAI.cpp4
-rw-r--r--src/game/PossessedAI.h4
-rw-r--r--src/game/QueryHandler.cpp66
-rw-r--r--src/game/QuestDef.cpp114
-rw-r--r--src/game/QuestDef.h51
-rw-r--r--src/game/QuestHandler.cpp12
-rw-r--r--src/game/RandomMovementGenerator.cpp4
-rw-r--r--src/game/RandomMovementGenerator.h4
-rw-r--r--src/game/ReactorAI.cpp4
-rw-r--r--src/game/ReactorAI.h4
-rw-r--r--src/game/ScriptCalls.cpp7
-rw-r--r--src/game/ScriptCalls.h4
-rw-r--r--src/game/SharedDefines.h416
-rw-r--r--src/game/SkillDiscovery.cpp82
-rw-r--r--src/game/SkillDiscovery.h5
-rw-r--r--src/game/SkillExtraItems.cpp4
-rw-r--r--src/game/SkillExtraItems.h4
-rw-r--r--src/game/SkillHandler.cpp10
-rw-r--r--src/game/SocialMgr.cpp13
-rw-r--r--src/game/SocialMgr.h7
-rw-r--r--src/game/Spell.cpp1140
-rw-r--r--src/game/Spell.h79
-rw-r--r--src/game/SpellAuraDefines.h115
-rw-r--r--src/game/SpellAuras.cpp2561
-rw-r--r--src/game/SpellAuras.h120
-rw-r--r--src/game/SpellEffects.cpp1965
-rw-r--r--src/game/SpellHandler.cpp104
-rw-r--r--src/game/SpellMgr.cpp916
-rw-r--r--src/game/SpellMgr.h543
-rw-r--r--src/game/StatSystem.cpp180
-rw-r--r--src/game/TargetedMovementGenerator.cpp4
-rw-r--r--src/game/TargetedMovementGenerator.h4
-rw-r--r--src/game/TaxiHandler.cpp12
-rw-r--r--src/game/TemporarySummon.cpp4
-rw-r--r--src/game/TemporarySummon.h4
-rw-r--r--src/game/ThreatManager.cpp33
-rw-r--r--src/game/ThreatManager.h12
-rw-r--r--src/game/TicketHandler.cpp4
-rw-r--r--src/game/TicketMgr.cpp4
-rw-r--r--src/game/TicketMgr.h4
-rw-r--r--src/game/Tools.cpp4
-rw-r--r--src/game/Tools.h4
-rw-r--r--src/game/Totem.cpp28
-rw-r--r--src/game/Totem.h6
-rw-r--r--src/game/TotemAI.cpp23
-rw-r--r--src/game/TotemAI.h4
-rw-r--r--src/game/TradeHandler.cpp4
-rw-r--r--src/game/Transports.cpp23
-rw-r--r--src/game/Transports.h16
-rw-r--r--src/game/Traveller.h55
-rw-r--r--src/game/Unit.cpp6641
-rw-r--r--src/game/Unit.h327
-rw-r--r--src/game/UnitEvents.h4
-rw-r--r--src/game/UpdateData.cpp6
-rw-r--r--src/game/UpdateData.h9
-rw-r--r--src/game/UpdateFields.h535
-rw-r--r--src/game/UpdateMask.h32
-rw-r--r--src/game/Vehicle.cpp102
-rw-r--r--src/game/Vehicle.h58
-rw-r--r--src/game/VoiceChatHandler.cpp4
-rw-r--r--src/game/WaypointManager.cpp4
-rw-r--r--src/game/WaypointManager.h4
-rw-r--r--src/game/WaypointMovementGenerator.cpp2
-rw-r--r--src/game/WaypointMovementGenerator.h8
-rw-r--r--src/game/Weather.cpp6
-rw-r--r--src/game/Weather.h6
-rw-r--r--src/game/World.cpp280
-rw-r--r--src/game/World.h29
-rw-r--r--src/game/WorldLog.cpp4
-rw-r--r--src/game/WorldLog.h8
-rw-r--r--src/game/WorldSession.cpp112
-rw-r--r--src/game/WorldSession.h63
-rw-r--r--src/game/WorldSocket.cpp207
-rw-r--r--src/game/WorldSocket.h24
-rw-r--r--src/game/WorldSocketMgr.cpp2
-rw-r--r--src/game/WorldSocketMgr.h4
-rw-r--r--src/mangosd/CMakeLists.txt53
-rw-r--r--src/mangosd/CliRunnable.cpp366
-rw-r--r--src/mangosd/CliRunnable.h35
-rw-r--r--src/mangosd/Main.cpp165
-rw-r--r--src/mangosd/Makefile.am62
-rw-r--r--src/mangosd/Master.cpp521
-rw-r--r--src/mangosd/Master.h52
-rw-r--r--src/mangosd/RASocket.cpp259
-rw-r--r--src/mangosd/RASocket.h67
-rw-r--r--src/mangosd/TrinityCore.ico (renamed from src/trinitycore/TrinityCore.ico)bin136606 -> 136606 bytes
-rw-r--r--src/mangosd/WorldRunnable.cpp100
-rw-r--r--src/mangosd/WorldRunnable.h35
-rw-r--r--src/mangosd/mangosd.conf.dist.in1448
-rw-r--r--src/mangosd/mangosd.rc (renamed from src/trinitycore/TrinityCore.rc)2
-rw-r--r--src/mangosd/monitor-mangosd (renamed from src/trinitycore/monitor-mangosd)0
-rw-r--r--src/mangosd/resource.h15
-rw-r--r--src/mangosd/run-mangosd (renamed from src/trinitycore/run-mangosd)0
-rw-r--r--src/realmd/AuthCodes.h75
-rw-r--r--src/realmd/AuthSocket.cpp1094
-rw-r--r--src/realmd/AuthSocket.h86
-rw-r--r--src/realmd/CMakeLists.txt45
-rw-r--r--src/realmd/Main.cpp345
-rw-r--r--src/realmd/Makefile.am59
-rw-r--r--src/realmd/RealmList.cpp101
-rw-r--r--src/realmd/RealmList.h67
-rw-r--r--src/realmd/TrinityRealm.ico (renamed from src/trinityrealm/TrinityRealm.ico)bin136606 -> 136606 bytes
-rw-r--r--src/realmd/realmd.conf.dist.in (renamed from src/trinityrealm/trinityrealm.conf.dist)0
-rw-r--r--src/realmd/realmd.rc (renamed from src/trinityrealm/TrinityRealm.rc)2
-rw-r--r--src/realmd/resource.h15
-rw-r--r--src/shared/Auth/AuthCrypt.cpp9
-rw-r--r--src/shared/Auth/AuthCrypt.h5
-rw-r--r--src/shared/Auth/BigNumber.cpp4
-rw-r--r--src/shared/Auth/BigNumber.h4
-rw-r--r--src/shared/Auth/Hmac.cpp4
-rw-r--r--src/shared/Auth/Hmac.h4
-rw-r--r--src/shared/Auth/Makefile.am30
-rw-r--r--src/shared/Auth/Sha1.cpp4
-rw-r--r--src/shared/Auth/Sha1.h4
-rw-r--r--src/shared/ByteBuffer.h30
-rw-r--r--src/shared/Common.cpp4
-rw-r--r--src/shared/Common.h6
-rw-r--r--src/shared/Config/Config.cpp4
-rw-r--r--src/shared/Config/Config.h4
-rw-r--r--src/shared/Config/ConfigEnv.h4
-rw-r--r--src/shared/Config/Makefile.am10
-rw-r--r--src/shared/Config/dotconfpp/dotconfpp.cpp4
-rw-r--r--src/shared/Database/DBCEnums.h247
-rw-r--r--src/shared/Database/DBCStores.cpp135
-rw-r--r--src/shared/Database/DBCStores.h24
-rw-r--r--src/shared/Database/DBCStructure.h1417
-rw-r--r--src/shared/Database/DBCfmt.cpp68
-rw-r--r--src/shared/Database/Database.cpp4
-rw-r--r--src/shared/Database/Database.h6
-rw-r--r--src/shared/Database/DatabaseEnv.h4
-rw-r--r--src/shared/Database/DatabaseImpl.h4
-rw-r--r--src/shared/Database/DatabaseMysql.cpp4
-rw-r--r--src/shared/Database/DatabaseMysql.h4
-rw-r--r--src/shared/Database/DatabasePostgre.cpp4
-rw-r--r--src/shared/Database/DatabasePostgre.h4
-rw-r--r--src/shared/Database/DatabaseSqlite.cpp4
-rw-r--r--src/shared/Database/DatabaseSqlite.h4
-rw-r--r--src/shared/Database/Field.cpp4
-rw-r--r--src/shared/Database/Field.h4
-rw-r--r--src/shared/Database/Makefile.am78
-rw-r--r--src/shared/Database/MySQLDelayThread.h4
-rw-r--r--src/shared/Database/PGSQLDelayThread.h4
-rw-r--r--src/shared/Database/QueryResult.h4
-rw-r--r--src/shared/Database/QueryResultMysql.cpp4
-rw-r--r--src/shared/Database/QueryResultMysql.h4
-rw-r--r--src/shared/Database/QueryResultPostgre.cpp4
-rw-r--r--src/shared/Database/QueryResultPostgre.h4
-rw-r--r--src/shared/Database/QueryResultSqlite.cpp4
-rw-r--r--src/shared/Database/QueryResultSqlite.h4
-rw-r--r--src/shared/Database/SQLStorage.cpp18
-rw-r--r--src/shared/Database/SQLStorage.h4
-rw-r--r--src/shared/Database/SQLStorageImpl.h10
-rw-r--r--src/shared/Database/SqlDelayThread.cpp4
-rw-r--r--src/shared/Database/SqlDelayThread.h6
-rw-r--r--src/shared/Database/SqlOperations.cpp4
-rw-r--r--src/shared/Database/SqlOperations.h4
-rw-r--r--src/shared/Database/dbcfile.cpp4
-rw-r--r--src/shared/Database/dbcfile.h4
-rw-r--r--src/shared/Errors.h4
-rw-r--r--src/shared/Log.cpp4
-rw-r--r--src/shared/Log.h4
-rw-r--r--src/shared/Makefile.am112
-rw-r--r--src/shared/MemoryLeaks.cpp32
-rw-r--r--src/shared/MemoryLeaks.h48
-rw-r--r--src/shared/PacketLog.cpp4
-rw-r--r--src/shared/PacketLog.h4
-rw-r--r--src/shared/ProgressBar.cpp4
-rw-r--r--src/shared/ProgressBar.h4
-rw-r--r--src/shared/ServiceWin32.cpp4
-rw-r--r--src/shared/ServiceWin32.h4
-rw-r--r--src/shared/SystemConfig.h6
-rw-r--r--src/shared/SystemConfig.h.in79
-rw-r--r--src/shared/Timer.h4
-rw-r--r--src/shared/Util.cpp20
-rw-r--r--src/shared/Util.h256
-rw-r--r--src/shared/WorldPacket.h4
-rw-r--r--src/shared/revision_nr.h4
-rw-r--r--src/shared/vmap/BaseModel.cpp4
-rw-r--r--src/shared/vmap/BaseModel.h4
-rw-r--r--src/shared/vmap/CoordModelMapping.cpp4
-rw-r--r--src/shared/vmap/CoordModelMapping.h4
-rw-r--r--src/shared/vmap/DebugCmdLogger.cpp4
-rw-r--r--src/shared/vmap/DebugCmdLogger.h4
-rw-r--r--src/shared/vmap/IVMapManager.h4
-rw-r--r--src/shared/vmap/Makefile.am78
-rw-r--r--src/shared/vmap/ManagedModelContainer.cpp4
-rw-r--r--src/shared/vmap/ManagedModelContainer.h4
-rw-r--r--src/shared/vmap/ModelContainer.cpp4
-rw-r--r--src/shared/vmap/ModelContainer.h4
-rw-r--r--src/shared/vmap/NodeValueAccess.h4
-rw-r--r--src/shared/vmap/ShortBox.h4
-rw-r--r--src/shared/vmap/ShortVector.h4
-rw-r--r--src/shared/vmap/SubModel.cpp4
-rw-r--r--src/shared/vmap/SubModel.h4
-rw-r--r--src/shared/vmap/TileAssembler.cpp7
-rw-r--r--src/shared/vmap/TileAssembler.h4
-rw-r--r--src/shared/vmap/TreeNode.cpp4
-rw-r--r--src/shared/vmap/TreeNode.h4
-rw-r--r--src/shared/vmap/VMapDefinitions.h4
-rw-r--r--src/shared/vmap/VMapFactory.cpp4
-rw-r--r--src/shared/vmap/VMapFactory.h4
-rw-r--r--src/shared/vmap/VMapManager.cpp4
-rw-r--r--src/shared/vmap/VMapManager.h4
-rw-r--r--src/shared/vmap/VMapTools.h4
-rw-r--r--src/tools/Makefile.am21
-rw-r--r--src/tools/genrevision/Makefile.am24
-rw-r--r--src/tools/genrevision/genrevision.cpp2
-rw-r--r--src/trinitycore/CliRunnable.cpp4
-rw-r--r--src/trinitycore/Main.cpp4
-rw-r--r--src/trinitycore/Makefile.am85
-rw-r--r--src/trinitycore/Master.cpp4
-rw-r--r--src/trinitycore/RASocket.cpp4
-rw-r--r--src/trinitycore/WorldRunnable.cpp4
-rw-r--r--src/trinityrealm/AuthSocket.cpp4
-rw-r--r--src/trinityrealm/Main.cpp4
-rw-r--r--src/trinityrealm/Makefile.am72
-rw-r--r--src/trinityrealm/RealmList.cpp4
-rw-r--r--win/TrinityCore&Script VC80.sln4
-rw-r--r--win/TrinityCore&Script VC90.sln52
-rw-r--r--win/VC71/game.vcproj868
-rw-r--r--win/VC71/mangosd.vcproj241
-rw-r--r--win/VC71/realmd.vcproj198
-rw-r--r--win/VC80/game.vcproj631
-rw-r--r--win/VC80/mangosd.vcproj523
-rw-r--r--win/VC80/realmd.vcproj459
-rw-r--r--win/VC90/game.vcproj655
-rw-r--r--win/VC90/mangosd.vcproj523
-rw-r--r--win/VC90/realmd.vcproj460
1162 files changed, 84351 insertions, 24623 deletions
diff --git a/.hgtags b/.hgtags
new file mode 100644
index 00000000000..e391e35e004
--- /dev/null
+++ b/.hgtags
@@ -0,0 +1,2 @@
+17d730e2e03476f2633294f0b0554654949adb85 3.0.3 Lots of Bugs
+3d0d20ee3c824ff523218f2e38d84d3801c373aa 3.0.8 Crash like Hell
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 27bbaa17674..b7ae5400c6b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,7 +38,7 @@ EXECUTE_PROCESS(
OUTPUT_VARIABLE HG_REVISION
)
-message("* Trinity Core revision: ${HG_REVISION}")
+message("* TrinityCore & MaNGOS revision: ${HG_REVISION}")
IF (PREFIX)
SET(CMAKE_INSTALL_PREFIX ${PREFIX})
@@ -49,11 +49,12 @@ if(CONF_DIR)
else(CONF_DIR)
SET(CONF_DIR ${PREFIX}/etc)
endif(CONF_DIR)
+SET(LIBSDIR ${CMAKE_INSTALL_PREFIX}/lib)
message("* Will install to: ${CMAKE_INSTALL_PREFIX}")
message("* With config dir at: ${CONF_DIR}")
+message("* Libs install dir at: ${LIBSDIR}")
-SET(LIBSDIR "/usr/lib /usr/local/lib /lib")
FIND_LIBRARY(SSLLIB NAMES ssl DOC "SSL library")
FIND_LIBRARY(ZLIB z "Zlib library")
diff --git a/Makefile.am b/Makefile.am
index 2650fd4659e..c7da2a438ef 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -22,10 +22,39 @@
SUBDIRS = dep doc src
## Additional files to include when running 'make dist'
-EXTRA_DIST = win
-
-
-
-
-
+# Win32 project workspace for Visual Studio .NET 2003
+EXTRA_DIST = \
+ win/mangosdVC71.sln \
+ win/VC71/framework.vcproj \
+ win/VC71/game.vcproj \
+ win/VC71/mangosd.vcproj \
+ win/VC71/realmd.vcproj \
+ win/VC71/shared.vcproj \
+ win/VC71/zlib.vcproj \
+ win/VC71/g3dlite.vcproj \
+ win/VC71/zthread.vcproj
+
+# Win32 project workspace for Visual Studio .NET 2005
+EXTRA_DIST += \
+ win/mangosdVC80.sln \
+ win/VC80/framework.vcproj \
+ win/VC80/game.vcproj \
+ win/VC80/mangosd.vcproj \
+ win/VC80/realmd.vcproj \
+ win/VC80/shared.vcproj \
+ win/VC80/zlib.vcproj \
+ win/VC80/g3dlite.vcproj \
+ win/VC80/zthread.vcproj
+
+# Win32 project workspace for Visual Studio .NET 2008
+EXTRA_DIST += \
+ win/mangosdVC90.sln \
+ win/VC90/framework.vcproj \
+ win/VC90/game.vcproj \
+ win/VC90/mangosd.vcproj \
+ win/VC90/realmd.vcproj \
+ win/VC90/shared.vcproj \
+ win/VC90/zlib.vcproj \
+ win/VC90/g3dlite.vcproj \
+ win/VC90/zthread.vcproj
diff --git a/NEWS b/NEWS
index c6f862d5206..0caf779ff78 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,117 @@ Copyright (C) Trinity Core (http://www.trinitycore.org)
See the COPYING file for copying conditions.
+<<<<<<< HEAD:NEWS
Please visit the Trinity Core website for bug reports, patch
submissions, suggestions, and support:
-http://www.trinitycore.org/ \ No newline at end of file
+http://www.trinitycore.org/
+=======
+Visit our project website for documentation, and more:
+http://getmangos.com/
+
+Visit our forums for support:
+http://getmangos.com/community/
+
+Please submit bug reports at:
+http://mangos.lighthouseapp.com/
+
+Version 0.13
+ * Under discussion.
+ * Upgrade to client version 3.0.9 (build 9551).
+
+Version 0.12
+ * Migrate from SVN to GIT.
+ * Implemented arena system.
+ * Start using Adaptive Communication Environment (ACE) framework v.5.6.6 in server network code.
+ * Update Visual Leak Detector lib to Version 1.9g (beta).
+ * Upgrade to client version 2.4.3 (build 8606).
+
+Version 0.11
+ * Lots of improvements in the spell system.
+ * Now use Mersenne Twister random number generator.
+ * MySQL client libs updated to 5.0.56.
+ * Upgrade to client version 2.4.2 (build 8278).
+
+Version 0.10
+ * master looter lot mode,
+ * FFA PvP zones and FFA PvP server type support,
+ * Guild Banks,
+ * unique equipped items support, including gems,
+ * talent inspecting,
+ * PostgreSql support,
+ * sockets library updated to v.2.2.9 version,
+ * 64-bit binaries building at Windows,
+ * Upgrade to client version 2.3.0 (build 7561).
+
+Version 0.9
+ * recipes discovery system support,
+ * more auras, effects, spells, and talents working,
+ * players queue at login support,
+ * mangosd/realmd as Windows services support,
+ * autogeneration mangosd/realmd crash reports (Windows only),
+ * Visual Studio 2008 Express and Pro support,
+ * division Mangos DataBase to MangosDB(WorldDB) and CharactersDB.
+ * Upgrade to client version 2.2.3 (build 7359).
+
+Version 0.8
+ * battleground support,
+ * gender specific creatures,
+ * game objects triggering more scripts,
+ * more auras, effects, spells, and talents working,
+ * dungeon specific data,
+ * localization support for data,
+ * vmaps for line of sight handling,
+ * build support for OpenBSD and FreeBSD,
+ * Upgrade to client version 2.1.3 (build 6898).
+
+Version 0.7, Codename "Eye of the Storm"
+ * Full rewrite of the GNU autotools based build system, in order to
+ smooth and clean up the build process.
+ * Full rewrite of the Windows build system, allowing MaNGOS to be built
+ from Visual C++ 2003 Toolkit, Visual C++ 2003, Visual C++ 2005.
+ * Upgrade to client version 2.0.12 (build 6546).
+
+Version 0.6, Codename "Black Dragonflight"
+ * MaNGOS development moved to http://sourceforge.net/projects/mangos/
+ * A lots of speed improvements to data handling and data transfer have been
+ completed.
+ * Mail, auction house, profession, creature, and game object systems have seen
+ a lot of improvements and can be considered feature complete. Some minor bugs
+ still are left.
+ * Rest system has been finished.
+ * Initial pet stable support has been added.
+ * PvP and duel system have seen lots of improvements
+ * Guilds are not just a myth anymore. Coming closer to full guild support.
+ * Taxi and transport system is close to a fully working system.
+ * A lot more has been added.
+
+Version 0.5, Codename "Stable Master"
+ * Core stability improvements, lots of threading and memory usage related
+ bugs have been resolved.
+ * MySQL Database backend has been cleaned up.
+ * Proper support for game clients of version 1.10.2 has been added.
+ * Support for auras, pets, spells, talents, totems, etc. has been added
+ or improved.
+ * Cross-platform issues have been resolved, MaNGOS should now build on
+ more platforms, including FreeBSD.
+
+Version 0.1, Codename "Lightbringer"
+ * AI system
+ * Grid system
+ * Lots a game features working.
+ * Lovely optimizations for the beloved server.
+
+Version 0.0.3, Codename "Mango Carpet"
+ * Interim release, not gone public.
+
+Version 0.0.2, Codename "Library"
+ * Most data conversions working.
+ * Database cleanup.
+ * More features working.
+ * Many bugs fixed.
+
+Version 0.0.1, Codename "Endeavour"
+ * Data converter added.
+ * Build system improvements.
+ * Bug fixing and code cleaning.
+>>>>>>> f516ed7e9487666e5ef9eaf85660191f9e50db95:NEWS
diff --git a/THANKS b/THANKS
index 396ebbceb7f..c48df55dd1f 100644
--- a/THANKS
+++ b/THANKS
@@ -20,6 +20,9 @@ similar to this one:
Thanks to the ScriptDev2 team (http://www.scriptdev2.com) for scripts.
+ Thanks to WCell team (especially Ralek) for reseach on realm reconnect sequence,
+ item scaling stats algorithm, gameobject rotation issues.
+
The easiest policy with this file is to thank everyone who contributes to the
project, without judging the value of the contribution.
diff --git a/configure.ac b/configure.ac
index c66547dbf50..ede1118be95 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
@@ -322,13 +322,6 @@ TRINI_INCLUDES="$POSTGRE_INCLUDES $MYSQL_INCLUDES $TRINI_INCLUDES"
TRINI_LIBS="$POSTGRE_LIBS $MYSQL_LIBS $ZLIB $COMPATLIB $SSLLIB $TRINI_LIBS"
## Export defined variables
-AC_SUBST(ZLIB)
-AC_SUBST(COMPATLIB)
-AC_SUBST(SSLLIB)
-AC_SUBST(MYSQL_INCLUDES)
-AC_SUBST(MYSQL_LIBS)
-AC_SUBST(POSTGRE_INCLUDES)
-AC_SUBST(POSTGRE_LIBS)
AC_SUBST(DOXYGEN)
AC_SUBST(TRINITYD_DEBUG_INFO)
AC_SUBST(TRINITYD_ENABLE_CLI)
@@ -363,10 +356,12 @@ AC_CONFIG_FILES([
src/shared/vmap/Makefile
src/shared/SystemConfig.h
src/game/Makefile
- src/trinityrealm/Makefile
- src/trinitycore/Makefile
+ src/realmd/Makefile
+ src/realmd/realmd.conf.dist
+ src/mangosd/Makefile
+ src/mangosd/mangosd.conf.dist
src/bindings/Makefile
- src/bindings/interface/Makefile
+ src/bindings/scripts/Makefile
])
## Configure ACE, if needed
@@ -374,11 +369,6 @@ if test X$tri_need_to_build_ace = Xyes; then
AC_CONFIG_SUBDIRS([dep/ACE_wrappers])
fi
-## Configure ACE
-if test X$tri_build_scripts = Xyes; then
-AC_CONFIG_FILES([src/bindings/scripts/Makefile])
-fi
-
AC_CONFIG_COMMANDS([default],[
echo ""
echo "Configuration of TrinityCore $PACKAGE_VERSION is now complete."
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 47ba379c089..d89f48418db 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,12 +9,12 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
diff --git a/contrib/extractor/CMakeLists.txt b/contrib/extractor/CMakeLists.txt
new file mode 100644
index 00000000000..a00dda1202f
--- /dev/null
+++ b/contrib/extractor/CMakeLists.txt
@@ -0,0 +1,21 @@
+# Copyright (C) 2005-2009 MaNGOS project <http://getmangos.com/>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+cmake_minimum_required (VERSION 2.6)
+project (MANGOS_MAP_EXTRACTOR)
+
+add_subdirectory (libmpq)
+
+include_directories (${MANGOS_MAP_EXTRACTOR_SOURCE_DIR}/libmpq)
+link_directories (${MANGOS_MAP_EXTRACTOR_SOURCE_DIR}/libmpq)
+
+add_executable (ad adt.cpp dbcfile.cpp mpq_libmpq.cpp System.cpp)
+
+target_link_libraries (ad libmpq)
diff --git a/contrib/extractor/Makefile b/contrib/extractor/Makefile
deleted file mode 100644
index 55eb35f336a..00000000000
--- a/contrib/extractor/Makefile
+++ /dev/null
@@ -1,471 +0,0 @@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
-#
-# Thanks to the original authors: MaNGOS <http://www.mangosproject.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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-SOURCES = $(ad_SOURCES)
-
-srcdir = .
-top_srcdir = .
-
-pkgdatadir = $(datadir)/mangos
-pkglibdir = $(libdir)/mangos
-pkgincludedir = $(includedir)/mangos
-top_builddir = ../..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/ginstall -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = i686-pc-linux-gnu
-host_triplet = i686-pc-linux-gnu
-bin_PROGRAMS = ad$(EXEEXT)
-subdir = contrib/extractor
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(bin_PROGRAMS)
-am_ad_OBJECTS = System.$(OBJEXT) adt.$(OBJEXT) dbcfile.$(OBJEXT) \
- mpq_libmpq.$(OBJEXT)
-ad_OBJECTS = $(am_ad_OBJECTS)
-ad_DEPENDENCIES =
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(ad_SOURCES)
-DIST_SOURCES = $(ad_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL =
-ALLOCA =
-AMDEP_FALSE = #
-AMDEP_TRUE =
-AMTAR = ${SHELL} /home/wow/MaNGOS/trunk/missing --run tar
-AR = ar
-AUTOCONF = ${SHELL} /home/wow/MaNGOS/trunk/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/wow/MaNGOS/trunk/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/wow/MaNGOS/trunk/missing --run automake-1.9
-AWK = gawk
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O3
-COMPILER_OPTIONS = -g -O3
-CPP = gcc -E
-CPPFLAGS =
-CXX = g++
-CXXCPP = g++ -E
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O3
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO = echo
-ECHO_C =
-ECHO_N = -n
-ECHO_T =
-EGREP = grep -E
-EXEEXT =
-EXTRA_COMPILER_OPTIONS =
-EXTRA_LINKER_OPTIONS =
-F77 =
-FFLAGS =
-INCLUDES = -I$(srcdir)
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-LDFLAGS =
-LIBOBJS =
-LIBS = -lz -lpthread
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LINKER_OPTIONS = -static
-LN_S = ln -s
-LTLIBOBJS =
-LT_AGE = 2
-LT_CURRENT = 2
-LT_RELEASE = 2.3.2
-LT_REVISION = 3
-MAINT = #
-MAINTAINER_MODE_FALSE =
-MAINTAINER_MODE_TRUE = #
-MAKEINFO =
-MANGOSD_CONFIG = /home/wow/server/etc/mangosd.conf
-MANGOSD_CONFIGDIR = /home/wow/server/etc
-MANGOSD_DATA = /home/wow/server/share/mangos
-OBJEXT = o
-PACKAGE = mangos
-PACKAGE_BUGREPORT = http://www.mangosproject.org/
-PACKAGE_NAME = MaNGOS
-PACKAGE_STRING = MaNGOS 0.2-SVN
-PACKAGE_TARNAME = mangos
-PACKAGE_VERSION = 0.2-SVN
-PATH_SEPARATOR = :
-RANLIB = ranlib
-SET_MAKE =
-SHELL = /bin/sh
-STRIP = strip
-VERSION = 0.2-SVN
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_F77 =
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = strip
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE =
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE =
-am__include = include
-am__leading_dot = .
-am__quote =
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = i686-pc-linux-gnu
-build_alias =
-build_cpu = i686
-build_os = linux-gnu
-build_vendor = pc
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = i686-pc-linux-gnu
-host_alias =
-host_cpu = i686
-host_os = linux-gnu
-host_vendor = pc
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /home/wow/MaNGOS/trunk/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/wow/server
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-
-# use our configured sysconfdir
-sysconfdir = /home/wow/server/etc
-target_alias =
-ad_SOURCES = \
- System.cpp \
- adt.h \
- adt.cpp \
- dbcfile.cpp \
- dbcfile.h \
- mpq_libmpq.cpp \
- mpq_libmpq.h
-
-ad_LDADD = libmpq/libmpq.a
-add_LDFLAGS = -L$(srcdir) -L$(srcdir)/libmpq
-
-all: create-dir all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
-
-.PRECIOUS: Makefile
-
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
- || test -f $$p1 \
- ; then \
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
- else :; fi; \
- done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
- rm -f "$(DESTDIR)$(bindir)/$$f"; \
- done
-
-clean-binPROGRAMS:
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-ad$(EXEEXT): $(ad_OBJECTS) $(ad_DEPENDENCIES)
- @rm -f ad$(EXEEXT)
- $(CXXLINK) $(ad_LDFLAGS) $(ad_OBJECTS) $(ad_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.cpp.o:
- if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-# source='$<' object='$@' libtool=no \
-# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
-# $(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
- if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-# source='$<' object='$@' libtool=no \
-# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
-# $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
- if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-# source='$<' object='$@' libtool=yes \
-# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
-# $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
- -rm .deps/*
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(CTAGS_ARGS)$$tags$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
- list='$(DISTFILES)'; for file in $$list; do \
- case $$file in \
- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
- esac; \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkdir_p) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS);
-installdirs:
- for dir in "$(DESTDIR)$(bindir)"; do \
- test -z "$$dir" || $(mkdir_p) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -rf ./$(DEPDIR)
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -rf ./$(DEPDIR)
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
-
-create-dir:
- mkdir -p ".deps"
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libtool ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-binPROGRAMS install-data install-data-am install-exec \
- install-exec-am install-info install-info-am install-man \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-binPROGRAMS uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/contrib/extractor/Makefile.am b/contrib/extractor/Makefile.am
deleted file mode 100644
index b84617069a1..00000000000
--- a/contrib/extractor/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-# The top-level input Makefile for mpq-tools
-
-# Any directories which should be built and installed.
-SUBDIRS = libmpq
-
-# The directories which are part of the distribution.
-DIST_SUBDIRS = $(SUBDIRS)
-
-EXTRA_DIST = \
- README.linux
diff --git a/contrib/extractor/README.linux b/contrib/extractor/README.linux
index 52b907391b8..1986831e751 100644
--- a/contrib/extractor/README.linux
+++ b/contrib/extractor/README.linux
@@ -1,7 +1,7 @@
-= Trinity Core -- Linux instructions for extractor =
+Linux instructions
+------------------
-Copyright (C) Trinity Core (http://www.trinitycore.org)
-
-1: Configure and build MaNGOS.
-2: cd contrib/extractor/libmpq && make && cd .. && make
-3: run ad \ No newline at end of file
+1. install cmake
+2. cmake -i
+3. make
+4. ./ad
diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp
index a1641699163..26401afc0b7 100644
--- a/contrib/extractor/System.cpp
+++ b/contrib/extractor/System.cpp
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <deque>
#include <set>
+#include <cstdlib>
#ifdef WIN32
#include "direct.h"
@@ -16,21 +17,24 @@
extern unsigned int iRes;
extern ArchiveSet gOpenArchives;
-bool ConvertADT(char*,char*);
+bool ConvertADT(char*, char*);
-typedef struct{
+typedef struct
+{
char name[64];
- unsigned int id;
-}map_id;
+ uint32 id;
+} map_id;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
-map_id * map_ids;
-uint16 * areas;
-char output_path[128]=".";
-char input_path[128]=".";
+map_id *map_ids;
+uint16 *areas;
+uint16 *LiqType;
+char output_path[128] = ".";
+char input_path[128] = ".";
+uint32 maxAreaId = 0;
enum Extract
{
@@ -66,46 +70,39 @@ bool FileExists( const char* FileName )
void Usage(char* prg)
{
- printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-r set resolution\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"",
- prg,prg);
+ printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"", prg, prg);
exit(1);
}
void HandleArgs(int argc, char * arg[])
{
- for(int c=1;c<argc;c++)
+ for(int c = 1; c < argc; ++c)
{
- //i - input path
- //o - output path
- //r - resolution, array of (r * r) heights will be created
- //e - extract only MAP(1)/DBC(2) - standard both(3)
+ // i - input path
+ // o - output path
+ // r - resolution, array of (r * r) heights will be created
+ // e - extract only MAP(1)/DBC(2) - standard both(3)
if(arg[c][0] != '-')
Usage(arg[0]);
switch(arg[c][1])
{
case 'i':
- if(c+1<argc)//all ok
- strcpy(input_path,arg[(c++) +1]);
+ if(c + 1 < argc) // all ok
+ strcpy(input_path, arg[(c++) + 1]);
else
Usage(arg[0]);
break;
case 'o':
- if(c+1<argc)//all ok
- strcpy(output_path,arg[(c++) +1]);
- else
- Usage(arg[0]);
- break;
- case 'r':
- if(c+1<argc)//all ok
- iRes=atoi(arg[(c++) +1]);
+ if(c + 1 < argc) // all ok
+ strcpy(output_path, arg[(c++) + 1]);
else
Usage(arg[0]);
break;
case 'e':
- if(c+1<argc)//all ok
+ if(c + 1 < argc) // all ok
{
- extract=atoi(arg[(c++) +1]);
+ extract=atoi(arg[(c++) + 1]);
if(!(extract > 0 && extract < 4))
Usage(arg[0]);
}
@@ -122,12 +119,12 @@ uint32 ReadMapDBC()
DBCFile dbc("DBFilesClient\\Map.dbc");
dbc.open();
- uint32 map_count=dbc.getRecordCount();
- map_ids=new map_id[map_count];
- for(unsigned int x=0;x<map_count;x++)
+ size_t map_count = dbc.getRecordCount();
+ map_ids = new map_id[map_count];
+ for(uint32 x = 0; x < map_count; ++x)
{
- map_ids[x].id=dbc.getRecord(x).getUInt(0);
- strcpy(map_ids[x].name,dbc.getRecord(x).getString(1));
+ map_ids[x].id = dbc.getRecord(x).getUInt(0);
+ strcpy(map_ids[x].name, dbc.getRecord(x).getString(1));
}
printf("Done! (%u maps loaded)\n", map_count);
return map_count;
@@ -135,20 +132,39 @@ uint32 ReadMapDBC()
void ReadAreaTableDBC()
{
- printf("Read AreaTable.dbc file... ");
+ printf("Read AreaTable.dbc file...");
DBCFile dbc("DBFilesClient\\AreaTable.dbc");
dbc.open();
- unsigned int area_count=dbc.getRecordCount();
- uint32 maxid = dbc.getMaxId();
- areas=new uint16[maxid + 1];
- memset(areas, 0xff, sizeof(areas));
- for(unsigned int x=0; x<area_count;++x)
+ size_t area_count = dbc.getRecordCount();
+ size_t maxid = dbc.getMaxId();
+ areas = new uint16[maxid + 1];
+ memset(areas, 0xff, (maxid + 1) * sizeof(uint16));
+
+ for(uint32 x = 0; x < area_count; ++x)
areas[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
+ maxAreaId = dbc.getMaxId();
+
printf("Done! (%u areas loaded)\n", area_count);
}
+void ReadLiquidTypeTableDBC()
+{
+ printf("Read LiquidType.dbc file...");
+ DBCFile dbc("DBFilesClient\\LiquidType.dbc");
+ dbc.open();
+ size_t LiqType_count = dbc.getRecordCount();
+ size_t LiqType_maxid = dbc.getMaxId();
+ LiqType = new uint16[LiqType_maxid + 1];
+ memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16));
+
+ for(uint32 x = 0; x < LiqType_count; ++x)
+ LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
+
+ printf("Done! (%u LiqTypes loaded)\n", LiqType_count);
+}
+
void ExtractMapsFromMpq()
{
char mpq_filename[1024];
@@ -159,27 +175,28 @@ void ExtractMapsFromMpq()
uint32 map_count = ReadMapDBC();
ReadAreaTableDBC();
+ ReadLiquidTypeTableDBC();
- unsigned int total=map_count*ADT_RES*ADT_RES;
- unsigned int done=0;
+ unsigned int total = map_count * ADT_RES * ADT_RES;
+ unsigned int done = 0;
std::string path = output_path;
path += "/maps/";
CreateDir(path);
- for(unsigned int x = 0; x < ADT_RES; ++x)
+ for(uint32 x = 0; x < ADT_RES; ++x)
{
- for(unsigned int y = 0; y < ADT_RES; ++y)
+ for(uint32 y = 0; y < ADT_RES; ++y)
{
- for(unsigned int z = 0; z < map_count; ++z)
+ for(uint32 z = 0; z < map_count; ++z)
{
- sprintf(mpq_filename,"World\\Maps\\%s\\%s_%u_%u.adt",map_ids[z].name,map_ids[z].name,x,y);
- sprintf(output_filename,"%s/maps/%03u%02u%02u.map",output_path,map_ids[z].id,y,x);
- ConvertADT(mpq_filename,output_filename);
+ sprintf(mpq_filename, "World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
+ sprintf(output_filename, "%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x);
+ ConvertADT(mpq_filename, output_filename);
done++;
}
- //draw progess bar
- printf("Processing........................%d%%\r",(100*done)/total);
+ // draw progress bar
+ printf("Processing........................%d%%\r", (100 * done) / total);
}
}
@@ -222,7 +239,7 @@ void ExtractDBCFiles(int locale, bool basicLocale)
string filename = path;
filename += (iter->c_str() + strlen("DBFilesClient\\"));
- FILE *output=fopen(filename.c_str(), "wb");
+ FILE *output = fopen(filename.c_str(), "wb");
if(!output)
{
printf("Can't create the output file '%s'\n", filename.c_str());
@@ -261,17 +278,20 @@ void LoadCommonMPQFiles()
{
char filename[512];
- sprintf(filename,"%s/Data/common.MPQ", input_path);
+ sprintf(filename,"%s/Data/common-2.MPQ", input_path);
+ new MPQArchive(filename);
+ sprintf(filename,"%s/Data/lichking.MPQ", input_path);
new MPQArchive(filename);
sprintf(filename,"%s/Data/expansion.MPQ", input_path);
new MPQArchive(filename);
+
for(int i = 1; i < 5; ++i)
{
char ext[3] = "";
if(i > 1)
sprintf(ext, "-%i", i);
- sprintf(filename,"%s/Data/patch%s.MPQ", input_path, ext);
+ sprintf(filename, "%s/Data/patch%s.MPQ", input_path, ext);
if(FileExists(filename))
new MPQArchive(filename);
}
diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe
index f0a7e4408ce..402f3ae3172 100644
--- a/contrib/extractor/ad.exe
+++ b/contrib/extractor/ad.exe
Binary files differ
diff --git a/contrib/extractor/adt.cpp b/contrib/extractor/adt.cpp
index a8f640a63bc..fcbfc95a072 100644
--- a/contrib/extractor/adt.cpp
+++ b/contrib/extractor/adt.cpp
@@ -15,16 +15,14 @@
#include "adt.h"
#include "mpq_libmpq.h"
-//#include <windows.h>
-unsigned int iRes=256;
-extern uint16*areas;
+extern uint16 *areas;
+extern uint16 *LiqType;
+extern uint32 maxAreaId;
vec wmoc;
-Cell * cell;
-uint32 wmo_count;
+Cell *cell;
mcell *mcells;
-
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
@@ -35,168 +33,154 @@ bool LoadADT(char* filename)
if(mf.isEof())
{
- //printf("No such file.\n");
+ //printf("No such file %s\n", filename);
return false;
}
- mcells=new mcell;
- wmoc.x =65*TILESIZE;
- wmoc.z =65*TILESIZE;
+ MapLiqFlag = new uint8[256];
+ for(uint32 j = 0; j < 256; ++j)
+ MapLiqFlag[j] = 0; // no water
+
+ MapLiqHeight = new float[16384];
+ for(uint32 j = 0; j < 16384; ++j)
+ MapLiqHeight[j] = -999999; // no water
+
+ mcells = new mcell;
+
+ wmoc.x = 65 * TILESIZE;
+ wmoc.z = 65 * TILESIZE;
size_t mcnk_offsets[256], mcnk_sizes[256];
- wmo_count=0;
- bool found=false;
- //uint32 fs=mf.getSize()-3;
- //while (mf.getPos()<fs)
+ chunk_num = 0;
+ k = 0;
+ m = 0;
while (!mf.isEof())
{
uint32 fourcc;
- mf.read(&fourcc,4);
+ mf.read(&fourcc, 4);
mf.read(&size, 4);
size_t nextpos = mf.getPos() + size;
- switch(fourcc)
+
+ //if(fourcc==0x4d484452) // MHDR header
+ //if(fourcc==0x4d564552) // MVER
+ if(fourcc == 0x4d43494e) // MCIN
{
- case 0x4d43494e: // MCIN
+ for (uint32 i = 0; i < 256; ++i)
{
- //printf("Found chunks info\n");
- // mapchunk offsets/sizes
- for (int i=0; i<256; i++)
- {
- mf.read(&mcnk_offsets[i],4);
- mf.read(&mcnk_sizes[i],4);
- mf.seekRelative(8);
- }
- break;
+ mf.read(&mcnk_offsets[i], 4);
+ mf.read(&mcnk_sizes[i], 4);
+ mf.seekRelative(8);
}
- case 0x4d4f4446: // MODF
+ }
+ //if(fourcc == 0x4d544558) // MTEX textures (strings)
+ //if(fourcc == 0x4d4d4458) // MMDX m2 models (strings)
+ //if(fourcc == 0x4d4d4944) // MMID offsets for strings in MMDX
+ //if(fourcc == 0x4d574d4f) // MWMO
+ //if(fourcc == 0x4d574944) // MWID offsets for strings in MWMO
+ //if(fourcc == 0x4d444446) // MDDF
+ //if(fourcc == 0x4d4f4446) // MODF
+ if(fourcc == 0x4d48324f) // MH2O new in WotLK
+ {
+ // çäåñ?íàäî çàïîìíèò?áàçîâó?ïîçèöè??ôàéë?òê âñ?ñìåùåí? áóäó?îò íåãî
+ uint32 base_pos = mf.getPos();
+ uint32 header_pos = 0;
+ MH2O_offsData *LiqOffsData = new MH2O_offsData;
+ MH2O_Data1 *LiqChunkData1 = new MH2O_Data1;
+ float *ChunkLiqHeight = new float[81];
+ for(chunk_num = 0; chunk_num < 256; ++chunk_num)
{
- /*
- if(size)
+ mf.read(LiqOffsData, 0x0C);
+ header_pos = mf.getPos();
+ if(LiqOffsData->offsData1 != 0) // åñëè äàííûå ?Data1 ?âîäå åñòü, òî èõ íàäî êîíâåðòèðîâàòü
{
- //printf("\nwmo count %d\n",size/64);
- wmo_count =size/64;
- for (int i=0; i<wmo_count; i++)
+ // ïåðåõî?ïî ñìåùåíèþ èç offsData1 ÎÒ ×À?êóñê?
+ mf.seek(base_pos + LiqOffsData->offsData1);
+ mf.read(LiqChunkData1, 0x18); // ñ÷èòûâàå?ñàìè äàííûå ?ñòðóêòóð?òèïà MH2O_Data1
+ // çàíîñè?äàííûå ôëàã?äëÿ êóñê?
+ if(LiqType[LiqChunkData1->LiquidTypeId] == 0xffff)
+ printf("\nCan't find Liquid type for map %s\nchunk %d\n", filename, chunk_num);
+ else if(LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_WATER || LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_OCEAN)
+ MapLiqFlag[chunk_num] |= 1; // water/ocean
+ else if(LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_MAGMA || LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_SLIME)
+ MapLiqFlag[chunk_num] |= 2; // magma/slime
+ // ïðåäâàðèòåëüíî çàïîëíÿåì âåñü êóñî?äàííûì?- íå?âîäû
+ for(int j = 0; j < 81; ++j)
+ {
+ ChunkLiqHeight[j] = -999999; // no liquid/water
+ }
+ // òåïåðü âû÷èñëÿåì òå ÷ò??âîäî??ïåðåçàïèñûâàåì èõ ?êóñê?
+ for(int b = 0; b <= LiqChunkData1->height; ++b)
{
- int id;
- mf.read(&id, 4);
- WMO *wmo = (WMO*)wmomanager.items[wmomanager.get(wmos[id])];
- WMOInstance inst(wmo, mf);
- wmois.push_back(inst);
+ for(int c = LiqChunkData1->xOffset; c <= (LiqChunkData1->xOffset + LiqChunkData1->width); ++c)
+ {
+ int n = (9 * (LiqChunkData1->yOffset + b)) + c;
+ ChunkLiqHeight[n] = LiqChunkData1->heightLevel1;
+ }
}
+ mf.seek(header_pos); // ?íå çàáûòü âåðíóòüñÿ íà èñõîäíóþ ïîçèöè?èìåííî ?ÕÈÄÅÐÅ
+ }
+ else // åñëè äàííûõ ?Data1 íå? òî íàäî çàïîëíèò?âåñü êóñî? íî äàííûì?- íå?âîäû
+ {
+ for(int j = 0; j < 81; ++j)
+ ChunkLiqHeight[j] = -999999; // no liquid/water
+ }
- }*/
- break;
- }
- case 0x4d574d4f: // MWMO
- {
- /*
- if (size)
+ if(!(chunk_num % 16))
+ m = 1024 * (chunk_num / 16); // ñìåùåíèå ïî ?äà?êóñêîâ ?ïåðåêðûòèå?= 1024
+ k = m + (chunk_num % 16) * 8; // óñòàíàâëèâàåìñÿ íà íà÷àëüíû?èíäåêñ äëÿ çàïîëíåí? ?äà
+ // çàíîñè?äàííûå êóñê??ìàññèâ äëÿ êàðò? ?ïåðåêðûòèå??îáðåçàíèåì êóñêîâ òê äàííûõ 81
+ // ýò?àíàëîã ñòàðîã?îáðåçàíèÿ ãðàíè÷íû?ïðàâûõ-áîêîâû??íèæíèõ äàííûõ
+ for(int p = 0; p < 72; p += 9) // íèæíèå 8 íå çàíîñè?òê îí?äóáëèðóåòñÿ ñëåä êóñêîì
{
- char *buf = new char[size];
- mf.read(buf, size);
- char *p=buf;
- while (p<buf+size)
+ for(int s = 0; s < 8; ++s) // 9 çíà÷åíèå ?ñòðîêå íå çàíîñè?òê îí?äóáëèðóåòñÿ ñëåä êóñêîì, ??ïðâû?áîêîâû?îáðåçàåò? äëÿ 128?28
{
- std::string path(p);
- p+=strlen(p)+1;
- fixname(path);
-
- wmomanager.add(path);
- wmos.push_back(path);
+ MapLiqHeight[k] = ChunkLiqHeight[p + s];
+ ++k;
}
- delete[] buf;
- }*/
- break;
- }
- case 0x4d564552: // MVER
- case 0x4d484452: // MHDR header
- case 0x4d434e4b: // MCNK
- case 0x4d544558: // MTEX textures (strings)
- case 0x4d4d4458: // MMDX m2 models (strings)
- case 0x4d4d4944: // MMID offsets for strings in MMDX
- case 0x4d574944: // MWID offsets for strings in MWMO
- case 0x4d444446: // MDDF
- case 0x4d46424f: // MFBO new in BC
- case 0x4d48324f: // MH2O new in WotLK
- break;
- default:
- {
- // mf.seekRelative(-3);
- printf("Unhandled map chunk: %u\n",fourcc);
- break;
+ k = k + 120;
+ }
}
+ delete LiqOffsData;
+ delete LiqChunkData1;
+ delete []ChunkLiqHeight;
+
}
+ //case 0x4d434e4b: // MCNK
+ //case 0x4d46424f: // MFBO new in BC
+ //case 0x4d545846: // MTXF new in WotLK
mf.seek(nextpos);
}
//printf("Loading chunks info\n");
// read individual map chunks
- for (int j=0; j<16; j++)
- for (int i=0; i<16; i++)
+ chunk_num = 0;
+ k = 0;
+ m = 0;
+ for (int j = 0; j < 16; ++j)
+ {
+ for (int i = 0; i < 16; ++i)
{
- mf.seek((int)mcnk_offsets[j*16+i]);
- LoadMapChunk(mf,&(mcells->ch[i][j]));
+ mf.seek((int)mcnk_offsets[j * 16 + i]);
+ LoadMapChunk(mf, &(mcells->ch[i][j]));
+ ++chunk_num;
}
-
- /*
- for(uint32 t=0;t<wmo_count ;t++)
- {
- wmois[t].draw();
- }*/
-
+ }
mf.close();
return true;
}
-struct MapChunkHeader {
- uint32 flags;
- uint32 ix;
- uint32 iy;
- uint32 nLayers;
- uint32 nDoodadRefs;
- uint32 ofsHeight;
- uint32 ofsNormal;
- uint32 ofsLayer;
- uint32 ofsRefs;
- uint32 ofsAlpha;
- uint32 sizeAlpha;
- uint32 ofsShadow;
- uint32 sizeShadow;
- uint32 areaid;
- uint32 nMapObjRefs;
- uint32 holes;
- uint16 s1;
- uint16 s2;
- uint32 d1;
- uint32 d2;
- uint32 d3;
- uint32 predTex;
- uint32 nEffectDoodad;
- uint32 ofsSndEmitters;
- uint32 nSndEmitters;
- uint32 ofsLiquid;
- uint32 sizeLiquid;
- float zpos;
- float xpos;
- float ypos;
- uint32 textureId;
- uint32 props;
- uint32 effectId;
-};
-
bool isHole(int holes, int i, int j)
{
- int testi = i/2;
- int testj = j/4;
- if(testi>3) testi = 3;
- if(testj>3) testj = 3;
- return (holes & holetab_h[testi] & holetab_v[testj])!=0;
+ int testi = i / 2;
+ int testj = j / 4;
+ if(testi > 3) testi = 3;
+ if(testj > 3) testj = 3;
+ return (holes & holetab_h[testi] & holetab_v[testj]) != 0;
}
-inline
-void LoadMapChunk(MPQFile & mf, chunk*_chunk)
+inline void LoadMapChunk(MPQFile &mf, chunk *_chunk)
{
float h;
uint32 fourcc;
@@ -207,298 +191,191 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
mf.read(&size, 4);
size_t lastpos = mf.getPos() + size;
- mf.read(&header, 0x80);
- _chunk->area_id =header.areaid ;
- _chunk->flag =0;
+ mf.read(&header, 0x80); // what if header size got changed?
+ _chunk->area_id = header.areaid;
float xbase = header.xpos;
float ybase = header.ypos;
float zbase = header.zpos;
- zbase = TILESIZE*32-zbase;
- xbase = TILESIZE*32-xbase;
- if(wmoc.x >xbase)wmoc.x =xbase;
- if(wmoc.z >zbase)wmoc.z =zbase;
+ zbase = TILESIZE * 32 - zbase;
+ xbase = TILESIZE * 32 - xbase;
+ if(wmoc.x > xbase) wmoc.x = xbase;
+ if(wmoc.z > zbase) wmoc.z = zbase;
int chunkflags = header.flags;
- float zmin=999999999.0f;
- float zmax=-999999999.0f;
- //must be there, bl!zz uses some crazy format
- int nTextures;
+ //printf("LMC: flags %X\n", chunkflags);
+ float zmin = 999999999.0f;
+ float zmax = -999999999.0f;
+ // must be there, bl!zz uses some crazy format
while (mf.getPos() < lastpos)
{
- mf.read(&fourcc,4);
+ mf.read(&fourcc, 4);
mf.read(&size, 4);
- //if(size!=580)
- // printf("\n sz=%d",size);
- size_t nextpos = mf.getPos() + size;
- if(fourcc==0x4d435654) // MCVT
+ size_t nextpos = mf.getPos() + size;
+ if(fourcc == 0x4d435654) // MCVT
{
- for (int j=0; j<17; j++)
- for (int i=0; i<((j%2)?8:9); i++)
+ for (int j = 0; j < 17; ++j)
+ {
+ for (int i = 0; i < ((j % 2) ? 8 : 9); ++i)
{
- mf.read(&h,4);
- float z=h+ybase;
- if (j%2)
+ mf.read(&h, 4);
+ float z = h + ybase;
+ if (j % 2)
{
- if(isHole(header.holes,i,j))
- _chunk->v8[i][j/2] = -1000;
+ if(isHole(header.holes, i, j))
+ _chunk->v8[i][j / 2] = -1000;
else
- _chunk->v8[i][j/2] = z;
+ _chunk->v8[i][j / 2] = z;
}
else
{
- if(isHole(header.holes,i,j))
- _chunk->v9[i][j/2] = -1000;
+ if(isHole(header.holes, i, j))
+ _chunk->v9[i][j / 2] = -1000;
else
- _chunk->v9[i][j/2] = z;
+ _chunk->v9[i][j / 2] = z;
}
- if(z>zmax)zmax=z;
- //if(z<zmin)zmin=z;
+ if(z > zmax) zmax = z;
+ //if(z < zmin) zmin = z;
}
+ }
}
- else if(fourcc==0x4d434e52) // MCNR
+ else if(fourcc == 0x4d434e52) // MCNR
{
- nextpos = mf.getPos() + 0x1C0; // size fix
+ nextpos = mf.getPos() + 0x1C0; // size fix
}
- else if(fourcc==0x4d434c51) // MCLQ
+ else if(fourcc == 0x4d434c51) // íå áóäå?ó÷èòûâàò?åñëè óæ?áûëè äàííûå ?MH2O, ïåðåñòðàõîâê?:) // MCLQ
{
// liquid / water level
- //bool haswater;
char fcc1[5];
- mf.read(fcc1,4);
+ mf.read(fcc1, 4);
flipcc(fcc1);
- fcc1[4]=0;
+ fcc1[4] = 0;
+ float *ChunkLiqHeight = new float[81];
- if (!strcmp(fcc1,"MCSE"))
+ if (!strcmp(fcc1, "MCSE"))
{
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- _chunk->waterlevel[i][j]=-999999; // no liquid/water
+ for(int j = 0; j < 81; ++j)
+ {
+ ChunkLiqHeight[j] = -999999; // no liquid/water
+ }
}
else
{
float maxheight;
mf.read(&maxheight, 4);
+ for(int j = 0; j < 81; ++j)
+ {
+ LiqData liq;
+ mf.read(&liq, 8);
- for(int j=0;j<9;j++)
- for(int i=0;i<9;i++)
- {
- mf.read(&h, 4);
- mf.read(&h, 4);
- if(h > maxheight)
- _chunk->waterlevel[i][j]=-999999;
- else
- _chunk->waterlevel[i][j]=h;
- }
+ if(liq.height > maxheight)
+ ChunkLiqHeight[j] = -999999;
+ else
+ ChunkLiqHeight[j] = h;
+ }
if(chunkflags & 4 || chunkflags & 8)
- _chunk->flag |=1;
+ MapLiqFlag[chunk_num] |= 1; // water
if(chunkflags & 16)
- _chunk->flag |=2;
-
+ MapLiqFlag[chunk_num] |= 2; // magma/slime
+ }
+ // àïîëíå?òà?æå êà??MH2O
+ if(!(chunk_num % 16))
+ m = 1024 * (chunk_num / 16);
+ k = m + (chunk_num % 16) * 8;
+
+ for(int p = 0; p < 72; p += 9)
+ {
+ for(int s = 0; s < 8; ++s)
+ {
+ MapLiqHeight[k] = ChunkLiqHeight[p + s];
+ ++k;
+ }
+ k = k + 120;
}
+ delete []ChunkLiqHeight;
break;
}
- else if (fourcc==0x4d434c59) // MCLY
- {
- // texture info
- nTextures = (int)size;
- }
- else if (fourcc==0x4d43414c) // MCAL
- {
- if (nTextures<=0)
- continue;
- }
-
mf.seek(nextpos);
}
}
-double solve (vec *v,vec *p)
+inline void TransformData()
{
- double a = v[0].y *(v[1].z - v[2].z) + v[1].y *(v[2].z - v[0].z) + v[2].y *(v[0].z - v[1].z);
- double b = v[0].z *(v[1].x - v[2].x) + v[1].z *(v[2].x - v[0].x) + v[2].z *(v[0].x - v[1].x);
- double c = v[0].x *(v[1].y - v[2].y) + v[1].x *(v[2].y - v[0].y) + v[2].x *(v[0].y - v[1].y);
- double d = v[0].x *(v[1].y*v[2].z - v[2].y*v[1].z) + v[1].x* (v[2].y*v[0].z - v[0].y*v[2].z) + v[2].x* (v[0].y*v[1].z - v[1].y*v[0].z);
- //-d
-
- //plane equation ax+by+cz+d=0
- return ((a*p->x+c*p->z-d)/b);
-}
-
-inline
-double GetZ(double x,double z)
-{
- vec v[3];
- vec p;
-
- //bool inWMO=false;
+ cell = new Cell;
- //if(!inWMO)
+ for(uint32 x = 0; x < 128; ++x)
{
- //find out quadrant
- int xc=(int)(x/UNITSIZE);
- int zc=(int)(z/UNITSIZE);
- if(xc>127)xc=127;
- if(zc>127)zc=127;
-
- double lx=x-xc*UNITSIZE;
- double lz=z-zc*UNITSIZE;
- p.x=lx;
- p.z=lz;
-
- v[0].x=UNITSIZE/2;
- v[0].y =cell->v8[xc][zc];
- v[0].z=UNITSIZE/2;
-
- if(lx>lz)
+ for(uint32 y = 0; y < 128; ++y)
{
- v[1].x=UNITSIZE;
- v[1].y =cell->v9[xc+1][zc];
- v[1].z=0;
- }
- else
- {
- v[1].x=0.0;
- v[1].y =cell->v9[xc][zc+1];
- v[1].z=UNITSIZE;
- }
-
- if(lz>UNITSIZE-lx)
- {
- v[2].x=UNITSIZE;
- v[2].y =cell->v9[xc+1][zc+1];
- v[2].z=UNITSIZE;
- }
- else
- {
- v[2].x=0;
- v[2].y=cell->v9[xc][zc];
- v[2].z=0;
+ cell->v8[y][x] = (float)mcells->ch[x / 8][y / 8].v8[x % 8][y % 8];
+ cell->v9[y][x] = (float)mcells->ch[x / 8][y / 8].v9[x % 8][y % 8];
}
- return -solve(v,&p);
+ // extra 1 point on bounds
+ cell->v9[128][x] = (float)mcells->ch[x / 8][15].v9[x % 8][8];
+ // x == y
+ cell->v9[x][128] = (float)mcells->ch[15][x / 8].v9[8][x % 8];
}
-}
-
-inline
-void TransformWaterData()
-{
- cell= new Cell;
- for(int x=0;x<128;x++)
- for(int y=0;y<128;y++)
- cell->v9[x][y] = mcells->ch[x/8][y/8].waterlevel[x%8][y%8];
-
- //and the last 1
- cell->v9[128][128] = mcells->ch[15][15].waterlevel[8][8];
-}
-
-inline
-void TransformData()
-{
- cell= new Cell;
-
- for(int x=0;x<128;x++)
- {
- for(int y=0;y<128;y++)
- {
- cell->v8[y][x] = (float)mcells->ch[x/8][y/8].v8[x%8][y%8];
- cell->v9[y][x] = (float)mcells->ch[x/8][y/8].v9[x%8][y%8];
- }
-
- //extra 1 point on bounds
- cell->v9[128][x] = (float)mcells->ch[x/8][15].v9[x%8][8];
- //x==y
- cell->v9[x][128] = (float)mcells->ch[15][x/8].v9[8][x%8];
- }
-
- //and the last 1
+ // and the last 1
cell->v9[128][128] = (float)mcells->ch[15][15].v9[8][8];
delete mcells;
}
-const char MAP_MAGIC[] = "MAP_2.50";
+const char MAP_MAGIC[] = "MAP_3.00";
-bool ConvertADT(char * filename,char * filename2)
+bool ConvertADT(char *filename, char *filename2)
{
- //if(!strstr(filename,"oth_32_48"))return false;
if(!LoadADT(filename))
return false;
- FILE *output=fopen(filename2,"wb");
+ FILE *output=fopen(filename2, "wb");
if(!output)
{
- printf("Can't create the output file '%s'\n",filename2);
+ printf("Can't create the output file '%s'\n", filename2);
+ delete [] MapLiqHeight;
+ delete [] MapLiqFlag;
return false;
}
// write magic header
- fwrite(MAP_MAGIC,1,8,output);
+ fwrite(MAP_MAGIC, 1, 8, output);
- for(unsigned int x=0;x<16;x++)
+ for(uint32 x = 0; x < 16; ++x)
{
- for(unsigned int y=0;y<16;y++)
+ for(uint32 y = 0; y < 16; ++y)
{
- if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x102D)
+ if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId)
{
- if(areas[mcells->ch[y][x].area_id]==0xffff)
- printf("\nCan't find area flag for areaid %u.\n",mcells->ch[y][x].area_id);
+ if(areas[mcells->ch[y][x].area_id] == 0xffff)
+ printf("\nCan't find area flag for areaid %u.\n", mcells->ch[y][x].area_id);
- fwrite(&areas[mcells->ch[y][x].area_id],1,2,output);
+ fwrite(&areas[mcells->ch[y][x].area_id], 1, 2, output);
}
else
{
- uint16 flag=0xffff;
- fwrite(&flag,1,2,output);
+ uint16 flag = 0xffff;
+ fwrite(&flag, 1, 2, output);
}
}
}
- for(unsigned int x=0;x<16;x++)
- for(unsigned int y=0;y<16;y++)
- fwrite(&mcells->ch[y][x].flag,1,1,output);
-
- TransformWaterData();
+ fwrite(MapLiqFlag, 1, 256, output);
+ delete [] MapLiqFlag;
- for(unsigned int x=0;x<128;x++)
- for(unsigned int y=0;y<128;y++)
- fwrite(&cell->v9[y][x],1,sizeof(float),output);
+ fwrite(MapLiqHeight, sizeof(float), 16384, output);
+ delete [] MapLiqHeight;
- delete cell;
TransformData();
- /*
- for(unsigned int x=0;x<iRes;x++)
- for(unsigned int y=0;y<iRes;y++)
- {
- float z=(float)GetZ(
- (((double)(y))*TILESIZE)/((double)(iRes-1)),
- (((double)(x))*TILESIZE)/((double)(iRes-1)));
-
- fwrite(&z,1,sizeof(z),output);
- }*/
fwrite(&cell->v9, 1, sizeof(cell->v9), output);
fwrite(&cell->v8, 1, sizeof(cell->v8), output);
fclose(output);
delete cell;
-/*
- for (std::vector<std::string>::iterator it = wmos.begin(); it != wmos.end(); ++it)
- wmomanager.delbyname(*it);
-
- wmos.clear();
- wmois.clear();
-
- for (std::vector<model>::iterator it = wmomodel.begin(); it != wmomodel.end(); ++it)
- {
- it->tr.clear();
-
- }
- //printf("\n %d \n",in);
- wmomodel.clear();
- //polygons.clear();*/
+
return true;
}
diff --git a/contrib/extractor/adt.h b/contrib/extractor/adt.h
index 9af85b14d8c..516ed88a86e 100644
--- a/contrib/extractor/adt.h
+++ b/contrib/extractor/adt.h
@@ -9,47 +9,122 @@ typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
class Liquid;
-typedef struct {
-float x;
-float y;
-float z;
-}svec;
-
-typedef struct {
-double x;
-double y;
-double z;
-}vec;
-
-typedef struct{
+typedef struct
+{
+ float x;
+ float y;
+ float z;
+} svec;
+
+typedef struct
+{
+ double x;
+ double y;
+ double z;
+} vec;
+
+typedef struct
+{
vec v[3];
-}triangle;
+} triangle;
+
+typedef struct
+{
+ float v9[16 * 8 + 1][16 * 8 + 1];
+ float v8[16 * 8][16 * 8];
+} Cell;
+
+typedef struct
+{
+ double v9[9][9];
+ double v8[8][8];
+ uint16 area_id;
+} chunk;
-typedef struct{
-float v9[16*8+1][16*8+1];
-float v8[16*8][16*8];
-}Cell;
+typedef struct
+{
+ chunk ch[16][16];
+} mcell;
-typedef struct{
-double v9[9][9];
-double v8[8][8];
-uint16 area_id;
-//Liquid *lq;
-float waterlevel[9][9];
-uint8 flag;
-}chunk;
+struct MapChunkHeader
+{
+ uint32 flags;
+ uint32 ix;
+ uint32 iy;
+ uint32 nLayers;
+ uint32 nDoodadRefs;
+ uint32 ofsHeight;
+ uint32 ofsNormal;
+ uint32 ofsLayer;
+ uint32 ofsRefs;
+ uint32 ofsAlpha;
+ uint32 sizeAlpha;
+ uint32 ofsShadow;
+ uint32 sizeShadow;
+ uint32 areaid;
+ uint32 nMapObjRefs;
+ uint32 holes;
+ uint16 s1;
+ uint16 s2;
+ uint32 d1;
+ uint32 d2;
+ uint32 d3;
+ uint32 predTex;
+ uint32 nEffectDoodad;
+ uint32 ofsSndEmitters;
+ uint32 nSndEmitters;
+ uint32 ofsLiquid; // not use in WotLK
+ uint32 sizeLiquid; // not use in WotLK
+ float zpos;
+ float xpos;
+ float ypos;
+ uint32 textureId; // new offsColorValues in WotLK
+ uint32 props;
+ uint32 effectId;
+};
-class WMO;
-class WMOManager;
-void fixname(std::string &name);
+typedef struct
+{
+ uint32 offsData1;
+ uint32 used;
+ uint32 offsData2;
+} MH2O_offsData;
typedef struct
{
-chunk ch[16][16];
-}mcell;
+ uint16 LiquidTypeId;
+ uint16 type;
+ float heightLevel1;
+ float heightLevel2;
+ uint8 xOffset;
+ uint8 yOffset;
+ uint8 width;
+ uint8 height;
+ uint32 ofsData2a;
+ uint32 ofsData2b;
+} MH2O_Data1;
+
+typedef struct
+{
+ uint16 unk1;
+ uint16 unk2;
+ float height;
+} LiqData;
+
+enum LiquidType
+{
+ LIQUID_TYPE_WATER = 0,
+ LIQUID_TYPE_OCEAN = 1,
+ LIQUID_TYPE_MAGMA = 2,
+ LIQUID_TYPE_SLIME = 3
+};
+
class MPQFile;
-void LoadMapChunk(MPQFile &,chunk*);
-bool LoadWMO(char* filename);
+
+float *MapLiqHeight;
+uint8 *MapLiqFlag;
+uint32 k, m, chunk_num;
+void LoadMapChunk(MPQFile &, chunk*);
#endif
diff --git a/contrib/extractor/libmpq/CMakeLists.txt b/contrib/extractor/libmpq/CMakeLists.txt
new file mode 100644
index 00000000000..c00120c6e48
--- /dev/null
+++ b/contrib/extractor/libmpq/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2005-2009 MaNGOS project <http://getmangos.com/>
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+add_library (libmpq common.cpp explode.cpp extract.cpp huffman.cpp mpq.cpp parser.cpp wave.cpp )
+# link libmpq with zlib
+target_link_libraries (libmpq z)
diff --git a/contrib/extractor/libmpq/Makefile b/contrib/extractor/libmpq/Makefile
deleted file mode 100644
index eb1965e29f1..00000000000
--- a/contrib/extractor/libmpq/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-CC = g++
-AR = ar
-objects = common.o explode.o extract.o huffman.o wave.o mpq.o parser.o
-zlib_objects = ../../../dep/src/zlib/*.o #adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o zutil.o inflate.o inftrees.o inffast.o
-
-all: libmpq.a libmpq.so
-
-clean:
- rm -f libmpq.a libmpq.so *.o
-
-libmpq.a: $(objects) $(zlib_objects)
- $(AR) cru $@ $+
-libmpq.so: $(objects) $(zlib_objects)
- $(CC) -fPIC -o $@ $+
-
-%.o:%.cpp
- $(CC) -I../ -c $+
diff --git a/contrib/extractor/libmpq/Makefile.am b/contrib/extractor/libmpq/Makefile.am
deleted file mode 100644
index 192bd1369ef..00000000000
--- a/contrib/extractor/libmpq/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-# The input Makefile for the main mpq-tools
-
-lib_LTLIBRARIES = libmpq.la
-noinst_HEADERS = explode.h huffman.h wave.h common.h
-
-# The directory where the include files will be installed.
-libmpq_includedir = $(includedir)/libmpq
-
-# Which header files to install.
-libmpq_include_HEADERS = mpq.h
-
-libmpq_la_SOURCES = $(GENERAL_SRCS)
-libmpq_la_LDFLAGS = -release $(LIBMPQ_VERSION)
-libmpq_la_LIBADD = @Z_LIBS@
-
-GENERAL_SRCS = \
- common.c \
- huffman.c \
- extract.c \
- explode.c \
- mpq.c \
- parser.c \
- wave.c
diff --git a/contrib/extractor/libmpq/mpq.cpp b/contrib/extractor/libmpq/mpq.cpp
index eddd92ac483..a59d3dff2f1 100644
--- a/contrib/extractor/libmpq/mpq.cpp
+++ b/contrib/extractor/libmpq/mpq.cpp
@@ -199,7 +199,7 @@ int libmpq_archive_info(mpq_archive *mpq_a, unsigned int infotype) {
/*
* This function returns some useful file information.
*/
-int libmpq_file_info(mpq_archive *mpq_a, unsigned int infotype, const int unsigned number) {
+int libmpq_file_info(mpq_archive *mpq_a, unsigned int infotype, const unsigned int number) {
int blockindex = number; //-1;
int i = 0;
mpq_block *mpq_b = NULL;
diff --git a/contrib/vmap_debugger/ModelContainerView.cpp b/contrib/vmap_debugger/ModelContainerView.cpp
index f9b19c2a1fd..fbfa565696f 100644
--- a/contrib/vmap_debugger/ModelContainerView.cpp
+++ b/contrib/vmap_debugger/ModelContainerView.cpp
@@ -451,7 +451,7 @@ namespace VMAP
//====================================================================
- Vector3 ModelContainerView::convertPositionToTrinityRep(float x, float y, float z) const {
+ Vector3 ModelContainerView::convertPositionToMangosRep(float x, float y, float z) const {
float pos[3];
pos[0] = z;
pos[1] = x;
@@ -490,7 +490,7 @@ namespace VMAP
#if 0
i_App->defaultController.getPosition();
Vector3 pos = i_App->defaultController.getPosition();
- Vector3 pos2 = convertPositionToTrinityRep(pos.x, pos.y, pos.z);
+ Vector3 pos2 = convertPositionToMangosRep(pos.x, pos.y, pos.z);
//Vector3 pos3 = iVMapManager->convertPositionToInternalRep(pos2.x, pos2.y, pos2.z);
//pos3 = iVMapManager->convertPositionToInternalRep(pos2.x, pos2.y, pos2.z);
diff --git a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
index 5cb08f770aa..a6ef74dc086 100644
--- a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
+++ b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
Binary files differ
diff --git a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
index c38b6e64f64..03c76907658 100644
--- a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
+++ b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
Binary files differ
diff --git a/contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt b/contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt
deleted file mode 100644
index ce8d8f70166..00000000000
--- a/contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt
+++ /dev/null
@@ -1,318 +0,0 @@
-THE MOPAQ ARCHIVE FORMAT
-v0.9 (Thursday, June 30, 2005)
-by Justin Olbrantz(Quantam)
-
-Distribution and reproduction of this specification are allowed without limitation, as long as it is not altered. Quoting
-in other works is freely allowed, as long as the source and author of the quote is stated.
-
-TABLE OF CONTENTS
-1. Introduction to the MoPaQ Format
-2. The MoPaQ Format
- 2.1 General Archive Layout
- 2.2 Archive Header
- 2.3 Block Table
- 2.4 Hash Table
- 2.5 File Data
- 2.6 Listfile
- 2.7 Extended Attributes
- 2.8 Weak (Old) Digital Signature
- 2.9 Strong (New) Digital Signature
-3. Algorithm Source Code
- 3.1 Encryption/Decryption
- 3.2 Hashing
- 3.3 Conversion of FILETIME and time_t
-
-1. INTRODUCTION TO THE MOPAQ FORMAT
-The MoPaQ (or MPQ) format is an archive file format designed by Mike O'Brien (hence the name Mike O'brien PaCK) at Blizzard
-Entertainment. The format has been used in all Blizzard games since (and including) Diablo. It is heavily optimized to be
-a read-only game archive format, and excels at this role.
-
-The Blizzard MoPaQ-reading functions are contained in the Storm module, which my be either statically or dynamically linked.
-The Blizzard MoPaQ-writing functions are contained in the MPQAPI module, which is always statically linked.
-
-2. THE MOPAQ FORMAT
-All numbers in the MoPaQ format are in little endian. Data types are listed either as int (integer, the number of bits specified),
-byte (8 bits), and char (bytes which contain ASCII characters). All sizes and offsets are in bytes, unless specified otherwise.
-Structure members are listed in the following general form:
-offset from the beginning of the structure: data type(array size) member name : member description
-
-2.1 GENERAL ARCHIVE LAYOUT
-- Archive Header
-- File Data
-- File Data - Special Files
-- Hash Table
-- Block Table
-- Strong Digital signature
-
-This is the usual archive format, and is not absolutely essential. Some archives have been observed placing the hash table
-and file table after the archive header, and before the file data.
-
-2.2 ARCHIVE HEADER
-00h: char(4) Magic : Indicates that the file is a MoPaQ archive. Must be ASCII "MPQ" 1Ah.
-04h: int32 HeaderSize : Size of the archive header. Should be 32.
-08h: int32 ArchiveSize : Size of the whole archive, including the header. Does not include the strong digital signature, if present.
-This size is used, among other things, for determining the region to hash in computing the digital signature.
-0Ch: int16 Unknown : Unknown
-0Eh: int8 SectorSizeShift : Power of two exponent specifying the number of 512-byte disk sectors in each logical sector
-in the archive. The size of each logical sector the archive is 512 * 2^SectorSizeShift. Bugs in the Storm library dictate
-that this should always be 3 (4096 byte sectors).
-10h: int32 HashTableOffset : Offset to the beginning of the hash table, relative to the beginning of the archive.
-14h: int32 BlockTableOffset : Offset to the beginning of the block table, relative to the beginning of the archive.
-18h: int32 HashTableEntries : Number of entries in the hash table. Must be a power of two, and must be less than 2^16.
-1Ch: int32 BlockTableEntries : Number of entries in the block table.
-
-The archive header is the first structure in the archive, at archive offset 0, but the archive does not need to be at offset
-0 of the containing file. The offset of the archive in the file is referred to here as ArchiveOffset. If the archive is not
-at the beginning of the file, it must begin at a disk sector boundary (512 bytes). Early versions of Storm require that the
-archive be at the end of the containing file (ArchiveOffset + ArchiveSize = file size), but this is not required in newer
-versions (due to the strong digital signature not being considered a part of the archive).
-
-2.3 BLOCK TABLE
-The block table contains entries for each region in the archive. Regions may be either files or empty space, which may be
-overwritten by new files (typically this space is from deleted file data). The block table is encrypted, using the hash
-of "(block table)" as the key. Each entry is structured as follows:
-
-00h: int32 BlockOffset : Offset of the beginning of the block, relative to the beginning of the archive. Meaningless if the block size is 0.
-04h: int32 BlockSize : Size of the block in the archive.
-08h: int32 FileSize : Size of the file data stored in the block. Only valid if the block is a file, otherwise meaningless, and should be 0. If the file is compressed, this is the size of the uncompressed file data.
-0Ch: int32 Flags : Bit mask of the flags for the block. The following values are conclusively identified:
- 80000000h: Block is a file, and follows the file data format; otherwise, block is free space, and may be overwritten. If the block is not a file, all other flags should be cleared.
- 01000000h: File is stored as a single unit, rather than split into sectors.
- 00020000h: The file's encryption key is adjusted by the block offset and file size (explained in detail in the File Data section). File must be encrypted.
- 00010000h: File is encrypted.
- 00000200h: File is compressed. Mutually exclusive to file imploded.
- 00000100h: File is imploded. Mutually exclusive to file compressed.
-
-2.4 HASH TABLE
-Instead of storing file names, for quick access MoPaQs use a fixed, power of two-size hash table of files in the archive. A file is uniquely identified by its file path, its language, and its platform. The home entry for a file in the hash table is computed as a hash of the file path. In the event of a collision (the home entry is occupied by another file), progressive overflow is used, and the file is placed in the next available hash table entry. Searches for a desired file in the hash table proceed from the home entry for the file until either the file is found, the entire hash table is searched, or an empty hash table entry (FileBlockIndex of FFFFFFFFh) is encountered. The hash table is encrypted using the hash of "(hash table)" as the key. Each entry is structured as follows:
-
-00h: int32 FilePathHashA : The hash of the file path, using method A.
-04h: int32 FilePathHashB : The hash of the file path, using method B.
-08h: int16 Language : The language of the file. This is a Windows LANGID data type, and uses the same values. 0 indicates the default language (American English), or that the file is language-neutral.
-0Ah: int8 Platform : The platform the file is used for. 0 indicates the default platform. No other values have been observed.
-0Ch: int32 FileBlockIndex : If the hash table entry is valid, this is the index into the block table of the file. Otherwise, one of the following two values:
- FFFFFFFFh: Hash table entry is empty, and has always been empty. Terminates searches for a given file.
- FFFFFFFEh: Hash table entry is empty, but was valid at some point (in other words, the file was deleted). Does not terminate searches for a given file.
-
-2.5 FILE DATA
-00h: int32(SectorsInFile + 1) SectorOffsetTable : Offsets to the start of each sector's data, relative to the beginning of the file data. Not present if this information is calculatable (see details below).
-immediately following SectorOffsetTable: SectorData : Data of each sector in the file, packed end to end (see details below).
-
-Normally, file data is split up into sectors, for simple streaming. All sectors, save for the last, will contain as many bytes of file data as specified in the archive header's SectorSizeShift; the last sector may be smaller than this, depending on the size of the file data. This sector size is the size of the raw file data; if the file is compressed, the compressed sector will be smaller or the same size as the uncompressed sector size. Individual sectors in a compressed file may be stored uncompressed; this occurs if and only if the sector could not be compressed by the algorithm used (if the compressed sector size was greater than or equal to the size of the raw data), and is indicated by the sector's compressed size in SectorOffsetTable being equal to the uncompressed size of the sector (which may be calculated from the FileSize).
-
-If the sector is compressed (but not imploded), a bit mask byte of the compression algorithm(s) used to compress the sector is appended to the beginning of the compressed sector data. This additional byte counts towards the total size of the sector; if the size of the sector (including this byte) exceeds or matches the uncompressed size of the sector data, the sector will be stored uncompressed, and this byte omitted. Multiple compression algorithms may be used on the same sector; in this case, successive compression occurs in the order the algorithms are listed below, and decompression occurs in the opposite order. For implimentations of all of these algorithms, see StormLib.
- 40h: IMA ADPCM mono
- 80h: IMA ADPCM stereo
- 01h: Huffman encoded
- 02h: Deflated (see ZLib)
- 08h: Imploded (see PKWare Data Compression Library)
- 10h: BZip2 compressed (see BZip2)
-
-If the file is stored as a single unit (indicated in the file's Flags), there is effectively only a single sector, which
-contains the entire file.
-
-If the file is encrypted, each sector (after compression and appendage of the compression type byte, if applicable)
-is encrypted with the file's key. The base key for a file is determined by a hash of the file name stripped of the
-directory (i.e. the key for a file named "directory\file" would be computed as the hash of "file"). If this key is
-adjusted, as indicated in the file's Flags, the final key is calculated as ((base key + BlockOffset - ArchiveOffset)
-XOR FileSize) (StormLib - an open-source implementation of the MoPaQ reading and writing functions,
-by Ladislav Zezula - incorrectly uses an AND in place of the XOR). Each sector is encrypted using the key + the
-0-based index of the sector in the file. The SectorOffsetTable, if present, is encrypted using the key - 1.
-
-The SectorOffsetTable is omitted when the sizes and offsets of all sectors in the file are calculatable from the FileSize.
-This can happen in several circumstances. If the file is not compressed/imploded, then the size and offset of all sectors
-is known, based on the archive's SectorSizeShift. If the file is stored as a single unit compressed/imploded, then the
-SectorOffsetTable is omitted, as the single file "sector" corresponds to BlockSize and FileSize, as mentioned previously.
-Note that the SectorOffsetTable will always be present if the file is compressed/imploded and the file is not stored as
-a single unit, even if there is only a single sector in the file (the size of the file is less than or equal to the
-archive's sector size).
-
-2.6 LISTFILE
-The listfile is a very simple extension to the MoPaQ format that contains the file paths of (most) files in the archive.
-The languages and platforms of the files are not stored in the listfile. The listfile is contained in the file "(listfile)",
-and is simply a non-Unix-style text file with one file path on each line, lines terminated with the bytes 0Dh 0Ah. The file
-"(listfile)" may not be listed in the listfile.
-
-2.7 EXTENDED ATTRIBUTES
-The extended attributes are optional file attributes for files in the block table. These attributes were added at times after
-the MoPaQ format was already finalized, and it is not necessary for every archive to have all (or any) of the extended attributes.
-If an archive contains a given attribute, there will be an instance of that attribute for every block in the block table, although
-the attribute will be meaningless if the block is not a file. The order of the attributes for blocks correspond to the order of the
-blocks in the block table, and are of the same number. The attributes are stored in parallel arrays in the "(attributes)" file,
-in the archive. The attributes corresponding to this file need not be valid (and logically cannot be). Unlike all the other
-structures in the MoPaQ format, entries in the extended attributes are NOT guaranteed to be aligned. Also note that in some
-archives, malicious zeroing of the attributes has been observed, perhaps with the intent of breaking archive viewers. This
-file is structured as follows:
-
-00h: int32 Version : Specifies the extended attributes format version. For now, must be 100.
-04h: int32 AttributesPresent : Bit mask of the extended attributes present in the archive:
- 00000001h: File CRC32s.
- 00000002h: File timestamps.
- 00000004h: File MD5s.
-08h: int32(BlockTableEntries) CRC32s : CRC32s of the (uncompressed) file data for each block in the archive. Omitted if the
-archive does not have CRC32s. immediately after CRC32s: FILETIME(BlockTableEntries) Timestamps : Timestamps for each block
-in the archive. The format is that of the Windows FILETIME structure. Omitted if the archive does not have timestamps.
-immediately after Timestamps: MD5(BlockTableEntries) MD5s : MD5s of the (uncompressed) file data for each block in the archive.
-Omitted if the archive does not have MD5s.
-
-2.8 WEAK DIGITAL SIGNATURE
-The weak digital signature is a digital signature using Microsoft CryptoAPI. It is an implimentation of the RSASSA-PKCS1-v1_5
-digital signature protocol, using the MD5 hashing algorithm and a 512-bit (weak) RSA key (for more information about this
-protocol, see the RSA Labs PKCS1 specification). The public key and exponent are stored in a resource in Storm. The signature
-is stored uncompressed, unencrypted in the file "(signature)" in the archive. The archive is hashed from the beginning of the
-archive (ArchiveOffset in the containing file) to the end of the archive (the length indicated by ArchiveSize); the signature
-file is added to the archive before signing, and the space occupied by the file is considered to be all binary 0s during
-signing/verification. This file is structured as follows:
-
-00h: int32 Unknown : Must be 0.
-04h: int32 Unknown : must be 0.
-08h: int512 Signature : The digital signature. Like all other numbers in the MoPaQ format, this is stored in little-endian order.
-
-2.9 STRONG DIGITAL SIGNATURE
-The strong digital signature uses a simple proprietary implementation of RSA signing, using the SHA-1 hashing algorithm and
-a 2048-bit (strong) RSA key. The default public key and exponent are stored in Storm, but other keys may be used as well.
-The strong digital signature is stored immediately after the archive, in the containing file; the entire archive (ArchiveSize
-bytes, starting at ArchiveOffset in the containing file) is hashed as a single block. The signature has the following format:
-
-00h: char(4) Magic : Indicates the presence of a digital signature. Must be "NGIS" ("SIGN" backwards).
-04h: int2048 Signature : The digital signature, stored in little-endian format.
-
-When the Signature field is decrypted with the public key and exponent, and the result stored in little-endian order, it is structured as follows:
-
-00h: byte Padding : Must be 0Bh.
-01h: byte(235) Padding : Must be BBh.
-ECh: byte(20) SHA-1 : SHA-1 hash of the archive, in standard SHA-1 format.
-
-3. ALGORITHM SOURCE CODE
-3.1 ENCRYPTION/DECRYPTION
-I believe this was derived at some point from code in StormLib. Assumes the long type to be 32 bits, and the machine to be little endian order.
-
-unsigned long dwCryptTable[0x500];
-
-void InitializeCryptTable()
-{
- unsigned long seed = 0x00100001;
- unsigned long index1 = 0;
- unsigned long index2 = 0;
- int i;
-
- for (index1 = 0; index1 < 0x100; index1++)
- {
- for (index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
- {
- unsigned long temp1, temp2;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp1 = (seed & 0xFFFF) << 0x10;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp2 = (seed & 0xFFFF);
-
- dwCryptTable[index2] = (temp1 | temp2);
- }
- }
-}
-
-void EncryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEE;
- unsigned long ch;
-
- assert(lpbyBuffer);
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111) | (dwKey >> 0x0B);
- seed = *lpdwBuffer + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-void DecryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEE;
- unsigned long ch;
-
- assert(lpbyBuffer);
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111) | (dwKey >> 0x0B);
- seed = ch + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-3.2 HASHING
-Based on code from StormLib.
-
-// Different types of hashes to make with HashString
-#define MPQ_HASH_TABLE_OFFSET 0
-#define MPQ_HASH_NAME_A 1
-#define MPQ_HASH_NAME_B 2
-#define MPQ_HASH_FILE_KEY 3
-
-unsigned long HashString(const char *lpszString, unsigned long dwHashType)
-{
- unsigned long seed1 = 0x7FED7FED;
- unsigned long seed2 = 0xEEEEEEEE;
- int ch;
-
- while (*lpszString != 0)
- {
- ch = toupper(*lpszString++);
-
- seed1 = dwCryptTable[(dwHashType * 0xFF) + ch] ^ (seed1 + seed2);
- seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
- }
- return seed1;
-}
-
-3.3 CONVERSION OF FILETIME AND time_t
-
-#define EPOCH_OFFSET 116444736000000000ULL // Number of 100 ns units between 01/01/1601 and 01/01/1970
-
-bool GetTimeFromFileTime(FILETIME &fileTime, time_t &time)
-{
- // The FILETIME represents a 64-bit integer: the number of 100 ns units since January 1, 1601
- unsigned long long nTime = ((unsigned long long)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime;
-
- if (nTime < EPOCH_OFFSET)
- return false;
-
- nTime -= EPOCH_OFFSET; // Convert the time base from 01/01/1601 to 01/01/1970
- nTime /= 10000000ULL; // Convert 100 ns to sec
-
- time = (time_t)nTime;
-
- // Test for overflow (FILETIME is 64 bits, time_t is 32 bits)
- if ((nTime - (unsigned long long)time) > 0)
- return false;
-
- return true;
-}
-
-void GetFileTimeFromTime(time_t &time, FILETIME &fileTime)
-{
- unsigned long long nTime = (unsigned long long)time;
-
- nTime *= 10000000ULL;
- nTime += EPOCH_OFFSET;
-
- fileTime.dwLowDateTime = (DWORD)nTime;
- fileTime.dwHighDateTime = (DWORD)(nTime >> 32);
-}
diff --git a/contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt b/contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt
deleted file mode 100644
index 6a21eca5472..00000000000
--- a/contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt
+++ /dev/null
@@ -1,421 +0,0 @@
-THE MOPAQ ARCHIVE FORMAT
-v1.0 (Friday, September 1, 2006)
-by Justin Olbrantz(Quantam)
-
-Distribution and reproduction of this specification are allowed without limitation, as long as it is not altered. Quotation in other works is freely allowed, as long as the source and author of the quote are stated.
-
-TABLE OF CONTENTS
-1. Introduction to the MoPaQ Format
-2. The MoPaQ Format
- 2.1 General Archive Layout
- 2.2 Archive Header
- 2.3 Block Table
- 2.4 Extended Block Table
- 2.5 Hash Table
- 2.6 File Data
- 2.7 Listfile
- 2.8 Extended Attributes
- 2.9 Weak (Old) Digital Signature
- 2.10 Strong (New) Digital Signature
-3. Algorithm Source Code
- 3.1 Encryption/Decryption
- 3.2 Hashing and File Key Computation
- 3.3 Finding Files
- 3.4 Deleting Files
- 3.5 Conversion of FILETIME and time_t
- 3.6 Forming a 64-bit Large Archive Offset from 32-bit and 16-bit Components
-4. Revision History
-
-1. INTRODUCTION TO THE MOPAQ FORMAT
-The MoPaQ (or MPQ) format is an archive file format designed by Mike O'Brien (hence the name Mike O'brien PaCK) at Blizzard Entertainment. The format has been used in all Blizzard games since (and including) Diablo. It is heavily optimized to be a read-only game archive format, and excels at this role.
-
-The Blizzard MoPaQ-reading functions are contained in the Storm module, which my be either statically or dynamically linked. The Blizzard MoPaQ-writing functions are contained in the MPQAPI module, which is always statically linked.
-
-StormLib - mentioned several times in this specification - is an open-source MoPaQ reading and writing library written by Ladislav Zezula (no affiliation with Blizzard Entertainment). While it's a bit dated, and does not support all of the newer MoPaQ features, it contains source code to the more exotic compression methods used by MoPaQ, such as the PKWare implode algorithm, MoPaQ's huffman compression algorithm, and the IMA ADPCM compression used by MoPaQ.
-
-2. THE MOPAQ FORMAT
-All numbers in the MoPaQ format are in little endian byte order; signed numbers use the two's complement system. Data types are listed either as int (integer, the number of bits specified), byte (8 bits), or char (bytes which contain ASCII characters). All sizes and offsets are in bytes, unless specified otherwise. Structure members are listed in the following general form:
-offset from the beginning of the structure: data type(array size) member name : member description
-
-2.1 GENERAL ARCHIVE LAYOUT
-- Archive Header
-- File Data
-- File Data - Special Files
-- Hash Table
-- Block Table
-- Extended Block Table
-- Strong Digital signature
-
-This is the usual archive format, but it is not mandatory. Some archives have been observed placing the hash table and file table after the archive header, and before the file data.
-
-2.2 ARCHIVE HEADER
-00h: char(4) Magic : Indicates that the file is a MoPaQ archive. Must be ASCII "MPQ" 1Ah.
-04h: int32 HeaderSize : Size of the archive header.
-08h: int32 ArchiveSize : Size of the whole archive, including the header. Does not include the strong digital signature, if present. This size is used, among other things, for determining the region to hash in computing the digital signature. This field is deprecated in the Burning Crusade MoPaQ format, and the size of the archive is calculated as the size from the beginning of the archive to the end of the hash table, block table, or extended block table (whichever is largest).
-0Ch: int16 FormatVersion : MoPaQ format version. MPQAPI will not open archives where this is negative. Known versions:
- 0000h: Original format. HeaderSize should be 20h, and large archives are not supported.
- 0001h: Burning Crusade format. Header size should be 2Ch, and large archives are supported.
-0Eh: int8 SectorSizeShift : Power of two exponent specifying the number of 512-byte disk sectors in each logical sector in the archive. The size of each logical sector in the archive is 512 * 2^SectorSizeShift. Bugs in the Storm library dictate that this should always be 3 (4096 byte sectors).
-10h: int32 HashTableOffset : Offset to the beginning of the hash table, relative to the beginning of the archive.
-14h: int32 BlockTableOffset : Offset to the beginning of the block table, relative to the beginning of the archive.
-18h: int32 HashTableEntries : Number of entries in the hash table. Must be a power of two, and must be less than 2^16 for the original MoPaQ format, or less than 2^20 for the Burning Crusade format.
-1Ch: int32 BlockTableEntries : Number of entries in the block table.
-Fields only present in the Burning Crusade format and later:
-20h: int64 ExtendedBlockTableOffset : Offset to the beginning of the extended block table, relative to the beginning of the archive.
-28h: int16 HashTableOffsetHigh : High 16 bits of the hash table offset for large archives.
-2Ah: int16 BlockTableOffsetHigh : High 16 bits of the block table offset for large archives.
-
-The archive header is the first structure in the archive, at archive offset 0; however, the archive does not need to be at offset 0 of the containing file. The offset of the archive in the file is referred to here as ArchiveOffset. If the archive is not at the beginning of the file, it must begin at a disk sector boundary (512 bytes). Early versions of Storm require that the archive be at the end of the containing file (ArchiveOffset + ArchiveSize = file size), but this is not required in newer versions (due to the strong digital signature not being considered a part of the archive).
-
-2.3 BLOCK TABLE
-The block table contains entries for each region in the archive. Regions may be either files, empty space, which may be overwritten by new files (typically this space is from deleted file data), or unused block table entries. Empty space entries should have BlockOffset and BlockSize nonzero, and FileSize and Flags zero; unused block table entries should have BlockSize, FileSize, and Flags zero. The block table is encrypted, using the hash of "(block table)" as the key. Each entry is structured as follows:
-
-00h: int32 BlockOffset : Offset of the beginning of the block, relative to the beginning of the archive.
-04h: int32 BlockSize : Size of the block in the archive.
-08h: int32 FileSize : Size of the file data stored in the block. Only valid if the block is a file; otherwise meaningless, and should be 0. If the file is compressed, this is the size of the uncompressed file data.
-0Ch: int32 Flags : Bit mask of the flags for the block. The following values are conclusively identified:
- 80000000h: Block is a file, and follows the file data format; otherwise, block is free space or unused. If the block is not a file, all other flags should be cleared, and FileSize should be 0.
- 01000000h: File is stored as a single unit, rather than split into sectors.
- 00020000h: The file's encryption key is adjusted by the block offset and file size (explained in detail in the File Data section). File must be encrypted.
- 00010000h: File is encrypted.
- 00000200h: File is compressed. File cannot be imploded.
- 00000100h: File is imploded. File cannot be compressed.
-
-2.4 EXTENDED BLOCK TABLE
-The extended block table was added to support archives larger than 4 gigabytes (2^32 bytes). The table contains the upper bits of the archive offsets for each block in the block table. It is simply an array of int16s, which become bits 32-47 of the archive offsets for each block, with bits 48-63 being zero. Individual blocks in the archive are still limited to 4 gigabytes in size. This table is only present in Burning Crusade format archives that exceed 4 gigabytes size.
-
-As of the Burning Crusade Friends and Family beta, this table is not encrypted.
-
-2.5 HASH TABLE
-Instead of storing file names, for quick access MoPaQs use a fixed, power of two-size hash table of files in the archive. A file is uniquely identified by its file path, its language, and its platform. The home entry for a file in the hash table is computed as a hash of the file path. In the event of a collision (the home entry is occupied by another file), progressive overflow is used, and the file is placed in the next available hash table entry. Searches for a desired file in the hash table proceed from the home entry for the file until either the file is found, the entire hash table is searched, or an empty hash table entry (FileBlockIndex of FFFFFFFFh) is encountered. The hash table is encrypted using the hash of "(hash table)" as the key. Each entry is structured as follows:
-
-00h: int32 FilePathHashA : The hash of the file path, using method A.
-04h: int32 FilePathHashB : The hash of the file path, using method B.
-08h: int16 Language : The language of the file. This is a Windows LANGID data type, and uses the same values. 0 indicates the default language (American English), or that the file is language-neutral.
-0Ah: int8 Platform : The platform the file is used for. 0 indicates the default platform. No other values have been observed.
-0Ch: int32 FileBlockIndex : If the hash table entry is valid, this is the index into the block table of the file. Otherwise, one of the following two values:
- FFFFFFFFh: Hash table entry is empty, and has always been empty. Terminates searches for a given file.
- FFFFFFFEh: Hash table entry is empty, but was valid at some point (in other words, the file was deleted). Does not terminate searches for a given file.
-
-2.6 FILE DATA
-The data for each file is composed of the following structure:
-00h: int32(SectorsInFile + 1) SectorOffsetTable : Offsets to the start of each sector, relative to the beginning of the file data. The last entry contains the file size, making it possible to easily calculate the size of any given sector. This table is not present if this information can be calculated (see details below).
-immediately following SectorOffsetTable: SECTOR Sectors(SectorsInFile) : Data of each sector in the file, packed end to end (see details below).
-
-Normally, file data is split up into sectors, for simple streaming. All sectors, save for the last, will contain as many bytes of file data as specified in the archive header's SectorSizeShift; the last sector may contain less than this, depending on the size of the entire file's data. If the file is compressed or imploded, the sector will be smaller or the same size as the file data it contains. Individual sectors in a compressed or imploded file may be stored uncompressed; this occurs if and only if the file data the sector contains could not be compressed by the algorithm(s) used (if the compressed sector size was greater than or equal to the size of the file data), and is indicated by the sector's size in SectorOffsetTable being equal to the size of the file data in the sector (which may be calculated from the FileSize).
-
-The format of each sector depends on the kind of sector it is. Uncompressed sectors are simply the the raw file data contained in the sector. Imploded sectors are the raw compressed data following compression with the implode algorithm (these sectors can only be in imploded files). Compressed sectors (only found in compressed - not imploded - files) are compressed with one or more compression algorithms, and have the following structure:
-00h: byte CompressionMask : Mask of the compression types applied to this sector. If multiple compression types are used, they are applied in the order listed below, and decompression is performed in the opposite order. This byte counts towards the total sector size, meaning that the sector will be stored uncompressed if the data cannot be compressed by at least two bytes; as well, this byte is encrypted with the sector data, if applicable. The following compression types are defined (for implementations of these algorithms, see StormLib):
- 40h: IMA ADPCM mono
- 80h: IMA ADPCM stereo
- 01h: Huffman encoded
- 02h: Deflated (see ZLib)
- 08h: Imploded (see PKWare Data Compression Library)
- 10h: BZip2 compressed (see BZip2)
-01h: byte(SectorSize - 1) SectorData : The compressed data for the sector.
-
-If the file is stored as a single unit (indicated in the file's Flags), there is effectively only a single sector, which contains the entire file data.
-
-If the file is encrypted, each sector (after compression/implosion, if applicable) is encrypted with the file's key. The base key for a file is determined by a hash of the file name stripped of the directory (i.e. the key for a file named "directory\file" would be computed as the hash of "file"). If this key is adjusted, as indicated in the file's Flags, the final key is calculated as ((base key + BlockOffset - ArchiveOffset) XOR FileSize) (StormLib incorrectly uses an AND in place of the XOR). Each sector is encrypted using the key + the 0-based index of the sector in the file. The SectorOffsetTable, if present, is encrypted using the key - 1.
-
-The SectorOffsetTable is omitted when the sizes and offsets of all sectors in the file are calculatable from the FileSize. This can happen in several circumstances. If the file is not compressed/imploded, then the size and offset of all sectors is known, based on the archive's SectorSizeShift. If the file is stored as a single unit compressed/imploded, then the SectorOffsetTable is omitted, as the single file "sector" corresponds to BlockSize and FileSize, as mentioned previously. However, the SectorOffsetTable will be present if the file is compressed/imploded and the file is not stored as a single unit, even if there is only a single sector in the file (the size of the file is less than or equal to the archive's sector size).
-
-2.7 LISTFILE
-The listfile is a very simple extension to the MoPaQ format that contains the file paths of (most) files in the archive. The languages and platforms of the files are not stored in the listfile. The listfile is contained in the file "(listfile)" (default language and platform), and is simply a text file with file paths separated by ';', 0Dh, 0Ah, or some combination of these. The file "(listfile)" may not be listed in the listfile.
-
-2.8 EXTENDED ATTRIBUTES
-The extended attributes are optional file attributes for files in the block table. These attributes were added at times after the MoPaQ format was already finalized, and it is not necessary for every archive to have all (or any) of the extended attributes. If an archive contains a given attribute, there will be an instance of that attribute for every block in the block table, although the attribute will be meaningless if the block is not a file. The order of the attributes for blocks correspond to the order of the blocks in the block table, and are of the same number. The attributes are stored in parallel arrays in the "(attributes)" file (default language and platform), in the archive. The attributes corresponding to this file need not be valid (and logically cannot be). Unlike all the other structures in the MoPaQ format, entries in the extended attributes are NOT guaranteed to be aligned. Also note that in some archives, malicious zeroing of the attributes has been observed, perhaps with the intent of breaking archive viewers. This file is structured as follows:
-
-00h: int32 Version : Specifies the extended attributes format version. For now, must be 100.
-04h: int32 AttributesPresent : Bit mask of the extended attributes present in the archive:
- 00000001h: File CRC32s.
- 00000002h: File timestamps.
- 00000004h: File MD5s.
-08h: int32(BlockTableEntries) CRC32s : CRC32s of the (uncompressed) file data for each block in the archive. Omitted if the archive does not have CRC32s.
-immediately after CRC32s: FILETIME(BlockTableEntries) Timestamps : Timestamps for each block in the archive. The format is that of the Windows FILETIME structure. Omitted if the archive does not have timestamps.
-immediately after Timestamps: MD5(BlockTableEntries) MD5s : MD5s of the (uncompressed) file data for each block in the archive. Omitted if the archive does not have MD5s.
-
-2.9 WEAK DIGITAL SIGNATURE
-The weak digital signature is a digital signature using Microsoft CryptoAPI. It is an implimentation of the RSASSA-PKCS1-v1_5 digital signature protocol, using the MD5 hashing algorithm and a 512-bit (weak) RSA key (for more information about this protocol, see the RSA Labs PKCS1 specification). The public key and exponent are stored in a resource in Storm, the private key is stored in a separate file, whose filename is passed to MPQAPI (the private key is not stored in MPQAPI). The signature is stored uncompressed, unencrypted in the file "(signature)" (default language and platform) in the archive. The archive is hashed from the beginning of the archive (ArchiveOffset in the containing file) to the end of the archive (the length indicated by ArchiveSize, or calculated in the Burning Crusade MoPaQ format); the signature file is added to the archive before signing, and the space occupied by the file is considered to be all binary 0s during signing/verification. This file is structured as follows:
-
-00h: int32 Unknown : Must be 0.
-04h: int32 Unknown : Must be 0.
-08h: int512 Signature : The digital signature. Like all other numbers in the MoPaQ format, this is stored in little-endian order. The structure of this, when decrypted, follows the RSASSA-PKCS1-v1_5 specification; this format is rather icky to work with (I wrote a program to verify this signature using nothing but an MD5 function and huge integer functions; it wasn't pleasant), and best left to an encryption library such as Cryto++.
-
-2.10 STRONG DIGITAL SIGNATURE
-The strong digital signature uses a simple proprietary implementation of RSA signing, using the SHA-1 hashing algorithm and a 2048-bit (strong) RSA key. The default public key and exponent are stored in Storm, but other keys may be used as well. The strong digital signature is stored immediately after the archive, in the containing file; the entire archive (ArchiveSize bytes, starting at ArchiveOffset in the containing file) is hashed as a single block. The signature has the following format:
-
-00h: char(4) Magic : Indicates the presence of a digital signature. Must be "NGIS" ("SIGN" backwards).
-04h: int2048 Signature : The digital signature, stored in little-endian format.
-
-When the Signature field is decrypted with the public key and exponent, and the resulting large integer is stored in little-endian order, it is structured as follows:
-
-00h: byte Padding : Must be 0Bh.
-01h: byte(235) Padding : Must be BBh.
-ECh: byte(20) SHA-1 : SHA-1 hash of the archive, in standard SHA-1 byte order.
-
-3. ALGORITHM SOURCE CODE
-All of the sample code here assumes little endian machine byte order, that the short type is 16 bits, that the long type is 32 bits, and that the long long type is 64 bits. Adjustments must be made if these assumptions are not correct on a given platform. All code not credited otherwise was written by myself in the writing of this specification.
-
-3.1 ENCRYPTION/DECRYPTION
-Based on code from StormLib.
-
-unsigned long dwCryptTable[0x500];
-
-// The encryption and hashing functions use a number table in their procedures. This table must be initialized before the functions are called the first time.
-void InitializeCryptTable()
-{
- unsigned long seed = 0x00100001;
- unsigned long index1 = 0;
- unsigned long index2 = 0;
- int i;
-
- for (index1 = 0; index1 < 0x100; index1++)
- {
- for (index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
- {
- unsigned long temp1, temp2;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp1 = (seed & 0xFFFF) << 0x10;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp2 = (seed & 0xFFFF);
-
- dwCryptTable[index2] = (temp1 | temp2);
- }
- }
-}
-
-void EncryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- assert(lpbyBuffer);
-
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEE;
- unsigned long ch;
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111) | (dwKey >> 0x0B);
- seed = *lpdwBuffer + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-void DecryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- assert(lpbyBuffer);
-
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEEL;
- unsigned long ch;
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111L) | (dwKey >> 0x0B);
- seed = ch + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-3.2 HASHING AND FILE KEY COMPUTATION
-These functions may have been derived from StormLib code at some point in the very distant past. It was so long ago that I don't remember for certain.
-
-// Different types of hashes to make with HashString
-#define MPQ_HASH_TABLE_OFFSET 0
-#define MPQ_HASH_NAME_A 1
-#define MPQ_HASH_NAME_B 2
-#define MPQ_HASH_FILE_KEY 3
-
-// Based on code from StormLib.
-unsigned long HashString(const char *lpszString, unsigned long dwHashType)
-{
- assert(lpszString);
- assert(dwHashType <= MPQ_HASH_FILE_KEY);
-
- unsigned long seed1 = 0x7FED7FEDL;
- unsigned long seed2 = 0xEEEEEEEEL;
- int ch;
-
- while (*lpszString != 0)
- {
- ch = toupper(*lpszString++);
-
- seed1 = dwCryptTable[(dwHashType * 0x100) + ch] ^ (seed1 + seed2);
- seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
- }
- return seed1;
-}
-
-#define BLOCK_OFFSET_ADJUSTED_KEY 0x00020000L
-
-unsigned long ComputeFileKey(const char *lpszFilePath, const BlockTableEntry &blockEntry, unsigned long nArchiveOffset)
-{
- assert(lpszFilePath);
-
- // Find the file name part of the path
- const char *lpszFileName = strrchr(lpszFilePath, '\\');
- if (lpszFileName)
- lpszFileName++; // Skip the \
- else
- lpszFileName = lpszFilePath;
-
- // Hash the name to get the base key
- unsigned long nFileKey = HashString(lpszFileName, MPQ_HASH_FILE_KEY);
-
- // Offset-adjust the key if necessary
- if (blockEntry.Flags & BLOCK_OFFSET_ADJUSTED_KEY)
- nFileKey = (nFileKey + blockEntry.BlockOffset) ^ blockEntry.FileSize;
-
- return nFileKey;
-}
-
-3.3 FINDING FILES
-
-#define MPQ_HASH_ENTRY_EMPTY 0xFFFFFFFFL
-#define MPQ_HASH_ENTRY_DELETED 0xFFFFFFFEL
-
-bool FindFileInHashTable(const HashTableEntry *lpHashTable, unsigned long nHashTableSize, const char *lpszFilePath, unsigned short nLang, unsigned char nPlatform, unsigned long &iFileHashEntry)
-{
- assert(lpHashTable);
- assert(nHashTableSize);
- assert(lpszFilePath);
-
- // Find the home entry in the hash table for the file
- unsigned long iInitEntry = HashString(lpszFilePath, MPQ_HASH_TABLE_OFFSET) & (nHashTableSize - 1);
-
- // Is there anything there at all?
- if (lpHashTable[iInitEntry].FileBlockIndex == MPQ_HASH_ENTRY_EMPTY)
- return false;
-
- // Compute the hashes to compare the hash table entry against
- unsigned long nNameHashA = HashString(lpszFilePath, MPQ_HASH_NAME_A),
- nNameHashB = HashString(lpszFilePath, MPQ_HASH_NAME_B),
- iCurEntry = iInitEntry;
-
- // Check each entry in the hash table till a termination point is reached
- do
- {
- if (lpHashTable[iCurEntry].FileBlockIndex != MPQ_HASH_ENTRY_DELETED)
- {
- if (lpHashTable[iCurEntry].FilePathHashA == nNameHashA
- && lpHashTable[iCurEntry].FilePathHashB == nNameHashB
- && lpHashTable[iCurEntry].Language == nLang
- && lpHashTable[iCurEntry].Platform == nPlatform)
- {
- iFileHashEntry = iCurEntry;
-
- return true;
- }
- }
-
- iCurEntry = (iCurEntry + 1) & (nHashTableSize - 1);
- } while (iCurEntry != iInitEntry && lpHashTable[iCurEntry].FileBlockIndex != MPQ_HASH_ENTRY_EMPTY);
-
- return false;
-}
-
-3.4 DELETING FILES
-
-bool DeleteFile(HashTableEntry *lpHashTable, unsigned long nHashTableSize, BlockTableEntry *lpBlockTable, const char *lpszFilePath, unsigned short nLang, unsigned char nPlatform)
-{
- assert(lpHashTable);
- assert(nHashTableSize);
- assert(lpBlockTable);
-
- // Find the file in the hash table
- unsigned long iFileHashEntry;
-
- if (!FindFileInHashTable(lpHashTable, nHashTableSize, lpszFilePath, nLang, nPlatform, iFileHashEntry))
- return false;
-
- // Get the block table index before we nuke the hash table entry
- unsigned long iFileBlockEntry = lpHashTable[iFileHashEntry].FileBlockIndex;
-
- // Delete the file's entry in the hash table
- memset(&lpHashTable[iFileHashEntry], 0xFF, sizeof(HashTableEntry));
-
- // If the next entry is empty, mark this one as empty; otherwise, mark this as deleted.
- if (lpHashTable[(iFileHashEntry + 1) & (nHashTableSize - 1)].FileBlockIndex == MPQ_HASH_ENTRY_EMPTY)
- lpHashTable[iFileHashEntry].FileBlockIndex = MPQ_HASH_ENTRY_EMPTY;
- else
- lpHashTable[iFileHashEntry].FileBlockIndex = MPQ_HASH_ENTRY_DELETED;
-
- // If the block occupies space, mark the block as free space; otherwise, clear the block table entry.
- if (lpBlockTable[iFileBlockEntry].BlockSize > 0)
- {
- lpBlockTable[iFileBlockEntry].FileSize = 0;
- lpBlockTable[iFileBlockEntry].Flags = 0;
- }
- else
- memset(&lpBlockTable[iFileBlockEntry], 0, sizeof(BlockTableEntry);
-
- return true;
-}
-
-3.5 CONVERSION OF FILETIME AND time_t
-This code assumes that the base ("zero") date for time_t is 01/01/1970. This is true on Windows, Unix System V systems, and Mac OS X. It is unknown whether this is true on all other platforms. You'll need to research this yourself, if you plan on porting it somewhere else.
-
-#define EPOCH_OFFSET 116444736000000000ULL // Number of 100 ns units between 01/01/1601 and 01/01/1970
-
-bool GetTimeFromFileTime(const FILETIME &fileTime, time_t &time)
-{
- // The FILETIME represents a 64-bit integer: the number of 100 ns units since January 1, 1601
- unsigned long long nTime = ((unsigned long long)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime;
-
- if (nTime < EPOCH_OFFSET)
- return false;
-
- nTime -= EPOCH_OFFSET; // Convert the time base from 01/01/1601 to 01/01/1970
- nTime /= 10000000ULL; // Convert 100 ns to sec
-
- time = (time_t)nTime;
-
- // Test for overflow (FILETIME is 64 bits, time_t is 32 bits)
- if ((nTime - (unsigned long long)time) > 0)
- return false;
-
- return true;
-}
-
-void GetFileTimeFromTime(const time_t &time, FILETIME &fileTime)
-{
- unsigned long long nTime = (unsigned long long)time;
-
- nTime *= 10000000ULL;
- nTime += EPOCH_OFFSET;
-
- fileTime.dwLowDateTime = (DWORD)nTime;
- fileTime.dwHighDateTime = (DWORD)(nTime >> 32);
-}
-
-3.6 FORMING A 64-BIT LARGE ARCHIVE OFFSET FROM 32-BIT AND 16-BIT COMPONENTS
-unsigned long long MakeLargeArchiveOffset(unsigned long nOffsetLow, unsigned short nOffsetHigh)
-{
- return ((unsigned long long)nOffsetHigh << 32) + (unsigned long long)nOffsetLow;
-}
-
-4. REVISION HISTORY
-1.0
- - Updated to include most of the changes found in the Burning Crusade Friends and Family beta
-
-0.91.
- - Updated several structure member descriptions
- - Listed the full set of characters that can separate list file entries
- - Noted that (attributes), (listfile), and (signature) use the default language and platform codes
- - Redid part of the file data specs to clarify the format of sectors
- - Enhanced descriptions of the different kinds of block table entries
- - Added ComputeFileKey, FindFileInHashTable, and DeleteFile source \ No newline at end of file
diff --git a/contrib/vmap_extractor_v2/stormlib/Makefile b/contrib/vmap_extractor_v2/stormlib/Makefile
deleted file mode 100644
index e3b19e36d6f..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-########################################################################
-#
-# Makefile for compiling StormLib under linux
-#
-# Author: Marko Friedemann <marko.friedemann@bmx-chemnitz.de>
-# Created at: Mon Jan 29 18:26:01 CEST 2001
-# Computer: whiplash.flachland-chemnitz.de
-# System: Linux 2.4.0 on i686
-#
-# Copyright (c) 2001 BMX-Chemnitz.DE All rights reserved.
-#
-########################################################################
-
-FILES.cpp = SCommon.cpp SCompression.cpp SFileCompactArchive.cpp \
- SFileCreateArchiveEx.cpp SFileExtractFile.cpp SFileFindFile.cpp \
- SListFile.cpp SFileOpenArchive.cpp SFileOpenFileEx.cpp SFileReadFile.cpp \
- StormPortLinux.cpp wave/wave.cpp huffman/huff.cpp \
- pklib/crc32.cpp pklib/explode.cpp pklib/implode.cpp
-FILES.o = $(FILES.cpp:.cpp=.o)
-
-LIB = libStorm.so
-
-CXX = g++
-CFLAGS = -Wall -s -D__SYS_ZLIB
-I_FLAGS =
-LDFLAGS = -lz -lbz2
-
-all: $(LIB)
-
-$(LIB): $(FILES.o)
- $(LD) -shared $(LDFLAGS) -o $(LIB) $(FILES.o)
-
-%.o: %.cpp
- $(CXX) $(CFLAGS) -c $< -o $@
-
-clean:
- $(RM) $(FILES.o) $(LIB)
-
-new: clean all
-
-mrproper: clean
- $(RM) Makefile.deps
-
-mrnew: mrproper new
-
-install: $(LIB)
- install $(I_FLAGS) $(LIB) /usr/local/lib
- mkdir -p /usr/local/include/StormLib
- cp Storm.h /usr/local/include/StormLib
- cp StormPort.h /usr/local/include/StormLib
- ldconfig
-
-deps:
- $(CXX) -MM $(CFLAGS) $(FILES.cpp) > Makefile.deps
-
--include Makefile.deps
-
-.PHONY: all clean new mrpoper mrnew install deps
diff --git a/contrib/vmap_extractor_v2/stormlib/bzip2/Makefile b/contrib/vmap_extractor_v2/stormlib/bzip2/Makefile
deleted file mode 100644
index eea329a626e..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/bzip2/Makefile
+++ /dev/null
@@ -1,205 +0,0 @@
-
-SHELL=/bin/sh
-
-# To assist in cross-compiling
-CC=gcc
-AR=ar
-RANLIB=ranlib
-LDFLAGS=
-
-BIGFILES=-D_FILE_OFFSET_BITS=64
-CFLAGS=-Wall -Winline -O -g $(BIGFILES)
-
-# Where you want it installed when you do 'make install'
-PREFIX=/usr
-
-
-OBJS= blocksort.o \
- huffman.o \
- crctable.o \
- randtable.o \
- compress.o \
- decompress.o \
- bzlib.o
-
-all: libbz2.a bzip2 bzip2recover test
-
-bzip2: libbz2.a bzip2.o
- $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
-
-bzip2recover: bzip2recover.o
- $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
-
-libbz2.a: $(OBJS)
- rm -f libbz2.a
- $(AR) cq libbz2.a $(OBJS)
- @if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \
- -f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \
- echo $(RANLIB) libbz2.a ; \
- $(RANLIB) libbz2.a ; \
- fi
-
-check: test
-test: bzip2
- @cat words1
- ./bzip2 -1 < sample1.ref > sample1.rb2
- ./bzip2 -2 < sample2.ref > sample2.rb2
- ./bzip2 -3 < sample3.ref > sample3.rb2
- ./bzip2 -d < sample1.bz2 > sample1.tst
- ./bzip2 -d < sample2.bz2 > sample2.tst
- ./bzip2 -ds < sample3.bz2 > sample3.tst
- cmp sample1.bz2 sample1.rb2
- cmp sample2.bz2 sample2.rb2
- cmp sample3.bz2 sample3.rb2
- cmp sample1.tst sample1.ref
- cmp sample2.tst sample2.ref
- cmp sample3.tst sample3.ref
- @cat words3
-
-install: bzip2 bzip2recover
- if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
- if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
- if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
- if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
- if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
- cp -f bzip2 $(PREFIX)/bin/bzip2
- cp -f bzip2 $(PREFIX)/bin/bunzip2
- cp -f bzip2 $(PREFIX)/bin/bzcat
- cp -f bzip2recover $(PREFIX)/bin/bzip2recover
- chmod a+x $(PREFIX)/bin/bzip2
- chmod a+x $(PREFIX)/bin/bunzip2
- chmod a+x $(PREFIX)/bin/bzcat
- chmod a+x $(PREFIX)/bin/bzip2recover
- cp -f bzip2.1 $(PREFIX)/man/man1
- chmod a+r $(PREFIX)/man/man1/bzip2.1
- cp -f bzlib.h $(PREFIX)/include
- chmod a+r $(PREFIX)/include/bzlib.h
- cp -f libbz2.a $(PREFIX)/lib
- chmod a+r $(PREFIX)/lib/libbz2.a
- cp -f bzgrep $(PREFIX)/bin/bzgrep
- ln $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep
- ln $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep
- chmod a+x $(PREFIX)/bin/bzgrep
- cp -f bzmore $(PREFIX)/bin/bzmore
- ln $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless
- chmod a+x $(PREFIX)/bin/bzmore
- cp -f bzdiff $(PREFIX)/bin/bzdiff
- ln $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp
- chmod a+x $(PREFIX)/bin/bzdiff
- cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1
- chmod a+r $(PREFIX)/man/man1/bzgrep.1
- chmod a+r $(PREFIX)/man/man1/bzmore.1
- chmod a+r $(PREFIX)/man/man1/bzdiff.1
- echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1
- echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1
- echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1
- echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
-
-clean:
- rm -f *.o libbz2.a bzip2 bzip2recover \
- sample1.rb2 sample2.rb2 sample3.rb2 \
- sample1.tst sample2.tst sample3.tst
-
-blocksort.o: blocksort.c
- @cat words0
- $(CC) $(CFLAGS) -c blocksort.c
-huffman.o: huffman.c
- $(CC) $(CFLAGS) -c huffman.c
-crctable.o: crctable.c
- $(CC) $(CFLAGS) -c crctable.c
-randtable.o: randtable.c
- $(CC) $(CFLAGS) -c randtable.c
-compress.o: compress.c
- $(CC) $(CFLAGS) -c compress.c
-decompress.o: decompress.c
- $(CC) $(CFLAGS) -c decompress.c
-bzlib.o: bzlib.c
- $(CC) $(CFLAGS) -c bzlib.c
-bzip2.o: bzip2.c
- $(CC) $(CFLAGS) -c bzip2.c
-bzip2recover.o: bzip2recover.c
- $(CC) $(CFLAGS) -c bzip2recover.c
-
-
-distclean: clean
- rm -f manual.ps manual.html manual.pdf
-
-DISTNAME=bzip2-1.0.3
-dist: check manual
- rm -f $(DISTNAME)
- ln -sf . $(DISTNAME)
- tar cvf $(DISTNAME).tar \
- $(DISTNAME)/blocksort.c \
- $(DISTNAME)/huffman.c \
- $(DISTNAME)/crctable.c \
- $(DISTNAME)/randtable.c \
- $(DISTNAME)/compress.c \
- $(DISTNAME)/decompress.c \
- $(DISTNAME)/bzlib.c \
- $(DISTNAME)/bzip2.c \
- $(DISTNAME)/bzip2recover.c \
- $(DISTNAME)/bzlib.h \
- $(DISTNAME)/bzlib_private.h \
- $(DISTNAME)/Makefile \
- $(DISTNAME)/LICENSE \
- $(DISTNAME)/bzip2.1 \
- $(DISTNAME)/bzip2.1.preformatted \
- $(DISTNAME)/bzip2.txt \
- $(DISTNAME)/words0 \
- $(DISTNAME)/words1 \
- $(DISTNAME)/words2 \
- $(DISTNAME)/words3 \
- $(DISTNAME)/sample1.ref \
- $(DISTNAME)/sample2.ref \
- $(DISTNAME)/sample3.ref \
- $(DISTNAME)/sample1.bz2 \
- $(DISTNAME)/sample2.bz2 \
- $(DISTNAME)/sample3.bz2 \
- $(DISTNAME)/dlltest.c \
- $(DISTNAME)/manual.html \
- $(DISTNAME)/manual.pdf \
- $(DISTNAME)/manual.ps \
- $(DISTNAME)/README \
- $(DISTNAME)/README.COMPILATION.PROBLEMS \
- $(DISTNAME)/README.XML.STUFF \
- $(DISTNAME)/CHANGES \
- $(DISTNAME)/libbz2.def \
- $(DISTNAME)/libbz2.dsp \
- $(DISTNAME)/dlltest.dsp \
- $(DISTNAME)/makefile.msc \
- $(DISTNAME)/Y2K_INFO \
- $(DISTNAME)/unzcrash.c \
- $(DISTNAME)/spewG.c \
- $(DISTNAME)/mk251.c \
- $(DISTNAME)/bzdiff \
- $(DISTNAME)/bzdiff.1 \
- $(DISTNAME)/bzmore \
- $(DISTNAME)/bzmore.1 \
- $(DISTNAME)/bzgrep \
- $(DISTNAME)/bzgrep.1 \
- $(DISTNAME)/Makefile-libbz2_so \
- $(DISTNAME)/bz-common.xsl \
- $(DISTNAME)/bz-fo.xsl \
- $(DISTNAME)/bz-html.xsl \
- $(DISTNAME)/bzip.css \
- $(DISTNAME)/entities.xml \
- $(DISTNAME)/manual.xml \
- $(DISTNAME)/format.pl \
- $(DISTNAME)/xmlproc.sh
- gzip -v $(DISTNAME).tar
-
-# For rebuilding the manual from sources on my SuSE 9.1 box
-
-MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \
- entities.xml manual.xml
-
-manual: manual.html manual.ps manual.pdf
-
-manual.ps: $(MANUAL_SRCS)
- ./xmlproc.sh -ps manual.xml
-
-manual.pdf: $(MANUAL_SRCS)
- ./xmlproc.sh -pdf manual.xml
-
-manual.html: $(MANUAL_SRCS)
- ./xmlproc.sh -html manual.xml
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile b/contrib/vmap_extractor_v2/stormlib/zlib/Makefile
deleted file mode 100644
index 531562b2ef1..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile
+++ /dev/null
@@ -1,175 +0,0 @@
-# Makefile for zlib
-# Copyright (C) 1995-2002 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h
-
-# To compile and test, type:
-# ./configure; make test
-# The call of configure is optional if you don't have special requirements
-# If you wish to build zlib as a shared library, use: ./configure -s
-
-# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
-# make install
-# To install in $HOME instead of /usr/local, use:
-# make install prefix=$HOME
-
-CC=cc
-
-CFLAGS=-O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-g -DDEBUG
-#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-# -Wstrict-prototypes -Wmissing-prototypes
-
-LDFLAGS=-L. -lz
-LDSHARED=$(CC)
-CPP=$(CC) -E
-
-VER=1.1.4
-LIBS=libz.a
-SHAREDLIB=libz.so
-
-AR=ar rc
-RANLIB=ranlib
-TAR=tar
-SHELL=/bin/sh
-
-prefix = /usr/local
-exec_prefix = ${prefix}
-libdir = ${exec_prefix}/lib
-includedir = ${prefix}/include
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
- zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-OBJA =
-# to use the asm code: make OBJA=match.o
-
-TEST_OBJS = example.o minigzip.o
-
-DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
- algorithm.txt zlib.3 zlib.html \
- msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
- nt/Make*[a-z0-9] nt/zlib.dnt amiga/Make*.??? os2/M*.os2 os2/zlib.def \
- contrib/RE*.contrib contrib/*.txt contrib/asm386/*.asm contrib/asm386/*.c \
- contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/asm[56]86/*.?86 \
- contrib/asm[56]86/*.S contrib/iostream/*.cpp \
- contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
- contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 \
- contrib/minizip/[CM]*[pe] contrib/minizip/*.[ch] contrib/minizip/*.[td]?? \
- contrib/delphi*/*.???
-
-all: example minigzip
-
-test: all
- @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
- echo hello world | ./minigzip | ./minigzip -d || \
- echo ' *** minigzip test FAILED ***' ; \
- if ./example; then \
- echo ' *** zlib test OK ***'; \
- else \
- echo ' *** zlib test FAILED ***'; \
- fi
-
-libz.a: $(OBJS) $(OBJA)
- $(AR) $@ $(OBJS) $(OBJA)
- -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
-
-match.o: match.S
- $(CPP) match.S > _match.s
- $(CC) -c _match.s
- mv _match.o match.o
- rm -f _match.s
-
-$(SHAREDLIB).$(VER): $(OBJS)
- $(LDSHARED) -o $@ $(OBJS)
- rm -f $(SHAREDLIB) $(SHAREDLIB).1
- ln -s $@ $(SHAREDLIB)
- ln -s $@ $(SHAREDLIB).1
-
-example: example.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
-
-minigzip: minigzip.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
-
-install: $(LIBS)
- -@if [ ! -d $(includedir) ]; then mkdir $(includedir); fi
- -@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi
- cp zlib.h zconf.h $(includedir)
- chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
- cp $(LIBS) $(libdir)
- cd $(libdir); chmod 755 $(LIBS)
- -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
- cd $(libdir); if test -f $(SHAREDLIB).$(VER); then \
- rm -f $(SHAREDLIB) $(SHAREDLIB).1; \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \
- (ldconfig || true) >/dev/null 2>&1; \
- fi
-# The ranlib in install is needed on NeXTSTEP which checks file times
-# ldconfig is for Linux
-
-uninstall:
- cd $(includedir); \
- v=$(VER); \
- if test -f zlib.h; then \
- v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`; \
- rm -f zlib.h zconf.h; \
- fi; \
- cd $(libdir); rm -f libz.a; \
- if test -f $(SHAREDLIB).$$v; then \
- rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \
- fi
-
-clean:
- rm -f *.o *~ example minigzip libz.a libz.so* foo.gz so_locations \
- _match.s maketree
-
-distclean: clean
-
-zip:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- zip -ul9 zlib$$v $(DISTFILES)
- mv Makefile~ Makefile
-
-dist:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- rm -f $$d.tar.gz; \
- if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
- files=""; \
- for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
- cd ..; \
- GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
- if test ! -d $$d; then rm -f $$d; fi
- mv Makefile~ Makefile
-
-tags:
- etags *.[ch]
-
-depend:
- makedepend -- $(CFLAGS) -- *.[ch]
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-adler32.o: zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: zlib.h zconf.h
-deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
-infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
-infcodes.o: zutil.h zlib.h zconf.h
-infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
-inffast.o: zutil.h zlib.h zconf.h inftrees.h
-inffast.o: infblock.h infcodes.h infutil.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h infblock.h
-inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-minigzip.o: zlib.h zconf.h
-trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in b/contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in
deleted file mode 100644
index 531562b2ef1..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in
+++ /dev/null
@@ -1,175 +0,0 @@
-# Makefile for zlib
-# Copyright (C) 1995-2002 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h
-
-# To compile and test, type:
-# ./configure; make test
-# The call of configure is optional if you don't have special requirements
-# If you wish to build zlib as a shared library, use: ./configure -s
-
-# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
-# make install
-# To install in $HOME instead of /usr/local, use:
-# make install prefix=$HOME
-
-CC=cc
-
-CFLAGS=-O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-g -DDEBUG
-#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-# -Wstrict-prototypes -Wmissing-prototypes
-
-LDFLAGS=-L. -lz
-LDSHARED=$(CC)
-CPP=$(CC) -E
-
-VER=1.1.4
-LIBS=libz.a
-SHAREDLIB=libz.so
-
-AR=ar rc
-RANLIB=ranlib
-TAR=tar
-SHELL=/bin/sh
-
-prefix = /usr/local
-exec_prefix = ${prefix}
-libdir = ${exec_prefix}/lib
-includedir = ${prefix}/include
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
- zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-OBJA =
-# to use the asm code: make OBJA=match.o
-
-TEST_OBJS = example.o minigzip.o
-
-DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
- algorithm.txt zlib.3 zlib.html \
- msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
- nt/Make*[a-z0-9] nt/zlib.dnt amiga/Make*.??? os2/M*.os2 os2/zlib.def \
- contrib/RE*.contrib contrib/*.txt contrib/asm386/*.asm contrib/asm386/*.c \
- contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/asm[56]86/*.?86 \
- contrib/asm[56]86/*.S contrib/iostream/*.cpp \
- contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
- contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 \
- contrib/minizip/[CM]*[pe] contrib/minizip/*.[ch] contrib/minizip/*.[td]?? \
- contrib/delphi*/*.???
-
-all: example minigzip
-
-test: all
- @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
- echo hello world | ./minigzip | ./minigzip -d || \
- echo ' *** minigzip test FAILED ***' ; \
- if ./example; then \
- echo ' *** zlib test OK ***'; \
- else \
- echo ' *** zlib test FAILED ***'; \
- fi
-
-libz.a: $(OBJS) $(OBJA)
- $(AR) $@ $(OBJS) $(OBJA)
- -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
-
-match.o: match.S
- $(CPP) match.S > _match.s
- $(CC) -c _match.s
- mv _match.o match.o
- rm -f _match.s
-
-$(SHAREDLIB).$(VER): $(OBJS)
- $(LDSHARED) -o $@ $(OBJS)
- rm -f $(SHAREDLIB) $(SHAREDLIB).1
- ln -s $@ $(SHAREDLIB)
- ln -s $@ $(SHAREDLIB).1
-
-example: example.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
-
-minigzip: minigzip.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
-
-install: $(LIBS)
- -@if [ ! -d $(includedir) ]; then mkdir $(includedir); fi
- -@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi
- cp zlib.h zconf.h $(includedir)
- chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
- cp $(LIBS) $(libdir)
- cd $(libdir); chmod 755 $(LIBS)
- -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
- cd $(libdir); if test -f $(SHAREDLIB).$(VER); then \
- rm -f $(SHAREDLIB) $(SHAREDLIB).1; \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \
- (ldconfig || true) >/dev/null 2>&1; \
- fi
-# The ranlib in install is needed on NeXTSTEP which checks file times
-# ldconfig is for Linux
-
-uninstall:
- cd $(includedir); \
- v=$(VER); \
- if test -f zlib.h; then \
- v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`; \
- rm -f zlib.h zconf.h; \
- fi; \
- cd $(libdir); rm -f libz.a; \
- if test -f $(SHAREDLIB).$$v; then \
- rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \
- fi
-
-clean:
- rm -f *.o *~ example minigzip libz.a libz.so* foo.gz so_locations \
- _match.s maketree
-
-distclean: clean
-
-zip:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- zip -ul9 zlib$$v $(DISTFILES)
- mv Makefile~ Makefile
-
-dist:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- rm -f $$d.tar.gz; \
- if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
- files=""; \
- for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
- cd ..; \
- GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
- if test ! -d $$d; then rm -f $$d; fi
- mv Makefile~ Makefile
-
-tags:
- etags *.[ch]
-
-depend:
- makedepend -- $(CFLAGS) -- *.[ch]
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-adler32.o: zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: zlib.h zconf.h
-deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
-infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
-infcodes.o: zutil.h zlib.h zconf.h
-infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
-inffast.o: zutil.h zlib.h zconf.h inftrees.h
-inffast.o: infblock.h infcodes.h infutil.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h infblock.h
-inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-minigzip.o: zlib.h zconf.h
-trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/configure b/contrib/vmap_extractor_v2/stormlib/zlib/configure
deleted file mode 100644
index e8942359bc1..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/configure
+++ /dev/null
@@ -1,212 +0,0 @@
-#!/bin/sh
-# configure script for zlib. This script is needed only if
-# you wish to build a shared library and your system supports them,
-# of if you need special compiler, flags or install directory.
-# Otherwise, you can just use directly "make test; make install"
-#
-# To create a shared library, use "configure --shared"; by default a static
-# library is created. If the primitive shared library support provided here
-# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz
-#
-# To impose specific compiler or flags or install directory, use for example:
-# prefix=$HOME CC=cc CFLAGS="-O4" ./configure
-# or for csh/tcsh users:
-# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
-# LDSHARED is the command to be used to create a shared library
-
-# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
-# If you have problems, try without defining CC and CFLAGS before reporting
-# an error.
-
-LIBS=libz.a
-SHAREDLIB=libz.so
-VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
-AR=${AR-"ar rc"}
-RANLIB=${RANLIB-"ranlib"}
-prefix=${prefix-/usr/local}
-exec_prefix=${exec_prefix-'${prefix}'}
-libdir=${libdir-'${exec_prefix}/lib'}
-includedir=${includedir-'${prefix}/include'}
-shared_ext='.so'
-shared=0
-gcc=0
-old_cc="$CC"
-old_cflags="$CFLAGS"
-
-while test $# -ge 1
-do
-case "$1" in
- -h* | --h*)
- echo 'usage:'
- echo ' configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]'
- echo ' [--libdir=LIBDIR] [--includedir=INCLUDEDIR]'
- exit 0;;
- -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;;
- -p* | --p*) prefix="$2"; shift; shift;;
- -e* | --e*) exec_prefix="$2"; shift; shift;;
- -l* | --l*) libdir="$2"; shift; shift;;
- -i* | --i*) includedir="$2"; shift; shift;;
- -s* | --s*) shared=1; shift;;
- esac
-done
-
-test=ztest$$
-cat > $test.c <<EOF
-extern int getchar();
-int hello() {return getchar();}
-EOF
-
-test -z "$CC" && echo Checking for gcc...
-cc=${CC-gcc}
-cflags=${CFLAGS-"-O3"}
-# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
-case "$cc" in
- *gcc*) gcc=1;;
-esac
-
-if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then
- CC="$cc"
- SFLAGS=${CFLAGS-"-fPIC -O3"}
- CFLAGS="$cflags"
- case `(uname -s || echo unknown) 2>/dev/null` in
- Linux | linux) LDSHARED=${LDSHARED-"gcc -shared -Wl,-soname,libz.so.1"};;
- *) LDSHARED=${LDSHARED-"gcc -shared"};;
- esac
-else
- # find system name and corresponding cc options
- CC=${CC-cc}
- case `(uname -sr || echo unknown) 2>/dev/null` in
- HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
- CFLAGS=${CFLAGS-"-O"}
-# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
- LDSHARED=${LDSHARED-"ld -b"}
- shared_ext='.sl'
- SHAREDLIB='libz.sl';;
- IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
- CFLAGS=${CFLAGS-"-ansi -O2"}
- LDSHARED=${LDSHARED-"cc -shared"};;
- OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
- CFLAGS=${CFLAGS-"-O -std1"}
- LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,$SHAREDLIB -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
- OSF1*) SFLAGS=${CFLAGS-"-O -std1"}
- CFLAGS=${CFLAGS-"-O -std1"}
- LDSHARED=${LDSHARED-"cc -shared"};;
- QNX*) SFLAGS=${CFLAGS-"-4 -O"}
- CFLAGS=${CFLAGS-"-4 -O"}
- LDSHARED=${LDSHARED-"cc"}
- RANLIB=${RANLIB-"true"}
- AR="cc -A";;
- SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
- CFLAGS=${CFLAGS-"-O3"}
- LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
- SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."}
- CFLAGS=${CFLAGS-"-fast -xcg89"}
- LDSHARED=${LDSHARED-"cc -G"};;
- SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
- CFLAGS=${CFLAGS-"-O2"}
- LDSHARED=${LDSHARED-"ld"};;
- UNIX_System_V\ 4.2.0)
- SFLAGS=${CFLAGS-"-KPIC -O"}
- CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
- UNIX_SV\ 4.2MP)
- SFLAGS=${CFLAGS-"-Kconform_pic -O"}
- CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
- # send working options for other systems to support@gzip.org
- *) SFLAGS=${CFLAGS-"-O"}
- CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -shared"};;
- esac
-fi
-
-if test $shared -eq 1; then
- echo Checking for shared library support...
- # we must test in two steps (cc then ld), required at least on SunOS 4.x
- if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" &&
- test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then
- CFLAGS="$SFLAGS"
- LIBS="$SHAREDLIB.$VER"
- echo Building shared library $SHAREDLIB.$VER with $CC.
- elif test -z "$old_cc" -a -z "$old_cflags"; then
- echo No shared library suppport.
- shared=0;
- else
- echo 'No shared library suppport; try without defining CC and CFLAGS'
- shared=0;
- fi
-fi
-if test $shared -eq 0; then
- LDSHARED="$CC"
- echo Building static library $LIBS version $VER with $CC.
-fi
-
-cat > $test.c <<EOF
-#include <unistd.h>
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- CFLAGS="$CFLAGS -DHAVE_UNISTD_H"
- echo "Checking for unistd.h... Yes."
-else
- echo "Checking for unistd.h... No."
-fi
-
-cat > $test.c <<EOF
-#include <errno.h>
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- echo "Checking for errno.h... Yes."
-else
- echo "Checking for errno.h... No."
- CFLAGS="$CFLAGS -DNO_ERRNO_H"
-fi
-
-cat > $test.c <<EOF
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-caddr_t hello() {
- return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0);
-}
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- CFLAGS="$CFLAGS -DUSE_MMAP"
- echo Checking for mmap support... Yes.
-else
- echo Checking for mmap support... No.
-fi
-
-CPP=${CPP-"$CC -E"}
-case $CFLAGS in
- *ASMV*)
- if test "`nm $test.o | grep _hello`" = ""; then
- CPP="$CPP -DNO_UNDERLINE"
- echo Checking for underline in external names... No.
- else
- echo Checking for underline in external names... Yes.
- fi;;
-esac
-
-rm -f $test.[co] $test$shared_ext
-
-# udpate Makefile
-sed < Makefile.in "
-/^CC *=/s%=.*%=$CC%
-/^CFLAGS *=/s%=.*%=$CFLAGS%
-/^CPP *=/s%=.*%=$CPP%
-/^LDSHARED *=/s%=.*%=$LDSHARED%
-/^LIBS *=/s%=.*%=$LIBS%
-/^SHAREDLIB *=/s%=.*%=$SHAREDLIB%
-/^AR *=/s%=.*%=$AR%
-/^RANLIB *=/s%=.*%=$RANLIB%
-/^VER *=/s%=.*%=$VER%
-/^prefix *=/s%=.*%=$prefix%
-/^exec_prefix *=/s%=.*%=$exec_prefix%
-/^libdir *=/s%=.*%=$libdir%
-/^includedir *=/s%=.*%=$includedir%
-" > Makefile
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile b/contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile
deleted file mode 100644
index a1dfc161437..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-CC=cc
-CFLAGS=-O -I../..
-
-UNZ_OBJS = miniunz.o unzip.o ../../libz.a
-ZIP_OBJS = minizip.o zip.o ../../libz.a
-
-.c.o:
- $(CC) -c $(CFLAGS) $*.c
-
-all: miniunz minizip
-
-miniunz: $(UNZ_OBJS)
- $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
-
-minizip: $(ZIP_OBJS)
- $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
-
-test: miniunz minizip
- ./minizip test readme.txt
- ./miniunz -l test.zip
- mv readme.txt readme.old
- ./miniunz test.zip
-
-clean:
- /bin/rm -f *.o *~ minizip miniunz
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile b/contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile
deleted file mode 100644
index 409b4bdeaae..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-CC=cc
-CFLAGS=-g
-
-untgz: untgz.o ../../libz.a
- $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
-
-untgz.o: untgz.c ../../zlib.h
- $(CC) $(CFLAGS) -c -I../.. untgz.c
-
-../../libz.a:
- cd ../..; make
-
-clean:
- rm -f untgz untgz.o *~
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp
index 2bf5e8b5200..e5106dca65a 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp
@@ -1,11 +1,7 @@
-//#include "common.h"
#include "model.h"
-//#include "world.h"
#include <cassert>
#include <algorithm>
-//int globalTime = 0;
-
Model::Model(std::string &filename) : filename(filename)
{
}
@@ -16,7 +12,7 @@ bool Model::open()
ok = !f.isEof();
- if (!ok)
+ if (!ok)
{
f.close();
printf("Error loading model %s\n", filename.c_str());
@@ -24,121 +20,31 @@ bool Model::open()
}
memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
- if(header.nBoundingTriangles > 0) {
-
-#if 0
- animated = isAnimated(f);
- if(animated)
- {
- f.close();
- return false;
- }
-#endif
- trans = 1.0f;
- origVertices = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
-
- vertices = new Vec3D[header.nVertices];
- normals = new Vec3D[header.nVertices];
-
- for (size_t i=0; i<header.nVertices; i++)
- {
- origVertices[i].pos = fixCoordSystem(origVertices[i].pos);
- origVertices[i].normal = fixCoordSystem(origVertices[i].normal);
- vertices[i] = origVertices[i].pos;
- normals[i] = origVertices[i].normal.normalize();
- }
-
- ModelView *view = (ModelView*)(f.getBuffer() + header.ofsViews);
-
- uint16 *indexLookup = (uint16*)(f.getBuffer() + view->ofsIndex);
- uint16 *triangles = (uint16*)(f.getBuffer() + view->ofsTris);
-
- nIndices = view->nTris;
- indices = new uint16[nIndices];
- for (size_t i = 0; i<nIndices; i++)
+ if(header.nBoundingTriangles > 0)
+ {
+ f.seek(0);
+ f.seekRelative(header.ofsBoundingVertices);
+ vertices = new Vec3D[header.nBoundingVertices];
+ f.read(vertices,header.nBoundingVertices*12);
+ for (uint32 i=0; i<header.nBoundingVertices; i++)
{
- indices[i] = indexLookup[triangles[i]];
+ vertices[i] = fixCoordSystem(vertices[i]);
}
+ f.seek(0);
+ f.seekRelative(header.ofsBoundingTriangles);
+ indices = new uint16[header.nBoundingTriangles];
+ f.read(indices,header.nBoundingTriangles*2);
f.close();
- } else {
+ }
+ else
+ {
//printf("not included %s\n", filename.c_str());
+ f.close();
return false;
}
return true;
-
}
-bool Model::isAnimated(MPQFile &f)
-{
- // see if we have any animated bones
- ModelBoneDef *bo = (ModelBoneDef*)(f.getBuffer() + header.ofsBones);
-
- animGeometry = false;
- animBones = false;
- ind = false;
-
- ModelVertex *verts = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
- for (size_t i=0; i<header.nVertices && !animGeometry; i++) {
- for (size_t b=0; b<4; b++) {
- if (verts[i].weights[b]>0) {
- ModelBoneDef &bb = bo[verts[i].bones[b]];
- if (bb.translation.type || bb.rotation.type || bb.scaling.type || (bb.flags&8)) {
- if (bb.flags&8) {
- // if we have billboarding, the model will need per-instance animation
- ind = true;
- }
- animGeometry = true;
- break;
- }
- }
- }
- }
-
- if (animGeometry) animBones = true;
- else {
- for (size_t i=0; i<header.nBones; i++) {
- ModelBoneDef &bb = bo[i];
- if (bb.translation.type || bb.rotation.type || bb.scaling.type) {
- animBones = true;
- break;
- }
- }
- }
-
- animTextures = header.nTexAnims > 0;
-
- bool animMisc = header.nCameras>0 || // why waste time, pretty much all models with cameras need animation
- header.nLights>0 || // same here
- header.nParticleEmitters>0 ||
- header.nRibbonEmitters>0;
-
- if (animMisc) animBones = true;
-
- // animated colors
- if (header.nColors) {
- ModelColorDef *cols = (ModelColorDef*)(f.getBuffer() + header.ofsColors);
- for (size_t i=0; i<header.nColors; i++) {
- if (cols[i].color.type!=0 || cols[i].opacity.type!=0) {
- animMisc = true;
- break;
- }
- }
- }
-
- // animated opacity
- if (header.nTransparency && !animMisc) {
- ModelTransDef *trs = (ModelTransDef*)(f.getBuffer() + header.ofsTransparency);
- for (size_t i=0; i<header.nTransparency; i++) {
- if (trs[i].trans.type!=0) {
- animMisc = true;
- break;
- }
- }
- }
-
- // guess not...
- return animGeometry || animTextures || animMisc;
-}
bool Model::ConvertToVMAPModel(char * outfilename)
{
@@ -151,7 +57,8 @@ bool Model::ConvertToVMAPModel(char * outfilename)
return false;
}
fwrite("VMAP002",8,1,output);
- int nVertices = header.nVertices;
+ uint32 nVertices = 0;
+ nVertices = header.nBoundingVertices;
fwrite(&nVertices, sizeof(int), 1, output);
uint32 nofgroups = 1;
fwrite(&nofgroups,sizeof(uint32), 1, output);
@@ -162,23 +69,24 @@ bool Model::ConvertToVMAPModel(char * outfilename)
wsize = sizeof(branches) + sizeof(uint32) * branches;
fwrite(&wsize, sizeof(int), 1, output);
fwrite(&branches,sizeof(branches), 1, output);
- uint32 nIdexes = (uint32) nIndices;
- fwrite(&nIndices,sizeof(uint32), 1, output);
+ uint32 nIndexes = 0;
+ nIndexes = header.nBoundingTriangles;
+ fwrite(&nIndexes,sizeof(uint32), 1, output);
fwrite("INDX",4, 1, output);
- wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
+ wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;
fwrite(&wsize, sizeof(int), 1, output);
- fwrite(&nIdexes, sizeof(uint32), 1, output);
- if(nIdexes >0)
+ fwrite(&nIndexes, sizeof(uint32), 1, output);
+ if(nIndexes >0)
{
- fwrite(indices, sizeof(unsigned short), nIdexes, output);
+ fwrite(indices, sizeof(unsigned short), nIndexes, output);
}
fwrite("VERT",4, 1, output);
wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
fwrite(&wsize, sizeof(int), 1, output);
fwrite(&nVertices, sizeof(int), 1, output);
- if(nVertices >0)
+ if(nVertices >0)
{
- for(int vpos=0; vpos <nVertices; ++vpos)
+ for(uint32 vpos=0; vpos <nVertices; ++vpos)
{
float sy = vertices[vpos].y;
vertices[vpos].y = vertices[vpos].z;
@@ -189,7 +97,6 @@ bool Model::ConvertToVMAPModel(char * outfilename)
delete[] vertices;
delete[] indices;
- delete[] normals;
fclose(output);
@@ -231,15 +138,15 @@ ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName,const char*Map
return;
}
fseek(input, 8, SEEK_SET); // get the correct no of vertices
- int nVertices;
- fread(&nVertices, sizeof (int), 1, input);
- fclose(input);
+ int nVertices;
+ fread(&nVertices, sizeof (int), 1, input);
+ fclose(input);
if(nVertices == 0)
{
return;
}
- if(pDirfile)
+ if(pDirfile)
{
int realx1 = (int) ((float) pos.x / 533.333333f);
int realy1 = (int) ((float) pos.z / 533.333333f);
@@ -256,7 +163,7 @@ ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName,const char*Map
nVertices,
realx1, realy1,
realx2, realy2
- );
+ );
}
}
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.h b/contrib/vmap_extractor_v2/vmapextract/model.h
index d655587bfab..4e1a37328f3 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.h
+++ b/contrib/vmap_extractor_v2/vmapextract/model.h
@@ -4,7 +4,6 @@
#include "vec3d.h"
#include "mpq.h"
#include "modelheaders.h"
-//#include "quaternion.h"
#include <vector>
class Model;
@@ -16,61 +15,45 @@ Vec3D fixCoordSystem(Vec3D v);
class Model
-{
+{
public:
- ModelHeader header;
- ModelAnimation *anims;
- int *globalSequences;
+ ModelHeader header;
+
public:
- bool animGeometry,animTextures,animBones;
- bool animated;
-
- bool isAnimated(MPQFile &f);
- ModelVertex *origVertices;
- Vec3D *vertices, *normals;
- uint16 *indices;
- size_t nIndices;
- bool open();
- bool ConvertToVMAPModel(char * outfilename);
+ uint32 offsBB_vertices, offsBB_indices;
+ Vec3D *BB_vertices, *vertices;
+ uint16 *BB_indices, *indices;
+ size_t nIndices;
+
+ bool open();
+ bool ConvertToVMAPModel(char * outfilename);
public:
- bool ok;
- bool ind;
-
- float rad;
- float trans;
- bool animcalc;
- int anim, animtime;
-
- Model(std::string &filename);
- ~Model();
+ bool ok;
+ Model(std::string &filename);
+ ~Model();
+
private:
- std::string filename;
- char outfilename;
+ std::string filename;
+ char outfilename;
};
-class ModelInstance
+class ModelInstance
{
public:
- Model *model;
-
- int id;
-
- Vec3D pos, rot;
- unsigned int d1, scale;
-
- float frot,w,sc;
+ Model *model;
- int light;
- Vec3D ldir;
- Vec3D lcol;
+ int id;
+ Vec3D pos, rot;
+ unsigned int d1, scale;
+ float w,sc;
- ModelInstance() {}
- ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile);
+ ModelInstance() {}
+ ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile);
};
diff --git a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
index 09dc24f14ab..30adf61801f 100644
--- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
+++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
@@ -11,293 +11,71 @@ typedef int int32;
#pragma pack(push,1)
struct ModelHeader {
- char id[4];
- uint8 version[4];
- uint32 nameLength;
- uint32 nameOfs;
- uint32 type;
-
- uint32 nGlobalSequences;
- uint32 ofsGlobalSequences;
- uint32 nAnimations;
- uint32 ofsAnimations;
- uint32 nC;
- uint32 ofsC;
- uint32 nD;
- uint32 ofsD;
+ char id[4];
+ uint8 version[4];
+ uint32 nameLength;
+ uint32 nameOfs;
+ uint32 type;
+ uint32 nGlobalSequences;
+ uint32 ofsGlobalSequences;
+ uint32 nAnimations;
+ uint32 ofsAnimations;
+ uint32 nAnimationLookup;
+ uint32 ofsAnimationLookup;
uint32 nBones;
uint32 ofsBones;
- uint32 nF;
- uint32 ofsF;
-
- uint32 nVertices;
- uint32 ofsVertices;
- uint32 nViews;
- uint32 ofsViews;
-
- uint32 nColors;
- uint32 ofsColors;
-
- uint32 nTextures;
- uint32 ofsTextures;
-
- uint32 nTransparency; // H
- uint32 ofsTransparency;
- uint32 nI; // always unused ?
- uint32 ofsI;
- uint32 nTexAnims; // J
- uint32 ofsTexAnims;
- uint32 nK;
- uint32 ofsK;
-
- uint32 nTexFlags;
- uint32 ofsTexFlags;
- uint32 nY;
- uint32 ofsY;
-
- uint32 nTexLookup;
- uint32 ofsTexLookup;
-
- uint32 nTexUnitLookup; // L
- uint32 ofsTexUnitLookup;
- uint32 nTransparencyLookup; // M
- uint32 ofsTransparencyLookup;
- uint32 nTexAnimLookup;
- uint32 ofsTexAnimLookup;
-
- float floats[14];
-
- uint32 nBoundingTriangles;
- uint32 ofsBoundingTriangles;
- uint32 nBoundingVertices;
- uint32 ofsBoundingVertices;
- uint32 nBoundingNormals;
- uint32 ofsBoundingNormals;
-
- uint32 nO;
- uint32 ofsO;
- uint32 nP;
- uint32 ofsP;
- uint32 nQ;
- uint32 ofsQ;
- uint32 nLights; // R
- uint32 ofsLights;
- uint32 nCameras; // S
- uint32 ofsCameras;
- uint32 nT;
- uint32 ofsT;
- uint32 nRibbonEmitters; // U
- uint32 ofsRibbonEmitters;
- uint32 nParticleEmitters; // V
- uint32 ofsParticleEmitters;
-
-};
-
-// block B - animations
-struct ModelAnimation {
- uint32 animID;
- uint32 timeStart;
- uint32 timeEnd;
-
- float moveSpeed;
-
- uint32 loopType;
- uint32 flags;
- uint32 d1;
- uint32 d2;
- uint32 playSpeed; // note: this can't be play speed because it's 0 for some models
-
- Vec3D boxA, boxB;
- float rad;
-
- int16 s[2];
-};
-
-
-// sub-block in block E - animation data
-struct AnimationBlock {
- int16 type; // interpolation type (0=none, 1=linear, 2=hermite)
- int16 seq; // global sequence id or -1
- uint32 nRanges;
- uint32 ofsRanges;
- uint32 nTimes;
- uint32 ofsTimes;
- uint32 nKeys;
- uint32 ofsKeys;
+ uint32 nKeyBoneLookup;
+ uint32 ofsKeyBoneLookup;
+ uint32 nVertices;
+ uint32 ofsVertices;
+ uint32 nViews;
+ uint32 nColors;
+ uint32 ofsColors;
+ uint32 nTextures;
+ uint32 ofsTextures;
+ uint32 nTransparency;
+ uint32 ofsTransparency;
+ uint32 nTextureanimations;
+ uint32 ofsTextureanimations;
+ uint32 nTexReplace;
+ uint32 ofsTexReplace;
+ uint32 nRenderFlags;
+ uint32 ofsRenderFlags;
+ uint32 nBoneLookupTable;
+ uint32 ofsBoneLookupTable;
+ uint32 nTexLookup;
+ uint32 ofsTexLookup;
+ uint32 nTexUnits;
+ uint32 ofsTexUnits;
+ uint32 nTransLookup;
+ uint32 ofsTransLookup;
+ uint32 nTexAnimLookup;
+ uint32 ofsTexAnimLookup;
+ float floats[14];
+ uint32 nBoundingTriangles;
+ uint32 ofsBoundingTriangles;
+ uint32 nBoundingVertices;
+ uint32 ofsBoundingVertices;
+ uint32 nBoundingNormals;
+ uint32 ofsBoundingNormals;
+ uint32 nAttachments;
+ uint32 ofsAttachments;
+ uint32 nAttachLookup;
+ uint32 ofsAttachLookup;
+ uint32 nAttachments_2;
+ uint32 ofsAttachments_2;
+ uint32 nLights;
+ uint32 ofsLights;
+ uint32 nCameras;
+ uint32 ofsCameras;
+ uint32 nCameraLookup;
+ uint32 ofsCameraLookup;
+ uint32 nRibbonEmitters;
+ uint32 ofsRibbonEmitters;
+ uint32 nParticleEmitters;
+ uint32 ofsParticleEmitters;
};
-// block E - bones
-struct ModelBoneDef {
- int32 animid;
- int32 flags;
- int16 parent; // parent bone index
- int16 geoid;
- // new int added to the bone definitions. Added in WoW 2.0
- int32 unknown;
- AnimationBlock translation;
- AnimationBlock rotation;
- AnimationBlock scaling;
- Vec3D pivot;
-};
-
-struct ModelTexAnimDef {
- AnimationBlock trans, rot, scale;
-};
-
-struct ModelVertex {
- Vec3D pos;
- uint8 weights[4];
- uint8 bones[4];
- Vec3D normal;
- Vec2D texcoords;
- int unk1, unk2; // always 0,0 so this is probably unused
-};
-
-struct ModelView {
- uint32 nIndex, ofsIndex; // Vertices in this model (index into vertices[])
- uint32 nTris, ofsTris; // indices
- uint32 nProps, ofsProps; // additional vtx properties
- uint32 nSub, ofsSub; // materials/renderops/submeshes
- uint32 nTex, ofsTex; // material properties/textures
- int32 lod; // LOD bias?
-};
-
-
-/// One material + render operation
-struct ModelGeoset {
- uint16 d1; // mesh part id?
- uint16 d2; // ?
- uint16 vstart; // first vertex
- uint16 vcount; // num vertices
- uint16 istart; // first index
- uint16 icount; // num indices
- uint16 d3; // number of bone indices
- uint16 d4; // offset into bone index list
- uint16 d5; // ?
- uint16 d6; // root bone?
- Vec3D v;
- float unknown[4]; // Added in WoW 2.0?
-};
-
-/// A texture unit (sub of material)
-struct ModelTexUnit{
- // probably the texture units
- // size always >=number of materials it seems
- uint16 flags; // Flags
- uint16 order; // ?
- uint16 op; // Material this texture is part of (index into mat)
- uint16 op2; // Always same as above?
- int16 colorIndex; // color or -1
- uint16 flagsIndex; // more flags...
- uint16 texunit; // Texture unit (0 or 1)
- uint16 d4; // ? (seems to be always 1)
- uint16 textureid; // Texture id (index into global texture list)
- uint16 texunit2; // copy of texture unit value?
- uint16 transid; // transparency id (index into transparency list)
- uint16 texanimid; // texture animation id
-};
-
-// block X - render flags
-struct ModelRenderFlags {
- uint16 flags;
- uint16 blend;
-};
-
-// block G - color defs
-struct ModelColorDef {
- AnimationBlock color;
- AnimationBlock opacity;
-};
-
-// block H - transp defs
-struct ModelTransDef {
- AnimationBlock trans;
-};
-
-struct ModelTextureDef {
- uint32 type;
- uint32 flags;
- uint32 nameLen;
- uint32 nameOfs;
-};
-
-struct ModelLightDef {
- int16 type;
- int16 bone;
- Vec3D pos;
- AnimationBlock ambColor;
- AnimationBlock ambIntensity;
- AnimationBlock color;
- AnimationBlock intensity;
- AnimationBlock attStart;
- AnimationBlock attEnd;
- AnimationBlock unk1;
-};
-
-struct ModelCameraDef {
- int32 id;
- float fov, farclip, nearclip;
- AnimationBlock transPos;
- Vec3D pos;
- AnimationBlock transTarget;
- Vec3D target;
- AnimationBlock rot;
-};
-
-
-struct ModelParticleParams {
- float mid;
- uint32 colors[3];
- float sizes[3];
- int16 d[10];
- float unk[3];
- float scales[3];
- float slowdown;
- float rotation;
- float f2[16];
-};
-
-struct ModelParticleEmitterDef {
- int32 id;
- int32 flags;
- Vec3D pos;
- int16 bone;
- int16 texture;
- int32 nZero1;
- int32 ofsZero1;
- int32 nZero2;
- int32 ofsZero2;
- int16 blend;
- int16 type;
- int16 s1;
- int16 s2;
- int16 cols;
- int16 rows;
- AnimationBlock params[10];
- ModelParticleParams p;
- AnimationBlock unk;
-};
-
-
-struct ModelRibbonEmitterDef {
- int32 id;
- int32 bone;
- Vec3D pos;
- int32 nTextures;
- int32 ofsTextures;
- int32 nUnknown;
- int32 ofsUnknown;
- AnimationBlock color;
- AnimationBlock opacity;
- AnimationBlock above;
- AnimationBlock below;
- float res, length, unk;
- int16 s1, s2;
- AnimationBlock unk1;
- AnimationBlock unk2;
-};
-
-
#pragma pack(pop)
diff --git a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
index cc16c9a7176..3dd58a4e3d5 100644
--- a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
@@ -421,6 +421,10 @@ bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
// open expansion and common files
printf("Opening data files from data directory.\n");
+ sprintf(path, "%slichking.mpq", input_path);
+ pArchiveNames.push_back(path);
+ sprintf(path, "%scommon-2.mpq", input_path);
+ pArchiveNames.push_back(path);
sprintf(path, "%sexpansion.mpq", input_path);
pArchiveNames.push_back(path);
sprintf(path, "%scommon.mpq", input_path);
@@ -432,6 +436,8 @@ bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
{
printf("Locale: %s\n", i->c_str());
+ sprintf(path, "%s%s\\lichking-locale-%s.mpq", input_path, i->c_str(), i->c_str());
+ pArchiveNames.push_back(path);
sprintf(path, "%s%s\\expansion-locale-%s.mpq", input_path, i->c_str(), i->c_str());
pArchiveNames.push_back(path);
sprintf(path, "%s%s\\locale-%s.mpq", input_path, i->c_str(), i->c_str());
diff --git a/dep/Makefile.am b/dep/Makefile.am
index f5829acd58f..481af87b9e4 100644
--- a/dep/Makefile.am
+++ b/dep/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/dep/include/Makefile.am b/dep/include/Makefile.am
index f9cda557ecb..2259d115d2d 100644
--- a/dep/include/Makefile.am
+++ b/dep/include/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,12 +9,12 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
@@ -62,6 +62,7 @@ EXTRA_DIST += \
mysql/config-os2.h \
mysql/config-win.h \
mysql/errmsg.h \
+ mysql/libmysqld.def \
mysql/Libmysql.def \
mysql/m_ctype.h \
mysql/m_string.h \
@@ -167,32 +168,31 @@ EXTRA_DIST += \
# Sockets header files for Win32 builds
EXTRA_DIST += \
- sockets/Base64.h \
- sockets/Exception.h \
- sockets/File.h \
- sockets/IFile.h \
- sockets/Ipv4Address.h \
- sockets/Ipv6Address.h \
- sockets/ISocketHandler.h \
- sockets/ListenSocket.h \
- sockets/Lock.h \
- sockets/Mutex.h \
- sockets/Parse.h \
- sockets/ResolvServer.h \
- sockets/ResolvSocket.h \
- sockets/SctpSocket.h \
- sockets/SocketAddress.h \
- sockets/Socket.h \
- sockets/SocketHandler.h \
- sockets/socket_include.h \
- sockets/sockets-config.h \
- sockets/StdLog.h \
- sockets/StdoutLog.h \
- sockets/StreamSocket.h \
- sockets/TcpSocket.h \
- sockets/Thread.h \
- sockets/UdpSocket.h \
- sockets/Utility.h
+ sockets\Base64.h \
+ sockets\CircularBuffer.h \
+ sockets\IFile.h \
+ sockets\Ipv4Address.h \
+ sockets\Ipv6Address.h \
+ sockets\ISocketHandler.h \
+ sockets\ListenSocket.h \
+ sockets\Mutex.h \
+ sockets\Parse.h \
+ sockets\RandomNumber.h \
+ sockets\ResolvServer.h \
+ sockets\ResolvSocket.h \
+ sockets\SctpSocket.h \
+ sockets\Socket.h \
+ sockets\socket_include.h \
+ sockets\SocketAddress.h \
+ sockets\SocketHandler.h \
+ sockets\sockets-config.h \
+ sockets\StdLog.h \
+ sockets\StdoutLog.h \
+ sockets\TcpSocket.h \
+ sockets\Thread.h \
+ sockets\UdpSocket.h \
+ sockets\Uid.h \
+ sockets\Utility.h
# VLD header files for Win32 builds
EXTRA_DIST += \
diff --git a/dep/include/mersennetwister/MersenneTwister.h b/dep/include/mersennetwister/MersenneTwister.h
index 708b675eed4..0fbd9242e45 100644
--- a/dep/include/mersennetwister/MersenneTwister.h
+++ b/dep/include/mersennetwister/MersenneTwister.h
@@ -238,7 +238,7 @@ inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength )
initialize(19650218UL);
register int i = 1;
register uint32 j = 0;
- register int k = ( N > seedLength ? N : seedLength );
+ register int k = ( N > int(seedLength) ? N : int(seedLength) );
for( ; k; --k )
{
state[i] =
diff --git a/dep/lib/Makefile.am b/dep/lib/Makefile.am
index f66fd207239..b762667b01e 100644
--- a/dep/lib/Makefile.am
+++ b/dep/lib/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,12 +9,12 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
@@ -42,13 +42,11 @@ EXTRA_DIST += \
x64_Debug/libeay32.dll \
x64_Debug/libeay32.lib \
x64_Debug/libmySQL.dll \
- x64_Debug/libmysql.lib
+ x64_Debug/libmySQL.lib
# Release libraries for Win64 builds.
EXTRA_DIST += \
x64_release/libeay32.dll \
x64_release/libeay32.lib \
x64_release/libmySQL.dll \
- x64_release/libmysql.lib
-
-
+ x64_release/libmySQL.lib
diff --git a/dep/src/Makefile.am b/dep/src/Makefile.am
index 88fa363a599..6ae2808895c 100644
--- a/dep/src/Makefile.am
+++ b/dep/src/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/dep/src/sockets/Makefile.am b/dep/src/sockets/Makefile.am
index 2a7f1123f58..5cd6eaf4307 100644
--- a/dep/src/sockets/Makefile.am
+++ b/dep/src/sockets/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/doc/Makefile.am b/doc/Makefile.am
index f7bc0a05071..66230b083b6 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/sql/Makefile.am b/sql/Makefile.am
index 93cc1474b1c..6cd08497aab 100644
--- a/sql/Makefile.am
+++ b/sql/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/sql/TBC-WLK converter/Readme.txt b/sql/TBC-WLK converter/Readme.txt
new file mode 100644
index 00000000000..85c81a5cd0c
--- /dev/null
+++ b/sql/TBC-WLK converter/Readme.txt
@@ -0,0 +1,8 @@
+Convert DB from 2.4.3 to 3.0.x:
+
+1. BACKUP your old db!
+2. Run TBC-WLK_characters.sql in "characters" database.
+3. Run TBC-WLK_world_run_only_once.sql in "world" database.
+4. Run TBC-WLK_world.sql in "world" database.
+
+After that you need to manually apply all sqls starting from 805_world_scripts.sql (in sql/updates) \ No newline at end of file
diff --git a/sql/TBC-WLK converter/TBC-WLK_characters.sql b/sql/TBC-WLK converter/TBC-WLK_characters.sql
new file mode 100644
index 00000000000..214c19fef14
--- /dev/null
+++ b/sql/TBC-WLK converter/TBC-WLK_characters.sql
@@ -0,0 +1,375 @@
+ALTER TABLE character_spell
+ DROP slot;
+DELETE FROM `character_spell` WHERE `spell` IN (28880, 59542, 59543, 59544, 59545, 59547, 59548);
+DELETE FROM `character_spell` WHERE `spell` IN (7376,3025,5419,5421,21156,7381,1178,21178,9635,21178,24905,5420,34123,33948,34090,34764,40121,40122);
+DELETE FROM character_spell WHERE `spell` IN (
+ 20580, /*old Shadowmeld*/
+ 20600, /*Perception*/
+ 21009, /*old Shadowmeld Passive and new Elusiveness (learned as racial passive)*/
+ 21184 /*old Seal of Righteousness*/
+);
+/*old Shadow Resistance, leaned as racial passive of race 5 */
+DELETE FROM character_spell USING character_spell INNER JOIN characters ON character_spell.guid = characters.guid
+WHERE character_spell.spell = 20579 AND characters.race <> 5;
+
+UPDATE IGNORE character_spell SET spell = 2018 WHERE spell = 2020;
+DELETE FROM character_spell WHERE spell = 2020;
+
+UPDATE IGNORE character_spell SET spell = 2018 WHERE spell = 2020;
+DELETE FROM character_spell WHERE spell = 2020;
+
+UPDATE IGNORE character_spell SET spell = 3100 WHERE spell = 2021;
+DELETE FROM character_spell WHERE spell = 2021;
+
+UPDATE IGNORE character_spell SET spell = 3104 WHERE spell = 2154;
+DELETE FROM character_spell WHERE spell = 2154;
+
+UPDATE IGNORE character_spell SET spell = 2108 WHERE spell = 2155;
+DELETE FROM character_spell WHERE spell = 2155;
+
+UPDATE IGNORE character_spell SET spell = 2259 WHERE spell = 2275;
+DELETE FROM character_spell WHERE spell = 2275;
+
+UPDATE IGNORE character_spell SET spell = 3101 WHERE spell = 2280;
+DELETE FROM character_spell WHERE spell = 2280;
+
+UPDATE IGNORE character_spell SET spell = 2366 WHERE spell = 2372;
+DELETE FROM character_spell WHERE spell = 2372;
+
+UPDATE IGNORE character_spell SET spell = 2368 WHERE spell = 2373;
+DELETE FROM character_spell WHERE spell = 2373;
+
+UPDATE IGNORE character_spell SET spell = 2550 WHERE spell = 2551;
+DELETE FROM character_spell WHERE spell = 2551;
+
+UPDATE IGNORE character_spell SET spell = 2575 WHERE spell = 2581;
+DELETE FROM character_spell WHERE spell = 2581;
+
+UPDATE IGNORE character_spell SET spell = 2576 WHERE spell = 2582;
+DELETE FROM character_spell WHERE spell = 2582;
+
+UPDATE IGNORE character_spell SET spell = 3273 WHERE spell = 3279;
+DELETE FROM character_spell WHERE spell = 3279;
+
+UPDATE IGNORE character_spell SET spell = 3274 WHERE spell = 3280;
+DELETE FROM character_spell WHERE spell = 3280;
+
+UPDATE IGNORE character_spell SET spell = 3102 WHERE spell = 3412;
+DELETE FROM character_spell WHERE spell = 3412;
+
+UPDATE IGNORE character_spell SET spell = 3464 WHERE spell = 3465;
+DELETE FROM character_spell WHERE spell = 3465;
+
+UPDATE IGNORE character_spell SET spell = 3538 WHERE spell = 3539;
+DELETE FROM character_spell WHERE spell = 3539;
+
+UPDATE IGNORE character_spell SET spell = 3564 WHERE spell = 3568;
+DELETE FROM character_spell WHERE spell = 3568;
+
+UPDATE IGNORE character_spell SET spell = 3570 WHERE spell = 3571;
+DELETE FROM character_spell WHERE spell = 3571;
+
+UPDATE IGNORE character_spell SET spell = 3811 WHERE spell = 3812;
+DELETE FROM character_spell WHERE spell = 3812;
+
+UPDATE IGNORE character_spell SET spell = 3908 WHERE spell = 3911;
+DELETE FROM character_spell WHERE spell = 3911;
+
+UPDATE IGNORE character_spell SET spell = 3909 WHERE spell = 3912;
+DELETE FROM character_spell WHERE spell = 3912;
+
+UPDATE IGNORE character_spell SET spell = 3910 WHERE spell = 3913;
+DELETE FROM character_spell WHERE spell = 3913;
+
+UPDATE IGNORE character_spell SET spell = 4036 WHERE spell = 4039;
+DELETE FROM character_spell WHERE spell = 4039;
+
+UPDATE IGNORE character_spell SET spell = 4037 WHERE spell = 4040;
+DELETE FROM character_spell WHERE spell = 4040;
+
+UPDATE IGNORE character_spell SET spell = 4038 WHERE spell = 4041;
+DELETE FROM character_spell WHERE spell = 4041;
+
+UPDATE IGNORE character_spell SET spell = 7620 WHERE spell = 7733;
+DELETE FROM character_spell WHERE spell = 7733;
+
+UPDATE IGNORE character_spell SET spell = 7731 WHERE spell = 7734;
+DELETE FROM character_spell WHERE spell = 7734;
+
+UPDATE IGNORE character_spell SET spell = 8613 WHERE spell = 8615;
+DELETE FROM character_spell WHERE spell = 8615;
+
+UPDATE IGNORE character_spell SET spell = 8617 WHERE spell = 8619;
+DELETE FROM character_spell WHERE spell = 8619;
+
+UPDATE IGNORE character_spell SET spell = 8618 WHERE spell = 8620;
+DELETE FROM character_spell WHERE spell = 8620;
+
+UPDATE IGNORE character_spell SET spell = 9785 WHERE spell = 9786;
+DELETE FROM character_spell WHERE spell = 9786;
+
+UPDATE IGNORE character_spell SET spell = 10248 WHERE spell = 10249;
+DELETE FROM character_spell WHERE spell = 10249;
+
+UPDATE IGNORE character_spell SET spell = 10662 WHERE spell = 10663;
+DELETE FROM character_spell WHERE spell = 10663;
+
+UPDATE IGNORE character_spell SET spell = 10768 WHERE spell = 10769;
+DELETE FROM character_spell WHERE spell = 10769;
+
+UPDATE IGNORE character_spell SET spell = 11611 WHERE spell = 11612;
+DELETE FROM character_spell WHERE spell = 11612;
+
+UPDATE IGNORE character_spell SET spell = 11993 WHERE spell = 11994;
+DELETE FROM character_spell WHERE spell = 11994;
+
+UPDATE IGNORE character_spell SET spell = 12180 WHERE spell = 12181;
+DELETE FROM character_spell WHERE spell = 12181;
+
+UPDATE IGNORE character_spell SET spell = 12656 WHERE spell = 12657;
+DELETE FROM character_spell WHERE spell = 12657;
+
+UPDATE IGNORE character_spell SET spell = 25229 WHERE spell = 25245;
+DELETE FROM character_spell WHERE spell = 25245;
+
+UPDATE IGNORE character_spell SET spell = 25230 WHERE spell = 25246;
+DELETE FROM character_spell WHERE spell = 25246;
+
+UPDATE IGNORE character_spell SET spell = 26790 WHERE spell = 26791;
+DELETE FROM character_spell WHERE spell = 26791;
+
+UPDATE IGNORE character_spell SET spell = 28596 WHERE spell = 28597;
+DELETE FROM character_spell WHERE spell = 28597;
+
+UPDATE IGNORE character_spell SET spell = 28695 WHERE spell = 28696;
+DELETE FROM character_spell WHERE spell = 28696;
+
+UPDATE IGNORE character_spell SET spell = 28894 WHERE spell = 28896;
+DELETE FROM character_spell WHERE spell = 28896;
+
+UPDATE IGNORE character_spell SET spell = 28895 WHERE spell = 28899;
+DELETE FROM character_spell WHERE spell = 28899;
+
+UPDATE IGNORE character_spell SET spell = 28897 WHERE spell = 28901;
+DELETE FROM character_spell WHERE spell = 28901;
+
+UPDATE IGNORE character_spell SET spell = 29354 WHERE spell = 29355;
+DELETE FROM character_spell WHERE spell = 29355;
+
+UPDATE IGNORE character_spell SET spell = 29844 WHERE spell = 29845;
+DELETE FROM character_spell WHERE spell = 29845;
+
+UPDATE IGNORE character_spell SET spell = 30350 WHERE spell = 30351;
+DELETE FROM character_spell WHERE spell = 30351;
+
+UPDATE IGNORE character_spell SET spell = 32549 WHERE spell = 32550;
+DELETE FROM character_spell WHERE spell = 32550;
+
+UPDATE IGNORE character_spell SET spell = 32678 WHERE spell = 32679;
+DELETE FROM character_spell WHERE spell = 32679;
+
+UPDATE IGNORE character_spell SET spell = 45357 WHERE spell = 45375;
+DELETE FROM character_spell WHERE spell = 45375;
+
+UPDATE IGNORE character_spell SET spell = 45358 WHERE spell = 45376;
+DELETE FROM character_spell WHERE spell = 45376;
+
+UPDATE IGNORE character_spell SET spell = 45359 WHERE spell = 45377;
+DELETE FROM character_spell WHERE spell = 45377;
+
+UPDATE IGNORE character_spell SET spell = 45360 WHERE spell = 45378;
+DELETE FROM character_spell WHERE spell = 45378;
+
+UPDATE IGNORE character_spell SET spell = 45361 WHERE spell = 45379;
+DELETE FROM character_spell WHERE spell = 45379;
+
+UPDATE IGNORE character_spell SET spell = 45363 WHERE spell = 45380;
+DELETE FROM character_spell WHERE spell = 45380;
+
+UPDATE IGNORE character_spell SET spell = 45542 WHERE spell = 50299;
+DELETE FROM character_spell WHERE spell = 50299;
+
+UPDATE IGNORE character_spell SET spell = 50305 WHERE spell = 50307;
+DELETE FROM character_spell WHERE spell = 50307;
+
+UPDATE IGNORE character_spell SET spell = 50310 WHERE spell = 50309;
+DELETE FROM character_spell WHERE spell = 50309;
+
+UPDATE IGNORE character_spell SET spell = 51294 WHERE spell = 51293;
+DELETE FROM character_spell WHERE spell = 51293;
+
+UPDATE IGNORE character_spell SET spell = 51296 WHERE spell = 51295;
+DELETE FROM character_spell WHERE spell = 51295;
+
+UPDATE IGNORE character_spell SET spell = 51300 WHERE spell = 51298;
+DELETE FROM character_spell WHERE spell = 51298;
+
+UPDATE IGNORE character_spell SET spell = 51302 WHERE spell = 51301;
+DELETE FROM character_spell WHERE spell = 51301;
+
+UPDATE IGNORE character_spell SET spell = 51304 WHERE spell = 51303;
+DELETE FROM character_spell WHERE spell = 51303;
+
+UPDATE IGNORE character_spell SET spell = 51306 WHERE spell = 51305;
+DELETE FROM character_spell WHERE spell = 51305;
+
+UPDATE IGNORE character_spell SET spell = 51309 WHERE spell = 51308;
+DELETE FROM character_spell WHERE spell = 51308;
+
+UPDATE IGNORE character_spell SET spell = 51311 WHERE spell = 51310;
+DELETE FROM character_spell WHERE spell = 51310;
+
+UPDATE IGNORE character_spell SET spell = 51313 WHERE spell = 51312;
+DELETE FROM character_spell WHERE spell = 51312;
+
+UPDATE IGNORE character_spell SET spell = 33095 WHERE spell = 54084;
+DELETE FROM character_spell WHERE spell = 54084;
+
+/* Warrior cleanup */
+DELETE FROM `character_spell` WHERE `spell` IN (1715,7372,7373); /* Hamstring old */
+DELETE FROM `character_spell` WHERE `spell` IN (72,17671,1672); /* Mortar Disturb old */
+DELETE FROM `character_spell` WHERE `spell` IN (7384,7887,11584,11586); /* Overpower old */
+DELETE FROM `character_spell` WHERE `spell`=23881; /* Bloodthirst old */
+DELETE FROM `character_spell` WHERE `spell` IN (6552,6554); /* Pummel old */
+DELETE FROM `character_spell` WHERE `spell` IN (694,7400,7402,20559,20560,25266); /* Mocking Blow old */
+/* Druid cleanup */
+DELETE FROM `character_spell` WHERE `spell`=22842; /* Frenzied Regeneration old */
+/* Hunter cleanup */
+DELETE FROM `character_spell` WHERE `spell`=14268; /* Wing Clip r1 old */
+DELETE FROM `character_spell` WHERE `spell`=14267; /* Wing Clip r2 old */
+/* Rogue */
+DELETE FROM `character_spell` WHERE `spell` IN (1766,1767,1768,1769,38768); /* Kick old */
+DELETE FROM `character_spell` WHERE `spell` IN (1776,1777,8629,11285,11286,38764);/* Gouge old */
+DELETE FROM `character_spell` WHERE `spell`=2842; /* Poisons old */
+
+/* Hunter's training spells for pets */
+DELETE FROM `character_spell` WHERE `spell` IN (2949,2975,2976,2977,2980,2981,2982,3666,3667,4630,6327,6359,6362,
+ 7370,7832,7833,7834,7835,7871,7872,7873,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,8318,8319,11764,
+ 11765,11768,11769,11772,11773,11776,11777,11781,11782,11783,11786,11787,17254,17262,17263,17264,17265,17266,
+ 17267,17268,17736,17753,17754,17755,17776,17855,17856,17857,17859,17860,19439,19444,19445,19446,19447,19481,
+ 19577,19648,19650,19661,19662,19663,19664,19737,19738,19739,20270,20312,20313,20314,20315,20316,20317,20318,
+ 20319,20320,20321,20322,20323,20324,20326,20327,20329,20377,20378,20379,20380,20381,20382,20383,20384,20385,
+ 20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,
+ 20404,20405,20406,20407,20408,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,23100,23111,23112,
+ 23146,23149,23150,24424,24440,24441,24451,24454,24455,24463,24464,24475,24476,24477,24580,24581,24582,24584,
+ 24588,24589,24599,24607,24608,24609,24641,26065,26094,26184,26185,26186,26189,26190,26202,27347,27348,27349,
+ 27361,27366,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27500,28343,
+ 33703,35299,35300,35302,35303,35304,35305,35306,35307,35308);
+DELETE FROM `character_spell` WHERE `spell` IN (1853,14922,14923,14924,14925,14926,14927,27344);
+DELETE FROM `character_spell` WHERE `spell` IN (27353,24516,24515,24514,24490);
+DELETE FROM `character_spell` WHERE `spell` IN (27354,24513,24512,24511,24494,2119);
+UPDATE IGNORE character_spell SET spell = 2108 WHERE spell = 3104;
+DELETE FROM character_spell WHERE spell = 3104;
+
+/* This cleanup character_action. This is like delete from character_action where type=0 and action not in character_spell for same player */
+DELETE FROM ca,cs USING `character_action` ca LEFT JOIN `character_spell` cs ON ca.`guid`=cs.`guid` AND ca.`action`=cs.`spell` WHERE ca.`type`=0 AND cs.`guid` IS NULL;
+
+ALTER TABLE `character_pet`
+ DROP COLUMN `trainpoint`,
+ DROP COLUMN `loyaltypoints`,
+ DROP COLUMN `loyalty`,
+ ADD `talentpoints` int(11) UNSIGNED default '0' NOT NULL after `Reactstate`;
+
+DROP TABLE IF EXISTS `account_data`;
+CREATE TABLE `account_data` (
+ `account` int(11) unsigned NOT NULL default '0',
+ `type` int(11) unsigned NOT NULL default '0',
+ `time` bigint(11) unsigned NOT NULL default '0',
+ `data` longtext NOT NULL,
+ PRIMARY KEY (`account`,`type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `character_achievement`;
+CREATE TABLE `character_achievement` (
+ `guid` int(11) NOT NULL,
+ `achievement` int(11) NOT NULL,
+ `date` int(11) NOT NULL,
+ PRIMARY KEY (`guid`,`achievement`)
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `character_achievement_progress`;
+CREATE TABLE `character_achievement_progress` (
+ `guid` int(11) NOT NULL,
+ `criteria` int(11) NOT NULL,
+ `counter` int(11) NOT NULL,
+ `date` int(11) NOT NULL,
+ PRIMARY KEY (`guid`,`criteria`)
+ ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- 3.x character converting...
+UPDATE characters SET data = REPLACE(data,' ',' ');
+UPDATE characters SET data = CONCAT(TRIM(data),' ');
+UPDATE characters SET data = CONCAT(
+ SUBSTRING(data, 1, length(SUBSTRING_INDEX(data, ' ', 10))), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 10))+2, length(SUBSTRING_INDEX(data, ' ', 18))- length(SUBSTRING_INDEX(data, ' ', 10)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 20))+2, length(SUBSTRING_INDEX(data, ' ', 22))- length(SUBSTRING_INDEX(data, ' ', 20)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 36))+2, length(SUBSTRING_INDEX(data, ' ', 37))- length(SUBSTRING_INDEX(data, ' ', 36)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 22))+2, length(SUBSTRING_INDEX(data, ' ', 28))- length(SUBSTRING_INDEX(data, ' ', 22)) - 1), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 28))+2, length(SUBSTRING_INDEX(data, ' ', 34))- length(SUBSTRING_INDEX(data, ' ', 28)) - 1), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1564))+2, length(SUBSTRING_INDEX(data, ' ', 1565))- length(SUBSTRING_INDEX(data, ' ', 1564)) - 1), " 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1565))+2, length(SUBSTRING_INDEX(data, ' ', 1566))- length(SUBSTRING_INDEX(data, ' ', 1565)) - 1), " 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 34))+2, length(SUBSTRING_INDEX(data, ' ', 36))- length(SUBSTRING_INDEX(data, ' ', 34)) - 1), " 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 46))+2, length(SUBSTRING_INDEX(data, ' ', 48))- length(SUBSTRING_INDEX(data, ' ', 46)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 146))+2, length(SUBSTRING_INDEX(data, ' ', 170))- length(SUBSTRING_INDEX(data, ' ', 146)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 171))+2, length(SUBSTRING_INDEX(data, ' ', 209))- length(SUBSTRING_INDEX(data, ' ', 171)) - 1), " ",
+ ((SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 209))+2, length(SUBSTRING_INDEX(data, ' ', 210))- length(SUBSTRING_INDEX(data, ' ', 209)) - 1) & ~0x100) | ((SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 46))+2, length(SUBSTRING_INDEX(data, ' ', 47))- length(SUBSTRING_INDEX(data, ' ', 46)) - 1) & 0x1000) >> 4)), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 210))+2, length(SUBSTRING_INDEX(data, ' ', 233))- length(SUBSTRING_INDEX(data, ' ', 210)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 233))+2, length(SUBSTRING_INDEX(data, ' ', 358))- length(SUBSTRING_INDEX(data, ' ', 233)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 358))+2, length(SUBSTRING_INDEX(data, ' ', 359))- length(SUBSTRING_INDEX(data, ' ', 358)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 359))+2, length(SUBSTRING_INDEX(data, ' ', 374))- length(SUBSTRING_INDEX(data, ' ', 359)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 374))+2, length(SUBSTRING_INDEX(data, ' ', 375))- length(SUBSTRING_INDEX(data, ' ', 374)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 375))+2, length(SUBSTRING_INDEX(data, ' ', 390))- length(SUBSTRING_INDEX(data, ' ', 375)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 390))+2, length(SUBSTRING_INDEX(data, ' ', 391))- length(SUBSTRING_INDEX(data, ' ', 390)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 391))+2, length(SUBSTRING_INDEX(data, ' ', 406))- length(SUBSTRING_INDEX(data, ' ', 391)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 406))+2, length(SUBSTRING_INDEX(data, ' ', 407))- length(SUBSTRING_INDEX(data, ' ', 406)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 407))+2, length(SUBSTRING_INDEX(data, ' ', 422))- length(SUBSTRING_INDEX(data, ' ', 407)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 422))+2, length(SUBSTRING_INDEX(data, ' ', 423))- length(SUBSTRING_INDEX(data, ' ', 422)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 423))+2, length(SUBSTRING_INDEX(data, ' ', 438))- length(SUBSTRING_INDEX(data, ' ', 423)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 438))+2, length(SUBSTRING_INDEX(data, ' ', 439))- length(SUBSTRING_INDEX(data, ' ', 438)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 439))+2, length(SUBSTRING_INDEX(data, ' ', 454))- length(SUBSTRING_INDEX(data, ' ', 439)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 454))+2, length(SUBSTRING_INDEX(data, ' ', 455))- length(SUBSTRING_INDEX(data, ' ', 454)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 455))+2, length(SUBSTRING_INDEX(data, ' ', 470))- length(SUBSTRING_INDEX(data, ' ', 455)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 470))+2, length(SUBSTRING_INDEX(data, ' ', 471))- length(SUBSTRING_INDEX(data, ' ', 470)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 471))+2, length(SUBSTRING_INDEX(data, ' ', 486))- length(SUBSTRING_INDEX(data, ' ', 471)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 486))+2, length(SUBSTRING_INDEX(data, ' ', 487))- length(SUBSTRING_INDEX(data, ' ', 486)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 487))+2, length(SUBSTRING_INDEX(data, ' ', 502))- length(SUBSTRING_INDEX(data, ' ', 487)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 502))+2, length(SUBSTRING_INDEX(data, ' ', 503))- length(SUBSTRING_INDEX(data, ' ', 502)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 503))+2, length(SUBSTRING_INDEX(data, ' ', 518))- length(SUBSTRING_INDEX(data, ' ', 503)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 518))+2, length(SUBSTRING_INDEX(data, ' ', 519))- length(SUBSTRING_INDEX(data, ' ', 518)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 519))+2, length(SUBSTRING_INDEX(data, ' ', 534))- length(SUBSTRING_INDEX(data, ' ', 519)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 534))+2, length(SUBSTRING_INDEX(data, ' ', 535))- length(SUBSTRING_INDEX(data, ' ', 534)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 535))+2, length(SUBSTRING_INDEX(data, ' ', 550))- length(SUBSTRING_INDEX(data, ' ', 535)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 550))+2, length(SUBSTRING_INDEX(data, ' ', 551))- length(SUBSTRING_INDEX(data, ' ', 550)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 551))+2, length(SUBSTRING_INDEX(data, ' ', 566))- length(SUBSTRING_INDEX(data, ' ', 551)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 566))+2, length(SUBSTRING_INDEX(data, ' ', 567))- length(SUBSTRING_INDEX(data, ' ', 566)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 567))+2, length(SUBSTRING_INDEX(data, ' ', 582))- length(SUBSTRING_INDEX(data, ' ', 567)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 582))+2, length(SUBSTRING_INDEX(data, ' ', 583))- length(SUBSTRING_INDEX(data, ' ', 582)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 583))+2, length(SUBSTRING_INDEX(data, ' ', 598))- length(SUBSTRING_INDEX(data, ' ', 583)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 598))+2, length(SUBSTRING_INDEX(data, ' ', 599))- length(SUBSTRING_INDEX(data, ' ', 598)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 599))+2, length(SUBSTRING_INDEX(data, ' ', 614))- length(SUBSTRING_INDEX(data, ' ', 599)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 614))+2, length(SUBSTRING_INDEX(data, ' ', 615))- length(SUBSTRING_INDEX(data, ' ', 614)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 615))+2, length(SUBSTRING_INDEX(data, ' ', 630))- length(SUBSTRING_INDEX(data, ' ', 615)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 630))+2, length(SUBSTRING_INDEX(data, ' ', 631))- length(SUBSTRING_INDEX(data, ' ', 630)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 631))+2, length(SUBSTRING_INDEX(data, ' ', 646))- length(SUBSTRING_INDEX(data, ' ', 631)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 646))+2, length(SUBSTRING_INDEX(data, ' ', 647))- length(SUBSTRING_INDEX(data, ' ', 646)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 647))+2, length(SUBSTRING_INDEX(data, ' ', 922))- length(SUBSTRING_INDEX(data, ' ', 647)) - 1),
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 922))+2, length(SUBSTRING_INDEX(data, ' ', 926))- length(SUBSTRING_INDEX(data, ' ', 922)) - 1), " 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 926))+2, length(SUBSTRING_INDEX(data, ' ', 1332))- length(SUBSTRING_INDEX(data, ' ', 926)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1332))+2, length(SUBSTRING_INDEX(data, ' ', 1544))- length(SUBSTRING_INDEX(data, ' ', 1332)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1544))+2, length(SUBSTRING_INDEX(data, ' ', 1564))- length(SUBSTRING_INDEX(data, ' ', 1544)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1566))+2, length(SUBSTRING_INDEX(data, ' ', 1592))- length(SUBSTRING_INDEX(data, ' ', 1566)) - 1),
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ")
+WHERE length(SUBSTRING_INDEX(data, ' ', 1592)) < length(data) and length(SUBSTRING_INDEX(data, ' ', 1593)) >= length(data);
+
+UPDATE item_instance SET data = REPLACE(data,' ',' ');
+UPDATE item_instance SET data = CONCAT(TRIM(data),' ');
+UPDATE item_instance SET data= CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',54),' ',-54),' 0 0 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',60),' ',-60+54),' 0 ')
+WHERE SUBSTRING_INDEX(data,' ',60) = data AND SUBSTRING_INDEX(data,' ',60-1) <> data;
+UPDATE item_instance SET data= CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',30),' ',-30),' 0 0 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',60),' ',-60+30),' 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',134),' ',-134+60))
+WHERE SUBSTRING_INDEX(data,' ',134) = data AND SUBSTRING_INDEX(data,' ',134-1) <> data; \ No newline at end of file
diff --git a/sql/TBC-WLK converter/TBC-WLK_world.sql b/sql/TBC-WLK converter/TBC-WLK_world.sql
new file mode 100644
index 00000000000..a2e3833c2e4
--- /dev/null
+++ b/sql/TBC-WLK converter/TBC-WLK_world.sql
@@ -0,0 +1,9136 @@
+-- battleground
+DELETE FROM `battleground_template` WHERE `id` IN (9,10,11);
+INSERT INTO `battleground_template` VALUES
+(9,0,0,0,0,1367,0,1368,0),
+(10,5,5,10,80,1362,0,1363,0),
+(11,5,5,10,80,1364,0,1365,0);
+
+-- command
+DELETE FROM `command` WHERE `name` = 'reload';
+DELETE FROM `command` WHERE `name` = 'modify runicpower';
+INSERT INTO `command` VALUES
+('modify runicpower',1,'Syntax: .modify runicpower #newrunicpower\r\n\r\nModify the runic power of the selected player. If no player is selected, modify your runic power.');
+-- string
+DELETE FROM `trinity_string` WHERE `entry` in (345,346);
+INSERT INTO `trinity_string` VALUES
+(345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM `trinity_string` WHERE `entry` in (712,717,718,719);
+INSERT INTO `trinity_string` VALUES
+(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(717,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(718,'|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(719,'|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM `trinity_string` WHERE `entry` in (720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736);
+INSERT INTO `trinity_string` VALUES
+(720,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(721,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(722,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(726,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(730,'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(731,'Someone in your party is Deserter. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(732,'Someone in your party is already in three battleground queues. You cannot join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(733,'You cannot teleport to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(734,'You cannot summon players to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(735,'You must be in GM mode to teleport to a player in a battleground.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(736,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM `trinity_string` WHERE `entry` IN (1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138);
+
+DELETE FROM `trinity_string` WHERE `entry` IN (173,174);
+INSERT INTO `trinity_string` VALUES
+(173,'You changed runic power of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(174,'%s changed your runic power to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM `trinity_string` WHERE `entry` IN (521,1109,1122);
+INSERT INTO `trinity_string` VALUES
+(521,'%d - |cffffffff|Hskill:%d|h[%s %s]|h|r %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1109,'%d - %s %s %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1122,'(%u/%u +perm %u +temp %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+-- data from mangos.sql
+-- playercreateinfo_action
+INSERT IGNORE INTO `playercreateinfo_action` (`race`, `class`, `button`, `action`, `type`, `misc`) VALUES
+(1, 1, 1, 78, 0, 0),
+(1, 1, 0, 6603, 0, 0),
+(1, 1, 11, 117, 128, 0),
+(1, 2, 2, 635, 0, 0),
+(1, 2, 0, 6603, 0, 0),
+(1, 2, 1, 21084, 0, 0),
+(1, 2, 10, 159, 128, 0),
+(1, 2, 11, 2070, 128, 0),
+(1, 4, 1, 1752, 0, 0),
+(1, 4, 2, 2098, 0, 0),
+(1, 4, 3, 2764, 0, 0),
+(1, 4, 0, 6603, 0, 0),
+(1, 4, 11, 2070, 128, 0),
+(1, 5, 1, 585, 0, 0),
+(1, 5, 2, 2050, 0, 0),
+(1, 5, 0, 6603, 0, 0),
+(1, 5, 10, 159, 128, 0),
+(1, 5, 11, 2070, 128, 0),
+(1, 6, 0, 6603, 0, 0),
+(1, 6, 1, 49576, 0, 0),
+(1, 6, 2, 45477, 0, 0),
+(1, 6, 3, 45462, 0, 0),
+(1, 6, 4, 45902, 0, 0),
+(1, 6, 5, 47541, 0, 0),
+(1, 6, 11, 59752, 0, 0),
+(1, 8, 1, 133, 0, 0),
+(1, 8, 2, 168, 0, 0),
+(1, 8, 0, 6603, 0, 0),
+(1, 8, 10, 159, 128, 0),
+(1, 8, 11, 2070, 128, 0),
+(1, 9, 1, 686, 0, 0),
+(1, 9, 2, 687, 0, 0),
+(1, 9, 0, 6603, 0, 0),
+(1, 9, 10, 159, 128, 0),
+(1, 9, 11, 4604, 128, 0),
+(2, 1, 1, 78, 0, 0),
+(2, 1, 0, 6603, 0, 0),
+(2, 1, 11, 117, 128, 0),
+(2, 3, 2, 75, 0, 0),
+(2, 3, 1, 2973, 0, 0),
+(2, 3, 0, 6603, 0, 0),
+(2, 3, 11, 117, 128, 0),
+(2, 3, 10, 159, 128, 0),
+(2, 4, 10, 0, 128, 0),
+(2, 4, 1, 1752, 0, 0),
+(2, 4, 2, 2098, 0, 0),
+(2, 4, 0, 6603, 0, 0),
+(2, 4, 11, 117, 128, 0),
+(2, 6, 0, 6603, 0, 0),
+(2, 6, 1, 49576, 0, 0),
+(2, 6, 2, 45477, 0, 0),
+(2, 6, 3, 45462, 0, 0),
+(2, 6, 4, 45902, 0, 0),
+(2, 6, 5, 47541, 0, 0),
+(2, 6, 10, 20572, 0, 0),
+(2, 7, 2, 331, 0, 0),
+(2, 7, 1, 403, 0, 0),
+(2, 7, 0, 6603, 0, 0),
+(2, 7, 11, 117, 128, 0),
+(2, 7, 10, 159, 128, 0),
+(2, 9, 1, 686, 0, 0),
+(2, 9, 2, 687, 0, 0),
+(2, 9, 0, 6603, 0, 0),
+(2, 9, 11, 117, 128, 0),
+(2, 9, 10, 159, 128, 0),
+(3, 1, 1, 78, 0, 0),
+(3, 1, 0, 6603, 0, 0),
+(3, 1, 11, 117, 128, 0),
+(3, 2, 2, 635, 0, 0),
+(3, 2, 0, 6603, 0, 0),
+(3, 2, 1, 21084, 0, 0),
+(3, 2, 10, 159, 128, 0),
+(3, 2, 11, 4540, 128, 0),
+(3, 3, 2, 75, 0, 0),
+(3, 3, 1, 2973, 0, 0),
+(3, 3, 0, 6603, 0, 0),
+(3, 3, 11, 117, 128, 0),
+(3, 3, 10, 159, 128, 0),
+(3, 4, 1, 1752, 0, 0),
+(3, 4, 2, 2098, 0, 0),
+(3, 4, 3, 2764, 0, 0),
+(3, 4, 0, 6603, 0, 0),
+(3, 4, 11, 4540, 128, 0),
+(3, 5, 1, 585, 0, 0),
+(3, 5, 2, 2050, 0, 0),
+(3, 5, 0, 6603, 0, 0),
+(3, 5, 10, 159, 128, 0),
+(3, 5, 11, 4540, 128, 0),
+(3, 6, 0, 6603, 0, 0),
+(3, 6, 1, 49576, 0, 0),
+(3, 6, 2, 45477, 0, 0),
+(3, 6, 3, 45462, 0, 0),
+(3, 6, 4, 45902, 0, 0),
+(3, 6, 5, 47541, 0, 0),
+(3, 6, 10, 2481, 0, 0),
+(4, 1, 1, 78, 0, 0),
+(4, 1, 0, 6603, 0, 0),
+(4, 1, 11, 117, 128, 0),
+(4, 3, 2, 75, 0, 0),
+(4, 3, 1, 2973, 0, 0),
+(4, 3, 0, 6603, 0, 0),
+(4, 3, 11, 117, 128, 0),
+(4, 3, 10, 159, 128, 0),
+(4, 4, 1, 1752, 0, 0),
+(4, 4, 2, 2098, 0, 0),
+(4, 4, 3, 2764, 0, 0),
+(4, 4, 0, 6603, 0, 0),
+(4, 4, 11, 4540, 128, 0),
+(4, 5, 1, 585, 0, 0),
+(4, 5, 2, 2050, 0, 0),
+(4, 5, 0, 6603, 0, 0),
+(4, 5, 10, 159, 128, 0),
+(4, 5, 11, 2070, 128, 0),
+(4, 6, 0, 6603, 0, 0),
+(4, 6, 1, 49576, 0, 0),
+(4, 6, 2, 45477, 0, 0),
+(4, 6, 3, 45462, 0, 0),
+(4, 6, 4, 45902, 0, 0),
+(4, 6, 5, 47541, 0, 0),
+(4, 6, 10, 58984, 0, 0),
+(4, 6, 83, 58984, 0, 0),
+(4, 11, 1, 5176, 0, 0),
+(4, 11, 2, 5185, 0, 0),
+(4, 11, 0, 6603, 0, 0),
+(4, 11, 10, 159, 128, 0),
+(4, 11, 11, 4536, 128, 0),
+(5, 1, 11, 4604, 128, 0),
+(5, 1, 0, 6603, 0, 0),
+(5, 1, 1, 78, 0, 0),
+(5, 4, 11, 4604, 128, 0),
+(5, 4, 3, 2764, 0, 0),
+(5, 4, 2, 2098, 0, 0),
+(5, 4, 1, 1752, 0, 0),
+(5, 4, 0, 6603, 0, 0),
+(5, 5, 10, 159, 128, 0),
+(5, 5, 2, 2050, 0, 0),
+(5, 5, 1, 585, 0, 0),
+(5, 5, 11, 4604, 128, 0),
+(5, 5, 0, 6603, 0, 0),
+(5, 6, 0, 6603, 0, 0),
+(5, 6, 1, 49576, 0, 0),
+(5, 6, 2, 45477, 0, 0),
+(5, 6, 3, 45462, 0, 0),
+(5, 6, 4, 45902, 0, 0),
+(5, 6, 5, 47541, 0, 0),
+(5, 6, 10, 20577, 0, 0),
+(5, 8, 11, 4604, 128, 0),
+(5, 8, 10, 159, 128, 0),
+(5, 8, 2, 168, 0, 0),
+(5, 8, 1, 133, 0, 0),
+(5, 8, 0, 6603, 0, 0),
+(5, 9, 1, 686, 0, 0),
+(5, 9, 10, 159, 128, 0),
+(5, 9, 2, 687, 0, 0),
+(5, 9, 11, 4604, 128, 0),
+(5, 9, 0, 6603, 0, 0),
+(6, 1, 1, 78, 0, 0),
+(6, 1, 2, 20549, 0, 0),
+(6, 1, 11, 4540, 128, 0),
+(6, 1, 0, 6603, 0, 0),
+(6, 3, 1, 2973, 0, 0),
+(6, 3, 10, 159, 128, 0),
+(6, 3, 2, 75, 0, 0),
+(6, 3, 3, 20549, 0, 0),
+(6, 3, 11, 117, 128, 0),
+(6, 3, 0, 6603, 0, 0),
+(6, 6, 0, 6603, 0, 0),
+(6, 6, 1, 49576, 0, 0),
+(6, 6, 2, 45477, 0, 0),
+(6, 6, 3, 45462, 0, 0),
+(6, 6, 4, 45902, 0, 0),
+(6, 6, 5, 47541, 0, 0),
+(6, 6, 10, 20549, 0, 0),
+(6, 6, 75, 20549, 0, 0),
+(6, 7, 1, 403, 0, 0),
+(6, 7, 10, 159, 128, 0),
+(6, 7, 2, 331, 0, 0),
+(6, 7, 3, 20549, 0, 0),
+(6, 7, 11, 4604, 128, 0),
+(6, 7, 0, 6603, 0, 0),
+(6, 11, 1, 5176, 0, 0),
+(6, 11, 10, 159, 128, 0),
+(6, 11, 2, 5185, 0, 0),
+(6, 11, 3, 20549, 0, 0),
+(6, 11, 11, 4536, 128, 0),
+(6, 11, 0, 6603, 0, 0),
+(7, 1, 11, 117, 128, 0),
+(7, 1, 1, 78, 0, 0),
+(7, 1, 0, 6603, 0, 0),
+(7, 4, 11, 117, 128, 0),
+(7, 4, 3, 2764, 0, 0),
+(7, 4, 1, 1752, 0, 0),
+(7, 4, 2, 2098, 0, 0),
+(7, 4, 0, 6603, 0, 0),
+(7, 6, 0, 6603, 0, 0),
+(7, 6, 1, 49576, 0, 0),
+(7, 6, 2, 45477, 0, 0),
+(7, 6, 3, 45462, 0, 0),
+(7, 6, 4, 45902, 0, 0),
+(7, 6, 5, 47541, 0, 0),
+(7, 6, 10, 20589, 0, 0),
+(7, 6, 72, 6603, 0, 0),
+(7, 6, 83, 117, 128, 0),
+(7, 6, 84, 6603, 0, 0),
+(7, 6, 96, 6603, 0, 0),
+(7, 6, 108, 6603, 0, 0),
+(7, 8, 11, 4536, 128, 0),
+(7, 8, 1, 133, 0, 0),
+(7, 8, 2, 168, 0, 0),
+(7, 8, 10, 159, 128, 0),
+(7, 8, 0, 6603, 0, 0),
+(7, 9, 11, 4604, 128, 0),
+(7, 9, 1, 686, 0, 0),
+(7, 9, 2, 687, 0, 0),
+(7, 9, 10, 159, 128, 0),
+(7, 9, 0, 6603, 0, 0),
+(8, 1, 11, 117, 128, 0),
+(8, 1, 1, 78, 0, 0),
+(8, 1, 3, 2764, 0, 0),
+(8, 1, 0, 6603, 0, 0),
+(8, 3, 10, 159, 128, 0),
+(8, 3, 11, 4604, 128, 0),
+(8, 3, 1, 2973, 0, 0),
+(8, 3, 2, 75, 0, 0),
+(8, 3, 0, 6603, 0, 0),
+(8, 4, 1, 1752, 0, 0),
+(8, 4, 3, 2764, 0, 0),
+(8, 4, 2, 2098, 0, 0),
+(8, 4, 11, 117, 128, 0),
+(8, 4, 0, 6603, 0, 0),
+(8, 5, 1, 585, 0, 0),
+(8, 5, 10, 159, 128, 0),
+(8, 5, 2, 2050, 0, 0),
+(8, 5, 11, 4540, 128, 0),
+(8, 5, 0, 6603, 0, 0),
+(8, 6, 0, 6603, 0, 0),
+(8, 6, 1, 49576, 0, 0),
+(8, 6, 2, 45477, 0, 0),
+(8, 6, 3, 45462, 0, 0),
+(8, 6, 4, 45902, 0, 0),
+(8, 6, 5, 47541, 0, 0),
+(8, 6, 10, 50621, 0, 0),
+(8, 7, 1, 403, 0, 0),
+(8, 7, 10, 159, 128, 0),
+(8, 7, 2, 331, 0, 0),
+(8, 7, 11, 117, 128, 0),
+(8, 7, 0, 6603, 0, 0),
+(8, 8, 1, 133, 0, 0),
+(8, 8, 10, 159, 128, 0),
+(8, 8, 2, 168, 0, 0),
+(8, 8, 11, 117, 128, 0),
+(8, 8, 0, 6603, 0, 0),
+(10, 2, 0, 6603, 0, 0),
+(10, 2, 1, 21084, 0, 0),
+(10, 2, 2, 635, 0, 0),
+(10, 2, 3, 28734, 0, 0),
+(10, 2, 4, 28730, 0, 0),
+(10, 2, 10, 159, 128, 0),
+(10, 2, 11, 20857, 128, 0),
+(10, 3, 0, 6603, 0, 0),
+(10, 3, 1, 2973, 0, 0),
+(10, 3, 2, 75, 0, 0),
+(10, 3, 3, 28734, 0, 0),
+(10, 3, 4, 28730, 0, 0),
+(10, 3, 10, 159, 128, 0),
+(10, 3, 11, 20857, 128, 0),
+(10, 4, 0, 6603, 0, 0),
+(10, 4, 1, 1752, 0, 0),
+(10, 4, 2, 2098, 0, 0),
+(10, 4, 3, 2764, 0, 0),
+(10, 4, 4, 28734, 0, 0),
+(10, 4, 5, 25046, 0, 0),
+(10, 4, 11, 20857, 128, 0),
+(10, 5, 0, 6603, 0, 0),
+(10, 5, 1, 585, 0, 0),
+(10, 5, 2, 2050, 0, 0),
+(10, 5, 3, 28734, 0, 0),
+(10, 5, 4, 28730, 0, 0),
+(10, 5, 10, 159, 128, 0),
+(10, 5, 11, 20857, 128, 0),
+(10, 6, 0, 6603, 0, 0),
+(10, 6, 1, 49576, 0, 0),
+(10, 6, 2, 45477, 0, 0),
+(10, 6, 3, 45462, 0, 0),
+(10, 6, 4, 45902, 0, 0),
+(10, 6, 5, 47541, 0, 0),
+(10, 6, 6, 50613, 0, 0),
+(10, 8, 0, 6603, 0, 0),
+(10, 8, 1, 133, 0, 0),
+(10, 8, 2, 168, 0, 0),
+(10, 8, 3, 28734, 0, 0),
+(10, 8, 4, 28730, 0, 0),
+(10, 8, 10, 159, 128, 0),
+(10, 8, 11, 20857, 128, 0),
+(10, 9, 11, 20857, 128, 0),
+(10, 9, 10, 159, 128, 0),
+(10, 9, 4, 28730, 0, 0),
+(10, 9, 3, 28734, 0, 0),
+(10, 9, 2, 687, 0, 0),
+(10, 9, 1, 686, 0, 0),
+(10, 9, 0, 6603, 0, 0),
+(11, 1, 0, 6603, 0, 0),
+(11, 1, 72, 6603, 0, 0),
+(11, 1, 73, 78, 0, 0),
+(11, 1, 74, 28880, 0, 0),
+(11, 1, 83, 4540, 128, 0),
+(11, 1, 84, 6603, 0, 0),
+(11, 1, 96, 6603, 0, 0),
+(11, 1, 108, 6603, 0, 0),
+(11, 2, 0, 6603, 0, 0),
+(11, 2, 1, 21084, 0, 0),
+(11, 2, 2, 635, 0, 0),
+(11, 2, 3, 59542, 0, 0),
+(11, 2, 10, 159, 128, 0),
+(11, 2, 11, 4540, 128, 0),
+(11, 2, 83, 4540, 128, 0),
+(11, 3, 0, 6603, 0, 0),
+(11, 3, 1, 2973, 0, 0),
+(11, 3, 2, 75, 0, 0),
+(11, 3, 3, 59543, 0, 0),
+(11, 3, 10, 159, 128, 0),
+(11, 3, 11, 4540, 128, 0),
+(11, 3, 72, 6603, 0, 0),
+(11, 3, 73, 2973, 0, 0),
+(11, 3, 74, 75, 0, 0),
+(11, 3, 82, 159, 128, 0),
+(11, 3, 83, 4540, 128, 0),
+(11, 5, 0, 6603, 0, 0),
+(11, 5, 1, 585, 0, 0),
+(11, 5, 2, 2050, 0, 0),
+(11, 5, 3, 59544, 0, 0),
+(11, 5, 10, 159, 128, 0),
+(11, 5, 11, 4540, 128, 0),
+(11, 5, 83, 4540, 128, 0),
+(11, 6, 0, 6603, 0, 0),
+(11, 6, 1, 49576, 0, 0),
+(11, 6, 2, 45477, 0, 0),
+(11, 6, 3, 45462, 0, 0),
+(11, 6, 4, 45902, 0, 0),
+(11, 6, 5, 47541, 0, 0),
+(11, 6, 6, 59545, 0, 0),
+(11, 7, 0, 6603, 0, 0),
+(11, 7, 1, 403, 0, 0),
+(11, 7, 2, 331, 0, 0),
+(11, 7, 3, 59547, 0, 0),
+(11, 7, 10, 159, 128, 0),
+(11, 7, 11, 4540, 128, 0),
+(11, 8, 0, 6603, 0, 0),
+(11, 8, 1, 133, 0, 0),
+(11, 8, 2, 168, 0, 0),
+(11, 8, 3, 59548, 0, 0),
+(11, 8, 10, 159, 128, 0),
+(11, 8, 11, 4540, 128, 0),
+(11, 8, 83, 4540, 128, 0);
+
+-- playercreateinfo_spell
+INSERT IGNORE INTO `playercreateinfo_spell` (`race`, `class`, `Spell`, `Note`) VALUES
+(1, 1, 78, 'Heroic Strike'),
+(1, 1, 81, 'Dodge'),
+(1, 1, 107, 'Block'),
+(1, 1, 196, 'One-Handed Axes'),
+(1, 1, 198, 'One-Handed Maces'),
+(1, 1, 201, 'One-Handed Swords'),
+(1, 1, 203, 'Unarmed'),
+(1, 1, 204, 'Defense'),
+(1, 1, 522, 'SPELLDEFENSE (DND)'),
+(1, 1, 668, 'Language Common'),
+(1, 1, 1843, 'Disarm'),
+(1, 1, 2382, 'Generic'),
+(1, 1, 2457, 'Battle Stance'),
+(1, 1, 2479, 'Honorless Target'),
+(1, 1, 3050, 'Detect'),
+(1, 1, 3365, 'Opening'),
+(1, 1, 5301, 'Defensive State (DND)'),
+(1, 1, 6233, 'Closing'),
+(1, 1, 6246, 'Closing'),
+(1, 1, 6247, 'Opening'),
+(1, 1, 6477, 'Opening'),
+(1, 1, 6478, 'Opening'),
+(1, 1, 6603, 'Attack'),
+(1, 1, 7266, 'Duel'),
+(1, 1, 7267, 'Grovel'),
+(1, 1, 7355, 'Stuck'),
+(1, 1, 8386, 'Attacking'),
+(1, 1, 8737, 'Mail'),
+(1, 1, 9077, 'Leather'),
+(1, 1, 9078, 'Cloth'),
+(1, 1, 9116, 'Shield'),
+(1, 1, 9125, 'Generic'),
+(1, 1, 20597, 'Sword Specialization'),
+(1, 1, 20598, 'The Human Spirit'),
+(1, 1, 20599, 'Diplomacy'),
+(1, 1, 20864, 'Mace Specialization'),
+(1, 1, 21651, 'Opening'),
+(1, 1, 21652, 'Closing'),
+(1, 1, 22027, 'Remove Insignia'),
+(1, 1, 22810, 'Opening - No Text'),
+(1, 1, 32215, 'Victorious State'),
+(1, 1, 45927, 'Summon Friend'),
+(1, 1, 58985, 'Perception'),
+(1, 1, 59752, 'Every Man for Himself'),
+(1, 1, 61437, 'Opening'),
+(1, 2, 81, 'Dodge'),
+(1, 2, 107, 'Block'),
+(1, 2, 198, 'One-Handed Maces'),
+(1, 2, 199, 'Two-Handed Maces'),
+(1, 2, 203, 'Unarmed'),
+(1, 2, 204, 'Defense'),
+(1, 2, 522, 'SPELLDEFENSE (DND)'),
+(1, 2, 635, 'Holy Light'),
+(1, 2, 668, 'Language Common'),
+(1, 2, 1843, 'Disarm'),
+(1, 2, 2382, 'Generic'),
+(1, 2, 2479, 'Honorless Target'),
+(1, 2, 3050, 'Detect'),
+(1, 2, 3365, 'Opening'),
+(1, 2, 6233, 'Closing'),
+(1, 2, 6246, 'Closing'),
+(1, 2, 6247, 'Opening'),
+(1, 2, 6477, 'Opening'),
+(1, 2, 6478, 'Opening'),
+(1, 2, 6603, 'Attack'),
+(1, 2, 7266, 'Duel'),
+(1, 2, 7267, 'Grovel'),
+(1, 2, 7355, 'Stuck'),
+(1, 2, 8386, 'Attacking'),
+(1, 2, 8737, 'Mail'),
+(1, 2, 9077, 'Leather'),
+(1, 2, 9078, 'Cloth'),
+(1, 2, 9116, 'Shield'),
+(1, 2, 9125, 'Generic'),
+(1, 2, 20154, 'Seal of Righteousness'),
+(1, 2, 20597, 'Sword Specialization'),
+(1, 2, 20598, 'The Human Spirit'),
+(1, 2, 20599, 'Diplomacy'),
+(1, 2, 20864, 'Mace Specialization'),
+(1, 2, 21651, 'Opening'),
+(1, 2, 21652, 'Closing'),
+(1, 2, 22027, 'Remove Insignia'),
+(1, 2, 22810, 'Opening - No Text'),
+(1, 2, 27762, 'Libram'),
+(1, 2, 45927, 'Summon Friend'),
+(1, 2, 58985, 'Perception'),
+(1, 2, 59752, 'Every Man for Himself'),
+(1, 2, 61437, 'Opening'),
+(1, 4, 81, 'Dodge'),
+(1, 4, 203, 'Unarmed'),
+(1, 4, 204, 'Defense'),
+(1, 4, 522, 'SPELLDEFENSE (DND)'),
+(1, 4, 668, 'Language Common'),
+(1, 4, 1180, 'Daggers'),
+(1, 4, 1752, 'Sinister Strike'),
+(1, 4, 1843, 'Disarm'),
+(1, 4, 2098, 'Eviscerate'),
+(1, 4, 2382, 'Generic'),
+(1, 4, 2479, 'Honorless Target'),
+(1, 4, 2567, 'Thrown'),
+(1, 4, 2764, 'Throw'),
+(1, 4, 3050, 'Detect'),
+(1, 4, 3365, 'Opening'),
+(1, 4, 6233, 'Closing'),
+(1, 4, 6246, 'Closing'),
+(1, 4, 6247, 'Opening'),
+(1, 4, 6477, 'Opening'),
+(1, 4, 6478, 'Opening'),
+(1, 4, 6603, 'Attack'),
+(1, 4, 7266, 'Duel'),
+(1, 4, 7267, 'Grovel'),
+(1, 4, 7355, 'Stuck'),
+(1, 4, 8386, 'Attacking'),
+(1, 4, 9077, 'Leather'),
+(1, 4, 9078, 'Cloth'),
+(1, 4, 9125, 'Generic'),
+(1, 4, 16092, 'Defensive State (DND)'),
+(1, 4, 20597, 'Sword Specialization'),
+(1, 4, 20598, 'The Human Spirit'),
+(1, 4, 20599, 'Diplomacy'),
+(1, 4, 20864, 'Mace Specialization'),
+(1, 4, 21184, 'Rogue Passive (DND)'),
+(1, 4, 21651, 'Opening'),
+(1, 4, 21652, 'Closing'),
+(1, 4, 22027, 'Remove Insignia'),
+(1, 4, 22810, 'Opening - No Text'),
+(1, 4, 45927, 'Summon Friend'),
+(1, 4, 58985, 'Perception'),
+(1, 4, 59752, 'Every Man for Himself'),
+(1, 4, 61437, 'Opening'),
+(1, 5, 81, 'Dodge'),
+(1, 5, 198, 'One-Handed Maces'),
+(1, 5, 203, 'Unarmed'),
+(1, 5, 204, 'Defense'),
+(1, 5, 522, 'SPELLDEFENSE (DND)'),
+(1, 5, 585, 'Smite'),
+(1, 5, 668, 'Language Common'),
+(1, 5, 1843, 'Disarm'),
+(1, 5, 2050, 'Lesser Heal'),
+(1, 5, 2382, 'Generic'),
+(1, 5, 2479, 'Honorless Target'),
+(1, 5, 3050, 'Detect'),
+(1, 5, 3365, 'Opening'),
+(1, 5, 5009, 'Wands'),
+(1, 5, 5019, 'Shoot'),
+(1, 5, 6233, 'Closing'),
+(1, 5, 6246, 'Closing'),
+(1, 5, 6247, 'Opening'),
+(1, 5, 6477, 'Opening'),
+(1, 5, 6478, 'Opening'),
+(1, 5, 6603, 'Attack'),
+(1, 5, 7266, 'Duel'),
+(1, 5, 7267, 'Grovel'),
+(1, 5, 7355, 'Stuck'),
+(1, 5, 8386, 'Attacking'),
+(1, 5, 9078, 'Cloth'),
+(1, 5, 9125, 'Generic'),
+(1, 5, 20597, 'Sword Specialization'),
+(1, 5, 20598, 'The Human Spirit'),
+(1, 5, 20599, 'Diplomacy'),
+(1, 5, 20864, 'Mace Specialization'),
+(1, 5, 21651, 'Opening'),
+(1, 5, 21652, 'Closing'),
+(1, 5, 22027, 'Remove Insignia'),
+(1, 5, 22810, 'Opening - No Text'),
+(1, 5, 45927, 'Summon Friend'),
+(1, 5, 58985, 'Perception'),
+(1, 5, 59752, 'Every Man for Himself'),
+(1, 5, 61437, 'Opening'),
+(1, 6, 81, 'Dodge'),
+(1, 6, 196, 'One-Handed Axes'),
+(1, 6, 197, 'Two-Handed Axes'),
+(1, 6, 200, 'Polearms'),
+(1, 6, 201, 'One-Handed Swords'),
+(1, 6, 202, 'Two-Handed Swords'),
+(1, 6, 203, 'Unarmed'),
+(1, 6, 204, 'Defense'),
+(1, 6, 522, 'SPELLDEFENSE (DND)'),
+(1, 6, 668, 'Language Common'),
+(1, 6, 674, 'Dual Wield'),
+(1, 6, 750, 'Plate Mail'),
+(1, 6, 1843, 'Disarm'),
+(1, 6, 2382, 'Generic'),
+(1, 6, 2479, 'Honorless Target'),
+(1, 6, 3050, 'Detect'),
+(1, 6, 3127, 'Parry'),
+(1, 6, 3275, 'Linen Bandage'),
+(1, 6, 3276, 'Heavy Linen Bandage'),
+(1, 6, 3277, 'Wool Bandage'),
+(1, 6, 3278, 'Heavy Wool Bandage'),
+(1, 6, 3365, 'Opening'),
+(1, 6, 6233, 'Closing'),
+(1, 6, 6246, 'Closing'),
+(1, 6, 6247, 'Opening'),
+(1, 6, 6477, 'Opening'),
+(1, 6, 6478, 'Opening'),
+(1, 6, 6603, 'Attack'),
+(1, 6, 7266, 'Duel'),
+(1, 6, 7267, 'Grovel'),
+(1, 6, 7355, 'Stuck'),
+(1, 6, 7928, 'Silk Bandage'),
+(1, 6, 7929, 'Heavy Silk Bandage'),
+(1, 6, 7934, 'Anti-Venom'),
+(1, 6, 8386, 'Attacking'),
+(1, 6, 8737, 'Mail'),
+(1, 6, 9077, 'Leather'),
+(1, 6, 9078, 'Cloth'),
+(1, 6, 9125, 'Generic'),
+(1, 6, 10840, 'Mageweave Bandage'),
+(1, 6, 10841, 'Heavy Mageweave Bandage'),
+(1, 6, 10846, 'First Aid'),
+(1, 6, 18629, 'Runecloth Bandage'),
+(1, 6, 18630, 'Heavy Runecloth Bandage'),
+(1, 6, 20597, 'Sword Specialization'),
+(1, 6, 20598, 'The Human Spirit'),
+(1, 6, 20599, 'Diplomacy'),
+(1, 6, 20864, 'Mace Specialization'),
+(1, 6, 21651, 'Opening'),
+(1, 6, 21652, 'Closing'),
+(1, 6, 22027, 'Remove Insignia'),
+(1, 6, 22810, 'Opening - No Text'),
+(1, 6, 33391, 'Journeyman Riding'),
+(1, 6, 45462, 'Plague Strike'),
+(1, 6, 45477, 'Icy Touch'),
+(1, 6, 45902, 'Blood Strike'),
+(1, 6, 45903, 'Offensive State (DND)'),
+(1, 6, 45927, 'Summon Friend'),
+(1, 6, 47541, 'Death Coil'),
+(1, 6, 48266, 'Blood Presence'),
+(1, 6, 49410, 'Forceful Deflection'),
+(1, 6, 49576, 'Death Grip'),
+(1, 6, 52665, 'Sigil'),
+(1, 6, 58985, 'Perception'),
+(1, 6, 59752, 'Every Man for Himself'),
+(1, 6, 59879, 'Blood Plague'),
+(1, 6, 59921, 'Frost Fever'),
+(1, 6, 61437, 'Opening'),
+(1, 6, 61455, 'Runic Focus'),
+(1, 8, 81, 'Dodge'),
+(1, 8, 133, 'Fireball'),
+(1, 8, 168, 'Frost Armor'),
+(1, 8, 203, 'Unarmed'),
+(1, 8, 204, 'Defense'),
+(1, 8, 227, 'Staves'),
+(1, 8, 522, 'SPELLDEFENSE (DND)'),
+(1, 8, 668, 'Language Common'),
+(1, 8, 1843, 'Disarm'),
+(1, 8, 2382, 'Generic'),
+(1, 8, 2479, 'Honorless Target'),
+(1, 8, 3050, 'Detect'),
+(1, 8, 3365, 'Opening'),
+(1, 8, 5009, 'Wands'),
+(1, 8, 5019, 'Shoot'),
+(1, 8, 6233, 'Closing'),
+(1, 8, 6246, 'Closing'),
+(1, 8, 6247, 'Opening'),
+(1, 8, 6477, 'Opening'),
+(1, 8, 6478, 'Opening'),
+(1, 8, 6603, 'Attack'),
+(1, 8, 7266, 'Duel'),
+(1, 8, 7267, 'Grovel'),
+(1, 8, 7355, 'Stuck'),
+(1, 8, 8386, 'Attacking'),
+(1, 8, 9078, 'Cloth'),
+(1, 8, 9125, 'Generic'),
+(1, 8, 20597, 'Sword Specialization'),
+(1, 8, 20598, 'The Human Spirit'),
+(1, 8, 20599, 'Diplomacy'),
+(1, 8, 20864, 'Mace Specialization'),
+(1, 8, 21651, 'Opening'),
+(1, 8, 21652, 'Closing'),
+(1, 8, 22027, 'Remove Insignia'),
+(1, 8, 22810, 'Opening - No Text'),
+(1, 8, 45927, 'Summon Friend'),
+(1, 8, 58985, 'Perception'),
+(1, 8, 59752, 'Every Man for Himself'),
+(1, 8, 61437, 'Opening'),
+(1, 9, 81, 'Dodge'),
+(1, 9, 203, 'Unarmed'),
+(1, 9, 204, 'Defense'),
+(1, 9, 522, 'SPELLDEFENSE (DND)'),
+(1, 9, 668, 'Language Common'),
+(1, 9, 686, 'Shadow Bolt'),
+(1, 9, 687, 'Demon Skin'),
+(1, 9, 1180, 'Daggers'),
+(1, 9, 1843, 'Disarm'),
+(1, 9, 2382, 'Generic'),
+(1, 9, 2479, 'Honorless Target'),
+(1, 9, 3050, 'Detect'),
+(1, 9, 3365, 'Opening'),
+(1, 9, 5009, 'Wands'),
+(1, 9, 5019, 'Shoot'),
+(1, 9, 6233, 'Closing'),
+(1, 9, 6246, 'Closing'),
+(1, 9, 6247, 'Opening'),
+(1, 9, 6477, 'Opening'),
+(1, 9, 6478, 'Opening'),
+(1, 9, 6603, 'Attack'),
+(1, 9, 7266, 'Duel'),
+(1, 9, 7267, 'Grovel'),
+(1, 9, 7355, 'Stuck'),
+(1, 9, 8386, 'Attacking'),
+(1, 9, 9078, 'Cloth'),
+(1, 9, 9125, 'Generic'),
+(1, 9, 20597, 'Sword Specialization'),
+(1, 9, 20598, 'The Human Spirit'),
+(1, 9, 20599, 'Diplomacy'),
+(1, 9, 20864, 'Mace Specialization'),
+(1, 9, 21651, 'Opening'),
+(1, 9, 21652, 'Closing'),
+(1, 9, 22027, 'Remove Insignia'),
+(1, 9, 22810, 'Opening - No Text'),
+(1, 9, 45927, 'Summon Friend'),
+(1, 9, 58284, 'Chaos Bolt Passive'),
+(1, 9, 58985, 'Perception'),
+(1, 9, 59752, 'Every Man for Himself'),
+(1, 9, 61437, 'Opening'),
+(2, 1, 78, 'Heroic Strike'),
+(2, 1, 81, 'Dodge'),
+(2, 1, 107, 'Block'),
+(2, 1, 196, 'One-Handed Axes'),
+(2, 1, 197, 'Two-Handed Axes'),
+(2, 1, 201, 'One-Handed Swords'),
+(2, 1, 203, 'Unarmed'),
+(2, 1, 204, 'Defense'),
+(2, 1, 522, 'SPELLDEFENSE (DND)'),
+(2, 1, 669, 'Language Orcish'),
+(2, 1, 1843, 'Disarm'),
+(2, 1, 2382, 'Generic'),
+(2, 1, 2457, 'Battle Stance'),
+(2, 1, 2479, 'Honorless Target'),
+(2, 1, 3050, 'Detect'),
+(2, 1, 3365, 'Opening'),
+(2, 1, 5301, 'Defensive State (DND)'),
+(2, 1, 6233, 'Closing'),
+(2, 1, 6246, 'Closing'),
+(2, 1, 6247, 'Opening'),
+(2, 1, 6477, 'Opening'),
+(2, 1, 6478, 'Opening'),
+(2, 1, 6603, 'Attack'),
+(2, 1, 7266, 'Duel'),
+(2, 1, 7267, 'Grovel'),
+(2, 1, 7355, 'Stuck'),
+(2, 1, 8386, 'Attacking'),
+(2, 1, 8737, 'Mail'),
+(2, 1, 9077, 'Leather'),
+(2, 1, 9078, 'Cloth'),
+(2, 1, 9116, 'Shield'),
+(2, 1, 9125, 'Generic'),
+(2, 1, 20572, 'Blood Fury'),
+(2, 1, 20573, 'Hardiness'),
+(2, 1, 20574, 'Axe Specialization'),
+(2, 1, 21563, 'Command'),
+(2, 1, 21651, 'Opening'),
+(2, 1, 21652, 'Closing'),
+(2, 1, 22027, 'Remove Insignia'),
+(2, 1, 22810, 'Opening - No Text'),
+(2, 1, 32215, 'Victorious State'),
+(2, 1, 45927, 'Summon Friend'),
+(2, 1, 61437, 'Opening'),
+(2, 3, 75, 'Auto Shot'),
+(2, 3, 81, 'Dodge'),
+(2, 3, 196, 'One-Handed Axes'),
+(2, 3, 203, 'Unarmed'),
+(2, 3, 204, 'Defense'),
+(2, 3, 264, 'Bows'),
+(2, 3, 522, 'SPELLDEFENSE (DND)'),
+(2, 3, 669, 'Language Orcish'),
+(2, 3, 1843, 'Disarm'),
+(2, 3, 2382, 'Generic'),
+(2, 3, 2479, 'Honorless Target'),
+(2, 3, 2973, 'Raptor Strike'),
+(2, 3, 3050, 'Detect'),
+(2, 3, 3365, 'Opening'),
+(2, 3, 6233, 'Closing'),
+(2, 3, 6246, 'Closing'),
+(2, 3, 6247, 'Opening'),
+(2, 3, 6477, 'Opening'),
+(2, 3, 6478, 'Opening'),
+(2, 3, 6603, 'Attack'),
+(2, 3, 7266, 'Duel'),
+(2, 3, 7267, 'Grovel'),
+(2, 3, 7355, 'Stuck'),
+(2, 3, 8386, 'Attacking'),
+(2, 3, 9077, 'Leather'),
+(2, 3, 9078, 'Cloth'),
+(2, 3, 9125, 'Generic'),
+(2, 3, 13358, 'Defensive State (DND)'),
+(2, 3, 20572, 'Blood Fury'),
+(2, 3, 20573, 'Hardiness'),
+(2, 3, 20574, 'Axe Specialization'),
+(2, 3, 20576, 'Command'),
+(2, 3, 21651, 'Opening'),
+(2, 3, 21652, 'Closing'),
+(2, 3, 22027, 'Remove Insignia'),
+(2, 3, 22810, 'Opening - No Text'),
+(2, 3, 24949, 'Defensive State 2 (DND)'),
+(2, 3, 34082, 'Advantaged State (DND)'),
+(2, 3, 45927, 'Summon Friend'),
+(2, 3, 61437, 'Opening'),
+(2, 4, 81, 'Dodge'),
+(2, 4, 203, 'Unarmed'),
+(2, 4, 204, 'Defense'),
+(2, 4, 522, 'SPELLDEFENSE (DND)'),
+(2, 4, 669, 'Language Orcish'),
+(2, 4, 1180, 'Daggers'),
+(2, 4, 1752, 'Sinister Strike'),
+(2, 4, 1843, 'Disarm'),
+(2, 4, 2098, 'Eviscerate'),
+(2, 4, 2382, 'Generic'),
+(2, 4, 2479, 'Honorless Target'),
+(2, 4, 2567, 'Thrown'),
+(2, 4, 2764, 'Throw'),
+(2, 4, 3050, 'Detect'),
+(2, 4, 3365, 'Opening'),
+(2, 4, 6233, 'Closing'),
+(2, 4, 6246, 'Closing'),
+(2, 4, 6247, 'Opening'),
+(2, 4, 6477, 'Opening'),
+(2, 4, 6478, 'Opening'),
+(2, 4, 6603, 'Attack'),
+(2, 4, 7266, 'Duel'),
+(2, 4, 7267, 'Grovel'),
+(2, 4, 7355, 'Stuck'),
+(2, 4, 8386, 'Attacking'),
+(2, 4, 9077, 'Leather'),
+(2, 4, 9078, 'Cloth'),
+(2, 4, 9125, 'Generic'),
+(2, 4, 16092, 'Defensive State (DND)'),
+(2, 4, 20572, 'Blood Fury'),
+(2, 4, 20573, 'Hardiness'),
+(2, 4, 20574, 'Axe Specialization'),
+(2, 4, 21184, 'Rogue Passive (DND)'),
+(2, 4, 21563, 'Command'),
+(2, 4, 21651, 'Opening'),
+(2, 4, 21652, 'Closing'),
+(2, 4, 22027, 'Remove Insignia'),
+(2, 4, 22810, 'Opening - No Text'),
+(2, 4, 45927, 'Summon Friend'),
+(2, 4, 61437, 'Opening'),
+(2, 6, 81, 'Dodge'),
+(2, 6, 196, 'One-Handed Axes'),
+(2, 6, 197, 'Two-Handed Axes'),
+(2, 6, 200, 'Polearms'),
+(2, 6, 201, 'One-Handed Swords'),
+(2, 6, 202, 'Two-Handed Swords'),
+(2, 6, 203, 'Unarmed'),
+(2, 6, 204, 'Defense'),
+(2, 6, 522, 'SPELLDEFENSE (DND)'),
+(2, 6, 669, 'Language Orcish'),
+(2, 6, 674, 'Dual Wield'),
+(2, 6, 750, 'Plate Mail'),
+(2, 6, 1843, 'Disarm'),
+(2, 6, 2382, 'Generic'),
+(2, 6, 2479, 'Honorless Target'),
+(2, 6, 3050, 'Detect'),
+(2, 6, 3127, 'Parry'),
+(2, 6, 3275, 'Linen Bandage'),
+(2, 6, 3276, 'Heavy Linen Bandage'),
+(2, 6, 3277, 'Wool Bandage'),
+(2, 6, 3278, 'Heavy Wool Bandage'),
+(2, 6, 3365, 'Opening'),
+(2, 6, 6233, 'Closing'),
+(2, 6, 6246, 'Closing'),
+(2, 6, 6247, 'Opening'),
+(2, 6, 6477, 'Opening'),
+(2, 6, 6478, 'Opening'),
+(2, 6, 6603, 'Attack'),
+(2, 6, 7266, 'Duel'),
+(2, 6, 7267, 'Grovel'),
+(2, 6, 7355, 'Stuck'),
+(2, 6, 7928, 'Silk Bandage'),
+(2, 6, 7929, 'Heavy Silk Bandage'),
+(2, 6, 7934, 'Anti-Venom'),
+(2, 6, 8386, 'Attacking'),
+(2, 6, 8737, 'Mail'),
+(2, 6, 9077, 'Leather'),
+(2, 6, 9078, 'Cloth'),
+(2, 6, 9125, 'Generic'),
+(2, 6, 10840, 'Mageweave Bandage'),
+(2, 6, 10841, 'Heavy Mageweave Bandage'),
+(2, 6, 10846, 'First Aid'),
+(2, 6, 18629, 'Runecloth Bandage'),
+(2, 6, 18630, 'Heavy Runecloth Bandage'),
+(2, 6, 20572, 'Blood Fury'),
+(2, 6, 20573, 'Hardiness'),
+(2, 6, 20574, 'Axe Specialization'),
+(2, 6, 21651, 'Opening'),
+(2, 6, 21652, 'Closing'),
+(2, 6, 22027, 'Remove Insignia'),
+(2, 6, 22810, 'Opening - No Text'),
+(2, 6, 33391, 'Journeyman Riding'),
+(2, 6, 45462, 'Plague Strike'),
+(2, 6, 45477, 'Icy Touch'),
+(2, 6, 45902, 'Blood Strike'),
+(2, 6, 45903, 'Offensive State (DND)'),
+(2, 6, 45927, 'Summon Friend'),
+(2, 6, 47541, 'Death Coil'),
+(2, 6, 48266, 'Blood Presence'),
+(2, 6, 49410, 'Forceful Deflection'),
+(2, 6, 49576, 'Death Grip'),
+(2, 6, 52665, 'Sigil'),
+(2, 6, 54562, 'Command'),
+(2, 6, 59879, 'Blood Plague'),
+(2, 6, 59921, 'Frost Fever'),
+(2, 6, 61437, 'Opening'),
+(2, 6, 61455, 'Runic Focus'),
+(2, 7, 81, 'Dodge'),
+(2, 7, 107, 'Block'),
+(2, 7, 198, 'One-Handed Maces'),
+(2, 7, 203, 'Unarmed'),
+(2, 7, 204, 'Defense'),
+(2, 7, 227, 'Staves'),
+(2, 7, 331, 'Healing Wave'),
+(2, 7, 403, 'Lightning Bolt'),
+(2, 7, 522, 'SPELLDEFENSE (DND)'),
+(2, 7, 669, 'Language Orcish'),
+(2, 7, 1843, 'Disarm'),
+(2, 7, 2382, 'Generic'),
+(2, 7, 2479, 'Honorless Target'),
+(2, 7, 3050, 'Detect'),
+(2, 7, 3365, 'Opening'),
+(2, 7, 6233, 'Closing'),
+(2, 7, 6246, 'Closing'),
+(2, 7, 6247, 'Opening'),
+(2, 7, 6477, 'Opening'),
+(2, 7, 6478, 'Opening'),
+(2, 7, 6603, 'Attack'),
+(2, 7, 7266, 'Duel'),
+(2, 7, 7267, 'Grovel'),
+(2, 7, 7355, 'Stuck'),
+(2, 7, 8386, 'Attacking'),
+(2, 7, 9077, 'Leather'),
+(2, 7, 9078, 'Cloth'),
+(2, 7, 9116, 'Shield'),
+(2, 7, 9125, 'Generic'),
+(2, 7, 20573, 'Hardiness'),
+(2, 7, 20574, 'Axe Specialization'),
+(2, 7, 21563, 'Command'),
+(2, 7, 21651, 'Opening'),
+(2, 7, 21652, 'Closing'),
+(2, 7, 22027, 'Remove Insignia'),
+(2, 7, 22810, 'Opening - No Text'),
+(2, 7, 27763, 'Totem'),
+(2, 7, 33697, 'Blood Fury'),
+(2, 7, 45927, 'Summon Friend'),
+(2, 7, 61437, 'Opening'),
+(2, 9, 81, 'Dodge'),
+(2, 9, 203, 'Unarmed'),
+(2, 9, 204, 'Defense'),
+(2, 9, 522, 'SPELLDEFENSE (DND)'),
+(2, 9, 669, 'Language Orcish'),
+(2, 9, 686, 'Shadow Bolt'),
+(2, 9, 687, 'Demon Skin'),
+(2, 9, 1180, 'Daggers'),
+(2, 9, 1843, 'Disarm'),
+(2, 9, 2382, 'Generic'),
+(2, 9, 2479, 'Honorless Target'),
+(2, 9, 3050, 'Detect'),
+(2, 9, 3365, 'Opening'),
+(2, 9, 5009, 'Wands'),
+(2, 9, 5019, 'Shoot'),
+(2, 9, 6233, 'Closing'),
+(2, 9, 6246, 'Closing'),
+(2, 9, 6247, 'Opening'),
+(2, 9, 6477, 'Opening'),
+(2, 9, 6478, 'Opening'),
+(2, 9, 6603, 'Attack'),
+(2, 9, 7266, 'Duel'),
+(2, 9, 7267, 'Grovel'),
+(2, 9, 7355, 'Stuck'),
+(2, 9, 8386, 'Attacking'),
+(2, 9, 9078, 'Cloth'),
+(2, 9, 9125, 'Generic'),
+(2, 9, 20573, 'Hardiness'),
+(2, 9, 20574, 'Axe Specialization'),
+(2, 9, 20575, 'Command'),
+(2, 9, 21651, 'Opening'),
+(2, 9, 21652, 'Closing'),
+(2, 9, 22027, 'Remove Insignia'),
+(2, 9, 22810, 'Opening - No Text'),
+(2, 9, 33702, 'Blood Fury'),
+(2, 9, 45927, 'Summon Friend'),
+(2, 9, 58284, 'Chaos Bolt Passive'),
+(2, 9, 61437, 'Opening'),
+(3, 1, 78, 'Heroic Strike'),
+(3, 1, 81, 'Dodge'),
+(3, 1, 107, 'Block'),
+(3, 1, 196, 'One-Handed Axes'),
+(3, 1, 197, 'Two-Handed Axes'),
+(3, 1, 198, 'One-Handed Maces'),
+(3, 1, 203, 'Unarmed'),
+(3, 1, 204, 'Defense'),
+(3, 1, 522, 'SPELLDEFENSE (DND)'),
+(3, 1, 668, 'Language Common'),
+(3, 1, 672, 'Language Dwarven'),
+(3, 1, 1843, 'Disarm'),
+(3, 1, 2382, 'Generic'),
+(3, 1, 2457, 'Battle Stance'),
+(3, 1, 2479, 'Honorless Target'),
+(3, 1, 2481, 'Find Treasure'),
+(3, 1, 3050, 'Detect'),
+(3, 1, 3365, 'Opening'),
+(3, 1, 5301, 'Defensive State (DND)'),
+(3, 1, 6233, 'Closing'),
+(3, 1, 6246, 'Closing'),
+(3, 1, 6247, 'Opening'),
+(3, 1, 6477, 'Opening'),
+(3, 1, 6478, 'Opening'),
+(3, 1, 6603, 'Attack'),
+(3, 1, 7266, 'Duel'),
+(3, 1, 7267, 'Grovel'),
+(3, 1, 7355, 'Stuck'),
+(3, 1, 8386, 'Attacking'),
+(3, 1, 8737, 'Mail'),
+(3, 1, 9077, 'Leather'),
+(3, 1, 9078, 'Cloth'),
+(3, 1, 9116, 'Shield'),
+(3, 1, 9125, 'Generic'),
+(3, 1, 20594, 'Stoneform'),
+(3, 1, 20595, 'Gun Specialization'),
+(3, 1, 20596, 'Frost Resistance'),
+(3, 1, 21651, 'Opening'),
+(3, 1, 21652, 'Closing'),
+(3, 1, 22027, 'Remove Insignia'),
+(3, 1, 22810, 'Opening - No Text'),
+(3, 1, 32215, 'Victorious State'),
+(3, 1, 45927, 'Summon Friend'),
+(3, 1, 59224, 'Mace Specialization'),
+(3, 1, 61437, 'Opening'),
+(3, 2, 81, 'Dodge'),
+(3, 2, 107, 'Block'),
+(3, 2, 198, 'One-Handed Maces'),
+(3, 2, 199, 'Two-Handed Maces'),
+(3, 2, 203, 'Unarmed'),
+(3, 2, 204, 'Defense'),
+(3, 2, 522, 'SPELLDEFENSE (DND)'),
+(3, 2, 635, 'Holy Light'),
+(3, 2, 668, 'Language Common'),
+(3, 2, 672, 'Language Dwarven'),
+(3, 2, 1843, 'Disarm'),
+(3, 2, 2382, 'Generic'),
+(3, 2, 2479, 'Honorless Target'),
+(3, 2, 2481, 'Find Treasure'),
+(3, 2, 3050, 'Detect'),
+(3, 2, 3365, 'Opening'),
+(3, 2, 6233, 'Closing'),
+(3, 2, 6246, 'Closing'),
+(3, 2, 6247, 'Opening'),
+(3, 2, 6477, 'Opening'),
+(3, 2, 6478, 'Opening'),
+(3, 2, 6603, 'Attack'),
+(3, 2, 7266, 'Duel'),
+(3, 2, 7267, 'Grovel'),
+(3, 2, 7355, 'Stuck'),
+(3, 2, 8386, 'Attacking'),
+(3, 2, 8737, 'Mail'),
+(3, 2, 9077, 'Leather'),
+(3, 2, 9078, 'Cloth'),
+(3, 2, 9116, 'Shield'),
+(3, 2, 9125, 'Generic'),
+(3, 2, 20154, 'Seal of Righteousness'),
+(3, 2, 20594, 'Stoneform'),
+(3, 2, 20595, 'Gun Specialization'),
+(3, 2, 20596, 'Frost Resistance'),
+(3, 2, 21651, 'Opening'),
+(3, 2, 21652, 'Closing'),
+(3, 2, 22027, 'Remove Insignia'),
+(3, 2, 22810, 'Opening - No Text'),
+(3, 2, 27762, 'Libram'),
+(3, 2, 45927, 'Summon Friend'),
+(3, 2, 59224, 'Mace Specialization'),
+(3, 2, 61437, 'Opening'),
+(3, 3, 75, 'Auto Shot'),
+(3, 3, 81, 'Dodge'),
+(3, 3, 196, 'One-Handed Axes'),
+(3, 3, 203, 'Unarmed'),
+(3, 3, 204, 'Defense'),
+(3, 3, 266, 'Guns'),
+(3, 3, 522, 'SPELLDEFENSE (DND)'),
+(3, 3, 668, 'Language Common'),
+(3, 3, 672, 'Language Dwarven'),
+(3, 3, 1843, 'Disarm'),
+(3, 3, 2382, 'Generic'),
+(3, 3, 2479, 'Honorless Target'),
+(3, 3, 2481, 'Find Treasure'),
+(3, 3, 2973, 'Raptor Strike'),
+(3, 3, 3050, 'Detect'),
+(3, 3, 3365, 'Opening'),
+(3, 3, 6233, 'Closing'),
+(3, 3, 6246, 'Closing'),
+(3, 3, 6247, 'Opening'),
+(3, 3, 6477, 'Opening'),
+(3, 3, 6478, 'Opening'),
+(3, 3, 6603, 'Attack'),
+(3, 3, 7266, 'Duel'),
+(3, 3, 7267, 'Grovel'),
+(3, 3, 7355, 'Stuck'),
+(3, 3, 8386, 'Attacking'),
+(3, 3, 9077, 'Leather'),
+(3, 3, 9078, 'Cloth'),
+(3, 3, 9125, 'Generic'),
+(3, 3, 13358, 'Defensive State (DND)'),
+(3, 3, 20594, 'Stoneform'),
+(3, 3, 20595, 'Gun Specialization'),
+(3, 3, 20596, 'Frost Resistance'),
+(3, 3, 21651, 'Opening'),
+(3, 3, 21652, 'Closing'),
+(3, 3, 22027, 'Remove Insignia'),
+(3, 3, 22810, 'Opening - No Text'),
+(3, 3, 24949, 'Defensive State 2 (DND)'),
+(3, 3, 34082, 'Advantaged State (DND)'),
+(3, 3, 45927, 'Summon Friend'),
+(3, 3, 59224, 'Mace Specialization'),
+(3, 3, 61437, 'Opening'),
+(3, 4, 81, 'Dodge'),
+(3, 4, 203, 'Unarmed'),
+(3, 4, 204, 'Defense'),
+(3, 4, 522, 'SPELLDEFENSE (DND)'),
+(3, 4, 668, 'Language Common'),
+(3, 4, 672, 'Language Dwarven'),
+(3, 4, 1180, 'Daggers'),
+(3, 4, 1752, 'Sinister Strike'),
+(3, 4, 1843, 'Disarm'),
+(3, 4, 2098, 'Eviscerate'),
+(3, 4, 2382, 'Generic'),
+(3, 4, 2479, 'Honorless Target'),
+(3, 4, 2481, 'Find Treasure'),
+(3, 4, 2567, 'Thrown'),
+(3, 4, 2764, 'Throw'),
+(3, 4, 3050, 'Detect'),
+(3, 4, 3365, 'Opening'),
+(3, 4, 6233, 'Closing'),
+(3, 4, 6246, 'Closing'),
+(3, 4, 6247, 'Opening'),
+(3, 4, 6477, 'Opening'),
+(3, 4, 6478, 'Opening'),
+(3, 4, 6603, 'Attack'),
+(3, 4, 7266, 'Duel'),
+(3, 4, 7267, 'Grovel'),
+(3, 4, 7355, 'Stuck'),
+(3, 4, 8386, 'Attacking'),
+(3, 4, 9077, 'Leather'),
+(3, 4, 9078, 'Cloth'),
+(3, 4, 9125, 'Generic'),
+(3, 4, 16092, 'Defensive State (DND)'),
+(3, 4, 20594, 'Stoneform'),
+(3, 4, 20595, 'Gun Specialization'),
+(3, 4, 20596, 'Frost Resistance'),
+(3, 4, 21184, 'Rogue Passive (DND)'),
+(3, 4, 21651, 'Opening'),
+(3, 4, 21652, 'Closing'),
+(3, 4, 22027, 'Remove Insignia'),
+(3, 4, 22810, 'Opening - No Text'),
+(3, 4, 45927, 'Summon Friend'),
+(3, 4, 59224, 'Mace Specialization'),
+(3, 4, 61437, 'Opening'),
+(3, 5, 81, 'Dodge'),
+(3, 5, 198, 'One-Handed Maces'),
+(3, 5, 203, 'Unarmed'),
+(3, 5, 204, 'Defense'),
+(3, 5, 522, 'SPELLDEFENSE (DND)'),
+(3, 5, 585, 'Smite'),
+(3, 5, 668, 'Language Common'),
+(3, 5, 672, 'Language Dwarven'),
+(3, 5, 1843, 'Disarm'),
+(3, 5, 2050, 'Lesser Heal'),
+(3, 5, 2382, 'Generic'),
+(3, 5, 2479, 'Honorless Target'),
+(3, 5, 2481, 'Find Treasure'),
+(3, 5, 3050, 'Detect'),
+(3, 5, 3365, 'Opening'),
+(3, 5, 5009, 'Wands'),
+(3, 5, 5019, 'Shoot'),
+(3, 5, 6233, 'Closing'),
+(3, 5, 6246, 'Closing'),
+(3, 5, 6247, 'Opening'),
+(3, 5, 6477, 'Opening'),
+(3, 5, 6478, 'Opening'),
+(3, 5, 6603, 'Attack'),
+(3, 5, 7266, 'Duel'),
+(3, 5, 7267, 'Grovel'),
+(3, 5, 7355, 'Stuck'),
+(3, 5, 8386, 'Attacking'),
+(3, 5, 9078, 'Cloth'),
+(3, 5, 9125, 'Generic'),
+(3, 5, 20594, 'Stoneform'),
+(3, 5, 20595, 'Gun Specialization'),
+(3, 5, 20596, 'Frost Resistance'),
+(3, 5, 21651, 'Opening'),
+(3, 5, 21652, 'Closing'),
+(3, 5, 22027, 'Remove Insignia'),
+(3, 5, 22810, 'Opening - No Text'),
+(3, 5, 45927, 'Summon Friend'),
+(3, 5, 59224, 'Mace Specialization'),
+(3, 5, 61437, 'Opening'),
+(3, 6, 81, 'Dodge'),
+(3, 6, 196, 'One-Handed Axes'),
+(3, 6, 197, 'Two-Handed Axes'),
+(3, 6, 200, 'Polearms'),
+(3, 6, 201, 'One-Handed Swords'),
+(3, 6, 202, 'Two-Handed Swords'),
+(3, 6, 203, 'Unarmed'),
+(3, 6, 204, 'Defense'),
+(3, 6, 522, 'SPELLDEFENSE (DND)'),
+(3, 6, 668, 'Language Common'),
+(3, 6, 672, 'Language Dwarven'),
+(3, 6, 674, 'Dual Wield'),
+(3, 6, 750, 'Plate Mail'),
+(3, 6, 1843, 'Disarm'),
+(3, 6, 2382, 'Generic'),
+(3, 6, 2479, 'Honorless Target'),
+(3, 6, 2481, 'Find Treasure'),
+(3, 6, 3050, 'Detect'),
+(3, 6, 3127, 'Parry'),
+(3, 6, 3275, 'Linen Bandage'),
+(3, 6, 3276, 'Heavy Linen Bandage'),
+(3, 6, 3277, 'Wool Bandage'),
+(3, 6, 3278, 'Heavy Wool Bandage'),
+(3, 6, 3365, 'Opening'),
+(3, 6, 6233, 'Closing'),
+(3, 6, 6246, 'Closing'),
+(3, 6, 6247, 'Opening'),
+(3, 6, 6477, 'Opening'),
+(3, 6, 6478, 'Opening'),
+(3, 6, 6603, 'Attack'),
+(3, 6, 7266, 'Duel'),
+(3, 6, 7267, 'Grovel'),
+(3, 6, 7355, 'Stuck'),
+(3, 6, 7928, 'Silk Bandage'),
+(3, 6, 7929, 'Heavy Silk Bandage'),
+(3, 6, 7934, 'Anti-Venom'),
+(3, 6, 8386, 'Attacking'),
+(3, 6, 8737, 'Mail'),
+(3, 6, 9077, 'Leather'),
+(3, 6, 9078, 'Cloth'),
+(3, 6, 9125, 'Generic'),
+(3, 6, 10840, 'Mageweave Bandage'),
+(3, 6, 10841, 'Heavy Mageweave Bandage'),
+(3, 6, 10846, 'First Aid'),
+(3, 6, 18629, 'Runecloth Bandage'),
+(3, 6, 18630, 'Heavy Runecloth Bandage'),
+(3, 6, 20594, 'Stoneform'),
+(3, 6, 20595, 'Gun Specialization'),
+(3, 6, 20596, 'Frost Resistance'),
+(3, 6, 21651, 'Opening'),
+(3, 6, 21652, 'Closing'),
+(3, 6, 22027, 'Remove Insignia'),
+(3, 6, 22810, 'Opening - No Text'),
+(3, 6, 33391, 'Journeyman Riding'),
+(3, 6, 45462, 'Plague Strike'),
+(3, 6, 45477, 'Icy Touch'),
+(3, 6, 45902, 'Blood Strike'),
+(3, 6, 45903, 'Offensive State (DND)'),
+(3, 6, 45927, 'Summon Friend'),
+(3, 6, 47541, 'Death Coil'),
+(3, 6, 48266, 'Blood Presence'),
+(3, 6, 49410, 'Forceful Deflection'),
+(3, 6, 49576, 'Death Grip'),
+(3, 6, 52665, 'Sigil'),
+(3, 6, 59224, 'Mace Specialization'),
+(3, 6, 59879, 'Blood Plague'),
+(3, 6, 59921, 'Frost Fever'),
+(3, 6, 61437, 'Opening'),
+(3, 6, 61455, 'Runic Focus'),
+(4, 1, 78, 'Heroic Strike'),
+(4, 1, 81, 'Dodge'),
+(4, 1, 107, 'Block'),
+(4, 1, 198, 'One-Handed Maces'),
+(4, 1, 201, 'One-Handed Swords'),
+(4, 1, 203, 'Unarmed'),
+(4, 1, 204, 'Defense'),
+(4, 1, 522, 'SPELLDEFENSE (DND)'),
+(4, 1, 668, 'Language Common'),
+(4, 1, 671, 'Language Darnassian'),
+(4, 1, 1180, 'Daggers'),
+(4, 1, 1843, 'Disarm'),
+(4, 1, 2382, 'Generic'),
+(4, 1, 2457, 'Battle Stance'),
+(4, 1, 2479, 'Honorless Target'),
+(4, 1, 3050, 'Detect'),
+(4, 1, 3365, 'Opening'),
+(4, 1, 5301, 'Defensive State (DND)'),
+(4, 1, 6233, 'Closing'),
+(4, 1, 6246, 'Closing'),
+(4, 1, 6247, 'Opening'),
+(4, 1, 6477, 'Opening'),
+(4, 1, 6478, 'Opening'),
+(4, 1, 6603, 'Attack'),
+(4, 1, 7266, 'Duel'),
+(4, 1, 7267, 'Grovel'),
+(4, 1, 7355, 'Stuck'),
+(4, 1, 8386, 'Attacking'),
+(4, 1, 8737, 'Mail'),
+(4, 1, 9077, 'Leather'),
+(4, 1, 9078, 'Cloth'),
+(4, 1, 9116, 'Shield'),
+(4, 1, 9125, 'Generic'),
+(4, 1, 20582, 'Quickness'),
+(4, 1, 20583, 'Nature Resistance'),
+(4, 1, 20585, 'Wisp Spirit'),
+(4, 1, 21651, 'Opening'),
+(4, 1, 21652, 'Closing'),
+(4, 1, 22027, 'Remove Insignia'),
+(4, 1, 22810, 'Opening - No Text'),
+(4, 1, 32215, 'Victorious State'),
+(4, 1, 45927, 'Summon Friend'),
+(4, 1, 58984, 'Shadowmelt'),
+(4, 1, 61437, 'Opening'),
+(4, 3, 75, 'Auto Shot'),
+(4, 3, 81, 'Dodge'),
+(4, 3, 203, 'Unarmed'),
+(4, 3, 204, 'Defense'),
+(4, 3, 264, 'Bows'),
+(4, 3, 522, 'SPELLDEFENSE (DND)'),
+(4, 3, 668, 'Language Common'),
+(4, 3, 671, 'Language Darnassian'),
+(4, 3, 1180, 'Daggers'),
+(4, 3, 1843, 'Disarm'),
+(4, 3, 2382, 'Generic'),
+(4, 3, 2479, 'Honorless Target'),
+(4, 3, 2973, 'Raptor Strike'),
+(4, 3, 3050, 'Detect'),
+(4, 3, 3365, 'Opening'),
+(4, 3, 6233, 'Closing'),
+(4, 3, 6246, 'Closing'),
+(4, 3, 6247, 'Opening'),
+(4, 3, 6477, 'Opening'),
+(4, 3, 6478, 'Opening'),
+(4, 3, 6603, 'Attack'),
+(4, 3, 7266, 'Duel'),
+(4, 3, 7267, 'Grovel'),
+(4, 3, 7355, 'Stuck'),
+(4, 3, 8386, 'Attacking'),
+(4, 3, 9077, 'Leather'),
+(4, 3, 9078, 'Cloth'),
+(4, 3, 9125, 'Generic'),
+(4, 3, 13358, 'Defensive State (DND)'),
+(4, 3, 20582, 'Quickness'),
+(4, 3, 20583, 'Nature Resistance'),
+(4, 3, 20585, 'Wisp Spirit'),
+(4, 3, 21651, 'Opening'),
+(4, 3, 21652, 'Closing'),
+(4, 3, 22027, 'Remove Insignia'),
+(4, 3, 22810, 'Opening - No Text'),
+(4, 3, 24949, 'Defensive State 2 (DND)'),
+(4, 3, 34082, 'Advantaged State (DND)'),
+(4, 3, 45927, 'Summon Friend'),
+(4, 3, 58984, 'Shadowmelt'),
+(4, 3, 61437, 'Opening'),
+(4, 4, 81, 'Dodge'),
+(4, 4, 203, 'Unarmed'),
+(4, 4, 204, 'Defense'),
+(4, 4, 522, 'SPELLDEFENSE (DND)'),
+(4, 4, 668, 'Language Common'),
+(4, 4, 671, 'Language Darnassian'),
+(4, 4, 1180, 'Daggers'),
+(4, 4, 1752, 'Sinister Strike'),
+(4, 4, 1843, 'Disarm'),
+(4, 4, 2098, 'Eviscerate'),
+(4, 4, 2382, 'Generic'),
+(4, 4, 2479, 'Honorless Target'),
+(4, 4, 2567, 'Thrown'),
+(4, 4, 2764, 'Throw'),
+(4, 4, 3050, 'Detect'),
+(4, 4, 3365, 'Opening'),
+(4, 4, 6233, 'Closing'),
+(4, 4, 6246, 'Closing'),
+(4, 4, 6247, 'Opening'),
+(4, 4, 6477, 'Opening'),
+(4, 4, 6478, 'Opening'),
+(4, 4, 6603, 'Attack'),
+(4, 4, 7266, 'Duel'),
+(4, 4, 7267, 'Grovel'),
+(4, 4, 7355, 'Stuck'),
+(4, 4, 8386, 'Attacking'),
+(4, 4, 9077, 'Leather'),
+(4, 4, 9078, 'Cloth'),
+(4, 4, 9125, 'Generic'),
+(4, 4, 16092, 'Defensive State (DND)'),
+(4, 4, 20582, 'Quickness'),
+(4, 4, 20583, 'Nature Resistance'),
+(4, 4, 20585, 'Wisp Spirit'),
+(4, 4, 21184, 'Rogue Passive (DND)'),
+(4, 4, 21651, 'Opening'),
+(4, 4, 21652, 'Closing'),
+(4, 4, 22027, 'Remove Insignia'),
+(4, 4, 22810, 'Opening - No Text'),
+(4, 4, 45927, 'Summon Friend'),
+(4, 4, 58984, 'Shadowmelt'),
+(4, 4, 61437, 'Opening'),
+(4, 5, 81, 'Dodge'),
+(4, 5, 198, 'One-Handed Maces'),
+(4, 5, 203, 'Unarmed'),
+(4, 5, 204, 'Defense'),
+(4, 5, 522, 'SPELLDEFENSE (DND)'),
+(4, 5, 585, 'Smite'),
+(4, 5, 668, 'Language Common'),
+(4, 5, 671, 'Language Darnassian'),
+(4, 5, 1843, 'Disarm'),
+(4, 5, 2050, 'Lesser Heal'),
+(4, 5, 2382, 'Generic'),
+(4, 5, 2479, 'Honorless Target'),
+(4, 5, 3050, 'Detect'),
+(4, 5, 3365, 'Opening'),
+(4, 5, 5009, 'Wands'),
+(4, 5, 5019, 'Shoot'),
+(4, 5, 6233, 'Closing'),
+(4, 5, 6246, 'Closing'),
+(4, 5, 6247, 'Opening'),
+(4, 5, 6477, 'Opening'),
+(4, 5, 6478, 'Opening'),
+(4, 5, 6603, 'Attack'),
+(4, 5, 7266, 'Duel'),
+(4, 5, 7267, 'Grovel'),
+(4, 5, 7355, 'Stuck'),
+(4, 5, 8386, 'Attacking'),
+(4, 5, 9078, 'Cloth'),
+(4, 5, 9125, 'Generic'),
+(4, 5, 20582, 'Quickness'),
+(4, 5, 20583, 'Nature Resistance'),
+(4, 5, 20585, 'Wisp Spirit'),
+(4, 5, 21651, 'Opening'),
+(4, 5, 21652, 'Closing'),
+(4, 5, 22027, 'Remove Insignia'),
+(4, 5, 22810, 'Opening - No Text'),
+(4, 5, 45927, 'Summon Friend'),
+(4, 5, 58984, 'Shadowmelt'),
+(4, 5, 61437, 'Opening'),
+(4, 6, 81, 'Dodge'),
+(4, 6, 196, 'One-Handed Axes'),
+(4, 6, 197, 'Two-Handed Axes'),
+(4, 6, 200, 'Polearms'),
+(4, 6, 201, 'One-Handed Swords'),
+(4, 6, 202, 'Two-Handed Swords'),
+(4, 6, 203, 'Unarmed'),
+(4, 6, 204, 'Defense'),
+(4, 6, 522, 'SPELLDEFENSE (DND)'),
+(4, 6, 668, 'Language Common'),
+(4, 6, 671, 'Language Darnassian'),
+(4, 6, 674, 'Dual Wield'),
+(4, 6, 750, 'Plate Mail'),
+(4, 6, 1843, 'Disarm'),
+(4, 6, 2382, 'Generic'),
+(4, 6, 2479, 'Honorless Target'),
+(4, 6, 3050, 'Detect'),
+(4, 6, 3127, 'Parry'),
+(4, 6, 3275, 'Linen Bandage'),
+(4, 6, 3276, 'Heavy Linen Bandage'),
+(4, 6, 3277, 'Wool Bandage'),
+(4, 6, 3278, 'Heavy Wool Bandage'),
+(4, 6, 3365, 'Opening'),
+(4, 6, 6233, 'Closing'),
+(4, 6, 6246, 'Closing'),
+(4, 6, 6247, 'Opening'),
+(4, 6, 6477, 'Opening'),
+(4, 6, 6478, 'Opening'),
+(4, 6, 6603, 'Attack'),
+(4, 6, 7266, 'Duel'),
+(4, 6, 7267, 'Grovel'),
+(4, 6, 7355, 'Stuck'),
+(4, 6, 7928, 'Silk Bandage'),
+(4, 6, 7929, 'Heavy Silk Bandage'),
+(4, 6, 7934, 'Anti-Venom'),
+(4, 6, 8386, 'Attacking'),
+(4, 6, 8737, 'Mail'),
+(4, 6, 9077, 'Leather'),
+(4, 6, 9078, 'Cloth'),
+(4, 6, 9125, 'Generic'),
+(4, 6, 10840, 'Mageweave Bandage'),
+(4, 6, 10841, 'Heavy Mageweave Bandage'),
+(4, 6, 10846, 'First Aid'),
+(4, 6, 18629, 'Runecloth Bandage'),
+(4, 6, 18630, 'Heavy Runecloth Bandage'),
+(4, 6, 20582, 'Quickness'),
+(4, 6, 20583, 'Nature Resistance'),
+(4, 6, 20585, 'Wisp Spirit'),
+(4, 6, 21651, 'Opening'),
+(4, 6, 21652, 'Closing'),
+(4, 6, 22027, 'Remove Insignia'),
+(4, 6, 22810, 'Opening - No Text'),
+(4, 6, 33391, 'Journeyman Riding'),
+(4, 6, 45462, 'Plague Strike'),
+(4, 6, 45477, 'Icy Touch'),
+(4, 6, 45902, 'Blood Strike'),
+(4, 6, 45903, 'Offensive State (DND)'),
+(4, 6, 45927, 'Summon Friend'),
+(4, 6, 47541, 'Death Coil'),
+(4, 6, 48266, 'Blood Presence'),
+(4, 6, 49410, 'Forceful Deflection'),
+(4, 6, 49576, 'Death Grip'),
+(4, 6, 52665, 'Sigil'),
+(4, 6, 58984, 'Shadowmeld'),
+(4, 6, 59879, 'Blood Plague'),
+(4, 6, 59921, 'Frost Fever'),
+(4, 6, 61437, 'Opening'),
+(4, 6, 61455, 'Runic Focus'),
+(4, 11, 81, 'Dodge'),
+(4, 11, 203, 'Unarmed'),
+(4, 11, 204, 'Defense'),
+(4, 11, 227, 'Staves'),
+(4, 11, 522, 'SPELLDEFENSE (DND)'),
+(4, 11, 668, 'Language Common'),
+(4, 11, 671, 'Language Darnassian'),
+(4, 11, 1180, 'Daggers'),
+(4, 11, 1843, 'Disarm'),
+(4, 11, 2382, 'Generic'),
+(4, 11, 2479, 'Honorless Target'),
+(4, 11, 3050, 'Detect'),
+(4, 11, 3365, 'Opening'),
+(4, 11, 5176, 'Wrath'),
+(4, 11, 5185, 'Healing Touch'),
+(4, 11, 6233, 'Closing'),
+(4, 11, 6246, 'Closing'),
+(4, 11, 6247, 'Opening'),
+(4, 11, 6477, 'Opening'),
+(4, 11, 6478, 'Opening'),
+(4, 11, 6603, 'Attack'),
+(4, 11, 7266, 'Duel'),
+(4, 11, 7267, 'Grovel'),
+(4, 11, 7355, 'Stuck'),
+(4, 11, 8386, 'Attacking'),
+(4, 11, 9077, 'Leather'),
+(4, 11, 9078, 'Cloth'),
+(4, 11, 9125, 'Generic'),
+(4, 11, 20582, 'Quickness'),
+(4, 11, 20583, 'Nature Resistance'),
+(4, 11, 20585, 'Wisp Spirit'),
+(4, 11, 21651, 'Opening'),
+(4, 11, 21652, 'Closing'),
+(4, 11, 22027, 'Remove Insignia'),
+(4, 11, 22810, 'Opening - No Text'),
+(4, 11, 27764, 'Fetish'),
+(4, 11, 45927, 'Summon Friend'),
+(4, 11, 58984, 'Shadowmelt'),
+(4, 11, 61437, 'Opening'),
+(5, 1, 78, 'Heroic Strike'),
+(5, 1, 81, 'Dodge'),
+(5, 1, 107, 'Block'),
+(5, 1, 201, 'One-Handed Swords'),
+(5, 1, 202, 'Two-Handed Swords'),
+(5, 1, 203, 'Unarmed'),
+(5, 1, 204, 'Defense'),
+(5, 1, 522, 'SPELLDEFENSE (DND)'),
+(5, 1, 669, 'Language Orcish'),
+(5, 1, 1180, 'Daggers'),
+(5, 1, 1843, 'Disarm'),
+(5, 1, 2382, 'Generic'),
+(5, 1, 2457, 'Battle Stance'),
+(5, 1, 2479, 'Honorless Target'),
+(5, 1, 3050, 'Detect'),
+(5, 1, 3365, 'Opening'),
+(5, 1, 5227, 'Underwater Breathing'),
+(5, 1, 5301, 'Defensive State (DND)'),
+(5, 1, 6233, 'Closing'),
+(5, 1, 6246, 'Closing'),
+(5, 1, 6247, 'Opening'),
+(5, 1, 6477, 'Opening'),
+(5, 1, 6478, 'Opening'),
+(5, 1, 6603, 'Attack'),
+(5, 1, 7266, 'Duel'),
+(5, 1, 7267, 'Grovel'),
+(5, 1, 7355, 'Stuck'),
+(5, 1, 7744, 'Will of the Forsaken'),
+(5, 1, 8386, 'Attacking'),
+(5, 1, 8737, 'Mail'),
+(5, 1, 9077, 'Leather'),
+(5, 1, 9078, 'Cloth'),
+(5, 1, 9116, 'Shield'),
+(5, 1, 9125, 'Generic'),
+(5, 1, 17737, 'Language Gutterspeak'),
+(5, 1, 20577, 'Cannibalize'),
+(5, 1, 20579, 'Shadow Resistance'),
+(5, 1, 21651, 'Opening'),
+(5, 1, 21652, 'Closing'),
+(5, 1, 22027, 'Remove Insignia'),
+(5, 1, 22810, 'Opening - No Text'),
+(5, 1, 32215, 'Victorious State'),
+(5, 1, 45927, 'Summon Friend'),
+(5, 1, 61437, 'Opening'),
+(5, 4, 81, 'Dodge'),
+(5, 4, 203, 'Unarmed'),
+(5, 4, 204, 'Defense'),
+(5, 4, 522, 'SPELLDEFENSE (DND)'),
+(5, 4, 669, 'Language Orcish'),
+(5, 4, 1180, 'Daggers'),
+(5, 4, 1752, 'Sinister Strike'),
+(5, 4, 1843, 'Disarm'),
+(5, 4, 2098, 'Eviscerate'),
+(5, 4, 2382, 'Generic'),
+(5, 4, 2479, 'Honorless Target'),
+(5, 4, 2567, 'Thrown'),
+(5, 4, 2764, 'Throw'),
+(5, 4, 3050, 'Detect'),
+(5, 4, 3365, 'Opening'),
+(5, 4, 5227, 'Underwater Breathing'),
+(5, 4, 6233, 'Closing'),
+(5, 4, 6246, 'Closing'),
+(5, 4, 6247, 'Opening'),
+(5, 4, 6477, 'Opening'),
+(5, 4, 6478, 'Opening'),
+(5, 4, 6603, 'Attack'),
+(5, 4, 7266, 'Duel'),
+(5, 4, 7267, 'Grovel'),
+(5, 4, 7355, 'Stuck'),
+(5, 4, 7744, 'Will of the Forsaken'),
+(5, 4, 8386, 'Attacking'),
+(5, 4, 9077, 'Leather'),
+(5, 4, 9078, 'Cloth'),
+(5, 4, 9125, 'Generic'),
+(5, 4, 16092, 'Defensive State (DND)'),
+(5, 4, 17737, 'Language Gutterspeak'),
+(5, 4, 20577, 'Cannibalize'),
+(5, 4, 20579, 'Shadow Resistance'),
+(5, 4, 21184, 'Rogue Passive (DND)'),
+(5, 4, 21651, 'Opening'),
+(5, 4, 21652, 'Closing'),
+(5, 4, 22027, 'Remove Insignia'),
+(5, 4, 22810, 'Opening - No Text'),
+(5, 4, 45927, 'Summon Friend'),
+(5, 4, 61437, 'Opening'),
+(5, 5, 81, 'Dodge'),
+(5, 5, 198, 'One-Handed Maces'),
+(5, 5, 203, 'Unarmed'),
+(5, 5, 204, 'Defense'),
+(5, 5, 522, 'SPELLDEFENSE (DND)'),
+(5, 5, 585, 'Smite'),
+(5, 5, 669, 'Language Orcish'),
+(5, 5, 1843, 'Disarm'),
+(5, 5, 2050, 'Lesser Heal'),
+(5, 5, 2382, 'Generic'),
+(5, 5, 2479, 'Honorless Target'),
+(5, 5, 3050, 'Detect'),
+(5, 5, 3365, 'Opening'),
+(5, 5, 5009, 'Wands'),
+(5, 5, 5019, 'Shoot'),
+(5, 5, 5227, 'Underwater Breathing'),
+(5, 5, 6233, 'Closing'),
+(5, 5, 6246, 'Closing'),
+(5, 5, 6247, 'Opening'),
+(5, 5, 6477, 'Opening'),
+(5, 5, 6478, 'Opening'),
+(5, 5, 6603, 'Attack'),
+(5, 5, 7266, 'Duel'),
+(5, 5, 7267, 'Grovel'),
+(5, 5, 7355, 'Stuck'),
+(5, 5, 7744, 'Will of the Forsaken'),
+(5, 5, 8386, 'Attacking'),
+(5, 5, 9078, 'Cloth'),
+(5, 5, 9125, 'Generic'),
+(5, 5, 17737, 'Language Gutterspeak'),
+(5, 5, 20577, 'Cannibalize'),
+(5, 5, 20579, 'Shadow Resistance'),
+(5, 5, 21651, 'Opening'),
+(5, 5, 21652, 'Closing'),
+(5, 5, 22027, 'Remove Insignia'),
+(5, 5, 22810, 'Opening - No Text'),
+(5, 5, 45927, 'Summon Friend'),
+(5, 5, 61437, 'Opening'),
+(5, 6, 81, 'Dodge'),
+(5, 6, 196, 'One-Handed Axes'),
+(5, 6, 197, 'Two-Handed Axes'),
+(5, 6, 200, 'Polearms'),
+(5, 6, 201, 'One-Handed Swords'),
+(5, 6, 202, 'Two-Handed Swords'),
+(5, 6, 203, 'Unarmed'),
+(5, 6, 204, 'Defense'),
+(5, 6, 522, 'SPELLDEFENSE (DND)'),
+(5, 6, 669, 'Language Orcish'),
+(5, 6, 674, 'Dual Wield'),
+(5, 6, 750, 'Plate Mail'),
+(5, 6, 1843, 'Disarm'),
+(5, 6, 2382, 'Generic'),
+(5, 6, 2479, 'Honorless Target'),
+(5, 6, 3050, 'Detect'),
+(5, 6, 3127, 'Parry'),
+(5, 6, 3275, 'Linen Bandage'),
+(5, 6, 3276, 'Heavy Linen Bandage'),
+(5, 6, 3277, 'Wool Bandage'),
+(5, 6, 3278, 'Heavy Wool Bandage'),
+(5, 6, 3365, 'Opening'),
+(5, 6, 5227, 'Underwater Breathing'),
+(5, 6, 6233, 'Closing'),
+(5, 6, 6246, 'Closing'),
+(5, 6, 6247, 'Opening'),
+(5, 6, 6477, 'Opening'),
+(5, 6, 6478, 'Opening'),
+(5, 6, 6603, 'Attack'),
+(5, 6, 7266, 'Duel'),
+(5, 6, 7267, 'Grovel'),
+(5, 6, 7355, 'Stuck'),
+(5, 6, 7744, 'Will of the Forsaken'),
+(5, 6, 7928, 'Silk Bandage'),
+(5, 6, 7929, 'Heavy Silk Bandage'),
+(5, 6, 7934, 'Anti-Venom'),
+(5, 6, 8386, 'Attacking'),
+(5, 6, 8737, 'Mail'),
+(5, 6, 9077, 'Leather'),
+(5, 6, 9078, 'Cloth'),
+(5, 6, 9125, 'Generic'),
+(5, 6, 10840, 'Mageweave Bandage'),
+(5, 6, 10841, 'Heavy Mageweave Bandage'),
+(5, 6, 10846, 'First Aid'),
+(5, 6, 17737, 'Language Gutterspeak'),
+(5, 6, 18629, 'Runecloth Bandage'),
+(5, 6, 18630, 'Heavy Runecloth Bandage'),
+(5, 6, 20577, 'Cannibalize'),
+(5, 6, 20579, 'Shadow Resistance'),
+(5, 6, 21651, 'Opening'),
+(5, 6, 21652, 'Closing'),
+(5, 6, 22027, 'Remove Insignia'),
+(5, 6, 22810, 'Opening - No Text'),
+(5, 6, 33391, 'Journeyman Riding'),
+(5, 6, 45462, 'Plague Strike'),
+(5, 6, 45477, 'Icy Touch'),
+(5, 6, 45902, 'Blood Strike'),
+(5, 6, 45903, 'Offensive State (DND)'),
+(5, 6, 45927, 'Summon Friend'),
+(5, 6, 47541, 'Death Coil'),
+(5, 6, 48266, 'Blood Presence'),
+(5, 6, 49410, 'Forceful Deflection'),
+(5, 6, 49576, 'Death Grip'),
+(5, 6, 52665, 'Sigil'),
+(5, 6, 59879, 'Blood Plague'),
+(5, 6, 59921, 'Frost Fever'),
+(5, 6, 61437, 'Opening'),
+(5, 6, 61455, 'Runic Focus'),
+(5, 8, 81, 'Dodge'),
+(5, 8, 133, 'Fireball'),
+(5, 8, 168, 'Frost Armor'),
+(5, 8, 203, 'Unarmed'),
+(5, 8, 204, 'Defense'),
+(5, 8, 227, 'Staves'),
+(5, 8, 522, 'SPELLDEFENSE (DND)'),
+(5, 8, 669, 'Language Orcish'),
+(5, 8, 1843, 'Disarm'),
+(5, 8, 2382, 'Generic'),
+(5, 8, 2479, 'Honorless Target'),
+(5, 8, 3050, 'Detect'),
+(5, 8, 3365, 'Opening'),
+(5, 8, 5009, 'Wands'),
+(5, 8, 5019, 'Shoot'),
+(5, 8, 5227, 'Underwater Breathing'),
+(5, 8, 6233, 'Closing'),
+(5, 8, 6246, 'Closing'),
+(5, 8, 6247, 'Opening'),
+(5, 8, 6477, 'Opening'),
+(5, 8, 6478, 'Opening'),
+(5, 8, 6603, 'Attack'),
+(5, 8, 7266, 'Duel'),
+(5, 8, 7267, 'Grovel'),
+(5, 8, 7355, 'Stuck'),
+(5, 8, 7744, 'Will of the Forsaken'),
+(5, 8, 8386, 'Attacking'),
+(5, 8, 9078, 'Cloth'),
+(5, 8, 9125, 'Generic'),
+(5, 8, 17737, 'Language Gutterspeak'),
+(5, 8, 20577, 'Cannibalize'),
+(5, 8, 20579, 'Shadow Resistance'),
+(5, 8, 21651, 'Opening'),
+(5, 8, 21652, 'Closing'),
+(5, 8, 22027, 'Remove Insignia'),
+(5, 8, 22810, 'Opening - No Text'),
+(5, 8, 45927, 'Summon Friend'),
+(5, 8, 61437, 'Opening'),
+(5, 9, 81, 'Dodge'),
+(5, 9, 203, 'Unarmed'),
+(5, 9, 204, 'Defense'),
+(5, 9, 522, 'SPELLDEFENSE (DND)'),
+(5, 9, 669, 'Language Orcish'),
+(5, 9, 686, 'Shadow Bolt'),
+(5, 9, 687, 'Demon Skin'),
+(5, 9, 1180, 'Daggers'),
+(5, 9, 1843, 'Disarm'),
+(5, 9, 2382, 'Generic'),
+(5, 9, 2479, 'Honorless Target'),
+(5, 9, 3050, 'Detect'),
+(5, 9, 3365, 'Opening'),
+(5, 9, 5009, 'Wands'),
+(5, 9, 5019, 'Shoot'),
+(5, 9, 5227, 'Underwater Breathing'),
+(5, 9, 6233, 'Closing'),
+(5, 9, 6246, 'Closing'),
+(5, 9, 6247, 'Opening'),
+(5, 9, 6477, 'Opening'),
+(5, 9, 6478, 'Opening'),
+(5, 9, 6603, 'Attack'),
+(5, 9, 7266, 'Duel'),
+(5, 9, 7267, 'Grovel'),
+(5, 9, 7355, 'Stuck'),
+(5, 9, 7744, 'Will of the Forsaken'),
+(5, 9, 8386, 'Attacking'),
+(5, 9, 9078, 'Cloth'),
+(5, 9, 9125, 'Generic'),
+(5, 9, 17737, 'Language Gutterspeak'),
+(5, 9, 20577, 'Cannibalize'),
+(5, 9, 20579, 'Shadow Resistance'),
+(5, 9, 21651, 'Opening'),
+(5, 9, 21652, 'Closing'),
+(5, 9, 22027, 'Remove Insignia'),
+(5, 9, 22810, 'Opening - No Text'),
+(5, 9, 45927, 'Summon Friend'),
+(5, 9, 58284, 'Chaos Bolt Passive'),
+(5, 9, 61437, 'Opening'),
+(6, 1, 78, 'Heroic Strike'),
+(6, 1, 81, 'Dodge'),
+(6, 1, 107, 'Block'),
+(6, 1, 196, 'One-Handed Axes'),
+(6, 1, 198, 'One-Handed Maces'),
+(6, 1, 199, 'Two-Handed Maces'),
+(6, 1, 203, 'Unarmed'),
+(6, 1, 204, 'Defense'),
+(6, 1, 522, 'SPELLDEFENSE (DND)'),
+(6, 1, 669, 'Language Orcish'),
+(6, 1, 670, 'Language Taurahe'),
+(6, 1, 1843, 'Disarm'),
+(6, 1, 2382, 'Generic'),
+(6, 1, 2457, 'Battle Stance'),
+(6, 1, 2479, 'Honorless Target'),
+(6, 1, 3050, 'Detect'),
+(6, 1, 3365, 'Opening'),
+(6, 1, 5301, 'Defensive State (DND)'),
+(6, 1, 6233, 'Closing'),
+(6, 1, 6246, 'Closing'),
+(6, 1, 6247, 'Opening'),
+(6, 1, 6477, 'Opening'),
+(6, 1, 6478, 'Opening'),
+(6, 1, 6603, 'Attack'),
+(6, 1, 7266, 'Duel'),
+(6, 1, 7267, 'Grovel'),
+(6, 1, 7355, 'Stuck'),
+(6, 1, 8386, 'Attacking'),
+(6, 1, 8737, 'Mail'),
+(6, 1, 9077, 'Leather'),
+(6, 1, 9078, 'Cloth'),
+(6, 1, 9116, 'Shield'),
+(6, 1, 9125, 'Generic'),
+(6, 1, 20549, 'War Stomp'),
+(6, 1, 20550, 'Endurance'),
+(6, 1, 20551, 'Nature Resistance'),
+(6, 1, 20552, 'Cultivation'),
+(6, 1, 21651, 'Opening'),
+(6, 1, 21652, 'Closing'),
+(6, 1, 22027, 'Remove Insignia'),
+(6, 1, 22810, 'Opening - No Text'),
+(6, 1, 32215, 'Victorious State'),
+(6, 1, 45927, 'Summon Friend'),
+(6, 1, 61437, 'Opening'),
+(6, 3, 75, 'Auto Shot'),
+(6, 3, 81, 'Dodge'),
+(6, 3, 196, 'One-Handed Axes'),
+(6, 3, 203, 'Unarmed'),
+(6, 3, 204, 'Defense'),
+(6, 3, 266, 'Guns'),
+(6, 3, 522, 'SPELLDEFENSE (DND)'),
+(6, 3, 669, 'Language Orcish'),
+(6, 3, 670, 'Language Taurahe'),
+(6, 3, 1843, 'Disarm'),
+(6, 3, 2382, 'Generic'),
+(6, 3, 2479, 'Honorless Target'),
+(6, 3, 2973, 'Raptor Strike'),
+(6, 3, 3050, 'Detect'),
+(6, 3, 3365, 'Opening'),
+(6, 3, 6233, 'Closing'),
+(6, 3, 6246, 'Closing'),
+(6, 3, 6247, 'Opening'),
+(6, 3, 6477, 'Opening'),
+(6, 3, 6478, 'Opening'),
+(6, 3, 6603, 'Attack'),
+(6, 3, 7266, 'Duel'),
+(6, 3, 7267, 'Grovel'),
+(6, 3, 7355, 'Stuck'),
+(6, 3, 8386, 'Attacking'),
+(6, 3, 9077, 'Leather'),
+(6, 3, 9078, 'Cloth'),
+(6, 3, 9125, 'Generic'),
+(6, 3, 13358, 'Defensive State (DND)'),
+(6, 3, 20549, 'War Stomp'),
+(6, 3, 20550, 'Endurance'),
+(6, 3, 20551, 'Nature Resistance'),
+(6, 3, 20552, 'Cultivation'),
+(6, 3, 21651, 'Opening'),
+(6, 3, 21652, 'Closing'),
+(6, 3, 22027, 'Remove Insignia'),
+(6, 3, 22810, 'Opening - No Text'),
+(6, 3, 24949, 'Defensive State 2 (DND)'),
+(6, 3, 34082, 'Advantaged State (DND)'),
+(6, 3, 45927, 'Summon Friend'),
+(6, 3, 61437, 'Opening'),
+(6, 6, 81, 'Dodge'),
+(6, 6, 196, 'One-Handed Axes'),
+(6, 6, 197, 'Two-Handed Axes'),
+(6, 6, 200, 'Polearms'),
+(6, 6, 201, 'One-Handed Swords'),
+(6, 6, 202, 'Two-Handed Swords'),
+(6, 6, 203, 'Unarmed'),
+(6, 6, 204, 'Defense'),
+(6, 6, 522, 'SPELLDEFENSE (DND)'),
+(6, 6, 669, 'Language Orcish'),
+(6, 6, 670, 'Language Taurahe'),
+(6, 6, 674, 'Dual Wield'),
+(6, 6, 750, 'Plate Mail'),
+(6, 6, 1843, 'Disarm'),
+(6, 6, 2382, 'Generic'),
+(6, 6, 2479, 'Honorless Target'),
+(6, 6, 3050, 'Detect'),
+(6, 6, 3127, 'Parry'),
+(6, 6, 3275, 'Linen Bandage'),
+(6, 6, 3276, 'Heavy Linen Bandage'),
+(6, 6, 3277, 'Wool Bandage'),
+(6, 6, 3278, 'Heavy Wool Bandage'),
+(6, 6, 3365, 'Opening'),
+(6, 6, 6233, 'Closing'),
+(6, 6, 6246, 'Closing'),
+(6, 6, 6247, 'Opening'),
+(6, 6, 6477, 'Opening'),
+(6, 6, 6478, 'Opening'),
+(6, 6, 6603, 'Attack'),
+(6, 6, 7266, 'Duel'),
+(6, 6, 7267, 'Grovel'),
+(6, 6, 7355, 'Stuck'),
+(6, 6, 7928, 'Silk Bandage'),
+(6, 6, 7929, 'Heavy Silk Bandage'),
+(6, 6, 7934, 'Anti-Venom'),
+(6, 6, 8386, 'Attacking'),
+(6, 6, 8737, 'Mail'),
+(6, 6, 9077, 'Leather'),
+(6, 6, 9078, 'Cloth'),
+(6, 6, 9125, 'Generic'),
+(6, 6, 10840, 'Mageweave Bandage'),
+(6, 6, 10841, 'Heavy Mageweave Bandage'),
+(6, 6, 10846, 'First Aid'),
+(6, 6, 18629, 'Runecloth Bandage'),
+(6, 6, 18630, 'Heavy Runecloth Bandage'),
+(6, 6, 20549, 'War Stomp'),
+(6, 6, 20550, 'Endurance'),
+(6, 6, 20551, 'Nature Resistance'),
+(6, 6, 20552, 'Cultivation'),
+(6, 6, 21651, 'Opening'),
+(6, 6, 21652, 'Closing'),
+(6, 6, 22027, 'Remove Insignia'),
+(6, 6, 22810, 'Opening - No Text'),
+(6, 6, 33391, 'Journeyman Riding'),
+(6, 6, 45462, 'Plague Strike'),
+(6, 6, 45477, 'Icy Touch'),
+(6, 6, 45902, 'Blood Strike'),
+(6, 6, 45903, 'Offensive State (DND)'),
+(6, 6, 45927, 'Summon Friend'),
+(6, 6, 47541, 'Death Coil'),
+(6, 6, 48266, 'Blood Presence'),
+(6, 6, 49410, 'Forceful Deflection'),
+(6, 6, 49576, 'Death Grip'),
+(6, 6, 52665, 'Sigil'),
+(6, 6, 59879, 'Blood Plague'),
+(6, 6, 59921, 'Frost Fever'),
+(6, 6, 61437, 'Opening'),
+(6, 6, 61455, 'Runic Focus'),
+(6, 7, 81, 'Dodge'),
+(6, 7, 107, 'Block'),
+(6, 7, 198, 'One-Handed Maces'),
+(6, 7, 203, 'Unarmed'),
+(6, 7, 204, 'Defense'),
+(6, 7, 227, 'Staves'),
+(6, 7, 331, 'Healing Wave'),
+(6, 7, 403, 'Lightning Bolt'),
+(6, 7, 522, 'SPELLDEFENSE (DND)'),
+(6, 7, 669, 'Language Orcish'),
+(6, 7, 670, 'Language Taurahe'),
+(6, 7, 1843, 'Disarm'),
+(6, 7, 2382, 'Generic'),
+(6, 7, 2479, 'Honorless Target'),
+(6, 7, 3050, 'Detect'),
+(6, 7, 3365, 'Opening'),
+(6, 7, 6233, 'Closing'),
+(6, 7, 6246, 'Closing'),
+(6, 7, 6247, 'Opening'),
+(6, 7, 6477, 'Opening'),
+(6, 7, 6478, 'Opening'),
+(6, 7, 6603, 'Attack'),
+(6, 7, 7266, 'Duel'),
+(6, 7, 7267, 'Grovel'),
+(6, 7, 7355, 'Stuck'),
+(6, 7, 8386, 'Attacking'),
+(6, 7, 9077, 'Leather'),
+(6, 7, 9078, 'Cloth'),
+(6, 7, 9116, 'Shield'),
+(6, 7, 9125, 'Generic'),
+(6, 7, 20549, 'War Stomp'),
+(6, 7, 20550, 'Endurance'),
+(6, 7, 20551, 'Nature Resistance'),
+(6, 7, 20552, 'Cultivation'),
+(6, 7, 21651, 'Opening'),
+(6, 7, 21652, 'Closing'),
+(6, 7, 22027, 'Remove Insignia'),
+(6, 7, 22810, 'Opening - No Text'),
+(6, 7, 27763, 'Totem'),
+(6, 7, 45927, 'Summon Friend'),
+(6, 7, 61437, 'Opening'),
+(6, 11, 81, 'Dodge'),
+(6, 11, 198, 'One-Handed Maces'),
+(6, 11, 203, 'Unarmed'),
+(6, 11, 204, 'Defense'),
+(6, 11, 227, 'Staves'),
+(6, 11, 522, 'SPELLDEFENSE (DND)'),
+(6, 11, 669, 'Language Orcish'),
+(6, 11, 670, 'Language Taurahe'),
+(6, 11, 1843, 'Disarm'),
+(6, 11, 2382, 'Generic'),
+(6, 11, 2479, 'Honorless Target'),
+(6, 11, 3050, 'Detect'),
+(6, 11, 3365, 'Opening'),
+(6, 11, 5176, 'Wrath'),
+(6, 11, 5185, 'Healing Touch'),
+(6, 11, 6233, 'Closing'),
+(6, 11, 6246, 'Closing'),
+(6, 11, 6247, 'Opening'),
+(6, 11, 6477, 'Opening'),
+(6, 11, 6478, 'Opening'),
+(6, 11, 6603, 'Attack'),
+(6, 11, 7266, 'Duel'),
+(6, 11, 7267, 'Grovel'),
+(6, 11, 7355, 'Stuck'),
+(6, 11, 8386, 'Attacking'),
+(6, 11, 9077, 'Leather'),
+(6, 11, 9078, 'Cloth'),
+(6, 11, 9125, 'Generic'),
+(6, 11, 20549, 'War Stomp'),
+(6, 11, 20550, 'Endurance'),
+(6, 11, 20551, 'Nature Resistance'),
+(6, 11, 20552, 'Cultivation'),
+(6, 11, 21651, 'Opening'),
+(6, 11, 21652, 'Closing'),
+(6, 11, 22027, 'Remove Insignia'),
+(6, 11, 22810, 'Opening - No Text'),
+(6, 11, 27764, 'Fetish'),
+(6, 11, 45927, 'Summon Friend'),
+(6, 11, 61437, 'Opening'),
+(7, 1, 78, 'Heroic Strike'),
+(7, 1, 81, 'Dodge'),
+(7, 1, 107, 'Block'),
+(7, 1, 198, 'One-Handed Maces'),
+(7, 1, 201, 'One-Handed Swords'),
+(7, 1, 203, 'Unarmed'),
+(7, 1, 204, 'Defense'),
+(7, 1, 522, 'SPELLDEFENSE (DND)'),
+(7, 1, 668, 'Language Common'),
+(7, 1, 1180, 'Daggers'),
+(7, 1, 1843, 'Disarm'),
+(7, 1, 2382, 'Generic'),
+(7, 1, 2457, 'Battle Stance'),
+(7, 1, 2479, 'Honorless Target'),
+(7, 1, 3050, 'Detect'),
+(7, 1, 3365, 'Opening'),
+(7, 1, 5301, 'Defensive State (DND)'),
+(7, 1, 6233, 'Closing'),
+(7, 1, 6246, 'Closing'),
+(7, 1, 6247, 'Opening'),
+(7, 1, 6477, 'Opening'),
+(7, 1, 6478, 'Opening'),
+(7, 1, 6603, 'Attack'),
+(7, 1, 7266, 'Duel'),
+(7, 1, 7267, 'Grovel'),
+(7, 1, 7340, 'Language Gnomish'),
+(7, 1, 7355, 'Stuck'),
+(7, 1, 8386, 'Attacking'),
+(7, 1, 8737, 'Mail'),
+(7, 1, 9077, 'Leather'),
+(7, 1, 9078, 'Cloth'),
+(7, 1, 9116, 'Shield'),
+(7, 1, 9125, 'Generic'),
+(7, 1, 20589, 'Escape Artist'),
+(7, 1, 20591, 'Expansive Mind'),
+(7, 1, 20592, 'Arcane Resistance'),
+(7, 1, 20593, 'Engineering Specialization'),
+(7, 1, 21651, 'Opening'),
+(7, 1, 21652, 'Closing'),
+(7, 1, 22027, 'Remove Insignia'),
+(7, 1, 22810, 'Opening - No Text'),
+(7, 1, 32215, 'Victorious State'),
+(7, 1, 45927, 'Summon Friend'),
+(7, 1, 61437, 'Opening'),
+(7, 4, 81, 'Dodge'),
+(7, 4, 203, 'Unarmed'),
+(7, 4, 204, 'Defense'),
+(7, 4, 522, 'SPELLDEFENSE (DND)'),
+(7, 4, 668, 'Language Common'),
+(7, 4, 1180, 'Daggers'),
+(7, 4, 1752, 'Sinister Strike'),
+(7, 4, 1843, 'Disarm'),
+(7, 4, 2098, 'Eviscerate'),
+(7, 4, 2382, 'Generic'),
+(7, 4, 2479, 'Honorless Target'),
+(7, 4, 2567, 'Thrown'),
+(7, 4, 2764, 'Throw'),
+(7, 4, 3050, 'Detect'),
+(7, 4, 3365, 'Opening'),
+(7, 4, 6233, 'Closing'),
+(7, 4, 6246, 'Closing'),
+(7, 4, 6247, 'Opening'),
+(7, 4, 6477, 'Opening'),
+(7, 4, 6478, 'Opening'),
+(7, 4, 6603, 'Attack'),
+(7, 4, 7266, 'Duel'),
+(7, 4, 7267, 'Grovel'),
+(7, 4, 7340, 'Language Gnomish'),
+(7, 4, 7355, 'Stuck'),
+(7, 4, 8386, 'Attacking'),
+(7, 4, 9077, 'Leather'),
+(7, 4, 9078, 'Cloth'),
+(7, 4, 9125, 'Generic'),
+(7, 4, 16092, 'Defensive State (DND)'),
+(7, 4, 20589, 'Escape Artist'),
+(7, 4, 20591, 'Expansive Mind'),
+(7, 4, 20592, 'Arcane Resistance'),
+(7, 4, 20593, 'Engineering Specialization'),
+(7, 4, 21184, 'Rogue Passive (DND)'),
+(7, 4, 21651, 'Opening'),
+(7, 4, 21652, 'Closing'),
+(7, 4, 22027, 'Remove Insignia'),
+(7, 4, 22810, 'Opening - No Text'),
+(7, 4, 45927, 'Summon Friend'),
+(7, 4, 61437, 'Opening'),
+(7, 6, 81, 'Dodge'),
+(7, 6, 196, 'One-Handed Axes'),
+(7, 6, 197, 'Two-Handed Axes'),
+(7, 6, 200, 'Polearms'),
+(7, 6, 201, 'One-Handed Swords'),
+(7, 6, 202, 'Two-Handed Swords'),
+(7, 6, 203, 'Unarmed'),
+(7, 6, 204, 'Defense'),
+(7, 6, 522, 'SPELLDEFENSE (DND)'),
+(7, 6, 668, 'Language Common'),
+(7, 6, 674, 'Dual Wield'),
+(7, 6, 750, 'Plate Mail'),
+(7, 6, 1843, 'Disarm'),
+(7, 6, 2382, 'Generic'),
+(7, 6, 2479, 'Honorless Target'),
+(7, 6, 3050, 'Detect'),
+(7, 6, 3127, 'Parry'),
+(7, 6, 3275, 'Linen Bandage'),
+(7, 6, 3276, 'Heavy Linen Bandage'),
+(7, 6, 3277, 'Wool Bandage'),
+(7, 6, 3278, 'Heavy Wool Bandage'),
+(7, 6, 3365, 'Opening'),
+(7, 6, 6233, 'Closing'),
+(7, 6, 6246, 'Closing'),
+(7, 6, 6247, 'Opening'),
+(7, 6, 6477, 'Opening'),
+(7, 6, 6478, 'Opening'),
+(7, 6, 6603, 'Attack'),
+(7, 6, 7266, 'Duel'),
+(7, 6, 7267, 'Grovel'),
+(7, 6, 7340, 'Language Gnomish'),
+(7, 6, 7355, 'Stuck'),
+(7, 6, 7928, 'Silk Bandage'),
+(7, 6, 7929, 'Heavy Silk Bandage'),
+(7, 6, 7934, 'Anti-Venom'),
+(7, 6, 8386, 'Attacking'),
+(7, 6, 8737, 'Mail'),
+(7, 6, 9077, 'Leather'),
+(7, 6, 9078, 'Cloth'),
+(7, 6, 9125, 'Generic'),
+(7, 6, 10840, 'Mageweave Bandage'),
+(7, 6, 10841, 'Heavy Mageweave Bandage'),
+(7, 6, 10846, 'First Aid'),
+(7, 6, 18629, 'Runecloth Bandage'),
+(7, 6, 18630, 'Heavy Runecloth Bandage'),
+(7, 6, 20589, 'Escape Artist'),
+(7, 6, 20591, 'Expansive Mind'),
+(7, 6, 20592, 'Arcane Resistance'),
+(7, 6, 20593, 'Engineering Specialization'),
+(7, 6, 21651, 'Opening'),
+(7, 6, 21652, 'Closing'),
+(7, 6, 22027, 'Remove Insignia'),
+(7, 6, 22810, 'Opening - No Text'),
+(7, 6, 33391, 'Journeyman Riding'),
+(7, 6, 45462, 'Plague Strike'),
+(7, 6, 45477, 'Icy Touch'),
+(7, 6, 45902, 'Blood Strike'),
+(7, 6, 45903, 'Offensive State (DND)'),
+(7, 6, 45927, 'Summon Friend'),
+(7, 6, 47541, 'Death Coil'),
+(7, 6, 48266, 'Blood Presence'),
+(7, 6, 49410, 'Forceful Deflection'),
+(7, 6, 49576, 'Death Grip'),
+(7, 6, 52665, 'Sigil'),
+(7, 6, 59879, 'Blood Plague'),
+(7, 6, 59921, 'Frost Fever'),
+(7, 6, 61437, 'Opening'),
+(7, 6, 61455, 'Runic Focus'),
+(7, 8, 81, 'Dodge'),
+(7, 8, 133, 'Fireball'),
+(7, 8, 168, 'Frost Armor'),
+(7, 8, 203, 'Unarmed'),
+(7, 8, 204, 'Defense'),
+(7, 8, 227, 'Staves'),
+(7, 8, 522, 'SPELLDEFENSE (DND)'),
+(7, 8, 668, 'Language Common'),
+(7, 8, 1843, 'Disarm'),
+(7, 8, 2382, 'Generic'),
+(7, 8, 2479, 'Honorless Target'),
+(7, 8, 3050, 'Detect'),
+(7, 8, 3365, 'Opening'),
+(7, 8, 5009, 'Wands'),
+(7, 8, 5019, 'Shoot'),
+(7, 8, 6233, 'Closing'),
+(7, 8, 6246, 'Closing'),
+(7, 8, 6247, 'Opening'),
+(7, 8, 6477, 'Opening'),
+(7, 8, 6478, 'Opening'),
+(7, 8, 6603, 'Attack'),
+(7, 8, 7266, 'Duel'),
+(7, 8, 7267, 'Grovel'),
+(7, 8, 7340, 'Language Gnomish'),
+(7, 8, 7355, 'Stuck'),
+(7, 8, 8386, 'Attacking'),
+(7, 8, 9078, 'Cloth'),
+(7, 8, 9125, 'Generic'),
+(7, 8, 20589, 'Escape Artist'),
+(7, 8, 20591, 'Expansive Mind'),
+(7, 8, 20592, 'Arcane Resistance'),
+(7, 8, 20593, 'Engineering Specialization'),
+(7, 8, 21651, 'Opening'),
+(7, 8, 21652, 'Closing'),
+(7, 8, 22027, 'Remove Insignia'),
+(7, 8, 22810, 'Opening - No Text'),
+(7, 8, 45927, 'Summon Friend'),
+(7, 8, 61437, 'Opening'),
+(7, 9, 81, 'Dodge'),
+(7, 9, 203, 'Unarmed'),
+(7, 9, 204, 'Defense'),
+(7, 9, 522, 'SPELLDEFENSE (DND)'),
+(7, 9, 668, 'Language Common'),
+(7, 9, 686, 'Shadow Bolt'),
+(7, 9, 687, 'Demon Skin'),
+(7, 9, 1180, 'Daggers'),
+(7, 9, 1843, 'Disarm'),
+(7, 9, 2382, 'Generic'),
+(7, 9, 2479, 'Honorless Target'),
+(7, 9, 3050, 'Detect'),
+(7, 9, 3365, 'Opening'),
+(7, 9, 5009, 'Wands'),
+(7, 9, 5019, 'Shoot'),
+(7, 9, 6233, 'Closing'),
+(7, 9, 6246, 'Closing'),
+(7, 9, 6247, 'Opening'),
+(7, 9, 6477, 'Opening'),
+(7, 9, 6478, 'Opening'),
+(7, 9, 6603, 'Attack'),
+(7, 9, 7266, 'Duel'),
+(7, 9, 7267, 'Grovel'),
+(7, 9, 7340, 'Language Gnomish'),
+(7, 9, 7355, 'Stuck'),
+(7, 9, 8386, 'Attacking'),
+(7, 9, 9078, 'Cloth'),
+(7, 9, 9125, 'Generic'),
+(7, 9, 20589, 'Escape Artist'),
+(7, 9, 20591, 'Expansive Mind'),
+(7, 9, 20592, 'Arcane Resistance'),
+(7, 9, 20593, 'Engineering Specialization'),
+(7, 9, 21651, 'Opening'),
+(7, 9, 21652, 'Closing'),
+(7, 9, 22027, 'Remove Insignia'),
+(7, 9, 22810, 'Opening - No Text'),
+(7, 9, 45927, 'Summon Friend'),
+(7, 9, 58284, 'Chaos Bolt Passive'),
+(7, 9, 61437, 'Opening'),
+(8, 1, 78, 'Heroic Strike'),
+(8, 1, 81, 'Dodge'),
+(8, 1, 107, 'Block'),
+(8, 1, 196, 'One-Handed Axes'),
+(8, 1, 203, 'Unarmed'),
+(8, 1, 204, 'Defense'),
+(8, 1, 522, 'SPELLDEFENSE (DND)'),
+(8, 1, 669, 'Language Orcish'),
+(8, 1, 1180, 'Daggers'),
+(8, 1, 1843, 'Disarm'),
+(8, 1, 2382, 'Generic'),
+(8, 1, 2457, 'Battle Stance'),
+(8, 1, 2479, 'Honorless Target'),
+(8, 1, 2567, 'Thrown'),
+(8, 1, 2764, 'Throw'),
+(8, 1, 3050, 'Detect'),
+(8, 1, 3365, 'Opening'),
+(8, 1, 5301, 'Defensive State (DND)'),
+(8, 1, 6233, 'Closing'),
+(8, 1, 6246, 'Closing'),
+(8, 1, 6247, 'Opening'),
+(8, 1, 6477, 'Opening'),
+(8, 1, 6478, 'Opening'),
+(8, 1, 6603, 'Attack'),
+(8, 1, 7266, 'Duel'),
+(8, 1, 7267, 'Grovel'),
+(8, 1, 7341, 'Language Troll'),
+(8, 1, 7355, 'Stuck'),
+(8, 1, 8386, 'Attacking'),
+(8, 1, 8737, 'Mail'),
+(8, 1, 9077, 'Leather'),
+(8, 1, 9078, 'Cloth'),
+(8, 1, 9116, 'Shield'),
+(8, 1, 9125, 'Generic'),
+(8, 1, 20555, 'Regeneration'),
+(8, 1, 20557, 'Beast Slaying');
+INSERT IGNORE INTO `playercreateinfo_spell` (`race`, `class`, `Spell`, `Note`) VALUES
+(8, 1, 20558, 'Throwing Specialization'),
+(8, 1, 21651, 'Opening'),
+(8, 1, 21652, 'Closing'),
+(8, 1, 22027, 'Remove Insignia'),
+(8, 1, 22810, 'Opening - No Text'),
+(8, 1, 26290, 'Bow Specialization'),
+(8, 1, 26296, 'Berserking'),
+(8, 1, 32215, 'Victorious State'),
+(8, 1, 45927, 'Summon Friend'),
+(8, 1, 58943, 'Da Voodoo Shuffle'),
+(8, 1, 61437, 'Opening'),
+(8, 3, 75, 'Auto Shot'),
+(8, 3, 81, 'Dodge'),
+(8, 3, 196, 'One-Handed Axes'),
+(8, 3, 203, 'Unarmed'),
+(8, 3, 204, 'Defense'),
+(8, 3, 264, 'Bows'),
+(8, 3, 522, 'SPELLDEFENSE (DND)'),
+(8, 3, 669, 'Language Orcish'),
+(8, 3, 1843, 'Disarm'),
+(8, 3, 2382, 'Generic'),
+(8, 3, 2479, 'Honorless Target'),
+(8, 3, 2973, 'Raptor Strike'),
+(8, 3, 3050, 'Detect'),
+(8, 3, 3365, 'Opening'),
+(8, 3, 6233, 'Closing'),
+(8, 3, 6246, 'Closing'),
+(8, 3, 6247, 'Opening'),
+(8, 3, 6477, 'Opening'),
+(8, 3, 6478, 'Opening'),
+(8, 3, 6603, 'Attack'),
+(8, 3, 7266, 'Duel'),
+(8, 3, 7267, 'Grovel'),
+(8, 3, 7341, 'Language Troll'),
+(8, 3, 7355, 'Stuck'),
+(8, 3, 8386, 'Attacking'),
+(8, 3, 9077, 'Leather'),
+(8, 3, 9078, 'Cloth'),
+(8, 3, 9125, 'Generic'),
+(8, 3, 13358, 'Defensive State (DND)'),
+(8, 3, 20554, 'Berserking'),
+(8, 3, 20555, 'Regeneration'),
+(8, 3, 20557, 'Beast Slaying'),
+(8, 3, 20558, 'Throwing Specialization'),
+(8, 3, 21651, 'Opening'),
+(8, 3, 21652, 'Closing'),
+(8, 3, 22027, 'Remove Insignia'),
+(8, 3, 22810, 'Opening - No Text'),
+(8, 3, 24949, 'Defensive State 2 (DND)'),
+(8, 3, 26290, 'Bow Specialization'),
+(8, 3, 34082, 'Advantaged State (DND)'),
+(8, 3, 45927, 'Summon Friend'),
+(8, 3, 58943, 'Da Voodoo Shuffle'),
+(8, 3, 61437, 'Opening'),
+(8, 4, 81, 'Dodge'),
+(8, 4, 203, 'Unarmed'),
+(8, 4, 204, 'Defense'),
+(8, 4, 522, 'SPELLDEFENSE (DND)'),
+(8, 4, 669, 'Language Orcish'),
+(8, 4, 1180, 'Daggers'),
+(8, 4, 1752, 'Sinister Strike'),
+(8, 4, 1843, 'Disarm'),
+(8, 4, 2098, 'Eviscerate'),
+(8, 4, 2382, 'Generic'),
+(8, 4, 2479, 'Honorless Target'),
+(8, 4, 2567, 'Thrown'),
+(8, 4, 2764, 'Throw'),
+(8, 4, 3050, 'Detect'),
+(8, 4, 3365, 'Opening'),
+(8, 4, 6233, 'Closing'),
+(8, 4, 6246, 'Closing'),
+(8, 4, 6247, 'Opening'),
+(8, 4, 6477, 'Opening'),
+(8, 4, 6478, 'Opening'),
+(8, 4, 6603, 'Attack'),
+(8, 4, 7266, 'Duel'),
+(8, 4, 7267, 'Grovel'),
+(8, 4, 7341, 'Language Troll'),
+(8, 4, 7355, 'Stuck'),
+(8, 4, 8386, 'Attacking'),
+(8, 4, 9077, 'Leather'),
+(8, 4, 9078, 'Cloth'),
+(8, 4, 9125, 'Generic'),
+(8, 4, 16092, 'Defensive State (DND)'),
+(8, 4, 20555, 'Regeneration'),
+(8, 4, 20557, 'Beast Slaying'),
+(8, 4, 20558, 'Throwing Specialization'),
+(8, 4, 21184, 'Rogue Passive (DND)'),
+(8, 4, 21651, 'Opening'),
+(8, 4, 21652, 'Closing'),
+(8, 4, 22027, 'Remove Insignia'),
+(8, 4, 22810, 'Opening - No Text'),
+(8, 4, 26290, 'Bow Specialization'),
+(8, 4, 26297, 'Berserking'),
+(8, 4, 45927, 'Summon Friend'),
+(8, 4, 58943, 'Da Voodoo Shuffle'),
+(8, 4, 61437, 'Opening'),
+(8, 5, 81, 'Dodge'),
+(8, 5, 198, 'One-Handed Maces'),
+(8, 5, 203, 'Unarmed'),
+(8, 5, 204, 'Defense'),
+(8, 5, 522, 'SPELLDEFENSE (DND)'),
+(8, 5, 585, 'Smite'),
+(8, 5, 669, 'Language Orcish'),
+(8, 5, 1843, 'Disarm'),
+(8, 5, 2050, 'Lesser Heal'),
+(8, 5, 2382, 'Generic'),
+(8, 5, 2479, 'Honorless Target'),
+(8, 5, 3050, 'Detect'),
+(8, 5, 3365, 'Opening'),
+(8, 5, 5009, 'Wands'),
+(8, 5, 5019, 'Shoot'),
+(8, 5, 6233, 'Closing'),
+(8, 5, 6246, 'Closing'),
+(8, 5, 6247, 'Opening'),
+(8, 5, 6477, 'Opening'),
+(8, 5, 6478, 'Opening'),
+(8, 5, 6603, 'Attack'),
+(8, 5, 7266, 'Duel'),
+(8, 5, 7267, 'Grovel'),
+(8, 5, 7341, 'Language Troll'),
+(8, 5, 7355, 'Stuck'),
+(8, 5, 8386, 'Attacking'),
+(8, 5, 9078, 'Cloth'),
+(8, 5, 9125, 'Generic'),
+(8, 5, 20554, 'Berserking'),
+(8, 5, 20555, 'Regeneration'),
+(8, 5, 20557, 'Beast Slaying'),
+(8, 5, 20558, 'Throwing Specialization'),
+(8, 5, 21651, 'Opening'),
+(8, 5, 21652, 'Closing'),
+(8, 5, 22027, 'Remove Insignia'),
+(8, 5, 22810, 'Opening - No Text'),
+(8, 5, 26290, 'Bow Specialization'),
+(8, 5, 45927, 'Summon Friend'),
+(8, 5, 58943, 'Da Voodoo Shuffle'),
+(8, 5, 61437, 'Opening'),
+(8, 6, 81, 'Dodge'),
+(8, 6, 196, 'One-Handed Axes'),
+(8, 6, 197, 'Two-Handed Axes'),
+(8, 6, 200, 'Polearms'),
+(8, 6, 201, 'One-Handed Swords'),
+(8, 6, 202, 'Two-Handed Swords'),
+(8, 6, 203, 'Unarmed'),
+(8, 6, 204, 'Defense'),
+(8, 6, 522, 'SPELLDEFENSE (DND)'),
+(8, 6, 669, 'Language Orcish'),
+(8, 6, 674, 'Dual Wield'),
+(8, 6, 750, 'Plate Mail'),
+(8, 6, 1843, 'Disarm'),
+(8, 6, 2382, 'Generic'),
+(8, 6, 2479, 'Honorless Target'),
+(8, 6, 3050, 'Detect'),
+(8, 6, 3127, 'Parry'),
+(8, 6, 3275, 'Linen Bandage'),
+(8, 6, 3276, 'Heavy Linen Bandage'),
+(8, 6, 3277, 'Wool Bandage'),
+(8, 6, 3278, 'Heavy Wool Bandage'),
+(8, 6, 3365, 'Opening'),
+(8, 6, 6233, 'Closing'),
+(8, 6, 6246, 'Closing'),
+(8, 6, 6247, 'Opening'),
+(8, 6, 6477, 'Opening'),
+(8, 6, 6478, 'Opening'),
+(8, 6, 6603, 'Attack'),
+(8, 6, 7266, 'Duel'),
+(8, 6, 7267, 'Grovel'),
+(8, 6, 7341, 'Language Troll'),
+(8, 6, 7355, 'Stuck'),
+(8, 6, 7928, 'Silk Bandage'),
+(8, 6, 7929, 'Heavy Silk Bandage'),
+(8, 6, 7934, 'Anti-Venom'),
+(8, 6, 8386, 'Attacking'),
+(8, 6, 8737, 'Mail'),
+(8, 6, 9077, 'Leather'),
+(8, 6, 9078, 'Cloth'),
+(8, 6, 9125, 'Generic'),
+(8, 6, 10840, 'Mageweave Bandage'),
+(8, 6, 10841, 'Heavy Mageweave Bandage'),
+(8, 6, 10846, 'First Aid'),
+(8, 6, 18629, 'Runecloth Bandage'),
+(8, 6, 18630, 'Heavy Runecloth Bandage'),
+(8, 6, 20555, 'Regeneration'),
+(8, 6, 20557, 'Beast Slaying'),
+(8, 6, 20558, 'Throwing Specialization'),
+(8, 6, 21651, 'Opening'),
+(8, 6, 21652, 'Closing'),
+(8, 6, 22027, 'Remove Insignia'),
+(8, 6, 22810, 'Opening - No Text'),
+(8, 6, 26290, 'Bow Specialization'),
+(8, 6, 33391, 'Journeyman Riding'),
+(8, 6, 45462, 'Plague Strike'),
+(8, 6, 45477, 'Icy Touch'),
+(8, 6, 45902, 'Blood Strike'),
+(8, 6, 45903, 'Offensive State (DND)'),
+(8, 6, 45927, 'Summon Friend'),
+(8, 6, 47541, 'Death Coil'),
+(8, 6, 48266, 'Blood Presence'),
+(8, 6, 49410, 'Forceful Deflection'),
+(8, 6, 49576, 'Death Grip'),
+(8, 6, 50621, 'Berserking'),
+(8, 6, 52665, 'Sigil'),
+(8, 6, 58943, 'Da Voodoo Shuffle'),
+(8, 6, 59879, 'Blood Plague'),
+(8, 6, 59921, 'Frost Fever'),
+(8, 6, 61437, 'Opening'),
+(8, 6, 61455, 'Runic Focus'),
+(8, 7, 81, 'Dodge'),
+(8, 7, 107, 'Block'),
+(8, 7, 198, 'One-Handed Maces'),
+(8, 7, 203, 'Unarmed'),
+(8, 7, 204, 'Defense'),
+(8, 7, 227, 'Staves'),
+(8, 7, 331, 'Healing Wave'),
+(8, 7, 403, 'Lightning Bolt'),
+(8, 7, 522, 'SPELLDEFENSE (DND)'),
+(8, 7, 669, 'Language Orcish'),
+(8, 7, 1843, 'Disarm'),
+(8, 7, 2382, 'Generic'),
+(8, 7, 2479, 'Honorless Target'),
+(8, 7, 3050, 'Detect'),
+(8, 7, 3365, 'Opening'),
+(8, 7, 6233, 'Closing'),
+(8, 7, 6246, 'Closing'),
+(8, 7, 6247, 'Opening'),
+(8, 7, 6477, 'Opening'),
+(8, 7, 6478, 'Opening'),
+(8, 7, 6603, 'Attack'),
+(8, 7, 7266, 'Duel'),
+(8, 7, 7267, 'Grovel'),
+(8, 7, 7341, 'Language Troll'),
+(8, 7, 7355, 'Stuck'),
+(8, 7, 8386, 'Attacking'),
+(8, 7, 9077, 'Leather'),
+(8, 7, 9078, 'Cloth'),
+(8, 7, 9116, 'Shield'),
+(8, 7, 9125, 'Generic'),
+(8, 7, 20554, 'Berserking'),
+(8, 7, 20555, 'Regeneration'),
+(8, 7, 20557, 'Beast Slaying'),
+(8, 7, 20558, 'Throwing Specialization'),
+(8, 7, 21651, 'Opening'),
+(8, 7, 21652, 'Closing'),
+(8, 7, 22027, 'Remove Insignia'),
+(8, 7, 22810, 'Opening - No Text'),
+(8, 7, 26290, 'Bow Specialization'),
+(8, 7, 27763, 'Totem'),
+(8, 7, 45927, 'Summon Friend'),
+(8, 7, 58943, 'Da Voodoo Shuffle'),
+(8, 7, 61437, 'Opening'),
+(8, 8, 81, 'Dodge'),
+(8, 8, 133, 'Fireball'),
+(8, 8, 168, 'Frost Armor'),
+(8, 8, 203, 'Unarmed'),
+(8, 8, 204, 'Defense'),
+(8, 8, 227, 'Staves'),
+(8, 8, 522, 'SPELLDEFENSE (DND)'),
+(8, 8, 669, 'Language Orcish'),
+(8, 8, 1843, 'Disarm'),
+(8, 8, 2382, 'Generic'),
+(8, 8, 2479, 'Honorless Target'),
+(8, 8, 3050, 'Detect'),
+(8, 8, 3365, 'Opening'),
+(8, 8, 5009, 'Wands'),
+(8, 8, 5019, 'Shoot'),
+(8, 8, 6233, 'Closing'),
+(8, 8, 6246, 'Closing'),
+(8, 8, 6247, 'Opening'),
+(8, 8, 6477, 'Opening'),
+(8, 8, 6478, 'Opening'),
+(8, 8, 6603, 'Attack'),
+(8, 8, 7266, 'Duel'),
+(8, 8, 7267, 'Grovel'),
+(8, 8, 7341, 'Language Troll'),
+(8, 8, 7355, 'Stuck'),
+(8, 8, 8386, 'Attacking'),
+(8, 8, 9078, 'Cloth'),
+(8, 8, 9125, 'Generic'),
+(8, 8, 20554, 'Berserking'),
+(8, 8, 20555, 'Regeneration'),
+(8, 8, 20557, 'Beast Slaying'),
+(8, 8, 20558, 'Throwing Specialization'),
+(8, 8, 21651, 'Opening'),
+(8, 8, 21652, 'Closing'),
+(8, 8, 22027, 'Remove Insignia'),
+(8, 8, 22810, 'Opening - No Text'),
+(8, 8, 26290, 'Bow Specialization'),
+(8, 8, 45927, 'Summon Friend'),
+(8, 8, 58943, 'Da Voodoo Shuffle'),
+(8, 8, 61437, 'Opening'),
+(10, 2, 81, 'Dodge'),
+(10, 2, 107, 'Block'),
+(10, 2, 201, 'One-Handed Swords'),
+(10, 2, 202, 'Two-Handed Swords'),
+(10, 2, 203, 'Unarmed'),
+(10, 2, 204, 'Defense'),
+(10, 2, 522, 'SPELLDEFENSE (DND)'),
+(10, 2, 635, 'Holy Light'),
+(10, 2, 669, 'Language Orcish'),
+(10, 2, 813, 'Language Thalassian'),
+(10, 2, 822, 'Magic Resistance'),
+(10, 2, 2382, 'Generic'),
+(10, 2, 2479, 'Honorless Target'),
+(10, 2, 3050, 'Detect'),
+(10, 2, 3365, 'Opening'),
+(10, 2, 6233, 'Closing'),
+(10, 2, 6246, 'Closing'),
+(10, 2, 6247, 'Opening'),
+(10, 2, 6477, 'Opening'),
+(10, 2, 6478, 'Opening'),
+(10, 2, 6603, 'Attack'),
+(10, 2, 7266, 'Duel'),
+(10, 2, 7267, 'Grovel'),
+(10, 2, 7355, 'Stuck'),
+(10, 2, 8386, 'Attacking'),
+(10, 2, 8737, 'Mail'),
+(10, 2, 9077, 'Leather'),
+(10, 2, 9078, 'Cloth'),
+(10, 2, 9116, 'Shield'),
+(10, 2, 9125, 'Generic'),
+(10, 2, 21084, 'Seal of Righteousness'),
+(10, 2, 21651, 'Opening'),
+(10, 2, 21652, 'Closing'),
+(10, 2, 22027, 'Remove Insignia'),
+(10, 2, 22810, 'Opening - No Text'),
+(10, 2, 27762, 'Libram'),
+(10, 2, 28730, 'Arcane Torrent'),
+(10, 2, 28734, 'Mana Tap'),
+(10, 2, 28877, 'Arcane Affinity'),
+(10, 3, 75, 'Auto Shot'),
+(10, 3, 81, 'Dodge'),
+(10, 3, 203, 'Unarmed'),
+(10, 3, 204, 'Defense'),
+(10, 3, 264, 'Bows'),
+(10, 3, 522, 'SPELLDEFENSE (DND)'),
+(10, 3, 669, 'Language Orcish'),
+(10, 3, 813, 'Language Thalassian'),
+(10, 3, 822, 'Magic Resistance'),
+(10, 3, 1180, 'Daggers'),
+(10, 3, 2382, 'Generic'),
+(10, 3, 2479, 'Honorless Target'),
+(10, 3, 2973, 'Raptor Strike'),
+(10, 3, 3050, 'Detect'),
+(10, 3, 3365, 'Opening'),
+(10, 3, 6233, 'Closing'),
+(10, 3, 6246, 'Closing'),
+(10, 3, 6247, 'Opening'),
+(10, 3, 6477, 'Opening'),
+(10, 3, 6478, 'Opening'),
+(10, 3, 6603, 'Attack'),
+(10, 3, 7266, 'Duel'),
+(10, 3, 7267, 'Grovel'),
+(10, 3, 7355, 'Stuck'),
+(10, 3, 8386, 'Attacking'),
+(10, 3, 9077, 'Leather'),
+(10, 3, 9078, 'Cloth'),
+(10, 3, 9125, 'Generic'),
+(10, 3, 13358, 'Defensive State (DND)'),
+(10, 3, 21651, 'Opening'),
+(10, 3, 21652, 'Closing'),
+(10, 3, 22027, 'Remove Insignia'),
+(10, 3, 22810, 'Opening - No Text'),
+(10, 3, 24949, 'Defensive State 2 (DND)'),
+(10, 3, 28730, 'Arcane Torrent'),
+(10, 3, 28734, 'Mana Tap'),
+(10, 3, 28877, 'Arcane Affinity'),
+(10, 3, 34082, 'Advantaged State (DND)'),
+(10, 4, 81, 'Dodge'),
+(10, 4, 203, 'Unarmed'),
+(10, 4, 204, 'Defense'),
+(10, 4, 522, 'SPELLDEFENSE (DND)'),
+(10, 4, 669, 'Language Orcish'),
+(10, 4, 813, 'Language Thalassian'),
+(10, 4, 822, 'Magic Resistance'),
+(10, 4, 1180, 'Daggers'),
+(10, 4, 1752, 'Sinister Strike'),
+(10, 4, 2098, 'Eviscerate'),
+(10, 4, 2382, 'Generic'),
+(10, 4, 2479, 'Honorless Target'),
+(10, 4, 2567, 'Thrown'),
+(10, 4, 2764, 'Throw'),
+(10, 4, 3050, 'Detect'),
+(10, 4, 3365, 'Opening'),
+(10, 4, 6233, 'Closing'),
+(10, 4, 6246, 'Closing'),
+(10, 4, 6247, 'Opening'),
+(10, 4, 6477, 'Opening'),
+(10, 4, 6478, 'Opening'),
+(10, 4, 6603, 'Attack'),
+(10, 4, 7266, 'Duel'),
+(10, 4, 7267, 'Grovel'),
+(10, 4, 7355, 'Stuck'),
+(10, 4, 8386, 'Attacking'),
+(10, 4, 9077, 'Leather'),
+(10, 4, 9078, 'Cloth'),
+(10, 4, 9125, 'Generic'),
+(10, 4, 16092, 'Defensive State (DND)'),
+(10, 4, 21184, 'Rogue Passive (DND)'),
+(10, 4, 21651, 'Opening'),
+(10, 4, 21652, 'Closing'),
+(10, 4, 22027, 'Remove Insignia'),
+(10, 4, 22810, 'Opening - No Text'),
+(10, 4, 25046, 'Arcane Torrent'),
+(10, 4, 28734, 'Mana Tap'),
+(10, 4, 28877, 'Arcane Affinity'),
+(10, 5, 81, 'Dodge'),
+(10, 5, 198, 'One-Handed Maces'),
+(10, 5, 203, 'Unarmed'),
+(10, 5, 204, 'Defense'),
+(10, 5, 522, 'SPELLDEFENSE (DND)'),
+(10, 5, 585, 'Smite'),
+(10, 5, 669, 'Language Orcish'),
+(10, 5, 813, 'Language Thalassian'),
+(10, 5, 822, 'Magic Resistance'),
+(10, 5, 2050, 'Lesser Heal'),
+(10, 5, 2382, 'Generic'),
+(10, 5, 2479, 'Honorless Target'),
+(10, 5, 3050, 'Detect'),
+(10, 5, 3365, 'Opening'),
+(10, 5, 5009, 'Wands'),
+(10, 5, 5019, 'Shoot'),
+(10, 5, 6233, 'Closing'),
+(10, 5, 6246, 'Closing'),
+(10, 5, 6247, 'Opening'),
+(10, 5, 6477, 'Opening'),
+(10, 5, 6478, 'Opening'),
+(10, 5, 6603, 'Attack'),
+(10, 5, 7266, 'Duel'),
+(10, 5, 7267, 'Grovel'),
+(10, 5, 7355, 'Stuck'),
+(10, 5, 8386, 'Attacking'),
+(10, 5, 9078, 'Cloth'),
+(10, 5, 9125, 'Generic'),
+(10, 5, 21651, 'Opening'),
+(10, 5, 21652, 'Closing'),
+(10, 5, 22027, 'Remove Insignia'),
+(10, 5, 22810, 'Opening - No Text'),
+(10, 5, 28730, 'Arcane Torrent'),
+(10, 5, 28734, 'Mana Tap'),
+(10, 5, 28877, 'Arcane Affinity'),
+(10, 6, 81, 'Dodge'),
+(10, 6, 196, 'One-Handed Axes'),
+(10, 6, 197, 'Two-Handed Axes'),
+(10, 6, 200, 'Polearms'),
+(10, 6, 201, 'One-Handed Swords'),
+(10, 6, 202, 'Two-Handed Swords'),
+(10, 6, 203, 'Unarmed'),
+(10, 6, 204, 'Defense'),
+(10, 6, 522, 'SPELLDEFENSE (DND)'),
+(10, 6, 669, 'Language Orcish'),
+(10, 6, 674, 'Dual Wield'),
+(10, 6, 750, 'Plate Mail'),
+(10, 6, 813, 'Language Thalassian'),
+(10, 6, 822, 'Magic Resistance'),
+(10, 6, 1843, 'Disarm'),
+(10, 6, 2382, 'Generic'),
+(10, 6, 2479, 'Honorless Target'),
+(10, 6, 3050, 'Detect'),
+(10, 6, 3127, 'Parry'),
+(10, 6, 3275, 'Linen Bandage'),
+(10, 6, 3276, 'Heavy Linen Bandage'),
+(10, 6, 3277, 'Wool Bandage'),
+(10, 6, 3278, 'Heavy Wool Bandage'),
+(10, 6, 3365, 'Opening'),
+(10, 6, 6233, 'Closing'),
+(10, 6, 6246, 'Closing'),
+(10, 6, 6247, 'Opening'),
+(10, 6, 6477, 'Opening'),
+(10, 6, 6478, 'Opening'),
+(10, 6, 6603, 'Attack'),
+(10, 6, 7266, 'Duel'),
+(10, 6, 7267, 'Grovel'),
+(10, 6, 7355, 'Stuck'),
+(10, 6, 7928, 'Silk Bandage'),
+(10, 6, 7929, 'Heavy Silk Bandage'),
+(10, 6, 7934, 'Anti-Venom'),
+(10, 6, 8386, 'Attacking'),
+(10, 6, 8737, 'Mail'),
+(10, 6, 9077, 'Leather'),
+(10, 6, 9078, 'Cloth'),
+(10, 6, 9125, 'Generic'),
+(10, 6, 10840, 'Mageweave Bandage'),
+(10, 6, 10841, 'Heavy Mageweave Bandage'),
+(10, 6, 10846, 'First Aid'),
+(10, 6, 18629, 'Runecloth Bandage'),
+(10, 6, 18630, 'Heavy Runecloth Bandage'),
+(10, 6, 21651, 'Opening'),
+(10, 6, 21652, 'Closing'),
+(10, 6, 22027, 'Remove Insignia'),
+(10, 6, 22810, 'Opening - No Text'),
+(10, 6, 28877, 'Arcane Affinity'),
+(10, 6, 33391, 'Journeyman Riding'),
+(10, 6, 45462, 'Plague Strike'),
+(10, 6, 45477, 'Icy Touch'),
+(10, 6, 45902, 'Blood Strike'),
+(10, 6, 45903, 'Offensive State (DND)'),
+(10, 6, 45927, 'Summon Friend'),
+(10, 6, 47541, 'Death Coil'),
+(10, 6, 48266, 'Blood Presence'),
+(10, 6, 49410, 'Forceful Deflection'),
+(10, 6, 49576, 'Death Grip'),
+(10, 6, 50613, 'Arcane Torrent'),
+(10, 6, 52665, 'Sigil'),
+(10, 6, 59879, 'Blood Plague'),
+(10, 6, 59921, 'Frost Fever'),
+(10, 6, 61437, 'Opening'),
+(10, 6, 61455, 'Runic Focus'),
+(10, 8, 81, 'Dodge'),
+(10, 8, 133, 'Fireball'),
+(10, 8, 168, 'Frost Armor'),
+(10, 8, 203, 'Unarmed'),
+(10, 8, 204, 'Defense'),
+(10, 8, 227, 'Staves'),
+(10, 8, 522, 'SPELLDEFENSE (DND)'),
+(10, 8, 669, 'Language Orcish'),
+(10, 8, 813, 'Language Thalassian'),
+(10, 8, 822, 'Magic Resistance'),
+(10, 8, 2382, 'Generic'),
+(10, 8, 2479, 'Honorless Target'),
+(10, 8, 3050, 'Detect'),
+(10, 8, 3365, 'Opening'),
+(10, 8, 5009, 'Wands'),
+(10, 8, 5019, 'Shoot'),
+(10, 8, 6233, 'Closing'),
+(10, 8, 6246, 'Closing'),
+(10, 8, 6247, 'Opening'),
+(10, 8, 6477, 'Opening'),
+(10, 8, 6478, 'Opening'),
+(10, 8, 6603, 'Attack'),
+(10, 8, 7266, 'Duel'),
+(10, 8, 7267, 'Grovel'),
+(10, 8, 7355, 'Stuck'),
+(10, 8, 8386, 'Attacking'),
+(10, 8, 9078, 'Cloth'),
+(10, 8, 9125, 'Generic'),
+(10, 8, 21651, 'Opening'),
+(10, 8, 21652, 'Closing'),
+(10, 8, 22027, 'Remove Insignia'),
+(10, 8, 22810, 'Opening - No Text'),
+(10, 8, 28730, 'Arcane Torrent'),
+(10, 8, 28734, 'Mana Tap'),
+(10, 8, 28877, 'Arcane Affinity'),
+(10, 9, 81, 'Dodge'),
+(10, 9, 203, 'Unarmed'),
+(10, 9, 204, 'Defense'),
+(10, 9, 522, 'SPELLDEFENSE (DND)'),
+(10, 9, 669, 'Language Orcish'),
+(10, 9, 686, 'Shadow Bolt'),
+(10, 9, 687, 'Demon Skin'),
+(10, 9, 813, 'Language Thalassian'),
+(10, 9, 822, 'Magic Resistance'),
+(10, 9, 1180, 'Daggers'),
+(10, 9, 2382, 'Generic'),
+(10, 9, 2479, 'Honorless Target'),
+(10, 9, 3050, 'Detect'),
+(10, 9, 3365, 'Opening'),
+(10, 9, 5009, 'Wands'),
+(10, 9, 5019, 'Shoot'),
+(10, 9, 6233, 'Closing'),
+(10, 9, 6246, 'Closing'),
+(10, 9, 6247, 'Opening'),
+(10, 9, 6477, 'Opening'),
+(10, 9, 6478, 'Opening'),
+(10, 9, 6603, 'Attack'),
+(10, 9, 7266, 'Duel'),
+(10, 9, 7267, 'Grovel'),
+(10, 9, 7355, 'Stuck'),
+(10, 9, 8386, 'Attacking'),
+(10, 9, 9078, 'Cloth'),
+(10, 9, 9125, 'Generic'),
+(10, 9, 21651, 'Opening'),
+(10, 9, 21652, 'Closing'),
+(10, 9, 22027, 'Remove Insignia'),
+(10, 9, 22810, 'Opening - No Text'),
+(10, 9, 28730, 'Arcane Torrent'),
+(10, 9, 28734, 'Mana Tap'),
+(10, 9, 28877, 'Arcane Affinity'),
+(10, 9, 58284, 'Chaos Bolt Passive'),
+(11, 1, 78, 'Heroic Strike'),
+(11, 1, 81, 'Dodge'),
+(11, 1, 107, 'Block'),
+(11, 1, 198, 'One-Handed Maces'),
+(11, 1, 201, 'One-Handed Swords'),
+(11, 1, 202, 'Two-Handed Swords'),
+(11, 1, 203, 'Unarmed'),
+(11, 1, 204, 'Defense'),
+(11, 1, 522, 'SPELLDEFENSE (DND)'),
+(11, 1, 668, 'Language Common'),
+(11, 1, 1843, 'Disarm'),
+(11, 1, 2382, 'Generic'),
+(11, 1, 2457, 'Battle Stance'),
+(11, 1, 2479, 'Honorless Target'),
+(11, 1, 3050, 'Detect'),
+(11, 1, 3365, 'Opening'),
+(11, 1, 5301, 'Defensive State (DND)'),
+(11, 1, 6233, 'Closing'),
+(11, 1, 6246, 'Closing'),
+(11, 1, 6247, 'Opening'),
+(11, 1, 6477, 'Opening'),
+(11, 1, 6478, 'Opening'),
+(11, 1, 6562, 'Heroic Presence'),
+(11, 1, 6603, 'Attack'),
+(11, 1, 7266, 'Duel'),
+(11, 1, 7267, 'Grovel'),
+(11, 1, 7355, 'Stuck'),
+(11, 1, 8386, 'Attacking'),
+(11, 1, 8737, 'Mail'),
+(11, 1, 9077, 'Leather'),
+(11, 1, 9078, 'Cloth'),
+(11, 1, 9116, 'Shield'),
+(11, 1, 9125, 'Generic'),
+(11, 1, 21651, 'Opening'),
+(11, 1, 21652, 'Closing'),
+(11, 1, 22027, 'Remove Insignia'),
+(11, 1, 22810, 'Opening - No Text'),
+(11, 1, 28875, 'Gemcutting'),
+(11, 1, 28880, 'Gift of the Naaru'),
+(11, 1, 29932, 'Language Draenei'),
+(11, 1, 32215, 'Victorious State'),
+(11, 1, 45927, 'Summon Friend'),
+(11, 1, 59221, 'Shadow Resistance'),
+(11, 1, 61437, 'Opening'),
+(11, 2, 81, 'Dodge'),
+(11, 2, 107, 'Block'),
+(11, 2, 198, 'One-Handed Maces'),
+(11, 2, 199, 'Two-Handed Maces'),
+(11, 2, 203, 'Unarmed'),
+(11, 2, 204, 'Defense'),
+(11, 2, 522, 'SPELLDEFENSE (DND)'),
+(11, 2, 635, 'Holy Light'),
+(11, 2, 668, 'Language Common'),
+(11, 2, 1843, 'Disarm'),
+(11, 2, 2382, 'Generic'),
+(11, 2, 2479, 'Honorless Target'),
+(11, 2, 3050, 'Detect'),
+(11, 2, 3365, 'Opening'),
+(11, 2, 6233, 'Closing'),
+(11, 2, 6246, 'Closing'),
+(11, 2, 6247, 'Opening'),
+(11, 2, 6477, 'Opening'),
+(11, 2, 6478, 'Opening'),
+(11, 2, 6562, 'Heroic Presence'),
+(11, 2, 6603, 'Attack'),
+(11, 2, 7266, 'Duel'),
+(11, 2, 7267, 'Grovel'),
+(11, 2, 7355, 'Stuck'),
+(11, 2, 8386, 'Attacking'),
+(11, 2, 8737, 'Mail'),
+(11, 2, 9077, 'Leather'),
+(11, 2, 9078, 'Cloth'),
+(11, 2, 9116, 'Shield'),
+(11, 2, 9125, 'Generic'),
+(11, 2, 21084, 'Seal of Righteousness'),
+(11, 2, 21651, 'Opening'),
+(11, 2, 21652, 'Closing'),
+(11, 2, 22027, 'Remove Insignia'),
+(11, 2, 22810, 'Opening - No Text'),
+(11, 2, 27762, 'Libram'),
+(11, 2, 28875, 'Gemcutting'),
+(11, 2, 29932, 'Language Draenei'),
+(11, 2, 45927, 'Summon Friend'),
+(11, 2, 59221, 'Shadow Resistance'),
+(11, 2, 59542, 'Gift of the Naaru'),
+(11, 2, 61437, 'Opening'),
+(11, 3, 75, 'Auto Shot'),
+(11, 3, 81, 'Dodge'),
+(11, 3, 201, 'One-Handed Swords'),
+(11, 3, 203, 'Unarmed'),
+(11, 3, 204, 'Defense'),
+(11, 3, 522, 'SPELLDEFENSE (DND)'),
+(11, 3, 668, 'Language Common'),
+(11, 3, 1843, 'Disarm'),
+(11, 3, 2382, 'Generic'),
+(11, 3, 2479, 'Honorless Target'),
+(11, 3, 2973, 'Raptor Strike'),
+(11, 3, 3050, 'Detect'),
+(11, 3, 3365, 'Opening'),
+(11, 3, 5011, 'Crossbows'),
+(11, 3, 6233, 'Closing'),
+(11, 3, 6246, 'Closing'),
+(11, 3, 6247, 'Opening'),
+(11, 3, 6477, 'Opening'),
+(11, 3, 6478, 'Opening'),
+(11, 3, 6562, 'Heroic Presence'),
+(11, 3, 6603, 'Attack'),
+(11, 3, 7266, 'Duel'),
+(11, 3, 7267, 'Grovel'),
+(11, 3, 7355, 'Stuck'),
+(11, 3, 8386, 'Attacking'),
+(11, 3, 9077, 'Leather'),
+(11, 3, 9078, 'Cloth'),
+(11, 3, 9125, 'Generic'),
+(11, 3, 13358, 'Defensive State (DND)'),
+(11, 3, 21651, 'Opening'),
+(11, 3, 21652, 'Closing'),
+(11, 3, 22027, 'Remove Insignia'),
+(11, 3, 22810, 'Opening - No Text'),
+(11, 3, 24949, 'Defensive State 2 (DND)'),
+(11, 3, 28875, 'Gemcutting'),
+(11, 3, 29932, 'Language Draenei'),
+(11, 3, 34082, 'Advantaged State (DND)'),
+(11, 3, 45927, 'Summon Friend'),
+(11, 3, 59221, 'Shadow Resistance'),
+(11, 3, 59543, 'Gift of the Naaru'),
+(11, 3, 61437, 'Opening'),
+(11, 5, 81, 'Dodge'),
+(11, 5, 198, 'One-Handed Maces'),
+(11, 5, 203, 'Unarmed'),
+(11, 5, 204, 'Defense'),
+(11, 5, 522, 'SPELLDEFENSE (DND)'),
+(11, 5, 585, 'Smite'),
+(11, 5, 668, 'Language Common'),
+(11, 5, 1843, 'Disarm'),
+(11, 5, 2050, 'Lesser Heal'),
+(11, 5, 2382, 'Generic'),
+(11, 5, 2479, 'Honorless Target'),
+(11, 5, 3050, 'Detect'),
+(11, 5, 3365, 'Opening'),
+(11, 5, 5009, 'Wands'),
+(11, 5, 5019, 'Shoot'),
+(11, 5, 6233, 'Closing'),
+(11, 5, 6246, 'Closing'),
+(11, 5, 6247, 'Opening'),
+(11, 5, 6477, 'Opening'),
+(11, 5, 6478, 'Opening'),
+(11, 5, 6603, 'Attack'),
+(11, 5, 7266, 'Duel'),
+(11, 5, 7267, 'Grovel'),
+(11, 5, 7355, 'Stuck'),
+(11, 5, 8386, 'Attacking'),
+(11, 5, 9078, 'Cloth'),
+(11, 5, 9125, 'Generic'),
+(11, 5, 21651, 'Opening'),
+(11, 5, 21652, 'Closing'),
+(11, 5, 22027, 'Remove Insignia'),
+(11, 5, 22810, 'Opening - No Text'),
+(11, 5, 28875, 'Gemcutting'),
+(11, 5, 28878, 'Inspiring Presence'),
+(11, 5, 29932, 'Language Draenei'),
+(11, 5, 45927, 'Summon Friend'),
+(11, 5, 59221, 'Shadow Resistance'),
+(11, 5, 59544, 'Gift of the Naaru'),
+(11, 5, 61437, 'Opening'),
+(11, 6, 81, 'Dodge'),
+(11, 6, 196, 'One-Handed Axes'),
+(11, 6, 197, 'Two-Handed Axes'),
+(11, 6, 200, 'Polearms'),
+(11, 6, 201, 'One-Handed Swords'),
+(11, 6, 202, 'Two-Handed Swords'),
+(11, 6, 203, 'Unarmed'),
+(11, 6, 204, 'Defense'),
+(11, 6, 522, 'SPELLDEFENSE (DND)'),
+(11, 6, 668, 'Language Common'),
+(11, 6, 674, 'Dual Wield'),
+(11, 6, 750, 'Plate Mail'),
+(11, 6, 1843, 'Disarm'),
+(11, 6, 2382, 'Generic'),
+(11, 6, 2479, 'Honorless Target'),
+(11, 6, 3050, 'Detect'),
+(11, 6, 3127, 'Parry'),
+(11, 6, 3275, 'Linen Bandage'),
+(11, 6, 3276, 'Heavy Linen Bandage'),
+(11, 6, 3277, 'Wool Bandage'),
+(11, 6, 3278, 'Heavy Wool Bandage'),
+(11, 6, 3365, 'Opening'),
+(11, 6, 6233, 'Closing'),
+(11, 6, 6246, 'Closing'),
+(11, 6, 6247, 'Opening'),
+(11, 6, 6477, 'Opening'),
+(11, 6, 6478, 'Opening'),
+(11, 6, 6562, 'Heroic Presence'),
+(11, 6, 6603, 'Attack'),
+(11, 6, 7266, 'Duel'),
+(11, 6, 7267, 'Grovel'),
+(11, 6, 7355, 'Stuck'),
+(11, 6, 7928, 'Silk Bandage'),
+(11, 6, 7929, 'Heavy Silk Bandage'),
+(11, 6, 7934, 'Anti-Venom'),
+(11, 6, 8386, 'Attacking'),
+(11, 6, 8737, 'Mail'),
+(11, 6, 9077, 'Leather'),
+(11, 6, 9078, 'Cloth'),
+(11, 6, 9125, 'Generic'),
+(11, 6, 10840, 'Mageweave Bandage'),
+(11, 6, 10841, 'Heavy Mageweave Bandage'),
+(11, 6, 10846, 'First Aid'),
+(11, 6, 18629, 'Runecloth Bandage'),
+(11, 6, 18630, 'Heavy Runecloth Bandage'),
+(11, 6, 21651, 'Opening'),
+(11, 6, 21652, 'Closing'),
+(11, 6, 22027, 'Remove Insignia'),
+(11, 6, 22810, 'Opening - No Text'),
+(11, 6, 28875, 'Gemcutting'),
+(11, 6, 29932, 'Language Draenei'),
+(11, 6, 33391, 'Journeyman Riding'),
+(11, 6, 45462, 'Plague Strike'),
+(11, 6, 45477, 'Icy Touch'),
+(11, 6, 45902, 'Blood Strike'),
+(11, 6, 45903, 'Offensive State (DND)'),
+(11, 6, 45927, 'Summon Friend'),
+(11, 6, 47541, 'Death Coil'),
+(11, 6, 48266, 'Blood Presence'),
+(11, 6, 49410, 'Forceful Deflection'),
+(11, 6, 49576, 'Death Grip'),
+(11, 6, 52665, 'Sigil'),
+(11, 6, 59221, 'Shadow Resistance'),
+(11, 6, 59539, 'Shadow Resistance'),
+(11, 6, 59545, 'Gift of the Naaru'),
+(11, 6, 59879, 'Blood Plague'),
+(11, 6, 59921, 'Frost Fever'),
+(11, 6, 61437, 'Opening'),
+(11, 6, 61455, 'Runic Focus'),
+(11, 7, 81, 'Dodge'),
+(11, 7, 107, 'Block'),
+(11, 7, 198, 'One-Handed Maces'),
+(11, 7, 203, 'Unarmed'),
+(11, 7, 204, 'Defense'),
+(11, 7, 227, 'Staves'),
+(11, 7, 331, 'Healing Wave'),
+(11, 7, 403, 'Lightning Bolt'),
+(11, 7, 522, 'SPELLDEFENSE (DND)'),
+(11, 7, 668, 'Language Common'),
+(11, 7, 1843, 'Disarm'),
+(11, 7, 2382, 'Generic'),
+(11, 7, 2479, 'Honorless Target'),
+(11, 7, 3050, 'Detect'),
+(11, 7, 3365, 'Opening'),
+(11, 7, 6233, 'Closing'),
+(11, 7, 6246, 'Closing'),
+(11, 7, 6247, 'Opening'),
+(11, 7, 6477, 'Opening'),
+(11, 7, 6478, 'Opening'),
+(11, 7, 6603, 'Attack'),
+(11, 7, 7266, 'Duel'),
+(11, 7, 7267, 'Grovel'),
+(11, 7, 7355, 'Stuck'),
+(11, 7, 8386, 'Attacking'),
+(11, 7, 9077, 'Leather'),
+(11, 7, 9078, 'Cloth'),
+(11, 7, 9116, 'Shield'),
+(11, 7, 9125, 'Generic'),
+(11, 7, 21651, 'Opening'),
+(11, 7, 21652, 'Closing'),
+(11, 7, 22027, 'Remove Insignia'),
+(11, 7, 22810, 'Opening - No Text'),
+(11, 7, 27763, 'Totem'),
+(11, 7, 28875, 'Gemcutting'),
+(11, 7, 28878, 'Inspiring Presence'),
+(11, 7, 29932, 'Language Draenei'),
+(11, 7, 45927, 'Summon Friend'),
+(11, 7, 59221, 'Shadow Resistance'),
+(11, 7, 59547, 'Gift of the Naaru'),
+(11, 7, 61437, 'Opening'),
+(11, 8, 81, 'Dodge'),
+(11, 8, 133, 'Fireball'),
+(11, 8, 168, 'Frost Armor'),
+(11, 8, 203, 'Unarmed'),
+(11, 8, 204, 'Defense'),
+(11, 8, 227, 'Staves'),
+(11, 8, 522, 'SPELLDEFENSE (DND)'),
+(11, 8, 668, 'Language Common'),
+(11, 8, 1843, 'Disarm'),
+(11, 8, 2382, 'Generic'),
+(11, 8, 2479, 'Honorless Target'),
+(11, 8, 3050, 'Detect'),
+(11, 8, 3365, 'Opening'),
+(11, 8, 5009, 'Wands'),
+(11, 8, 5019, 'Shoot'),
+(11, 8, 6233, 'Closing'),
+(11, 8, 6246, 'Closing'),
+(11, 8, 6247, 'Opening'),
+(11, 8, 6477, 'Opening'),
+(11, 8, 6478, 'Opening'),
+(11, 8, 6603, 'Attack'),
+(11, 8, 7266, 'Duel'),
+(11, 8, 7267, 'Grovel'),
+(11, 8, 7355, 'Stuck'),
+(11, 8, 8386, 'Attacking'),
+(11, 8, 9078, 'Cloth'),
+(11, 8, 9125, 'Generic'),
+(11, 8, 21651, 'Opening'),
+(11, 8, 21652, 'Closing'),
+(11, 8, 22027, 'Remove Insignia'),
+(11, 8, 22810, 'Opening - No Text'),
+(11, 8, 28875, 'Gemcutting'),
+(11, 8, 28878, 'Inspiring Presence'),
+(11, 8, 29932, 'Language Draenei'),
+(11, 8, 45927, 'Summon Friend'),
+(11, 8, 59221, 'Shadow Resistance'),
+(11, 8, 59548, 'Gift of the Naaru'),
+(11, 8, 61437, 'Opening');
+
+-- player_classlevelstats
+INSERT IGNORE INTO `player_classlevelstats` (`class`, `level`, `basehp`, `basemana`) VALUES
+(1, 1, 20, 0),
+(1, 2, 29, 0),
+(1, 3, 38, 0),
+(1, 4, 47, 0),
+(1, 5, 56, 0),
+(1, 6, 65, 0),
+(1, 7, 74, 0),
+(1, 8, 83, 0),
+(1, 9, 92, 0),
+(1, 10, 101, 0),
+(1, 11, 100, 0),
+(1, 12, 109, 0),
+(1, 13, 118, 0),
+(1, 14, 128, 0),
+(1, 15, 139, 0),
+(1, 16, 151, 0),
+(1, 17, 154, 0),
+(1, 18, 168, 0),
+(1, 19, 183, 0),
+(1, 20, 199, 0),
+(1, 21, 206, 0),
+(1, 22, 224, 0),
+(1, 23, 243, 0),
+(1, 24, 253, 0),
+(1, 25, 274, 0),
+(1, 26, 296, 0),
+(1, 27, 309, 0),
+(1, 28, 333, 0),
+(1, 29, 348, 0),
+(1, 30, 374, 0),
+(1, 31, 401, 0),
+(1, 32, 419, 0),
+(1, 33, 448, 0),
+(1, 34, 468, 0),
+(1, 35, 499, 0),
+(1, 36, 521, 0),
+(1, 37, 545, 0),
+(1, 38, 581, 0),
+(1, 39, 609, 0),
+(1, 40, 649, 0),
+(1, 41, 681, 0),
+(1, 42, 715, 0),
+(1, 43, 761, 0),
+(1, 44, 799, 0),
+(1, 45, 839, 0),
+(1, 46, 881, 0),
+(1, 47, 935, 0),
+(1, 48, 981, 0),
+(1, 49, 1029, 0),
+(1, 50, 1079, 0),
+(1, 51, 1131, 0),
+(1, 52, 1185, 0),
+(1, 53, 1241, 0),
+(1, 54, 1299, 0),
+(1, 55, 1359, 0),
+(1, 56, 1421, 0),
+(1, 57, 1485, 0),
+(1, 58, 1551, 0),
+(1, 59, 1619, 0),
+(1, 60, 1689, 0),
+(1, 61, 1902, 0),
+(1, 62, 2129, 0),
+(1, 63, 2357, 0),
+(1, 64, 2612, 0),
+(1, 65, 2883, 0),
+(1, 66, 3169, 0),
+(1, 67, 3455, 0),
+(1, 68, 3774, 0),
+(1, 69, 4109, 0),
+(1, 70, 4444, 0),
+(1, 71, 4720, 0),
+(1, 72, 5013, 0),
+(1, 73, 5325, 0),
+(1, 74, 5656, 0),
+(1, 75, 6008, 0),
+(1, 76, 6381, 0),
+(1, 77, 6778, 0),
+(1, 78, 7198, 0),
+(1, 79, 7646, 0),
+(1, 80, 8121, 0),
+(2, 1, 28, 60),
+(2, 2, 36, 78),
+(2, 3, 44, 98),
+(2, 4, 52, 104),
+(2, 5, 60, 111),
+(2, 6, 68, 134),
+(2, 7, 76, 143),
+(2, 8, 84, 153),
+(2, 9, 92, 179),
+(2, 10, 100, 192),
+(2, 11, 108, 205),
+(2, 12, 116, 219),
+(2, 13, 124, 249),
+(2, 14, 132, 265),
+(2, 15, 131, 282),
+(2, 16, 141, 315),
+(2, 17, 152, 334),
+(2, 18, 164, 354),
+(2, 19, 177, 390),
+(2, 20, 191, 412),
+(2, 21, 206, 435),
+(2, 22, 222, 459),
+(2, 23, 239, 499),
+(2, 24, 247, 525),
+(2, 25, 266, 552),
+(2, 26, 286, 579),
+(2, 27, 307, 621),
+(2, 28, 329, 648),
+(2, 29, 342, 675),
+(2, 30, 366, 702),
+(2, 31, 391, 729),
+(2, 32, 407, 756),
+(2, 33, 434, 798),
+(2, 34, 462, 825),
+(2, 35, 481, 852),
+(2, 36, 511, 879),
+(2, 37, 542, 906),
+(2, 38, 564, 933),
+(2, 39, 597, 960),
+(2, 40, 621, 987),
+(2, 41, 656, 1014),
+(2, 42, 682, 1041),
+(2, 43, 719, 1068),
+(2, 44, 747, 1110),
+(2, 45, 786, 1137),
+(2, 46, 816, 1164),
+(2, 47, 857, 1176),
+(2, 48, 889, 1203),
+(2, 49, 922, 1230),
+(2, 50, 966, 1257),
+(2, 51, 1001, 1284),
+(2, 52, 1037, 1311),
+(2, 53, 1084, 1338),
+(2, 54, 1122, 1365),
+(2, 55, 1161, 1392),
+(2, 56, 1201, 1419),
+(2, 57, 1252, 1446),
+(2, 58, 1294, 1458),
+(2, 59, 1337, 1485),
+(2, 60, 1381, 1512),
+(2, 61, 1540, 1656),
+(2, 62, 1708, 1800),
+(2, 63, 1884, 1944),
+(2, 64, 2068, 2088),
+(2, 65, 2262, 2232),
+(2, 66, 2466, 2377),
+(2, 67, 2679, 2521),
+(2, 68, 2901, 2665),
+(2, 69, 3134, 2809),
+(2, 70, 3377, 2953),
+(2, 71, 3629, 3097),
+(2, 72, 3900, 3241),
+(2, 73, 4191, 3385),
+(2, 74, 4503, 3529),
+(2, 75, 4839, 3673),
+(2, 76, 5200, 3817),
+(2, 77, 5588, 3962),
+(2, 78, 6005, 4106),
+(2, 79, 6453, 4250),
+(2, 80, 6934, 4394),
+(3, 1, 46, 65),
+(3, 2, 53, 70),
+(3, 3, 60, 76),
+(3, 4, 67, 98),
+(3, 5, 74, 106),
+(3, 6, 81, 130),
+(3, 7, 88, 140),
+(3, 8, 95, 166),
+(3, 9, 102, 193),
+(3, 10, 109, 206),
+(3, 11, 116, 235),
+(3, 12, 123, 250),
+(3, 13, 130, 266),
+(3, 14, 138, 298),
+(3, 15, 147, 316),
+(3, 16, 157, 350),
+(3, 17, 168, 370),
+(3, 18, 180, 391),
+(3, 19, 193, 428),
+(3, 20, 207, 451),
+(3, 21, 222, 475),
+(3, 22, 238, 515),
+(3, 23, 255, 541),
+(3, 24, 273, 568),
+(3, 25, 292, 611),
+(3, 26, 312, 640),
+(3, 27, 333, 670),
+(3, 28, 355, 715),
+(3, 29, 378, 745),
+(3, 30, 402, 775),
+(3, 31, 417, 805),
+(3, 32, 443, 850),
+(3, 33, 470, 880),
+(3, 34, 498, 910),
+(3, 35, 527, 940),
+(3, 36, 547, 970),
+(3, 37, 578, 1015),
+(3, 38, 610, 1045),
+(3, 39, 643, 1075),
+(3, 40, 667, 1105),
+(3, 41, 702, 1135),
+(3, 42, 738, 1180),
+(3, 43, 775, 1210),
+(3, 44, 803, 1240),
+(3, 45, 842, 1270),
+(3, 46, 872, 1300),
+(3, 47, 913, 1330),
+(3, 48, 955, 1360),
+(3, 49, 994, 1390),
+(3, 50, 1047, 1420),
+(3, 51, 1067, 1450),
+(3, 52, 1113, 1480),
+(3, 53, 1150, 1510),
+(3, 54, 1198, 1540),
+(3, 55, 1237, 1570),
+(3, 56, 1287, 1600),
+(3, 57, 1328, 1630),
+(3, 58, 1370, 1660),
+(3, 59, 1423, 1690),
+(3, 60, 1467, 1720),
+(3, 61, 1633, 1886),
+(3, 62, 1819, 2053),
+(3, 63, 2003, 2219),
+(3, 64, 2195, 2385),
+(3, 65, 2397, 2552),
+(3, 66, 2623, 2718),
+(3, 67, 2844, 2884),
+(3, 68, 3075, 3050),
+(3, 69, 3316, 3217),
+(3, 70, 3568, 3383),
+(3, 71, 3834, 3549),
+(3, 72, 4120, 3716),
+(3, 73, 4427, 3882),
+(3, 74, 4757, 4048),
+(3, 75, 5112, 4215),
+(3, 76, 5493, 4381),
+(3, 77, 5903, 4547),
+(3, 78, 6343, 4713),
+(3, 79, 6816, 4880),
+(3, 80, 7324, 5046),
+(4, 1, 25, 0),
+(4, 2, 32, 0),
+(4, 3, 49, 0),
+(4, 4, 56, 0),
+(4, 5, 63, 0),
+(4, 6, 70, 0),
+(4, 7, 87, 0),
+(4, 8, 94, 0),
+(4, 9, 101, 0),
+(4, 10, 118, 0),
+(4, 11, 125, 0),
+(4, 12, 142, 0),
+(4, 13, 149, 0),
+(4, 14, 156, 0),
+(4, 15, 173, 0),
+(4, 16, 181, 0),
+(4, 17, 190, 0),
+(4, 18, 200, 0),
+(4, 19, 221, 0),
+(4, 20, 233, 0),
+(4, 21, 246, 0),
+(4, 22, 260, 0),
+(4, 23, 275, 0),
+(4, 24, 301, 0),
+(4, 25, 318, 0),
+(4, 26, 336, 0),
+(4, 27, 355, 0),
+(4, 28, 375, 0),
+(4, 29, 396, 0),
+(4, 30, 428, 0),
+(4, 31, 451, 0),
+(4, 32, 475, 0),
+(4, 33, 500, 0),
+(4, 34, 526, 0),
+(4, 35, 553, 0),
+(4, 36, 581, 0),
+(4, 37, 610, 0),
+(4, 38, 640, 0),
+(4, 39, 671, 0),
+(4, 40, 703, 0),
+(4, 41, 736, 0),
+(4, 42, 770, 0),
+(4, 43, 805, 0),
+(4, 44, 841, 0),
+(4, 45, 878, 0),
+(4, 46, 916, 0),
+(4, 47, 955, 0),
+(4, 48, 995, 0),
+(4, 49, 1026, 0),
+(4, 50, 1068, 0),
+(4, 51, 1111, 0),
+(4, 52, 1155, 0),
+(4, 53, 1200, 0),
+(4, 54, 1246, 0),
+(4, 55, 1283, 0),
+(4, 56, 1331, 0),
+(4, 57, 1380, 0),
+(4, 58, 1430, 0),
+(4, 59, 1471, 0),
+(4, 60, 1523, 0),
+(4, 61, 1702, 0),
+(4, 62, 1879, 0),
+(4, 63, 2077, 0),
+(4, 64, 2285, 0),
+(4, 65, 2489, 0),
+(4, 66, 2717, 0),
+(4, 67, 2941, 0),
+(4, 68, 3190, 0),
+(4, 69, 3450, 0),
+(4, 70, 3704, 0),
+(4, 71, 3980, 0),
+(4, 72, 4277, 0),
+(4, 73, 4596, 0),
+(4, 74, 4939, 0),
+(4, 75, 5307, 0),
+(4, 76, 5703, 0),
+(4, 77, 6128, 0),
+(4, 78, 6585, 0),
+(4, 79, 7076, 0),
+(4, 80, 7604, 0),
+(5, 1, 52, 73),
+(5, 2, 57, 76),
+(5, 3, 72, 95),
+(5, 4, 77, 114),
+(5, 5, 92, 133),
+(5, 6, 97, 152),
+(5, 7, 112, 171),
+(5, 8, 117, 190),
+(5, 9, 132, 209),
+(5, 10, 137, 212),
+(5, 11, 142, 215),
+(5, 12, 157, 234),
+(5, 13, 172, 254),
+(5, 14, 177, 260),
+(5, 15, 192, 282),
+(5, 16, 197, 305),
+(5, 17, 212, 329),
+(5, 18, 227, 339),
+(5, 19, 232, 365),
+(5, 20, 247, 377),
+(5, 21, 252, 405),
+(5, 22, 268, 434),
+(5, 23, 275, 449),
+(5, 24, 293, 480),
+(5, 25, 302, 497),
+(5, 26, 322, 530),
+(5, 27, 343, 549),
+(5, 28, 355, 584),
+(5, 29, 378, 605),
+(5, 30, 392, 627),
+(5, 31, 417, 665),
+(5, 32, 433, 689),
+(5, 33, 460, 728),
+(5, 34, 478, 752),
+(5, 35, 507, 776),
+(5, 36, 527, 800),
+(5, 37, 548, 839),
+(5, 38, 580, 863),
+(5, 39, 603, 887),
+(5, 40, 637, 911),
+(5, 41, 662, 950),
+(5, 42, 698, 974),
+(5, 43, 725, 998),
+(5, 44, 763, 1022),
+(5, 45, 792, 1046),
+(5, 46, 822, 1070),
+(5, 47, 863, 1094),
+(5, 48, 895, 1118),
+(5, 49, 928, 1142),
+(5, 50, 972, 1166),
+(5, 51, 1007, 1190),
+(5, 52, 1053, 1214),
+(5, 53, 1090, 1238),
+(5, 54, 1128, 1262),
+(5, 55, 1177, 1271),
+(5, 56, 1217, 1295),
+(5, 57, 1258, 1319),
+(5, 58, 1300, 1343),
+(5, 59, 1353, 1352),
+(5, 60, 1397, 1376),
+(5, 61, 1557, 1500),
+(5, 62, 1738, 1625),
+(5, 63, 1916, 1749),
+(5, 64, 2101, 1873),
+(5, 65, 2295, 1998),
+(5, 66, 2495, 2122),
+(5, 67, 2719, 2247),
+(5, 68, 2936, 2371),
+(5, 69, 3160, 2495),
+(5, 70, 3391, 2620),
+(5, 71, 3644, 2744),
+(5, 72, 3916, 2868),
+(5, 73, 4208, 2993),
+(5, 74, 4522, 3117),
+(5, 75, 4859, 3242),
+(5, 76, 5221, 3366),
+(5, 77, 5610, 3490),
+(5, 78, 6028, 3615),
+(5, 79, 6477, 3739),
+(5, 80, 6960, 3863),
+(6, 1, 22, 0),
+(6, 2, 27, 0),
+(6, 3, 32, 0),
+(6, 4, 37, 0),
+(6, 5, 42, 0),
+(6, 6, 47, 0),
+(6, 7, 52, 0),
+(6, 8, 58, 0),
+(6, 9, 64, 0),
+(6, 10, 70, 0),
+(6, 11, 77, 0),
+(6, 12, 84, 0),
+(6, 13, 92, 0),
+(6, 14, 100, 0),
+(6, 15, 117, 0),
+(6, 16, 127, 0),
+(6, 17, 138, 0),
+(6, 18, 150, 0),
+(6, 19, 163, 0),
+(6, 20, 177, 0),
+(6, 21, 192, 0),
+(6, 22, 208, 0),
+(6, 23, 225, 0),
+(6, 24, 239, 0),
+(6, 25, 258, 0),
+(6, 26, 278, 0),
+(6, 27, 299, 0),
+(6, 28, 321, 0),
+(6, 29, 344, 0),
+(6, 30, 368, 0),
+(6, 31, 393, 0),
+(6, 32, 419, 0),
+(6, 33, 446, 0),
+(6, 34, 474, 0),
+(6, 35, 503, 0),
+(6, 36, 533, 0),
+(6, 37, 564, 0),
+(6, 38, 596, 0),
+(6, 39, 629, 0),
+(6, 40, 698, 0),
+(6, 41, 698, 0),
+(6, 42, 734, 0),
+(6, 43, 771, 0),
+(6, 44, 809, 0),
+(6, 45, 849, 0),
+(6, 46, 891, 0),
+(6, 47, 935, 0),
+(6, 48, 981, 0),
+(6, 49, 1029, 0),
+(6, 50, 1079, 0),
+(6, 51, 1131, 0),
+(6, 52, 1185, 0),
+(6, 53, 1241, 0),
+(6, 54, 1299, 0),
+(6, 55, 1359, 0),
+(6, 56, 1421, 0),
+(6, 57, 1485, 0),
+(6, 58, 1551, 0),
+(6, 59, 1619, 0),
+(6, 60, 1689, 0),
+(6, 61, 1902, 0),
+(6, 62, 2129, 0),
+(6, 63, 2357, 0),
+(6, 64, 2612, 0),
+(6, 65, 2883, 0),
+(6, 66, 3169, 0),
+(6, 67, 3455, 0),
+(6, 68, 3774, 0),
+(6, 69, 4109, 0),
+(6, 70, 4444, 0),
+(6, 71, 4720, 0),
+(6, 72, 5013, 0),
+(6, 73, 5325, 0),
+(6, 74, 5656, 0),
+(6, 75, 6008, 0),
+(6, 76, 6381, 0),
+(6, 77, 6778, 0),
+(6, 78, 7199, 0),
+(6, 79, 7646, 0),
+(6, 80, 8121, 0),
+(7, 1, 37, 85),
+(7, 2, 44, 91),
+(7, 3, 51, 98),
+(7, 4, 58, 106),
+(7, 5, 65, 115),
+(7, 6, 72, 125),
+(7, 7, 79, 136),
+(7, 8, 86, 148),
+(7, 9, 93, 161),
+(7, 10, 100, 175),
+(7, 11, 107, 190),
+(7, 12, 114, 206),
+(7, 13, 121, 223),
+(7, 14, 128, 241),
+(7, 15, 135, 260),
+(7, 16, 142, 280),
+(7, 17, 150, 301),
+(7, 18, 159, 323),
+(7, 19, 169, 346),
+(7, 20, 180, 370),
+(7, 21, 192, 395),
+(7, 22, 205, 421),
+(7, 23, 219, 448),
+(7, 24, 234, 476),
+(7, 25, 240, 505),
+(7, 26, 257, 535),
+(7, 27, 275, 566),
+(7, 28, 294, 598),
+(7, 29, 314, 631),
+(7, 30, 335, 665),
+(7, 31, 347, 699),
+(7, 32, 370, 733),
+(7, 33, 394, 767),
+(7, 34, 419, 786),
+(7, 35, 435, 820),
+(7, 36, 462, 854),
+(7, 37, 490, 888),
+(7, 38, 509, 922),
+(7, 39, 539, 941),
+(7, 40, 570, 975),
+(7, 41, 592, 1009),
+(7, 42, 625, 1028),
+(7, 43, 649, 1062),
+(7, 44, 684, 1096),
+(7, 45, 710, 1115),
+(7, 46, 747, 1149),
+(7, 47, 775, 1183),
+(7, 48, 814, 1202),
+(7, 49, 844, 1236),
+(7, 50, 885, 1255),
+(7, 51, 917, 1289),
+(7, 52, 960, 1323),
+(7, 53, 994, 1342),
+(7, 54, 1029, 1376),
+(7, 55, 1075, 1395),
+(7, 56, 1112, 1414),
+(7, 57, 1150, 1448),
+(7, 58, 1199, 1467),
+(7, 59, 1239, 1501),
+(7, 60, 1330, 1520),
+(7, 61, 1428, 1664),
+(7, 62, 1583, 1808),
+(7, 63, 1760, 1951),
+(7, 64, 1932, 2095),
+(7, 65, 2114, 2239),
+(7, 66, 2304, 2383),
+(7, 67, 2504, 2527),
+(7, 68, 2713, 2670),
+(7, 69, 2931, 2814),
+(7, 70, 3159, 2958),
+(7, 71, 3395, 3102),
+(7, 72, 3648, 3246),
+(7, 73, 3920, 3389),
+(7, 74, 4212, 3533),
+(7, 75, 4526, 3677),
+(7, 76, 4863, 3821),
+(7, 77, 5226, 3965),
+(7, 78, 5616, 4108),
+(7, 79, 6035, 4252),
+(7, 80, 6485, 4396),
+(8, 1, 32, 100),
+(8, 2, 47, 110),
+(8, 3, 52, 106),
+(8, 4, 67, 118),
+(8, 5, 82, 131),
+(8, 6, 97, 130),
+(8, 7, 102, 145),
+(8, 8, 117, 146),
+(8, 9, 132, 163),
+(8, 10, 137, 196),
+(8, 11, 152, 215),
+(8, 12, 167, 220),
+(8, 13, 172, 241),
+(8, 14, 187, 263),
+(8, 15, 202, 271),
+(8, 16, 207, 295),
+(8, 17, 222, 305),
+(8, 18, 237, 331),
+(8, 19, 242, 343),
+(8, 20, 257, 371),
+(8, 21, 272, 385),
+(8, 22, 277, 415),
+(8, 23, 292, 431),
+(8, 24, 298, 463),
+(8, 25, 315, 481),
+(8, 26, 333, 515),
+(8, 27, 342, 535),
+(8, 28, 362, 556),
+(8, 29, 373, 592),
+(8, 30, 395, 613),
+(8, 31, 418, 634),
+(8, 32, 432, 670),
+(8, 33, 457, 691),
+(8, 34, 473, 712),
+(8, 35, 500, 733),
+(8, 36, 518, 754),
+(8, 37, 547, 790),
+(8, 38, 577, 811),
+(8, 39, 598, 832),
+(8, 40, 630, 853),
+(8, 41, 653, 874),
+(8, 42, 687, 895),
+(8, 43, 712, 916),
+(8, 44, 748, 937),
+(8, 45, 775, 958),
+(8, 46, 813, 979),
+(8, 47, 842, 1000),
+(8, 48, 882, 1021),
+(8, 49, 913, 1042),
+(8, 50, 955, 1048),
+(8, 51, 988, 1069),
+(8, 52, 1032, 1090),
+(8, 53, 1067, 1111),
+(8, 54, 1103, 1117),
+(8, 55, 1150, 1138),
+(8, 56, 1188, 1159),
+(8, 57, 1237, 1165),
+(8, 58, 1277, 1186),
+(8, 59, 1328, 1192),
+(8, 60, 1370, 1213),
+(8, 61, 1526, 1316),
+(8, 62, 1702, 1419),
+(8, 63, 1875, 1521),
+(8, 64, 2070, 1624),
+(8, 65, 2261, 1727),
+(8, 66, 2461, 1830),
+(8, 67, 2686, 1932),
+(8, 68, 2906, 2035),
+(8, 69, 3136, 2138),
+(8, 70, 3393, 2241),
+(8, 71, 3646, 2343),
+(8, 72, 3918, 2446),
+(8, 73, 4210, 2549),
+(8, 74, 4524, 2652),
+(8, 75, 4861, 2754),
+(8, 76, 5223, 2857),
+(8, 77, 5612, 2960),
+(8, 78, 6030, 3063),
+(8, 79, 6480, 3165),
+(8, 80, 6963, 3268),
+(9, 1, 23, 90),
+(9, 2, 28, 98),
+(9, 3, 43, 107),
+(9, 4, 48, 102),
+(9, 5, 63, 113),
+(9, 6, 68, 126),
+(9, 7, 83, 144),
+(9, 8, 88, 162),
+(9, 9, 93, 180),
+(9, 10, 108, 198),
+(9, 11, 123, 200),
+(9, 12, 128, 218),
+(9, 13, 143, 237),
+(9, 14, 148, 257),
+(9, 15, 153, 278),
+(9, 16, 168, 300),
+(9, 17, 173, 308),
+(9, 18, 189, 332),
+(9, 19, 196, 357),
+(9, 20, 204, 383),
+(9, 21, 223, 395),
+(9, 22, 233, 423),
+(9, 23, 244, 452),
+(9, 24, 266, 467),
+(9, 25, 279, 498),
+(9, 26, 293, 530),
+(9, 27, 318, 548),
+(9, 28, 334, 582),
+(9, 29, 351, 602),
+(9, 30, 379, 638),
+(9, 31, 398, 674),
+(9, 32, 418, 695),
+(9, 33, 439, 731),
+(9, 34, 471, 752),
+(9, 35, 494, 788),
+(9, 36, 518, 809),
+(9, 37, 543, 830),
+(9, 38, 569, 866),
+(9, 39, 606, 887),
+(9, 40, 634, 923),
+(9, 41, 663, 944),
+(9, 42, 693, 965),
+(9, 43, 724, 1001),
+(9, 44, 756, 1022),
+(9, 45, 799, 1043),
+(9, 46, 832, 1064),
+(9, 47, 868, 1100),
+(9, 48, 904, 1121),
+(9, 49, 941, 1142),
+(9, 50, 979, 1163),
+(9, 51, 1018, 1184),
+(9, 52, 1058, 1205),
+(9, 53, 1099, 1226),
+(9, 54, 1141, 1247),
+(9, 55, 1184, 1268),
+(9, 56, 1228, 1289),
+(9, 57, 1273, 1310),
+(9, 58, 1319, 1331),
+(9, 59, 1366, 1352),
+(9, 60, 1414, 1373),
+(9, 61, 1580, 1497),
+(9, 62, 1755, 1621),
+(9, 63, 1939, 1745),
+(9, 64, 2133, 1870),
+(9, 65, 2323, 1994),
+(9, 66, 2535, 2118),
+(9, 67, 2758, 2242),
+(9, 68, 2991, 2366),
+(9, 69, 3235, 2490),
+(9, 70, 3490, 2615),
+(9, 71, 3750, 2739),
+(9, 72, 4025, 2863),
+(9, 73, 4330, 2987),
+(9, 74, 4646, 3111),
+(9, 75, 4997, 3235),
+(9, 76, 5373, 3360),
+(9, 77, 5774, 3483),
+(9, 78, 6207, 3608),
+(9, 79, 6667, 3732),
+(9, 80, 7136, 3856),
+(11, 1, 44, 60),
+(11, 2, 51, 66),
+(11, 3, 58, 73),
+(11, 4, 75, 81),
+(11, 5, 82, 90),
+(11, 6, 89, 100),
+(11, 7, 106, 111),
+(11, 8, 113, 123),
+(11, 9, 120, 136),
+(11, 10, 137, 150),
+(11, 11, 144, 165),
+(11, 12, 151, 182),
+(11, 13, 168, 200),
+(11, 14, 175, 219),
+(11, 15, 182, 239),
+(11, 16, 199, 260),
+(11, 17, 206, 282),
+(11, 18, 214, 305),
+(11, 19, 233, 329),
+(11, 20, 243, 354),
+(11, 21, 254, 380),
+(11, 22, 266, 392),
+(11, 23, 289, 420),
+(11, 24, 303, 449),
+(11, 25, 318, 479),
+(11, 26, 334, 509),
+(11, 27, 361, 524),
+(11, 28, 379, 554),
+(11, 29, 398, 584),
+(11, 30, 418, 614),
+(11, 31, 439, 629),
+(11, 32, 461, 659),
+(11, 33, 494, 689),
+(11, 34, 518, 704),
+(11, 35, 543, 734),
+(11, 36, 569, 749),
+(11, 37, 596, 779),
+(11, 38, 624, 809),
+(11, 39, 653, 824),
+(11, 40, 683, 854),
+(11, 41, 714, 869),
+(11, 42, 746, 899),
+(11, 43, 779, 914),
+(11, 44, 823, 944),
+(11, 45, 858, 959),
+(11, 46, 894, 989),
+(11, 47, 921, 1004),
+(11, 48, 959, 1019),
+(11, 49, 998, 1049),
+(11, 50, 1038, 1064),
+(11, 51, 1079, 1079),
+(11, 52, 1121, 1109),
+(11, 53, 1164, 1124),
+(11, 54, 1208, 1139),
+(11, 55, 1253, 1154),
+(11, 56, 1299, 1169),
+(11, 57, 1346, 1199),
+(11, 58, 1384, 1214),
+(11, 59, 1433, 1229),
+(11, 60, 1483, 1244),
+(11, 61, 1657, 1357),
+(11, 62, 1840, 1469),
+(11, 63, 2020, 1582),
+(11, 64, 2222, 1694),
+(11, 65, 2433, 1807),
+(11, 66, 2640, 1919),
+(11, 67, 2872, 2032),
+(11, 68, 3114, 2145),
+(11, 69, 3351, 2257),
+(11, 70, 3614, 2370),
+(11, 71, 3883, 2482),
+(11, 72, 4172, 2595),
+(11, 73, 4483, 2708),
+(11, 74, 4817, 2820),
+(11, 75, 5176, 2933),
+(11, 76, 5562, 3045),
+(11, 77, 5977, 3158),
+(11, 78, 6423, 3270),
+(11, 79, 6902, 3383),
+(11, 80, 7417, 3496);
+
+-- player_levelstats
+INSERT IGNORE INTO `player_levelstats` (`race`, `class`, `level`, `str`, `agi`, `sta`, `inte`, `spi`) VALUES
+(1, 1, 1, 23, 20, 22, 20, 20),
+(1, 1, 2, 24, 21, 23, 20, 20),
+(1, 1, 3, 26, 22, 24, 20, 21),
+(1, 1, 4, 27, 22, 26, 20, 21),
+(1, 1, 5, 28, 23, 27, 20, 21),
+(1, 1, 6, 30, 24, 28, 20, 21),
+(1, 1, 7, 31, 25, 29, 21, 22),
+(1, 1, 8, 32, 26, 30, 21, 22),
+(1, 1, 9, 34, 26, 32, 21, 22),
+(1, 1, 10, 35, 27, 33, 21, 23),
+(1, 1, 11, 36, 28, 34, 21, 23),
+(1, 1, 12, 38, 29, 35, 21, 23),
+(1, 1, 13, 39, 30, 37, 21, 24),
+(1, 1, 14, 41, 31, 38, 21, 24),
+(1, 1, 15, 42, 32, 39, 21, 24),
+(1, 1, 16, 44, 33, 41, 21, 25),
+(1, 1, 17, 45, 34, 42, 22, 25),
+(1, 1, 18, 47, 34, 43, 22, 25),
+(1, 1, 19, 48, 35, 45, 22, 26),
+(1, 1, 20, 50, 36, 46, 22, 26),
+(1, 1, 21, 51, 37, 48, 22, 26),
+(1, 1, 22, 53, 38, 49, 22, 27),
+(1, 1, 23, 54, 39, 51, 22, 27),
+(1, 1, 24, 56, 40, 52, 23, 28),
+(1, 1, 25, 58, 41, 53, 23, 28),
+(1, 1, 26, 59, 42, 55, 23, 28),
+(1, 1, 27, 61, 43, 56, 23, 29),
+(1, 1, 28, 63, 44, 58, 23, 29),
+(1, 1, 29, 64, 45, 59, 23, 30),
+(1, 1, 30, 66, 46, 61, 24, 30),
+(1, 1, 31, 68, 47, 62, 24, 30),
+(1, 1, 32, 69, 48, 64, 24, 31),
+(1, 1, 33, 71, 50, 66, 24, 31),
+(1, 1, 34, 73, 51, 67, 24, 32),
+(1, 1, 35, 74, 52, 69, 24, 32),
+(1, 1, 36, 76, 53, 70, 25, 33),
+(1, 1, 37, 78, 54, 72, 25, 33),
+(1, 1, 38, 80, 55, 74, 25, 34),
+(1, 1, 39, 82, 56, 75, 25, 34),
+(1, 1, 40, 83, 57, 77, 25, 35),
+(1, 1, 41, 85, 58, 79, 26, 35),
+(1, 1, 42, 87, 60, 80, 26, 35),
+(1, 1, 43, 89, 61, 82, 26, 36),
+(1, 1, 44, 91, 62, 84, 26, 36),
+(1, 1, 45, 93, 63, 85, 26, 37),
+(1, 1, 46, 95, 64, 87, 27, 37),
+(1, 1, 47, 97, 66, 89, 27, 38),
+(1, 1, 48, 99, 67, 91, 27, 38),
+(1, 1, 49, 101, 68, 93, 27, 39),
+(1, 1, 50, 103, 69, 94, 28, 40),
+(1, 1, 51, 105, 71, 96, 28, 40),
+(1, 1, 52, 107, 72, 98, 28, 41),
+(1, 1, 53, 109, 73, 100, 28, 41),
+(1, 1, 54, 111, 74, 102, 29, 42),
+(1, 1, 55, 113, 76, 103, 29, 42),
+(1, 1, 56, 115, 77, 105, 29, 43),
+(1, 1, 57, 117, 78, 107, 29, 43),
+(1, 1, 58, 119, 79, 109, 30, 44),
+(1, 1, 59, 121, 81, 111, 30, 44),
+(1, 1, 60, 123, 82, 113, 30, 45),
+(1, 1, 61, 125, 83, 115, 30, 46),
+(1, 1, 62, 127, 85, 117, 31, 46),
+(1, 1, 63, 129, 86, 119, 31, 47),
+(1, 1, 64, 132, 88, 121, 31, 47),
+(1, 1, 65, 134, 89, 123, 32, 48),
+(1, 1, 66, 136, 90, 125, 32, 49),
+(1, 1, 67, 138, 92, 127, 32, 49),
+(1, 1, 68, 140, 93, 129, 32, 50),
+(1, 1, 69, 143, 95, 131, 33, 50),
+(1, 1, 70, 145, 96, 133, 33, 51),
+(1, 1, 71, 148, 97, 140, 33, 53),
+(1, 1, 72, 156, 99, 143, 33, 54),
+(1, 1, 73, 162, 101, 148, 33, 55),
+(1, 1, 74, 162, 102, 148, 34, 55),
+(1, 1, 75, 165, 104, 150, 34, 56),
+(1, 1, 76, 171, 106, 156, 34, 57),
+(1, 1, 77, 171, 108, 157, 35, 58),
+(1, 1, 78, 174, 109, 159, 35, 58),
+(1, 1, 79, 181, 111, 165, 35, 59),
+(1, 1, 80, 184, 113, 168, 36, 60),
+(1, 2, 1, 22, 20, 22, 20, 21),
+(1, 2, 2, 23, 21, 23, 21, 22),
+(1, 2, 3, 24, 21, 24, 21, 22),
+(1, 2, 4, 25, 22, 25, 22, 23),
+(1, 2, 5, 26, 22, 26, 23, 24),
+(1, 2, 6, 28, 23, 27, 23, 25),
+(1, 2, 7, 29, 24, 28, 24, 25),
+(1, 2, 8, 30, 24, 29, 25, 26),
+(1, 2, 9, 31, 25, 30, 25, 27),
+(1, 2, 10, 32, 25, 32, 26, 27),
+(1, 2, 11, 33, 26, 33, 27, 28),
+(1, 2, 12, 35, 27, 34, 27, 29),
+(1, 2, 13, 36, 27, 35, 28, 30),
+(1, 2, 14, 37, 28, 36, 29, 31),
+(1, 2, 15, 38, 29, 37, 30, 31),
+(1, 2, 16, 40, 29, 38, 30, 32),
+(1, 2, 17, 41, 30, 40, 31, 33),
+(1, 2, 18, 42, 31, 41, 32, 34),
+(1, 2, 19, 43, 31, 42, 33, 35),
+(1, 2, 20, 45, 32, 43, 33, 35),
+(1, 2, 21, 46, 33, 45, 34, 36),
+(1, 2, 22, 47, 33, 46, 35, 37),
+(1, 2, 23, 49, 34, 47, 36, 38),
+(1, 2, 24, 50, 35, 48, 37, 39),
+(1, 2, 25, 51, 36, 50, 37, 40),
+(1, 2, 26, 53, 36, 51, 38, 41),
+(1, 2, 27, 54, 37, 52, 39, 42),
+(1, 2, 28, 56, 38, 54, 40, 43),
+(1, 2, 29, 57, 39, 55, 41, 43),
+(1, 2, 30, 58, 39, 56, 42, 44),
+(1, 2, 31, 60, 40, 58, 43, 45),
+(1, 2, 32, 61, 41, 59, 43, 46),
+(1, 2, 33, 63, 42, 60, 44, 47),
+(1, 2, 34, 64, 43, 62, 45, 48),
+(1, 2, 35, 66, 44, 63, 46, 49),
+(1, 2, 36, 67, 44, 65, 47, 50),
+(1, 2, 37, 69, 45, 66, 48, 51),
+(1, 2, 38, 70, 46, 67, 49, 52),
+(1, 2, 39, 72, 47, 69, 50, 53),
+(1, 2, 40, 73, 48, 70, 51, 54),
+(1, 2, 41, 75, 49, 72, 52, 55),
+(1, 2, 42, 77, 49, 73, 53, 56),
+(1, 2, 43, 78, 50, 75, 54, 57),
+(1, 2, 44, 80, 51, 76, 55, 58),
+(1, 2, 45, 81, 52, 78, 56, 59),
+(1, 2, 46, 83, 53, 79, 57, 61),
+(1, 2, 47, 85, 54, 81, 58, 62),
+(1, 2, 48, 86, 55, 83, 59, 63),
+(1, 2, 49, 88, 56, 84, 60, 64),
+(1, 2, 50, 90, 57, 86, 61, 65),
+(1, 2, 51, 91, 58, 87, 62, 66),
+(1, 2, 52, 93, 59, 89, 63, 67),
+(1, 2, 53, 95, 60, 91, 64, 68),
+(1, 2, 54, 97, 61, 92, 65, 69),
+(1, 2, 55, 98, 61, 94, 66, 71),
+(1, 2, 56, 100, 62, 95, 67, 72),
+(1, 2, 57, 102, 63, 97, 68, 73),
+(1, 2, 58, 104, 64, 99, 69, 74),
+(1, 2, 59, 105, 65, 101, 70, 75),
+(1, 2, 60, 107, 66, 102, 71, 77),
+(1, 2, 61, 109, 67, 104, 73, 78),
+(1, 2, 62, 111, 69, 106, 74, 79),
+(1, 2, 63, 113, 70, 107, 75, 80),
+(1, 2, 64, 115, 71, 109, 76, 81),
+(1, 2, 65, 116, 72, 111, 77, 83),
+(1, 2, 66, 118, 73, 113, 78, 84),
+(1, 2, 67, 120, 74, 115, 79, 85),
+(1, 2, 68, 122, 75, 116, 81, 86),
+(1, 2, 69, 124, 76, 118, 82, 88),
+(1, 2, 70, 126, 77, 120, 83, 89),
+(1, 2, 71, 148, 78, 122, 84, 92),
+(1, 2, 72, 150, 79, 125, 86, 94),
+(1, 2, 73, 152, 80, 127, 87, 96),
+(1, 2, 74, 156, 82, 129, 89, 97),
+(1, 2, 75, 158, 83, 131, 90, 99),
+(1, 2, 76, 162, 84, 134, 92, 100),
+(1, 2, 77, 164, 86, 136, 93, 103),
+(1, 2, 78, 167, 87, 138, 95, 105),
+(1, 2, 79, 170, 88, 153, 96, 106),
+(1, 2, 80, 173, 90, 160, 98, 108),
+(1, 4, 1, 21, 23, 21, 20, 20),
+(1, 4, 2, 22, 24, 22, 20, 20),
+(1, 4, 3, 23, 26, 22, 20, 21),
+(1, 4, 4, 23, 27, 23, 20, 21),
+(1, 4, 5, 24, 29, 24, 21, 21),
+(1, 4, 6, 25, 30, 25, 21, 22),
+(1, 4, 7, 26, 32, 25, 21, 22),
+(1, 4, 8, 26, 33, 26, 21, 23),
+(1, 4, 9, 27, 35, 27, 21, 23),
+(1, 4, 10, 28, 36, 27, 21, 23),
+(1, 4, 11, 29, 38, 28, 22, 24),
+(1, 4, 12, 30, 39, 29, 22, 24),
+(1, 4, 13, 31, 41, 30, 22, 25),
+(1, 4, 14, 31, 43, 31, 22, 25),
+(1, 4, 15, 32, 44, 31, 22, 25),
+(1, 4, 16, 33, 46, 32, 23, 26),
+(1, 4, 17, 34, 48, 33, 23, 26),
+(1, 4, 18, 35, 49, 34, 23, 27),
+(1, 4, 19, 36, 51, 35, 23, 27),
+(1, 4, 20, 37, 53, 35, 23, 28),
+(1, 4, 21, 38, 54, 36, 24, 28),
+(1, 4, 22, 39, 56, 37, 24, 29),
+(1, 4, 23, 40, 58, 38, 24, 29),
+(1, 4, 24, 41, 60, 39, 24, 30),
+(1, 4, 25, 42, 61, 40, 25, 30),
+(1, 4, 26, 43, 63, 41, 25, 31),
+(1, 4, 27, 44, 65, 42, 25, 31),
+(1, 4, 28, 45, 67, 43, 25, 32),
+(1, 4, 29, 46, 69, 43, 25, 32),
+(1, 4, 30, 47, 71, 44, 26, 33),
+(1, 4, 31, 48, 72, 45, 26, 33),
+(1, 4, 32, 49, 74, 46, 26, 34),
+(1, 4, 33, 50, 76, 47, 27, 34),
+(1, 4, 34, 51, 78, 48, 27, 35),
+(1, 4, 35, 52, 80, 49, 27, 35),
+(1, 4, 36, 53, 82, 50, 27, 36),
+(1, 4, 37, 54, 84, 51, 28, 36),
+(1, 4, 38, 55, 86, 52, 28, 37),
+(1, 4, 39, 56, 88, 53, 28, 38),
+(1, 4, 40, 57, 90, 54, 28, 38),
+(1, 4, 41, 58, 92, 55, 29, 39),
+(1, 4, 42, 60, 94, 56, 29, 39),
+(1, 4, 43, 61, 96, 57, 29, 40),
+(1, 4, 44, 62, 98, 58, 30, 40),
+(1, 4, 45, 63, 100, 59, 30, 41),
+(1, 4, 46, 64, 103, 61, 30, 42),
+(1, 4, 47, 65, 105, 62, 31, 42),
+(1, 4, 48, 66, 107, 63, 31, 43),
+(1, 4, 49, 68, 109, 64, 31, 44),
+(1, 4, 50, 69, 111, 65, 32, 44),
+(1, 4, 51, 70, 113, 66, 32, 45),
+(1, 4, 52, 71, 116, 67, 32, 45),
+(1, 4, 53, 73, 118, 68, 33, 46),
+(1, 4, 54, 74, 120, 69, 33, 47),
+(1, 4, 55, 75, 122, 71, 33, 47),
+(1, 4, 56, 76, 125, 72, 34, 48),
+(1, 4, 57, 78, 127, 73, 34, 49),
+(1, 4, 58, 79, 129, 74, 34, 49),
+(1, 4, 59, 80, 131, 75, 35, 50),
+(1, 4, 60, 81, 134, 77, 35, 51),
+(1, 4, 61, 83, 136, 78, 35, 51),
+(1, 4, 62, 84, 138, 79, 36, 52),
+(1, 4, 63, 85, 141, 80, 36, 53),
+(1, 4, 64, 87, 143, 81, 37, 54),
+(1, 4, 65, 88, 146, 83, 37, 54),
+(1, 4, 66, 89, 148, 84, 37, 55),
+(1, 4, 67, 91, 151, 85, 38, 56),
+(1, 4, 68, 92, 153, 86, 38, 57),
+(1, 4, 69, 94, 156, 88, 39, 57),
+(1, 4, 70, 95, 158, 89, 39, 58),
+(1, 4, 71, 97, 161, 90, 39, 60),
+(1, 4, 72, 99, 164, 92, 40, 60),
+(1, 4, 73, 100, 167, 94, 40, 61),
+(1, 4, 74, 102, 170, 95, 41, 62),
+(1, 4, 75, 104, 173, 97, 41, 63),
+(1, 4, 76, 105, 176, 98, 41, 64),
+(1, 4, 77, 107, 179, 100, 42, 65),
+(1, 4, 78, 109, 183, 106, 42, 66),
+(1, 4, 79, 111, 186, 107, 43, 67),
+(1, 4, 80, 113, 189, 109, 43, 69),
+(1, 5, 1, 20, 20, 20, 22, 23),
+(1, 5, 2, 20, 20, 20, 23, 24),
+(1, 5, 3, 20, 20, 21, 25, 26),
+(1, 5, 4, 20, 21, 21, 26, 27),
+(1, 5, 5, 21, 21, 21, 27, 28),
+(1, 5, 6, 21, 21, 22, 29, 30),
+(1, 5, 7, 21, 21, 22, 30, 31),
+(1, 5, 8, 21, 22, 23, 31, 33),
+(1, 5, 9, 21, 22, 23, 33, 34),
+(1, 5, 10, 21, 22, 23, 34, 36),
+(1, 5, 11, 22, 22, 24, 36, 37),
+(1, 5, 12, 22, 23, 24, 37, 39),
+(1, 5, 13, 22, 23, 25, 38, 40),
+(1, 5, 14, 22, 23, 25, 40, 42),
+(1, 5, 15, 22, 23, 25, 41, 43),
+(1, 5, 16, 23, 24, 26, 43, 45),
+(1, 5, 17, 23, 24, 26, 44, 46),
+(1, 5, 18, 23, 24, 27, 46, 48),
+(1, 5, 19, 23, 24, 27, 47, 49),
+(1, 5, 20, 23, 25, 28, 49, 51),
+(1, 5, 21, 24, 25, 28, 51, 53),
+(1, 5, 22, 24, 25, 29, 52, 54),
+(1, 5, 23, 24, 26, 29, 54, 56),
+(1, 5, 24, 24, 26, 30, 55, 58),
+(1, 5, 25, 25, 26, 30, 57, 59),
+(1, 5, 26, 25, 27, 31, 59, 61),
+(1, 5, 27, 25, 27, 31, 60, 63),
+(1, 5, 28, 25, 27, 32, 62, 65),
+(1, 5, 29, 25, 28, 32, 64, 66),
+(1, 5, 30, 26, 28, 33, 65, 68),
+(1, 5, 31, 26, 28, 33, 67, 70),
+(1, 5, 32, 26, 29, 34, 69, 72),
+(1, 5, 33, 27, 29, 34, 70, 73),
+(1, 5, 34, 27, 29, 35, 72, 75),
+(1, 5, 35, 27, 30, 35, 74, 77),
+(1, 5, 36, 27, 30, 36, 76, 79),
+(1, 5, 37, 28, 30, 36, 78, 81),
+(1, 5, 38, 28, 31, 37, 79, 83),
+(1, 5, 39, 28, 31, 38, 81, 85),
+(1, 5, 40, 28, 31, 38, 83, 87),
+(1, 5, 41, 29, 32, 39, 85, 88),
+(1, 5, 42, 29, 32, 39, 87, 90),
+(1, 5, 43, 29, 33, 40, 89, 92),
+(1, 5, 44, 30, 33, 40, 91, 94),
+(1, 5, 45, 30, 33, 41, 92, 96),
+(1, 5, 46, 30, 34, 42, 94, 98),
+(1, 5, 47, 31, 34, 42, 96, 100),
+(1, 5, 48, 31, 35, 43, 98, 102),
+(1, 5, 49, 31, 35, 44, 100, 104),
+(1, 5, 50, 32, 36, 44, 102, 106),
+(1, 5, 51, 32, 36, 45, 104, 109),
+(1, 5, 52, 32, 36, 45, 106, 111),
+(1, 5, 53, 33, 37, 46, 108, 113),
+(1, 5, 54, 33, 37, 47, 110, 115),
+(1, 5, 55, 33, 38, 47, 112, 117),
+(1, 5, 56, 34, 38, 48, 114, 119),
+(1, 5, 57, 34, 39, 49, 117, 121),
+(1, 5, 58, 34, 39, 49, 119, 124),
+(1, 5, 59, 35, 40, 50, 121, 126),
+(1, 5, 60, 35, 40, 51, 123, 128),
+(1, 5, 61, 35, 41, 51, 125, 130),
+(1, 5, 62, 36, 41, 52, 127, 132),
+(1, 5, 63, 36, 41, 53, 129, 135),
+(1, 5, 64, 37, 42, 54, 132, 137),
+(1, 5, 65, 37, 42, 54, 134, 139),
+(1, 5, 66, 37, 43, 55, 136, 142),
+(1, 5, 67, 38, 43, 56, 138, 144),
+(1, 5, 68, 38, 44, 57, 140, 146),
+(1, 5, 69, 39, 44, 57, 143, 149),
+(1, 5, 70, 39, 45, 58, 145, 151),
+(1, 5, 71, 39, 46, 59, 148, 158),
+(1, 5, 72, 40, 46, 59, 151, 161),
+(1, 5, 73, 40, 47, 60, 154, 164),
+(1, 5, 74, 41, 47, 61, 156, 167),
+(1, 5, 75, 41, 48, 62, 159, 170),
+(1, 5, 76, 41, 49, 63, 162, 174),
+(1, 5, 77, 42, 49, 64, 165, 177),
+(1, 5, 78, 42, 50, 65, 168, 180),
+(1, 5, 79, 43, 50, 66, 171, 183),
+(1, 5, 80, 43, 51, 67, 174, 186),
+(1, 6, 1, 23, 20, 22, 20, 20),
+(1, 6, 2, 24, 21, 23, 20, 20),
+(1, 6, 3, 26, 22, 24, 20, 21),
+(1, 6, 4, 27, 22, 26, 20, 21),
+(1, 6, 5, 28, 23, 27, 20, 21),
+(1, 6, 6, 30, 24, 28, 20, 21),
+(1, 6, 7, 31, 25, 29, 21, 22),
+(1, 6, 8, 32, 26, 30, 21, 22),
+(1, 6, 9, 34, 26, 32, 21, 22),
+(1, 6, 10, 35, 27, 33, 21, 23),
+(1, 6, 11, 36, 28, 34, 21, 23),
+(1, 6, 12, 38, 29, 35, 21, 23),
+(1, 6, 13, 39, 30, 37, 21, 24),
+(1, 6, 14, 41, 31, 38, 21, 24),
+(1, 6, 15, 42, 32, 39, 21, 24),
+(1, 6, 16, 44, 33, 41, 21, 25),
+(1, 6, 17, 45, 34, 42, 22, 25),
+(1, 6, 18, 47, 34, 43, 22, 25),
+(1, 6, 19, 48, 35, 45, 22, 26),
+(1, 6, 20, 50, 36, 46, 22, 26),
+(1, 6, 21, 51, 37, 48, 22, 26),
+(1, 6, 22, 53, 38, 49, 22, 27),
+(1, 6, 23, 54, 39, 51, 22, 27),
+(1, 6, 24, 56, 40, 52, 23, 28),
+(1, 6, 25, 58, 41, 53, 23, 28),
+(1, 6, 26, 59, 42, 55, 23, 28),
+(1, 6, 27, 61, 43, 56, 23, 29),
+(1, 6, 28, 63, 44, 58, 23, 29),
+(1, 6, 29, 64, 45, 59, 23, 30),
+(1, 6, 30, 66, 46, 61, 24, 30),
+(1, 6, 31, 68, 47, 62, 24, 30),
+(1, 6, 32, 69, 48, 64, 24, 31),
+(1, 6, 33, 71, 50, 66, 24, 31),
+(1, 6, 34, 73, 51, 67, 24, 32),
+(1, 6, 35, 74, 52, 69, 24, 32),
+(1, 6, 36, 76, 53, 70, 25, 33),
+(1, 6, 37, 78, 54, 72, 25, 33),
+(1, 6, 38, 80, 55, 74, 25, 34),
+(1, 6, 39, 82, 56, 75, 25, 34),
+(1, 6, 40, 83, 57, 77, 25, 35),
+(1, 6, 41, 85, 58, 79, 26, 35),
+(1, 6, 42, 87, 60, 80, 26, 35),
+(1, 6, 43, 89, 61, 82, 26, 36),
+(1, 6, 44, 91, 62, 84, 26, 36),
+(1, 6, 45, 93, 63, 85, 26, 37),
+(1, 6, 46, 95, 64, 87, 27, 37),
+(1, 6, 47, 97, 66, 89, 27, 38),
+(1, 6, 48, 99, 67, 91, 27, 38),
+(1, 6, 49, 101, 68, 93, 27, 39),
+(1, 6, 50, 103, 69, 94, 28, 40),
+(1, 6, 51, 105, 71, 96, 28, 40),
+(1, 6, 52, 106, 72, 97, 28, 41),
+(1, 6, 53, 107, 72, 98, 28, 41),
+(1, 6, 54, 107, 73, 98, 29, 42),
+(1, 6, 55, 108, 73, 99, 29, 43),
+(1, 6, 56, 111, 75, 102, 29, 44),
+(1, 6, 57, 113, 76, 104, 29, 44),
+(1, 6, 58, 118, 77, 106, 30, 45),
+(1, 6, 59, 118, 79, 108, 30, 45),
+(1, 6, 60, 123, 80, 110, 30, 46),
+(1, 6, 61, 125, 81, 112, 30, 47),
+(1, 6, 62, 128, 83, 114, 30, 47),
+(1, 6, 63, 130, 84, 117, 31, 48),
+(1, 6, 64, 130, 86, 119, 31, 48),
+(1, 6, 65, 140, 87, 128, 31, 49),
+(1, 6, 66, 143, 89, 131, 31, 50),
+(1, 6, 67, 146, 90, 133, 32, 50),
+(1, 6, 68, 148, 92, 135, 32, 51),
+(1, 6, 69, 151, 93, 138, 32, 52),
+(1, 6, 70, 154, 95, 140, 32, 52),
+(1, 6, 71, 162, 97, 144, 33, 53),
+(1, 6, 72, 164, 98, 146, 33, 54),
+(1, 6, 73, 165, 100, 148, 33, 55),
+(1, 6, 74, 166, 102, 151, 33, 55),
+(1, 6, 75, 169, 103, 154, 34, 56),
+(1, 6, 76, 172, 105, 157, 34, 57),
+(1, 6, 77, 175, 107, 157, 34, 58),
+(1, 6, 78, 176, 108, 157, 34, 58),
+(1, 6, 79, 177, 110, 157, 35, 59),
+(1, 6, 80, 180, 112, 160, 35, 60),
+(1, 8, 1, 20, 20, 20, 23, 22),
+(1, 8, 2, 20, 20, 20, 24, 23),
+(1, 8, 3, 20, 20, 21, 26, 25),
+(1, 8, 4, 20, 20, 21, 27, 26),
+(1, 8, 5, 20, 21, 21, 28, 27),
+(1, 8, 6, 20, 21, 21, 30, 29),
+(1, 8, 7, 21, 21, 22, 31, 30),
+(1, 8, 8, 21, 21, 22, 33, 31),
+(1, 8, 9, 21, 21, 22, 34, 33),
+(1, 8, 10, 21, 21, 23, 36, 34),
+(1, 8, 11, 21, 22, 23, 37, 36),
+(1, 8, 12, 21, 22, 23, 39, 37),
+(1, 8, 13, 21, 22, 24, 40, 38),
+(1, 8, 14, 21, 22, 24, 42, 40),
+(1, 8, 15, 21, 22, 24, 43, 41),
+(1, 8, 16, 21, 23, 25, 45, 43),
+(1, 8, 17, 22, 23, 25, 46, 44),
+(1, 8, 18, 22, 23, 25, 48, 46),
+(1, 8, 19, 22, 23, 26, 49, 47),
+(1, 8, 20, 22, 23, 26, 51, 49),
+(1, 8, 21, 22, 24, 26, 53, 51),
+(1, 8, 22, 22, 24, 27, 54, 52),
+(1, 8, 23, 22, 24, 27, 56, 54),
+(1, 8, 24, 23, 24, 28, 58, 55),
+(1, 8, 25, 23, 25, 28, 59, 57),
+(1, 8, 26, 23, 25, 28, 61, 59),
+(1, 8, 27, 23, 25, 29, 63, 60),
+(1, 8, 28, 23, 25, 29, 65, 62),
+(1, 8, 29, 23, 25, 30, 66, 64),
+(1, 8, 30, 24, 26, 30, 68, 65),
+(1, 8, 31, 24, 26, 30, 70, 67),
+(1, 8, 32, 24, 26, 31, 72, 69),
+(1, 8, 33, 24, 27, 31, 73, 70),
+(1, 8, 34, 24, 27, 32, 75, 72),
+(1, 8, 35, 24, 27, 32, 77, 74),
+(1, 8, 36, 25, 27, 33, 79, 76),
+(1, 8, 37, 25, 28, 33, 81, 78),
+(1, 8, 38, 25, 28, 34, 83, 79),
+(1, 8, 39, 25, 28, 34, 85, 81),
+(1, 8, 40, 25, 28, 35, 87, 83),
+(1, 8, 41, 26, 29, 35, 88, 85),
+(1, 8, 42, 26, 29, 35, 90, 87),
+(1, 8, 43, 26, 29, 36, 92, 89),
+(1, 8, 44, 26, 30, 36, 94, 91),
+(1, 8, 45, 26, 30, 37, 96, 92),
+(1, 8, 46, 27, 30, 37, 98, 94),
+(1, 8, 47, 27, 31, 38, 100, 96),
+(1, 8, 48, 27, 31, 38, 102, 98),
+(1, 8, 49, 27, 31, 39, 104, 100),
+(1, 8, 50, 28, 32, 40, 106, 102),
+(1, 8, 51, 28, 32, 40, 109, 104),
+(1, 8, 52, 28, 32, 41, 111, 106),
+(1, 8, 53, 28, 33, 41, 113, 108),
+(1, 8, 54, 29, 33, 42, 115, 110),
+(1, 8, 55, 29, 33, 42, 117, 112),
+(1, 8, 56, 29, 34, 43, 119, 114),
+(1, 8, 57, 29, 34, 43, 121, 117),
+(1, 8, 58, 30, 34, 44, 124, 119),
+(1, 8, 59, 30, 35, 44, 126, 121),
+(1, 8, 60, 30, 35, 45, 128, 123),
+(1, 8, 61, 30, 35, 46, 130, 125),
+(1, 8, 62, 31, 36, 46, 132, 127),
+(1, 8, 63, 31, 36, 47, 135, 129),
+(1, 8, 64, 31, 37, 47, 137, 132),
+(1, 8, 65, 32, 37, 48, 139, 134),
+(1, 8, 66, 32, 37, 49, 142, 136),
+(1, 8, 67, 32, 38, 49, 144, 138),
+(1, 8, 68, 32, 38, 50, 146, 140),
+(1, 8, 69, 33, 39, 50, 149, 143),
+(1, 8, 70, 33, 39, 51, 151, 145),
+(1, 8, 71, 33, 39, 52, 154, 152),
+(1, 8, 72, 33, 40, 53, 160, 155),
+(1, 8, 73, 33, 40, 54, 160, 158),
+(1, 8, 74, 34, 41, 54, 163, 160),
+(1, 8, 75, 34, 41, 55, 166, 163),
+(1, 8, 76, 34, 41, 56, 169, 166),
+(1, 8, 77, 35, 42, 57, 172, 169),
+(1, 8, 78, 35, 42, 57, 175, 173),
+(1, 8, 79, 35, 43, 58, 178, 176),
+(1, 8, 80, 36, 43, 59, 181, 179),
+(1, 9, 1, 20, 20, 21, 22, 22),
+(1, 9, 2, 20, 20, 22, 23, 23),
+(1, 9, 3, 21, 21, 22, 24, 24),
+(1, 9, 4, 21, 21, 23, 26, 25),
+(1, 9, 5, 21, 21, 23, 27, 27),
+(1, 9, 6, 21, 22, 24, 28, 28),
+(1, 9, 7, 22, 22, 24, 29, 29),
+(1, 9, 8, 22, 23, 25, 30, 30),
+(1, 9, 9, 22, 23, 26, 32, 31),
+(1, 9, 10, 23, 23, 26, 33, 33),
+(1, 9, 11, 23, 24, 27, 34, 34),
+(1, 9, 12, 23, 24, 27, 35, 35),
+(1, 9, 13, 24, 25, 28, 37, 36),
+(1, 9, 14, 24, 25, 29, 38, 38),
+(1, 9, 15, 24, 25, 29, 39, 39),
+(1, 9, 16, 25, 26, 30, 41, 40),
+(1, 9, 17, 25, 26, 31, 42, 42),
+(1, 9, 18, 25, 27, 31, 43, 43),
+(1, 9, 19, 26, 27, 32, 45, 44),
+(1, 9, 20, 26, 28, 33, 46, 46),
+(1, 9, 21, 26, 28, 33, 48, 47),
+(1, 9, 22, 27, 29, 34, 49, 49),
+(1, 9, 23, 27, 29, 35, 51, 50),
+(1, 9, 24, 28, 30, 35, 52, 51),
+(1, 9, 25, 28, 30, 36, 53, 53),
+(1, 9, 26, 28, 31, 37, 55, 54),
+(1, 9, 27, 29, 31, 37, 56, 56),
+(1, 9, 28, 29, 32, 38, 58, 57),
+(1, 9, 29, 30, 32, 39, 59, 59),
+(1, 9, 30, 30, 33, 40, 61, 60),
+(1, 9, 31, 30, 33, 40, 62, 62),
+(1, 9, 32, 31, 34, 41, 64, 63),
+(1, 9, 33, 31, 34, 42, 66, 65),
+(1, 9, 34, 32, 35, 43, 67, 66),
+(1, 9, 35, 32, 35, 44, 69, 68),
+(1, 9, 36, 33, 36, 44, 70, 69),
+(1, 9, 37, 33, 36, 45, 72, 71),
+(1, 9, 38, 34, 37, 46, 74, 73),
+(1, 9, 39, 34, 38, 47, 75, 74),
+(1, 9, 40, 35, 38, 48, 77, 76),
+(1, 9, 41, 35, 39, 48, 79, 78),
+(1, 9, 42, 35, 39, 49, 80, 79),
+(1, 9, 43, 36, 40, 50, 82, 81),
+(1, 9, 44, 36, 40, 51, 84, 83),
+(1, 9, 45, 37, 41, 52, 85, 84),
+(1, 9, 46, 37, 42, 53, 87, 86),
+(1, 9, 47, 38, 42, 54, 89, 88),
+(1, 9, 48, 38, 43, 55, 91, 89),
+(1, 9, 49, 39, 44, 55, 93, 91),
+(1, 9, 50, 40, 44, 56, 94, 93),
+(1, 9, 51, 40, 45, 57, 96, 95),
+(1, 9, 52, 41, 45, 58, 98, 97),
+(1, 9, 53, 41, 46, 59, 100, 98),
+(1, 9, 54, 42, 47, 60, 102, 100),
+(1, 9, 55, 42, 47, 61, 103, 102),
+(1, 9, 56, 43, 48, 62, 105, 104),
+(1, 9, 57, 43, 49, 63, 107, 106),
+(1, 9, 58, 44, 49, 64, 109, 108),
+(1, 9, 59, 44, 50, 65, 111, 109),
+(1, 9, 60, 45, 51, 66, 113, 111),
+(1, 9, 61, 46, 51, 67, 115, 113),
+(1, 9, 62, 46, 52, 68, 117, 115),
+(1, 9, 63, 47, 53, 69, 119, 117),
+(1, 9, 64, 47, 54, 70, 121, 119),
+(1, 9, 65, 48, 54, 71, 123, 121),
+(1, 9, 66, 49, 55, 72, 125, 123),
+(1, 9, 67, 49, 56, 73, 127, 125),
+(1, 9, 68, 50, 57, 74, 129, 127),
+(1, 9, 69, 50, 57, 75, 131, 129),
+(1, 9, 70, 51, 58, 76, 133, 131),
+(1, 9, 71, 52, 59, 78, 135, 146),
+(1, 9, 72, 53, 59, 79, 138, 148),
+(1, 9, 73, 54, 60, 80, 140, 151),
+(1, 9, 74, 54, 61, 89, 143, 154),
+(1, 9, 75, 55, 62, 91, 145, 156),
+(1, 9, 76, 56, 63, 92, 148, 159),
+(1, 9, 77, 57, 64, 93, 151, 162),
+(1, 9, 78, 57, 65, 95, 153, 165),
+(1, 9, 79, 58, 66, 96, 156, 168),
+(1, 9, 80, 59, 67, 97, 159, 170),
+(2, 1, 1, 26, 17, 24, 17, 23),
+(2, 1, 2, 27, 18, 25, 17, 23),
+(2, 1, 3, 29, 19, 26, 17, 24),
+(2, 1, 4, 30, 19, 27, 17, 24),
+(2, 1, 5, 31, 20, 29, 17, 24),
+(2, 1, 6, 32, 21, 30, 17, 24),
+(2, 1, 7, 34, 22, 31, 18, 25),
+(2, 1, 8, 35, 23, 32, 18, 25),
+(2, 1, 9, 37, 24, 34, 18, 25),
+(2, 1, 10, 38, 24, 35, 18, 26),
+(2, 1, 11, 39, 25, 36, 18, 26),
+(2, 1, 12, 41, 26, 37, 18, 26),
+(2, 1, 13, 42, 27, 39, 18, 27),
+(2, 1, 14, 44, 28, 40, 18, 27),
+(2, 1, 15, 45, 29, 41, 18, 27),
+(2, 1, 16, 47, 30, 43, 19, 28),
+(2, 1, 17, 48, 31, 44, 19, 28),
+(2, 1, 18, 50, 32, 45, 19, 28),
+(2, 1, 19, 51, 33, 47, 19, 29),
+(2, 1, 20, 53, 34, 48, 19, 29),
+(2, 1, 21, 54, 34, 50, 19, 29),
+(2, 1, 22, 56, 35, 51, 19, 30),
+(2, 1, 23, 57, 36, 52, 20, 30),
+(2, 1, 24, 59, 37, 54, 20, 30),
+(2, 1, 25, 60, 38, 55, 20, 31),
+(2, 1, 26, 62, 39, 57, 20, 31),
+(2, 1, 27, 64, 40, 58, 20, 32),
+(2, 1, 28, 65, 41, 60, 20, 32),
+(2, 1, 29, 67, 43, 61, 21, 32),
+(2, 1, 30, 69, 44, 63, 21, 33),
+(2, 1, 31, 70, 45, 64, 21, 33),
+(2, 1, 32, 72, 46, 66, 21, 34),
+(2, 1, 33, 74, 47, 67, 21, 34),
+(2, 1, 34, 76, 48, 69, 21, 35),
+(2, 1, 35, 77, 49, 71, 22, 35),
+(2, 1, 36, 79, 50, 72, 22, 36),
+(2, 1, 37, 81, 51, 74, 22, 36),
+(2, 1, 38, 83, 52, 76, 22, 36),
+(2, 1, 39, 84, 53, 77, 22, 37),
+(2, 1, 40, 86, 55, 79, 23, 37),
+(2, 1, 41, 88, 56, 81, 23, 38),
+(2, 1, 42, 90, 57, 82, 23, 38),
+(2, 1, 43, 92, 58, 84, 23, 39),
+(2, 1, 44, 94, 59, 86, 23, 39),
+(2, 1, 45, 96, 60, 87, 24, 40),
+(2, 1, 46, 98, 62, 89, 24, 40),
+(2, 1, 47, 100, 63, 91, 24, 41),
+(2, 1, 48, 101, 64, 93, 24, 41),
+(2, 1, 49, 103, 65, 94, 25, 42),
+(2, 1, 50, 105, 66, 96, 25, 42),
+(2, 1, 51, 107, 68, 98, 25, 43),
+(2, 1, 52, 109, 69, 100, 25, 43),
+(2, 1, 53, 111, 70, 102, 25, 44),
+(2, 1, 54, 113, 71, 104, 26, 45),
+(2, 1, 55, 115, 73, 105, 26, 45),
+(2, 1, 56, 118, 74, 107, 26, 46),
+(2, 1, 57, 120, 75, 109, 26, 46),
+(2, 1, 58, 122, 77, 111, 27, 47),
+(2, 1, 59, 124, 78, 113, 27, 47),
+(2, 1, 60, 126, 79, 115, 27, 48),
+(2, 1, 61, 128, 81, 117, 27, 48),
+(2, 1, 62, 130, 82, 119, 28, 49),
+(2, 1, 63, 132, 83, 121, 28, 50),
+(2, 1, 64, 135, 85, 123, 28, 50),
+(2, 1, 65, 137, 86, 125, 29, 51),
+(2, 1, 66, 139, 87, 127, 29, 52),
+(2, 1, 67, 141, 89, 129, 29, 52),
+(2, 1, 68, 143, 90, 131, 29, 53),
+(2, 1, 69, 146, 92, 133, 30, 53),
+(2, 1, 70, 148, 93, 135, 30, 54),
+(2, 1, 71, 157, 94, 142, 30, 55),
+(2, 1, 72, 162, 96, 148, 30, 56),
+(2, 1, 73, 165, 98, 150, 30, 57),
+(2, 1, 74, 168, 99, 153, 31, 57),
+(2, 1, 75, 170, 101, 154, 31, 58),
+(2, 1, 76, 172, 103, 156, 31, 59),
+(2, 1, 77, 174, 105, 159, 32, 60),
+(2, 1, 78, 179, 106, 162, 32, 60),
+(2, 1, 79, 184, 108, 167, 32, 61),
+(2, 1, 80, 187, 110, 170, 33, 62),
+(2, 3, 1, 23, 20, 23, 17, 24),
+(2, 3, 2, 23, 21, 24, 18, 25),
+(2, 3, 3, 24, 23, 25, 18, 25),
+(2, 3, 4, 24, 24, 26, 19, 26),
+(2, 3, 5, 25, 25, 27, 19, 26),
+(2, 3, 6, 25, 27, 28, 20, 27),
+(2, 3, 7, 26, 28, 28, 21, 28),
+(2, 3, 8, 26, 30, 29, 21, 28),
+(2, 3, 9, 26, 31, 30, 22, 29),
+(2, 3, 10, 27, 33, 31, 22, 30),
+(2, 3, 11, 27, 34, 32, 23, 30),
+(2, 3, 12, 28, 36, 33, 24, 31),
+(2, 3, 13, 28, 37, 34, 24, 32),
+(2, 3, 14, 29, 39, 35, 25, 33),
+(2, 3, 15, 29, 40, 36, 26, 33),
+(2, 3, 16, 30, 42, 37, 26, 34),
+(2, 3, 17, 30, 43, 39, 27, 35),
+(2, 3, 18, 31, 45, 40, 28, 35),
+(2, 3, 19, 31, 47, 41, 28, 36),
+(2, 3, 20, 32, 48, 42, 29, 37),
+(2, 3, 21, 32, 50, 43, 30, 38),
+(2, 3, 22, 33, 51, 44, 31, 39),
+(2, 3, 23, 34, 53, 45, 31, 39),
+(2, 3, 24, 34, 55, 46, 32, 40),
+(2, 3, 25, 35, 57, 47, 33, 41),
+(2, 3, 26, 35, 58, 48, 34, 42),
+(2, 3, 27, 36, 60, 50, 34, 43),
+(2, 3, 28, 36, 62, 51, 35, 43),
+(2, 3, 29, 37, 63, 52, 36, 44),
+(2, 3, 30, 38, 65, 53, 37, 45),
+(2, 3, 31, 38, 67, 54, 37, 46),
+(2, 3, 32, 39, 69, 56, 38, 47),
+(2, 3, 33, 39, 71, 57, 39, 48),
+(2, 3, 34, 40, 72, 58, 40, 49),
+(2, 3, 35, 41, 74, 59, 41, 49),
+(2, 3, 36, 41, 76, 61, 42, 50),
+(2, 3, 37, 42, 78, 62, 42, 51),
+(2, 3, 38, 43, 80, 63, 43, 52),
+(2, 3, 39, 43, 82, 64, 44, 53),
+(2, 3, 40, 44, 84, 66, 45, 54),
+(2, 3, 41, 45, 86, 67, 46, 55),
+(2, 3, 42, 45, 88, 68, 47, 56),
+(2, 3, 43, 46, 90, 70, 47, 57),
+(2, 3, 44, 47, 91, 71, 48, 58),
+(2, 3, 45, 47, 93, 72, 49, 59),
+(2, 3, 46, 48, 95, 74, 50, 60),
+(2, 3, 47, 49, 98, 75, 51, 61),
+(2, 3, 48, 50, 100, 77, 52, 62),
+(2, 3, 49, 50, 102, 78, 53, 63),
+(2, 3, 50, 51, 104, 79, 54, 64),
+(2, 3, 51, 52, 106, 81, 55, 65),
+(2, 3, 52, 52, 108, 82, 56, 66),
+(2, 3, 53, 53, 110, 84, 57, 67),
+(2, 3, 54, 54, 112, 85, 58, 68),
+(2, 3, 55, 55, 114, 87, 59, 69),
+(2, 3, 56, 55, 116, 88, 60, 70),
+(2, 3, 57, 56, 118, 90, 61, 71),
+(2, 3, 58, 57, 121, 91, 62, 72),
+(2, 3, 59, 58, 123, 93, 63, 73),
+(2, 3, 60, 59, 125, 94, 64, 74),
+(2, 3, 61, 59, 127, 96, 65, 76),
+(2, 3, 62, 60, 130, 97, 66, 77),
+(2, 3, 63, 61, 132, 99, 67, 78),
+(2, 3, 64, 62, 134, 100, 68, 79),
+(2, 3, 65, 63, 136, 102, 69, 80),
+(2, 3, 66, 64, 139, 104, 70, 81),
+(2, 3, 67, 64, 141, 105, 71, 82),
+(2, 3, 68, 65, 143, 107, 72, 84),
+(2, 3, 69, 66, 146, 108, 73, 85),
+(2, 3, 70, 67, 148, 110, 74, 86),
+(2, 3, 71, 68, 151, 112, 75, 87),
+(2, 3, 72, 69, 154, 114, 76, 88),
+(2, 3, 73, 70, 157, 116, 77, 90),
+(2, 3, 74, 71, 160, 118, 79, 91),
+(2, 3, 75, 72, 163, 120, 80, 93),
+(2, 3, 76, 73, 166, 122, 81, 94),
+(2, 3, 77, 74, 169, 124, 83, 96),
+(2, 3, 78, 75, 172, 126, 84, 97),
+(2, 3, 79, 76, 175, 128, 85, 99),
+(2, 3, 80, 77, 178, 130, 87, 100),
+(2, 4, 1, 24, 20, 23, 17, 23),
+(2, 4, 2, 25, 21, 24, 17, 23),
+(2, 4, 3, 25, 23, 24, 17, 24),
+(2, 4, 4, 26, 24, 25, 17, 24),
+(2, 4, 5, 27, 26, 26, 18, 24),
+(2, 4, 6, 28, 27, 26, 18, 25),
+(2, 4, 7, 29, 29, 27, 18, 25),
+(2, 4, 8, 29, 30, 28, 18, 26),
+(2, 4, 9, 30, 32, 29, 18, 26),
+(2, 4, 10, 31, 33, 29, 19, 26),
+(2, 4, 11, 32, 35, 30, 19, 27),
+(2, 4, 12, 33, 37, 31, 19, 27),
+(2, 4, 13, 34, 38, 32, 19, 28),
+(2, 4, 14, 34, 40, 32, 19, 28),
+(2, 4, 15, 35, 41, 33, 19, 28),
+(2, 4, 16, 36, 43, 34, 20, 29),
+(2, 4, 17, 37, 45, 35, 20, 29),
+(2, 4, 18, 38, 46, 36, 20, 30),
+(2, 4, 19, 39, 48, 37, 20, 30),
+(2, 4, 20, 40, 50, 37, 21, 31),
+(2, 4, 21, 41, 52, 38, 21, 31),
+(2, 4, 22, 42, 53, 39, 21, 31),
+(2, 4, 23, 43, 55, 40, 21, 32),
+(2, 4, 24, 43, 57, 41, 21, 32),
+(2, 4, 25, 44, 59, 42, 22, 33),
+(2, 4, 26, 45, 60, 43, 22, 33),
+(2, 4, 27, 46, 62, 44, 22, 34),
+(2, 4, 28, 47, 64, 44, 22, 34),
+(2, 4, 29, 48, 66, 45, 23, 35),
+(2, 4, 30, 49, 68, 46, 23, 35),
+(2, 4, 31, 50, 70, 47, 23, 36),
+(2, 4, 32, 51, 72, 48, 23, 36),
+(2, 4, 33, 53, 73, 49, 24, 37),
+(2, 4, 34, 54, 75, 50, 24, 38),
+(2, 4, 35, 55, 77, 51, 24, 38),
+(2, 4, 36, 56, 79, 52, 24, 39),
+(2, 4, 37, 57, 81, 53, 25, 39),
+(2, 4, 38, 58, 83, 54, 25, 40),
+(2, 4, 39, 59, 85, 55, 25, 40),
+(2, 4, 40, 60, 87, 56, 26, 41),
+(2, 4, 41, 61, 89, 57, 26, 41),
+(2, 4, 42, 62, 91, 58, 26, 42),
+(2, 4, 43, 63, 93, 59, 27, 43),
+(2, 4, 44, 65, 95, 60, 27, 43),
+(2, 4, 45, 66, 98, 61, 27, 44),
+(2, 4, 46, 67, 100, 62, 27, 44),
+(2, 4, 47, 68, 102, 64, 28, 45),
+(2, 4, 48, 69, 104, 65, 28, 46),
+(2, 4, 49, 71, 106, 66, 28, 46),
+(2, 4, 50, 72, 108, 67, 29, 47),
+(2, 4, 51, 73, 110, 68, 29, 48),
+(2, 4, 52, 74, 113, 69, 29, 48),
+(2, 4, 53, 75, 115, 70, 30, 49),
+(2, 4, 54, 77, 117, 71, 30, 50),
+(2, 4, 55, 78, 119, 73, 30, 50),
+(2, 4, 56, 79, 122, 74, 31, 51),
+(2, 4, 57, 80, 124, 75, 31, 52),
+(2, 4, 58, 82, 126, 76, 31, 52),
+(2, 4, 59, 83, 129, 77, 32, 53),
+(2, 4, 60, 84, 131, 78, 32, 54),
+(2, 4, 61, 86, 133, 80, 33, 54),
+(2, 4, 62, 87, 136, 81, 33, 55),
+(2, 4, 63, 88, 138, 82, 33, 56),
+(2, 4, 64, 90, 140, 83, 34, 57),
+(2, 4, 65, 91, 143, 85, 34, 57),
+(2, 4, 66, 92, 145, 86, 34, 58),
+(2, 4, 67, 94, 148, 87, 35, 59),
+(2, 4, 68, 95, 150, 88, 35, 59),
+(2, 4, 69, 97, 153, 90, 36, 60),
+(2, 4, 70, 98, 155, 91, 36, 61),
+(2, 4, 71, 100, 158, 92, 36, 62),
+(2, 4, 72, 102, 161, 94, 37, 62),
+(2, 4, 73, 103, 164, 99, 37, 63),
+(2, 4, 74, 105, 167, 100, 38, 64),
+(2, 4, 75, 107, 170, 102, 38, 65),
+(2, 4, 76, 108, 173, 102, 38, 66),
+(2, 4, 77, 110, 176, 102, 39, 67),
+(2, 4, 78, 112, 180, 103, 39, 68),
+(2, 4, 79, 114, 183, 105, 40, 69),
+(2, 4, 80, 116, 186, 107, 40, 70),
+(2, 6, 1, 26, 17, 24, 17, 23),
+(2, 6, 2, 27, 18, 25, 17, 23),
+(2, 6, 3, 29, 19, 26, 17, 24),
+(2, 6, 4, 30, 19, 27, 17, 24),
+(2, 6, 5, 31, 20, 29, 17, 24),
+(2, 6, 6, 32, 21, 30, 17, 24),
+(2, 6, 7, 34, 22, 31, 18, 25),
+(2, 6, 8, 35, 23, 32, 18, 25),
+(2, 6, 9, 37, 24, 34, 18, 25),
+(2, 6, 10, 38, 24, 35, 18, 26),
+(2, 6, 11, 39, 25, 36, 18, 26),
+(2, 6, 12, 41, 26, 37, 18, 26),
+(2, 6, 13, 42, 27, 39, 18, 27),
+(2, 6, 14, 44, 28, 40, 18, 27),
+(2, 6, 15, 45, 29, 41, 18, 27),
+(2, 6, 16, 47, 30, 43, 19, 28),
+(2, 6, 17, 48, 31, 44, 19, 28),
+(2, 6, 18, 50, 32, 45, 19, 28),
+(2, 6, 19, 51, 33, 47, 19, 29),
+(2, 6, 20, 53, 34, 48, 19, 29),
+(2, 6, 21, 54, 34, 50, 19, 29),
+(2, 6, 22, 56, 35, 51, 19, 30),
+(2, 6, 23, 57, 36, 52, 20, 30),
+(2, 6, 24, 59, 37, 54, 20, 30),
+(2, 6, 25, 60, 38, 55, 20, 31),
+(2, 6, 26, 62, 39, 57, 20, 31),
+(2, 6, 27, 64, 40, 58, 20, 32),
+(2, 6, 28, 65, 41, 60, 20, 32),
+(2, 6, 29, 67, 43, 61, 21, 32),
+(2, 6, 30, 69, 44, 63, 21, 33),
+(2, 6, 31, 70, 45, 64, 21, 33),
+(2, 6, 32, 72, 46, 66, 21, 34),
+(2, 6, 33, 74, 47, 67, 21, 34),
+(2, 6, 34, 76, 48, 69, 21, 35),
+(2, 6, 35, 77, 49, 71, 22, 35),
+(2, 6, 36, 79, 50, 72, 22, 36),
+(2, 6, 37, 81, 51, 74, 22, 36),
+(2, 6, 38, 83, 52, 76, 22, 36),
+(2, 6, 39, 84, 53, 77, 22, 37),
+(2, 6, 40, 86, 55, 79, 23, 37),
+(2, 6, 41, 88, 56, 81, 23, 38),
+(2, 6, 42, 90, 57, 82, 23, 38),
+(2, 6, 43, 92, 58, 84, 23, 39),
+(2, 6, 44, 94, 59, 86, 23, 39),
+(2, 6, 45, 96, 60, 87, 24, 40),
+(2, 6, 46, 98, 62, 89, 24, 40),
+(2, 6, 47, 100, 63, 91, 24, 41),
+(2, 6, 48, 101, 64, 93, 24, 41),
+(2, 6, 49, 103, 65, 94, 25, 42),
+(2, 6, 50, 105, 66, 96, 25, 42),
+(2, 6, 51, 107, 68, 98, 25, 43),
+(2, 6, 52, 109, 69, 100, 25, 43),
+(2, 6, 53, 110, 69, 100, 25, 44),
+(2, 6, 54, 111, 70, 101, 26, 45),
+(2, 6, 55, 111, 70, 101, 26, 45),
+(2, 6, 56, 114, 72, 104, 26, 46),
+(2, 6, 57, 116, 73, 106, 26, 46),
+(2, 6, 58, 118, 74, 108, 27, 47),
+(2, 6, 59, 124, 76, 110, 27, 47),
+(2, 6, 60, 126, 77, 112, 27, 48),
+(2, 6, 61, 128, 78, 114, 27, 49),
+(2, 6, 62, 131, 80, 116, 27, 49),
+(2, 6, 63, 133, 81, 119, 28, 50),
+(2, 6, 64, 136, 83, 121, 28, 50),
+(2, 6, 65, 136, 84, 123, 28, 51),
+(2, 6, 66, 142, 86, 126, 28, 52),
+(2, 6, 67, 145, 87, 128, 29, 52),
+(2, 6, 68, 147, 89, 130, 29, 53),
+(2, 6, 69, 150, 90, 133, 29, 54),
+(2, 6, 70, 157, 92, 135, 29, 54),
+(2, 6, 71, 160, 94, 138, 30, 55),
+(2, 6, 72, 163, 95, 140, 30, 56),
+(2, 6, 73, 166, 97, 151, 30, 57),
+(2, 6, 74, 169, 99, 154, 30, 57),
+(2, 6, 75, 172, 100, 156, 31, 58),
+(2, 6, 76, 175, 102, 160, 31, 59),
+(2, 6, 77, 179, 104, 162, 31, 60),
+(2, 6, 78, 182, 105, 165, 31, 60),
+(2, 6, 79, 191, 107, 168, 32, 61),
+(2, 6, 80, 194, 109, 171, 32, 62),
+(2, 7, 1, 24, 17, 23, 18, 25),
+(2, 7, 2, 25, 17, 24, 19, 26),
+(2, 7, 3, 26, 18, 25, 20, 27),
+(2, 7, 4, 26, 18, 26, 21, 28),
+(2, 7, 5, 27, 19, 27, 22, 29),
+(2, 7, 6, 28, 19, 28, 23, 30),
+(2, 7, 7, 29, 20, 29, 24, 31),
+(2, 7, 8, 30, 20, 30, 25, 32),
+(2, 7, 9, 31, 21, 31, 26, 33),
+(2, 7, 10, 32, 21, 32, 27, 34),
+(2, 7, 11, 33, 22, 33, 28, 36),
+(2, 7, 12, 34, 22, 34, 29, 37),
+(2, 7, 13, 34, 23, 35, 30, 38),
+(2, 7, 14, 35, 23, 36, 31, 39),
+(2, 7, 15, 36, 24, 37, 32, 40),
+(2, 7, 16, 37, 24, 39, 33, 41),
+(2, 7, 17, 38, 25, 40, 34, 43),
+(2, 7, 18, 39, 25, 41, 35, 44),
+(2, 7, 19, 40, 26, 42, 36, 45),
+(2, 7, 20, 41, 26, 43, 37, 46),
+(2, 7, 21, 42, 27, 44, 38, 47),
+(2, 7, 22, 43, 27, 45, 39, 49),
+(2, 7, 23, 44, 28, 47, 40, 50),
+(2, 7, 24, 45, 28, 48, 41, 51),
+(2, 7, 25, 47, 29, 49, 43, 52),
+(2, 7, 26, 48, 30, 50, 44, 54),
+(2, 7, 27, 49, 30, 52, 45, 55),
+(2, 7, 28, 50, 31, 53, 46, 56),
+(2, 7, 29, 51, 31, 54, 47, 58),
+(2, 7, 30, 52, 32, 55, 48, 59),
+(2, 7, 31, 53, 33, 57, 50, 60),
+(2, 7, 32, 54, 33, 58, 51, 62),
+(2, 7, 33, 55, 34, 59, 52, 63),
+(2, 7, 34, 57, 34, 61, 53, 65),
+(2, 7, 35, 58, 35, 62, 55, 66),
+(2, 7, 36, 59, 36, 63, 56, 67),
+(2, 7, 37, 60, 36, 65, 57, 69),
+(2, 7, 38, 61, 37, 66, 58, 70),
+(2, 7, 39, 62, 38, 67, 60, 72),
+(2, 7, 40, 64, 38, 69, 61, 73),
+(2, 7, 41, 65, 39, 70, 62, 75),
+(2, 7, 42, 66, 40, 72, 64, 76),
+(2, 7, 43, 67, 40, 73, 65, 78),
+(2, 7, 44, 69, 41, 74, 66, 79),
+(2, 7, 45, 70, 42, 76, 68, 81),
+(2, 7, 46, 71, 42, 77, 69, 82),
+(2, 7, 47, 72, 43, 79, 70, 84),
+(2, 7, 48, 74, 44, 80, 72, 85),
+(2, 7, 49, 75, 45, 82, 73, 87),
+(2, 7, 50, 76, 45, 83, 75, 89),
+(2, 7, 51, 78, 46, 85, 76, 90),
+(2, 7, 52, 79, 47, 86, 77, 92),
+(2, 7, 53, 80, 47, 88, 79, 93),
+(2, 7, 54, 82, 48, 90, 80, 95),
+(2, 7, 55, 83, 49, 91, 82, 97),
+(2, 7, 56, 85, 50, 93, 83, 98),
+(2, 7, 57, 86, 50, 94, 85, 100),
+(2, 7, 58, 87, 51, 96, 86, 102),
+(2, 7, 59, 89, 52, 97, 88, 103),
+(2, 7, 60, 90, 53, 99, 89, 105),
+(2, 7, 61, 92, 54, 101, 91, 107),
+(2, 7, 62, 93, 54, 102, 92, 109),
+(2, 7, 63, 95, 55, 104, 94, 110),
+(2, 7, 64, 96, 56, 106, 95, 112),
+(2, 7, 65, 97, 57, 107, 97, 114),
+(2, 7, 66, 99, 58, 109, 99, 116),
+(2, 7, 67, 100, 58, 111, 100, 118),
+(2, 7, 68, 102, 59, 113, 102, 119),
+(2, 7, 69, 103, 60, 114, 103, 121),
+(2, 7, 70, 105, 61, 116, 105, 123),
+(2, 7, 71, 106, 62, 118, 117, 125),
+(2, 7, 72, 108, 63, 120, 119, 128),
+(2, 7, 73, 110, 64, 122, 122, 130),
+(2, 7, 74, 112, 65, 125, 124, 132),
+(2, 7, 75, 114, 66, 127, 126, 134),
+(2, 7, 76, 116, 67, 129, 128, 137),
+(2, 7, 77, 117, 68, 131, 128, 139),
+(2, 7, 78, 119, 69, 133, 133, 141),
+(2, 7, 79, 121, 70, 136, 135, 144),
+(2, 7, 80, 123, 71, 138, 137, 146),
+(2, 9, 1, 23, 17, 23, 19, 25),
+(2, 9, 2, 23, 17, 24, 20, 26),
+(2, 9, 3, 24, 18, 24, 21, 27),
+(2, 9, 4, 24, 18, 25, 23, 28),
+(2, 9, 5, 24, 18, 25, 24, 30),
+(2, 9, 6, 24, 19, 26, 25, 31),
+(2, 9, 7, 25, 19, 26, 26, 32),
+(2, 9, 8, 25, 20, 27, 27, 33),
+(2, 9, 9, 25, 20, 27, 29, 34),
+(2, 9, 10, 26, 20, 28, 30, 36),
+(2, 9, 11, 26, 21, 29, 31, 37),
+(2, 9, 12, 26, 21, 29, 33, 38),
+(2, 9, 13, 27, 22, 30, 34, 39),
+(2, 9, 14, 27, 22, 31, 35, 41),
+(2, 9, 15, 27, 23, 31, 37, 42),
+(2, 9, 16, 28, 23, 32, 38, 43),
+(2, 9, 17, 28, 23, 32, 39, 45),
+(2, 9, 18, 28, 24, 33, 41, 46),
+(2, 9, 19, 29, 24, 34, 42, 47),
+(2, 9, 20, 29, 25, 34, 43, 49),
+(2, 9, 21, 29, 25, 35, 45, 50),
+(2, 9, 22, 30, 26, 36, 46, 51),
+(2, 9, 23, 30, 26, 37, 48, 53),
+(2, 9, 24, 30, 27, 37, 49, 54),
+(2, 9, 25, 31, 27, 38, 51, 56),
+(2, 9, 26, 31, 28, 39, 52, 57),
+(2, 9, 27, 32, 28, 39, 54, 59),
+(2, 9, 28, 32, 29, 40, 55, 60),
+(2, 9, 29, 32, 29, 41, 57, 62),
+(2, 9, 30, 33, 30, 42, 58, 63),
+(2, 9, 31, 33, 30, 42, 60, 65),
+(2, 9, 32, 34, 31, 43, 61, 66),
+(2, 9, 33, 34, 31, 44, 63, 68),
+(2, 9, 34, 35, 32, 45, 64, 69),
+(2, 9, 35, 35, 32, 45, 66, 71),
+(2, 9, 36, 36, 33, 46, 68, 72),
+(2, 9, 37, 36, 34, 47, 69, 74),
+(2, 9, 38, 36, 34, 48, 71, 76),
+(2, 9, 39, 37, 35, 49, 72, 77),
+(2, 9, 40, 37, 35, 50, 74, 79),
+(2, 9, 41, 38, 36, 50, 76, 80),
+(2, 9, 42, 38, 36, 51, 77, 82),
+(2, 9, 43, 39, 37, 52, 79, 84),
+(2, 9, 44, 39, 38, 53, 81, 85),
+(2, 9, 45, 40, 38, 54, 83, 87),
+(2, 9, 46, 40, 39, 55, 84, 89),
+(2, 9, 47, 41, 39, 56, 86, 91),
+(2, 9, 48, 41, 40, 56, 88, 92),
+(2, 9, 49, 42, 41, 57, 90, 94),
+(2, 9, 50, 42, 41, 58, 91, 96),
+(2, 9, 51, 43, 42, 59, 93, 98),
+(2, 9, 52, 43, 43, 60, 95, 99),
+(2, 9, 53, 44, 43, 61, 97, 101),
+(2, 9, 54, 45, 44, 62, 99, 103),
+(2, 9, 55, 45, 45, 63, 101, 105),
+(2, 9, 56, 46, 45, 64, 102, 107),
+(2, 9, 57, 46, 46, 65, 104, 109),
+(2, 9, 58, 47, 47, 66, 106, 110),
+(2, 9, 59, 47, 47, 67, 108, 112),
+(2, 9, 60, 48, 48, 68, 110, 114),
+(2, 9, 61, 48, 49, 69, 112, 116),
+(2, 9, 62, 49, 49, 70, 114, 118),
+(2, 9, 63, 50, 50, 71, 116, 120),
+(2, 9, 64, 50, 51, 72, 118, 122),
+(2, 9, 65, 51, 51, 73, 120, 124),
+(2, 9, 66, 52, 52, 74, 122, 126),
+(2, 9, 67, 52, 53, 75, 124, 128),
+(2, 9, 68, 53, 54, 76, 126, 130),
+(2, 9, 69, 53, 54, 77, 128, 132),
+(2, 9, 70, 54, 55, 78, 130, 134),
+(2, 9, 71, 55, 56, 88, 134, 145),
+(2, 9, 72, 56, 56, 89, 135, 147),
+(2, 9, 73, 57, 57, 90, 137, 150),
+(2, 9, 74, 57, 58, 91, 142, 153),
+(2, 9, 75, 58, 59, 93, 142, 155),
+(2, 9, 76, 59, 60, 94, 145, 158),
+(2, 9, 77, 60, 61, 95, 148, 161),
+(2, 9, 78, 60, 62, 97, 150, 164),
+(2, 9, 79, 61, 63, 98, 153, 167),
+(2, 9, 80, 62, 64, 99, 156, 169),
+(3, 1, 1, 25, 16, 25, 19, 19),
+(3, 1, 2, 26, 17, 26, 19, 19),
+(3, 1, 3, 28, 18, 27, 19, 20),
+(3, 1, 4, 29, 18, 28, 19, 20),
+(3, 1, 5, 30, 19, 30, 19, 20),
+(3, 1, 6, 31, 20, 31, 19, 20),
+(3, 1, 7, 33, 21, 32, 20, 21),
+(3, 1, 8, 34, 22, 33, 20, 21),
+(3, 1, 9, 36, 23, 35, 20, 21),
+(3, 1, 10, 37, 23, 36, 20, 22),
+(3, 1, 11, 38, 24, 37, 20, 22),
+(3, 1, 12, 40, 25, 38, 20, 22),
+(3, 1, 13, 41, 26, 40, 20, 23),
+(3, 1, 14, 43, 27, 41, 20, 23),
+(3, 1, 15, 44, 28, 42, 20, 23),
+(3, 1, 16, 46, 29, 44, 21, 24),
+(3, 1, 17, 47, 30, 45, 21, 24),
+(3, 1, 18, 49, 31, 46, 21, 24),
+(3, 1, 19, 50, 32, 48, 21, 25),
+(3, 1, 20, 52, 33, 49, 21, 25),
+(3, 1, 21, 53, 34, 51, 21, 26),
+(3, 1, 22, 55, 34, 52, 21, 26),
+(3, 1, 23, 56, 35, 53, 21, 26),
+(3, 1, 24, 58, 36, 55, 22, 27),
+(3, 1, 25, 59, 37, 56, 22, 27),
+(3, 1, 26, 61, 38, 58, 22, 27),
+(3, 1, 27, 63, 39, 59, 22, 28),
+(3, 1, 28, 64, 41, 61, 22, 28),
+(3, 1, 29, 66, 42, 62, 22, 29),
+(3, 1, 30, 68, 43, 64, 23, 29),
+(3, 1, 31, 69, 44, 65, 23, 30),
+(3, 1, 32, 71, 45, 67, 23, 30),
+(3, 1, 33, 73, 46, 68, 23, 30),
+(3, 1, 34, 75, 47, 70, 23, 31),
+(3, 1, 35, 76, 48, 72, 24, 31),
+(3, 1, 36, 78, 49, 73, 24, 32),
+(3, 1, 37, 80, 50, 75, 24, 32),
+(3, 1, 38, 82, 51, 76, 24, 33),
+(3, 1, 39, 84, 52, 78, 24, 33),
+(3, 1, 40, 85, 54, 80, 24, 34),
+(3, 1, 41, 87, 55, 81, 25, 34),
+(3, 1, 42, 89, 56, 83, 25, 35),
+(3, 1, 43, 91, 57, 85, 25, 35),
+(3, 1, 44, 93, 58, 87, 25, 36),
+(3, 1, 45, 95, 59, 88, 26, 36),
+(3, 1, 46, 97, 61, 90, 26, 37),
+(3, 1, 47, 99, 62, 92, 26, 37),
+(3, 1, 48, 101, 63, 94, 26, 38),
+(3, 1, 49, 102, 64, 95, 26, 38),
+(3, 1, 50, 104, 65, 97, 27, 39),
+(3, 1, 51, 106, 67, 99, 27, 39),
+(3, 1, 52, 108, 68, 101, 27, 40),
+(3, 1, 53, 110, 69, 103, 27, 40),
+(3, 1, 54, 112, 70, 104, 28, 41),
+(3, 1, 55, 115, 72, 106, 28, 41),
+(3, 1, 56, 117, 73, 108, 28, 42),
+(3, 1, 57, 119, 74, 110, 28, 42),
+(3, 1, 58, 121, 76, 112, 29, 43),
+(3, 1, 59, 123, 77, 114, 29, 43),
+(3, 1, 60, 125, 78, 116, 29, 44),
+(3, 1, 61, 127, 80, 118, 29, 45),
+(3, 1, 62, 129, 81, 120, 30, 45),
+(3, 1, 63, 131, 82, 122, 30, 46),
+(3, 1, 64, 134, 84, 124, 30, 46),
+(3, 1, 65, 136, 85, 126, 31, 47),
+(3, 1, 66, 138, 86, 128, 31, 48),
+(3, 1, 67, 140, 88, 130, 31, 48),
+(3, 1, 68, 142, 89, 132, 31, 49),
+(3, 1, 69, 145, 91, 134, 32, 49),
+(3, 1, 70, 147, 92, 136, 32, 50),
+(3, 1, 71, 150, 93, 138, 32, 51),
+(3, 1, 72, 152, 95, 141, 32, 52),
+(3, 1, 73, 164, 97, 151, 32, 53),
+(3, 1, 74, 164, 98, 151, 33, 53),
+(3, 1, 75, 170, 100, 156, 33, 54),
+(3, 1, 76, 173, 102, 160, 33, 55),
+(3, 1, 77, 173, 104, 160, 34, 56),
+(3, 1, 78, 176, 105, 162, 34, 56),
+(3, 1, 79, 183, 107, 168, 34, 57),
+(3, 1, 80, 186, 109, 171, 35, 58),
+(3, 2, 1, 24, 16, 25, 19, 20),
+(3, 2, 2, 25, 17, 26, 20, 21),
+(3, 2, 3, 26, 17, 27, 20, 21),
+(3, 2, 4, 27, 18, 28, 21, 22),
+(3, 2, 5, 28, 18, 29, 22, 23),
+(3, 2, 6, 29, 19, 30, 22, 24),
+(3, 2, 7, 31, 20, 31, 23, 24),
+(3, 2, 8, 32, 20, 32, 24, 25),
+(3, 2, 9, 33, 21, 33, 24, 26),
+(3, 2, 10, 34, 21, 34, 25, 26),
+(3, 2, 11, 35, 22, 36, 26, 27),
+(3, 2, 12, 36, 23, 37, 26, 28),
+(3, 2, 13, 38, 23, 38, 27, 29),
+(3, 2, 14, 39, 24, 39, 28, 30),
+(3, 2, 15, 40, 25, 40, 29, 30),
+(3, 2, 16, 41, 25, 41, 29, 31),
+(3, 2, 17, 43, 26, 43, 30, 32),
+(3, 2, 18, 44, 27, 44, 31, 33),
+(3, 2, 19, 45, 28, 45, 32, 34),
+(3, 2, 20, 47, 28, 46, 32, 35),
+(3, 2, 21, 48, 29, 47, 33, 35),
+(3, 2, 22, 49, 30, 49, 34, 36),
+(3, 2, 23, 51, 30, 50, 35, 37),
+(3, 2, 24, 52, 31, 51, 36, 38),
+(3, 2, 25, 53, 32, 52, 36, 39),
+(3, 2, 26, 55, 33, 54, 37, 40),
+(3, 2, 27, 56, 33, 55, 38, 41),
+(3, 2, 28, 57, 34, 56, 39, 42),
+(3, 2, 29, 59, 35, 58, 40, 43),
+(3, 2, 30, 60, 36, 59, 41, 43),
+(3, 2, 31, 62, 37, 60, 42, 44),
+(3, 2, 32, 63, 37, 62, 42, 45),
+(3, 2, 33, 65, 38, 63, 43, 46),
+(3, 2, 34, 66, 39, 65, 44, 47),
+(3, 2, 35, 68, 40, 66, 45, 48),
+(3, 2, 36, 69, 41, 67, 46, 49),
+(3, 2, 37, 71, 41, 69, 47, 50),
+(3, 2, 38, 72, 42, 70, 48, 51),
+(3, 2, 39, 74, 43, 72, 49, 52),
+(3, 2, 40, 75, 44, 73, 50, 53),
+(3, 2, 41, 77, 45, 75, 51, 54),
+(3, 2, 42, 78, 46, 76, 52, 55),
+(3, 2, 43, 80, 47, 78, 53, 56),
+(3, 2, 44, 82, 47, 79, 54, 57),
+(3, 2, 45, 83, 48, 81, 55, 59),
+(3, 2, 46, 85, 49, 82, 56, 60),
+(3, 2, 47, 87, 50, 84, 57, 61),
+(3, 2, 48, 88, 51, 85, 58, 62),
+(3, 2, 49, 90, 52, 87, 59, 63),
+(3, 2, 50, 92, 53, 89, 60, 64),
+(3, 2, 51, 93, 54, 90, 61, 65),
+(3, 2, 52, 95, 55, 92, 62, 66),
+(3, 2, 53, 97, 56, 93, 63, 67),
+(3, 2, 54, 98, 57, 95, 64, 69),
+(3, 2, 55, 100, 58, 97, 65, 70),
+(3, 2, 56, 102, 59, 98, 66, 71),
+(3, 2, 57, 104, 60, 100, 67, 72),
+(3, 2, 58, 106, 61, 102, 68, 73),
+(3, 2, 59, 107, 62, 103, 69, 74),
+(3, 2, 60, 109, 63, 105, 70, 76),
+(3, 2, 61, 111, 64, 107, 72, 77),
+(3, 2, 62, 113, 65, 109, 73, 78),
+(3, 2, 63, 115, 66, 110, 74, 79),
+(3, 2, 64, 117, 67, 112, 75, 80),
+(3, 2, 65, 118, 68, 114, 76, 82),
+(3, 2, 66, 120, 69, 116, 77, 83),
+(3, 2, 67, 122, 70, 118, 78, 84),
+(3, 2, 68, 124, 71, 119, 80, 85),
+(3, 2, 69, 126, 72, 121, 81, 87),
+(3, 2, 70, 128, 73, 123, 82, 88),
+(3, 2, 71, 150, 74, 125, 83, 89),
+(3, 2, 72, 152, 75, 128, 85, 91),
+(3, 2, 73, 156, 76, 130, 86, 93),
+(3, 2, 74, 158, 78, 132, 88, 94),
+(3, 2, 75, 161, 79, 134, 89, 96),
+(3, 2, 76, 164, 80, 137, 91, 97),
+(3, 2, 77, 166, 82, 139, 92, 99),
+(3, 2, 78, 170, 83, 141, 94, 101),
+(3, 2, 79, 172, 84, 144, 95, 102),
+(3, 2, 80, 175, 86, 146, 97, 104),
+(3, 3, 1, 22, 19, 24, 19, 20),
+(3, 3, 2, 22, 20, 25, 20, 21),
+(3, 3, 3, 23, 22, 26, 20, 21),
+(3, 3, 4, 23, 23, 27, 21, 22),
+(3, 3, 5, 24, 25, 28, 21, 23),
+(3, 3, 6, 24, 26, 29, 22, 23),
+(3, 3, 7, 25, 27, 29, 23, 24),
+(3, 3, 8, 25, 29, 30, 23, 25),
+(3, 3, 9, 25, 30, 31, 24, 25),
+(3, 3, 10, 26, 32, 32, 24, 26),
+(3, 3, 11, 26, 33, 33, 25, 27),
+(3, 3, 12, 27, 35, 34, 26, 27),
+(3, 3, 13, 27, 36, 35, 26, 28),
+(3, 3, 14, 28, 38, 36, 27, 29),
+(3, 3, 15, 28, 39, 37, 28, 29),
+(3, 3, 16, 29, 41, 38, 28, 30),
+(3, 3, 17, 29, 42, 39, 29, 31),
+(3, 3, 18, 30, 44, 41, 30, 32),
+(3, 3, 19, 30, 46, 42, 30, 32),
+(3, 3, 20, 31, 47, 43, 31, 33),
+(3, 3, 21, 32, 49, 44, 32, 34),
+(3, 3, 22, 32, 51, 45, 33, 35),
+(3, 3, 23, 33, 52, 46, 33, 36),
+(3, 3, 24, 33, 54, 47, 34, 36),
+(3, 3, 25, 34, 56, 48, 35, 37),
+(3, 3, 26, 34, 57, 49, 35, 38),
+(3, 3, 27, 35, 59, 51, 36, 39),
+(3, 3, 28, 35, 61, 52, 37, 40),
+(3, 3, 29, 36, 63, 53, 38, 40),
+(3, 3, 30, 37, 64, 54, 39, 41),
+(3, 3, 31, 37, 66, 55, 39, 42),
+(3, 3, 32, 38, 68, 57, 40, 43),
+(3, 3, 33, 38, 70, 58, 41, 44),
+(3, 3, 34, 39, 71, 59, 42, 45),
+(3, 3, 35, 40, 73, 60, 43, 46),
+(3, 3, 36, 40, 75, 62, 43, 47),
+(3, 3, 37, 41, 77, 63, 44, 47),
+(3, 3, 38, 42, 79, 64, 45, 48),
+(3, 3, 39, 42, 81, 65, 46, 49),
+(3, 3, 40, 43, 83, 67, 47, 50),
+(3, 3, 41, 44, 85, 68, 48, 51),
+(3, 3, 42, 44, 87, 69, 49, 52),
+(3, 3, 43, 45, 89, 71, 49, 53),
+(3, 3, 44, 46, 91, 72, 50, 54),
+(3, 3, 45, 46, 93, 73, 51, 55),
+(3, 3, 46, 47, 95, 75, 52, 56),
+(3, 3, 47, 48, 97, 76, 53, 57),
+(3, 3, 48, 49, 99, 78, 54, 58),
+(3, 3, 49, 49, 101, 79, 55, 59),
+(3, 3, 50, 50, 103, 80, 56, 60),
+(3, 3, 51, 51, 105, 82, 57, 61),
+(3, 3, 52, 51, 107, 83, 58, 62),
+(3, 3, 53, 52, 109, 85, 59, 63),
+(3, 3, 54, 53, 111, 86, 60, 64),
+(3, 3, 55, 54, 113, 88, 61, 65),
+(3, 3, 56, 55, 115, 89, 62, 66),
+(3, 3, 57, 55, 118, 91, 62, 67),
+(3, 3, 58, 56, 120, 92, 63, 68),
+(3, 3, 59, 57, 122, 94, 64, 70),
+(3, 3, 60, 58, 124, 95, 65, 71),
+(3, 3, 61, 58, 126, 97, 67, 72),
+(3, 3, 62, 59, 129, 98, 68, 73),
+(3, 3, 63, 60, 131, 100, 69, 74),
+(3, 3, 64, 61, 133, 101, 70, 75),
+(3, 3, 65, 62, 135, 103, 71, 76),
+(3, 3, 66, 63, 138, 105, 72, 77),
+(3, 3, 67, 63, 140, 106, 73, 78),
+(3, 3, 68, 64, 142, 108, 74, 80),
+(3, 3, 69, 65, 145, 109, 75, 81),
+(3, 3, 70, 66, 147, 111, 76, 82),
+(3, 3, 71, 67, 150, 113, 77, 83),
+(3, 3, 72, 68, 153, 115, 78, 84),
+(3, 3, 73, 69, 156, 117, 79, 86),
+(3, 3, 74, 70, 159, 119, 81, 87),
+(3, 3, 75, 71, 162, 121, 82, 89),
+(3, 3, 76, 72, 165, 123, 83, 90),
+(3, 3, 77, 73, 168, 125, 85, 92),
+(3, 3, 78, 74, 171, 127, 86, 93),
+(3, 3, 79, 75, 174, 129, 87, 95),
+(3, 3, 80, 76, 177, 131, 89, 96),
+(3, 4, 1, 23, 19, 24, 19, 19),
+(3, 4, 2, 24, 20, 25, 19, 19),
+(3, 4, 3, 24, 22, 25, 19, 20),
+(3, 4, 4, 25, 23, 26, 19, 20),
+(3, 4, 5, 26, 25, 27, 20, 20),
+(3, 4, 6, 27, 26, 27, 20, 21),
+(3, 4, 7, 28, 28, 28, 20, 21),
+(3, 4, 8, 28, 29, 29, 20, 22),
+(3, 4, 9, 29, 31, 30, 20, 22),
+(3, 4, 10, 30, 32, 30, 20, 22),
+(3, 4, 11, 31, 34, 31, 21, 23),
+(3, 4, 12, 32, 36, 32, 21, 23),
+(3, 4, 13, 33, 37, 33, 21, 24),
+(3, 4, 14, 33, 39, 33, 21, 24),
+(3, 4, 15, 34, 40, 34, 21, 25),
+(3, 4, 16, 35, 42, 35, 22, 25),
+(3, 4, 17, 36, 44, 36, 22, 25),
+(3, 4, 18, 37, 45, 37, 22, 26),
+(3, 4, 19, 38, 47, 38, 22, 26),
+(3, 4, 20, 39, 49, 38, 22, 27),
+(3, 4, 21, 40, 51, 39, 23, 27),
+(3, 4, 22, 41, 52, 40, 23, 28),
+(3, 4, 23, 42, 54, 41, 23, 28),
+(3, 4, 24, 43, 56, 42, 23, 29),
+(3, 4, 25, 44, 58, 43, 24, 29),
+(3, 4, 26, 44, 59, 44, 24, 30),
+(3, 4, 27, 45, 61, 44, 24, 30),
+(3, 4, 28, 46, 63, 45, 24, 31),
+(3, 4, 29, 47, 65, 46, 25, 31),
+(3, 4, 30, 48, 67, 47, 25, 32),
+(3, 4, 31, 49, 69, 48, 25, 32),
+(3, 4, 32, 51, 71, 49, 25, 33),
+(3, 4, 33, 52, 72, 50, 26, 33),
+(3, 4, 34, 53, 74, 51, 26, 34),
+(3, 4, 35, 54, 76, 52, 26, 34),
+(3, 4, 36, 55, 78, 53, 26, 35),
+(3, 4, 37, 56, 80, 54, 27, 35),
+(3, 4, 38, 57, 82, 55, 27, 36),
+(3, 4, 39, 58, 84, 56, 27, 37),
+(3, 4, 40, 59, 86, 57, 28, 37),
+(3, 4, 41, 60, 88, 58, 28, 38),
+(3, 4, 42, 61, 90, 59, 28, 38),
+(3, 4, 43, 63, 92, 60, 28, 39),
+(3, 4, 44, 64, 95, 61, 29, 39),
+(3, 4, 45, 65, 97, 62, 29, 40),
+(3, 4, 46, 66, 99, 63, 29, 41),
+(3, 4, 47, 67, 101, 64, 30, 41),
+(3, 4, 48, 68, 103, 66, 30, 42),
+(3, 4, 49, 70, 105, 67, 30, 43),
+(3, 4, 50, 71, 107, 68, 31, 43),
+(3, 4, 51, 72, 110, 69, 31, 44),
+(3, 4, 52, 73, 112, 70, 31, 44),
+(3, 4, 53, 74, 114, 71, 32, 45),
+(3, 4, 54, 76, 116, 72, 32, 46),
+(3, 4, 55, 77, 118, 73, 32, 46),
+(3, 4, 56, 78, 121, 75, 33, 47),
+(3, 4, 57, 80, 123, 76, 33, 48),
+(3, 4, 58, 81, 125, 77, 33, 48),
+(3, 4, 59, 82, 128, 78, 34, 49),
+(3, 4, 60, 83, 130, 79, 34, 50),
+(3, 4, 61, 85, 132, 81, 34, 51),
+(3, 4, 62, 86, 135, 82, 35, 51),
+(3, 4, 63, 87, 137, 83, 35, 52),
+(3, 4, 64, 89, 139, 84, 36, 53),
+(3, 4, 65, 90, 142, 86, 36, 53),
+(3, 4, 66, 91, 144, 87, 36, 54),
+(3, 4, 67, 93, 147, 88, 37, 55),
+(3, 4, 68, 94, 149, 89, 37, 56),
+(3, 4, 69, 96, 152, 91, 38, 56),
+(3, 4, 70, 97, 154, 92, 38, 57),
+(3, 4, 71, 99, 157, 93, 38, 58),
+(3, 4, 72, 101, 160, 96, 39, 58),
+(3, 4, 73, 102, 163, 97, 39, 59),
+(3, 4, 74, 104, 166, 98, 40, 60),
+(3, 4, 75, 106, 169, 100, 40, 61),
+(3, 4, 76, 107, 172, 101, 40, 62),
+(3, 4, 77, 109, 175, 103, 41, 63),
+(3, 4, 78, 111, 179, 105, 41, 64),
+(3, 4, 79, 113, 182, 106, 42, 65),
+(3, 4, 80, 115, 185, 108, 42, 66),
+(3, 5, 1, 22, 16, 23, 21, 22),
+(3, 5, 2, 22, 16, 23, 22, 23),
+(3, 5, 3, 22, 16, 24, 24, 25),
+(3, 5, 4, 22, 17, 24, 25, 26),
+(3, 5, 5, 23, 17, 24, 26, 27),
+(3, 5, 6, 23, 17, 25, 28, 29),
+(3, 5, 7, 23, 17, 25, 29, 30),
+(3, 5, 8, 23, 18, 26, 30, 32),
+(3, 5, 9, 23, 18, 26, 32, 33),
+(3, 5, 10, 23, 18, 26, 33, 35),
+(3, 5, 11, 24, 18, 27, 35, 36),
+(3, 5, 12, 24, 19, 27, 36, 38),
+(3, 5, 13, 24, 19, 28, 37, 39),
+(3, 5, 14, 24, 19, 28, 39, 41),
+(3, 5, 15, 24, 19, 28, 40, 42),
+(3, 5, 16, 24, 20, 29, 42, 44),
+(3, 5, 17, 25, 20, 29, 43, 45),
+(3, 5, 18, 25, 20, 30, 45, 47),
+(3, 5, 19, 25, 21, 30, 46, 49),
+(3, 5, 20, 25, 21, 31, 48, 50),
+(3, 5, 21, 25, 21, 31, 50, 52),
+(3, 5, 22, 26, 22, 31, 51, 53),
+(3, 5, 23, 26, 22, 32, 53, 55),
+(3, 5, 24, 26, 22, 32, 54, 57),
+(3, 5, 25, 26, 22, 33, 56, 58),
+(3, 5, 26, 27, 23, 33, 58, 60),
+(3, 5, 27, 27, 23, 34, 59, 62),
+(3, 5, 28, 27, 23, 34, 61, 64),
+(3, 5, 29, 27, 24, 35, 63, 65),
+(3, 5, 30, 28, 24, 35, 64, 67),
+(3, 5, 31, 28, 24, 36, 66, 69),
+(3, 5, 32, 28, 25, 36, 68, 71),
+(3, 5, 33, 28, 25, 37, 70, 72),
+(3, 5, 34, 29, 26, 38, 71, 74),
+(3, 5, 35, 29, 26, 38, 73, 76),
+(3, 5, 36, 29, 26, 39, 75, 78),
+(3, 5, 37, 29, 27, 39, 77, 80),
+(3, 5, 38, 30, 27, 40, 78, 82),
+(3, 5, 39, 30, 27, 40, 80, 84),
+(3, 5, 40, 30, 28, 41, 82, 86),
+(3, 5, 41, 31, 28, 41, 84, 88),
+(3, 5, 42, 31, 29, 42, 86, 89),
+(3, 5, 43, 31, 29, 43, 88, 91),
+(3, 5, 44, 32, 29, 43, 90, 93),
+(3, 5, 45, 32, 30, 44, 92, 95),
+(3, 5, 46, 32, 30, 44, 93, 97),
+(3, 5, 47, 32, 30, 45, 95, 99),
+(3, 5, 48, 33, 31, 46, 97, 101),
+(3, 5, 49, 33, 31, 46, 99, 103),
+(3, 5, 50, 33, 32, 47, 101, 106),
+(3, 5, 51, 34, 32, 48, 103, 108),
+(3, 5, 52, 34, 33, 48, 105, 110),
+(3, 5, 53, 35, 33, 49, 107, 112),
+(3, 5, 54, 35, 33, 50, 109, 114),
+(3, 5, 55, 35, 34, 50, 111, 116),
+(3, 5, 56, 36, 34, 51, 113, 118),
+(3, 5, 57, 36, 35, 52, 116, 120),
+(3, 5, 58, 36, 35, 52, 118, 123),
+(3, 5, 59, 37, 36, 53, 120, 125),
+(3, 5, 60, 37, 36, 54, 122, 127),
+(3, 5, 61, 37, 37, 54, 124, 129),
+(3, 5, 62, 38, 37, 55, 126, 131),
+(3, 5, 63, 38, 38, 56, 128, 134),
+(3, 5, 64, 39, 38, 57, 131, 136),
+(3, 5, 65, 39, 39, 57, 133, 138),
+(3, 5, 66, 39, 39, 58, 135, 141),
+(3, 5, 67, 40, 40, 59, 137, 143),
+(3, 5, 68, 40, 40, 59, 139, 145),
+(3, 5, 69, 41, 40, 60, 142, 148),
+(3, 5, 70, 41, 41, 61, 144, 150),
+(3, 5, 71, 41, 42, 62, 147, 153),
+(3, 5, 72, 42, 42, 62, 150, 163),
+(3, 5, 73, 42, 43, 63, 153, 166),
+(3, 5, 74, 43, 43, 64, 155, 170),
+(3, 5, 75, 43, 44, 65, 158, 173),
+(3, 5, 76, 43, 45, 66, 161, 176),
+(3, 5, 77, 44, 45, 67, 164, 179),
+(3, 5, 78, 44, 46, 68, 167, 182),
+(3, 5, 79, 45, 46, 69, 170, 184),
+(3, 5, 80, 45, 47, 70, 173, 189),
+(3, 6, 1, 25, 16, 25, 19, 19),
+(3, 6, 2, 26, 17, 26, 19, 19),
+(3, 6, 3, 28, 18, 27, 19, 20),
+(3, 6, 4, 29, 18, 28, 19, 20),
+(3, 6, 5, 30, 19, 30, 19, 20),
+(3, 6, 6, 31, 20, 31, 19, 20),
+(3, 6, 7, 33, 21, 32, 20, 21),
+(3, 6, 8, 34, 22, 33, 20, 21),
+(3, 6, 9, 36, 23, 35, 20, 21),
+(3, 6, 10, 37, 23, 36, 20, 22),
+(3, 6, 11, 38, 24, 37, 20, 22),
+(3, 6, 12, 40, 25, 38, 20, 22),
+(3, 6, 13, 41, 26, 40, 20, 23),
+(3, 6, 14, 43, 27, 41, 20, 23),
+(3, 6, 15, 44, 28, 42, 20, 23),
+(3, 6, 16, 46, 29, 44, 21, 24),
+(3, 6, 17, 47, 30, 45, 21, 24),
+(3, 6, 18, 49, 31, 46, 21, 24),
+(3, 6, 19, 50, 32, 48, 21, 25),
+(3, 6, 20, 52, 33, 49, 21, 25),
+(3, 6, 21, 53, 34, 51, 21, 26),
+(3, 6, 22, 55, 34, 52, 21, 26),
+(3, 6, 23, 56, 35, 53, 21, 26),
+(3, 6, 24, 58, 36, 55, 22, 27),
+(3, 6, 25, 59, 37, 56, 22, 27),
+(3, 6, 26, 61, 38, 58, 22, 27),
+(3, 6, 27, 63, 39, 59, 22, 28),
+(3, 6, 28, 64, 41, 61, 22, 28),
+(3, 6, 29, 66, 42, 62, 22, 29),
+(3, 6, 30, 68, 43, 64, 23, 29),
+(3, 6, 31, 69, 44, 65, 23, 30),
+(3, 6, 32, 71, 45, 67, 23, 30),
+(3, 6, 33, 73, 46, 68, 23, 30),
+(3, 6, 34, 75, 47, 70, 23, 31),
+(3, 6, 35, 76, 48, 72, 24, 31),
+(3, 6, 36, 78, 49, 73, 24, 32),
+(3, 6, 37, 80, 50, 75, 24, 32),
+(3, 6, 38, 82, 51, 76, 24, 33),
+(3, 6, 39, 84, 52, 78, 24, 33),
+(3, 6, 40, 85, 54, 80, 24, 34),
+(3, 6, 41, 87, 55, 81, 25, 34),
+(3, 6, 42, 89, 56, 83, 25, 35),
+(3, 6, 43, 91, 57, 85, 25, 35),
+(3, 6, 44, 93, 58, 87, 25, 36),
+(3, 6, 45, 95, 59, 88, 26, 36),
+(3, 6, 46, 97, 61, 90, 26, 37),
+(3, 6, 47, 99, 62, 92, 26, 37),
+(3, 6, 48, 101, 63, 94, 26, 38),
+(3, 6, 49, 102, 64, 95, 26, 38),
+(3, 6, 50, 104, 65, 97, 27, 39),
+(3, 6, 51, 106, 67, 99, 27, 39),
+(3, 6, 52, 108, 68, 99, 27, 40),
+(3, 6, 53, 109, 68, 101, 27, 40),
+(3, 6, 54, 110, 69, 101, 28, 41),
+(3, 6, 55, 110, 69, 102, 28, 41),
+(3, 6, 56, 113, 71, 105, 28, 42),
+(3, 6, 57, 118, 72, 107, 28, 42),
+(3, 6, 58, 120, 73, 109, 29, 43),
+(3, 6, 59, 123, 75, 111, 29, 43),
+(3, 6, 60, 125, 76, 113, 29, 44),
+(3, 6, 61, 126, 77, 115, 29, 45),
+(3, 6, 62, 127, 79, 117, 29, 45),
+(3, 6, 63, 129, 80, 120, 30, 46),
+(3, 6, 64, 132, 82, 122, 30, 46),
+(3, 6, 65, 135, 83, 124, 30, 47),
+(3, 6, 66, 137, 85, 127, 30, 48),
+(3, 6, 67, 144, 86, 129, 31, 48),
+(3, 6, 68, 146, 88, 131, 31, 49),
+(3, 6, 69, 149, 89, 133, 31, 50),
+(3, 6, 70, 152, 91, 136, 31, 50),
+(3, 6, 71, 154, 93, 139, 32, 51),
+(3, 6, 72, 157, 94, 141, 32, 52),
+(3, 6, 73, 160, 96, 144, 32, 53),
+(3, 6, 74, 163, 98, 146, 32, 53),
+(3, 6, 75, 166, 99, 150, 33, 54),
+(3, 6, 76, 169, 101, 152, 33, 55),
+(3, 6, 77, 172, 103, 155, 33, 56),
+(3, 6, 78, 176, 104, 157, 33, 56),
+(3, 6, 79, 179, 106, 160, 34, 57),
+(3, 6, 80, 182, 108, 163, 34, 58),
+(4, 1, 1, 20, 25, 21, 20, 20),
+(4, 1, 2, 21, 26, 22, 20, 20),
+(4, 1, 3, 23, 27, 23, 20, 21),
+(4, 1, 4, 24, 27, 25, 20, 21),
+(4, 1, 5, 25, 28, 26, 20, 21),
+(4, 1, 6, 27, 29, 27, 20, 21),
+(4, 1, 7, 28, 30, 28, 21, 22),
+(4, 1, 8, 29, 31, 29, 21, 22),
+(4, 1, 9, 31, 31, 31, 21, 22),
+(4, 1, 10, 32, 32, 32, 21, 23),
+(4, 1, 11, 33, 33, 33, 21, 23),
+(4, 1, 12, 35, 34, 34, 21, 23),
+(4, 1, 13, 36, 35, 36, 21, 24),
+(4, 1, 14, 38, 36, 37, 21, 24),
+(4, 1, 15, 39, 37, 38, 21, 24),
+(4, 1, 16, 41, 37, 40, 21, 25),
+(4, 1, 17, 42, 38, 41, 22, 25),
+(4, 1, 18, 44, 39, 43, 22, 25),
+(4, 1, 19, 45, 40, 44, 22, 26),
+(4, 1, 20, 47, 41, 45, 22, 26),
+(4, 1, 21, 48, 42, 47, 22, 26),
+(4, 1, 22, 50, 43, 48, 22, 27),
+(4, 1, 23, 52, 44, 50, 22, 27),
+(4, 1, 24, 53, 45, 51, 23, 28),
+(4, 1, 25, 55, 46, 52, 23, 28),
+(4, 1, 26, 56, 47, 54, 23, 28),
+(4, 1, 27, 58, 48, 55, 23, 29),
+(4, 1, 28, 60, 49, 57, 23, 29),
+(4, 1, 29, 61, 50, 58, 23, 30),
+(4, 1, 30, 63, 51, 60, 24, 30),
+(4, 1, 31, 65, 52, 62, 24, 30),
+(4, 1, 32, 66, 53, 63, 24, 31),
+(4, 1, 33, 68, 54, 65, 24, 31),
+(4, 1, 34, 70, 55, 66, 24, 32),
+(4, 1, 35, 72, 56, 68, 24, 32),
+(4, 1, 36, 73, 58, 69, 25, 33),
+(4, 1, 37, 75, 59, 71, 25, 33),
+(4, 1, 38, 77, 60, 73, 25, 34),
+(4, 1, 39, 79, 61, 74, 25, 34),
+(4, 1, 40, 81, 62, 76, 25, 35),
+(4, 1, 41, 82, 63, 78, 26, 35),
+(4, 1, 42, 84, 64, 79, 26, 35),
+(4, 1, 43, 86, 66, 81, 26, 36),
+(4, 1, 44, 88, 67, 83, 26, 36),
+(4, 1, 45, 90, 68, 85, 26, 37),
+(4, 1, 46, 92, 69, 86, 27, 37),
+(4, 1, 47, 94, 70, 88, 27, 38),
+(4, 1, 48, 96, 72, 90, 27, 38),
+(4, 1, 49, 98, 73, 92, 27, 39),
+(4, 1, 50, 100, 74, 93, 28, 40),
+(4, 1, 51, 102, 75, 95, 28, 40),
+(4, 1, 52, 104, 77, 97, 28, 41),
+(4, 1, 53, 106, 78, 99, 28, 41),
+(4, 1, 54, 108, 79, 101, 29, 42),
+(4, 1, 55, 110, 80, 103, 29, 42),
+(4, 1, 56, 112, 82, 104, 29, 43),
+(4, 1, 57, 114, 83, 106, 29, 43),
+(4, 1, 58, 116, 84, 108, 30, 44),
+(4, 1, 59, 118, 86, 110, 30, 44),
+(4, 1, 60, 120, 87, 112, 30, 45),
+(4, 1, 61, 122, 88, 114, 30, 46),
+(4, 1, 62, 124, 90, 116, 31, 46),
+(4, 1, 63, 127, 91, 118, 31, 47),
+(4, 1, 64, 129, 92, 120, 31, 47),
+(4, 1, 65, 131, 94, 122, 32, 48),
+(4, 1, 66, 133, 95, 124, 32, 49),
+(4, 1, 67, 135, 97, 126, 32, 49),
+(4, 1, 68, 138, 98, 128, 32, 50),
+(4, 1, 69, 140, 100, 130, 33, 50),
+(4, 1, 70, 142, 101, 132, 33, 51),
+(4, 1, 71, 145, 102, 134, 33, 52),
+(4, 1, 72, 147, 104, 137, 33, 53),
+(4, 1, 73, 150, 106, 139, 33, 54),
+(4, 1, 74, 153, 107, 142, 34, 54),
+(4, 1, 75, 156, 109, 144, 34, 55),
+(4, 1, 76, 159, 111, 148, 34, 56),
+(4, 1, 77, 162, 113, 150, 35, 57),
+(4, 1, 78, 165, 114, 152, 35, 57),
+(4, 1, 79, 178, 116, 164, 35, 58),
+(4, 1, 80, 181, 118, 167, 36, 59),
+(4, 3, 1, 17, 28, 20, 20, 21),
+(4, 3, 2, 17, 29, 21, 21, 22),
+(4, 3, 3, 18, 31, 22, 21, 22),
+(4, 3, 4, 18, 32, 23, 22, 23),
+(4, 3, 5, 19, 33, 24, 22, 24),
+(4, 3, 6, 19, 35, 25, 23, 24),
+(4, 3, 7, 20, 36, 26, 24, 25),
+(4, 3, 8, 20, 38, 27, 24, 25),
+(4, 3, 9, 21, 39, 27, 25, 26),
+(4, 3, 10, 21, 40, 28, 25, 27),
+(4, 3, 11, 22, 42, 29, 26, 28),
+(4, 3, 12, 22, 43, 30, 27, 28),
+(4, 3, 13, 23, 45, 31, 27, 29),
+(4, 3, 14, 23, 46, 32, 28, 30),
+(4, 3, 15, 24, 48, 34, 29, 30),
+(4, 3, 16, 24, 50, 35, 29, 31),
+(4, 3, 17, 25, 51, 36, 30, 32),
+(4, 3, 18, 25, 53, 37, 31, 33),
+(4, 3, 19, 26, 54, 38, 31, 33),
+(4, 3, 20, 26, 56, 39, 32, 34),
+(4, 3, 21, 27, 57, 40, 33, 35),
+(4, 3, 22, 27, 59, 41, 33, 36),
+(4, 3, 23, 28, 61, 42, 34, 36),
+(4, 3, 24, 28, 62, 43, 35, 37),
+(4, 3, 25, 29, 64, 44, 36, 38),
+(4, 3, 26, 30, 66, 46, 36, 39),
+(4, 3, 27, 30, 68, 47, 37, 40),
+(4, 3, 28, 31, 69, 48, 38, 41),
+(4, 3, 29, 31, 71, 49, 39, 41);
+INSERT IGNORE INTO `player_levelstats` (`race`, `class`, `level`, `str`, `agi`, `sta`, `inte`, `spi`) VALUES
+(4, 3, 30, 32, 73, 50, 39, 42),
+(4, 3, 31, 33, 75, 52, 40, 43),
+(4, 3, 32, 33, 76, 53, 41, 44),
+(4, 3, 33, 34, 78, 54, 42, 45),
+(4, 3, 34, 34, 80, 55, 43, 46),
+(4, 3, 35, 35, 82, 57, 44, 47),
+(4, 3, 36, 36, 84, 58, 44, 48),
+(4, 3, 37, 36, 86, 59, 45, 48),
+(4, 3, 38, 37, 87, 60, 46, 49),
+(4, 3, 39, 38, 89, 62, 47, 50),
+(4, 3, 40, 38, 91, 63, 48, 51),
+(4, 3, 41, 39, 93, 64, 49, 52),
+(4, 3, 42, 40, 95, 66, 49, 53),
+(4, 3, 43, 40, 97, 67, 50, 54),
+(4, 3, 44, 41, 99, 68, 51, 55),
+(4, 3, 45, 42, 101, 70, 52, 56),
+(4, 3, 46, 42, 103, 71, 53, 57),
+(4, 3, 47, 43, 105, 72, 54, 58),
+(4, 3, 48, 44, 107, 74, 55, 59),
+(4, 3, 49, 45, 109, 75, 56, 60),
+(4, 3, 50, 45, 111, 77, 57, 61),
+(4, 3, 51, 46, 113, 78, 58, 62),
+(4, 3, 52, 47, 115, 79, 59, 63),
+(4, 3, 53, 47, 118, 81, 60, 64),
+(4, 3, 54, 48, 120, 82, 61, 65),
+(4, 3, 55, 49, 122, 84, 61, 66),
+(4, 3, 56, 50, 124, 85, 62, 67),
+(4, 3, 57, 50, 126, 87, 63, 68),
+(4, 3, 58, 51, 128, 88, 64, 69),
+(4, 3, 59, 52, 131, 90, 65, 70),
+(4, 3, 60, 53, 133, 91, 66, 72),
+(4, 3, 61, 54, 135, 93, 67, 73),
+(4, 3, 62, 54, 137, 94, 69, 74),
+(4, 3, 63, 55, 140, 96, 70, 75),
+(4, 3, 64, 56, 142, 97, 71, 76),
+(4, 3, 65, 57, 144, 99, 72, 77),
+(4, 3, 66, 58, 147, 101, 73, 78),
+(4, 3, 67, 58, 149, 102, 74, 79),
+(4, 3, 68, 59, 151, 104, 75, 81),
+(4, 3, 69, 60, 154, 105, 76, 82),
+(4, 3, 70, 61, 156, 107, 77, 83),
+(4, 3, 71, 62, 159, 109, 78, 84),
+(4, 3, 72, 63, 162, 111, 79, 85),
+(4, 3, 73, 64, 165, 113, 80, 87),
+(4, 3, 74, 65, 168, 115, 82, 88),
+(4, 3, 75, 66, 171, 117, 83, 90),
+(4, 3, 76, 67, 174, 119, 84, 91),
+(4, 3, 77, 68, 177, 121, 86, 93),
+(4, 3, 78, 69, 180, 123, 87, 94),
+(4, 3, 79, 70, 190, 125, 91, 96),
+(4, 3, 80, 71, 193, 127, 93, 97),
+(4, 4, 1, 18, 28, 20, 20, 20),
+(4, 4, 2, 19, 29, 21, 20, 20),
+(4, 4, 3, 20, 31, 21, 20, 21),
+(4, 4, 4, 20, 32, 22, 20, 21),
+(4, 4, 5, 21, 34, 23, 21, 21),
+(4, 4, 6, 22, 35, 24, 21, 22),
+(4, 4, 7, 23, 37, 24, 21, 22),
+(4, 4, 8, 24, 38, 25, 21, 23),
+(4, 4, 9, 24, 40, 26, 21, 23),
+(4, 4, 10, 25, 41, 26, 21, 23),
+(4, 4, 11, 26, 43, 27, 22, 24),
+(4, 4, 12, 27, 44, 28, 22, 24),
+(4, 4, 13, 28, 46, 29, 22, 25),
+(4, 4, 14, 29, 48, 30, 22, 25),
+(4, 4, 15, 29, 49, 30, 22, 25),
+(4, 4, 16, 30, 51, 31, 23, 26),
+(4, 4, 17, 31, 52, 32, 23, 26),
+(4, 4, 18, 32, 54, 33, 23, 27),
+(4, 4, 19, 33, 56, 34, 23, 27),
+(4, 4, 20, 34, 57, 35, 23, 28),
+(4, 4, 21, 35, 59, 35, 24, 28),
+(4, 4, 22, 36, 61, 36, 24, 29),
+(4, 4, 23, 37, 63, 37, 24, 29),
+(4, 4, 24, 38, 64, 38, 24, 30),
+(4, 4, 25, 39, 66, 39, 25, 30),
+(4, 4, 26, 40, 68, 40, 25, 31),
+(4, 4, 27, 41, 70, 41, 25, 31),
+(4, 4, 28, 42, 72, 42, 25, 32),
+(4, 4, 29, 43, 73, 43, 25, 32),
+(4, 4, 30, 44, 75, 43, 26, 33),
+(4, 4, 31, 45, 77, 44, 26, 33),
+(4, 4, 32, 46, 79, 45, 26, 34),
+(4, 4, 33, 47, 81, 46, 27, 34),
+(4, 4, 34, 48, 83, 47, 27, 35),
+(4, 4, 35, 49, 85, 48, 27, 35),
+(4, 4, 36, 50, 87, 49, 27, 36),
+(4, 4, 37, 51, 89, 50, 28, 36),
+(4, 4, 38, 52, 91, 51, 28, 37),
+(4, 4, 39, 53, 93, 52, 28, 38),
+(4, 4, 40, 54, 95, 53, 28, 38),
+(4, 4, 41, 56, 97, 54, 29, 39),
+(4, 4, 42, 57, 99, 55, 29, 39),
+(4, 4, 43, 58, 101, 56, 29, 40),
+(4, 4, 44, 59, 103, 57, 30, 40),
+(4, 4, 45, 60, 105, 59, 30, 41),
+(4, 4, 46, 61, 107, 60, 30, 42),
+(4, 4, 47, 62, 109, 61, 31, 42),
+(4, 4, 48, 64, 112, 62, 31, 43),
+(4, 4, 49, 65, 114, 63, 31, 44),
+(4, 4, 50, 66, 116, 64, 32, 44),
+(4, 4, 51, 67, 118, 65, 32, 45),
+(4, 4, 52, 68, 120, 66, 32, 45),
+(4, 4, 53, 70, 123, 67, 33, 46),
+(4, 4, 54, 71, 125, 69, 33, 47),
+(4, 4, 55, 72, 127, 70, 33, 47),
+(4, 4, 56, 73, 129, 71, 34, 48),
+(4, 4, 57, 75, 132, 72, 34, 49),
+(4, 4, 58, 76, 134, 73, 34, 49),
+(4, 4, 59, 77, 136, 74, 35, 50),
+(4, 4, 60, 79, 139, 76, 35, 51),
+(4, 4, 61, 80, 141, 77, 35, 51),
+(4, 4, 62, 81, 143, 78, 36, 52),
+(4, 4, 63, 82, 146, 79, 36, 53),
+(4, 4, 64, 84, 148, 80, 37, 54),
+(4, 4, 65, 85, 151, 82, 37, 54),
+(4, 4, 66, 87, 153, 83, 37, 55),
+(4, 4, 67, 88, 156, 84, 38, 56),
+(4, 4, 68, 89, 158, 85, 38, 57),
+(4, 4, 69, 91, 160, 87, 39, 57),
+(4, 4, 70, 92, 163, 88, 39, 58),
+(4, 4, 71, 94, 166, 90, 39, 59),
+(4, 4, 72, 96, 169, 91, 40, 59),
+(4, 4, 73, 97, 172, 93, 40, 60),
+(4, 4, 74, 99, 175, 94, 41, 61),
+(4, 4, 75, 101, 178, 96, 41, 62),
+(4, 4, 76, 102, 181, 97, 41, 63),
+(4, 4, 77, 104, 184, 99, 42, 64),
+(4, 4, 78, 106, 188, 101, 42, 65),
+(4, 4, 79, 108, 191, 102, 43, 66),
+(4, 4, 80, 110, 194, 104, 43, 67),
+(4, 5, 1, 17, 25, 19, 22, 23),
+(4, 5, 2, 17, 25, 19, 23, 24),
+(4, 5, 3, 17, 25, 20, 25, 26),
+(4, 5, 4, 17, 26, 20, 26, 27),
+(4, 5, 5, 18, 26, 20, 27, 28),
+(4, 5, 6, 18, 26, 21, 29, 30),
+(4, 5, 7, 18, 26, 21, 30, 31),
+(4, 5, 8, 18, 26, 22, 31, 33),
+(4, 5, 9, 18, 27, 22, 33, 34),
+(4, 5, 10, 19, 27, 22, 34, 36),
+(4, 5, 11, 19, 27, 23, 36, 37),
+(4, 5, 12, 19, 27, 23, 37, 39),
+(4, 5, 13, 19, 28, 24, 38, 40),
+(4, 5, 14, 19, 28, 24, 40, 42),
+(4, 5, 15, 19, 28, 25, 41, 43),
+(4, 5, 16, 20, 28, 25, 43, 45),
+(4, 5, 17, 20, 29, 25, 44, 46),
+(4, 5, 18, 20, 29, 26, 46, 48),
+(4, 5, 19, 20, 29, 26, 47, 49),
+(4, 5, 20, 21, 30, 27, 49, 51),
+(4, 5, 21, 21, 30, 27, 51, 53),
+(4, 5, 22, 21, 30, 28, 52, 54),
+(4, 5, 23, 21, 30, 28, 54, 56),
+(4, 5, 24, 21, 31, 29, 55, 58),
+(4, 5, 25, 22, 31, 29, 57, 59),
+(4, 5, 26, 22, 31, 30, 59, 61),
+(4, 5, 27, 22, 32, 30, 60, 63),
+(4, 5, 28, 22, 32, 31, 62, 65),
+(4, 5, 29, 23, 32, 31, 64, 66),
+(4, 5, 30, 23, 33, 32, 65, 68),
+(4, 5, 31, 23, 33, 32, 67, 70),
+(4, 5, 32, 23, 33, 33, 69, 72),
+(4, 5, 33, 24, 34, 33, 70, 73),
+(4, 5, 34, 24, 34, 34, 72, 75),
+(4, 5, 35, 24, 34, 34, 74, 77),
+(4, 5, 36, 24, 35, 35, 76, 79),
+(4, 5, 37, 25, 35, 35, 78, 81),
+(4, 5, 38, 25, 35, 36, 79, 83),
+(4, 5, 39, 25, 36, 37, 81, 85),
+(4, 5, 40, 26, 36, 37, 83, 87),
+(4, 5, 41, 26, 37, 38, 85, 88),
+(4, 5, 42, 26, 37, 38, 87, 90),
+(4, 5, 43, 27, 37, 39, 89, 92),
+(4, 5, 44, 27, 38, 39, 91, 94),
+(4, 5, 45, 27, 38, 40, 92, 96),
+(4, 5, 46, 27, 39, 41, 94, 98),
+(4, 5, 47, 28, 39, 41, 96, 100),
+(4, 5, 48, 28, 39, 42, 98, 102),
+(4, 5, 49, 28, 40, 43, 100, 104),
+(4, 5, 50, 29, 40, 43, 102, 106),
+(4, 5, 51, 29, 41, 44, 104, 109),
+(4, 5, 52, 29, 41, 44, 106, 111),
+(4, 5, 53, 30, 42, 45, 108, 113),
+(4, 5, 54, 30, 42, 46, 110, 115),
+(4, 5, 55, 30, 43, 46, 112, 117),
+(4, 5, 56, 31, 43, 47, 114, 119),
+(4, 5, 57, 31, 43, 48, 117, 121),
+(4, 5, 58, 31, 44, 48, 119, 124),
+(4, 5, 59, 32, 44, 49, 121, 126),
+(4, 5, 60, 32, 45, 50, 123, 128),
+(4, 5, 61, 33, 45, 51, 125, 130),
+(4, 5, 62, 33, 46, 51, 127, 132),
+(4, 5, 63, 33, 46, 52, 129, 135),
+(4, 5, 64, 34, 47, 53, 132, 137),
+(4, 5, 65, 34, 47, 53, 134, 139),
+(4, 5, 66, 34, 48, 54, 136, 142),
+(4, 5, 67, 35, 48, 55, 138, 144),
+(4, 5, 68, 35, 49, 56, 140, 146),
+(4, 5, 69, 36, 49, 56, 143, 149),
+(4, 5, 70, 36, 50, 57, 145, 151),
+(4, 5, 71, 36, 51, 58, 148, 161),
+(4, 5, 72, 37, 51, 58, 151, 164),
+(4, 5, 73, 37, 52, 59, 154, 168),
+(4, 5, 74, 38, 52, 60, 156, 171),
+(4, 5, 75, 38, 53, 61, 159, 174),
+(4, 5, 76, 38, 54, 62, 162, 177),
+(4, 5, 77, 39, 54, 63, 165, 180),
+(4, 5, 78, 39, 55, 64, 168, 183),
+(4, 5, 79, 40, 55, 65, 171, 186),
+(4, 5, 80, 40, 56, 66, 200, 191),
+(4, 6, 1, 20, 25, 21, 20, 20),
+(4, 6, 2, 21, 26, 22, 20, 20),
+(4, 6, 3, 23, 27, 23, 20, 21),
+(4, 6, 4, 24, 27, 25, 20, 21),
+(4, 6, 5, 25, 28, 26, 20, 21),
+(4, 6, 6, 27, 29, 27, 20, 21),
+(4, 6, 7, 28, 30, 28, 21, 22),
+(4, 6, 8, 29, 31, 29, 21, 22),
+(4, 6, 9, 31, 31, 31, 21, 22),
+(4, 6, 10, 32, 32, 32, 21, 23),
+(4, 6, 11, 33, 33, 33, 21, 23),
+(4, 6, 12, 35, 34, 34, 21, 23),
+(4, 6, 13, 36, 35, 36, 21, 24),
+(4, 6, 14, 38, 36, 37, 21, 24),
+(4, 6, 15, 39, 37, 38, 21, 24),
+(4, 6, 16, 41, 37, 40, 21, 25),
+(4, 6, 17, 42, 38, 41, 22, 25),
+(4, 6, 18, 44, 39, 43, 22, 25),
+(4, 6, 19, 45, 40, 44, 22, 26),
+(4, 6, 20, 47, 41, 45, 22, 26),
+(4, 6, 21, 48, 42, 47, 22, 26),
+(4, 6, 22, 50, 43, 48, 22, 27),
+(4, 6, 23, 52, 44, 50, 22, 27),
+(4, 6, 24, 53, 45, 51, 23, 28),
+(4, 6, 25, 55, 46, 52, 23, 28),
+(4, 6, 26, 56, 47, 54, 23, 28),
+(4, 6, 27, 58, 48, 55, 23, 29),
+(4, 6, 28, 60, 49, 57, 23, 29),
+(4, 6, 29, 61, 50, 58, 23, 30),
+(4, 6, 30, 63, 51, 60, 24, 30),
+(4, 6, 31, 65, 52, 62, 24, 30),
+(4, 6, 32, 66, 53, 63, 24, 31),
+(4, 6, 33, 68, 54, 65, 24, 31),
+(4, 6, 34, 70, 55, 66, 24, 32),
+(4, 6, 35, 72, 56, 68, 24, 32),
+(4, 6, 36, 73, 58, 69, 25, 33),
+(4, 6, 37, 75, 59, 71, 25, 33),
+(4, 6, 38, 77, 60, 73, 25, 34),
+(4, 6, 39, 79, 61, 74, 25, 34),
+(4, 6, 40, 81, 62, 76, 25, 35),
+(4, 6, 41, 82, 63, 78, 26, 35),
+(4, 6, 42, 84, 64, 79, 26, 35),
+(4, 6, 43, 86, 66, 81, 26, 36),
+(4, 6, 44, 88, 67, 83, 26, 36),
+(4, 6, 45, 90, 68, 85, 26, 37),
+(4, 6, 46, 92, 69, 86, 27, 37),
+(4, 6, 47, 94, 70, 88, 27, 38),
+(4, 6, 48, 96, 72, 90, 27, 38),
+(4, 6, 49, 98, 73, 92, 27, 39),
+(4, 6, 50, 100, 74, 93, 28, 40),
+(4, 6, 51, 101, 75, 94, 28, 40),
+(4, 6, 52, 102, 76, 95, 28, 41),
+(4, 6, 53, 103, 77, 96, 28, 41),
+(4, 6, 54, 104, 77, 97, 29, 42),
+(4, 6, 55, 105, 78, 98, 29, 42),
+(4, 6, 56, 108, 80, 101, 29, 43),
+(4, 6, 57, 113, 81, 103, 29, 43),
+(4, 6, 58, 115, 82, 105, 30, 44),
+(4, 6, 59, 115, 84, 107, 30, 44),
+(4, 6, 60, 120, 85, 109, 30, 45),
+(4, 6, 61, 122, 86, 111, 30, 46),
+(4, 6, 62, 122, 88, 113, 30, 46),
+(4, 6, 63, 127, 89, 116, 31, 47),
+(4, 6, 64, 127, 91, 118, 31, 47),
+(4, 6, 65, 133, 92, 120, 31, 48),
+(4, 6, 66, 135, 94, 123, 31, 49),
+(4, 6, 67, 136, 95, 125, 32, 49),
+(4, 6, 68, 137, 97, 127, 32, 50),
+(4, 6, 69, 140, 98, 130, 32, 51),
+(4, 6, 70, 147, 100, 132, 32, 51),
+(4, 6, 71, 154, 102, 135, 33, 52),
+(4, 6, 72, 156, 103, 137, 33, 53),
+(4, 6, 73, 157, 105, 140, 33, 54),
+(4, 6, 74, 158, 107, 142, 33, 54),
+(4, 6, 75, 161, 108, 145, 34, 55),
+(4, 6, 76, 164, 110, 148, 34, 56),
+(4, 6, 77, 167, 112, 150, 34, 57),
+(4, 6, 78, 170, 113, 153, 34, 57),
+(4, 6, 79, 172, 115, 156, 35, 58),
+(4, 6, 80, 177, 117, 159, 35, 59),
+(4, 11, 1, 18, 25, 19, 22, 22),
+(4, 11, 2, 19, 25, 20, 23, 23),
+(4, 11, 3, 19, 26, 20, 24, 24),
+(4, 11, 4, 20, 26, 21, 25, 26),
+(4, 11, 5, 20, 27, 22, 26, 27),
+(4, 11, 6, 21, 27, 22, 27, 28),
+(4, 11, 7, 21, 28, 23, 28, 29),
+(4, 11, 8, 22, 28, 24, 29, 30),
+(4, 11, 9, 23, 29, 24, 30, 32),
+(4, 11, 10, 23, 29, 25, 32, 33),
+(4, 11, 11, 24, 30, 26, 33, 34),
+(4, 11, 12, 24, 31, 26, 34, 35),
+(4, 11, 13, 25, 31, 27, 35, 37),
+(4, 11, 14, 26, 32, 28, 36, 38),
+(4, 11, 15, 26, 32, 29, 37, 39),
+(4, 11, 16, 27, 33, 29, 38, 41),
+(4, 11, 17, 28, 33, 30, 40, 42),
+(4, 11, 18, 28, 34, 31, 41, 43),
+(4, 11, 19, 29, 35, 32, 42, 45),
+(4, 11, 20, 30, 35, 32, 43, 46),
+(4, 11, 21, 30, 36, 33, 45, 48),
+(4, 11, 22, 31, 36, 34, 46, 49),
+(4, 11, 23, 32, 37, 35, 47, 51),
+(4, 11, 24, 32, 38, 36, 48, 52),
+(4, 11, 25, 33, 38, 36, 50, 53),
+(4, 11, 26, 34, 39, 37, 51, 55),
+(4, 11, 27, 35, 40, 38, 52, 56),
+(4, 11, 28, 35, 40, 39, 54, 58),
+(4, 11, 29, 36, 41, 40, 55, 59),
+(4, 11, 30, 37, 42, 41, 56, 61),
+(4, 11, 31, 38, 42, 42, 58, 62),
+(4, 11, 32, 38, 43, 42, 59, 64),
+(4, 11, 33, 39, 44, 43, 60, 66),
+(4, 11, 34, 40, 44, 44, 62, 67),
+(4, 11, 35, 41, 45, 45, 63, 69),
+(4, 11, 36, 42, 46, 46, 65, 70),
+(4, 11, 37, 42, 47, 47, 66, 72),
+(4, 11, 38, 43, 47, 48, 67, 74),
+(4, 11, 39, 44, 48, 49, 69, 75),
+(4, 11, 40, 45, 49, 50, 70, 77),
+(4, 11, 41, 46, 50, 51, 72, 79),
+(4, 11, 42, 46, 50, 52, 73, 80),
+(4, 11, 43, 47, 51, 53, 75, 82),
+(4, 11, 44, 48, 52, 54, 76, 84),
+(4, 11, 45, 49, 53, 55, 78, 85),
+(4, 11, 46, 50, 54, 56, 79, 87),
+(4, 11, 47, 51, 54, 57, 81, 89),
+(4, 11, 48, 52, 55, 58, 83, 91),
+(4, 11, 49, 53, 56, 59, 84, 93),
+(4, 11, 50, 53, 57, 60, 86, 94),
+(4, 11, 51, 54, 58, 61, 87, 96),
+(4, 11, 52, 55, 59, 62, 89, 98),
+(4, 11, 53, 56, 59, 63, 91, 100),
+(4, 11, 54, 57, 60, 64, 92, 102),
+(4, 11, 55, 58, 61, 65, 94, 103),
+(4, 11, 56, 59, 62, 66, 95, 105),
+(4, 11, 57, 60, 63, 67, 97, 107),
+(4, 11, 58, 61, 64, 68, 99, 109),
+(4, 11, 59, 62, 65, 69, 101, 111),
+(4, 11, 60, 63, 66, 70, 102, 113),
+(4, 11, 61, 64, 66, 72, 104, 115),
+(4, 11, 62, 65, 67, 73, 106, 117),
+(4, 11, 63, 66, 68, 74, 107, 119),
+(4, 11, 64, 67, 69, 75, 109, 121),
+(4, 11, 65, 68, 70, 76, 111, 123),
+(4, 11, 66, 69, 71, 77, 113, 125),
+(4, 11, 67, 70, 72, 78, 115, 127),
+(4, 11, 68, 71, 73, 80, 116, 129),
+(4, 11, 69, 72, 74, 81, 118, 131),
+(4, 11, 70, 73, 75, 82, 120, 133),
+(4, 11, 71, 75, 76, 83, 122, 135),
+(4, 11, 72, 76, 78, 85, 125, 138),
+(4, 11, 73, 77, 79, 86, 127, 140),
+(4, 11, 74, 78, 80, 88, 131, 143),
+(4, 11, 75, 80, 81, 89, 133, 145),
+(4, 11, 76, 81, 82, 91, 134, 148),
+(4, 11, 77, 82, 83, 92, 136, 151),
+(4, 11, 78, 84, 85, 94, 138, 153),
+(4, 11, 79, 85, 86, 95, 141, 156),
+(4, 11, 80, 86, 87, 97, 143, 159),
+(5, 1, 1, 22, 18, 23, 18, 25),
+(5, 1, 2, 23, 19, 24, 18, 25),
+(5, 1, 3, 25, 20, 25, 18, 26),
+(5, 1, 4, 26, 20, 26, 18, 26),
+(5, 1, 5, 27, 21, 28, 18, 26),
+(5, 1, 6, 29, 22, 29, 18, 26),
+(5, 1, 7, 30, 23, 30, 19, 27),
+(5, 1, 8, 31, 24, 31, 19, 27),
+(5, 1, 9, 33, 25, 33, 19, 27),
+(5, 1, 10, 34, 25, 34, 19, 28),
+(5, 1, 11, 35, 26, 35, 19, 28),
+(5, 1, 12, 37, 27, 36, 19, 28),
+(5, 1, 13, 38, 28, 38, 19, 28),
+(5, 1, 14, 40, 29, 39, 19, 29),
+(5, 1, 15, 41, 30, 40, 19, 29),
+(5, 1, 16, 43, 31, 42, 20, 29),
+(5, 1, 17, 44, 32, 43, 20, 30),
+(5, 1, 18, 46, 33, 44, 20, 30),
+(5, 1, 19, 47, 34, 46, 20, 31),
+(5, 1, 20, 49, 34, 47, 20, 31),
+(5, 1, 21, 50, 35, 49, 20, 31),
+(5, 1, 22, 52, 36, 50, 20, 32),
+(5, 1, 23, 53, 37, 51, 21, 32),
+(5, 1, 24, 55, 38, 53, 21, 32),
+(5, 1, 25, 57, 39, 54, 21, 33),
+(5, 1, 26, 58, 40, 56, 21, 33),
+(5, 1, 27, 60, 41, 57, 21, 34),
+(5, 1, 28, 62, 42, 59, 21, 34),
+(5, 1, 29, 63, 43, 60, 21, 34),
+(5, 1, 30, 65, 44, 62, 22, 35),
+(5, 1, 31, 67, 46, 63, 22, 35),
+(5, 1, 32, 68, 47, 65, 22, 36),
+(5, 1, 33, 70, 48, 67, 22, 36),
+(5, 1, 34, 72, 49, 68, 22, 36),
+(5, 1, 35, 74, 50, 70, 23, 37),
+(5, 1, 36, 75, 51, 71, 23, 37),
+(5, 1, 37, 77, 52, 73, 23, 38),
+(5, 1, 38, 79, 53, 75, 23, 38),
+(5, 1, 39, 81, 54, 76, 23, 39),
+(5, 1, 40, 83, 55, 78, 24, 39),
+(5, 1, 41, 84, 57, 80, 24, 40),
+(5, 1, 42, 86, 58, 81, 24, 40),
+(5, 1, 43, 88, 59, 83, 24, 41),
+(5, 1, 44, 90, 60, 85, 24, 41),
+(5, 1, 45, 92, 61, 86, 25, 42),
+(5, 1, 46, 94, 62, 88, 25, 42),
+(5, 1, 47, 96, 64, 90, 25, 43),
+(5, 1, 48, 98, 65, 92, 25, 43),
+(5, 1, 49, 100, 66, 93, 25, 44),
+(5, 1, 50, 102, 67, 95, 26, 44),
+(5, 1, 51, 104, 69, 97, 26, 45),
+(5, 1, 52, 106, 70, 99, 26, 45),
+(5, 1, 53, 108, 71, 101, 26, 46),
+(5, 1, 54, 110, 72, 103, 27, 46),
+(5, 1, 55, 112, 74, 104, 27, 47),
+(5, 1, 56, 114, 75, 106, 27, 48),
+(5, 1, 57, 116, 76, 108, 27, 48),
+(5, 1, 58, 118, 78, 110, 28, 49),
+(5, 1, 59, 120, 79, 112, 28, 49),
+(5, 1, 60, 122, 80, 114, 28, 50),
+(5, 1, 61, 124, 82, 116, 28, 50),
+(5, 1, 62, 126, 83, 118, 29, 51),
+(5, 1, 63, 128, 84, 120, 29, 52),
+(5, 1, 64, 131, 86, 122, 29, 52),
+(5, 1, 65, 133, 87, 124, 30, 53),
+(5, 1, 66, 135, 88, 126, 30, 53),
+(5, 1, 67, 137, 90, 128, 30, 54),
+(5, 1, 68, 139, 91, 130, 30, 55),
+(5, 1, 69, 142, 93, 132, 31, 55),
+(5, 1, 70, 144, 94, 134, 31, 56),
+(5, 1, 71, 147, 95, 136, 31, 57),
+(5, 1, 72, 150, 97, 139, 31, 58),
+(5, 1, 73, 152, 99, 141, 31, 59),
+(5, 1, 74, 155, 100, 144, 32, 59),
+(5, 1, 75, 158, 102, 146, 32, 60),
+(5, 1, 76, 163, 104, 149, 32, 61),
+(5, 1, 77, 167, 106, 152, 33, 62),
+(5, 1, 78, 167, 107, 154, 33, 62),
+(5, 1, 79, 170, 109, 157, 33, 63),
+(5, 1, 80, 173, 111, 160, 34, 64),
+(5, 4, 1, 20, 21, 22, 18, 25),
+(5, 4, 2, 21, 22, 23, 18, 25),
+(5, 4, 3, 22, 24, 23, 18, 26),
+(5, 4, 4, 22, 25, 24, 18, 26),
+(5, 4, 5, 23, 27, 25, 19, 26),
+(5, 4, 6, 24, 28, 25, 19, 27),
+(5, 4, 7, 25, 30, 26, 19, 27),
+(5, 4, 8, 25, 31, 27, 19, 27),
+(5, 4, 9, 26, 33, 28, 19, 28),
+(5, 4, 10, 27, 34, 28, 19, 28),
+(5, 4, 11, 28, 36, 29, 20, 29),
+(5, 4, 12, 29, 38, 30, 20, 29),
+(5, 4, 13, 30, 39, 31, 20, 29),
+(5, 4, 14, 31, 41, 32, 20, 30),
+(5, 4, 15, 31, 42, 32, 20, 30),
+(5, 4, 16, 32, 44, 33, 21, 31),
+(5, 4, 17, 33, 46, 34, 21, 31),
+(5, 4, 18, 34, 47, 35, 21, 32),
+(5, 4, 19, 35, 49, 36, 21, 32),
+(5, 4, 20, 36, 51, 36, 21, 32),
+(5, 4, 21, 37, 52, 37, 22, 33),
+(5, 4, 22, 38, 54, 38, 22, 33),
+(5, 4, 23, 39, 56, 39, 22, 34),
+(5, 4, 24, 40, 58, 40, 22, 34),
+(5, 4, 25, 41, 60, 41, 23, 35),
+(5, 4, 26, 42, 61, 42, 23, 35),
+(5, 4, 27, 43, 63, 43, 23, 36),
+(5, 4, 28, 44, 65, 44, 23, 36),
+(5, 4, 29, 45, 67, 44, 24, 37),
+(5, 4, 30, 46, 69, 45, 24, 37),
+(5, 4, 31, 47, 71, 46, 24, 38),
+(5, 4, 32, 48, 72, 47, 24, 38),
+(5, 4, 33, 49, 74, 48, 25, 39),
+(5, 4, 34, 50, 76, 49, 25, 39),
+(5, 4, 35, 51, 78, 50, 25, 40),
+(5, 4, 36, 52, 80, 51, 25, 41),
+(5, 4, 37, 53, 82, 52, 26, 41),
+(5, 4, 38, 54, 84, 53, 26, 42),
+(5, 4, 39, 55, 86, 54, 26, 42),
+(5, 4, 40, 56, 88, 55, 27, 43),
+(5, 4, 41, 57, 90, 56, 27, 43),
+(5, 4, 42, 59, 92, 57, 27, 44),
+(5, 4, 43, 60, 94, 58, 27, 45),
+(5, 4, 44, 61, 96, 59, 28, 45),
+(5, 4, 45, 62, 99, 60, 28, 46),
+(5, 4, 46, 63, 101, 61, 28, 46),
+(5, 4, 47, 64, 103, 63, 29, 47),
+(5, 4, 48, 66, 105, 64, 29, 48),
+(5, 4, 49, 67, 107, 65, 29, 48),
+(5, 4, 50, 68, 109, 66, 30, 49),
+(5, 4, 51, 69, 111, 67, 30, 50),
+(5, 4, 52, 70, 114, 68, 30, 50),
+(5, 4, 53, 72, 116, 69, 31, 51),
+(5, 4, 54, 73, 118, 70, 31, 52),
+(5, 4, 55, 74, 120, 72, 31, 52),
+(5, 4, 56, 75, 123, 73, 32, 53),
+(5, 4, 57, 77, 125, 74, 32, 54),
+(5, 4, 58, 78, 127, 75, 32, 54),
+(5, 4, 59, 79, 130, 76, 33, 55),
+(5, 4, 60, 81, 132, 77, 33, 56),
+(5, 4, 61, 82, 134, 79, 34, 56),
+(5, 4, 62, 83, 137, 80, 34, 57),
+(5, 4, 63, 84, 139, 81, 34, 58),
+(5, 4, 64, 86, 141, 82, 35, 59),
+(5, 4, 65, 87, 144, 84, 35, 59),
+(5, 4, 66, 88, 146, 85, 35, 60),
+(5, 4, 67, 90, 149, 86, 36, 61),
+(5, 4, 68, 91, 151, 87, 36, 61),
+(5, 4, 69, 93, 154, 89, 37, 62),
+(5, 4, 70, 94, 156, 90, 37, 63),
+(5, 4, 71, 96, 159, 91, 37, 64),
+(5, 4, 72, 98, 162, 93, 38, 64),
+(5, 4, 73, 99, 165, 95, 38, 65),
+(5, 4, 74, 101, 168, 96, 39, 66),
+(5, 4, 75, 103, 171, 98, 39, 67),
+(5, 4, 76, 104, 174, 99, 39, 68),
+(5, 4, 77, 106, 177, 101, 40, 69),
+(5, 4, 78, 108, 181, 103, 40, 70),
+(5, 4, 79, 110, 184, 104, 41, 71),
+(5, 4, 80, 112, 187, 106, 41, 72),
+(5, 5, 1, 19, 18, 21, 20, 28),
+(5, 5, 2, 19, 18, 21, 21, 29),
+(5, 5, 3, 19, 18, 22, 23, 31),
+(5, 5, 4, 19, 19, 22, 24, 32),
+(5, 5, 5, 20, 19, 22, 25, 33),
+(5, 5, 6, 20, 19, 23, 27, 35),
+(5, 5, 7, 20, 19, 23, 28, 36),
+(5, 5, 8, 20, 20, 24, 29, 38),
+(5, 5, 9, 20, 20, 24, 31, 39),
+(5, 5, 10, 20, 20, 24, 32, 40),
+(5, 5, 11, 21, 20, 25, 34, 42),
+(5, 5, 12, 21, 21, 25, 35, 43),
+(5, 5, 13, 21, 21, 26, 37, 45),
+(5, 5, 14, 21, 21, 26, 38, 46),
+(5, 5, 15, 21, 21, 26, 39, 48),
+(5, 5, 16, 22, 22, 27, 41, 50),
+(5, 5, 17, 22, 22, 27, 42, 51),
+(5, 5, 18, 22, 22, 28, 44, 53),
+(5, 5, 19, 22, 23, 28, 46, 54),
+(5, 5, 20, 22, 23, 29, 47, 56),
+(5, 5, 21, 23, 23, 29, 49, 57),
+(5, 5, 22, 23, 23, 30, 50, 59),
+(5, 5, 23, 23, 24, 30, 52, 61),
+(5, 5, 24, 23, 24, 31, 53, 62),
+(5, 5, 25, 24, 24, 31, 55, 64),
+(5, 5, 26, 24, 25, 32, 57, 66),
+(5, 5, 27, 24, 25, 32, 58, 68),
+(5, 5, 28, 24, 25, 33, 60, 69),
+(5, 5, 29, 25, 26, 33, 62, 71),
+(5, 5, 30, 25, 26, 34, 63, 73),
+(5, 5, 31, 25, 26, 34, 65, 75),
+(5, 5, 32, 25, 27, 35, 67, 76),
+(5, 5, 33, 26, 27, 35, 69, 78),
+(5, 5, 34, 26, 27, 36, 70, 80),
+(5, 5, 35, 26, 28, 36, 72, 82),
+(5, 5, 36, 26, 28, 37, 74, 84),
+(5, 5, 37, 27, 28, 37, 76, 86),
+(5, 5, 38, 27, 29, 38, 77, 87),
+(5, 5, 39, 27, 29, 38, 79, 89),
+(5, 5, 40, 28, 30, 39, 81, 91),
+(5, 5, 41, 28, 30, 40, 83, 93),
+(5, 5, 42, 28, 30, 40, 85, 95),
+(5, 5, 43, 28, 31, 41, 87, 97),
+(5, 5, 44, 29, 31, 41, 89, 99),
+(5, 5, 45, 29, 32, 42, 91, 101),
+(5, 5, 46, 29, 32, 43, 92, 103),
+(5, 5, 47, 30, 32, 43, 94, 105),
+(5, 5, 48, 30, 33, 44, 96, 107),
+(5, 5, 49, 30, 33, 44, 98, 109),
+(5, 5, 50, 31, 34, 45, 100, 111),
+(5, 5, 51, 31, 34, 46, 102, 113),
+(5, 5, 52, 31, 35, 46, 104, 115),
+(5, 5, 53, 32, 35, 47, 106, 118),
+(5, 5, 54, 32, 35, 48, 108, 120),
+(5, 5, 55, 32, 36, 48, 110, 122),
+(5, 5, 56, 33, 36, 49, 113, 124),
+(5, 5, 57, 33, 37, 50, 115, 126),
+(5, 5, 58, 33, 37, 50, 117, 128),
+(5, 5, 59, 34, 38, 51, 119, 131),
+(5, 5, 60, 34, 38, 52, 121, 133),
+(5, 5, 61, 34, 39, 52, 123, 135),
+(5, 5, 62, 35, 39, 53, 125, 137),
+(5, 5, 63, 35, 40, 54, 127, 140),
+(5, 5, 64, 36, 40, 55, 130, 142),
+(5, 5, 65, 36, 41, 55, 132, 144),
+(5, 5, 66, 36, 41, 56, 134, 147),
+(5, 5, 67, 37, 41, 57, 136, 149),
+(5, 5, 68, 37, 42, 58, 138, 151),
+(5, 5, 69, 38, 42, 58, 141, 154),
+(5, 5, 70, 38, 43, 59, 143, 156),
+(5, 5, 71, 38, 44, 60, 146, 159),
+(5, 5, 72, 39, 44, 60, 149, 162),
+(5, 5, 73, 39, 45, 61, 152, 165),
+(5, 5, 74, 40, 45, 62, 157, 168),
+(5, 5, 75, 40, 46, 63, 157, 171),
+(5, 5, 76, 40, 47, 64, 160, 174),
+(5, 5, 77, 41, 47, 65, 163, 177),
+(5, 5, 78, 41, 48, 66, 166, 180),
+(5, 5, 79, 42, 48, 67, 169, 183),
+(5, 5, 80, 42, 49, 68, 172, 186),
+(5, 6, 1, 22, 18, 23, 18, 25),
+(5, 6, 2, 23, 19, 24, 18, 25),
+(5, 6, 3, 25, 20, 25, 18, 26),
+(5, 6, 4, 26, 20, 26, 18, 26),
+(5, 6, 5, 27, 21, 28, 18, 26),
+(5, 6, 6, 29, 22, 29, 18, 26),
+(5, 6, 7, 30, 23, 30, 19, 27),
+(5, 6, 8, 31, 24, 31, 19, 27),
+(5, 6, 9, 33, 25, 33, 19, 27),
+(5, 6, 10, 34, 25, 34, 19, 28),
+(5, 6, 11, 35, 26, 35, 19, 28),
+(5, 6, 12, 37, 27, 36, 19, 28),
+(5, 6, 13, 38, 28, 38, 19, 28),
+(5, 6, 14, 40, 29, 39, 19, 29),
+(5, 6, 15, 41, 30, 40, 19, 29),
+(5, 6, 16, 43, 31, 42, 20, 29),
+(5, 6, 17, 44, 32, 43, 20, 30),
+(5, 6, 18, 46, 33, 44, 20, 30),
+(5, 6, 19, 47, 34, 46, 20, 31),
+(5, 6, 20, 49, 34, 47, 20, 31),
+(5, 6, 21, 50, 35, 49, 20, 31),
+(5, 6, 22, 52, 36, 50, 20, 32),
+(5, 6, 23, 53, 37, 51, 21, 32),
+(5, 6, 24, 55, 38, 53, 21, 32),
+(5, 6, 25, 57, 39, 54, 21, 33),
+(5, 6, 26, 58, 40, 56, 21, 33),
+(5, 6, 27, 60, 41, 57, 21, 34),
+(5, 6, 28, 62, 42, 59, 21, 34),
+(5, 6, 29, 63, 43, 60, 21, 34),
+(5, 6, 30, 65, 44, 62, 22, 35),
+(5, 6, 31, 67, 46, 63, 22, 35),
+(5, 6, 32, 68, 47, 65, 22, 36),
+(5, 6, 33, 70, 48, 67, 22, 36),
+(5, 6, 34, 72, 49, 68, 22, 36),
+(5, 6, 35, 74, 50, 70, 23, 37),
+(5, 6, 36, 75, 51, 71, 23, 37),
+(5, 6, 37, 77, 52, 73, 23, 38),
+(5, 6, 38, 79, 53, 75, 23, 38),
+(5, 6, 39, 81, 54, 76, 23, 39),
+(5, 6, 40, 83, 55, 78, 24, 39),
+(5, 6, 41, 84, 57, 80, 24, 40),
+(5, 6, 42, 86, 58, 81, 24, 40),
+(5, 6, 43, 88, 59, 83, 24, 41),
+(5, 6, 44, 90, 60, 85, 24, 41),
+(5, 6, 45, 92, 61, 86, 25, 42),
+(5, 6, 46, 94, 62, 88, 25, 42),
+(5, 6, 47, 96, 64, 90, 25, 43),
+(5, 6, 48, 98, 65, 92, 25, 43),
+(5, 6, 49, 100, 66, 93, 25, 44),
+(5, 6, 50, 102, 67, 95, 26, 44),
+(5, 6, 51, 103, 67, 96, 26, 45),
+(5, 6, 52, 104, 68, 97, 26, 45),
+(5, 6, 53, 105, 69, 98, 26, 46),
+(5, 6, 54, 106, 70, 99, 27, 46),
+(5, 6, 55, 107, 71, 100, 27, 47),
+(5, 6, 56, 110, 73, 103, 27, 48),
+(5, 6, 57, 112, 74, 105, 27, 48),
+(5, 6, 58, 114, 75, 107, 28, 49),
+(5, 6, 59, 119, 77, 109, 28, 49),
+(5, 6, 60, 122, 78, 111, 28, 50),
+(5, 6, 61, 124, 79, 113, 28, 51),
+(5, 6, 62, 127, 81, 115, 28, 51),
+(5, 6, 63, 129, 82, 118, 29, 52),
+(5, 6, 64, 136, 84, 120, 29, 52),
+(5, 6, 65, 137, 85, 123, 29, 53),
+(5, 6, 66, 138, 87, 125, 29, 54),
+(5, 6, 67, 141, 88, 127, 30, 54),
+(5, 6, 68, 143, 90, 129, 30, 55),
+(5, 6, 69, 146, 91, 132, 30, 56),
+(5, 6, 70, 149, 93, 134, 30, 56),
+(5, 6, 71, 152, 95, 137, 31, 57),
+(5, 6, 72, 154, 96, 139, 31, 58),
+(5, 6, 73, 157, 98, 142, 31, 59),
+(5, 6, 74, 158, 100, 145, 31, 59),
+(5, 6, 75, 159, 101, 147, 32, 60),
+(5, 6, 76, 162, 103, 150, 32, 61),
+(5, 6, 77, 167, 105, 152, 32, 62),
+(5, 6, 78, 173, 106, 155, 32, 62),
+(5, 6, 79, 174, 108, 158, 33, 63),
+(5, 6, 80, 174, 110, 161, 33, 64),
+(5, 8, 1, 19, 18, 21, 21, 27),
+(5, 8, 2, 19, 18, 21, 22, 28),
+(5, 8, 3, 19, 18, 22, 24, 30),
+(5, 8, 4, 19, 18, 22, 25, 31),
+(5, 8, 5, 19, 19, 22, 26, 32),
+(5, 8, 6, 19, 19, 22, 28, 34),
+(5, 8, 7, 20, 19, 23, 29, 35),
+(5, 8, 8, 20, 19, 23, 31, 36),
+(5, 8, 9, 20, 19, 23, 32, 38),
+(5, 8, 10, 20, 19, 24, 34, 39),
+(5, 8, 11, 20, 20, 24, 35, 40),
+(5, 8, 12, 20, 20, 24, 37, 42),
+(5, 8, 13, 20, 20, 25, 38, 43),
+(5, 8, 14, 20, 20, 25, 40, 45),
+(5, 8, 15, 20, 20, 25, 41, 46),
+(5, 8, 16, 21, 21, 26, 43, 48),
+(5, 8, 17, 21, 21, 26, 44, 49),
+(5, 8, 18, 21, 21, 26, 46, 51),
+(5, 8, 19, 21, 21, 27, 48, 52),
+(5, 8, 20, 21, 21, 27, 49, 54),
+(5, 8, 21, 21, 22, 27, 51, 55),
+(5, 8, 22, 21, 22, 28, 52, 57),
+(5, 8, 23, 21, 22, 28, 54, 58),
+(5, 8, 24, 22, 22, 29, 56, 60),
+(5, 8, 25, 22, 23, 29, 57, 62),
+(5, 8, 26, 22, 23, 29, 59, 63),
+(5, 8, 27, 22, 23, 30, 61, 65),
+(5, 8, 28, 22, 23, 30, 63, 67),
+(5, 8, 29, 22, 24, 31, 64, 68),
+(5, 8, 30, 23, 24, 31, 66, 70),
+(5, 8, 31, 23, 24, 31, 68, 72),
+(5, 8, 32, 23, 24, 32, 70, 73),
+(5, 8, 33, 23, 25, 32, 72, 75),
+(5, 8, 34, 23, 25, 33, 73, 77),
+(5, 8, 35, 24, 25, 33, 75, 79),
+(5, 8, 36, 24, 25, 34, 77, 80),
+(5, 8, 37, 24, 26, 34, 79, 82),
+(5, 8, 38, 24, 26, 35, 81, 84),
+(5, 8, 39, 24, 26, 35, 83, 86),
+(5, 8, 40, 24, 27, 35, 85, 88),
+(5, 8, 41, 25, 27, 36, 87, 90),
+(5, 8, 42, 25, 27, 36, 89, 91),
+(5, 8, 43, 25, 27, 37, 90, 93),
+(5, 8, 44, 25, 28, 37, 92, 95),
+(5, 8, 45, 26, 28, 38, 94, 97),
+(5, 8, 46, 26, 28, 38, 96, 99),
+(5, 8, 47, 26, 29, 39, 98, 101),
+(5, 8, 48, 26, 29, 39, 100, 103),
+(5, 8, 49, 26, 29, 40, 103, 105),
+(5, 8, 50, 27, 30, 40, 105, 107),
+(5, 8, 51, 27, 30, 41, 107, 109),
+(5, 8, 52, 27, 30, 42, 109, 111),
+(5, 8, 53, 27, 31, 42, 111, 113),
+(5, 8, 54, 28, 31, 43, 113, 115),
+(5, 8, 55, 28, 31, 43, 115, 117),
+(5, 8, 56, 28, 32, 44, 117, 119),
+(5, 8, 57, 28, 32, 44, 119, 121),
+(5, 8, 58, 29, 32, 45, 122, 123),
+(5, 8, 59, 29, 33, 45, 124, 126),
+(5, 8, 60, 29, 33, 46, 126, 128),
+(5, 8, 61, 29, 34, 47, 128, 130),
+(5, 8, 62, 30, 34, 47, 131, 132),
+(5, 8, 63, 30, 34, 48, 133, 134),
+(5, 8, 64, 30, 35, 48, 135, 136),
+(5, 8, 65, 31, 35, 49, 137, 139),
+(5, 8, 66, 31, 35, 50, 140, 141),
+(5, 8, 67, 31, 36, 50, 142, 143),
+(5, 8, 68, 31, 36, 51, 144, 145),
+(5, 8, 69, 32, 37, 51, 147, 148),
+(5, 8, 70, 32, 37, 52, 149, 150),
+(5, 8, 71, 32, 37, 53, 152, 153),
+(5, 8, 72, 32, 38, 54, 155, 156),
+(5, 8, 73, 32, 38, 55, 158, 159),
+(5, 8, 74, 33, 39, 55, 161, 161),
+(5, 8, 75, 33, 39, 56, 164, 164),
+(5, 8, 76, 33, 39, 57, 167, 167),
+(5, 8, 77, 34, 40, 58, 170, 170),
+(5, 8, 78, 34, 40, 58, 173, 173),
+(5, 8, 79, 34, 41, 59, 176, 176),
+(5, 8, 80, 35, 41, 60, 179, 179),
+(5, 9, 1, 19, 18, 22, 20, 27),
+(5, 9, 2, 19, 18, 23, 21, 28),
+(5, 9, 3, 20, 19, 23, 22, 29),
+(5, 9, 4, 20, 19, 24, 24, 30),
+(5, 9, 5, 20, 19, 24, 25, 32),
+(5, 9, 6, 20, 20, 25, 26, 33),
+(5, 9, 7, 21, 20, 25, 27, 34),
+(5, 9, 8, 21, 21, 26, 28, 35),
+(5, 9, 9, 21, 21, 26, 30, 36),
+(5, 9, 10, 22, 21, 27, 31, 38),
+(5, 9, 11, 22, 22, 28, 32, 39),
+(5, 9, 12, 22, 22, 28, 34, 40),
+(5, 9, 13, 23, 23, 29, 35, 41),
+(5, 9, 14, 23, 23, 30, 36, 43),
+(5, 9, 15, 23, 24, 30, 37, 44),
+(5, 9, 16, 24, 24, 31, 39, 45),
+(5, 9, 17, 24, 24, 31, 40, 47),
+(5, 9, 18, 24, 25, 32, 42, 48),
+(5, 9, 19, 25, 25, 33, 43, 49),
+(5, 9, 20, 25, 26, 33, 44, 51),
+(5, 9, 21, 26, 26, 34, 46, 52),
+(5, 9, 22, 26, 27, 35, 47, 53),
+(5, 9, 23, 26, 27, 36, 49, 55),
+(5, 9, 24, 27, 28, 36, 50, 56),
+(5, 9, 25, 27, 28, 37, 52, 58),
+(5, 9, 26, 27, 29, 38, 53, 59),
+(5, 9, 27, 28, 29, 38, 55, 60),
+(5, 9, 28, 28, 30, 39, 56, 62),
+(5, 9, 29, 29, 30, 40, 58, 63),
+(5, 9, 30, 29, 31, 41, 59, 65),
+(5, 9, 31, 30, 31, 41, 61, 66),
+(5, 9, 32, 30, 32, 42, 62, 68),
+(5, 9, 33, 30, 32, 43, 64, 69),
+(5, 9, 34, 31, 33, 44, 65, 71),
+(5, 9, 35, 31, 33, 45, 67, 73),
+(5, 9, 36, 32, 34, 45, 69, 74),
+(5, 9, 37, 32, 34, 46, 70, 76),
+(5, 9, 38, 33, 35, 47, 72, 77),
+(5, 9, 39, 33, 36, 48, 73, 79),
+(5, 9, 40, 34, 36, 49, 75, 81),
+(5, 9, 41, 34, 37, 49, 77, 82),
+(5, 9, 42, 35, 37, 50, 78, 84),
+(5, 9, 43, 35, 38, 51, 80, 86),
+(5, 9, 44, 36, 39, 52, 82, 87),
+(5, 9, 45, 36, 39, 53, 84, 89),
+(5, 9, 46, 37, 40, 54, 85, 91),
+(5, 9, 47, 37, 40, 55, 87, 92),
+(5, 9, 48, 38, 41, 55, 89, 94),
+(5, 9, 49, 38, 42, 56, 91, 96),
+(5, 9, 50, 39, 42, 57, 92, 98),
+(5, 9, 51, 39, 43, 58, 94, 100),
+(5, 9, 52, 40, 44, 59, 96, 101),
+(5, 9, 53, 40, 44, 60, 98, 103),
+(5, 9, 54, 41, 45, 61, 100, 105),
+(5, 9, 55, 41, 45, 62, 102, 107),
+(5, 9, 56, 42, 46, 63, 103, 109),
+(5, 9, 57, 42, 47, 64, 105, 111),
+(5, 9, 58, 43, 47, 65, 107, 112),
+(5, 9, 59, 43, 48, 66, 109, 114),
+(5, 9, 60, 44, 49, 67, 111, 116),
+(5, 9, 61, 45, 50, 68, 113, 118),
+(5, 9, 62, 45, 50, 69, 115, 120),
+(5, 9, 63, 46, 51, 70, 117, 122),
+(5, 9, 64, 46, 52, 71, 119, 124),
+(5, 9, 65, 47, 52, 72, 121, 126),
+(5, 9, 66, 48, 53, 73, 123, 128),
+(5, 9, 67, 48, 54, 74, 125, 130),
+(5, 9, 68, 49, 55, 75, 127, 132),
+(5, 9, 69, 49, 55, 76, 129, 134),
+(5, 9, 70, 50, 56, 77, 131, 136),
+(5, 9, 71, 51, 57, 86, 135, 147),
+(5, 9, 72, 52, 57, 88, 136, 149),
+(5, 9, 73, 53, 58, 89, 138, 152),
+(5, 9, 74, 53, 59, 90, 141, 155),
+(5, 9, 75, 54, 60, 92, 143, 157),
+(5, 9, 76, 55, 61, 93, 146, 160),
+(5, 9, 77, 56, 62, 94, 149, 163),
+(5, 9, 78, 56, 63, 96, 151, 166),
+(5, 9, 79, 57, 64, 97, 154, 169),
+(5, 9, 80, 58, 65, 99, 157, 171),
+(6, 1, 1, 28, 15, 24, 15, 22),
+(6, 1, 2, 29, 16, 25, 15, 22),
+(6, 1, 3, 31, 17, 26, 15, 23),
+(6, 1, 4, 32, 17, 27, 15, 23),
+(6, 1, 5, 33, 18, 29, 15, 23),
+(6, 1, 6, 34, 19, 30, 15, 23),
+(6, 1, 7, 36, 20, 31, 16, 24),
+(6, 1, 8, 37, 21, 32, 16, 24),
+(6, 1, 9, 38, 22, 34, 16, 24),
+(6, 1, 10, 40, 22, 35, 16, 25),
+(6, 1, 11, 41, 23, 36, 16, 25),
+(6, 1, 12, 43, 24, 37, 16, 25),
+(6, 1, 13, 44, 25, 39, 16, 26),
+(6, 1, 14, 46, 26, 40, 16, 26),
+(6, 1, 15, 47, 27, 41, 17, 26),
+(6, 1, 16, 48, 28, 43, 17, 27),
+(6, 1, 17, 50, 29, 44, 17, 27),
+(6, 1, 18, 51, 30, 45, 17, 27),
+(6, 1, 19, 53, 31, 47, 17, 28),
+(6, 1, 20, 54, 32, 48, 17, 28),
+(6, 1, 21, 56, 33, 50, 17, 28),
+(6, 1, 22, 58, 34, 51, 18, 29),
+(6, 1, 23, 59, 35, 52, 18, 29),
+(6, 1, 24, 61, 36, 54, 18, 30),
+(6, 1, 25, 62, 37, 55, 18, 30),
+(6, 1, 26, 64, 38, 57, 18, 30),
+(6, 1, 27, 66, 39, 58, 18, 31),
+(6, 1, 28, 67, 40, 60, 18, 31),
+(6, 1, 29, 69, 41, 61, 19, 32),
+(6, 1, 30, 71, 42, 63, 19, 32),
+(6, 1, 31, 72, 43, 64, 19, 32),
+(6, 1, 32, 74, 44, 66, 19, 33),
+(6, 1, 33, 76, 45, 67, 19, 33),
+(6, 1, 34, 77, 46, 69, 20, 34),
+(6, 1, 35, 79, 47, 71, 20, 34),
+(6, 1, 36, 81, 48, 72, 20, 35),
+(6, 1, 37, 83, 49, 74, 20, 35),
+(6, 1, 38, 85, 50, 76, 20, 35),
+(6, 1, 39, 86, 51, 77, 21, 36),
+(6, 1, 40, 88, 53, 79, 21, 36),
+(6, 1, 41, 90, 54, 81, 21, 37),
+(6, 1, 42, 92, 55, 82, 21, 37),
+(6, 1, 43, 94, 56, 84, 21, 38),
+(6, 1, 44, 96, 57, 86, 22, 38),
+(6, 1, 45, 98, 58, 87, 22, 39),
+(6, 1, 46, 99, 60, 89, 22, 39),
+(6, 1, 47, 101, 61, 91, 22, 40),
+(6, 1, 48, 103, 62, 93, 22, 40),
+(6, 1, 49, 105, 63, 94, 23, 41),
+(6, 1, 50, 107, 65, 96, 23, 41),
+(6, 1, 51, 109, 66, 98, 23, 42),
+(6, 1, 52, 111, 67, 100, 23, 42),
+(6, 1, 53, 113, 68, 102, 24, 43),
+(6, 1, 54, 115, 70, 104, 24, 44),
+(6, 1, 55, 117, 71, 105, 24, 44),
+(6, 1, 56, 119, 72, 107, 24, 45),
+(6, 1, 57, 122, 73, 109, 25, 45),
+(6, 1, 58, 124, 75, 111, 25, 46),
+(6, 1, 59, 126, 76, 113, 25, 46),
+(6, 1, 60, 128, 77, 115, 25, 47),
+(6, 1, 61, 130, 79, 117, 26, 48),
+(6, 1, 62, 132, 80, 119, 26, 48),
+(6, 1, 63, 134, 81, 121, 26, 49),
+(6, 1, 64, 137, 83, 123, 26, 49),
+(6, 1, 65, 139, 84, 125, 27, 50),
+(6, 1, 66, 141, 85, 127, 27, 51),
+(6, 1, 67, 143, 87, 129, 27, 51),
+(6, 1, 68, 145, 88, 131, 27, 52),
+(6, 1, 69, 148, 90, 133, 28, 52),
+(6, 1, 70, 150, 91, 135, 28, 53),
+(6, 1, 71, 153, 92, 137, 28, 54),
+(6, 1, 72, 155, 94, 140, 28, 55),
+(6, 1, 73, 158, 96, 142, 28, 56),
+(6, 1, 74, 161, 97, 145, 29, 56),
+(6, 1, 75, 164, 99, 147, 29, 57),
+(6, 1, 76, 167, 101, 150, 29, 58),
+(6, 1, 77, 170, 103, 153, 30, 59),
+(6, 1, 78, 173, 104, 155, 30, 59),
+(6, 1, 79, 176, 106, 164, 30, 60),
+(6, 1, 80, 179, 108, 170, 31, 61),
+(6, 3, 1, 25, 18, 23, 15, 23),
+(6, 3, 2, 25, 19, 24, 16, 24),
+(6, 3, 3, 26, 21, 25, 16, 24),
+(6, 3, 4, 26, 22, 26, 17, 25),
+(6, 3, 5, 27, 24, 27, 17, 25),
+(6, 3, 6, 27, 25, 28, 18, 26),
+(6, 3, 7, 28, 26, 28, 19, 27),
+(6, 3, 8, 28, 28, 29, 19, 27),
+(6, 3, 9, 28, 29, 30, 20, 28),
+(6, 3, 10, 29, 31, 31, 20, 29),
+(6, 3, 11, 29, 32, 32, 21, 29),
+(6, 3, 12, 30, 34, 33, 22, 30),
+(6, 3, 13, 30, 35, 34, 22, 31),
+(6, 3, 14, 31, 37, 35, 23, 32),
+(6, 3, 15, 31, 38, 36, 24, 32),
+(6, 3, 16, 32, 40, 37, 24, 33),
+(6, 3, 17, 32, 41, 39, 25, 34),
+(6, 3, 18, 33, 43, 40, 26, 35),
+(6, 3, 19, 33, 45, 41, 27, 35),
+(6, 3, 20, 34, 46, 42, 27, 36),
+(6, 3, 21, 34, 48, 43, 28, 37),
+(6, 3, 22, 35, 50, 44, 29, 38),
+(6, 3, 23, 35, 51, 45, 29, 38),
+(6, 3, 24, 36, 53, 46, 30, 39),
+(6, 3, 25, 37, 55, 47, 31, 40),
+(6, 3, 26, 37, 56, 48, 32, 41),
+(6, 3, 27, 38, 58, 50, 32, 42),
+(6, 3, 28, 38, 60, 51, 33, 42),
+(6, 3, 29, 39, 62, 52, 34, 43),
+(6, 3, 30, 39, 63, 53, 35, 44),
+(6, 3, 31, 40, 65, 54, 36, 45),
+(6, 3, 32, 41, 67, 56, 36, 46),
+(6, 3, 33, 41, 69, 57, 37, 47),
+(6, 3, 34, 42, 71, 58, 38, 48),
+(6, 3, 35, 43, 72, 59, 39, 48),
+(6, 3, 36, 43, 74, 61, 40, 49),
+(6, 3, 37, 44, 76, 62, 40, 50),
+(6, 3, 38, 45, 78, 63, 41, 51),
+(6, 3, 39, 45, 80, 64, 42, 52),
+(6, 3, 40, 46, 82, 66, 43, 53),
+(6, 3, 41, 47, 84, 67, 44, 54),
+(6, 3, 42, 47, 86, 68, 45, 55),
+(6, 3, 43, 48, 88, 70, 46, 56),
+(6, 3, 44, 49, 90, 71, 46, 57),
+(6, 3, 45, 49, 92, 72, 47, 58),
+(6, 3, 46, 50, 94, 74, 48, 59),
+(6, 3, 47, 51, 96, 75, 49, 60),
+(6, 3, 48, 51, 98, 77, 50, 61),
+(6, 3, 49, 52, 100, 78, 51, 62),
+(6, 3, 50, 53, 102, 79, 52, 63),
+(6, 3, 51, 54, 104, 81, 53, 64),
+(6, 3, 52, 54, 106, 82, 54, 65),
+(6, 3, 53, 55, 108, 84, 55, 66),
+(6, 3, 54, 56, 110, 85, 56, 67),
+(6, 3, 55, 57, 112, 87, 57, 68),
+(6, 3, 56, 57, 114, 88, 58, 69),
+(6, 3, 57, 58, 117, 90, 59, 70),
+(6, 3, 58, 59, 119, 91, 60, 71),
+(6, 3, 59, 60, 121, 93, 61, 72),
+(6, 3, 60, 61, 123, 94, 62, 74),
+(6, 3, 61, 61, 125, 96, 63, 75),
+(6, 3, 62, 62, 128, 97, 64, 76),
+(6, 3, 63, 63, 130, 99, 65, 77),
+(6, 3, 64, 64, 132, 100, 66, 78),
+(6, 3, 65, 65, 134, 102, 67, 79),
+(6, 3, 66, 66, 137, 104, 68, 80),
+(6, 3, 67, 66, 139, 105, 69, 81),
+(6, 3, 68, 67, 141, 107, 70, 83),
+(6, 3, 69, 68, 144, 108, 71, 84),
+(6, 3, 70, 69, 146, 110, 72, 85),
+(6, 3, 71, 70, 149, 112, 73, 86),
+(6, 3, 72, 71, 152, 114, 74, 87),
+(6, 3, 73, 72, 155, 116, 75, 89),
+(6, 3, 74, 73, 158, 118, 77, 90),
+(6, 3, 75, 74, 161, 120, 78, 92),
+(6, 3, 76, 75, 164, 122, 79, 93),
+(6, 3, 77, 76, 167, 124, 81, 95),
+(6, 3, 78, 77, 176, 126, 85, 96),
+(6, 3, 79, 78, 179, 128, 86, 98),
+(6, 3, 80, 79, 183, 130, 88, 99),
+(6, 6, 1, 28, 15, 24, 15, 22),
+(6, 6, 2, 29, 16, 25, 15, 22),
+(6, 6, 3, 31, 17, 26, 15, 23),
+(6, 6, 4, 32, 17, 27, 15, 23),
+(6, 6, 5, 33, 18, 29, 15, 23),
+(6, 6, 6, 34, 19, 30, 15, 23),
+(6, 6, 7, 36, 20, 31, 16, 24),
+(6, 6, 8, 37, 21, 32, 16, 24),
+(6, 6, 9, 38, 22, 34, 16, 24),
+(6, 6, 10, 40, 22, 35, 16, 25),
+(6, 6, 11, 41, 23, 36, 16, 25),
+(6, 6, 12, 43, 24, 37, 16, 25),
+(6, 6, 13, 44, 25, 39, 16, 26),
+(6, 6, 14, 46, 26, 40, 16, 26),
+(6, 6, 15, 47, 27, 41, 17, 26),
+(6, 6, 16, 48, 28, 43, 17, 27),
+(6, 6, 17, 50, 29, 44, 17, 27),
+(6, 6, 18, 51, 30, 45, 17, 27),
+(6, 6, 19, 53, 31, 47, 17, 28),
+(6, 6, 20, 54, 32, 48, 17, 28),
+(6, 6, 21, 56, 33, 50, 17, 28),
+(6, 6, 22, 58, 34, 51, 18, 29),
+(6, 6, 23, 59, 35, 52, 18, 29),
+(6, 6, 24, 61, 36, 54, 18, 30),
+(6, 6, 25, 62, 37, 55, 18, 30),
+(6, 6, 26, 64, 38, 57, 18, 30),
+(6, 6, 27, 66, 39, 58, 18, 31),
+(6, 6, 28, 67, 40, 60, 18, 31),
+(6, 6, 29, 69, 41, 61, 19, 32),
+(6, 6, 30, 71, 42, 63, 19, 32),
+(6, 6, 31, 72, 43, 64, 19, 32),
+(6, 6, 32, 74, 44, 66, 19, 33),
+(6, 6, 33, 76, 45, 67, 19, 33),
+(6, 6, 34, 77, 46, 69, 20, 34),
+(6, 6, 35, 79, 47, 71, 20, 34),
+(6, 6, 36, 81, 48, 72, 20, 35),
+(6, 6, 37, 83, 49, 74, 20, 35),
+(6, 6, 38, 85, 50, 76, 20, 35),
+(6, 6, 39, 86, 51, 77, 21, 36),
+(6, 6, 40, 88, 53, 79, 21, 36),
+(6, 6, 41, 90, 54, 81, 21, 37),
+(6, 6, 42, 92, 55, 82, 21, 37),
+(6, 6, 43, 94, 56, 84, 21, 38),
+(6, 6, 44, 96, 57, 86, 22, 38),
+(6, 6, 45, 98, 58, 87, 22, 39),
+(6, 6, 46, 99, 60, 89, 22, 39),
+(6, 6, 47, 101, 60, 91, 22, 40),
+(6, 6, 48, 103, 61, 93, 22, 40),
+(6, 6, 49, 105, 62, 94, 23, 41),
+(6, 6, 50, 107, 63, 96, 23, 41),
+(6, 6, 51, 109, 64, 97, 23, 42),
+(6, 6, 52, 110, 65, 98, 23, 42),
+(6, 6, 53, 111, 66, 99, 24, 43),
+(6, 6, 54, 112, 67, 100, 24, 44),
+(6, 6, 55, 113, 68, 101, 24, 44),
+(6, 6, 56, 116, 70, 104, 24, 45),
+(6, 6, 57, 121, 71, 106, 24, 45),
+(6, 6, 58, 123, 72, 108, 25, 46),
+(6, 6, 59, 123, 74, 110, 25, 46),
+(6, 6, 60, 125, 75, 112, 25, 47),
+(6, 6, 61, 127, 76, 114, 25, 48),
+(6, 6, 62, 133, 78, 116, 25, 48),
+(6, 6, 63, 135, 79, 119, 26, 49),
+(6, 6, 64, 139, 81, 121, 26, 49),
+(6, 6, 65, 142, 82, 123, 26, 50),
+(6, 6, 66, 146, 84, 126, 26, 51),
+(6, 6, 67, 150, 85, 132, 27, 51),
+(6, 6, 68, 153, 87, 137, 27, 52),
+(6, 6, 69, 157, 88, 140, 27, 53),
+(6, 6, 70, 160, 90, 143, 27, 53),
+(6, 6, 71, 163, 92, 146, 28, 54),
+(6, 6, 72, 165, 93, 148, 28, 55),
+(6, 6, 73, 167, 95, 150, 28, 56),
+(6, 6, 74, 171, 97, 153, 28, 56),
+(6, 6, 75, 174, 98, 156, 29, 57),
+(6, 6, 76, 178, 100, 156, 29, 58),
+(6, 6, 77, 179, 102, 156, 29, 59),
+(6, 6, 78, 179, 103, 156, 29, 59),
+(6, 6, 79, 182, 105, 159, 30, 60),
+(6, 6, 80, 185, 107, 162, 30, 61),
+(6, 7, 1, 26, 15, 23, 16, 24),
+(6, 7, 2, 27, 15, 24, 17, 25),
+(6, 7, 3, 28, 16, 25, 18, 26),
+(6, 7, 4, 28, 16, 26, 19, 27),
+(6, 7, 5, 29, 17, 27, 20, 28),
+(6, 7, 6, 30, 17, 28, 21, 29),
+(6, 7, 7, 31, 18, 29, 22, 30),
+(6, 7, 8, 32, 18, 30, 23, 31),
+(6, 7, 9, 33, 19, 31, 24, 32),
+(6, 7, 10, 34, 19, 32, 25, 33),
+(6, 7, 11, 35, 20, 33, 26, 35),
+(6, 7, 12, 35, 20, 34, 27, 36),
+(6, 7, 13, 36, 21, 35, 28, 37),
+(6, 7, 14, 37, 21, 36, 29, 38),
+(6, 7, 15, 38, 22, 37, 30, 39),
+(6, 7, 16, 39, 22, 39, 31, 40),
+(6, 7, 17, 40, 23, 40, 32, 42),
+(6, 7, 18, 41, 23, 41, 33, 43),
+(6, 7, 19, 42, 24, 42, 34, 44),
+(6, 7, 20, 43, 24, 43, 35, 45),
+(6, 7, 21, 44, 25, 44, 36, 46),
+(6, 7, 22, 45, 25, 45, 37, 48),
+(6, 7, 23, 46, 26, 47, 38, 49),
+(6, 7, 24, 47, 27, 48, 40, 50),
+(6, 7, 25, 48, 27, 49, 41, 51),
+(6, 7, 26, 49, 28, 50, 42, 53),
+(6, 7, 27, 51, 28, 52, 43, 54),
+(6, 7, 28, 52, 29, 53, 44, 55),
+(6, 7, 29, 53, 29, 54, 45, 57),
+(6, 7, 30, 54, 30, 55, 47, 58),
+(6, 7, 31, 55, 31, 57, 48, 59),
+(6, 7, 32, 56, 31, 58, 49, 61),
+(6, 7, 33, 57, 32, 59, 50, 62),
+(6, 7, 34, 58, 33, 61, 51, 64),
+(6, 7, 35, 60, 33, 62, 53, 65),
+(6, 7, 36, 61, 34, 63, 54, 66),
+(6, 7, 37, 62, 34, 65, 55, 68),
+(6, 7, 38, 63, 35, 66, 57, 69),
+(6, 7, 39, 64, 36, 67, 58, 71),
+(6, 7, 40, 66, 36, 69, 59, 72),
+(6, 7, 41, 67, 37, 70, 60, 74),
+(6, 7, 42, 68, 38, 72, 62, 75),
+(6, 7, 43, 69, 38, 73, 63, 77),
+(6, 7, 44, 70, 39, 74, 64, 78),
+(6, 7, 45, 72, 40, 76, 66, 80),
+(6, 7, 46, 73, 41, 77, 67, 81),
+(6, 7, 47, 74, 41, 79, 69, 83),
+(6, 7, 48, 76, 42, 80, 70, 84),
+(6, 7, 49, 77, 43, 82, 71, 86),
+(6, 7, 50, 78, 43, 83, 73, 88),
+(6, 7, 51, 80, 44, 85, 74, 89),
+(6, 7, 52, 81, 45, 86, 76, 91),
+(6, 7, 53, 82, 46, 88, 77, 92),
+(6, 7, 54, 84, 46, 90, 78, 94),
+(6, 7, 55, 85, 47, 91, 80, 96),
+(6, 7, 56, 86, 48, 93, 81, 97),
+(6, 7, 57, 88, 49, 94, 83, 99),
+(6, 7, 58, 89, 49, 96, 84, 101),
+(6, 7, 59, 91, 50, 97, 86, 102),
+(6, 7, 60, 92, 51, 99, 87, 104),
+(6, 7, 61, 94, 52, 101, 89, 106),
+(6, 7, 62, 95, 52, 102, 90, 108),
+(6, 7, 63, 96, 53, 104, 92, 109),
+(6, 7, 64, 98, 54, 106, 93, 111),
+(6, 7, 65, 99, 55, 107, 95, 113),
+(6, 7, 66, 101, 56, 109, 97, 115),
+(6, 7, 67, 102, 57, 111, 98, 117),
+(6, 7, 68, 104, 57, 113, 100, 118),
+(6, 7, 69, 105, 58, 114, 101, 120),
+(6, 7, 70, 107, 59, 116, 103, 122),
+(6, 7, 71, 108, 60, 118, 113, 124),
+(6, 7, 72, 110, 61, 120, 117, 127),
+(6, 7, 73, 112, 62, 122, 119, 129),
+(6, 7, 74, 114, 63, 125, 122, 131),
+(6, 7, 75, 116, 64, 127, 124, 133),
+(6, 7, 76, 118, 65, 129, 126, 136),
+(6, 7, 77, 119, 66, 131, 128, 138),
+(6, 7, 78, 121, 67, 133, 130, 140),
+(6, 7, 79, 123, 68, 136, 133, 143),
+(6, 7, 80, 125, 69, 138, 135, 145),
+(6, 11, 1, 26, 15, 22, 17, 24),
+(6, 11, 2, 27, 16, 23, 18, 25),
+(6, 11, 3, 27, 16, 23, 19, 26),
+(6, 11, 4, 28, 17, 24, 20, 27),
+(6, 11, 5, 28, 17, 25, 21, 29),
+(6, 11, 6, 29, 18, 25, 22, 30),
+(6, 11, 7, 29, 18, 26, 23, 31),
+(6, 11, 8, 30, 19, 27, 24, 32),
+(6, 11, 9, 30, 19, 27, 26, 34),
+(6, 11, 10, 31, 20, 28, 27, 35),
+(6, 11, 11, 32, 20, 29, 28, 36),
+(6, 11, 12, 32, 21, 29, 29, 37),
+(6, 11, 13, 33, 21, 30, 30, 39),
+(6, 11, 14, 33, 22, 31, 31, 40),
+(6, 11, 15, 34, 23, 32, 32, 41),
+(6, 11, 16, 35, 23, 32, 34, 43),
+(6, 11, 17, 35, 24, 33, 35, 44),
+(6, 11, 18, 36, 24, 34, 36, 45),
+(6, 11, 19, 37, 25, 35, 37, 47),
+(6, 11, 20, 37, 26, 35, 39, 48),
+(6, 11, 21, 38, 26, 36, 40, 50),
+(6, 11, 22, 39, 27, 37, 41, 51),
+(6, 11, 23, 39, 28, 38, 42, 52),
+(6, 11, 24, 40, 28, 39, 44, 54),
+(6, 11, 25, 41, 29, 39, 45, 55),
+(6, 11, 26, 41, 30, 40, 46, 57),
+(6, 11, 27, 42, 30, 41, 47, 58),
+(6, 11, 28, 43, 31, 42, 49, 60),
+(6, 11, 29, 44, 32, 43, 50, 61),
+(6, 11, 30, 44, 32, 44, 52, 63),
+(6, 11, 31, 45, 33, 44, 53, 64),
+(6, 11, 32, 46, 34, 45, 54, 66),
+(6, 11, 33, 47, 34, 46, 56, 67),
+(6, 11, 34, 47, 35, 47, 57, 69),
+(6, 11, 35, 48, 36, 48, 58, 71),
+(6, 11, 36, 49, 36, 49, 60, 72),
+(6, 11, 37, 50, 37, 50, 61, 74),
+(6, 11, 38, 51, 38, 51, 63, 76),
+(6, 11, 39, 52, 39, 52, 64, 77),
+(6, 11, 40, 52, 39, 53, 66, 79),
+(6, 11, 41, 53, 40, 54, 67, 81),
+(6, 11, 42, 54, 41, 55, 69, 82),
+(6, 11, 43, 55, 42, 56, 70, 84),
+(6, 11, 44, 56, 43, 57, 72, 86),
+(6, 11, 45, 57, 43, 57, 73, 87),
+(6, 11, 46, 57, 44, 58, 75, 89),
+(6, 11, 47, 58, 45, 60, 76, 91),
+(6, 11, 48, 59, 46, 61, 78, 93),
+(6, 11, 49, 60, 47, 62, 79, 94),
+(6, 11, 50, 61, 47, 63, 81, 96),
+(6, 11, 51, 62, 48, 64, 83, 98),
+(6, 11, 52, 63, 49, 65, 84, 100),
+(6, 11, 53, 64, 50, 66, 86, 102),
+(6, 11, 54, 65, 51, 67, 87, 104),
+(6, 11, 55, 66, 51, 68, 89, 105),
+(6, 11, 56, 67, 52, 69, 91, 107),
+(6, 11, 57, 68, 53, 70, 92, 109),
+(6, 11, 58, 69, 54, 71, 94, 111),
+(6, 11, 59, 70, 55, 72, 96, 113),
+(6, 11, 60, 71, 56, 73, 97, 115),
+(6, 11, 61, 72, 57, 74, 99, 117),
+(6, 11, 62, 73, 58, 76, 101, 119),
+(6, 11, 63, 74, 59, 77, 103, 121),
+(6, 11, 64, 75, 59, 78, 104, 123),
+(6, 11, 65, 76, 60, 79, 106, 125),
+(6, 11, 66, 77, 61, 80, 108, 127),
+(6, 11, 67, 78, 62, 81, 110, 129),
+(6, 11, 68, 79, 63, 83, 111, 131),
+(6, 11, 69, 80, 64, 84, 113, 133),
+(6, 11, 70, 81, 65, 85, 115, 135),
+(6, 11, 71, 83, 66, 86, 117, 137),
+(6, 11, 72, 84, 68, 88, 120, 140),
+(6, 11, 73, 85, 69, 89, 122, 142),
+(6, 11, 74, 86, 70, 91, 124, 145),
+(6, 11, 75, 88, 71, 92, 126, 147),
+(6, 11, 76, 89, 72, 94, 128, 150),
+(6, 11, 77, 90, 73, 95, 131, 153),
+(6, 11, 78, 92, 75, 97, 133, 155),
+(6, 11, 79, 93, 76, 98, 136, 158),
+(6, 11, 80, 94, 77, 100, 138, 185),
+(7, 1, 1, 18, 23, 21, 24, 20),
+(7, 1, 2, 19, 24, 22, 24, 20),
+(7, 1, 3, 21, 25, 23, 24, 21),
+(7, 1, 4, 22, 25, 25, 24, 21),
+(7, 1, 5, 23, 26, 26, 24, 21),
+(7, 1, 6, 25, 27, 27, 24, 21),
+(7, 1, 7, 26, 28, 28, 24, 22),
+(7, 1, 8, 27, 29, 29, 25, 22),
+(7, 1, 9, 29, 29, 31, 25, 22),
+(7, 1, 10, 30, 30, 32, 25, 23),
+(7, 1, 11, 32, 31, 33, 25, 23),
+(7, 1, 12, 33, 32, 34, 25, 23),
+(7, 1, 13, 34, 33, 36, 25, 24),
+(7, 1, 14, 36, 34, 37, 25, 24),
+(7, 1, 15, 37, 35, 38, 25, 24),
+(7, 1, 16, 39, 36, 40, 25, 25),
+(7, 1, 17, 40, 36, 41, 25, 25),
+(7, 1, 18, 42, 37, 43, 26, 25),
+(7, 1, 19, 43, 38, 44, 26, 26),
+(7, 1, 20, 45, 39, 45, 26, 26),
+(7, 1, 21, 47, 40, 47, 26, 26),
+(7, 1, 22, 48, 41, 48, 26, 27),
+(7, 1, 23, 50, 42, 50, 26, 27),
+(7, 1, 24, 51, 43, 51, 26, 28),
+(7, 1, 25, 53, 44, 52, 27, 28),
+(7, 1, 26, 55, 45, 54, 27, 28),
+(7, 1, 27, 56, 46, 55, 27, 29),
+(7, 1, 28, 58, 47, 57, 27, 29),
+(7, 1, 29, 59, 48, 58, 27, 30),
+(7, 1, 30, 61, 49, 60, 27, 30),
+(7, 1, 31, 63, 50, 62, 27, 30),
+(7, 1, 32, 65, 51, 63, 28, 31),
+(7, 1, 33, 66, 52, 65, 28, 31),
+(7, 1, 34, 68, 53, 66, 28, 32),
+(7, 1, 35, 70, 55, 68, 28, 32),
+(7, 1, 36, 72, 56, 69, 28, 33),
+(7, 1, 37, 73, 57, 71, 29, 33),
+(7, 1, 38, 75, 58, 73, 29, 34),
+(7, 1, 39, 77, 59, 74, 29, 34),
+(7, 1, 40, 79, 60, 76, 29, 35),
+(7, 1, 41, 81, 61, 78, 29, 35),
+(7, 1, 42, 82, 62, 79, 30, 35),
+(7, 1, 43, 84, 64, 81, 30, 36),
+(7, 1, 44, 86, 65, 83, 30, 36),
+(7, 1, 45, 88, 66, 85, 30, 37),
+(7, 1, 46, 90, 67, 86, 30, 37),
+(7, 1, 47, 92, 68, 88, 31, 38),
+(7, 1, 48, 94, 70, 90, 31, 38),
+(7, 1, 49, 96, 71, 92, 31, 39),
+(7, 1, 50, 98, 72, 93, 31, 40),
+(7, 1, 51, 100, 73, 95, 32, 40),
+(7, 1, 52, 102, 75, 97, 32, 41),
+(7, 1, 53, 104, 76, 99, 32, 41),
+(7, 1, 54, 106, 77, 101, 32, 42),
+(7, 1, 55, 108, 78, 103, 33, 42),
+(7, 1, 56, 110, 80, 104, 33, 43),
+(7, 1, 57, 112, 81, 106, 33, 43),
+(7, 1, 58, 114, 82, 108, 33, 44),
+(7, 1, 59, 116, 84, 110, 34, 44),
+(7, 1, 60, 118, 85, 112, 34, 45),
+(7, 1, 61, 120, 86, 114, 34, 46),
+(7, 1, 62, 122, 88, 116, 35, 46),
+(7, 1, 63, 125, 89, 118, 35, 47),
+(7, 1, 64, 127, 91, 120, 35, 47),
+(7, 1, 65, 129, 92, 122, 35, 48),
+(7, 1, 66, 131, 93, 124, 36, 49),
+(7, 1, 67, 133, 95, 126, 36, 49),
+(7, 1, 68, 136, 96, 128, 36, 50),
+(7, 1, 69, 138, 98, 130, 37, 50),
+(7, 1, 70, 140, 99, 132, 37, 51),
+(7, 1, 71, 143, 100, 134, 37, 52),
+(7, 1, 72, 145, 102, 137, 37, 53),
+(7, 1, 73, 148, 104, 139, 37, 54),
+(7, 1, 74, 151, 105, 142, 38, 54),
+(7, 1, 75, 154, 107, 144, 38, 55),
+(7, 1, 76, 157, 109, 147, 38, 56),
+(7, 1, 77, 163, 111, 153, 39, 57),
+(7, 1, 78, 169, 112, 158, 39, 57),
+(7, 1, 79, 172, 114, 161, 39, 58),
+(7, 1, 80, 175, 116, 164, 40, 59),
+(7, 4, 1, 16, 26, 20, 24, 20),
+(7, 4, 2, 17, 27, 21, 24, 20),
+(7, 4, 3, 18, 29, 21, 24, 21),
+(7, 4, 4, 18, 30, 22, 24, 21),
+(7, 4, 5, 19, 32, 23, 25, 21),
+(7, 4, 6, 20, 33, 24, 25, 22),
+(7, 4, 7, 21, 35, 24, 25, 22),
+(7, 4, 8, 22, 36, 25, 25, 23),
+(7, 4, 9, 22, 38, 26, 25, 23),
+(7, 4, 10, 23, 39, 26, 25, 23),
+(7, 4, 11, 24, 41, 27, 25, 24),
+(7, 4, 12, 25, 42, 28, 26, 24),
+(7, 4, 13, 26, 44, 29, 26, 25),
+(7, 4, 14, 27, 46, 30, 26, 25),
+(7, 4, 15, 28, 47, 30, 26, 25),
+(7, 4, 16, 28, 49, 31, 26, 26),
+(7, 4, 17, 29, 50, 32, 27, 26),
+(7, 4, 18, 30, 52, 33, 27, 27),
+(7, 4, 19, 31, 54, 34, 27, 27),
+(7, 4, 20, 32, 56, 35, 27, 28),
+(7, 4, 21, 33, 57, 35, 27, 28),
+(7, 4, 22, 34, 59, 36, 28, 29),
+(7, 4, 23, 35, 61, 37, 28, 29),
+(7, 4, 24, 36, 62, 38, 28, 30),
+(7, 4, 25, 37, 64, 39, 28, 30),
+(7, 4, 26, 38, 66, 40, 29, 31),
+(7, 4, 27, 39, 68, 41, 29, 31),
+(7, 4, 28, 40, 70, 42, 29, 32),
+(7, 4, 29, 41, 72, 43, 29, 32),
+(7, 4, 30, 42, 73, 43, 29, 33),
+(7, 4, 31, 43, 75, 44, 30, 33),
+(7, 4, 32, 44, 77, 45, 30, 34),
+(7, 4, 33, 45, 79, 46, 30, 34),
+(7, 4, 34, 46, 81, 47, 31, 35),
+(7, 4, 35, 47, 83, 48, 31, 35),
+(7, 4, 36, 48, 85, 49, 31, 36),
+(7, 4, 37, 49, 87, 50, 31, 36),
+(7, 4, 38, 50, 89, 51, 32, 37),
+(7, 4, 39, 51, 91, 52, 32, 38),
+(7, 4, 40, 53, 93, 53, 32, 38),
+(7, 4, 41, 54, 95, 54, 33, 39),
+(7, 4, 42, 55, 97, 55, 33, 39),
+(7, 4, 43, 56, 99, 56, 33, 40),
+(7, 4, 44, 57, 101, 57, 33, 40),
+(7, 4, 45, 58, 103, 59, 34, 41),
+(7, 4, 46, 59, 105, 60, 34, 42),
+(7, 4, 47, 61, 107, 61, 34, 42),
+(7, 4, 48, 62, 110, 62, 35, 43),
+(7, 4, 49, 63, 112, 63, 35, 44),
+(7, 4, 50, 64, 114, 64, 35, 44),
+(7, 4, 51, 65, 116, 65, 36, 45),
+(7, 4, 52, 67, 118, 66, 36, 45),
+(7, 4, 53, 68, 121, 67, 36, 46),
+(7, 4, 54, 69, 123, 69, 37, 47),
+(7, 4, 55, 70, 125, 70, 37, 47),
+(7, 4, 56, 72, 127, 71, 37, 48),
+(7, 4, 57, 73, 130, 72, 38, 49),
+(7, 4, 58, 74, 132, 73, 38, 49),
+(7, 4, 59, 75, 134, 74, 39, 50),
+(7, 4, 60, 77, 137, 76, 39, 51),
+(7, 4, 61, 78, 139, 77, 39, 51),
+(7, 4, 62, 79, 141, 78, 40, 52),
+(7, 4, 63, 81, 144, 79, 40, 53),
+(7, 4, 64, 82, 146, 80, 41, 54),
+(7, 4, 65, 83, 149, 82, 41, 54),
+(7, 4, 66, 85, 151, 83, 41, 55),
+(7, 4, 67, 86, 154, 84, 42, 56),
+(7, 4, 68, 87, 156, 85, 42, 57),
+(7, 4, 69, 89, 158, 87, 43, 57),
+(7, 4, 70, 90, 161, 88, 43, 58),
+(7, 4, 71, 92, 164, 89, 44, 59),
+(7, 4, 72, 94, 167, 91, 45, 59),
+(7, 4, 73, 95, 170, 93, 45, 60),
+(7, 4, 74, 97, 173, 94, 46, 61),
+(7, 4, 75, 99, 176, 96, 46, 62),
+(7, 4, 76, 100, 179, 97, 46, 63),
+(7, 4, 77, 102, 182, 102, 47, 64),
+(7, 4, 78, 104, 186, 105, 47, 65),
+(7, 4, 79, 106, 189, 106, 48, 66),
+(7, 4, 80, 108, 192, 108, 48, 67),
+(7, 6, 1, 18, 23, 21, 24, 20),
+(7, 6, 2, 19, 24, 22, 24, 20),
+(7, 6, 3, 21, 25, 23, 24, 21),
+(7, 6, 4, 22, 25, 25, 24, 21),
+(7, 6, 5, 23, 26, 26, 24, 21),
+(7, 6, 6, 25, 27, 27, 24, 21),
+(7, 6, 7, 26, 28, 28, 24, 22),
+(7, 6, 8, 27, 29, 29, 25, 22),
+(7, 6, 9, 29, 29, 31, 25, 22),
+(7, 6, 10, 30, 30, 32, 25, 23),
+(7, 6, 11, 32, 31, 33, 25, 23),
+(7, 6, 12, 33, 32, 34, 25, 23),
+(7, 6, 13, 34, 33, 36, 25, 24),
+(7, 6, 14, 36, 34, 37, 25, 24),
+(7, 6, 15, 37, 35, 38, 25, 24),
+(7, 6, 16, 39, 36, 40, 25, 25),
+(7, 6, 17, 40, 36, 41, 25, 25),
+(7, 6, 18, 42, 37, 43, 26, 25),
+(7, 6, 19, 43, 38, 44, 26, 26),
+(7, 6, 20, 45, 39, 45, 26, 26),
+(7, 6, 21, 47, 40, 47, 26, 26),
+(7, 6, 22, 48, 41, 48, 26, 27),
+(7, 6, 23, 50, 42, 50, 26, 27),
+(7, 6, 24, 51, 43, 51, 26, 28),
+(7, 6, 25, 53, 44, 52, 27, 28),
+(7, 6, 26, 55, 45, 54, 27, 28),
+(7, 6, 27, 56, 46, 55, 27, 29),
+(7, 6, 28, 58, 47, 57, 27, 29),
+(7, 6, 29, 59, 48, 58, 27, 30),
+(7, 6, 30, 61, 49, 60, 27, 30),
+(7, 6, 31, 63, 50, 62, 27, 30),
+(7, 6, 32, 65, 51, 63, 28, 31),
+(7, 6, 33, 66, 52, 65, 28, 31),
+(7, 6, 34, 68, 53, 66, 28, 32),
+(7, 6, 35, 70, 55, 68, 28, 32),
+(7, 6, 36, 72, 56, 69, 28, 33),
+(7, 6, 37, 73, 57, 71, 29, 33),
+(7, 6, 38, 75, 58, 73, 29, 34),
+(7, 6, 39, 77, 59, 74, 29, 34),
+(7, 6, 40, 79, 60, 76, 29, 35),
+(7, 6, 41, 81, 61, 78, 29, 35),
+(7, 6, 42, 82, 62, 79, 30, 35),
+(7, 6, 43, 84, 64, 81, 30, 36),
+(7, 6, 44, 86, 65, 83, 30, 36),
+(7, 6, 45, 88, 66, 85, 30, 37),
+(7, 6, 46, 90, 67, 86, 30, 37),
+(7, 6, 47, 92, 68, 88, 31, 38),
+(7, 6, 48, 94, 70, 90, 31, 38),
+(7, 6, 49, 96, 71, 92, 31, 39),
+(7, 6, 50, 98, 72, 93, 31, 40),
+(7, 6, 51, 99, 72, 93, 32, 40),
+(7, 6, 52, 100, 73, 95, 32, 41),
+(7, 6, 53, 101, 74, 96, 32, 41),
+(7, 6, 54, 102, 75, 97, 32, 42),
+(7, 6, 55, 103, 76, 98, 33, 42),
+(7, 6, 56, 106, 78, 101, 33, 43),
+(7, 6, 57, 111, 79, 103, 33, 43),
+(7, 6, 58, 113, 80, 105, 34, 44),
+(7, 6, 59, 116, 82, 107, 34, 44),
+(7, 6, 60, 118, 83, 109, 34, 45),
+(7, 6, 61, 120, 84, 111, 34, 46),
+(7, 6, 62, 127, 86, 119, 34, 46),
+(7, 6, 63, 129, 87, 122, 35, 47),
+(7, 6, 64, 132, 89, 125, 35, 47),
+(7, 6, 65, 135, 90, 127, 35, 48),
+(7, 6, 66, 137, 92, 130, 35, 49),
+(7, 6, 67, 138, 93, 130, 36, 49),
+(7, 6, 68, 140, 95, 131, 36, 50),
+(7, 6, 69, 142, 96, 131, 36, 51),
+(7, 6, 70, 145, 98, 132, 36, 51),
+(7, 6, 71, 148, 100, 135, 37, 52),
+(7, 6, 72, 150, 101, 137, 37, 53),
+(7, 6, 73, 153, 103, 140, 37, 54),
+(7, 6, 74, 154, 105, 142, 37, 54),
+(7, 6, 75, 155, 106, 145, 38, 55),
+(7, 6, 76, 158, 108, 151, 38, 56),
+(7, 6, 77, 161, 110, 157, 38, 57),
+(7, 6, 78, 164, 111, 162, 38, 57),
+(7, 6, 79, 167, 113, 165, 39, 58),
+(7, 6, 80, 170, 115, 168, 39, 59),
+(7, 8, 1, 15, 23, 19, 27, 22),
+(7, 8, 2, 15, 23, 19, 28, 23),
+(7, 8, 3, 15, 23, 20, 30, 25),
+(7, 8, 4, 15, 23, 20, 31, 26),
+(7, 8, 5, 15, 24, 20, 32, 27),
+(7, 8, 6, 15, 24, 20, 34, 29),
+(7, 8, 7, 16, 24, 21, 35, 30),
+(7, 8, 8, 16, 24, 21, 37, 31),
+(7, 8, 9, 16, 24, 21, 38, 33),
+(7, 8, 10, 16, 24, 22, 40, 34),
+(7, 8, 11, 16, 25, 22, 41, 36),
+(7, 8, 12, 16, 25, 22, 42, 37),
+(7, 8, 13, 16, 25, 23, 44, 38),
+(7, 8, 14, 16, 25, 23, 45, 40),
+(7, 8, 15, 17, 25, 23, 47, 41),
+(7, 8, 16, 17, 25, 24, 49, 43),
+(7, 8, 17, 17, 26, 24, 50, 44),
+(7, 8, 18, 17, 26, 24, 52, 46),
+(7, 8, 19, 17, 26, 25, 53, 47),
+(7, 8, 20, 17, 26, 25, 55, 49),
+(7, 8, 21, 17, 26, 26, 57, 51),
+(7, 8, 22, 18, 27, 26, 58, 52),
+(7, 8, 23, 18, 27, 26, 60, 54),
+(7, 8, 24, 18, 27, 27, 61, 55),
+(7, 8, 25, 18, 27, 27, 63, 57),
+(7, 8, 26, 18, 28, 27, 65, 59),
+(7, 8, 27, 18, 28, 28, 67, 60),
+(7, 8, 28, 18, 28, 28, 68, 62),
+(7, 8, 29, 19, 28, 29, 70, 64),
+(7, 8, 30, 19, 29, 29, 72, 65),
+(7, 8, 31, 19, 29, 30, 74, 67),
+(7, 8, 32, 19, 29, 30, 75, 69),
+(7, 8, 33, 19, 29, 30, 77, 70),
+(7, 8, 34, 20, 30, 31, 79, 72),
+(7, 8, 35, 20, 30, 31, 81, 74),
+(7, 8, 36, 20, 30, 32, 83, 76),
+(7, 8, 37, 20, 30, 32, 85, 78),
+(7, 8, 38, 20, 31, 33, 86, 79),
+(7, 8, 39, 21, 31, 33, 88, 81),
+(7, 8, 40, 21, 31, 34, 90, 83),
+(7, 8, 41, 21, 32, 34, 92, 85),
+(7, 8, 42, 21, 32, 35, 94, 87),
+(7, 8, 43, 21, 32, 35, 96, 89),
+(7, 8, 44, 22, 32, 36, 98, 91),
+(7, 8, 45, 22, 33, 36, 100, 92),
+(7, 8, 46, 22, 33, 37, 102, 94),
+(7, 8, 47, 22, 33, 37, 104, 96),
+(7, 8, 48, 22, 34, 38, 106, 98),
+(7, 8, 49, 23, 34, 38, 108, 100),
+(7, 8, 50, 23, 34, 39, 110, 102),
+(7, 8, 51, 23, 35, 39, 112, 104),
+(7, 8, 52, 23, 35, 40, 114, 106),
+(7, 8, 53, 24, 35, 40, 117, 108),
+(7, 8, 54, 24, 36, 41, 119, 110),
+(7, 8, 55, 24, 36, 41, 121, 112),
+(7, 8, 56, 24, 37, 42, 123, 114),
+(7, 8, 57, 25, 37, 42, 125, 117),
+(7, 8, 58, 25, 37, 43, 127, 119),
+(7, 8, 59, 25, 38, 43, 130, 121),
+(7, 8, 60, 25, 38, 44, 132, 123),
+(7, 8, 61, 26, 38, 45, 134, 125),
+(7, 8, 62, 26, 39, 45, 136, 127),
+(7, 8, 63, 26, 39, 46, 139, 129),
+(7, 8, 64, 26, 40, 46, 141, 132),
+(7, 8, 65, 27, 40, 47, 143, 134),
+(7, 8, 66, 27, 40, 48, 146, 136),
+(7, 8, 67, 27, 41, 48, 148, 138),
+(7, 8, 68, 27, 41, 49, 150, 140),
+(7, 8, 69, 28, 42, 49, 153, 143),
+(7, 8, 70, 28, 42, 50, 155, 145),
+(7, 8, 71, 28, 42, 51, 168, 148),
+(7, 8, 72, 28, 43, 52, 168, 151),
+(7, 8, 73, 28, 43, 53, 171, 154),
+(7, 8, 74, 29, 44, 53, 174, 156),
+(7, 8, 75, 29, 44, 54, 177, 159),
+(7, 8, 76, 29, 44, 55, 180, 162),
+(7, 8, 77, 30, 45, 56, 183, 165),
+(7, 8, 78, 30, 45, 56, 186, 168),
+(7, 8, 79, 30, 46, 57, 190, 171),
+(7, 8, 80, 31, 46, 58, 193, 174),
+(7, 9, 1, 15, 23, 20, 26, 22),
+(7, 9, 2, 15, 23, 21, 27, 23),
+(7, 9, 3, 16, 24, 21, 28, 24),
+(7, 9, 4, 16, 24, 22, 29, 25),
+(7, 9, 5, 16, 24, 22, 31, 27),
+(7, 9, 6, 17, 25, 23, 32, 28),
+(7, 9, 7, 17, 25, 23, 33, 29),
+(7, 9, 8, 17, 26, 24, 34, 30),
+(7, 9, 9, 17, 26, 25, 36, 31),
+(7, 9, 10, 18, 26, 25, 37, 33),
+(7, 9, 11, 18, 27, 26, 38, 34),
+(7, 9, 12, 18, 27, 26, 39, 35),
+(7, 9, 13, 19, 28, 27, 41, 36),
+(7, 9, 14, 19, 28, 28, 42, 38),
+(7, 9, 15, 20, 28, 28, 43, 39),
+(7, 9, 16, 20, 29, 29, 45, 40),
+(7, 9, 17, 20, 29, 30, 46, 42),
+(7, 9, 18, 21, 30, 30, 47, 43),
+(7, 9, 19, 21, 30, 31, 49, 44),
+(7, 9, 20, 21, 31, 32, 50, 46),
+(7, 9, 21, 22, 31, 32, 51, 47),
+(7, 9, 22, 22, 31, 33, 53, 49),
+(7, 9, 23, 23, 32, 34, 54, 50),
+(7, 9, 24, 23, 32, 34, 56, 51),
+(7, 9, 25, 23, 33, 35, 57, 53),
+(7, 9, 26, 24, 33, 36, 59, 54),
+(7, 9, 27, 24, 34, 37, 60, 56),
+(7, 9, 28, 25, 34, 37, 62, 57),
+(7, 9, 29, 25, 35, 38, 63, 59),
+(7, 9, 30, 25, 35, 39, 65, 60),
+(7, 9, 31, 26, 36, 40, 66, 62),
+(7, 9, 32, 26, 36, 40, 68, 63),
+(7, 9, 33, 27, 37, 41, 69, 65),
+(7, 9, 34, 27, 38, 42, 71, 66),
+(7, 9, 35, 28, 38, 43, 73, 68),
+(7, 9, 36, 28, 39, 43, 74, 69),
+(7, 9, 37, 28, 39, 44, 76, 71),
+(7, 9, 38, 29, 40, 45, 77, 73),
+(7, 9, 39, 29, 40, 46, 79, 74),
+(7, 9, 40, 30, 41, 47, 81, 76),
+(7, 9, 41, 30, 41, 48, 82, 78),
+(7, 9, 42, 31, 42, 48, 84, 79),
+(7, 9, 43, 31, 43, 49, 86, 81),
+(7, 9, 44, 32, 43, 50, 88, 83),
+(7, 9, 45, 32, 44, 51, 89, 84),
+(7, 9, 46, 33, 44, 52, 91, 86),
+(7, 9, 47, 33, 45, 53, 93, 88),
+(7, 9, 48, 34, 46, 54, 95, 89),
+(7, 9, 49, 34, 46, 54, 96, 91),
+(7, 9, 50, 35, 47, 55, 98, 93),
+(7, 9, 51, 35, 48, 56, 100, 95),
+(7, 9, 52, 36, 48, 57, 102, 97);
+INSERT IGNORE INTO `player_levelstats` (`race`, `class`, `level`, `str`, `agi`, `sta`, `inte`, `spi`) VALUES
+(7, 9, 53, 36, 49, 58, 104, 98),
+(7, 9, 54, 37, 50, 59, 105, 100),
+(7, 9, 55, 37, 50, 60, 107, 102),
+(7, 9, 56, 38, 51, 61, 109, 104),
+(7, 9, 57, 38, 52, 62, 111, 106),
+(7, 9, 58, 39, 52, 63, 113, 108),
+(7, 9, 59, 40, 53, 64, 115, 109),
+(7, 9, 60, 40, 54, 65, 117, 111),
+(7, 9, 61, 41, 54, 66, 119, 113),
+(7, 9, 62, 41, 55, 67, 121, 115),
+(7, 9, 63, 42, 56, 68, 123, 117),
+(7, 9, 64, 42, 57, 69, 125, 119),
+(7, 9, 65, 43, 57, 70, 127, 121),
+(7, 9, 66, 44, 58, 71, 129, 123),
+(7, 9, 67, 44, 59, 72, 131, 125),
+(7, 9, 68, 45, 59, 73, 133, 127),
+(7, 9, 69, 45, 60, 74, 135, 129),
+(7, 9, 70, 46, 61, 75, 137, 131),
+(7, 9, 71, 47, 62, 84, 147, 142),
+(7, 9, 72, 48, 62, 85, 148, 144),
+(7, 9, 73, 49, 63, 85, 153, 147),
+(7, 9, 74, 49, 64, 88, 153, 150),
+(7, 9, 75, 50, 65, 90, 155, 152),
+(7, 9, 76, 51, 66, 91, 158, 155),
+(7, 9, 77, 52, 67, 92, 161, 158),
+(7, 9, 78, 52, 68, 93, 163, 161),
+(7, 9, 79, 53, 69, 95, 166, 164),
+(7, 9, 80, 54, 70, 96, 170, 166),
+(8, 1, 1, 24, 22, 23, 16, 21),
+(8, 1, 2, 25, 23, 24, 16, 21),
+(8, 1, 3, 27, 24, 25, 16, 22),
+(8, 1, 4, 28, 24, 26, 16, 22),
+(8, 1, 5, 29, 25, 28, 16, 22),
+(8, 1, 6, 31, 26, 29, 16, 22),
+(8, 1, 7, 32, 27, 30, 17, 23),
+(8, 1, 8, 33, 28, 31, 17, 23),
+(8, 1, 9, 35, 28, 33, 17, 23),
+(8, 1, 10, 36, 29, 34, 17, 24),
+(8, 1, 11, 37, 30, 35, 17, 24),
+(8, 1, 12, 39, 31, 36, 17, 24),
+(8, 1, 13, 40, 32, 38, 17, 25),
+(8, 1, 14, 42, 33, 39, 17, 25),
+(8, 1, 15, 43, 34, 40, 18, 25),
+(8, 1, 16, 45, 35, 42, 18, 26),
+(8, 1, 17, 46, 35, 43, 18, 26),
+(8, 1, 18, 48, 36, 44, 18, 26),
+(8, 1, 19, 49, 37, 46, 18, 27),
+(8, 1, 20, 51, 38, 47, 18, 27),
+(8, 1, 21, 52, 39, 49, 18, 27),
+(8, 1, 22, 54, 40, 50, 18, 28),
+(8, 1, 23, 55, 41, 51, 19, 28),
+(8, 1, 24, 57, 42, 53, 19, 29),
+(8, 1, 25, 59, 43, 54, 19, 29),
+(8, 1, 26, 60, 44, 56, 19, 29),
+(8, 1, 27, 62, 45, 57, 19, 30),
+(8, 1, 28, 63, 46, 59, 19, 30),
+(8, 1, 29, 65, 47, 60, 20, 31),
+(8, 1, 30, 67, 48, 62, 20, 31),
+(8, 1, 31, 69, 49, 63, 20, 31),
+(8, 1, 32, 70, 50, 65, 20, 32),
+(8, 1, 33, 72, 51, 67, 20, 32),
+(8, 1, 34, 74, 53, 68, 20, 33),
+(8, 1, 35, 75, 54, 70, 21, 33),
+(8, 1, 36, 77, 55, 71, 21, 34),
+(8, 1, 37, 79, 56, 73, 21, 34),
+(8, 1, 38, 81, 57, 75, 21, 35),
+(8, 1, 39, 83, 58, 76, 21, 35),
+(8, 1, 40, 84, 59, 78, 22, 35),
+(8, 1, 41, 86, 60, 80, 22, 36),
+(8, 1, 42, 88, 62, 81, 22, 36),
+(8, 1, 43, 90, 63, 83, 22, 37),
+(8, 1, 44, 92, 64, 85, 22, 37),
+(8, 1, 45, 94, 65, 86, 23, 38),
+(8, 1, 46, 96, 66, 88, 23, 38),
+(8, 1, 47, 98, 67, 90, 23, 39),
+(8, 1, 48, 100, 69, 92, 23, 39),
+(8, 1, 49, 102, 70, 93, 24, 40),
+(8, 1, 50, 103, 71, 95, 24, 40),
+(8, 1, 51, 105, 72, 97, 24, 41),
+(8, 1, 52, 107, 74, 99, 24, 42),
+(8, 1, 53, 109, 75, 101, 25, 42),
+(8, 1, 54, 112, 76, 103, 25, 43),
+(8, 1, 55, 114, 78, 104, 25, 43),
+(8, 1, 56, 116, 79, 106, 25, 44),
+(8, 1, 57, 118, 80, 108, 25, 44),
+(8, 1, 58, 120, 81, 110, 26, 45),
+(8, 1, 59, 122, 83, 112, 26, 45),
+(8, 1, 60, 124, 84, 114, 26, 46),
+(8, 1, 61, 126, 85, 116, 27, 47),
+(8, 1, 62, 128, 87, 118, 27, 47),
+(8, 1, 63, 130, 88, 120, 27, 48),
+(8, 1, 64, 133, 90, 122, 27, 48),
+(8, 1, 65, 135, 91, 124, 28, 49),
+(8, 1, 66, 137, 92, 126, 28, 50),
+(8, 1, 67, 139, 94, 128, 28, 50),
+(8, 1, 68, 141, 95, 130, 28, 51),
+(8, 1, 69, 144, 97, 132, 29, 51),
+(8, 1, 70, 146, 98, 134, 29, 52),
+(8, 1, 71, 149, 99, 136, 29, 53),
+(8, 1, 72, 151, 101, 139, 29, 54),
+(8, 1, 73, 154, 103, 141, 29, 55),
+(8, 1, 74, 157, 104, 144, 30, 55),
+(8, 1, 75, 166, 106, 151, 30, 56),
+(8, 1, 76, 172, 108, 157, 30, 57),
+(8, 1, 77, 175, 110, 161, 31, 58),
+(8, 1, 78, 179, 111, 163, 31, 58),
+(8, 1, 79, 182, 113, 164, 31, 59),
+(8, 1, 80, 185, 115, 169, 32, 60),
+(8, 3, 1, 21, 25, 22, 16, 22),
+(8, 3, 2, 21, 26, 23, 17, 23),
+(8, 3, 3, 22, 28, 24, 17, 23),
+(8, 3, 4, 22, 29, 25, 18, 24),
+(8, 3, 5, 23, 30, 26, 18, 25),
+(8, 3, 6, 23, 32, 27, 19, 25),
+(8, 3, 7, 24, 33, 28, 20, 26),
+(8, 3, 8, 24, 35, 28, 20, 26),
+(8, 3, 9, 25, 36, 29, 21, 27),
+(8, 3, 10, 25, 38, 30, 21, 28),
+(8, 3, 11, 25, 39, 31, 22, 29),
+(8, 3, 12, 26, 41, 32, 23, 29),
+(8, 3, 13, 26, 42, 33, 23, 30),
+(8, 3, 14, 27, 44, 34, 24, 31),
+(8, 3, 15, 27, 45, 35, 25, 31),
+(8, 3, 16, 28, 47, 36, 25, 32),
+(8, 3, 17, 28, 48, 38, 26, 33),
+(8, 3, 18, 29, 50, 39, 27, 34),
+(8, 3, 19, 29, 51, 40, 28, 34),
+(8, 3, 20, 30, 53, 41, 28, 35),
+(8, 3, 21, 31, 55, 42, 29, 36),
+(8, 3, 22, 31, 56, 43, 30, 37),
+(8, 3, 23, 32, 58, 44, 30, 37),
+(8, 3, 24, 32, 60, 45, 31, 38),
+(8, 3, 25, 33, 61, 46, 32, 39),
+(8, 3, 26, 33, 63, 48, 33, 40),
+(8, 3, 27, 34, 65, 49, 33, 41),
+(8, 3, 28, 35, 66, 50, 34, 41),
+(8, 3, 29, 35, 68, 51, 35, 42),
+(8, 3, 30, 36, 70, 52, 36, 43),
+(8, 3, 31, 36, 72, 53, 37, 44),
+(8, 3, 32, 37, 73, 55, 37, 45),
+(8, 3, 33, 38, 75, 56, 38, 46),
+(8, 3, 34, 38, 77, 57, 39, 47),
+(8, 3, 35, 39, 79, 58, 40, 48),
+(8, 3, 36, 39, 81, 60, 41, 48),
+(8, 3, 37, 40, 83, 61, 41, 49),
+(8, 3, 38, 41, 85, 62, 42, 50),
+(8, 3, 39, 41, 86, 63, 43, 51),
+(8, 3, 40, 42, 88, 65, 44, 52),
+(8, 3, 41, 43, 90, 66, 45, 53),
+(8, 3, 42, 43, 92, 67, 46, 54),
+(8, 3, 43, 44, 94, 69, 47, 55),
+(8, 3, 44, 45, 96, 70, 47, 56),
+(8, 3, 45, 45, 98, 71, 48, 57),
+(8, 3, 46, 46, 100, 73, 49, 58),
+(8, 3, 47, 47, 102, 74, 50, 59),
+(8, 3, 48, 48, 104, 76, 51, 60),
+(8, 3, 49, 48, 106, 77, 52, 61),
+(8, 3, 50, 49, 108, 78, 53, 62),
+(8, 3, 51, 50, 110, 80, 54, 63),
+(8, 3, 52, 51, 113, 81, 55, 64),
+(8, 3, 53, 51, 115, 83, 56, 65),
+(8, 3, 54, 52, 117, 84, 57, 66),
+(8, 3, 55, 53, 119, 86, 58, 67),
+(8, 3, 56, 54, 121, 87, 59, 68),
+(8, 3, 57, 54, 123, 89, 60, 69),
+(8, 3, 58, 55, 126, 90, 61, 70),
+(8, 3, 59, 56, 128, 92, 62, 71),
+(8, 3, 60, 57, 130, 93, 63, 73),
+(8, 3, 61, 58, 132, 95, 64, 74),
+(8, 3, 62, 58, 134, 96, 65, 75),
+(8, 3, 63, 59, 137, 98, 66, 76),
+(8, 3, 64, 60, 139, 99, 67, 77),
+(8, 3, 65, 61, 141, 101, 68, 78),
+(8, 3, 66, 62, 144, 103, 69, 79),
+(8, 3, 67, 62, 146, 104, 70, 80),
+(8, 3, 68, 63, 148, 106, 71, 82),
+(8, 3, 69, 64, 151, 107, 72, 83),
+(8, 3, 70, 65, 153, 109, 73, 84),
+(8, 3, 71, 66, 156, 111, 74, 85),
+(8, 3, 72, 67, 159, 113, 75, 86),
+(8, 3, 73, 68, 162, 115, 76, 88),
+(8, 3, 74, 69, 165, 117, 78, 89),
+(8, 3, 75, 70, 174, 119, 82, 91),
+(8, 3, 76, 71, 177, 121, 83, 92),
+(8, 3, 77, 72, 180, 123, 85, 94),
+(8, 3, 78, 73, 184, 125, 86, 95),
+(8, 3, 79, 74, 187, 127, 87, 97),
+(8, 3, 80, 75, 190, 129, 89, 98),
+(8, 4, 1, 22, 25, 22, 16, 21),
+(8, 4, 2, 23, 26, 23, 16, 21),
+(8, 4, 3, 24, 28, 23, 16, 22),
+(8, 4, 4, 24, 29, 24, 16, 22),
+(8, 4, 5, 25, 31, 25, 17, 22),
+(8, 4, 6, 26, 32, 25, 17, 23),
+(8, 4, 7, 27, 34, 26, 17, 23),
+(8, 4, 8, 27, 35, 27, 17, 24),
+(8, 4, 9, 28, 37, 28, 17, 24),
+(8, 4, 10, 29, 38, 28, 18, 24),
+(8, 4, 11, 30, 40, 29, 18, 25),
+(8, 4, 12, 31, 41, 30, 18, 25),
+(8, 4, 13, 32, 43, 31, 18, 26),
+(8, 4, 14, 32, 45, 32, 18, 26),
+(8, 4, 15, 33, 46, 32, 19, 26),
+(8, 4, 16, 34, 48, 33, 19, 27),
+(8, 4, 17, 35, 50, 34, 19, 27),
+(8, 4, 18, 36, 51, 35, 19, 28),
+(8, 4, 19, 37, 53, 36, 19, 28),
+(8, 4, 20, 38, 55, 36, 20, 29),
+(8, 4, 21, 39, 56, 37, 20, 29),
+(8, 4, 22, 40, 58, 38, 20, 30),
+(8, 4, 23, 41, 60, 39, 20, 30),
+(8, 4, 24, 42, 62, 40, 20, 31),
+(8, 4, 25, 43, 63, 41, 21, 31),
+(8, 4, 26, 44, 65, 42, 21, 32),
+(8, 4, 27, 45, 67, 43, 21, 32),
+(8, 4, 28, 46, 69, 44, 21, 33),
+(8, 4, 29, 47, 71, 44, 22, 33),
+(8, 4, 30, 48, 72, 45, 22, 34),
+(8, 4, 31, 49, 74, 46, 22, 34),
+(8, 4, 32, 50, 76, 47, 22, 35),
+(8, 4, 33, 51, 78, 48, 23, 35),
+(8, 4, 34, 52, 80, 49, 23, 36),
+(8, 4, 35, 53, 82, 50, 23, 36),
+(8, 4, 36, 54, 84, 51, 24, 37),
+(8, 4, 37, 55, 86, 52, 24, 37),
+(8, 4, 38, 56, 88, 53, 24, 38),
+(8, 4, 39, 57, 90, 54, 24, 38),
+(8, 4, 40, 58, 92, 55, 25, 39),
+(8, 4, 41, 59, 94, 56, 25, 40),
+(8, 4, 42, 60, 96, 57, 25, 40),
+(8, 4, 43, 62, 98, 58, 26, 41),
+(8, 4, 44, 63, 100, 59, 26, 41),
+(8, 4, 45, 64, 102, 60, 26, 42),
+(8, 4, 46, 65, 104, 61, 27, 43),
+(8, 4, 47, 66, 107, 63, 27, 43),
+(8, 4, 48, 67, 109, 64, 27, 44),
+(8, 4, 49, 69, 111, 65, 27, 44),
+(8, 4, 50, 70, 113, 66, 28, 45),
+(8, 4, 51, 71, 115, 67, 28, 46),
+(8, 4, 52, 72, 117, 68, 28, 46),
+(8, 4, 53, 74, 120, 69, 29, 47),
+(8, 4, 54, 75, 122, 70, 29, 48),
+(8, 4, 55, 76, 124, 72, 29, 48),
+(8, 4, 56, 77, 126, 73, 30, 49),
+(8, 4, 57, 79, 129, 74, 30, 50),
+(8, 4, 58, 80, 131, 75, 30, 50),
+(8, 4, 59, 81, 133, 76, 31, 51),
+(8, 4, 60, 82, 136, 77, 31, 52),
+(8, 4, 61, 84, 138, 79, 32, 52),
+(8, 4, 62, 85, 140, 80, 32, 53),
+(8, 4, 63, 86, 143, 81, 32, 54),
+(8, 4, 64, 88, 145, 82, 33, 55),
+(8, 4, 65, 89, 148, 84, 33, 55),
+(8, 4, 66, 90, 150, 85, 33, 56),
+(8, 4, 67, 92, 153, 86, 34, 57),
+(8, 4, 68, 93, 155, 87, 34, 58),
+(8, 4, 69, 95, 157, 89, 35, 58),
+(8, 4, 70, 96, 160, 90, 35, 59),
+(8, 4, 71, 98, 163, 94, 35, 60),
+(8, 4, 72, 100, 166, 96, 36, 60),
+(8, 4, 73, 101, 169, 96, 36, 61),
+(8, 4, 74, 103, 172, 97, 37, 62),
+(8, 4, 75, 105, 175, 98, 37, 63),
+(8, 4, 76, 106, 178, 99, 37, 64),
+(8, 4, 77, 108, 181, 105, 38, 65),
+(8, 4, 78, 110, 185, 107, 38, 66),
+(8, 4, 79, 112, 188, 109, 39, 67),
+(8, 4, 80, 114, 191, 110, 39, 68),
+(8, 5, 1, 21, 22, 21, 18, 24),
+(8, 5, 2, 21, 22, 21, 19, 25),
+(8, 5, 3, 21, 22, 22, 21, 27),
+(8, 5, 4, 21, 23, 22, 22, 28),
+(8, 5, 5, 22, 23, 22, 23, 29),
+(8, 5, 6, 22, 23, 23, 25, 31),
+(8, 5, 7, 22, 23, 23, 26, 32),
+(8, 5, 8, 22, 24, 24, 27, 34),
+(8, 5, 9, 22, 24, 24, 29, 35),
+(8, 5, 10, 22, 24, 24, 30, 37),
+(8, 5, 11, 23, 24, 25, 32, 38),
+(8, 5, 12, 23, 24, 25, 33, 40),
+(8, 5, 13, 23, 25, 26, 35, 41),
+(8, 5, 14, 23, 25, 26, 36, 43),
+(8, 5, 15, 23, 25, 26, 38, 44),
+(8, 5, 16, 24, 26, 27, 39, 46),
+(8, 5, 17, 24, 26, 27, 41, 47),
+(8, 5, 18, 24, 26, 28, 42, 49),
+(8, 5, 19, 24, 26, 28, 44, 50),
+(8, 5, 20, 24, 27, 29, 45, 52),
+(8, 5, 21, 25, 27, 29, 47, 54),
+(8, 5, 22, 25, 27, 30, 48, 55),
+(8, 5, 23, 25, 28, 30, 50, 57),
+(8, 5, 24, 25, 28, 31, 52, 59),
+(8, 5, 25, 25, 28, 31, 53, 60),
+(8, 5, 26, 26, 28, 32, 55, 62),
+(8, 5, 27, 26, 29, 32, 56, 64),
+(8, 5, 28, 26, 29, 33, 58, 65),
+(8, 5, 29, 26, 29, 33, 60, 67),
+(8, 5, 30, 27, 30, 34, 62, 69),
+(8, 5, 31, 27, 30, 34, 63, 71),
+(8, 5, 32, 27, 30, 35, 65, 73),
+(8, 5, 33, 27, 31, 35, 67, 74),
+(8, 5, 34, 28, 31, 36, 68, 76),
+(8, 5, 35, 28, 32, 36, 70, 78),
+(8, 5, 36, 28, 32, 37, 72, 80),
+(8, 5, 37, 29, 32, 37, 74, 82),
+(8, 5, 38, 29, 33, 38, 76, 84),
+(8, 5, 39, 29, 33, 38, 77, 86),
+(8, 5, 40, 29, 33, 39, 79, 87),
+(8, 5, 41, 30, 34, 40, 81, 89),
+(8, 5, 42, 30, 34, 40, 83, 91),
+(8, 5, 43, 30, 35, 41, 85, 93),
+(8, 5, 44, 31, 35, 41, 87, 95),
+(8, 5, 45, 31, 35, 42, 89, 97),
+(8, 5, 46, 31, 36, 43, 91, 99),
+(8, 5, 47, 32, 36, 43, 93, 101),
+(8, 5, 48, 32, 37, 44, 94, 103),
+(8, 5, 49, 32, 37, 44, 96, 105),
+(8, 5, 50, 33, 37, 45, 98, 107),
+(8, 5, 51, 33, 38, 46, 100, 110),
+(8, 5, 52, 33, 38, 46, 102, 112),
+(8, 5, 53, 34, 39, 47, 104, 114),
+(8, 5, 54, 34, 39, 48, 106, 116),
+(8, 5, 55, 34, 40, 48, 109, 118),
+(8, 5, 56, 35, 40, 49, 111, 120),
+(8, 5, 57, 35, 41, 50, 113, 122),
+(8, 5, 58, 35, 41, 50, 115, 125),
+(8, 5, 59, 36, 42, 51, 117, 127),
+(8, 5, 60, 36, 42, 52, 119, 129),
+(8, 5, 61, 36, 42, 52, 121, 131),
+(8, 5, 62, 37, 43, 53, 123, 133),
+(8, 5, 63, 37, 43, 54, 125, 136),
+(8, 5, 64, 38, 44, 55, 128, 138),
+(8, 5, 65, 38, 44, 55, 130, 140),
+(8, 5, 66, 38, 45, 56, 132, 143),
+(8, 5, 67, 39, 45, 57, 134, 145),
+(8, 5, 68, 39, 46, 58, 136, 147),
+(8, 5, 69, 40, 46, 58, 139, 150),
+(8, 5, 70, 40, 47, 59, 141, 152),
+(8, 5, 71, 40, 48, 60, 144, 155),
+(8, 5, 72, 41, 48, 60, 147, 158),
+(8, 5, 73, 41, 49, 61, 150, 161),
+(8, 5, 74, 42, 49, 62, 152, 164),
+(8, 5, 75, 42, 50, 63, 155, 167),
+(8, 5, 76, 42, 51, 64, 158, 170),
+(8, 5, 77, 43, 51, 65, 161, 173),
+(8, 5, 78, 43, 52, 66, 164, 176),
+(8, 5, 79, 44, 52, 67, 167, 179),
+(8, 5, 80, 44, 53, 68, 170, 182),
+(8, 6, 1, 24, 22, 23, 16, 21),
+(8, 6, 2, 25, 23, 24, 16, 21),
+(8, 6, 3, 27, 24, 25, 16, 22),
+(8, 6, 4, 28, 24, 26, 16, 22),
+(8, 6, 5, 29, 25, 28, 16, 22),
+(8, 6, 6, 31, 26, 29, 16, 22),
+(8, 6, 7, 32, 27, 30, 17, 23),
+(8, 6, 8, 33, 28, 31, 17, 23),
+(8, 6, 9, 35, 28, 33, 17, 23),
+(8, 6, 10, 36, 29, 34, 17, 24),
+(8, 6, 11, 37, 30, 35, 17, 24),
+(8, 6, 12, 39, 31, 36, 17, 24),
+(8, 6, 13, 40, 32, 38, 17, 25),
+(8, 6, 14, 42, 33, 39, 17, 25),
+(8, 6, 15, 43, 34, 40, 18, 25),
+(8, 6, 16, 45, 35, 42, 18, 26),
+(8, 6, 17, 46, 35, 43, 18, 26),
+(8, 6, 18, 48, 36, 44, 18, 26),
+(8, 6, 19, 49, 37, 46, 18, 27),
+(8, 6, 20, 51, 38, 47, 18, 27),
+(8, 6, 21, 52, 39, 49, 18, 27),
+(8, 6, 22, 54, 40, 50, 18, 28),
+(8, 6, 23, 55, 41, 51, 19, 28),
+(8, 6, 24, 57, 42, 53, 19, 29),
+(8, 6, 25, 59, 43, 54, 19, 29),
+(8, 6, 26, 60, 44, 56, 19, 29),
+(8, 6, 27, 62, 45, 57, 19, 30),
+(8, 6, 28, 63, 46, 59, 19, 30),
+(8, 6, 29, 65, 47, 60, 20, 31),
+(8, 6, 30, 67, 48, 62, 20, 31),
+(8, 6, 31, 69, 49, 63, 20, 31),
+(8, 6, 32, 70, 50, 65, 20, 32),
+(8, 6, 33, 72, 51, 67, 20, 32),
+(8, 6, 34, 74, 53, 68, 20, 33),
+(8, 6, 35, 75, 54, 70, 21, 33),
+(8, 6, 36, 77, 55, 71, 21, 34),
+(8, 6, 37, 79, 56, 73, 21, 34),
+(8, 6, 38, 81, 57, 75, 21, 35),
+(8, 6, 39, 83, 58, 76, 21, 35),
+(8, 6, 40, 84, 59, 78, 22, 35),
+(8, 6, 41, 86, 60, 80, 22, 36),
+(8, 6, 42, 88, 62, 81, 22, 36),
+(8, 6, 43, 90, 63, 83, 22, 37),
+(8, 6, 44, 92, 64, 85, 22, 37),
+(8, 6, 45, 94, 65, 86, 23, 38),
+(8, 6, 46, 96, 66, 88, 23, 38),
+(8, 6, 47, 98, 67, 90, 23, 39),
+(8, 6, 48, 100, 69, 92, 23, 39),
+(8, 6, 49, 102, 70, 93, 24, 40),
+(8, 6, 50, 103, 71, 95, 24, 40),
+(8, 6, 51, 105, 72, 96, 24, 41),
+(8, 6, 52, 106, 74, 97, 24, 42),
+(8, 6, 53, 107, 73, 98, 25, 42),
+(8, 6, 54, 108, 74, 99, 25, 43),
+(8, 6, 55, 109, 75, 100, 25, 43),
+(8, 6, 56, 112, 77, 103, 25, 44),
+(8, 6, 57, 114, 78, 105, 25, 44),
+(8, 6, 58, 118, 79, 107, 26, 45),
+(8, 6, 59, 119, 81, 109, 26, 45),
+(8, 6, 60, 121, 82, 111, 26, 46),
+(8, 6, 61, 123, 83, 113, 26, 47),
+(8, 6, 62, 126, 85, 115, 26, 47),
+(8, 6, 63, 128, 86, 118, 27, 48),
+(8, 6, 64, 131, 88, 120, 27, 48),
+(8, 6, 65, 138, 89, 122, 27, 49),
+(8, 6, 66, 140, 91, 125, 27, 50),
+(8, 6, 67, 143, 92, 127, 28, 50),
+(8, 6, 68, 145, 94, 129, 28, 51),
+(8, 6, 69, 148, 95, 132, 28, 52),
+(8, 6, 70, 151, 97, 134, 28, 52),
+(8, 6, 71, 154, 99, 137, 29, 53),
+(8, 6, 72, 156, 100, 139, 29, 54),
+(8, 6, 73, 159, 102, 142, 29, 55),
+(8, 6, 74, 162, 104, 144, 29, 55),
+(8, 6, 75, 165, 105, 147, 30, 56),
+(8, 6, 76, 168, 107, 150, 30, 57),
+(8, 6, 77, 169, 109, 153, 30, 58),
+(8, 6, 78, 170, 110, 155, 30, 58),
+(8, 6, 79, 178, 112, 158, 31, 59),
+(8, 6, 80, 181, 114, 161, 31, 60),
+(8, 7, 1, 22, 22, 22, 17, 23),
+(8, 7, 2, 23, 22, 23, 18, 24),
+(8, 7, 3, 24, 23, 24, 19, 25),
+(8, 7, 4, 25, 23, 25, 20, 26),
+(8, 7, 5, 25, 24, 26, 21, 27),
+(8, 7, 6, 26, 24, 27, 22, 28),
+(8, 7, 7, 27, 25, 28, 23, 29),
+(8, 7, 8, 28, 25, 29, 24, 30),
+(8, 7, 9, 29, 25, 30, 25, 31),
+(8, 7, 10, 30, 26, 31, 26, 33),
+(8, 7, 11, 31, 26, 32, 27, 34),
+(8, 7, 12, 32, 27, 33, 28, 35),
+(8, 7, 13, 33, 27, 34, 29, 36),
+(8, 7, 14, 34, 28, 35, 30, 37),
+(8, 7, 15, 34, 28, 36, 31, 38),
+(8, 7, 16, 35, 29, 38, 32, 39),
+(8, 7, 17, 36, 29, 39, 33, 41),
+(8, 7, 18, 37, 30, 40, 34, 42),
+(8, 7, 19, 38, 30, 41, 35, 43),
+(8, 7, 20, 39, 31, 42, 36, 44),
+(8, 7, 21, 40, 32, 43, 37, 45),
+(8, 7, 22, 41, 32, 45, 38, 47),
+(8, 7, 23, 43, 33, 46, 39, 48),
+(8, 7, 24, 44, 33, 47, 40, 49),
+(8, 7, 25, 45, 34, 48, 42, 51),
+(8, 7, 26, 46, 34, 49, 43, 52),
+(8, 7, 27, 47, 35, 51, 44, 53),
+(8, 7, 28, 48, 35, 52, 45, 54),
+(8, 7, 29, 49, 36, 53, 46, 56),
+(8, 7, 30, 50, 37, 54, 48, 57),
+(8, 7, 31, 51, 37, 56, 49, 59),
+(8, 7, 32, 52, 38, 57, 50, 60),
+(8, 7, 33, 53, 38, 58, 51, 61),
+(8, 7, 34, 55, 39, 60, 52, 63),
+(8, 7, 35, 56, 40, 61, 54, 64),
+(8, 7, 36, 57, 40, 62, 55, 66),
+(8, 7, 37, 58, 41, 64, 56, 67),
+(8, 7, 38, 59, 42, 65, 57, 68),
+(8, 7, 39, 61, 42, 66, 59, 70),
+(8, 7, 40, 62, 43, 68, 60, 71),
+(8, 7, 41, 63, 44, 69, 61, 73),
+(8, 7, 42, 64, 44, 71, 63, 74),
+(8, 7, 43, 65, 45, 72, 64, 76),
+(8, 7, 44, 67, 46, 74, 65, 77),
+(8, 7, 45, 68, 46, 75, 67, 79),
+(8, 7, 46, 69, 47, 76, 68, 80),
+(8, 7, 47, 71, 48, 78, 69, 82),
+(8, 7, 48, 72, 49, 79, 71, 83),
+(8, 7, 49, 73, 49, 81, 72, 85),
+(8, 7, 50, 74, 50, 82, 74, 87),
+(8, 7, 51, 76, 51, 84, 75, 88),
+(8, 7, 52, 77, 51, 85, 77, 90),
+(8, 7, 53, 78, 52, 87, 78, 92),
+(8, 7, 54, 80, 53, 89, 79, 93),
+(8, 7, 55, 81, 54, 90, 81, 95),
+(8, 7, 56, 83, 55, 92, 82, 96),
+(8, 7, 57, 84, 55, 93, 84, 98),
+(8, 7, 58, 85, 56, 95, 85, 100),
+(8, 7, 59, 87, 57, 97, 87, 102),
+(8, 7, 60, 88, 58, 98, 88, 103),
+(8, 7, 61, 90, 58, 100, 90, 105),
+(8, 7, 62, 91, 59, 101, 91, 107),
+(8, 7, 63, 93, 60, 103, 93, 108),
+(8, 7, 64, 94, 61, 105, 94, 110),
+(8, 7, 65, 95, 62, 106, 96, 112),
+(8, 7, 66, 97, 63, 108, 98, 114),
+(8, 7, 67, 98, 63, 110, 99, 116),
+(8, 7, 68, 100, 64, 112, 101, 117),
+(8, 7, 69, 101, 65, 113, 102, 119),
+(8, 7, 70, 103, 66, 115, 104, 121),
+(8, 7, 71, 104, 67, 117, 116, 123),
+(8, 7, 72, 106, 68, 119, 118, 126),
+(8, 7, 73, 108, 69, 121, 121, 128),
+(8, 7, 74, 110, 70, 124, 123, 130),
+(8, 7, 75, 112, 71, 126, 125, 132),
+(8, 7, 76, 114, 72, 128, 127, 135),
+(8, 7, 77, 115, 73, 130, 129, 137),
+(8, 7, 78, 117, 74, 132, 132, 139),
+(8, 7, 79, 119, 75, 135, 134, 142),
+(8, 7, 80, 121, 76, 137, 136, 144),
+(8, 8, 1, 21, 22, 21, 19, 23),
+(8, 8, 2, 21, 22, 21, 20, 24),
+(8, 8, 3, 21, 22, 22, 22, 26),
+(8, 8, 4, 21, 22, 22, 23, 27),
+(8, 8, 5, 21, 23, 22, 25, 28),
+(8, 8, 6, 21, 23, 22, 26, 30),
+(8, 8, 7, 21, 23, 23, 27, 31),
+(8, 8, 8, 22, 23, 23, 29, 32),
+(8, 8, 9, 22, 23, 23, 30, 34),
+(8, 8, 10, 22, 23, 24, 32, 35),
+(8, 8, 11, 22, 24, 24, 33, 37),
+(8, 8, 12, 22, 24, 24, 35, 38),
+(8, 8, 13, 22, 24, 25, 36, 39),
+(8, 8, 14, 22, 24, 25, 38, 41),
+(8, 8, 15, 22, 24, 25, 39, 42),
+(8, 8, 16, 22, 24, 26, 41, 44),
+(8, 8, 17, 23, 25, 26, 42, 45),
+(8, 8, 18, 23, 25, 26, 44, 47),
+(8, 8, 19, 23, 25, 27, 46, 48),
+(8, 8, 20, 23, 25, 27, 47, 50),
+(8, 8, 21, 23, 25, 27, 49, 51),
+(8, 8, 22, 23, 26, 28, 51, 53),
+(8, 8, 23, 23, 26, 28, 52, 55),
+(8, 8, 24, 24, 26, 29, 54, 56),
+(8, 8, 25, 24, 26, 29, 56, 58),
+(8, 8, 26, 24, 27, 29, 57, 60),
+(8, 8, 27, 24, 27, 30, 59, 61),
+(8, 8, 28, 24, 27, 30, 61, 63),
+(8, 8, 29, 24, 27, 31, 63, 65),
+(8, 8, 30, 24, 28, 31, 64, 66),
+(8, 8, 31, 25, 28, 31, 66, 68),
+(8, 8, 32, 25, 28, 32, 68, 70),
+(8, 8, 33, 25, 28, 32, 70, 71),
+(8, 8, 34, 25, 29, 33, 71, 73),
+(8, 8, 35, 25, 29, 33, 73, 75),
+(8, 8, 36, 26, 29, 34, 75, 77),
+(8, 8, 37, 26, 29, 34, 77, 79),
+(8, 8, 38, 26, 30, 35, 79, 80),
+(8, 8, 39, 26, 30, 35, 81, 82),
+(8, 8, 40, 26, 30, 35, 83, 84),
+(8, 8, 41, 27, 31, 36, 85, 86),
+(8, 8, 42, 27, 31, 36, 87, 88),
+(8, 8, 43, 27, 31, 37, 89, 90),
+(8, 8, 44, 27, 32, 37, 91, 91),
+(8, 8, 45, 27, 32, 38, 93, 93),
+(8, 8, 46, 28, 32, 38, 95, 95),
+(8, 8, 47, 28, 32, 39, 97, 97),
+(8, 8, 48, 28, 33, 39, 99, 99),
+(8, 8, 49, 28, 33, 40, 101, 101),
+(8, 8, 50, 29, 33, 40, 103, 103),
+(8, 8, 51, 29, 34, 41, 105, 105),
+(8, 8, 52, 29, 34, 42, 107, 107),
+(8, 8, 53, 29, 35, 42, 109, 109),
+(8, 8, 54, 30, 35, 43, 111, 111),
+(8, 8, 55, 30, 35, 43, 113, 113),
+(8, 8, 56, 30, 36, 44, 115, 115),
+(8, 8, 57, 30, 36, 44, 118, 118),
+(8, 8, 58, 31, 36, 45, 120, 120),
+(8, 8, 59, 31, 37, 45, 122, 122),
+(8, 8, 60, 31, 37, 46, 124, 124),
+(8, 8, 61, 31, 37, 47, 126, 126),
+(8, 8, 62, 32, 38, 47, 129, 128),
+(8, 8, 63, 32, 38, 48, 131, 130),
+(8, 8, 64, 32, 39, 48, 133, 133),
+(8, 8, 65, 33, 39, 49, 135, 135),
+(8, 8, 66, 33, 39, 50, 138, 137),
+(8, 8, 67, 33, 40, 50, 140, 139),
+(8, 8, 68, 33, 40, 51, 142, 141),
+(8, 8, 69, 34, 41, 51, 145, 144),
+(8, 8, 70, 34, 41, 52, 147, 146),
+(8, 8, 71, 34, 41, 53, 150, 149),
+(8, 8, 72, 34, 42, 54, 153, 152),
+(8, 8, 73, 34, 42, 55, 156, 155),
+(8, 8, 74, 35, 43, 55, 159, 157),
+(8, 8, 75, 35, 43, 56, 162, 160),
+(8, 8, 76, 35, 43, 57, 168, 163),
+(8, 8, 77, 36, 44, 58, 168, 166),
+(8, 8, 78, 36, 44, 58, 171, 169),
+(8, 8, 79, 36, 45, 59, 177, 172),
+(8, 8, 80, 37, 45, 60, 177, 175),
+(10, 2, 1, 19, 22, 21, 24, 20),
+(10, 2, 2, 20, 23, 22, 25, 21),
+(10, 2, 3, 21, 23, 23, 25, 21),
+(10, 2, 4, 22, 24, 24, 26, 22),
+(10, 2, 5, 23, 24, 25, 27, 23),
+(10, 2, 6, 25, 25, 26, 27, 24),
+(10, 2, 7, 26, 25, 27, 28, 24),
+(10, 2, 8, 27, 26, 28, 29, 25),
+(10, 2, 9, 28, 27, 29, 29, 26),
+(10, 2, 10, 29, 27, 31, 30, 26),
+(10, 2, 11, 30, 28, 32, 31, 27),
+(10, 2, 12, 32, 29, 33, 31, 28),
+(10, 2, 13, 33, 29, 34, 32, 29),
+(10, 2, 14, 34, 30, 35, 33, 30),
+(10, 2, 15, 35, 31, 36, 33, 30),
+(10, 2, 16, 37, 31, 37, 34, 31),
+(10, 2, 17, 38, 32, 39, 35, 32),
+(10, 2, 18, 39, 33, 40, 36, 33),
+(10, 2, 19, 40, 33, 41, 36, 34),
+(10, 2, 20, 42, 34, 42, 37, 35),
+(10, 2, 21, 43, 35, 44, 38, 35),
+(10, 2, 22, 44, 35, 45, 39, 36),
+(10, 2, 23, 46, 36, 46, 40, 37),
+(10, 2, 24, 47, 37, 47, 40, 38),
+(10, 2, 25, 49, 38, 49, 41, 39),
+(10, 2, 26, 50, 38, 50, 42, 40),
+(10, 2, 27, 51, 39, 51, 43, 41),
+(10, 2, 28, 53, 40, 53, 44, 42),
+(10, 2, 29, 54, 41, 54, 45, 43),
+(10, 2, 30, 56, 41, 55, 45, 43),
+(10, 2, 31, 57, 42, 57, 46, 44),
+(10, 2, 32, 58, 43, 58, 47, 45),
+(10, 2, 33, 60, 44, 59, 48, 46),
+(10, 2, 34, 61, 45, 61, 49, 47),
+(10, 2, 35, 63, 45, 62, 50, 48),
+(10, 2, 36, 64, 46, 64, 51, 49),
+(10, 2, 37, 66, 47, 65, 52, 50),
+(10, 2, 38, 67, 48, 67, 53, 51),
+(10, 2, 39, 69, 49, 68, 54, 52),
+(10, 2, 40, 71, 50, 69, 55, 53),
+(10, 2, 41, 72, 50, 71, 55, 54),
+(10, 2, 42, 74, 51, 72, 56, 55),
+(10, 2, 43, 75, 52, 74, 57, 56),
+(10, 2, 44, 77, 53, 75, 58, 57),
+(10, 2, 45, 79, 54, 77, 59, 59),
+(10, 2, 46, 80, 55, 78, 60, 60),
+(10, 2, 47, 82, 56, 80, 61, 61),
+(10, 2, 48, 83, 57, 82, 62, 62),
+(10, 2, 49, 85, 58, 83, 63, 63),
+(10, 2, 50, 87, 59, 85, 64, 64),
+(10, 2, 51, 89, 60, 86, 66, 65),
+(10, 2, 52, 90, 61, 88, 67, 66),
+(10, 2, 53, 92, 61, 90, 68, 67),
+(10, 2, 54, 94, 62, 91, 69, 69),
+(10, 2, 55, 95, 63, 93, 70, 70),
+(10, 2, 56, 97, 64, 95, 71, 71),
+(10, 2, 57, 99, 65, 96, 72, 72),
+(10, 2, 58, 101, 66, 98, 73, 73),
+(10, 2, 59, 102, 67, 100, 74, 74),
+(10, 2, 60, 104, 68, 101, 75, 76),
+(10, 2, 61, 106, 69, 103, 76, 77),
+(10, 2, 62, 108, 70, 105, 78, 78),
+(10, 2, 63, 110, 72, 106, 79, 79),
+(10, 2, 64, 112, 73, 108, 80, 80),
+(10, 2, 65, 113, 74, 110, 81, 82),
+(10, 2, 66, 115, 75, 112, 82, 83),
+(10, 2, 67, 117, 76, 114, 83, 84),
+(10, 2, 68, 119, 77, 115, 85, 85),
+(10, 2, 69, 121, 78, 117, 86, 87),
+(10, 2, 70, 123, 79, 119, 87, 88),
+(10, 2, 71, 125, 80, 120, 88, 89),
+(10, 2, 72, 128, 81, 123, 90, 91),
+(10, 2, 73, 130, 82, 125, 91, 93),
+(10, 2, 74, 133, 84, 127, 93, 94),
+(10, 2, 75, 135, 85, 129, 94, 96),
+(10, 2, 76, 137, 86, 132, 96, 97),
+(10, 2, 77, 140, 88, 134, 97, 99),
+(10, 2, 78, 143, 89, 136, 99, 101),
+(10, 2, 79, 145, 90, 139, 100, 102),
+(10, 2, 80, 148, 92, 141, 102, 104),
+(10, 3, 1, 17, 25, 20, 24, 20),
+(10, 3, 2, 17, 26, 21, 25, 21),
+(10, 3, 3, 18, 28, 22, 25, 21),
+(10, 3, 4, 18, 29, 23, 26, 22),
+(10, 3, 5, 19, 30, 24, 26, 23),
+(10, 3, 6, 19, 32, 25, 27, 23),
+(10, 3, 7, 20, 33, 26, 27, 24),
+(10, 3, 8, 20, 35, 27, 28, 25),
+(10, 3, 9, 21, 36, 27, 29, 25),
+(10, 3, 10, 21, 38, 28, 29, 26),
+(10, 3, 11, 22, 39, 29, 30, 27),
+(10, 3, 12, 22, 41, 30, 31, 27),
+(10, 3, 13, 23, 42, 31, 31, 28),
+(10, 3, 14, 23, 44, 32, 32, 29),
+(10, 3, 15, 24, 45, 34, 32, 29),
+(10, 3, 16, 24, 47, 35, 33, 30),
+(10, 3, 17, 25, 48, 36, 34, 31),
+(10, 3, 18, 25, 50, 37, 34, 32),
+(10, 3, 19, 26, 51, 38, 35, 32),
+(10, 3, 20, 26, 53, 39, 36, 33),
+(10, 3, 21, 27, 55, 40, 37, 34),
+(10, 3, 22, 27, 56, 41, 37, 35),
+(10, 3, 23, 28, 58, 42, 38, 36),
+(10, 3, 24, 28, 60, 43, 39, 36),
+(10, 3, 25, 29, 61, 44, 39, 37),
+(10, 3, 26, 30, 63, 46, 40, 38),
+(10, 3, 27, 30, 65, 47, 41, 39),
+(10, 3, 28, 31, 66, 48, 42, 40),
+(10, 3, 29, 31, 68, 49, 42, 40),
+(10, 3, 30, 32, 70, 50, 43, 41),
+(10, 3, 31, 33, 72, 52, 44, 42),
+(10, 3, 32, 33, 73, 53, 45, 43),
+(10, 3, 33, 34, 75, 54, 46, 44),
+(10, 3, 34, 34, 77, 55, 46, 45),
+(10, 3, 35, 35, 79, 57, 47, 46),
+(10, 3, 36, 36, 81, 58, 48, 47),
+(10, 3, 37, 36, 83, 59, 49, 47),
+(10, 3, 38, 37, 85, 60, 50, 48),
+(10, 3, 39, 38, 86, 62, 51, 49),
+(10, 3, 40, 38, 88, 63, 51, 50),
+(10, 3, 41, 39, 90, 64, 52, 51),
+(10, 3, 42, 40, 92, 66, 53, 52),
+(10, 3, 43, 40, 94, 67, 54, 53),
+(10, 3, 44, 41, 96, 68, 55, 54),
+(10, 3, 45, 42, 98, 70, 56, 55),
+(10, 3, 46, 42, 100, 71, 57, 56),
+(10, 3, 47, 43, 102, 72, 58, 57),
+(10, 3, 48, 44, 104, 74, 59, 58),
+(10, 3, 49, 45, 106, 75, 60, 59),
+(10, 3, 50, 45, 108, 77, 61, 60),
+(10, 3, 51, 46, 110, 78, 61, 61),
+(10, 3, 52, 47, 113, 79, 62, 62),
+(10, 3, 53, 47, 115, 81, 63, 63),
+(10, 3, 54, 48, 117, 82, 64, 64),
+(10, 3, 55, 49, 119, 84, 65, 65),
+(10, 3, 56, 50, 121, 85, 66, 66),
+(10, 3, 57, 50, 123, 87, 67, 67),
+(10, 3, 58, 51, 126, 88, 68, 68),
+(10, 3, 59, 52, 128, 90, 69, 70),
+(10, 3, 60, 53, 130, 91, 70, 71),
+(10, 3, 61, 54, 132, 93, 71, 72),
+(10, 3, 62, 54, 134, 94, 72, 73),
+(10, 3, 63, 55, 137, 96, 73, 74),
+(10, 3, 64, 56, 139, 97, 75, 75),
+(10, 3, 65, 57, 141, 99, 76, 76),
+(10, 3, 66, 58, 144, 101, 77, 77),
+(10, 3, 67, 58, 146, 102, 78, 78),
+(10, 3, 68, 59, 148, 104, 79, 80),
+(10, 3, 69, 60, 151, 105, 80, 81),
+(10, 3, 70, 61, 153, 107, 81, 82),
+(10, 3, 71, 62, 156, 108, 82, 83),
+(10, 3, 72, 63, 159, 110, 83, 84),
+(10, 3, 73, 64, 162, 112, 84, 86),
+(10, 3, 74, 65, 165, 114, 86, 87),
+(10, 3, 75, 66, 168, 116, 87, 89),
+(10, 3, 76, 67, 171, 118, 89, 90),
+(10, 3, 77, 68, 174, 120, 90, 92),
+(10, 3, 78, 69, 177, 122, 91, 93),
+(10, 3, 79, 70, 180, 124, 92, 95),
+(10, 3, 80, 71, 183, 126, 94, 96),
+(10, 4, 1, 18, 25, 20, 24, 19),
+(10, 4, 2, 19, 26, 21, 24, 19),
+(10, 4, 3, 20, 28, 21, 24, 20),
+(10, 4, 4, 20, 29, 22, 24, 20),
+(10, 4, 5, 21, 31, 23, 25, 20),
+(10, 4, 6, 22, 32, 24, 25, 21),
+(10, 4, 7, 23, 34, 24, 25, 21),
+(10, 4, 8, 24, 35, 25, 25, 22),
+(10, 4, 9, 24, 37, 26, 25, 22),
+(10, 4, 10, 25, 38, 26, 25, 22),
+(10, 4, 11, 26, 40, 27, 25, 23),
+(10, 4, 12, 27, 41, 28, 26, 23),
+(10, 4, 13, 28, 43, 29, 26, 24),
+(10, 4, 14, 29, 45, 30, 26, 24),
+(10, 4, 15, 29, 46, 30, 26, 25),
+(10, 4, 16, 30, 48, 31, 26, 25),
+(10, 4, 17, 31, 50, 32, 27, 25),
+(10, 4, 18, 32, 51, 33, 27, 26),
+(10, 4, 19, 33, 53, 34, 27, 26),
+(10, 4, 20, 34, 55, 35, 27, 27),
+(10, 4, 21, 35, 56, 35, 27, 27),
+(10, 4, 22, 36, 58, 36, 28, 28),
+(10, 4, 23, 37, 60, 37, 28, 28),
+(10, 4, 24, 38, 62, 38, 28, 29),
+(10, 4, 25, 39, 63, 39, 28, 29),
+(10, 4, 26, 40, 65, 40, 29, 30),
+(10, 4, 27, 41, 67, 41, 29, 30),
+(10, 4, 28, 42, 69, 42, 29, 31),
+(10, 4, 29, 43, 71, 43, 29, 31),
+(10, 4, 30, 44, 72, 43, 29, 32),
+(10, 4, 31, 45, 74, 44, 30, 32),
+(10, 4, 32, 46, 76, 45, 30, 33),
+(10, 4, 33, 47, 78, 46, 30, 33),
+(10, 4, 34, 48, 80, 47, 31, 34),
+(10, 4, 35, 49, 82, 48, 31, 34),
+(10, 4, 36, 50, 84, 49, 31, 35),
+(10, 4, 37, 51, 86, 50, 31, 35),
+(10, 4, 38, 52, 88, 51, 32, 36),
+(10, 4, 39, 53, 90, 52, 32, 37),
+(10, 4, 40, 54, 92, 53, 32, 37),
+(10, 4, 41, 56, 94, 54, 33, 38),
+(10, 4, 42, 57, 96, 55, 33, 38),
+(10, 4, 43, 58, 98, 56, 33, 39),
+(10, 4, 44, 59, 100, 57, 33, 39),
+(10, 4, 45, 60, 102, 59, 34, 40),
+(10, 4, 46, 61, 104, 60, 34, 41),
+(10, 4, 47, 62, 107, 61, 34, 41),
+(10, 4, 48, 64, 109, 62, 35, 42),
+(10, 4, 49, 65, 111, 63, 35, 43),
+(10, 4, 50, 66, 113, 64, 35, 43),
+(10, 4, 51, 67, 115, 65, 36, 44),
+(10, 4, 52, 68, 117, 66, 36, 44),
+(10, 4, 53, 70, 120, 67, 36, 45),
+(10, 4, 54, 71, 122, 69, 37, 46),
+(10, 4, 55, 72, 124, 70, 37, 46),
+(10, 4, 56, 73, 126, 71, 37, 47),
+(10, 4, 57, 75, 129, 72, 38, 48),
+(10, 4, 58, 76, 131, 73, 38, 48),
+(10, 4, 59, 77, 133, 74, 39, 49),
+(10, 4, 60, 79, 136, 76, 39, 50),
+(10, 4, 61, 80, 138, 77, 39, 51),
+(10, 4, 62, 81, 140, 78, 40, 51),
+(10, 4, 63, 82, 143, 79, 40, 52),
+(10, 4, 64, 84, 145, 80, 41, 53),
+(10, 4, 65, 85, 148, 82, 41, 53),
+(10, 4, 66, 87, 150, 83, 41, 54),
+(10, 4, 67, 88, 153, 84, 42, 55),
+(10, 4, 68, 89, 155, 85, 42, 56),
+(10, 4, 69, 91, 157, 87, 43, 56),
+(10, 4, 70, 92, 160, 88, 43, 57),
+(10, 4, 71, 94, 163, 88, 43, 58),
+(10, 4, 72, 96, 166, 90, 44, 58),
+(10, 4, 73, 97, 169, 92, 44, 59),
+(10, 4, 74, 99, 172, 93, 45, 60),
+(10, 4, 75, 101, 175, 95, 45, 61),
+(10, 4, 76, 102, 178, 96, 45, 62),
+(10, 4, 77, 104, 181, 101, 46, 63),
+(10, 4, 78, 106, 185, 104, 46, 64),
+(10, 4, 79, 108, 188, 105, 47, 65),
+(10, 4, 80, 110, 191, 107, 47, 66),
+(10, 5, 1, 17, 22, 19, 26, 22),
+(10, 5, 2, 17, 22, 19, 27, 23),
+(10, 5, 3, 17, 22, 20, 29, 25),
+(10, 5, 4, 17, 23, 20, 30, 26),
+(10, 5, 5, 18, 23, 20, 31, 27),
+(10, 5, 6, 18, 23, 21, 33, 29),
+(10, 5, 7, 18, 23, 21, 34, 30),
+(10, 5, 8, 18, 24, 22, 35, 32),
+(10, 5, 9, 18, 24, 22, 37, 33),
+(10, 5, 10, 19, 24, 22, 38, 35),
+(10, 5, 11, 19, 24, 23, 39, 36),
+(10, 5, 12, 19, 24, 23, 41, 38),
+(10, 5, 13, 19, 25, 24, 42, 39),
+(10, 5, 14, 19, 25, 24, 44, 41),
+(10, 5, 15, 19, 25, 25, 45, 42),
+(10, 5, 16, 20, 26, 25, 47, 44),
+(10, 5, 17, 20, 26, 25, 48, 45),
+(10, 5, 18, 20, 26, 26, 50, 47),
+(10, 5, 19, 20, 26, 26, 51, 49),
+(10, 5, 20, 21, 27, 27, 53, 50),
+(10, 5, 21, 21, 27, 27, 54, 52),
+(10, 5, 22, 21, 27, 28, 56, 53),
+(10, 5, 23, 21, 28, 28, 58, 55),
+(10, 5, 24, 21, 28, 29, 59, 57),
+(10, 5, 25, 22, 28, 29, 61, 58),
+(10, 5, 26, 22, 28, 30, 62, 60),
+(10, 5, 27, 22, 29, 30, 64, 62),
+(10, 5, 28, 22, 29, 31, 66, 64),
+(10, 5, 29, 23, 29, 31, 67, 65),
+(10, 5, 30, 23, 30, 32, 69, 67),
+(10, 5, 31, 23, 30, 32, 71, 69),
+(10, 5, 32, 23, 30, 33, 72, 71),
+(10, 5, 33, 24, 31, 33, 74, 72),
+(10, 5, 34, 24, 31, 34, 76, 74),
+(10, 5, 35, 24, 32, 34, 78, 76),
+(10, 5, 36, 24, 32, 35, 80, 78),
+(10, 5, 37, 25, 32, 35, 81, 80),
+(10, 5, 38, 25, 33, 36, 83, 82),
+(10, 5, 39, 25, 33, 37, 85, 84),
+(10, 5, 40, 26, 33, 37, 87, 86),
+(10, 5, 41, 26, 34, 38, 89, 88),
+(10, 5, 42, 26, 34, 38, 91, 89),
+(10, 5, 43, 27, 35, 39, 92, 91),
+(10, 5, 44, 27, 35, 39, 94, 93),
+(10, 5, 45, 27, 35, 40, 96, 95),
+(10, 5, 46, 27, 36, 41, 98, 97),
+(10, 5, 47, 28, 36, 41, 100, 99),
+(10, 5, 48, 28, 37, 42, 102, 101),
+(10, 5, 49, 28, 37, 43, 104, 103),
+(10, 5, 50, 29, 37, 43, 106, 106),
+(10, 5, 51, 29, 38, 44, 108, 108),
+(10, 5, 52, 29, 38, 44, 110, 110),
+(10, 5, 53, 30, 39, 45, 112, 112),
+(10, 5, 54, 30, 39, 46, 114, 114),
+(10, 5, 55, 30, 40, 46, 116, 116),
+(10, 5, 56, 31, 40, 47, 118, 118),
+(10, 5, 57, 31, 41, 48, 120, 120),
+(10, 5, 58, 31, 41, 48, 123, 123),
+(10, 5, 59, 32, 42, 49, 125, 125),
+(10, 5, 60, 32, 42, 50, 127, 127),
+(10, 5, 61, 33, 42, 51, 129, 129),
+(10, 5, 62, 33, 43, 51, 131, 131),
+(10, 5, 63, 33, 43, 52, 133, 134),
+(10, 5, 64, 34, 44, 53, 135, 136),
+(10, 5, 65, 34, 44, 53, 138, 138),
+(10, 5, 66, 34, 45, 54, 140, 141),
+(10, 5, 67, 35, 45, 55, 142, 143),
+(10, 5, 68, 35, 46, 56, 144, 145),
+(10, 5, 69, 36, 46, 56, 147, 148),
+(10, 5, 70, 36, 47, 57, 149, 150),
+(10, 5, 71, 36, 48, 57, 152, 153),
+(10, 5, 72, 37, 48, 57, 155, 156),
+(10, 5, 73, 37, 49, 58, 158, 159),
+(10, 5, 74, 38, 49, 59, 160, 163),
+(10, 5, 75, 38, 50, 60, 163, 165),
+(10, 5, 76, 38, 51, 61, 166, 170),
+(10, 5, 77, 39, 51, 62, 168, 175),
+(10, 5, 78, 39, 52, 63, 172, 174),
+(10, 5, 79, 40, 52, 64, 175, 177),
+(10, 5, 80, 40, 53, 65, 178, 180),
+(10, 6, 1, 18, 23, 21, 24, 20),
+(10, 6, 2, 19, 24, 22, 24, 20),
+(10, 6, 3, 21, 25, 23, 24, 21),
+(10, 6, 4, 22, 25, 25, 24, 21),
+(10, 6, 5, 23, 26, 26, 24, 21),
+(10, 6, 6, 25, 27, 27, 24, 21),
+(10, 6, 7, 26, 28, 28, 24, 22),
+(10, 6, 8, 27, 29, 29, 25, 22),
+(10, 6, 9, 29, 29, 31, 25, 22),
+(10, 6, 10, 30, 30, 32, 25, 23),
+(10, 6, 11, 32, 31, 33, 25, 23),
+(10, 6, 12, 33, 32, 34, 25, 23),
+(10, 6, 13, 34, 33, 36, 25, 24),
+(10, 6, 14, 36, 34, 37, 25, 24),
+(10, 6, 15, 37, 35, 38, 25, 24),
+(10, 6, 16, 39, 36, 40, 25, 25),
+(10, 6, 17, 40, 36, 41, 25, 25),
+(10, 6, 18, 42, 37, 43, 26, 25),
+(10, 6, 19, 43, 38, 44, 26, 26),
+(10, 6, 20, 45, 39, 45, 26, 26),
+(10, 6, 21, 47, 40, 47, 26, 26),
+(10, 6, 22, 48, 41, 48, 26, 27),
+(10, 6, 23, 50, 42, 50, 26, 27),
+(10, 6, 24, 51, 43, 51, 26, 28),
+(10, 6, 25, 53, 44, 52, 27, 28),
+(10, 6, 26, 55, 45, 54, 27, 28),
+(10, 6, 27, 56, 46, 55, 27, 29),
+(10, 6, 28, 58, 47, 57, 27, 29),
+(10, 6, 29, 59, 48, 58, 27, 30),
+(10, 6, 30, 61, 49, 60, 27, 30),
+(10, 6, 31, 63, 50, 62, 27, 30),
+(10, 6, 32, 65, 51, 63, 28, 31),
+(10, 6, 33, 66, 52, 65, 28, 31),
+(10, 6, 34, 68, 53, 66, 28, 32),
+(10, 6, 35, 70, 55, 68, 28, 32),
+(10, 6, 36, 72, 56, 69, 28, 33),
+(10, 6, 37, 73, 57, 71, 29, 33),
+(10, 6, 38, 75, 58, 73, 29, 34),
+(10, 6, 39, 77, 59, 74, 29, 34),
+(10, 6, 40, 79, 60, 76, 29, 35),
+(10, 6, 41, 81, 61, 78, 29, 35),
+(10, 6, 42, 82, 62, 79, 30, 35),
+(10, 6, 43, 84, 64, 81, 30, 36),
+(10, 6, 44, 86, 65, 83, 30, 36),
+(10, 6, 45, 88, 66, 85, 30, 37),
+(10, 6, 46, 90, 67, 86, 30, 37),
+(10, 6, 47, 92, 68, 88, 31, 38),
+(10, 6, 48, 94, 69, 90, 31, 38),
+(10, 6, 49, 96, 69, 92, 31, 39),
+(10, 6, 50, 98, 70, 93, 31, 40),
+(10, 6, 51, 100, 71, 95, 32, 40),
+(10, 6, 52, 102, 72, 96, 32, 41),
+(10, 6, 53, 103, 73, 97, 32, 41),
+(10, 6, 54, 104, 74, 98, 32, 41),
+(10, 6, 55, 105, 75, 97, 33, 41),
+(10, 6, 56, 108, 77, 100, 33, 42),
+(10, 6, 57, 113, 78, 102, 33, 42),
+(10, 6, 58, 115, 79, 104, 34, 43),
+(10, 6, 59, 117, 81, 106, 34, 43),
+(10, 6, 60, 118, 82, 108, 34, 44),
+(10, 6, 61, 119, 83, 110, 34, 45),
+(10, 6, 62, 121, 85, 112, 34, 45),
+(10, 6, 63, 124, 86, 115, 35, 46),
+(10, 6, 64, 127, 88, 117, 35, 46),
+(10, 6, 65, 133, 89, 119, 35, 47),
+(10, 6, 66, 135, 91, 122, 35, 48),
+(10, 6, 67, 139, 92, 124, 36, 48),
+(10, 6, 68, 141, 94, 126, 36, 49),
+(10, 6, 69, 142, 95, 129, 36, 50),
+(10, 6, 70, 145, 97, 131, 36, 50),
+(10, 6, 71, 150, 99, 134, 37, 51),
+(10, 6, 72, 152, 100, 136, 37, 52),
+(10, 6, 73, 155, 102, 139, 37, 53),
+(10, 6, 74, 158, 104, 141, 37, 53),
+(10, 6, 75, 159, 105, 144, 38, 54),
+(10, 6, 76, 160, 107, 147, 38, 55),
+(10, 6, 77, 163, 109, 149, 38, 56),
+(10, 6, 78, 166, 110, 152, 38, 56),
+(10, 6, 79, 169, 112, 155, 39, 57),
+(10, 6, 80, 172, 114, 158, 39, 58),
+(10, 8, 1, 17, 22, 19, 27, 21),
+(10, 8, 2, 17, 22, 19, 28, 22),
+(10, 8, 3, 17, 22, 20, 30, 24),
+(10, 8, 4, 17, 22, 20, 31, 25),
+(10, 8, 5, 17, 23, 20, 32, 26),
+(10, 8, 6, 17, 23, 20, 34, 28),
+(10, 8, 7, 18, 23, 21, 35, 29),
+(10, 8, 8, 18, 23, 21, 37, 30),
+(10, 8, 9, 18, 23, 21, 38, 32),
+(10, 8, 10, 18, 23, 22, 40, 33),
+(10, 8, 11, 18, 24, 22, 41, 35),
+(10, 8, 12, 18, 24, 22, 42, 36),
+(10, 8, 13, 18, 24, 23, 44, 37),
+(10, 8, 14, 18, 24, 23, 45, 39),
+(10, 8, 15, 18, 24, 23, 47, 40),
+(10, 8, 16, 19, 24, 24, 49, 42),
+(10, 8, 17, 19, 25, 24, 50, 43),
+(10, 8, 18, 19, 25, 24, 52, 45),
+(10, 8, 19, 19, 25, 25, 53, 46),
+(10, 8, 20, 19, 25, 25, 55, 48),
+(10, 8, 21, 19, 25, 26, 57, 50),
+(10, 8, 22, 19, 26, 26, 58, 51),
+(10, 8, 23, 20, 26, 26, 60, 53),
+(10, 8, 24, 20, 26, 27, 61, 54),
+(10, 8, 25, 20, 26, 27, 63, 56),
+(10, 8, 26, 20, 27, 27, 65, 58),
+(10, 8, 27, 20, 27, 28, 67, 59),
+(10, 8, 28, 20, 27, 28, 68, 61),
+(10, 8, 29, 21, 27, 29, 70, 63),
+(10, 8, 30, 21, 28, 29, 72, 64),
+(10, 8, 31, 21, 28, 30, 74, 66),
+(10, 8, 32, 21, 28, 30, 75, 68),
+(10, 8, 33, 21, 28, 30, 77, 70),
+(10, 8, 34, 21, 29, 31, 79, 71),
+(10, 8, 35, 22, 29, 31, 81, 73),
+(10, 8, 36, 22, 29, 32, 83, 75),
+(10, 8, 37, 22, 29, 32, 85, 77),
+(10, 8, 38, 22, 30, 33, 86, 78),
+(10, 8, 39, 22, 30, 33, 88, 80),
+(10, 8, 40, 23, 30, 34, 90, 82),
+(10, 8, 41, 23, 31, 34, 92, 84),
+(10, 8, 42, 23, 31, 35, 94, 86),
+(10, 8, 43, 23, 31, 35, 96, 88),
+(10, 8, 44, 23, 32, 36, 98, 90),
+(10, 8, 45, 24, 32, 36, 100, 92),
+(10, 8, 46, 24, 32, 37, 102, 93),
+(10, 8, 47, 24, 32, 37, 104, 95),
+(10, 8, 48, 24, 33, 38, 106, 97),
+(10, 8, 49, 25, 33, 38, 108, 99),
+(10, 8, 50, 25, 33, 39, 110, 101),
+(10, 8, 51, 25, 34, 39, 112, 103),
+(10, 8, 52, 25, 34, 40, 114, 105),
+(10, 8, 53, 25, 35, 40, 117, 107),
+(10, 8, 54, 26, 35, 41, 119, 109),
+(10, 8, 55, 26, 35, 41, 121, 111),
+(10, 8, 56, 26, 36, 42, 123, 113),
+(10, 8, 57, 26, 36, 42, 125, 116),
+(10, 8, 58, 27, 36, 43, 127, 118),
+(10, 8, 59, 27, 37, 43, 130, 120),
+(10, 8, 60, 27, 37, 44, 132, 122),
+(10, 8, 61, 27, 37, 45, 134, 124),
+(10, 8, 62, 28, 38, 45, 136, 126),
+(10, 8, 63, 28, 38, 46, 139, 128),
+(10, 8, 64, 28, 39, 46, 141, 131),
+(10, 8, 65, 29, 39, 47, 143, 133),
+(10, 8, 66, 29, 39, 48, 146, 135),
+(10, 8, 67, 29, 40, 48, 148, 137),
+(10, 8, 68, 29, 40, 49, 150, 139),
+(10, 8, 69, 30, 41, 49, 153, 142),
+(10, 8, 70, 30, 41, 50, 155, 144),
+(10, 8, 71, 30, 41, 50, 158, 147),
+(10, 8, 72, 30, 42, 51, 161, 150),
+(10, 8, 73, 30, 42, 52, 164, 153),
+(10, 8, 74, 31, 43, 52, 167, 155),
+(10, 8, 75, 31, 43, 53, 170, 158),
+(10, 8, 76, 31, 43, 54, 173, 161),
+(10, 8, 77, 32, 44, 55, 176, 164),
+(10, 8, 78, 32, 44, 55, 179, 167),
+(10, 8, 79, 32, 45, 56, 182, 170),
+(10, 8, 80, 33, 45, 57, 185, 173),
+(10, 9, 1, 17, 22, 20, 26, 21),
+(10, 9, 2, 17, 22, 21, 27, 22),
+(10, 9, 3, 18, 23, 21, 28, 23),
+(10, 9, 4, 18, 23, 22, 29, 24),
+(10, 9, 5, 18, 23, 22, 31, 26),
+(10, 9, 6, 18, 24, 23, 32, 27),
+(10, 9, 7, 19, 24, 23, 33, 28),
+(10, 9, 8, 19, 25, 24, 34, 29),
+(10, 9, 9, 19, 25, 25, 36, 30),
+(10, 9, 10, 20, 25, 25, 37, 32),
+(10, 9, 11, 20, 26, 26, 38, 33),
+(10, 9, 12, 20, 26, 26, 39, 34),
+(10, 9, 13, 21, 27, 27, 41, 36),
+(10, 9, 14, 21, 27, 28, 42, 37),
+(10, 9, 15, 21, 27, 28, 43, 38),
+(10, 9, 16, 22, 28, 29, 45, 39),
+(10, 9, 17, 22, 28, 30, 46, 41),
+(10, 9, 18, 23, 29, 30, 47, 42),
+(10, 9, 19, 23, 29, 31, 49, 43),
+(10, 9, 20, 23, 30, 32, 50, 45),
+(10, 9, 21, 24, 30, 32, 51, 46),
+(10, 9, 22, 24, 31, 33, 53, 48),
+(10, 9, 23, 24, 31, 34, 54, 49),
+(10, 9, 24, 25, 31, 34, 56, 50),
+(10, 9, 25, 25, 32, 35, 57, 52),
+(10, 9, 26, 26, 32, 36, 59, 53),
+(10, 9, 27, 26, 33, 37, 60, 55),
+(10, 9, 28, 26, 33, 37, 62, 56),
+(10, 9, 29, 27, 34, 38, 63, 58),
+(10, 9, 30, 27, 34, 39, 65, 59),
+(10, 9, 31, 28, 35, 40, 66, 61),
+(10, 9, 32, 28, 36, 40, 68, 62),
+(10, 9, 33, 29, 36, 41, 69, 64),
+(10, 9, 34, 29, 37, 42, 71, 65),
+(10, 9, 35, 29, 37, 43, 73, 67),
+(10, 9, 36, 30, 38, 43, 74, 69),
+(10, 9, 37, 30, 38, 44, 76, 70),
+(10, 9, 38, 31, 39, 45, 77, 72),
+(10, 9, 39, 31, 39, 46, 79, 73),
+(10, 9, 40, 32, 40, 47, 81, 75),
+(10, 9, 41, 32, 41, 48, 82, 77),
+(10, 9, 42, 33, 41, 48, 84, 78),
+(10, 9, 43, 33, 42, 49, 86, 80),
+(10, 9, 44, 34, 42, 50, 88, 82),
+(10, 9, 45, 34, 43, 51, 89, 83),
+(10, 9, 46, 35, 44, 52, 91, 85),
+(10, 9, 47, 35, 44, 53, 93, 87),
+(10, 9, 48, 36, 45, 54, 95, 89),
+(10, 9, 49, 36, 45, 54, 96, 90),
+(10, 9, 50, 37, 46, 55, 98, 92),
+(10, 9, 51, 37, 47, 56, 100, 94),
+(10, 9, 52, 38, 47, 57, 102, 96),
+(10, 9, 53, 38, 48, 58, 104, 97),
+(10, 9, 54, 39, 49, 59, 105, 99),
+(10, 9, 55, 39, 49, 60, 107, 101),
+(10, 9, 56, 40, 50, 61, 109, 103),
+(10, 9, 57, 40, 51, 62, 111, 105),
+(10, 9, 58, 41, 51, 63, 113, 107),
+(10, 9, 59, 42, 52, 64, 115, 108),
+(10, 9, 60, 42, 53, 65, 117, 110),
+(10, 9, 61, 43, 53, 66, 119, 112),
+(10, 9, 62, 43, 54, 67, 121, 114),
+(10, 9, 63, 44, 55, 68, 123, 116),
+(10, 9, 64, 44, 56, 69, 125, 118),
+(10, 9, 65, 45, 56, 70, 127, 120),
+(10, 9, 66, 46, 57, 71, 129, 122),
+(10, 9, 67, 46, 58, 72, 131, 124),
+(10, 9, 68, 47, 58, 73, 133, 126),
+(10, 9, 69, 47, 59, 74, 135, 128),
+(10, 9, 70, 48, 60, 75, 137, 130),
+(10, 9, 71, 49, 61, 83, 139, 141),
+(10, 9, 72, 50, 61, 84, 142, 143),
+(10, 9, 73, 51, 62, 84, 144, 146),
+(10, 9, 74, 51, 63, 86, 147, 149),
+(10, 9, 75, 52, 64, 89, 149, 151),
+(10, 9, 76, 53, 65, 90, 155, 154),
+(10, 9, 77, 54, 66, 91, 155, 157),
+(10, 9, 78, 54, 67, 93, 157, 160),
+(10, 9, 79, 55, 68, 94, 160, 163),
+(10, 9, 80, 56, 69, 95, 163, 165),
+(11, 1, 1, 24, 17, 21, 21, 22),
+(11, 1, 2, 25, 18, 22, 21, 22),
+(11, 1, 3, 27, 19, 23, 21, 23),
+(11, 1, 4, 28, 19, 25, 21, 23),
+(11, 1, 5, 29, 20, 26, 21, 23),
+(11, 1, 6, 31, 21, 27, 21, 23),
+(11, 1, 7, 32, 22, 28, 21, 24),
+(11, 1, 8, 33, 23, 29, 22, 24),
+(11, 1, 9, 35, 24, 31, 22, 24),
+(11, 1, 10, 36, 24, 32, 22, 25),
+(11, 1, 11, 37, 25, 33, 22, 25),
+(11, 1, 12, 39, 26, 34, 22, 25),
+(11, 1, 13, 40, 27, 36, 22, 26),
+(11, 1, 14, 42, 28, 37, 22, 26),
+(11, 1, 15, 43, 29, 38, 22, 26),
+(11, 1, 16, 45, 30, 40, 22, 27),
+(11, 1, 17, 46, 31, 41, 23, 27),
+(11, 1, 18, 48, 32, 43, 23, 27),
+(11, 1, 19, 49, 33, 44, 23, 28),
+(11, 1, 20, 51, 34, 45, 23, 28),
+(11, 1, 21, 52, 34, 47, 23, 28),
+(11, 1, 22, 54, 35, 48, 23, 29),
+(11, 1, 23, 55, 36, 50, 23, 29),
+(11, 1, 24, 57, 37, 51, 24, 30),
+(11, 1, 25, 59, 38, 52, 24, 30),
+(11, 1, 26, 60, 39, 54, 24, 30),
+(11, 1, 27, 62, 40, 55, 24, 31),
+(11, 1, 28, 63, 41, 57, 24, 31),
+(11, 1, 29, 65, 43, 58, 24, 32),
+(11, 1, 30, 67, 44, 60, 24, 32),
+(11, 1, 31, 69, 45, 62, 25, 32),
+(11, 1, 32, 70, 46, 63, 25, 33),
+(11, 1, 33, 72, 47, 65, 25, 33),
+(11, 1, 34, 74, 48, 66, 25, 34),
+(11, 1, 35, 75, 49, 68, 25, 34),
+(11, 1, 36, 77, 50, 69, 26, 35),
+(11, 1, 37, 79, 51, 71, 26, 35),
+(11, 1, 38, 81, 52, 73, 26, 35),
+(11, 1, 39, 83, 53, 74, 26, 36),
+(11, 1, 40, 84, 55, 76, 26, 36),
+(11, 1, 41, 86, 56, 78, 27, 37),
+(11, 1, 42, 88, 57, 79, 27, 37),
+(11, 1, 43, 90, 58, 81, 27, 38),
+(11, 1, 44, 92, 59, 83, 27, 38),
+(11, 1, 45, 94, 60, 85, 27, 39),
+(11, 1, 46, 96, 62, 86, 28, 39),
+(11, 1, 47, 98, 63, 88, 28, 40),
+(11, 1, 48, 100, 64, 90, 28, 40),
+(11, 1, 49, 102, 65, 92, 28, 41),
+(11, 1, 50, 103, 66, 93, 29, 41),
+(11, 1, 51, 105, 68, 95, 29, 42),
+(11, 1, 52, 107, 69, 97, 29, 42),
+(11, 1, 53, 109, 70, 99, 29, 43),
+(11, 1, 54, 112, 71, 101, 30, 44),
+(11, 1, 55, 114, 73, 103, 30, 44),
+(11, 1, 56, 116, 74, 104, 30, 45),
+(11, 1, 57, 118, 75, 106, 30, 45),
+(11, 1, 58, 120, 77, 108, 31, 46),
+(11, 1, 59, 122, 78, 110, 31, 46),
+(11, 1, 60, 124, 79, 112, 31, 47),
+(11, 1, 61, 126, 81, 114, 31, 48),
+(11, 1, 62, 128, 82, 116, 32, 48),
+(11, 1, 63, 130, 83, 118, 32, 49),
+(11, 1, 64, 133, 85, 120, 32, 49),
+(11, 1, 65, 135, 86, 122, 33, 50),
+(11, 1, 66, 137, 87, 124, 33, 51),
+(11, 1, 67, 139, 89, 126, 33, 51),
+(11, 1, 68, 141, 90, 128, 33, 52),
+(11, 1, 69, 144, 92, 130, 34, 52),
+(11, 1, 70, 146, 93, 132, 34, 53),
+(11, 1, 71, 149, 94, 134, 34, 54),
+(11, 1, 72, 151, 96, 137, 34, 55),
+(11, 1, 73, 154, 98, 139, 34, 56),
+(11, 1, 74, 157, 99, 142, 35, 56),
+(11, 1, 75, 166, 101, 149, 35, 57),
+(11, 1, 76, 172, 103, 155, 35, 58),
+(11, 1, 77, 175, 105, 159, 36, 59),
+(11, 1, 78, 179, 106, 161, 36, 59),
+(11, 1, 79, 182, 108, 164, 36, 60),
+(11, 1, 80, 185, 110, 167, 37, 61),
+(11, 2, 1, 23, 17, 21, 21, 23),
+(11, 2, 2, 24, 18, 22, 22, 24),
+(11, 2, 3, 25, 18, 23, 22, 24),
+(11, 2, 4, 26, 19, 24, 23, 25),
+(11, 2, 5, 27, 19, 25, 24, 26),
+(11, 2, 6, 29, 20, 26, 24, 26),
+(11, 2, 7, 30, 21, 27, 25, 27),
+(11, 2, 8, 31, 21, 28, 26, 28),
+(11, 2, 9, 32, 22, 29, 26, 29),
+(11, 2, 10, 33, 22, 31, 27, 29),
+(11, 2, 11, 34, 23, 32, 28, 30),
+(11, 2, 12, 36, 24, 33, 28, 31),
+(11, 2, 13, 37, 24, 34, 29, 32),
+(11, 2, 14, 38, 25, 35, 30, 32),
+(11, 2, 15, 39, 26, 36, 31, 33),
+(11, 2, 16, 40, 26, 37, 31, 34),
+(11, 2, 17, 42, 27, 39, 32, 35),
+(11, 2, 18, 43, 28, 40, 33, 36),
+(11, 2, 19, 44, 28, 41, 34, 37),
+(11, 2, 20, 46, 29, 42, 34, 37),
+(11, 2, 21, 47, 30, 44, 35, 38),
+(11, 2, 22, 48, 31, 45, 36, 39),
+(11, 2, 23, 50, 31, 46, 37, 40),
+(11, 2, 24, 51, 32, 47, 38, 41),
+(11, 2, 25, 52, 33, 49, 38, 42),
+(11, 2, 26, 54, 34, 50, 39, 43),
+(11, 2, 27, 55, 34, 51, 40, 44),
+(11, 2, 28, 56, 35, 53, 41, 44),
+(11, 2, 29, 58, 36, 54, 42, 45),
+(11, 2, 30, 59, 37, 55, 43, 46),
+(11, 2, 31, 61, 37, 57, 43, 47),
+(11, 2, 32, 62, 38, 58, 44, 48),
+(11, 2, 33, 64, 39, 59, 45, 49),
+(11, 2, 34, 65, 40, 61, 46, 50),
+(11, 2, 35, 67, 41, 62, 47, 51),
+(11, 2, 36, 68, 42, 64, 48, 52),
+(11, 2, 37, 70, 42, 65, 49, 53),
+(11, 2, 38, 71, 43, 67, 50, 54),
+(11, 2, 39, 73, 44, 68, 51, 55),
+(11, 2, 40, 74, 45, 69, 52, 56),
+(11, 2, 41, 76, 46, 71, 53, 57),
+(11, 2, 42, 78, 47, 72, 54, 58),
+(11, 2, 43, 79, 47, 74, 55, 59),
+(11, 2, 44, 81, 48, 75, 56, 60),
+(11, 2, 45, 82, 49, 77, 57, 61),
+(11, 2, 46, 84, 50, 78, 58, 62),
+(11, 2, 47, 86, 51, 80, 59, 64),
+(11, 2, 48, 87, 52, 82, 60, 65),
+(11, 2, 49, 89, 53, 83, 61, 66),
+(11, 2, 50, 91, 54, 85, 62, 67),
+(11, 2, 51, 92, 55, 86, 63, 68),
+(11, 2, 52, 94, 56, 88, 64, 69),
+(11, 2, 53, 96, 57, 90, 65, 70),
+(11, 2, 54, 97, 58, 91, 66, 71),
+(11, 2, 55, 99, 59, 93, 67, 73),
+(11, 2, 56, 101, 60, 95, 68, 74),
+(11, 2, 57, 103, 61, 96, 69, 75),
+(11, 2, 58, 105, 62, 98, 70, 76),
+(11, 2, 59, 106, 63, 100, 71, 77),
+(11, 2, 60, 108, 64, 101, 72, 78),
+(11, 2, 61, 110, 65, 103, 74, 80),
+(11, 2, 62, 112, 66, 105, 75, 81),
+(11, 2, 63, 114, 67, 106, 76, 82),
+(11, 2, 64, 116, 68, 108, 77, 83),
+(11, 2, 65, 117, 69, 110, 78, 85),
+(11, 2, 66, 119, 70, 112, 79, 86),
+(11, 2, 67, 121, 71, 114, 80, 87),
+(11, 2, 68, 123, 72, 115, 82, 88),
+(11, 2, 69, 125, 73, 117, 83, 90),
+(11, 2, 70, 127, 74, 119, 84, 91),
+(11, 2, 71, 130, 75, 121, 87, 92),
+(11, 2, 72, 132, 76, 124, 90, 94),
+(11, 2, 73, 134, 77, 126, 93, 96),
+(11, 2, 74, 137, 79, 128, 97, 97),
+(11, 2, 75, 139, 80, 130, 101, 99),
+(11, 2, 76, 142, 81, 133, 106, 100),
+(11, 2, 77, 144, 83, 135, 108, 102),
+(11, 2, 78, 147, 84, 137, 110, 104),
+(11, 2, 79, 149, 85, 140, 111, 105),
+(11, 2, 80, 152, 87, 142, 113, 107),
+(11, 3, 1, 21, 20, 20, 21, 23),
+(11, 3, 2, 21, 21, 21, 22, 24),
+(11, 3, 3, 22, 23, 22, 22, 24),
+(11, 3, 4, 22, 24, 23, 23, 25),
+(11, 3, 5, 23, 25, 24, 23, 25),
+(11, 3, 6, 23, 27, 25, 24, 26),
+(11, 3, 7, 24, 28, 26, 24, 27),
+(11, 3, 8, 24, 30, 27, 25, 27),
+(11, 3, 9, 25, 31, 27, 26, 28),
+(11, 3, 10, 25, 33, 28, 26, 29),
+(11, 3, 11, 25, 34, 29, 27, 29),
+(11, 3, 12, 26, 36, 30, 28, 30),
+(11, 3, 13, 26, 37, 31, 28, 31),
+(11, 3, 14, 27, 39, 32, 29, 32),
+(11, 3, 15, 27, 40, 34, 30, 32),
+(11, 3, 16, 28, 42, 35, 30, 33),
+(11, 3, 17, 28, 43, 36, 31, 34),
+(11, 3, 18, 29, 45, 37, 32, 35),
+(11, 3, 19, 29, 47, 38, 32, 35),
+(11, 3, 20, 30, 48, 39, 33, 36),
+(11, 3, 21, 31, 50, 40, 34, 37),
+(11, 3, 22, 31, 51, 41, 34, 38),
+(11, 3, 23, 32, 53, 42, 35, 38),
+(11, 3, 24, 32, 55, 43, 36, 39),
+(11, 3, 25, 33, 57, 44, 37, 40),
+(11, 3, 26, 33, 58, 46, 37, 41),
+(11, 3, 27, 34, 60, 47, 38, 42),
+(11, 3, 28, 35, 62, 48, 39, 42),
+(11, 3, 29, 35, 63, 49, 40, 43),
+(11, 3, 30, 36, 65, 50, 40, 44),
+(11, 3, 31, 36, 67, 52, 41, 45),
+(11, 3, 32, 37, 69, 53, 42, 46),
+(11, 3, 33, 38, 71, 54, 43, 47),
+(11, 3, 34, 38, 72, 55, 44, 48),
+(11, 3, 35, 39, 74, 57, 44, 48),
+(11, 3, 36, 39, 76, 58, 45, 49),
+(11, 3, 37, 40, 78, 59, 46, 50),
+(11, 3, 38, 41, 80, 60, 47, 51),
+(11, 3, 39, 41, 82, 62, 48, 52),
+(11, 3, 40, 42, 84, 63, 49, 53),
+(11, 3, 41, 43, 86, 64, 50, 54),
+(11, 3, 42, 43, 88, 66, 50, 55),
+(11, 3, 43, 44, 90, 67, 51, 56),
+(11, 3, 44, 45, 91, 68, 52, 57),
+(11, 3, 45, 45, 93, 70, 53, 58),
+(11, 3, 46, 46, 95, 71, 54, 59),
+(11, 3, 47, 47, 98, 72, 55, 60),
+(11, 3, 48, 48, 100, 74, 56, 61),
+(11, 3, 49, 48, 102, 75, 57, 62),
+(11, 3, 50, 49, 104, 77, 58, 63),
+(11, 3, 51, 50, 106, 78, 59, 64),
+(11, 3, 52, 51, 108, 79, 60, 65),
+(11, 3, 53, 51, 110, 81, 61, 66),
+(11, 3, 54, 52, 112, 82, 61, 67),
+(11, 3, 55, 53, 114, 84, 62, 68),
+(11, 3, 56, 54, 116, 85, 63, 69),
+(11, 3, 57, 54, 118, 87, 64, 70),
+(11, 3, 58, 55, 121, 88, 65, 71),
+(11, 3, 59, 56, 123, 90, 66, 72),
+(11, 3, 60, 57, 125, 91, 67, 74),
+(11, 3, 61, 58, 127, 93, 68, 75),
+(11, 3, 62, 58, 130, 94, 69, 76),
+(11, 3, 63, 59, 132, 96, 71, 77),
+(11, 3, 64, 60, 134, 97, 72, 78),
+(11, 3, 65, 61, 136, 99, 73, 79),
+(11, 3, 66, 62, 139, 101, 74, 80),
+(11, 3, 67, 62, 141, 102, 75, 81),
+(11, 3, 68, 63, 143, 104, 76, 83),
+(11, 3, 69, 64, 146, 105, 77, 84),
+(11, 3, 70, 65, 148, 107, 78, 85),
+(11, 3, 71, 66, 151, 109, 79, 86),
+(11, 3, 72, 67, 154, 111, 80, 87),
+(11, 3, 73, 68, 157, 113, 81, 89),
+(11, 3, 74, 69, 160, 115, 83, 90),
+(11, 3, 75, 70, 163, 117, 84, 92),
+(11, 3, 76, 71, 166, 119, 85, 93),
+(11, 3, 77, 72, 169, 121, 87, 95),
+(11, 3, 78, 73, 172, 123, 88, 96),
+(11, 3, 79, 74, 175, 125, 89, 98),
+(11, 3, 80, 75, 178, 127, 91, 99),
+(11, 5, 1, 21, 17, 19, 23, 25),
+(11, 5, 2, 21, 17, 19, 24, 26),
+(11, 5, 3, 21, 17, 20, 26, 28),
+(11, 5, 4, 21, 18, 20, 27, 29),
+(11, 5, 5, 22, 18, 20, 28, 30),
+(11, 5, 6, 22, 18, 21, 30, 32),
+(11, 5, 7, 22, 18, 21, 31, 33),
+(11, 5, 8, 22, 19, 22, 32, 35),
+(11, 5, 9, 22, 19, 22, 34, 36),
+(11, 5, 10, 22, 19, 22, 35, 38),
+(11, 5, 11, 23, 19, 23, 37, 39),
+(11, 5, 12, 23, 20, 23, 38, 41),
+(11, 5, 13, 23, 20, 24, 39, 42),
+(11, 5, 14, 23, 20, 24, 41, 44),
+(11, 5, 15, 23, 20, 25, 42, 45),
+(11, 5, 16, 24, 21, 25, 44, 47),
+(11, 5, 17, 24, 21, 25, 45, 48),
+(11, 5, 18, 24, 21, 26, 47, 50),
+(11, 5, 19, 24, 22, 26, 48, 51),
+(11, 5, 20, 24, 22, 27, 50, 53),
+(11, 5, 21, 25, 22, 27, 51, 55),
+(11, 5, 22, 25, 22, 28, 53, 56),
+(11, 5, 23, 25, 23, 28, 55, 58),
+(11, 5, 24, 25, 23, 29, 56, 60),
+(11, 5, 25, 25, 23, 29, 58, 61),
+(11, 5, 26, 26, 24, 30, 60, 63),
+(11, 5, 27, 26, 24, 30, 61, 65),
+(11, 5, 28, 26, 24, 31, 63, 66),
+(11, 5, 29, 26, 25, 31, 65, 68),
+(11, 5, 30, 27, 25, 32, 66, 70),
+(11, 5, 31, 27, 25, 32, 68, 72),
+(11, 5, 32, 27, 26, 33, 70, 73),
+(11, 5, 33, 27, 26, 33, 71, 75),
+(11, 5, 34, 28, 26, 34, 73, 77),
+(11, 5, 35, 28, 27, 34, 75, 79),
+(11, 5, 36, 28, 27, 35, 77, 81),
+(11, 5, 37, 29, 28, 35, 79, 83),
+(11, 5, 38, 29, 28, 36, 80, 85),
+(11, 5, 39, 29, 28, 37, 82, 86),
+(11, 5, 40, 29, 29, 37, 84, 88),
+(11, 5, 41, 30, 29, 38, 86, 90),
+(11, 5, 42, 30, 29, 38, 88, 92),
+(11, 5, 43, 30, 30, 39, 90, 94),
+(11, 5, 44, 31, 30, 39, 91, 96),
+(11, 5, 45, 31, 31, 40, 93, 98),
+(11, 5, 46, 31, 31, 41, 95, 100),
+(11, 5, 47, 32, 31, 41, 97, 102),
+(11, 5, 48, 32, 32, 42, 99, 104),
+(11, 5, 49, 32, 32, 43, 101, 106),
+(11, 5, 50, 33, 33, 43, 103, 108),
+(11, 5, 51, 33, 33, 44, 105, 110),
+(11, 5, 52, 33, 34, 44, 107, 113),
+(11, 5, 53, 34, 34, 45, 109, 115),
+(11, 5, 54, 34, 34, 46, 111, 117),
+(11, 5, 55, 34, 35, 46, 113, 119),
+(11, 5, 56, 35, 35, 47, 115, 121),
+(11, 5, 57, 35, 36, 48, 118, 123),
+(11, 5, 58, 35, 36, 48, 120, 126),
+(11, 5, 59, 36, 37, 49, 122, 128),
+(11, 5, 60, 36, 37, 50, 124, 130),
+(11, 5, 61, 36, 38, 51, 126, 132),
+(11, 5, 62, 37, 38, 51, 128, 134),
+(11, 5, 63, 37, 39, 52, 130, 137),
+(11, 5, 64, 38, 39, 53, 133, 139),
+(11, 5, 65, 38, 40, 53, 135, 141),
+(11, 5, 66, 38, 40, 54, 137, 144),
+(11, 5, 67, 39, 40, 55, 139, 146),
+(11, 5, 68, 39, 41, 56, 141, 148),
+(11, 5, 69, 40, 41, 56, 144, 151),
+(11, 5, 70, 40, 42, 57, 146, 153),
+(11, 5, 71, 40, 43, 58, 149, 156),
+(11, 5, 72, 41, 43, 58, 155, 159),
+(11, 5, 73, 41, 44, 59, 157, 160),
+(11, 5, 74, 42, 44, 61, 160, 163),
+(11, 5, 75, 42, 45, 62, 164, 166),
+(11, 5, 76, 42, 46, 62, 167, 169),
+(11, 5, 77, 43, 46, 63, 168, 172),
+(11, 5, 78, 43, 47, 64, 169, 177),
+(11, 5, 79, 44, 47, 65, 172, 180),
+(11, 5, 80, 44, 48, 66, 175, 183),
+(11, 6, 1, 24, 17, 21, 21, 22),
+(11, 6, 2, 25, 18, 22, 21, 22),
+(11, 6, 3, 27, 19, 23, 21, 23),
+(11, 6, 4, 28, 19, 25, 21, 23),
+(11, 6, 5, 29, 20, 26, 21, 23),
+(11, 6, 6, 31, 21, 27, 21, 23),
+(11, 6, 7, 32, 22, 28, 21, 24),
+(11, 6, 8, 33, 23, 29, 22, 24),
+(11, 6, 9, 35, 24, 31, 22, 24),
+(11, 6, 10, 36, 24, 32, 22, 25),
+(11, 6, 11, 37, 25, 33, 22, 25),
+(11, 6, 12, 39, 26, 34, 22, 25),
+(11, 6, 13, 40, 27, 36, 22, 26),
+(11, 6, 14, 42, 28, 37, 22, 26),
+(11, 6, 15, 43, 29, 38, 22, 26),
+(11, 6, 16, 45, 30, 40, 22, 27),
+(11, 6, 17, 46, 31, 41, 23, 27),
+(11, 6, 18, 48, 32, 43, 23, 27),
+(11, 6, 19, 49, 33, 44, 23, 28),
+(11, 6, 20, 51, 34, 45, 23, 28),
+(11, 6, 21, 52, 34, 47, 23, 28),
+(11, 6, 22, 54, 35, 48, 23, 29),
+(11, 6, 23, 55, 36, 50, 23, 29),
+(11, 6, 24, 57, 37, 51, 24, 30),
+(11, 6, 25, 59, 38, 52, 24, 30),
+(11, 6, 26, 60, 39, 54, 24, 30),
+(11, 6, 27, 62, 40, 55, 24, 31),
+(11, 6, 28, 63, 41, 57, 24, 31),
+(11, 6, 29, 65, 43, 58, 24, 32),
+(11, 6, 30, 67, 44, 60, 24, 32),
+(11, 6, 31, 69, 45, 62, 25, 32),
+(11, 6, 32, 70, 46, 63, 25, 33),
+(11, 6, 33, 72, 47, 65, 25, 33),
+(11, 6, 34, 74, 48, 66, 25, 34),
+(11, 6, 35, 75, 49, 68, 25, 34),
+(11, 6, 36, 77, 50, 69, 26, 35),
+(11, 6, 37, 79, 51, 71, 26, 35),
+(11, 6, 38, 81, 52, 73, 26, 35),
+(11, 6, 39, 83, 53, 74, 26, 36),
+(11, 6, 40, 84, 55, 76, 26, 36),
+(11, 6, 41, 86, 56, 78, 27, 37),
+(11, 6, 42, 88, 57, 79, 27, 37),
+(11, 6, 43, 90, 58, 81, 27, 38),
+(11, 6, 44, 92, 59, 83, 27, 38),
+(11, 6, 45, 94, 60, 85, 27, 39),
+(11, 6, 46, 96, 62, 86, 28, 39),
+(11, 6, 47, 98, 63, 88, 28, 40),
+(11, 6, 48, 100, 64, 90, 28, 40),
+(11, 6, 49, 102, 65, 92, 28, 41),
+(11, 6, 50, 103, 65, 93, 29, 41),
+(11, 6, 51, 105, 66, 94, 29, 42),
+(11, 6, 52, 106, 67, 95, 29, 42),
+(11, 6, 53, 107, 68, 96, 29, 43),
+(11, 6, 54, 108, 69, 97, 30, 44),
+(11, 6, 55, 109, 70, 98, 30, 44),
+(11, 6, 56, 112, 72, 101, 30, 45),
+(11, 6, 57, 114, 73, 103, 30, 45),
+(11, 6, 58, 117, 74, 105, 31, 46),
+(11, 6, 59, 119, 76, 107, 31, 46),
+(11, 6, 60, 121, 77, 109, 31, 47),
+(11, 6, 61, 123, 78, 111, 31, 48),
+(11, 6, 62, 126, 80, 113, 31, 48),
+(11, 6, 63, 128, 81, 116, 32, 49),
+(11, 6, 64, 131, 83, 118, 32, 49),
+(11, 6, 65, 136, 84, 120, 32, 50),
+(11, 6, 66, 140, 86, 123, 32, 51),
+(11, 6, 67, 141, 87, 125, 33, 51),
+(11, 6, 68, 141, 89, 127, 33, 52),
+(11, 6, 69, 144, 90, 130, 33, 53),
+(11, 6, 70, 147, 92, 132, 33, 53),
+(11, 6, 71, 150, 94, 135, 34, 54),
+(11, 6, 72, 152, 95, 137, 34, 55),
+(11, 6, 73, 155, 97, 140, 34, 56),
+(11, 6, 74, 162, 99, 142, 34, 56),
+(11, 6, 75, 165, 100, 145, 35, 57),
+(11, 6, 76, 167, 102, 146, 35, 58),
+(11, 6, 77, 169, 104, 150, 35, 59),
+(11, 6, 78, 170, 105, 152, 35, 59),
+(11, 6, 79, 173, 107, 156, 36, 60),
+(11, 6, 80, 176, 109, 159, 36, 61),
+(11, 7, 1, 22, 17, 20, 22, 24),
+(11, 7, 2, 23, 17, 21, 23, 25),
+(11, 7, 3, 24, 18, 22, 24, 26),
+(11, 7, 4, 25, 18, 23, 25, 27),
+(11, 7, 5, 25, 19, 24, 26, 28),
+(11, 7, 6, 26, 19, 25, 27, 29),
+(11, 7, 7, 27, 20, 26, 28, 30),
+(11, 7, 8, 28, 20, 27, 28, 31),
+(11, 7, 9, 29, 21, 28, 29, 32),
+(11, 7, 10, 30, 21, 29, 30, 33),
+(11, 7, 11, 31, 22, 30, 31, 35),
+(11, 7, 12, 32, 22, 31, 32, 36),
+(11, 7, 13, 33, 23, 32, 33, 37),
+(11, 7, 14, 34, 23, 33, 34, 38),
+(11, 7, 15, 34, 24, 35, 35, 39),
+(11, 7, 16, 35, 24, 36, 36, 40),
+(11, 7, 17, 36, 25, 37, 38, 42),
+(11, 7, 18, 37, 25, 38, 39, 43),
+(11, 7, 19, 38, 26, 39, 40, 44),
+(11, 7, 20, 39, 26, 40, 41, 45),
+(11, 7, 21, 40, 27, 41, 42, 46),
+(11, 7, 22, 41, 27, 43, 43, 48),
+(11, 7, 23, 43, 28, 44, 44, 49),
+(11, 7, 24, 44, 28, 45, 45, 50),
+(11, 7, 25, 45, 29, 46, 46, 51),
+(11, 7, 26, 46, 30, 47, 48, 53),
+(11, 7, 27, 47, 30, 49, 49, 54),
+(11, 7, 28, 48, 31, 50, 50, 55),
+(11, 7, 29, 49, 31, 51, 51, 57),
+(11, 7, 30, 50, 32, 53, 52, 58),
+(11, 7, 31, 51, 33, 54, 53, 59),
+(11, 7, 32, 52, 33, 55, 55, 61),
+(11, 7, 33, 53, 34, 56, 56, 62),
+(11, 7, 34, 55, 34, 58, 57, 64),
+(11, 7, 35, 56, 35, 59, 58, 65),
+(11, 7, 36, 57, 36, 60, 60, 66),
+(11, 7, 37, 58, 36, 62, 61, 68),
+(11, 7, 38, 59, 37, 63, 62, 69),
+(11, 7, 39, 61, 38, 65, 63, 71),
+(11, 7, 40, 62, 38, 66, 65, 72),
+(11, 7, 41, 63, 39, 67, 66, 74),
+(11, 7, 42, 64, 40, 69, 67, 75),
+(11, 7, 43, 65, 40, 70, 69, 77),
+(11, 7, 44, 67, 41, 72, 70, 78),
+(11, 7, 45, 68, 42, 73, 71, 80),
+(11, 7, 46, 69, 42, 75, 73, 81),
+(11, 7, 47, 71, 43, 76, 74, 83);
+INSERT IGNORE INTO `player_levelstats` (`race`, `class`, `level`, `str`, `agi`, `sta`, `inte`, `spi`) VALUES
+(11, 7, 48, 72, 44, 78, 76, 84),
+(11, 7, 49, 73, 45, 79, 77, 86),
+(11, 7, 50, 74, 45, 81, 78, 88),
+(11, 7, 51, 76, 46, 82, 80, 89),
+(11, 7, 52, 77, 47, 84, 81, 91),
+(11, 7, 53, 78, 47, 85, 83, 92),
+(11, 7, 54, 80, 48, 87, 84, 94),
+(11, 7, 55, 81, 49, 88, 86, 96),
+(11, 7, 56, 83, 50, 90, 87, 97),
+(11, 7, 57, 84, 50, 91, 89, 99),
+(11, 7, 58, 85, 51, 93, 90, 101),
+(11, 7, 59, 87, 52, 95, 92, 102),
+(11, 7, 60, 88, 53, 96, 93, 104),
+(11, 7, 61, 90, 54, 98, 95, 106),
+(11, 7, 62, 91, 54, 99, 96, 108),
+(11, 7, 63, 93, 55, 101, 98, 109),
+(11, 7, 64, 94, 56, 103, 99, 111),
+(11, 7, 65, 95, 57, 104, 101, 113),
+(11, 7, 66, 97, 58, 106, 103, 115),
+(11, 7, 67, 98, 58, 108, 104, 117),
+(11, 7, 68, 100, 59, 110, 106, 118),
+(11, 7, 69, 101, 60, 111, 107, 120),
+(11, 7, 70, 103, 61, 113, 109, 122),
+(11, 7, 71, 104, 62, 115, 122, 124),
+(11, 7, 72, 106, 63, 117, 124, 127),
+(11, 7, 73, 108, 64, 119, 126, 129),
+(11, 7, 74, 110, 65, 122, 128, 131),
+(11, 7, 75, 112, 66, 124, 130, 133),
+(11, 7, 76, 114, 67, 126, 133, 136),
+(11, 7, 77, 115, 68, 128, 135, 138),
+(11, 7, 78, 117, 69, 130, 137, 140),
+(11, 7, 79, 119, 70, 133, 139, 143),
+(11, 7, 80, 121, 71, 135, 141, 145),
+(11, 8, 1, 21, 17, 19, 24, 24),
+(11, 8, 2, 21, 17, 19, 25, 25),
+(11, 8, 3, 21, 17, 20, 27, 27),
+(11, 8, 4, 21, 17, 20, 28, 28),
+(11, 8, 5, 21, 18, 20, 29, 29),
+(11, 8, 6, 21, 18, 20, 31, 31),
+(11, 8, 7, 21, 18, 21, 32, 32),
+(11, 8, 8, 22, 18, 21, 34, 33),
+(11, 8, 9, 22, 18, 21, 35, 35),
+(11, 8, 10, 22, 19, 22, 37, 36),
+(11, 8, 11, 22, 19, 22, 38, 37),
+(11, 8, 12, 22, 19, 22, 40, 39),
+(11, 8, 13, 22, 19, 23, 41, 40),
+(11, 8, 14, 22, 19, 23, 43, 42),
+(11, 8, 15, 22, 19, 23, 44, 43),
+(11, 8, 16, 22, 20, 24, 46, 45),
+(11, 8, 17, 23, 20, 24, 47, 46),
+(11, 8, 18, 23, 20, 24, 49, 48),
+(11, 8, 19, 23, 20, 25, 50, 49),
+(11, 8, 20, 23, 21, 25, 52, 51),
+(11, 8, 21, 23, 21, 26, 54, 52),
+(11, 8, 22, 23, 21, 26, 55, 54),
+(11, 8, 23, 23, 21, 26, 57, 56),
+(11, 8, 24, 24, 21, 27, 59, 57),
+(11, 8, 25, 24, 22, 27, 60, 59),
+(11, 8, 26, 24, 22, 27, 62, 60),
+(11, 8, 27, 24, 22, 28, 64, 62),
+(11, 8, 28, 24, 22, 28, 65, 64),
+(11, 8, 29, 24, 23, 29, 67, 65),
+(11, 8, 30, 24, 23, 29, 69, 67),
+(11, 8, 31, 25, 23, 30, 71, 69),
+(11, 8, 32, 25, 23, 30, 73, 71),
+(11, 8, 33, 25, 24, 30, 74, 72),
+(11, 8, 34, 25, 24, 31, 76, 74),
+(11, 8, 35, 25, 24, 31, 78, 76),
+(11, 8, 36, 26, 24, 32, 80, 78),
+(11, 8, 37, 26, 25, 32, 82, 79),
+(11, 8, 38, 26, 25, 33, 84, 81),
+(11, 8, 39, 26, 25, 33, 86, 83),
+(11, 8, 40, 26, 26, 34, 87, 85),
+(11, 8, 41, 27, 26, 34, 89, 87),
+(11, 8, 42, 27, 26, 35, 91, 89),
+(11, 8, 43, 27, 27, 35, 93, 91),
+(11, 8, 44, 27, 27, 36, 95, 92),
+(11, 8, 45, 27, 27, 36, 97, 94),
+(11, 8, 46, 28, 27, 37, 99, 96),
+(11, 8, 47, 28, 28, 37, 101, 98),
+(11, 8, 48, 28, 28, 38, 103, 100),
+(11, 8, 49, 28, 28, 38, 105, 102),
+(11, 8, 50, 29, 29, 39, 107, 104),
+(11, 8, 51, 29, 29, 39, 110, 106),
+(11, 8, 52, 29, 29, 40, 112, 108),
+(11, 8, 53, 29, 30, 40, 114, 110),
+(11, 8, 54, 30, 30, 41, 116, 112),
+(11, 8, 55, 30, 30, 41, 118, 114),
+(11, 8, 56, 30, 31, 42, 120, 116),
+(11, 8, 57, 30, 31, 42, 122, 118),
+(11, 8, 58, 31, 31, 43, 125, 121),
+(11, 8, 59, 31, 32, 43, 127, 123),
+(11, 8, 60, 31, 32, 44, 129, 125),
+(11, 8, 61, 31, 33, 45, 131, 127),
+(11, 8, 62, 32, 33, 45, 133, 129),
+(11, 8, 63, 32, 33, 46, 136, 131),
+(11, 8, 64, 32, 34, 46, 138, 134),
+(11, 8, 65, 33, 34, 47, 140, 136),
+(11, 8, 66, 33, 34, 48, 143, 138),
+(11, 8, 67, 33, 35, 48, 145, 140),
+(11, 8, 68, 33, 35, 49, 147, 142),
+(11, 8, 69, 34, 36, 49, 150, 145),
+(11, 8, 70, 34, 36, 50, 152, 147),
+(11, 8, 71, 34, 36, 51, 155, 150),
+(11, 8, 72, 34, 37, 52, 161, 153),
+(11, 8, 73, 34, 37, 53, 161, 156),
+(11, 8, 74, 35, 38, 53, 164, 158),
+(11, 8, 75, 35, 38, 54, 167, 161),
+(11, 8, 76, 35, 38, 55, 170, 164),
+(11, 8, 77, 36, 39, 56, 173, 167),
+(11, 8, 78, 36, 39, 56, 176, 170),
+(11, 8, 79, 36, 40, 57, 179, 173),
+(11, 8, 80, 37, 40, 58, 182, 176);
+
+-- player_xp_for_level
+INSERT IGNORE INTO `player_xp_for_level` (`lvl`, `xp_for_next_level`) VALUES
+(1, 400),
+(2, 900),
+(3, 1400),
+(4, 2100),
+(5, 2800),
+(6, 3600),
+(7, 4500),
+(8, 5400),
+(9, 6500),
+(10, 7600),
+(11, 8700),
+(12, 9800),
+(13, 11000),
+(14, 12300),
+(15, 13600),
+(16, 15000),
+(17, 16400),
+(18, 17800),
+(19, 19300),
+(20, 20800),
+(21, 22400),
+(22, 24000),
+(23, 25500),
+(24, 27200),
+(25, 28900),
+(26, 30500),
+(27, 32200),
+(28, 33900),
+(29, 36300),
+(30, 38800),
+(31, 41600),
+(32, 44600),
+(33, 48000),
+(34, 51400),
+(35, 55000),
+(36, 58700),
+(37, 62400),
+(38, 66200),
+(39, 70200),
+(40, 74300),
+(41, 78500),
+(42, 82800),
+(43, 87100),
+(44, 91600),
+(45, 96300),
+(46, 101000),
+(47, 105800),
+(48, 110700),
+(49, 115700),
+(50, 120900),
+(51, 126100),
+(52, 131500),
+(53, 137000),
+(54, 142500),
+(55, 148200),
+(56, 154000),
+(57, 159900),
+(58, 165800),
+(59, 172000),
+(60, 290000),
+(61, 317000),
+(62, 349000),
+(63, 386000),
+(64, 428000),
+(65, 475000),
+(66, 527000),
+(67, 585000),
+(68, 648000),
+(69, 717000),
+(70, 1523800),
+(71, 1539600),
+(72, 1555700),
+(73, 1571800),
+(74, 1587900),
+(75, 1604200),
+(76, 1620700),
+(77, 1637400),
+(78, 1653900),
+(79, 1670800);
+
+-- spell_learn_spell
+INSERT IGNORE INTO `spell_learn_spell` (`entry`, `SpellID`, `Active`) VALUES
+(71, 7376, 0),
+(768, 3025, 0),
+(783, 5419, 0),
+(1066, 5421, 0),
+(2457, 21156, 0),
+(2458, 7381, 0),
+(5487, 1178, 0),
+(5487, 21178, 0),
+(5784, 33388, 1),
+(9634, 9635, 0),
+(9634, 21178, 0),
+(13819, 33388, 1),
+(17002, 24867, 0),
+(23161, 33391, 1),
+(23214, 33391, 1),
+(24858, 24905, 0),
+(24866, 24864, 0),
+(33872, 47179, 0),
+(33873, 47180, 0),
+(33891, 5420, 0),
+(33891, 34123, 0),
+(33943, 33948, 0),
+(33943, 34090, 1),
+(33943, 34764, 0),
+(34767, 33391, 1),
+(34769, 33388, 1),
+(40123, 40121, 0),
+(40123, 40122, 0),
+(53428, 53341, 1),
+(53428, 53343, 1),
+(58984, 21009, 1);
+
+-- spell_loot_template
+-- No data yet
+
+DELETE FROM `item_template` WHERE entry IN (34648,34649,34650,34651,34652,34653,34655,34656,34657,34658,34659,38145,38147,41751);
+INSERT INTO `item_template` VALUES
+(34648,4,4,-1,'Acherus Knight\'s Greaves',51496,2,32768,1,51,10,8,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,10,7,12,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34649,4,4,-1,'Acherus Knight\'s Gauntlets',51498,2,32768,1,34,6,10,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,6,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34650,4,4,-1,'Acherus Knight\'s Tunic',51494,2,32768,1,69,13,5,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,20,7,11,32,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,570,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34651,4,4,-1,'Acherus Knight\'s Girdle',51497,2,32768,1,35,7,6,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,10,32,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,320,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34652,4,4,-1,'Acherus Knight\'s Hood',51495,2,32768,1,52,10,1,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,15,32,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,463,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34653,4,4,-1,'Acherus Knight\'s Wristguard',51500,2,32768,1,36,7,9,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,7,31,7,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34655,4,4,-1,'Acherus Knight\'s Pauldrons',51501,2,32768,1,54,10,3,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,9,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34656,4,4,-1,'Acherus Knight\'s Cover',51499,2,32768,1,73,14,7,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,13,3,10,7,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34657,4,0,-1,'Choker of Damnation',6539,2,32768,1,2303,575,2,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,9,7,8,31,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34658,4,0,-1,'Plague Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34659,4,1,-1,'Acherus Knight\'s Shroud',49738,2,32768,1,31,6,16,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38145,1,0,-1,'Deathweave Bag',1282,1,32768,1,0,0,18,-1,-1,35,0,0,0,0,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38147,4,0,-1,'Corrupted Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(41751,0,5,-1,'Black Mushroom',36728,1,0,1,100,5,0,-1,-1,65,55,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27094,0,-1,0,0,11,1000,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,'',0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0);
+
+DELETE FROM `playercreateinfo` WHERE class = 6;
+INSERT INTO `playercreateinfo` VALUES
+(1 ,6,609,4298,2355.84,-5664.77,426.028),
+(2 ,6,609,4298,2358.44,-5666.9, 426.023),
+(3 ,6,609,4298,2358.44,-5666.9, 426.023),
+(4 ,6,609,4298,2356.21,-5662.21,426.026),
+(5 ,6,609,4298,2356.21,-5662.21,426.026),
+(6 ,6,609,4298,2358.17,-5663.21,426.027),
+(7 ,6,609,4298,2355.05,-5661.7, 426.026),
+(8 ,6,609,4298,2355.05,-5661.7, 426.026),
+(10,6,609,4298,2355.84,-5664.77,426.028),
+(11,6,609,4298,2358.17,-5663.21,426.027);
+DELETE FROM `playercreateinfo` WHERE `race`=7 AND `class` IN (4,8,9);
+INSERT INTO `playercreateinfo` VALUES
+(7,4,0,1,-6240,331,383),
+(7,8,0,1,-6240,331,383),
+(7,9,0,1,-6240,331,383); \ No newline at end of file
diff --git a/sql/TBC-WLK converter/TBC-WLK_world_run_only_once.sql b/sql/TBC-WLK converter/TBC-WLK_world_run_only_once.sql
new file mode 100644
index 00000000000..798d296370c
--- /dev/null
+++ b/sql/TBC-WLK converter/TBC-WLK_world_run_only_once.sql
@@ -0,0 +1,189 @@
+DROP TABLE IF EXISTS `achievement_reward`;
+CREATE TABLE `achievement_reward` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `title_A` mediumint(8) unsigned NOT NULL default '0',
+ `title_H` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `sender` mediumint(8) unsigned NOT NULL default '0',
+ `subject` varchar(255) default NULL,
+ `text` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+
+DROP TABLE IF EXISTS `locales_achievement_reward`;
+CREATE TABLE `locales_achievement_reward` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `subject_loc1` varchar(100) NOT NULL default '',
+ `subject_loc2` varchar(100) NOT NULL default '',
+ `subject_loc3` varchar(100) NOT NULL default '',
+ `subject_loc4` varchar(100) NOT NULL default '',
+ `subject_loc5` varchar(100) NOT NULL default '',
+ `subject_loc6` varchar(100) NOT NULL default '',
+ `subject_loc7` varchar(100) NOT NULL default '',
+ `subject_loc8` varchar(100) NOT NULL default '',
+ `text_loc1` text default NULL,
+ `text_loc2` text default NULL,
+ `text_loc3` text default NULL,
+ `text_loc4` text default NULL,
+ `text_loc5` text default NULL,
+ `text_loc6` text default NULL,
+ `text_loc7` text default NULL,
+ `text_loc8` text default NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+TRUNCATE `creature_equip_template`;
+ALTER TABLE `creature_equip_template`
+ DROP COLUMN `equipinfo1`,
+ DROP COLUMN `equipinfo2`,
+ DROP COLUMN `equipinfo3`,
+ DROP COLUMN `equipslot1`,
+ DROP COLUMN `equipslot2`,
+ DROP COLUMN `equipslot3`,
+ CHANGE COLUMN `equipmodel1` `equipentry1` mediumint(8) UNSIGNED default '0' NOT NULL,
+ CHANGE COLUMN `equipmodel2` `equipentry2` mediumint(8) UNSIGNED default '0' NOT NULL,
+ CHANGE COLUMN `equipmodel3` `equipentry3` mediumint(8) UNSIGNED default '0' NOT NULL;
+UPDATE `creature_template` set equipment_id = 0;
+
+ALTER TABLE `item_template`
+ ADD COLUMN `ScalingStatDistribution` smallint(6) DEFAULT '0' NOT NULL after `stat_value10`,
+ ADD COLUMN `ScalingStatValue` smallint(6) DEFAULT '0' NOT NULL after `ScalingStatDistribution`,
+ ADD COLUMN `ItemLimitCategory` smallint(6) DEFAULT '0' NOT NULL after `ArmorDamageModifier`,
+ CHANGE COLUMN `Duration` `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time' after ArmorDamageModifier,
+ ADD COLUMN `StatsCount` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `ContainerSlots`,
+ CHANGE COLUMN `TotemCategory` `TotemCategory` mediumint(9) NOT NULL default '0';
+
+UPDATE `item_template`
+ SET `maxcount`=0 WHERE `maxcount` > 32000;
+UPDATE `item_template`
+ SET `stackable`=0 WHERE `stackable` > 32000;
+ALTER TABLE `item_template`
+ CHANGE COLUMN `maxcount` `maxcount` smallint(5) NOT NULL default '-1',
+ CHANGE COLUMN `stackable` `stackable` smallint(5) NOT NULL default '1';
+UPDATE `item_template`
+ SET `stackable`=-1 WHERE `stackable` = 0;
+
+ALTER TABLE `quest_template`
+ ADD COLUMN `PlayersSlain` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `CharTitleId`,
+ ADD COLUMN `BonusTalents` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `PlayersSlain`,
+ CHANGE COLUMN `RewHonorableKills` `RewHonorableKills` int unsigned NOT NULL default '0';
+
+DROP TABLE IF EXISTS `milling_loot_template`;
+CREATE TABLE `milling_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+DROP TABLE IF EXISTS `spell_affect`;
+CREATE TABLE `spell_affect` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `effectId` tinyint(3) unsigned NOT NULL default '0',
+ `SpellClassMask0` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask1` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask2` int(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`effectId`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+ALTER TABLE `skill_discovery_template`
+ DROP PRIMARY KEY,
+ ADD PRIMARY KEY (`spellId`,`reqSpell`),
+ ADD COLUMN `reqClass` tinyint(2) unsigned NOT NULL default '0' COMMENT 'class requirement' AFTER reqSpell;
+ALTER TABLE skill_discovery_template
+ DROP COLUMN `reqClass`,
+ ADD COLUMN `reqSkillValue` smallint(5) unsigned NOT NULL default '0' COMMENT 'skill points requirement' AFTER reqSpell;
+
+DROP TABLE IF EXISTS `player_classlevelstats`;
+CREATE TABLE `player_classlevelstats` (
+ `class` tinyint(3) unsigned NOT NULL,
+ `level` tinyint(3) unsigned NOT NULL,
+ `basehp` smallint(5) unsigned NOT NULL,
+ `basemana` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`class`,`level`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 COMMENT='Stores levels stats.';
+
+DROP TABLE IF EXISTS `player_levelstats`;
+CREATE TABLE `player_levelstats` (
+ `race` tinyint(3) unsigned NOT NULL,
+ `class` tinyint(3) unsigned NOT NULL,
+ `level` tinyint(3) unsigned NOT NULL,
+ `str` tinyint(3) unsigned NOT NULL,
+ `agi` tinyint(3) unsigned NOT NULL,
+ `sta` tinyint(3) unsigned NOT NULL,
+ `inte` tinyint(3) unsigned NOT NULL,
+ `spi` tinyint(3) unsigned NOT NULL,
+ PRIMARY KEY (`race`,`class`,`level`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 COMMENT='Stores levels stats.';
+
+DROP TABLE IF EXISTS `playercreateinfo_spell`;
+CREATE TABLE `playercreateinfo_spell` (
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `Spell` mediumint(8) unsigned NOT NULL default '0',
+ `Note` varchar(255) default NULL,
+ PRIMARY KEY (`race`,`class`,`Spell`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `playercreateinfo_action`;
+CREATE TABLE `playercreateinfo_action` (
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `button` smallint(5) unsigned NOT NULL default '0',
+ `action` smallint(5) unsigned NOT NULL default '0',
+ `type` smallint(5) unsigned NOT NULL default '0',
+ `misc` smallint(5) unsigned NOT NULL default '0',
+ KEY `playercreateinfo_race_class_index` (`race`,`class`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `spell_learn_spell`;
+CREATE TABLE `spell_learn_spell` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `SpellID` smallint(5) unsigned NOT NULL default '0',
+ `Active` tinyint(3) unsigned NOT NULL default '1',
+ PRIMARY KEY (`entry`,`SpellID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
+
+DROP TABLE IF EXISTS `spell_proc_event`;
+CREATE TABLE `spell_proc_event` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `SchoolMask` tinyint(4) NOT NULL default '0',
+ `SpellFamilyName` smallint(5) unsigned NOT NULL default '0',
+ `SpellFamilyMask0` int(10) unsigned NOT NULL default '0',
+ `SpellFamilyMask1` int(10) unsigned NOT NULL default '0',
+ `SpellFamilyMask2` int(10) unsigned NOT NULL default '0',
+ `procFlags` int(10) unsigned NOT NULL default '0',
+ `procEx` int(10) unsigned NOT NULL default '0',
+ `ppmRate` float NOT NULL default '0',
+ `CustomChance` float NOT NULL default '0',
+ `Cooldown` int(10) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `player_xp_for_level`;
+CREATE TABLE `player_xp_for_level` (
+ `lvl` int(3) unsigned NOT NULL,
+ `xp_for_next_level` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`lvl`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `spell_loot_template`;
+CREATE TABLE `spell_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; \ No newline at end of file
diff --git a/sql/characters.sql b/sql/characters.sql
index 99cfd9afe44..75bad2353e0 100644
--- a/sql/characters.sql
+++ b/sql/characters.sql
@@ -1,8 +1,8 @@
-- MySQL dump 10.11
--
--- Host: localhost Database: char_temp
+-- Host: localhost Database: characters
-- ------------------------------------------------------
--- Server version 5.0.34-log
+-- Server version 5.0.45-Debian_1ubuntu3.1-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -16,6 +16,28 @@
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
+-- Table structure for table `account_data`
+--
+
+DROP TABLE IF EXISTS `account_data`;
+CREATE TABLE `account_data` (
+ `account` int(11) unsigned NOT NULL default '0',
+ `type` int(11) unsigned NOT NULL default '0',
+ `time` bigint(11) unsigned NOT NULL default '0',
+ `data` longtext NOT NULL,
+ PRIMARY KEY (`account`,`type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `account_data`
+--
+
+LOCK TABLES `account_data` WRITE;
+/*!40000 ALTER TABLE `account_data` DISABLE KEYS */;
+/*!40000 ALTER TABLE `account_data` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `arena_team`
--
@@ -54,7 +76,8 @@ CREATE TABLE `arena_team_member` (
`wons_week` int(10) unsigned NOT NULL default '0',
`played_season` int(10) unsigned NOT NULL default '0',
`wons_season` int(10) unsigned NOT NULL default '0',
- `points_to_add` int(10) unsigned NOT NULL default '0'
+ `personal_rating` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ PRIMARY KEY (`arenateamid`,`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -108,7 +131,6 @@ CREATE TABLE `auctionhouse` (
`lastbid` int(11) NOT NULL default '0',
`startbid` int(11) NOT NULL default '0',
`deposit` int(11) NOT NULL default '0',
- `location` tinyint(3) unsigned NOT NULL default '3',
PRIMARY KEY (`id`),
UNIQUE KEY `item_guid` (`itemguid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -203,6 +225,112 @@ LOCK TABLES `bugreport` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `characters`
+--
+
+DROP TABLE IF EXISTS `characters`;
+CREATE TABLE `characters` (
+ `guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
+ `account` int(11) unsigned NOT NULL default '0' COMMENT 'Account Identifier',
+ `data` longtext,
+ `name` varchar(12) NOT NULL default '',
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ `map` int(11) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
+ `dungeon_difficulty` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `orientation` float NOT NULL default '0',
+ `taximask` longtext,
+ `online` tinyint(3) unsigned NOT NULL default '0',
+ `cinematic` tinyint(3) unsigned NOT NULL default '0',
+ `totaltime` int(11) unsigned NOT NULL default '0',
+ `leveltime` int(11) unsigned NOT NULL default '0',
+ `logout_time` bigint(20) unsigned NOT NULL default '0',
+ `is_logout_resting` tinyint(3) unsigned NOT NULL default '0',
+ `rest_bonus` float NOT NULL default '0',
+ `resettalents_cost` int(11) unsigned NOT NULL default '0',
+ `resettalents_time` bigint(20) unsigned NOT NULL default '0',
+ `trans_x` float NOT NULL default '0',
+ `trans_y` float NOT NULL default '0',
+ `trans_z` float NOT NULL default '0',
+ `trans_o` float NOT NULL default '0',
+ `transguid` bigint(20) unsigned NOT NULL default '0',
+ `extra_flags` int(11) unsigned NOT NULL default '0',
+ `stable_slots` tinyint(1) unsigned NOT NULL default '0',
+ `at_login` int(11) unsigned NOT NULL default '0',
+ `zone` int(11) unsigned NOT NULL default '0',
+ `death_expire_time` bigint(20) unsigned NOT NULL default '0',
+ `taxi_path` text,
+ `arena_pending_points` int(10) UNSIGNED NOT NULL default '0',
+ `latency` int(11) unsigned NOT NULL default '0',
+ `bgid` int(10) unsigned NOT NULL default '0',
+ `bgteam` int(10) unsigned NOT NULL default '0',
+ `bgmap` int(10) unsigned NOT NULL default '0',
+ `bgx` float NOT NULL default '0',
+ `bgy` float NOT NULL default '0',
+ `bgz` float NOT NULL default '0',
+ `bgo` float NOT NULL default '0',
+ PRIMARY KEY (`guid`),
+ KEY `idx_account` (`account`),
+ KEY `idx_online` (`online`),
+ KEY `idx_name` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
+
+--
+-- Dumping data for table `characters`
+--
+
+LOCK TABLES `characters` WRITE;
+/*!40000 ALTER TABLE `characters` DISABLE KEYS */;
+/*!40000 ALTER TABLE `characters` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `character_achievement`
+--
+
+DROP TABLE IF EXISTS `character_achievement`;
+CREATE TABLE `character_achievement` (
+ `guid` int(11) NOT NULL,
+ `achievement` int(11) NOT NULL,
+ `date` int(11) NOT NULL,
+ PRIMARY KEY (`guid`,`achievement`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `character_achievement`
+--
+
+LOCK TABLES `character_achievement` WRITE;
+/*!40000 ALTER TABLE `character_achievement` DISABLE KEYS */;
+/*!40000 ALTER TABLE `character_achievement` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `character_achievement_progress`
+--
+
+DROP TABLE IF EXISTS `character_achievement_progress`;
+CREATE TABLE `character_achievement_progress` (
+ `guid` int(11) NOT NULL,
+ `criteria` int(11) NOT NULL,
+ `counter` int(11) NOT NULL,
+ `date` int(11) NOT NULL,
+ PRIMARY KEY (`guid`,`criteria`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `character_achievement_progress`
+--
+
+LOCK TABLES `character_achievement_progress` WRITE;
+/*!40000 ALTER TABLE `character_achievement_progress` DISABLE KEYS */;
+/*!40000 ALTER TABLE `character_achievement_progress` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `character_action`
--
@@ -235,6 +363,7 @@ CREATE TABLE `character_aura` (
`caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier',
`spell` int(11) unsigned NOT NULL default '0',
`effect_index` int(11) unsigned NOT NULL default '0',
+ `stackcount` int(11) NOT NULL default '1',
`amount` int(11) NOT NULL default '0',
`maxduration` int(11) NOT NULL default '0',
`remaintime` int(11) NOT NULL default '0',
@@ -383,9 +512,7 @@ CREATE TABLE `character_pet` (
`level` int(11) unsigned NOT NULL default '1',
`exp` int(11) unsigned NOT NULL default '0',
`Reactstate` tinyint(1) unsigned NOT NULL default '0',
- `loyaltypoints` int(11) NOT NULL default '0',
- `loyalty` int(11) unsigned NOT NULL default '0',
- `trainpoint` int(11) NOT NULL default '0',
+ `talentpoints` int(11) unsigned NOT NULL default '0',
`name` varchar(100) default 'Pet',
`renamed` tinyint(1) unsigned NOT NULL default '0',
`slot` int(11) unsigned NOT NULL default '0',
@@ -424,7 +551,7 @@ CREATE TABLE `character_pet_declinedname` (
`instrumental` varchar(12) NOT NULL default '',
`prepositional` varchar(12) NOT NULL default '',
PRIMARY KEY (`id`),
- KEY `owner_key` (`owner`)
+ KEY owner_key (`owner`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
--
@@ -521,7 +648,7 @@ CREATE TABLE `character_social` (
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Character Global Unique Identifier',
`friend` int(11) unsigned NOT NULL default '0' COMMENT 'Friend Global Unique Identifier',
`flags` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Friend Flags',
- `note` varchar(48) NOT NULL default '' COMMENT 'Friend Note',
+ `note` varchar(48) NOT NULL DEFAULT '' COMMENT 'Friend Note',
PRIMARY KEY (`guid`,`friend`,`flags`),
KEY `guid` (`guid`),
KEY `friend` (`friend`),
@@ -546,7 +673,6 @@ DROP TABLE IF EXISTS `character_spell`;
CREATE TABLE `character_spell` (
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
`spell` int(11) unsigned NOT NULL default '0' COMMENT 'Spell Identifier',
- `slot` int(11) unsigned NOT NULL default '0',
`active` tinyint(3) unsigned NOT NULL default '1',
`disabled` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`guid`,`spell`)
@@ -584,28 +710,6 @@ LOCK TABLES `character_spell_cooldown` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `character_ticket`
---
-
-DROP TABLE IF EXISTS `character_ticket`;
-CREATE TABLE `character_ticket` (
- `ticket_id` int(11) unsigned NOT NULL auto_increment,
- `guid` int(11) unsigned NOT NULL default '0',
- `ticket_text` text,
- `ticket_lastchange` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
- PRIMARY KEY (`ticket_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
-
---
--- Dumping data for table `character_ticket`
---
-
-LOCK TABLES `character_ticket` WRITE;
-/*!40000 ALTER TABLE `character_ticket` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_ticket` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `character_tutorial`
--
@@ -622,7 +726,7 @@ CREATE TABLE `character_tutorial` (
`tut6` int(11) unsigned NOT NULL default '0',
`tut7` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`account`,`realmid`),
- KEY `acc_key` (`account`)
+ KEY acc_key (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
--
@@ -635,62 +739,6 @@ LOCK TABLES `character_tutorial` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `characters`
---
-
-DROP TABLE IF EXISTS `characters`;
-CREATE TABLE `characters` (
- `guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
- `account` int(11) unsigned NOT NULL default '0' COMMENT 'Account Identifier',
- `data` longtext,
- `name` varchar(12) NOT NULL default '',
- `race` tinyint(3) unsigned NOT NULL default '0',
- `class` tinyint(3) unsigned NOT NULL default '0',
- `position_x` float NOT NULL default '0',
- `position_y` float NOT NULL default '0',
- `position_z` float NOT NULL default '0',
- `map` int(11) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
- `dungeon_difficulty` tinyint(1) unsigned NOT NULL default '0',
- `orientation` float NOT NULL default '0',
- `taximask` longtext,
- `online` tinyint(3) unsigned NOT NULL default '0',
- `cinematic` tinyint(3) unsigned NOT NULL default '0',
- `totaltime` int(11) unsigned NOT NULL default '0',
- `leveltime` int(11) unsigned NOT NULL default '0',
- `logout_time` bigint(20) unsigned NOT NULL default '0',
- `is_logout_resting` tinyint(3) unsigned NOT NULL default '0',
- `rest_bonus` float NOT NULL default '0',
- `resettalents_cost` int(11) unsigned NOT NULL default '0',
- `resettalents_time` bigint(20) unsigned NOT NULL default '0',
- `trans_x` float NOT NULL default '0',
- `trans_y` float NOT NULL default '0',
- `trans_z` float NOT NULL default '0',
- `trans_o` float NOT NULL default '0',
- `transguid` bigint(20) unsigned NOT NULL default '0',
- `extra_flags` int(11) unsigned NOT NULL default '0',
- `stable_slots` tinyint(1) unsigned NOT NULL default '0',
- `at_login` int(11) unsigned NOT NULL default '0',
- `zone` int(11) unsigned NOT NULL default '0',
- `death_expire_time` bigint(20) unsigned NOT NULL default '0',
- `taxi_path` text,
- `arena_pending_points` int (10) UNSIGNED NOT NULL default '0',
- `latency` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`guid`),
- KEY `idx_account` (`account`),
- KEY `idx_online` (`online`),
- KEY `idx_name` (`name`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
-
---
--- Dumping data for table `characters`
---
-
-LOCK TABLES `characters` WRITE;
-/*!40000 ALTER TABLE `characters` DISABLE KEYS */;
-/*!40000 ALTER TABLE `characters` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `corpse`
--
@@ -704,6 +752,7 @@ CREATE TABLE `corpse` (
`orientation` float NOT NULL default '0',
`zone` int(11) unsigned NOT NULL default '38' COMMENT 'Zone Identifier',
`map` int(11) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
+ `phaseMask` smallint(5) unsigned NOT NULL default '1',
`data` longtext,
`time` bigint(20) unsigned NOT NULL default '0',
`corpse_type` tinyint(3) unsigned NOT NULL default '0',
@@ -775,7 +824,7 @@ CREATE TABLE `gm_tickets` (
`name` varchar(15) NOT NULL,
`message` text NOT NULL,
`timestamp` int(10) NOT NULL default '0',
- `closed` tinyint(1) NOT NULL default '0',
+ `closed` int(10) NOT NULL default '0',
`assignedto` int(10) NOT NULL default '0',
`comment` text NOT NULL,
PRIMARY KEY (`guid`)
@@ -791,6 +840,40 @@ LOCK TABLES `gm_tickets` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `groups`
+--
+
+DROP TABLE IF EXISTS `groups`;
+CREATE TABLE `groups` (
+ `leaderGuid` int(11) unsigned NOT NULL,
+ `mainTank` int(11) unsigned NOT NULL,
+ `mainAssistant` int(11) unsigned NOT NULL,
+ `lootMethod` tinyint(4) unsigned NOT NULL,
+ `looterGuid` int(11) unsigned NOT NULL,
+ `lootThreshold` tinyint(4) unsigned NOT NULL,
+ `icon1` int(11) unsigned NOT NULL,
+ `icon2` int(11) unsigned NOT NULL,
+ `icon3` int(11) unsigned NOT NULL,
+ `icon4` int(11) unsigned NOT NULL,
+ `icon5` int(11) unsigned NOT NULL,
+ `icon6` int(11) unsigned NOT NULL,
+ `icon7` int(11) unsigned NOT NULL,
+ `icon8` int(11) unsigned NOT NULL,
+ `isRaid` tinyint(1) unsigned NOT NULL,
+ `difficulty` tinyint(3) unsigned NOT NULL default '0',
+ PRIMARY KEY (`leaderGuid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Groups';
+
+--
+-- Dumping data for table `groups`
+--
+
+LOCK TABLES `groups` WRITE;
+/*!40000 ALTER TABLE `groups` DISABLE KEYS */;
+/*!40000 ALTER TABLE `groups` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `group_instance`
--
@@ -835,40 +918,6 @@ LOCK TABLES `group_member` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `groups`
---
-
-DROP TABLE IF EXISTS `groups`;
-CREATE TABLE `groups` (
- `leaderGuid` int(11) unsigned NOT NULL,
- `mainTank` int(11) unsigned NOT NULL,
- `mainAssistant` int(11) unsigned NOT NULL,
- `lootMethod` tinyint(4) unsigned NOT NULL,
- `looterGuid` int(11) unsigned NOT NULL,
- `lootThreshold` tinyint(4) unsigned NOT NULL,
- `icon1` int(11) unsigned NOT NULL,
- `icon2` int(11) unsigned NOT NULL,
- `icon3` int(11) unsigned NOT NULL,
- `icon4` int(11) unsigned NOT NULL,
- `icon5` int(11) unsigned NOT NULL,
- `icon6` int(11) unsigned NOT NULL,
- `icon7` int(11) unsigned NOT NULL,
- `icon8` int(11) unsigned NOT NULL,
- `isRaid` tinyint(1) unsigned NOT NULL,
- `difficulty` tinyint(3) unsigned NOT NULL default '0',
- PRIMARY KEY (`leaderGuid`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Groups';
-
---
--- Dumping data for table `groups`
---
-
-LOCK TABLES `groups` WRITE;
-/*!40000 ALTER TABLE `groups` DISABLE KEYS */;
-/*!40000 ALTER TABLE `groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `guild`
--
@@ -937,7 +986,7 @@ CREATE TABLE `guild_bank_item` (
`SlotId` tinyint(3) unsigned NOT NULL default '0',
`item_guid` int(11) unsigned NOT NULL default '0',
`item_entry` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`guildid`,`TabId`,`SlotId`),
+ PRIMARY KEY (`guildid`,`tabid`,`slotid`),
KEY `guildid_key` (`guildid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -984,7 +1033,7 @@ CREATE TABLE `guild_bank_tab` (
`TabId` tinyint(1) unsigned NOT NULL default '0',
`TabName` varchar(100) NOT NULL default '',
`TabIcon` varchar(100) NOT NULL default '',
- `TabText` varchar(500) NOT NULL default '',
+ `TabText` text,
PRIMARY KEY (`guildid`,`TabId`),
KEY `guildid_key` (`guildid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -1011,7 +1060,7 @@ CREATE TABLE `guild_eventlog` (
`PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2',
`NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)',
`TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time'
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Guild Eventlog';
+) ENGINE = InnoDB DEFAULT CHARSET = latin1 COMMENT 'Guild Eventlog';
--
-- Dumping data for table `guild_eventlog`
@@ -1049,7 +1098,7 @@ CREATE TABLE `guild_member` (
`BankRemSlotsTab5` int(11) unsigned NOT NULL default '0',
KEY `guildid_key` (`guildid`),
KEY `guildid_rank_key` (`guildid`,`rank`),
- KEY `guid_key` (`guid`)
+ UNIQUE KEY `guid_key` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Guild System';
--
@@ -1085,25 +1134,6 @@ LOCK TABLES `guild_rank` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `has_logged_in_before`
---
-
-DROP TABLE IF EXISTS `has_logged_in_before`;
-CREATE TABLE `has_logged_in_before` (
- `guid` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`guid`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='ImpConfig check';
-
---
--- Dumping data for table `has_logged_in_before`
---
-
-LOCK TABLES `has_logged_in_before` WRITE;
-/*!40000 ALTER TABLE `has_logged_in_before` DISABLE KEYS */;
-/*!40000 ALTER TABLE `has_logged_in_before` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `instance`
--
@@ -1256,6 +1286,7 @@ CREATE TABLE `pet_aura` (
`caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier',
`spell` int(11) unsigned NOT NULL default '0',
`effect_index` int(11) unsigned NOT NULL default '0',
+ `stackcount` int(11) NOT NULL default '1',
`amount` int(11) NOT NULL default '0',
`maxduration` int(11) NOT NULL default '0',
`remaintime` int(11) NOT NULL default '0',
@@ -1280,7 +1311,6 @@ DROP TABLE IF EXISTS `pet_spell`;
CREATE TABLE `pet_spell` (
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
`spell` int(11) unsigned NOT NULL default '0' COMMENT 'Spell Identifier',
- `slot` int(11) unsigned NOT NULL default '0',
`active` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`guid`,`spell`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Pet System';
@@ -1360,6 +1390,7 @@ LOCK TABLES `petition_sign` WRITE;
/*!40000 ALTER TABLE `petition_sign` DISABLE KEYS */;
/*!40000 ALTER TABLE `petition_sign` ENABLE KEYS */;
UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
--
-- Table structure for table `saved_variables`
@@ -1367,7 +1398,7 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `saved_variables`;
CREATE TABLE `saved_variables` (
- `NextArenaPointDistributionTime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
+ `NextArenaPointDistributionTime` bigint(40) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves';
--
@@ -1380,6 +1411,7 @@ LOCK TABLES `saved_variables` WRITE;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
@@ -1388,5 +1420,6 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2008-11-18 11:24:11
+-- Dump completed on 2008-01-10 11:37:06
+-- Updated on 2003-02-22 01:44:45 \ No newline at end of file
diff --git a/sql/mangos.sql b/sql/mangos.sql
new file mode 100644
index 00000000000..0b46f3f9efd
--- /dev/null
+++ b/sql/mangos.sql
@@ -0,0 +1,17847 @@
+-- MySQL dump 10.11
+--
+-- Host: localhost Database: mangos
+-- ------------------------------------------------------
+-- Server version 5.0.56-nt
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `db_version`
+--
+
+DROP TABLE IF EXISTS `db_version`;
+CREATE TABLE `db_version` (
+ `version` varchar(120) default NULL,
+ `required_7332_01_mangos_command` bit(1) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
+
+--
+-- Dumping data for table `db_version`
+--
+
+LOCK TABLES `db_version` WRITE;
+/*!40000 ALTER TABLE `db_version` DISABLE KEYS */;
+INSERT INTO `db_version` VALUES
+('Mangos default database.',NULL);
+/*!40000 ALTER TABLE `db_version` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `achievement_reward`
+--
+
+DROP TABLE IF EXISTS `achievement_reward`;
+CREATE TABLE `achievement_reward` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `title_A` mediumint(8) unsigned NOT NULL default '0',
+ `title_H` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `sender` mediumint(8) unsigned NOT NULL default '0',
+ `subject` varchar(255) default NULL,
+ `text` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `achievement_reward`
+--
+
+LOCK TABLES `achievement_reward` WRITE;
+/*!40000 ALTER TABLE `achievement_reward` DISABLE KEYS */;
+/*!40000 ALTER TABLE `achievement_reward` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `areatrigger_involvedrelation`
+--
+
+DROP TABLE IF EXISTS `areatrigger_involvedrelation`;
+CREATE TABLE `areatrigger_involvedrelation` (
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Identifier',
+ `quest` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Trigger System';
+
+--
+-- Dumping data for table `areatrigger_involvedrelation`
+--
+
+LOCK TABLES `areatrigger_involvedrelation` WRITE;
+/*!40000 ALTER TABLE `areatrigger_involvedrelation` DISABLE KEYS */;
+/*!40000 ALTER TABLE `areatrigger_involvedrelation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `areatrigger_scripts`
+--
+
+DROP TABLE IF EXISTS `areatrigger_scripts`;
+CREATE TABLE `areatrigger_scripts` (
+ `entry` MEDIUMINT( 8 ) NOT NULL ,
+ `ScriptName` CHAR( 64 ) NOT NULL ,
+ PRIMARY KEY ( `entry` )
+) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `areatrigger_scripts`
+--
+
+LOCK TABLES `areatrigger_scripts` WRITE;
+/*!40000 ALTER TABLE `areatrigger_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `areatrigger_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `areatrigger_tavern`
+--
+
+DROP TABLE IF EXISTS `areatrigger_tavern`;
+CREATE TABLE `areatrigger_tavern` (
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Identifier',
+ `name` text,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Trigger System';
+
+--
+-- Dumping data for table `areatrigger_tavern`
+--
+
+LOCK TABLES `areatrigger_tavern` WRITE;
+/*!40000 ALTER TABLE `areatrigger_tavern` DISABLE KEYS */;
+/*!40000 ALTER TABLE `areatrigger_tavern` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `areatrigger_teleport`
+--
+
+DROP TABLE IF EXISTS `areatrigger_teleport`;
+CREATE TABLE `areatrigger_teleport` (
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Identifier',
+ `name` text,
+ `required_level` tinyint(3) unsigned NOT NULL default '0',
+ `required_item` mediumint(8) unsigned NOT NULL default '0',
+ `required_item2` mediumint(8) unsigned NOT NULL default '0',
+ `heroic_key` mediumint(8) unsigned NOT NULL default '0',
+ `heroic_key2` mediumint(8) unsigned NOT NULL default '0',
+ `required_quest_done` int(11) unsigned NOT NULL default '0',
+ `required_failed_text` text,
+ `target_map` smallint(5) unsigned NOT NULL default '0',
+ `target_position_x` float NOT NULL default '0',
+ `target_position_y` float NOT NULL default '0',
+ `target_position_z` float NOT NULL default '0',
+ `target_orientation` float NOT NULL default '0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Trigger System';
+
+--
+-- Dumping data for table `areatrigger_teleport`
+--
+
+LOCK TABLES `areatrigger_teleport` WRITE;
+/*!40000 ALTER TABLE `areatrigger_teleport` DISABLE KEYS */;
+/*!40000 ALTER TABLE `areatrigger_teleport` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `battleground_template`
+--
+
+DROP TABLE IF EXISTS `battleground_template`;
+CREATE TABLE `battleground_template` (
+ `id` mediumint(8) unsigned NOT NULL,
+ `MinPlayersPerTeam` smallint(5) unsigned NOT NULL default '0',
+ `MaxPlayersPerTeam` smallint(5) unsigned NOT NULL default '0',
+ `MinLvl` tinyint(3) unsigned NOT NULL default '0',
+ `MaxLvl` tinyint(3) unsigned NOT NULL default '0',
+ `AllianceStartLoc` mediumint(8) unsigned NOT NULL,
+ `AllianceStartO` float NOT NULL,
+ `HordeStartLoc` mediumint(8) unsigned NOT NULL,
+ `HordeStartO` float NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `battleground_template`
+--
+
+LOCK TABLES `battleground_template` WRITE;
+/*!40000 ALTER TABLE `battleground_template` DISABLE KEYS */;
+INSERT INTO `battleground_template` VALUES
+(1,0,0,0,0,611,2.72532,610,2.27452),
+(2,0,0,0,0,769,3.14159,770,3.14159),
+(4,0,2,10,70,929,0,936,3.14159),
+(3,0,0,0,0,890,3.40156,889,0.263892),
+(5,0,2,10,70,939,0,940,3.14159),
+(6,0,2,10,70,0,0,0,0),
+(7,0,0,0,0,1103,3.40156,1104,0.263892),
+(8,0,2,10,70,1258,0,1259,3.14159),
+(9,0,0,0,0,1367,0,1368,0),
+(10,5,5,10,80,1362,0,1363,0),
+(11,5,5,10,80,1364,0,1365,0);
+/*!40000 ALTER TABLE `battleground_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `battlemaster_entry`
+--
+
+DROP TABLE IF EXISTS `battlemaster_entry`;
+CREATE TABLE `battlemaster_entry` (
+ `entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Entry of a creature',
+ `bg_template` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Battleground template id',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `battlemaster_entry`
+--
+
+LOCK TABLES `battlemaster_entry` WRITE;
+/*!40000 ALTER TABLE `battlemaster_entry` DISABLE KEYS */;
+/*!40000 ALTER TABLE `battlemaster_entry` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `command`
+--
+
+DROP TABLE IF EXISTS `command`;
+CREATE TABLE `command` (
+ `name` varchar(50) NOT NULL default '',
+ `security` tinyint(3) unsigned NOT NULL default '0',
+ `help` longtext,
+ PRIMARY KEY (`name`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Chat System';
+
+--
+-- Dumping data for table `command`
+--
+
+LOCK TABLES `command` WRITE;
+/*!40000 ALTER TABLE `command` DISABLE KEYS */;
+INSERT INTO `command` VALUES
+('account',0,'Syntax: .account\r\n\r\nDisplay the access level of your account.'),
+('account create',4,'Syntax: .account create $account $password\r\n\r\nCreate account and set password to it.'),
+('account delete',4,'Syntax: .account delete $account\r\n\r\nDelete account with all characters.'),
+('account onlinelist',4,'Syntax: .account onlinelist\r\n\r\nShow list of online accounts.'),
+('account set addon',3,'Syntax: .account set addon [$account] #addon\r\n\r\nSet user (possible targeted) expansion addon level allowed. Addon values: 0 - normal, 1 - tbc, 2 - wotlk.'),
+('account set gmlevel',4,'Syntax: .account set gmlevel [$account] #level\r\n\r\nSet the security level for targeted player (can''t be used at self) or for account $name to a level of #level.\r\n\r\n#level may range from 0 to 3.'),
+('account set password',4,'Syntax: .account set password $account $password $password\r\n\r\nSet password for account.'),
+('additem',3,'Syntax: .additem #itemid/[#itemname]/#shift-click-item-link #itemcount\r\n\r\nAdds the specified number of items of id #itemid (or exact (!) name $itemname in brackets, or link created by shift-click at item in inventory or recipe) to your or selected character inventory. If #itemcount is omitted, only one item will be added.\r\n.'),
+('additemset',3,'Syntax: .additemset #itemsetid\r\n\r\nAdd items from itemset of id #itemsetid to your or selected character inventory. Will add by one example each item from itemset.'),
+('addmove',2,'Syntax: .addmove #creature_guid [#waittime]\r\n\r\nAdd your current location as a waypoint for creature with guid #creature_guid. And optional add wait time.'),
+('announce',1,'Syntax: .announce $MessageToBroadcast\r\n\r\nSend a global message to all players online in chat log.'),
+('aura',3,'Syntax: .aura #spellid\r\n\r\nAdd the aura from spell #spellid to the selected Unit.'),
+('ban account',3,'Syntax: .ban account $Name $bantime $reason\r\nBan account kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban character',3,'Syntax: .ban character $Name $bantime $reason\r\nBan account and kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban ip',3,'Syntax: .ban ip $Ip $bantime $reason\r\nBan IP.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('baninfo account',3,'Syntax: .baninfo account\r\nWatch full information about a specific ban.'),
+('baninfo character',3,'Syntax: .baninfo character\r\nWatch full information about a specific ban.'),
+('baninfo ip',3,'Syntax: .baninfo ip\r\nWatch full information about a specific ban.'),
+('bank',3,'Syntax: .bank\r\n\r\nShow your bank inventory.'),
+('banlist account',3,'Syntax: .banlist account [$Name]\r\nSearches the banlist for a account name pattern or show full list account bans.'),
+('banlist character',3,'Syntax: .banlist character $Name\r\nSearches the banlist for a character name pattern. Pattern required.'),
+('banlist ip',3,'Syntax: .banlist ip [$Ip]\r\nSearches the banlist for a IP pattern or show full list of IP bans.'),
+('cast',3,'Syntax: .cast #spellid [triggered]\r\n Cast #spellid to selected target. If no target selected cast to self. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast back',3,'Syntax: .cast back #spellid [triggered]\r\n Selected target will cast #spellid to your character. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast dist',3,'Syntax: .cast dist #spellid [#dist [triggered]]\r\n You will cast spell to pint at distance #dist. If \'trigered\' or part provided then spell casted with triggered flag. Not all spells can be casted as area spells.'),
+('cast self',3,'Syntax: .cast self #spellid [triggered]\r\nCast #spellid by target at target itself. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast target',3,'Syntax: .cast target #spellid [triggered]\r\n Selected target will cast #spellid to his victim. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('chardelete',4,'Syntax: .chardelete $charactername\r\n\r\nDelete character.'),
+('combatstop',2,'Syntax: .combatstop [$playername]\r\nStop combat for selected character. If selected non-player then command applied to self. If $playername provided then attempt applied to online player $playername.'),
+('commands',0,'Syntax: .commands\r\n\r\nDisplay a list of available commands for your account level.'),
+('cooldown',3,'Syntax: .cooldown [#spell_id]\r\n\r\nRemove all (if spell_id not provided) or #spel_id spell cooldown from selected character or you (if no selection).'),
+('damage',3,'Syntax: .damage $damage_amount [$school [$spellid]]\r\n\r\nApply $damage to target. If not $school and $spellid provided then this flat clean melee damage without any modifiers. If $school provided then damage modified by armor reduction (if school physical), and target absorbing modifiers and result applied as melee damage to target. If spell provided then damage modified and applied as spell damage. $spellid can be shift-link.'),
+('debug anim',2,'Syntax: .debug anim #emoteid\r\n\r\nPlay emote #emoteid for your character.'),
+('debug arena',3,'Syntax: .debug arena\r\n\r\nToggle debug mode for arenas. In debug mode GM can start arena with single player.'),
+('debug bg',3,'Syntax: .debug bg\r\n\r\nToggle debug mode for battlegrounds. In debug mode GM can start battleground with single player.'),
+('debug getvalue',3,'Syntax: .debug getvalue #field #isInt\r\n\r\nGet the field #field of the selected creature. If no creature is selected, get the content of your field.\r\n\r\nUse a #isInt of value 1 if the expected field content is an integer.'),
+('debug playsound',1,'Syntax: .debug playsound #soundid\r\n\r\nPlay sound with #soundid.\r\nSound will be play only for you. Other players do not hear this.\r\nWarning: client may have more 5000 sounds...'),
+('debug setvalue',3,'Syntax: .debug setvalue #field #value #isInt\r\n\r\nSet the field #field of the selected creature with value #value. If no creature is selected, set the content of your field.\r\n\r\nUse a #isInt of value 1 if #value is an integer.'),
+('debug standstate',2,'Syntax: .debug standstate #emoteid\r\n\r\nChange the emote of your character while standing to #emoteid.'),
+('debug update',3,'Syntax: .debug update #field #value\r\n\r\nUpdate the field #field of the selected character or creature with value #value.\r\n\r\nIf no #value is provided, display the content of field #field.'),
+('delticket',2,'Syntax: .delticket all\r\n .delticket #num\r\n .delticket $character_name\r\n\rall to dalete all tickets at server, $character_name to delete ticket of this character, #num to delete ticket #num.'),
+('demorph',2,'Syntax: .demorph\r\n\r\nDemorph the selected player.'),
+('die',3,'Syntax: .die\r\n\r\nKill the selected player. If no player is selected, it will kill you.'),
+('dismount',0,'Syntax: .dismount\r\n\r\nDismount you, if you are mounted.'),
+('distance',3,'Syntax: .distance [$name/$link]\r\n\r\nDisplay the distance from your character to the selected creature/player, or player with name $name, or player/creature/gameobject pointed to shift-link with guid.'),
+('event',2,'Syntax: .event #event_id\r\nShow details about event with #event_id.'),
+('event activelist',2,'Syntax: .event activelist\r\nShow list of currently active events.'),
+('event start',2,'Syntax: .event start #event_id\r\nStart event #event_id. Set start time for event to current moment (change not saved in DB).'),
+('event stop',2,'Syntax: .event stop #event_id\r\nStop event #event_id. Set start time for event to time in past that make current moment is event stop time (change not saved in DB).'),
+('explorecheat',3,'Syntax: .explorecheat #flag\r\n\r\nReveal or hide all maps for the selected player. If no player is selected, hide or reveal maps to you.\r\n\r\nUse a #flag of value 1 to reveal, use a #flag value of 0 to hide all maps.'),
+('flusharenapoints','3','Syntax: .flusharenapoints\r\n\r\nUse it to distribute arena points based on arena team ratings, and start a new week.'),
+('gm',1,'Syntax: .gm [on/off]\r\n\r\nEnable or Disable in game GM MODE or show current state of on/off not provided.'),
+('gm chat',1,'Syntax: .gm chat [on/off]\r\n\r\nEnable or disable chat GM MODE (show gm badge in messages) or show current state of on/off not provided.'),
+('gm fly',3,'Syntax: .gm fly [on/off]\r\nEnable/disable gm fly mode.'),
+('gm ingame',0,'Syntax: .gm ingame\r\n\r\nDisplay a list of available in game Game Masters.'),
+('gm list',3,'Syntax: .gm list\r\n\r\nDisplay a list of all Game Masters accounts and security levels.'),
+('gm online',0,'Syntax: .gm online\r\n\r\nDisplay a list of available Game Masters.'),
+('gm visible',1,'Syntax: .gm visible on/off\r\n\r\nOutput current visibility state or make GM visible(on) and invisible(off) for other players.'),
+('go creature',2,'Syntax: .go creature #creature_guid\r\nTeleport your character to creature with guid #creature_guid.\r\n.gocreature #creature_name\r\nTeleport your character to creature with this name.\r\n.gocreature id #creature_id\r\nTeleport your character to a creature that was spawned from the template with this entry.\r\n*If* more than one creature is found, then you are teleported to the first that is found inside the database.'),
+('go graveyard',2,'Syntax: .go graveyard #graveyardId\r\n Teleport to graveyard with the graveyardId specified.'),
+('go grid',1,'Syntax: .go grid #gridX #gridY [#mapId]\r\n\r\nTeleport the gm to center of grid with provided indexes at map #mapId (or current map if it not provided).'),
+('go object',1,'Syntax: .go object #object_guid\r\nTeleport your character to gameobject with guid #object_guid'),
+('go trigger',2,'Syntax: .go trigger #trigger_id\r\n\r\nTeleport your character to areatrigger with id #trigger_id. Character will be teleported to trigger target if selected areatrigger is telporting trigger.'),
+('go xy',1,'Syntax: .go xy #x #y [#mapid]\r\n\r\nTeleport player to point with (#x,#y) coordinates at ground(water) level at map #mapid or same map if #mapid not provided.'),
+('go xyz',1,'Syntax: .go xyz #x #y #z [#mapid]\r\n\r\nTeleport player to point with (#x,#y,#z) coordinates at ground(water) level at map #mapid or same map if #mapid not provided.'),
+('go zonexy',1,'Syntax: .go zonexy #x #y [#zone]\r\n\r\nTeleport player to point with (#x,#y) client coordinates at ground(water) level in zone #zoneid or current zone if #zoneid not provided. You can look up zone using .lookup area $namepart'),
+('gobject add',2,'Syntax: .gobject add #id <spawntimeSecs>\r\n\r\nAdd a game object from game object templates to the world at your current location using the #id.\r\nspawntimesecs sets the spawntime, it is optional.\r\n\r\nNote: this is a copy of .gameobject.'),
+('gobject delete',2,'Syntax: .gobject delete #go_guid\r\nDelete gameobject with guid #go_guid.'),
+('gobject move',2,'Syntax: .gobject move #goguid [#x #y #z]\r\n\r\nMove gameobject #goguid to character coordinates (or to (#x,#y,#z) coordinates if its provide).'),
+('gobject near',3,'Syntax: .gobject near [#distance]\r\n\r\nOutput gameobjects at distance #distance from player. Output gameobject guids and coordinates sorted by distance from character. If #distance not provided use 10 as default value.'),
+('gobject phase',3,'Syntax: .gobject phase #guid #phasemask\r\n\r\nGameobject with DB guid #guid phasemask changed to #phasemask with related world vision update for players. Gameobject state saved to DB and persistent.'),
+('gobject turn',2,'Syntax: .gobject turn #goguid \r\n\r\nSet for gameobject #goguid orientation same as current character orientation.'),
+('gobject target',2,'Syntax: .gobject target [#go_id|#go_name_part]\r\n\r\nLocate and show position nearest gameobject. If #go_id or #go_name_part provide then locate and show position of nearest gameobject with gameobject template id #go_id or name included #go_name_part as part.'),
+('goname',1,'Syntax: .goname $charactername\r\n\r\nTeleport to the given character. Either specify the character name or click on the character\'s portrait, e.g. when you are in a group.'),
+('gps',1,'Syntax: .gps [$name|$shift-link]\r\n\r\nDisplay the position information for a selected character or creature (also if player name $name provided then for named player, or if creature/gameobject shift-link provided then pointed creature/gameobject if it loaded). Position information includes X, Y, Z, and orientation, map Id and zone Id'),
+('groupgo',1,'Syntax: .groupgo $charactername\r\n\r\nTeleport the given character and his group to you.'),
+('guid',2,'Syntax: .guid\r\n\r\nDisplay the GUID for the selected character.'),
+('guild create',2,'Syntax: .guild create $GuildLeaderName $GuildName\r\n\r\nCreate a guild named $GuildName with the player $GuildLeaderName as leader.'),
+('guild delete',2,'Syntax: .guild delete $GuildName\r\n\r\nDelete guild $GuildName.'),
+('guild invite',2,'Syntax: .guild invite $CharacterName $GuildName\r\n\r\nAdd $CharacterName into a guild $GuildName.'),
+('guild rank',2,'Syntax: .guild rank $CharacterName #Rank\r\n\r\nSet for $CharacterName rank #Rank in a guild.'),
+('guild uninvite',2,'Syntax: .guild uninvite $CharacterName\r\n\r\nRemove $CharacterName from a guild.'),
+('help',0,'Syntax: .help [$command]\r\n\r\nDisplay usage instructions for the given $command. If no $command provided show list available commands.'),
+('hidearea',3,'Syntax: .hidearea #areaid\r\n\r\nHide the area of #areaid to the selected character. If no character is selected, hide this area to you.'),
+('honor add',2,'Syntax: .honor add $amount\r\n\r\nAdd a certain amount of honor (gained today) to the selected player.'),
+('honor addkill',2,'Syntax: .honor addkikll\r\n\r\nAdd the targeted unit as one of your pvp kills today (you only get honor if it\'s a racial leader or a player)'),
+('honor update',2,'Syntax: .honor update\r\n\r\nForce the yesterday\'s honor fields to be updated with today\'s data, which will get reset for the selected player.'),
+('hover',3,'Syntax: .hover #flag\r\n\r\nEnable or disable hover mode for your character.\r\n\r\nUse a #flag of value 1 to enable, use a #flag value of 0 to disable hover.'),
+('instance unbind',3,'Syntax: .instance unbind all\r\n All of the selected player\'s binds will be cleared.'),
+('instance listbinds',3,'Syntax: .instance listbinds\r\n Lists the binds of the selected player.'),
+('instance stats',3,'Syntax: .instance stats\r\n Shows statistics about instances.'),
+('instance savedata',3,'Syntax: .instance savedata\r\n Save the InstanceData for the current player\'s map to the DB.'),
+('itemmove',2,'Syntax: .itemmove #sourceslotid #destinationslotid\r\n\r\nMove an item from slots #sourceslotid to #destinationslotid in your inventory\r\n\r\nNot yet implemented'),
+('kick',2,'Syntax: .kick [$charactername]\r\n\r\nKick the given character name from the world. If no character name is provided then the selected player (except for yourself) will be kicked.'),
+('learn',3,'Syntax: .learn #spell [all]\r\n\r\nSelected character learn a spell of id #spell. If \'all\' provided then all ranks learned.'),
+('learn all',3,'Syntax: .learn all\r\n\r\nLearn all big set different spell maybe useful for Administaror.'),
+('learn all_crafts',2,'Syntax: .learn crafts\r\n\r\nLearn all professions and recipes.'),
+('learn all_default',1,'Syntax: .learn all_default [$playername]\r\n\r\nLearn for selected/$playername player all default spells for his race/class and spells rewarded by completed quests.'),
+('learn all_gm',2,'Syntax: .learn all_gm\r\n\r\nLearn all default spells for Game Masters.'),
+('learn all_lang',1,'Syntax: .learn all_lang\r\n\r\nLearn all languages'),
+('learn all_myclass',3,'Syntax: .learn all_myclass\r\n\r\nLearn all spells and talents available for his class.'),
+('learn all_myspells',3,'Syntax: .learn all_myspells\r\n\r\nLearn all spells (except talents and spells with first rank learned as talent) available for his class.'),
+('learn all_mytalents',3,'Syntax: .learn all_mytalents\r\n\r\nLearn all talents (and spells with first rank learned as talent) available for his class.'),
+('learn all_recipes',2,'Syntax: .learn all_recipes [$profession]\r\rLearns all recipes of specified profession and sets skill level to max.\rExample: .learn all_recipes enchanting'),
+('levelup',3,'Syntax: .levelup [$playername] [#numberoflevels]\r\n\r\nIncrease/decrease the level of character with $playername (or the selected if not name provided) by #numberoflevels Or +1 if no #numberoflevels provided). If #numberoflevels is omitted, the level will be increase by 1. If #numberoflevels is 0, the same level will be restarted. If no character is selected and name not provided, increase your level. Command can be used for offline character. All stats and dependent VALUESrecalculated. At level decrease talents can be reset if need. Also at level decrease equipped items with greater level requirement can be lost.'),
+('linkgrave',3,'Syntax: .linkgrave #graveyard_id [alliance|horde]\r\n\r\nLink current zone to graveyard for any (or alliance/horde faction ghosts). This let character ghost from zone teleport to graveyard after die if graveyard is nearest from linked to zone and accept ghost of this faction. Add only single graveyard at another map and only if no graveyards linked (or planned linked at same map).'),
+('list creature',3,'Syntax: .list creature #creature_id [#max_count]\r\n\r\nOutput creatures with creature id #creature_id found in world. Output creature guids and coordinates sorted by distance from character. Will be output maximum #max_count creatures. If #max_count not provided use 10 as default value.'),
+('list item',3,'Syntax: .list item #item_id [#max_count]\r\n\r\nOutput items with item id #item_id found in all character inventories, mails, auctions, and guild banks. Output item guids, item owner guid, owner account and owner name (guild name and guid in case guild bank). Will be output maximum #max_count items. If #max_count not provided use 10 as default value.'),
+('list object',3,'Syntax: .list object #gameobject_id [#max_count]\r\n\r\nOutput gameobjects with gameobject id #gameobject_id found in world. Output gameobject guids and coordinates sorted by distance from character. Will be output maximum #max_count gameobject. If #max_count not provided use 10 as default value.'),
+('loadscripts',3,'Syntax: .loadscripts $scriptlibraryname\r\n\r\nUnload current and load the script library $scriptlibraryname or reload current if $scriptlibraryname omitted, in case you changed it while the server was running.'),
+('lockaccount',0,'Syntax: .lockaccount [on|off]\r\n\r\nAllow login from account only from current used IP or remove this requirement.'),
+('lookup area',1,'Syntax: .lookup area $namepart\r\n\r\nLooks up an area by $namepart, and returns all matches with their area ID\'s.'),
+('lookup creature',3,'Syntax: .lookup creature $namepart\r\n\r\nLooks up a creature by $namepart, and returns all matches with their creature ID\'s.'),
+('lookup event',2,'Syntax: .lookup event $name\r\nAttempts to find the ID of the event with the provided $name.'),
+('lookup faction',3,'Syntax: .lookup faction $name\r\nAttempts to find the ID of the faction with the provided $name.'),
+('lookup item',3,'Syntax: .lookup item $itemname\r\n\r\nLooks up an item by $itemname, and returns all matches with their Item ID\'s.'),
+('lookup itemset',3,'Syntax: .lookup itemset $itemname\r\n\r\nLooks up an item set by $itemname, and returns all matches with their Item set ID\'s.'),
+('lookup object',3,'Syntax: .lookup object $objname\r\n\r\nLooks up an gameobject by $objname, and returns all matches with their Gameobject ID\'s.'),
+('lookup player account',2,'Syntax: .lookup player account $account ($limit) \r\n\r\n Searchs players, which account username is $account with optional parametr $limit of results.'),
+('lookup player ip',2,'Syntax: .lookup player ip $ip ($limit) \r\n\r\n Searchs players, which account ast_ip is $ip with optional parametr $limit of results.'),
+('lookup player email',2,'Syntax: .lookup player email $email ($limit) \r\n\r\n Searchs players, which account email is $email with optional parametr $limit of results.'),
+('lookup quest',3,'Syntax: .lookup quest $namepart\r\n\r\nLooks up a quest by $namepart, and returns all matches with their quest ID\'s.'),
+('lookup skill',3,'Syntax: .lookup skill $$namepart\r\n\r\nLooks up a skill by $namepart, and returns all matches with their skill ID\'s.'),
+('lookup spell',3,'Syntax: .lookup spell $namepart\r\n\r\nLooks up a spell by $namepart, and returns all matches with their spell ID\'s.'),
+('lookup tele',1,'Syntax: .lookup tele $substring\r\n\r\nSearch and output all .tele command locations with provide $substring in name.'),
+('maxskill',3,'Syntax: .maxskill\r\nSets all skills of the targeted player to their maximum VALUESfor its current level.'),
+('Mod32Value',3,'Syntax: .Mod32Value #field #value\r\n\r\nAdd #value to field #field of your character.'),
+('modify arena',3,'Syntax: .modify arena #value\r\nAdd $amount arena points to the selected player.'),
+('modify aspeed',1,'Syntax: .modify aspeed #rate\r\n\r\nModify all speeds -run,swim,run back,swim back- of the selected player to \"normalbase speed for this move type\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify bit',1,'Syntax: .modify bit #field #bit\r\n\r\nToggle the #bit bit of the #field field for the selected player. If no player is selected, modify your character.'),
+('modify bwalk',1,'Syntax: .modify bwalk #rate\r\n\r\nModify the speed of the selected player while running backwards to \"normal walk back speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify drunk',1,'Syntax: .modify drunk #value\r\n Set drunk level to #value (0..100). Value 0 remove drunk state, 100 is max drunked state.'),
+('modify energy',1,'Syntax: .modify energy #energy\r\n\r\nModify the energy of the selected player. If no player is selected, modify your energy.'),
+('modify faction',1,'Syntax: .modify faction #factionid #flagid #npcflagid #dynamicflagid\r\n\r\nModify the faction and flags of the selected creature. Without arguments, display the faction and flags of the selected creature.'),
+('modify gender',2,'Syntax: .modify gender male/female\r\n\r\nChange gender of selected player.'),
+('modify honor',1,'Syntax: .modify honor $amount\r\n\r\nAdd $amount honor points to the selected player.'),
+('modify hp',1,'Syntax: .modify hp #newhp\r\n\r\nModify the hp of the selected player. If no player is selected, modify your hp.'),
+('modify mana',1,'Syntax: .modify mana #newmana\r\n\r\nModify the mana of the selected player. If no player is selected, modify your mana.'),
+('modify money',1,'Syntax: .modify money #money\r\n.money #money\r\n\r\nAdd or remove money to the selected player. If no player is selected, modify your money.\r\n\r\n #gold can be negative to remove money.'),
+('modify morph',2,'Syntax: .modify morph #displayid\r\n\r\nChange your current model id to #displayid.'),
+('modify mount',1,'Syntax: .modify mount #id #speed\r\nDisplay selected player as mounted at #id creature and set speed to #speed value.'),
+('modify phase',3,'Syntax: .modify phase #phasemask\r\n\r\nSelected character phasemask changed to #phasemask with related world vision update. Change active until in game phase changed, or GM-mode enable/disable, or re-login. Character pts pasemask update to same value.'),
+('modify rage',1,'Syntax: .modify rage #newrage\r\n\r\nModify the rage of the selected player. If no player is selected, modify your rage.'),
+('modify rep',2,'Syntax: .modify rep #repId (#repvalue | $rankname [#delta])\r\nSets the selected players reputation with faction #repId to #repvalue or to $reprank.\r\nIf the reputation rank name is provided, the resulting reputation will be the lowest reputation for that rank plus the delta amount, if specified.\r\nYou can use \'.pinfo rep\' to list all known reputation ids, or use \'.lookup faction $name\' to locate a specific faction id.'),
+('modify runicpower',1,'Syntax: .modify runicpower #newrunicpower\r\n\r\nModify the runic power of the selected player. If no player is selected, modify your runic power.'),
+('modify scale',1,''),
+('modify speed',1,'Syntax: .modify speed #rate\r\n.speed #rate\r\n\r\nModify the running speed of the selected player to \"normal base run speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify spell',1,''),
+('modify swim',1,'Syntax: .modify swim #rate\r\n\r\nModify the swim speed of the selected player to \"normal swim speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify titles',1,'Syntax: .modify titles #mask\r\n\r\nAllows user to use all titles from #mask.\r\n\r\n #mask=0 disables the title-choose-field'),
+('movegens',3,'Syntax: .movegens\r\n Show movement generators stack for selected creature or player.'),
+('mute',1,'Syntax: .mute $playerName $timeInMinutes\r\n\r\nDisible chat messaging for any character from account of character $playerName at $timeInMinutes minutes.'),
+('namego',1,'Syntax: .namego $charactername\r\n\r\nTeleport the given character to you.'),
+('neargrave',3,'Syntax: .neargrave [alliance|horde]\r\n\r\nFind nearest graveyard linked to zone (or only nearest from accepts alliance or horde faction ghosts).'),
+('notify',1,'Syntax: .notify $MessageToBroadcast\r\n\r\nSend a global message to all players online in screen.'),
+('npc add',2,'Syntax: .npc add #creatureid\r\n\r\nSpawn a creature by the given template id of #creatureid.'),
+('npc additem',2,'Syntax: .npc additem #itemId <#maxcount><#incrtime><#extendedcost>r\r\n\r\nAdd item #itemid to item list of selected vendor. Also optionally set max count item in vendor item list and time to item count restoring and items ExtendedCost.'),
+('npc addweapon',3,'Not yet implemented.'),
+('npc allowmove',3,'Syntax: .npc allowmove\r\n\r\nEnable or disable movement for the selected creature.'),
+('npc changelevel',2,'Syntax: .npc changelevel #level\r\n\r\nChange the level of the selected creature to #level.\r\n\r\n#level may range from 1 to 63.'),
+('npc delete',2,'Syntax: .npc delete [#guid]\r\n\r\nDelete creature with guid #guid (or the selected if no guid is provided)'),
+('npc delitem',2,'Syntax: .npc delitem #itemId\r\n\r\nRemove item #itemid from item list of selected vendor.'),
+('npc factionid',2,'Syntax: .npc factionid #factionid\r\n\r\nSet the faction of the selected creature to #factionid.'),
+('npc flag',2,'Syntax: .npc flag #npcflag\r\n\r\nSet the NPC flags of creature template of the selected creature and selected creature to #npcflag. NPC flags will applied to all creatures of selected creature template after server restart or grid unload/load.'),
+('npc follow',2,'Syntax: .npc follow\r\n\r\nSelected creature start follow you until death/fight/etc.'),
+('npc info',3,'Syntax: .npc info\r\n\r\nDisplay a list of details for the selected creature.\r\n\r\nThe list includes:\r\n- GUID, Faction, NPC flags, Entry ID, Model ID,\r\n- Level,\r\n- Health (current/maximum),\r\n\r\n- Field flags, dynamic flags, faction template, \r\n- Position information,\r\n- and the creature type, e.g. if the creature is a vendor.'),
+('npc move',2,'Syntax: .npc move [#creature_guid]\r\n\r\nMove the targeted creature spawn point to your coordinates.'),
+('npc name',2,'Syntax: .npc name $name\r\n\r\nChange the name of the selected creature or character to $name.\r\n\r\nCommand disabled.'),
+('npc phase',3,'Syntax: .npc phase #phasemask\r\n\r\nSelected unit or pet phasemask changed to #phasemask with related world vision update for players. In creature case state saved to DB and persistent. In pet case change active until in game phase changed for owner, owner re-login, or GM-mode enable/disable..'),
+('npc playemote',3,'Syntax: .npc playemote #emoteid\r\n\r\nMake the selected creature emote with an emote of id #emoteid.'),
+('npc setdeathstate',2,'Syntax: .npc setdeathstate on/off\r\n\r\nSet default death state (dead/alive) for npc at spawn.'),
+('npc setmodel',2,'Syntax: .npc setmodel #displayid\r\n\r\nChange the model id of the selected creature to #displayid.'),
+('npc setmovetype',2,'Syntax: .npc setmovetype [#creature_guid] stay/random/way [NODEL]\r\n\r\nSet for creature pointed by #creature_guid (or selected if #creature_guid not provided) movement type and move it to respawn position (if creature alive). Any existing waypoints for creature will be removed from the database if you do not use NODEL. If the creature is dead then movement type will applied at creature respawn.\r\nMake sure you use NODEL, if you want to keep the waypoints.'),
+('npc spawndist',2,'Syntax: .npc spawndist #dist\r\n\r\nAdjust spawndistance of selected creature to dist.'),
+('npc spawntime',2,'Syntax: .npc spawntime #time \r\n\r\nAdjust spawntime of selected creature to time.'),
+('npc subname',2,'Syntax: .npc subname $Name\r\n\r\nChange the subname of the selected creature or player to $Name.\r\n\r\nCommand disabled.'),
+('npc tame',2,'Syntax: .npc tame\r\n\r\nTame selected creature (tameable non pet creature). You don''t must have pet.'),
+('npc textemote',3,'Syntax: .npc textemote #emoteid\r\n\r\nMake the selected creature to do textemote with an emote of id #emoteid.'),
+('npc whisper',1,'Syntax: .npc whisper #playerguid #text\r\nMake the selected npc whisper #text to #playerguid.'),
+('npc unfollow',2,'Syntax: .npc unfollow\r\n\r\nSelected creature (non pet) stop follow you.'),
+('password',0,'Syntax: .password $old_password $new_password $new_password\r\n\r\nChange your account password.'),
+('pdump write',3,'Syntax: .pdump write $filename $playerNameOrGUID\r\nWrite character dump with name/guid $playerNameOrGUID to file $filename.'),
+('pdump load',3,'Syntax: .pdump load $filename $account [$newname] [$newguid]\r\nLoad character dump from dump file into character list of $account with saved or $newname, with saved (or first free) or $newguid guid.'),
+('pinfo',2,'Syntax: .pinfo [$player_name] [rep]\r\n\r\nOutput account information for selected player or player find by $player_name. If \"rep\" parameter provided show reputation information for player.'),
+('plimit',3,'Syntax: .plimit [#num|-1|-2|-3|reset|player|moderator|gamemaster|administrator]\r\n\r\nWithout arg show current player amount and security level limitations for login to server, with arg set player linit ($num > 0) or securiti limitation ($num < 0 or security leme name. With `reset` sets player limit to the one in the config file'),
+('quest add',3,'Syntax: .quest add #quest_id\r\n\r\nAdd to character quest log quest #quest_id. Quest started from item can\'t be added by this command but correct .additem call provided in command output.'),
+('quest complete',3,'Syntax: .quest complete #questid\r\nMark all quest objectives as completed for target character active quest. After this target character can go and get quest reward.'),
+('quest remove',3,'Syntax: .quest remove #quest_id\r\n\r\nSet quest #quest_id state to not completed and not active (and remove from active quest list) for selected player.'),
+('recall',1,'Syntax: .recall [$playername]\r\n\r\nTeleport $playername or selected player to the place where he has been before last use of a teleportation command. If no $playername is entered and no player is selected, it will teleport you.'),
+('reload all',3,'Syntax: .reload all\r\n\r\nReload all tables with reload support added and that can be _safe_ reloaded.'),
+('reload all_area',3,'Syntax: .reload all_area\r\n\r\nReload all `areatrigger_*` tables if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all_loot',3,'Syntax: .reload all_loot\r\n\r\nReload all `*_loot_template` tables. This can be slow operation with lags for server run.'),
+('reload all_quest',3,'Syntax: .reload all_quest\r\n\r\nReload all quest related tables if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all_spell',3,'Syntax: .reload all_spell\r\n\r\nReload all `spell_*` tables with reload support added and that can be _safe_ reloaded.'),
+('reload all_locales',3,'Syntax: .reload all_locales\r\n\r\nReload all `locales_*` tables with reload support added and that can be _safe_ reloaded.'),
+('reload config',3,'Syntax: .reload config\r\n\r\nReload config settings (by default stored in mangosd.conf). Not all settings can be change at reload: some new setting values will be ignored until restart, some values will applied with delay or only to new objects/maps, some values will explicitly rejected to change at reload.'),
+('repairitems',2,'Syntax: .repairitems\r\n\r\nRepair all selected player''s items.'),
+('reset achievements',3,'Syntax: .reset achievements [$playername]\r\n\r\nReset achievements data for selected or named (online or offline) character. Achievements for persistance progress data like completed quests/etc re-filled at reset. Achievements for events like kills/casts/etc will lost.'),
+('reset all',3,'Syntax: .reset all spells\r\n\r\nSyntax: .reset all talents\r\n\r\nRequest reset spells or talents at next login each existed character.'),
+('reset honor',3,'Syntax: .reset honor [Playername]\r\n Reset all honor data for targeted character.'),
+('reset level',3,'Syntax: .reset level [Playername]\r\n Reset level to 1 including reset stats and talents. Equipped items with greater level requirement can be lost.'),
+('reset spells',3,'Syntax: .reset spells [Playername]\r\n Removes all non-original spells from spellbook.\r\n. Playername can be name of offline character.'),
+('reset stats',3,'Syntax: .reset stats [Playername]\r\n Resets(recalculate) all stats of the targeted player to their original VALUESat current level.'),
+('reset talents',3,'Syntax: .reset talents [Playername]\r\n Removes all talents of the targeted player. Playername can be name of offline character.'),
+('respawn',3,'Syntax: .respawn\r\n\r\nRespawn selected creature or respawn all nearest creatures (if none selected) and GO without waiting respawn time expiration.'),
+('revive',3,'Syntax: .revive\r\n\r\nRevive the selected player. If no player is selected, it will revive you.'),
+('save',0,'Syntax: .save\r\n\r\nSaves your character.'),
+('saveall',1,'Syntax: .saveall\r\n\r\nSave all characters in game.'),
+('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'),
+('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".'),
+('sendmoney','3','Syntax: .sendmoney #playername "#subject" "#text" #money\r\n\r\nSend mail with money to a player. Subject and mail text must be in "".'),
+('sendmessage',3,'Syntax: .sendmessage $playername $message\r\n\r\nSend screen message to player from ADMINISTRATOR.'),
+('server corpses',2,'Syntax: .server corpses\r\n\r\nTriggering corpses expire check in world.'),
+('server exit',4,'Syntax: .server exit\r\n\r\nTerminate mangosd NOW. Exit code 0.'),
+('server info',0,'Syntax: .server info\r\n\r\nDisplay server version and the number of connected players.'),
+('server idleshutdown',3,'Syntax: .server idleshutdown #delay [#exist_code]\r\n\r\nShut the server down after #delay seconds if no active connections are present (no players). Use #exist_code or 0 as program exist code.'),
+('server idleshutdown cancel',3,'Syntax: .server idleshutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server idlerestart',3,'Syntax: .server idlerestart #delay\r\n\r\nRestart the server after #delay seconds if no active connections are present (no players). Use #exist_code or 2 as program exist code.'),
+('server idlerestart cancel',3,'Syntax: .server idlerestart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server motd',0,'Syntax: .server motd\r\n\r\nShow server Message of the day.'),
+('server restart',3,'Syntax: .server restart #delay\r\n\r\nRestart the server after #delay seconds. Use #exist_code or 2 as program exist code.'),
+('server restart cancel',3,'Syntax: .server restart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server set loglevel',4,'Syntax: .server set loglevel #level\r\n\r\nSet server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).'),
+('server set motd',3,'Syntax: .server set motd $MOTD\r\n\r\nSet server Message of the day.'),
+('server shutdown',3,'Syntax: .server shutdown #delay [#exist_code]\r\n\r\nShut the server down after #delay seconds. Use #exist_code or 0 as program exist code.'),
+('server shutdown cancel',3,'Syntax: .server shutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('setskill',3,'Syntax: .setskill #skill #level [#max]\r\n\r\nSet a skill of id #skill with a current skill value of #level and a maximum value of #max (or equal current maximum if not provide) for the selected character. If no character is selected, you learn the skill.'),
+('showarea',3,'Syntax: .showarea #areaid\r\n\r\nReveal the area of #areaid to the selected character. If no character is selected, reveal this area to you.'),
+('start',0,'Syntax: .start\r\n\r\nTeleport you to the starting area of your character.'),
+('taxicheat',1,'Syntax: .taxicheat on/off\r\n\r\nTemporary grant access or remove to all taxi routes for the selected character. If no character is selected, hide or reveal all routes to you.\r\n\r\nVisited taxi nodes sill accessible after removing access.'),
+('tele',1,'Syntax: .tele #location\r\n\r\nTeleport player to a given location.'),
+('tele add',3,'Syntax: .tele add $name\r\n\r\nAdd current your position to .tele command target locations list with name $name.'),
+('tele del',3,'Syntax: .tele del $name\r\n\r\nRemove location with name $name for .tele command locations list.'),
+('tele group',1,'Syntax: .tele group#location\r\n\r\nTeleport a selected player and his group members to a given location.'),
+('tele name',1,'Syntax: .tele name #playername #location\r\n\r\nTeleport a player to a given location.'),
+('ticket',2,'Syntax: .ticket on\r\n .ticket off\r\n .ticket #num\r\n .ticket $character_name\r\n\r\non/off for GMs to show or not a new ticket directly, $character_name to show ticket of this character, #num to show ticket #num.'),
+('unaura',3,'Syntax: .unaura #spellid\r\n\r\nRemove aura due to spell #spellid from the selected Unit.'),
+('unban account',3,'Syntax: .unban account $Name\r\nUnban accounts for account name pattern.'),
+('unban character',3,'Syntax: .unban character $Name\r\nUnban accounts for character name pattern.'),
+('unban ip',3,'Syntax : .unban ip $Ip\r\nUnban accounts for IP pattern.'),
+('unlearn',3,'Syntax: .unlearn #spell [all]\r\n\r\nUnlearn for selected player a spell #spell. If \'all\' provided then all ranks unlearned.'),
+('unmute',1,'Syntax: .unmute $playerName\r\n\r\nRestore chat messaging for any character from account of character $playerName.'),
+('waterwalk',2,'Syntax: .waterwalk on/off\r\n\r\nSet on/off waterwalk state for selected player.'),
+('wchange',3,'Syntax: .wchange #weathertype #status\r\n\r\nSet current weather to #weathertype with an intensity of #status.\r\n\r\n#weathertype can be 1 for rain, 2 for snow, and 3 for sand. #status can be 0 for disabled, and 1 for enabled.'),
+('whispers',1,'Syntax: .whispers on|off\r\nEnable/disable accepting whispers by GM from players. By default use mangosd.conf setting.'),
+('wp',2,'Using WP Command:\r\nEach Waypoint Command has it\'s own description!'),
+('wp add',2,'Syntax: .wp add [#creature_guid or Select a Creature]'),
+('wp export',3,'Syntax: .wp export [#creature_guid or Select a Creature] $filename'),
+('wp import',3,'Syntax: .wp import $filename'),
+('wp modify',2,'Syntax: .wp modify [#creature_guid or Select a Creature]\r\nadd - Add a waypoint after the selected visual\r\nwaittime $time\r\nemote ID\r\nspell ID\r\ntext1| text2| text3| text4| text5 <text>\r\nmodel1 ID\r\nmodel2 ID\r\nmove(moves wp to player pos)\r\ndel (deletes the wp)\r\n\r\nOnly one parameter per time!'),
+('wp show',2,'Syntax: .wp show [#creature_guid or Select a Creature]\r\non\r\nfirst\r\nlast\r\noff\r\ninfo\r\n\r\nFor using info you have to do first show on and than select a Visual-Waypoint and do the show info!');
+/*!40000 ALTER TABLE `command` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature`
+--
+
+DROP TABLE IF EXISTS `creature`;
+CREATE TABLE `creature` (
+ `guid` int(10) unsigned NOT NULL auto_increment COMMENT 'Global Unique Identifier',
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Creature Identifier',
+ `map` smallint(5) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
+ `spawnMask` tinyint(3) unsigned NOT NULL default '1',
+ `phaseMask` smallint(5) unsigned NOT NULL default '1',
+ `modelid` mediumint(8) unsigned NOT NULL default '0',
+ `equipment_id` mediumint(9) NOT NULL default '0',
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ `orientation` float NOT NULL default '0',
+ `spawntimesecs` int(10) unsigned NOT NULL default '120',
+ `spawndist` float NOT NULL default '5',
+ `currentwaypoint` mediumint(8) unsigned NOT NULL default '0',
+ `curhealth` int(10) unsigned NOT NULL default '1',
+ `curmana` int(10) unsigned NOT NULL default '0',
+ `DeathState` tinyint(3) unsigned NOT NULL default '0',
+ `MovementType` tinyint(3) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`),
+ KEY `idx_map` (`map`),
+ KEY `index_id` (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Creature System';
+
+--
+-- Dumping data for table `creature`
+--
+
+LOCK TABLES `creature` WRITE;
+/*!40000 ALTER TABLE `creature` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_addon`
+--
+
+DROP TABLE IF EXISTS `creature_addon`;
+CREATE TABLE `creature_addon` (
+ `guid` int(11) NOT NULL default '0',
+ `mount` mediumint(8) unsigned NOT NULL default '0',
+ `bytes0` int(10) unsigned NOT NULL default '0',
+ `bytes1` int(10) unsigned NOT NULL default '0',
+ `bytes2` int(10) unsigned NOT NULL default '0',
+ `emote` int(10) unsigned NOT NULL default '0',
+ `moveflags` int(10) unsigned NOT NULL default '0',
+ `auras` text,
+ PRIMARY KEY (`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `creature_addon`
+--
+
+LOCK TABLES `creature_addon` WRITE;
+/*!40000 ALTER TABLE `creature_addon` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_addon` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_equip_template`
+--
+
+DROP TABLE IF EXISTS `creature_equip_template`;
+CREATE TABLE `creature_equip_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Unique entry',
+ `equipentry1` mediumint(8) unsigned NOT NULL default '0',
+ `equipentry2` mediumint(8) unsigned NOT NULL default '0',
+ `equipentry3` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Creature System (Equipment)';
+
+--
+-- Dumping data for table `creature_equip_template`
+--
+
+LOCK TABLES `creature_equip_template` WRITE;
+/*!40000 ALTER TABLE `creature_equip_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_equip_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_involvedrelation`
+--
+
+DROP TABLE IF EXISTS `creature_involvedrelation`;
+CREATE TABLE `creature_involvedrelation` (
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Identifier',
+ `quest` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`id`,`quest`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System';
+
+--
+-- Dumping data for table `creature_involvedrelation`
+--
+
+LOCK TABLES `creature_involvedrelation` WRITE;
+/*!40000 ALTER TABLE `creature_involvedrelation` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_involvedrelation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_loot_template`
+--
+
+DROP TABLE IF EXISTS `creature_loot_template`;
+CREATE TABLE `creature_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `creature_loot_template`
+--
+
+LOCK TABLES `creature_loot_template` WRITE;
+/*!40000 ALTER TABLE `creature_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_model_info`
+--
+
+DROP TABLE IF EXISTS `creature_model_info`;
+CREATE TABLE `creature_model_info` (
+ `modelid` mediumint(8) unsigned NOT NULL default '0',
+ `bounding_radius` float NOT NULL default '0',
+ `combat_reach` float NOT NULL default '0',
+ `gender` tinyint(3) unsigned NOT NULL default '2',
+ `modelid_other_gender` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`modelid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Creature System (Model related info)';
+
+--
+-- Dumping data for table `creature_model_info`
+--
+
+LOCK TABLES `creature_model_info` WRITE;
+/*!40000 ALTER TABLE `creature_model_info` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_model_info` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_movement`
+--
+
+DROP TABLE IF EXISTS `creature_movement`;
+CREATE TABLE `creature_movement` (
+ `id` int(10) unsigned NOT NULL COMMENT 'Creature GUID',
+ `point` mediumint(8) unsigned NOT NULL default '0',
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ `waittime` int(10) unsigned NOT NULL default '0',
+ `textid1` int(11) NOT NULL default '0',
+ `textid2` int(11) NOT NULL default '0',
+ `textid3` int(11) NOT NULL default '0',
+ `textid4` int(11) NOT NULL default '0',
+ `textid5` int(11) NOT NULL default '0',
+ `emote` mediumint(8) unsigned NOT NULL default '0',
+ `spell` mediumint(8) unsigned NOT NULL default '0',
+ `wpguid` int(11) NOT NULL default '0',
+ `orientation` float NOT NULL default '0',
+ `model1` mediumint(9) NOT NULL default '0',
+ `model2` mediumint(9) NOT NULL default '0',
+ PRIMARY KEY (`id`,`point`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System';
+
+--
+-- Dumping data for table `creature_movement`
+--
+
+LOCK TABLES `creature_movement` WRITE;
+/*!40000 ALTER TABLE `creature_movement` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_movement` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_onkill_reputation`
+--
+
+DROP TABLE IF EXISTS `creature_onkill_reputation`;
+CREATE TABLE `creature_onkill_reputation` (
+ `creature_id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Creature Identifier',
+ `RewOnKillRepFaction1` smallint(6) NOT NULL default '0',
+ `RewOnKillRepFaction2` smallint(6) NOT NULL default '0',
+ `MaxStanding1` tinyint(4) NOT NULL default '0',
+ `IsTeamAward1` tinyint(4) NOT NULL default '0',
+ `RewOnKillRepValue1` mediumint(9) NOT NULL default '0',
+ `MaxStanding2` tinyint(4) NOT NULL default '0',
+ `IsTeamAward2` tinyint(4) NOT NULL default '0',
+ `RewOnKillRepValue2` mediumint(9) NOT NULL default '0',
+ `TeamDependent` tinyint(3) unsigned NOT NULL default '0',
+ PRIMARY KEY (`creature_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Creature OnKill Reputation gain';
+
+--
+-- Dumping data for table `creature_onkill_reputation`
+--
+
+LOCK TABLES `creature_onkill_reputation` WRITE;
+/*!40000 ALTER TABLE `creature_onkill_reputation` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_onkill_reputation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_questrelation`
+--
+
+DROP TABLE IF EXISTS `creature_questrelation`;
+CREATE TABLE `creature_questrelation` (
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Identifier',
+ `quest` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`id`,`quest`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System';
+
+--
+-- Dumping data for table `creature_questrelation`
+--
+
+LOCK TABLES `creature_questrelation` WRITE;
+/*!40000 ALTER TABLE `creature_questrelation` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_questrelation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_respawn`
+--
+
+DROP TABLE IF EXISTS `creature_respawn`;
+CREATE TABLE `creature_respawn` (
+ `guid` int(10) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
+ `respawntime` bigint(20) NOT NULL default '0',
+ `instance` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`,`instance`),
+ KEY `instance` (`instance`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Grid Loading System';
+
+--
+-- Dumping data for table `creature_respawn`
+--
+
+LOCK TABLES `creature_respawn` WRITE;
+/*!40000 ALTER TABLE `creature_respawn` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_respawn` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_template`
+--
+
+DROP TABLE IF EXISTS `creature_template`;
+CREATE TABLE `creature_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `heroic_entry` mediumint(8) unsigned NOT NULL default '0',
+ `modelid_A` mediumint(8) unsigned NOT NULL default '0',
+ `modelid_A2` mediumint(8) unsigned NOT NULL default '0',
+ `modelid_H` mediumint(8) unsigned NOT NULL default '0',
+ `modelid_H2` mediumint(8) unsigned NOT NULL default '0',
+ `name` char(100) NOT NULL default '0',
+ `subname` char(100) default NULL,
+ `IconName` char(100) default NULL,
+ `minlevel` tinyint(3) unsigned NOT NULL default '1',
+ `maxlevel` tinyint(3) unsigned NOT NULL default '1',
+ `minhealth` int(10) unsigned NOT NULL default '0',
+ `maxhealth` int(10) unsigned NOT NULL default '0',
+ `minmana` int(10) unsigned NOT NULL default '0',
+ `maxmana` int(10) unsigned NOT NULL default '0',
+ `armor` mediumint(8) unsigned NOT NULL default '0',
+ `faction_A` smallint(5) unsigned NOT NULL default '0',
+ `faction_H` smallint(5) unsigned NOT NULL default '0',
+ `npcflag` int(10) unsigned NOT NULL default '0',
+ `speed` float NOT NULL default '1',
+ `scale` float NOT NULL default '1',
+ `rank` tinyint(3) unsigned NOT NULL default '0',
+ `mindmg` float NOT NULL default '0',
+ `maxdmg` float NOT NULL default '0',
+ `dmgschool` tinyint(4) NOT NULL default '0',
+ `attackpower` int(10) unsigned NOT NULL default '0',
+ `baseattacktime` int(10) unsigned NOT NULL default '0',
+ `rangeattacktime` int(10) unsigned NOT NULL default '0',
+ `unit_flags` int(10) unsigned NOT NULL default '0',
+ `dynamicflags` int(10) unsigned NOT NULL default '0',
+ `family` tinyint(4) NOT NULL default '0',
+ `trainer_type` tinyint(4) NOT NULL default '0',
+ `trainer_spell` mediumint(8) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `minrangedmg` float NOT NULL default '0',
+ `maxrangedmg` float NOT NULL default '0',
+ `rangedattackpower` smallint(5) unsigned NOT NULL default '0',
+ `type` tinyint(3) unsigned NOT NULL default '0',
+ `type_flags` int(10) unsigned NOT NULL default '0',
+ `lootid` mediumint(8) unsigned NOT NULL default '0',
+ `pickpocketloot` mediumint(8) unsigned NOT NULL default '0',
+ `skinloot` mediumint(8) unsigned NOT NULL default '0',
+ `resistance1` smallint(5) NOT NULL default '0',
+ `resistance2` smallint(5) NOT NULL default '0',
+ `resistance3` smallint(5) NOT NULL default '0',
+ `resistance4` smallint(5) NOT NULL default '0',
+ `resistance5` smallint(5) NOT NULL default '0',
+ `resistance6` smallint(5) NOT NULL default '0',
+ `spell1` mediumint(8) unsigned NOT NULL default '0',
+ `spell2` mediumint(8) unsigned NOT NULL default '0',
+ `spell3` mediumint(8) unsigned NOT NULL default '0',
+ `spell4` mediumint(8) unsigned NOT NULL default '0',
+ `PetSpellDataId` mediumint(8) unsigned NOT NULL default '0',
+ `mingold` mediumint(8) unsigned NOT NULL default '0',
+ `maxgold` mediumint(8) unsigned NOT NULL default '0',
+ `AIName` char(64) NOT NULL default '',
+ `MovementType` tinyint(3) unsigned NOT NULL default '0',
+ `InhabitType` tinyint(3) unsigned NOT NULL default '3',
+ `RacialLeader` tinyint(3) unsigned NOT NULL default '0',
+ `RegenHealth` tinyint(3) unsigned NOT NULL default '1',
+ `equipment_id` mediumint(8) unsigned NOT NULL default '0',
+ `mechanic_immune_mask` int(10) unsigned NOT NULL default '0',
+ `flags_extra` int(10) unsigned NOT NULL default '0',
+ `ScriptName` char(64) NOT NULL default '',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System';
+
+--
+-- Dumping data for table `creature_template`
+--
+
+LOCK TABLES `creature_template` WRITE;
+/*!40000 ALTER TABLE `creature_template` DISABLE KEYS */;
+INSERT INTO `creature_template` VALUES
+(1,1,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,1,1,64,64,0,0,0,35,35,0,0.91,1,0,14,15,0,100,2000,2200,4096,0,0,0,0,0,0,1.76,2.42,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,0,1,0,0,0x82,'');
+/*!40000 ALTER TABLE `creature_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `creature_template_addon`
+--
+
+DROP TABLE IF EXISTS `creature_template_addon`;
+CREATE TABLE `creature_template_addon` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `mount` mediumint(8) unsigned NOT NULL default '0',
+ `bytes0` int(10) unsigned NOT NULL default '0',
+ `bytes1` int(10) unsigned NOT NULL default '0',
+ `bytes2` int(10) unsigned NOT NULL default '0',
+ `emote` mediumint(8) unsigned NOT NULL default '0',
+ `moveflags` int(10) unsigned NOT NULL default '0',
+ `auras` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `creature_template_addon`
+--
+
+LOCK TABLES `creature_template_addon` WRITE;
+/*!40000 ALTER TABLE `creature_template_addon` DISABLE KEYS */;
+/*!40000 ALTER TABLE `creature_template_addon` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `db_script_string`
+--
+
+DROP TABLE IF EXISTS `db_script_string`;
+CREATE TABLE `db_script_string` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `content_default` text NOT NULL,
+ `content_loc1` text,
+ `content_loc2` text,
+ `content_loc3` text,
+ `content_loc4` text,
+ `content_loc5` text,
+ `content_loc6` text,
+ `content_loc7` text,
+ `content_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `db_script_string`
+--
+
+LOCK TABLES `db_script_string` WRITE;
+/*!40000 ALTER TABLE `db_script_string` DISABLE KEYS */;
+/*!40000 ALTER TABLE `db_script_string` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `disenchant_loot_template`
+--
+
+DROP TABLE IF EXISTS `disenchant_loot_template`;
+CREATE TABLE `disenchant_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Recommended id selection: item_level*100 + item_quality',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `disenchant_loot_template`
+--
+
+LOCK TABLES `disenchant_loot_template` WRITE;
+/*!40000 ALTER TABLE `disenchant_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `disenchant_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `event_scripts`
+--
+
+DROP TABLE IF EXISTS `event_scripts`;
+CREATE TABLE `event_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `event_scripts`
+--
+
+LOCK TABLES `event_scripts` WRITE;
+/*!40000 ALTER TABLE `event_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `event_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `exploration_basexp`
+--
+
+DROP TABLE IF EXISTS `exploration_basexp`;
+CREATE TABLE `exploration_basexp` (
+ `level` tinyint(4) NOT NULL default '0',
+ `basexp` mediumint(9) NOT NULL default '0',
+ PRIMARY KEY (`level`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Exploration System';
+
+--
+-- Dumping data for table `exploration_basexp`
+--
+
+LOCK TABLES `exploration_basexp` WRITE;
+/*!40000 ALTER TABLE `exploration_basexp` DISABLE KEYS */;
+INSERT INTO `exploration_basexp` VALUES
+(0,0),
+(1,5),
+(2,15),
+(3,25),
+(4,35),
+(5,45),
+(6,55),
+(7,65),
+(8,70),
+(9,80),
+(10,85),
+(11,90),
+(12,90),
+(13,90),
+(14,100),
+(15,105),
+(16,115),
+(17,125),
+(18,135),
+(19,145),
+(20,155),
+(21,165),
+(22,175),
+(23,185),
+(24,195),
+(25,200),
+(26,210),
+(27,220),
+(28,230),
+(29,240),
+(30,245),
+(31,250),
+(32,255),
+(33,265),
+(34,270),
+(35,275),
+(36,280),
+(37,285),
+(38,285),
+(39,300),
+(40,315),
+(41,330),
+(42,345),
+(43,360),
+(44,375),
+(45,390),
+(46,405),
+(47,420),
+(48,440),
+(49,455),
+(50,470),
+(51,490),
+(52,510),
+(53,530),
+(54,540),
+(55,560),
+(56,580),
+(57,600),
+(58,620),
+(59,640),
+(60,660),
+(61,970),
+(62,1000),
+(63,1050),
+(64,1080),
+(65,1100),
+(66,1130),
+(67,1160),
+(68,1200),
+(69,1230),
+(70,1250);
+/*!40000 ALTER TABLE `exploration_basexp` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `fishing_loot_template`
+--
+
+DROP TABLE IF EXISTS `fishing_loot_template`;
+CREATE TABLE `fishing_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `fishing_loot_template`
+--
+
+LOCK TABLES `fishing_loot_template` WRITE;
+/*!40000 ALTER TABLE `fishing_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `fishing_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event`
+--
+
+DROP TABLE IF EXISTS `game_event`;
+CREATE TABLE `game_event` (
+ `entry` mediumint(8) unsigned NOT NULL COMMENT 'Entry of the game event',
+ `start_time` timestamp NOT NULL default '0000-00-00 00:00:00' COMMENT 'Absolute start date, the event will never start before',
+ `end_time` timestamp NOT NULL default '0000-00-00 00:00:00' COMMENT 'Absolute end date, the event will never start afler',
+ `occurence` bigint(20) unsigned NOT NULL default '86400' COMMENT 'Delay in hours between occurences of the event',
+ `length` bigint(20) unsigned NOT NULL default '43200' COMMENT 'Length in hours of the event',
+ `description` varchar(255) default NULL COMMENT 'Description of the event displayed in console',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event`
+--
+
+LOCK TABLES `game_event` WRITE;
+/*!40000 ALTER TABLE `game_event` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event_creature`
+--
+
+DROP TABLE IF EXISTS `game_event_creature`;
+CREATE TABLE `game_event_creature` (
+ `guid` int(10) unsigned NOT NULL,
+ `event` smallint(6) NOT NULL default '0' COMMENT 'Put negatives values to remove during event',
+ PRIMARY KEY (`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_creature`
+--
+
+LOCK TABLES `game_event_creature` WRITE;
+/*!40000 ALTER TABLE `game_event_creature` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_creature` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event_creature_quest`
+--
+
+DROP TABLE IF EXISTS `game_event_creature_quest`;
+CREATE TABLE `game_event_creature_quest` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `quest` mediumint(8) unsigned NOT NULL default '0',
+ `event` smallint(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`id`,`quest`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_creature_quest`
+--
+
+LOCK TABLES `game_event_creature_quest` WRITE;
+/*!40000 ALTER TABLE `game_event_creature_quest` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_creature_quest` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event_gameobject`
+--
+
+DROP TABLE IF EXISTS `game_event_gameobject`;
+CREATE TABLE `game_event_gameobject` (
+ `guid` int(10) unsigned NOT NULL,
+ `event` smallint(6) NOT NULL default '0' COMMENT 'Put negatives values to remove during event',
+ PRIMARY KEY (`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_gameobject`
+--
+
+LOCK TABLES `game_event_gameobject` WRITE;
+/*!40000 ALTER TABLE `game_event_gameobject` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_gameobject` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event_model_equip`
+--
+
+DROP TABLE IF EXISTS `game_event_model_equip`;
+CREATE TABLE `game_event_model_equip` (
+ `guid` int(10) unsigned NOT NULL default '0',
+ `modelid` mediumint(8) unsigned NOT NULL default '0',
+ `equipment_id` mediumint(8) unsigned NOT NULL default '0',
+ `event` smallint(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_model_equip`
+--
+
+LOCK TABLES `game_event_model_equip` WRITE;
+/*!40000 ALTER TABLE `game_event_model_equip` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_model_equip` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_graveyard_zone`
+--
+
+DROP TABLE IF EXISTS `game_graveyard_zone`;
+CREATE TABLE `game_graveyard_zone` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `ghost_zone` mediumint(8) unsigned NOT NULL default '0',
+ `faction` smallint(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`id`,`ghost_zone`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Trigger System';
+
+--
+-- Dumping data for table `game_graveyard_zone`
+--
+
+LOCK TABLES `game_graveyard_zone` WRITE;
+/*!40000 ALTER TABLE `game_graveyard_zone` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_graveyard_zone` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_tele`
+--
+
+DROP TABLE IF EXISTS `game_tele`;
+CREATE TABLE `game_tele` (
+ `id` mediumint(8) unsigned NOT NULL auto_increment,
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ `orientation` float NOT NULL default '0',
+ `map` smallint(5) unsigned NOT NULL default '0',
+ `name` varchar(100) NOT NULL default '',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Tele Command';
+
+--
+-- Dumping data for table `game_tele`
+--
+
+LOCK TABLES `game_tele` WRITE;
+/*!40000 ALTER TABLE `game_tele` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_tele` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_weather`
+--
+
+DROP TABLE IF EXISTS `game_weather`;
+CREATE TABLE `game_weather` (
+ `zone` mediumint(8) unsigned NOT NULL default '0',
+ `spring_rain_chance` tinyint(3) unsigned NOT NULL default '25',
+ `spring_snow_chance` tinyint(3) unsigned NOT NULL default '25',
+ `spring_storm_chance` tinyint(3) unsigned NOT NULL default '25',
+ `summer_rain_chance` tinyint(3) unsigned NOT NULL default '25',
+ `summer_snow_chance` tinyint(3) unsigned NOT NULL default '25',
+ `summer_storm_chance` tinyint(3) unsigned NOT NULL default '25',
+ `fall_rain_chance` tinyint(3) unsigned NOT NULL default '25',
+ `fall_snow_chance` tinyint(3) unsigned NOT NULL default '25',
+ `fall_storm_chance` tinyint(3) unsigned NOT NULL default '25',
+ `winter_rain_chance` tinyint(3) unsigned NOT NULL default '25',
+ `winter_snow_chance` tinyint(3) unsigned NOT NULL default '25',
+ `winter_storm_chance` tinyint(3) unsigned NOT NULL default '25',
+ PRIMARY KEY (`zone`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Weather System';
+
+--
+-- Dumping data for table `game_weather`
+--
+
+LOCK TABLES `game_weather` WRITE;
+/*!40000 ALTER TABLE `game_weather` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_weather` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject`
+--
+
+DROP TABLE IF EXISTS `gameobject`;
+CREATE TABLE `gameobject` (
+ `guid` int(10) unsigned NOT NULL auto_increment COMMENT 'Global Unique Identifier',
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Gameobject Identifier',
+ `map` smallint(5) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
+ `spawnMask` tinyint(3) unsigned NOT NULL default '1',
+ `phaseMask` smallint(5) unsigned NOT NULL default '1',
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ `orientation` float NOT NULL default '0',
+ `rotation0` float NOT NULL default '0',
+ `rotation1` float NOT NULL default '0',
+ `rotation2` float NOT NULL default '0',
+ `rotation3` float NOT NULL default '0',
+ `spawntimesecs` int(11) NOT NULL default '0',
+ `animprogress` tinyint(3) unsigned NOT NULL default '0',
+ `state` tinyint(3) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Gameobject System';
+
+--
+-- Dumping data for table `gameobject`
+--
+
+LOCK TABLES `gameobject` WRITE;
+/*!40000 ALTER TABLE `gameobject` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject_involvedrelation`
+--
+
+DROP TABLE IF EXISTS `gameobject_involvedrelation`;
+CREATE TABLE `gameobject_involvedrelation` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `quest` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`id`,`quest`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `gameobject_involvedrelation`
+--
+
+LOCK TABLES `gameobject_involvedrelation` WRITE;
+/*!40000 ALTER TABLE `gameobject_involvedrelation` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject_involvedrelation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject_loot_template`
+--
+
+DROP TABLE IF EXISTS `gameobject_loot_template`;
+CREATE TABLE `gameobject_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `gameobject_loot_template`
+--
+
+LOCK TABLES `gameobject_loot_template` WRITE;
+/*!40000 ALTER TABLE `gameobject_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject_questrelation`
+--
+
+DROP TABLE IF EXISTS `gameobject_questrelation`;
+CREATE TABLE `gameobject_questrelation` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `quest` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`id`,`quest`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `gameobject_questrelation`
+--
+
+LOCK TABLES `gameobject_questrelation` WRITE;
+/*!40000 ALTER TABLE `gameobject_questrelation` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject_questrelation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject_respawn`
+--
+
+DROP TABLE IF EXISTS `gameobject_respawn`;
+CREATE TABLE `gameobject_respawn` (
+ `guid` int(10) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
+ `respawntime` bigint(20) NOT NULL default '0',
+ `instance` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`,`instance`),
+ KEY `instance` (`instance`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Grid Loading System';
+
+--
+-- Dumping data for table `gameobject_respawn`
+--
+
+LOCK TABLES `gameobject_respawn` WRITE;
+/*!40000 ALTER TABLE `gameobject_respawn` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject_respawn` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject_scripts`
+--
+
+DROP TABLE IF EXISTS `gameobject_scripts`;
+CREATE TABLE `gameobject_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `gameobject_scripts`
+--
+
+LOCK TABLES `gameobject_scripts` WRITE;
+/*!40000 ALTER TABLE `gameobject_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `gameobject_template`
+--
+
+DROP TABLE IF EXISTS `gameobject_template`;
+CREATE TABLE `gameobject_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `type` tinyint(3) unsigned NOT NULL default '0',
+ `displayId` mediumint(8) unsigned NOT NULL default '0',
+ `name` varchar(100) NOT NULL default '',
+ `castBarCaption` varchar(100) NOT NULL default '',
+ `faction` smallint(5) unsigned NOT NULL default '0',
+ `flags` int(10) unsigned NOT NULL default '0',
+ `size` float NOT NULL default '1',
+ `data0` int(10) unsigned NOT NULL default '0',
+ `data1` int(10) unsigned NOT NULL default '0',
+ `data2` int(10) unsigned NOT NULL default '0',
+ `data3` int(10) unsigned NOT NULL default '0',
+ `data4` int(10) unsigned NOT NULL default '0',
+ `data5` int(10) unsigned NOT NULL default '0',
+ `data6` int(10) unsigned NOT NULL default '0',
+ `data7` int(10) unsigned NOT NULL default '0',
+ `data8` int(10) unsigned NOT NULL default '0',
+ `data9` int(10) unsigned NOT NULL default '0',
+ `data10` int(10) unsigned NOT NULL default '0',
+ `data11` int(10) unsigned NOT NULL default '0',
+ `data12` int(10) unsigned NOT NULL default '0',
+ `data13` int(10) unsigned NOT NULL default '0',
+ `data14` int(10) unsigned NOT NULL default '0',
+ `data15` int(10) unsigned NOT NULL default '0',
+ `data16` int(10) unsigned NOT NULL default '0',
+ `data17` int(10) unsigned NOT NULL default '0',
+ `data18` int(10) unsigned NOT NULL default '0',
+ `data19` int(10) unsigned NOT NULL default '0',
+ `data20` int(10) unsigned NOT NULL default '0',
+ `data21` int(10) unsigned NOT NULL default '0',
+ `data22` int(10) unsigned NOT NULL default '0',
+ `data23` int(10) unsigned NOT NULL default '0',
+ `ScriptName` varchar(64) NOT NULL default '',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Gameobject System';
+
+--
+-- Dumping data for table `gameobject_template`
+--
+
+LOCK TABLES `gameobject_template` WRITE;
+/*!40000 ALTER TABLE `gameobject_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `gameobject_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `instance_template`
+--
+
+DROP TABLE IF EXISTS `instance_template`;
+CREATE TABLE `instance_template` (
+ `map` smallint(5) unsigned NOT NULL,
+ `parent` int(10) unsigned NOT NULL,
+ `levelMin` tinyint(3) unsigned NOT NULL default '0',
+ `levelMax` tinyint(3) unsigned NOT NULL default '0',
+ `maxPlayers` tinyint(3) unsigned NOT NULL default '0',
+ `maxPlayersHeroic` tinyint(3) unsigned NOT NULL default '0',
+ `reset_delay` int(10) unsigned NOT NULL default '0',
+ `startLocX` float default NULL,
+ `startLocY` float default NULL,
+ `startLocZ` float default NULL,
+ `startLocO` float default NULL,
+ `script` varchar(128) NOT NULL default '',
+ PRIMARY KEY (`map`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `instance_template`
+--
+
+LOCK TABLES `instance_template` WRITE;
+/*!40000 ALTER TABLE `instance_template` DISABLE KEYS */;
+INSERT INTO `instance_template` VALUES
+(33,0,22,30,10,10,7200,NULL,NULL,NULL,NULL,''),
+(34,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''),
+(36,0,15,20,10,10,7200,NULL,NULL,NULL,NULL,''),
+(43,0,15,21,10,10,7200,NULL,NULL,NULL,NULL,''),
+(47,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''),
+(48,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''),
+(70,0,35,47,10,10,7200,NULL,NULL,NULL,NULL,''),
+(90,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''),
+(109,0,45,55,10,10,7200,NULL,NULL,NULL,NULL,''),
+(129,0,37,46,10,10,7200,NULL,NULL,NULL,NULL,''),
+(189,0,34,45,10,10,7200,NULL,NULL,NULL,NULL,''),
+(209,0,44,54,10,10,7200,NULL,NULL,NULL,NULL,''),
+(229,0,58,0,10,10,120000,78.5083,-225.044,49.839,5.1,''),
+(230,0,52,0,5,5,7200,NULL,NULL,NULL,NULL,''),
+(249,0,60,0,40,40,432000,NULL,NULL,NULL,NULL,''),
+(289,0,57,0,5,5,7200,NULL,NULL,NULL,NULL,''),
+(309,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''),
+(329,0,58,60,5,5,7200,NULL,NULL,NULL,NULL,''),
+(349,0,46,55,10,10,7200,NULL,NULL,NULL,NULL,''),
+(389,0,13,18,10,10,7200,NULL,NULL,NULL,NULL,''),
+(409,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''),
+(429,0,55,60,5,5,7200,NULL,NULL,NULL,NULL,''),
+(469,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''),
+(509,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''),
+(531,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''),
+(533,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
+(615,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
+(616,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
+(624,0,80,0,10,25,0,NULL,NULL,NULL,NULL,'');
+/*!40000 ALTER TABLE `instance_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `item_enchantment_template`
+--
+
+DROP TABLE IF EXISTS `item_enchantment_template`;
+CREATE TABLE `item_enchantment_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `ench` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`ench`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item Random Enchantment System';
+
+--
+-- Dumping data for table `item_enchantment_template`
+--
+
+LOCK TABLES `item_enchantment_template` WRITE;
+/*!40000 ALTER TABLE `item_enchantment_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `item_enchantment_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `item_loot_template`
+--
+
+DROP TABLE IF EXISTS `item_loot_template`;
+CREATE TABLE `item_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `item_loot_template`
+--
+
+LOCK TABLES `item_loot_template` WRITE;
+/*!40000 ALTER TABLE `item_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `item_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `item_template`
+--
+
+DROP TABLE IF EXISTS `item_template`;
+CREATE TABLE `item_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `subclass` tinyint(3) unsigned NOT NULL default '0',
+ `unk0` int(11) NOT NULL default '-1',
+ `name` varchar(255) NOT NULL default '',
+ `displayid` mediumint(8) unsigned NOT NULL default '0',
+ `Quality` tinyint(3) unsigned NOT NULL default '0',
+ `Flags` int(10) unsigned NOT NULL default '0',
+ `BuyCount` tinyint(3) unsigned NOT NULL default '1',
+ `BuyPrice` int(10) unsigned NOT NULL default '0',
+ `SellPrice` int(10) unsigned NOT NULL default '0',
+ `InventoryType` tinyint(3) unsigned NOT NULL default '0',
+ `AllowableClass` mediumint(9) NOT NULL default '-1',
+ `AllowableRace` mediumint(9) NOT NULL default '-1',
+ `ItemLevel` tinyint(3) unsigned NOT NULL default '0',
+ `RequiredLevel` tinyint(3) unsigned NOT NULL default '0',
+ `RequiredSkill` smallint(5) unsigned NOT NULL default '0',
+ `RequiredSkillRank` smallint(5) unsigned NOT NULL default '0',
+ `requiredspell` mediumint(8) unsigned NOT NULL default '0',
+ `requiredhonorrank` mediumint(8) unsigned NOT NULL default '0',
+ `RequiredCityRank` mediumint(8) unsigned NOT NULL default '0',
+ `RequiredReputationFaction` smallint(5) unsigned NOT NULL default '0',
+ `RequiredReputationRank` smallint(5) unsigned NOT NULL default '0',
+ `maxcount` smallint(5) NOT NULL default '-1',
+ `stackable` smallint(5) NOT NULL default '1',
+ `ContainerSlots` tinyint(3) unsigned NOT NULL default '0',
+ `StatsCount` tinyint(3) unsigned NOT NULL default '0',
+ `stat_type1` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value1` smallint(6) NOT NULL default '0',
+ `stat_type2` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value2` smallint(6) NOT NULL default '0',
+ `stat_type3` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value3` smallint(6) NOT NULL default '0',
+ `stat_type4` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value4` smallint(6) NOT NULL default '0',
+ `stat_type5` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value5` smallint(6) NOT NULL default '0',
+ `stat_type6` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value6` smallint(6) NOT NULL default '0',
+ `stat_type7` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value7` smallint(6) NOT NULL default '0',
+ `stat_type8` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value8` smallint(6) NOT NULL default '0',
+ `stat_type9` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value9` smallint(6) NOT NULL default '0',
+ `stat_type10` tinyint(3) unsigned NOT NULL default '0',
+ `stat_value10` smallint(6) NOT NULL default '0',
+ `ScalingStatDistribution` smallint(6) NOT NULL default '0',
+ `ScalingStatValue` smallint(6) NOT NULL default '0',
+ `dmg_min1` float NOT NULL default '0',
+ `dmg_max1` float NOT NULL default '0',
+ `dmg_type1` tinyint(3) unsigned NOT NULL default '0',
+ `dmg_min2` float NOT NULL default '0',
+ `dmg_max2` float NOT NULL default '0',
+ `dmg_type2` tinyint(3) unsigned NOT NULL default '0',
+ `dmg_min3` float NOT NULL default '0',
+ `dmg_max3` float NOT NULL default '0',
+ `dmg_type3` tinyint(3) unsigned NOT NULL default '0',
+ `dmg_min4` float NOT NULL default '0',
+ `dmg_max4` float NOT NULL default '0',
+ `dmg_type4` tinyint(3) unsigned NOT NULL default '0',
+ `dmg_min5` float NOT NULL default '0',
+ `dmg_max5` float NOT NULL default '0',
+ `dmg_type5` tinyint(3) unsigned NOT NULL default '0',
+ `armor` smallint(5) unsigned NOT NULL default '0',
+ `holy_res` tinyint(3) unsigned NOT NULL default '0',
+ `fire_res` tinyint(3) unsigned NOT NULL default '0',
+ `nature_res` tinyint(3) unsigned NOT NULL default '0',
+ `frost_res` tinyint(3) unsigned NOT NULL default '0',
+ `shadow_res` tinyint(3) unsigned NOT NULL default '0',
+ `arcane_res` tinyint(3) unsigned NOT NULL default '0',
+ `delay` smallint(5) unsigned NOT NULL default '1000',
+ `ammo_type` tinyint(3) unsigned NOT NULL default '0',
+ `RangedModRange` float NOT NULL default '0',
+ `spellid_1` mediumint(8) unsigned NOT NULL default '0',
+ `spelltrigger_1` tinyint(3) unsigned NOT NULL default '0',
+ `spellcharges_1` tinyint(4) NOT NULL default '0',
+ `spellppmRate_1` float NOT NULL default '0',
+ `spellcooldown_1` int(11) NOT NULL default '-1',
+ `spellcategory_1` smallint(5) unsigned NOT NULL default '0',
+ `spellcategorycooldown_1` int(11) NOT NULL default '-1',
+ `spellid_2` mediumint(8) unsigned NOT NULL default '0',
+ `spelltrigger_2` tinyint(3) unsigned NOT NULL default '0',
+ `spellcharges_2` tinyint(4) NOT NULL default '0',
+ `spellppmRate_2` float NOT NULL default '0',
+ `spellcooldown_2` int(11) NOT NULL default '-1',
+ `spellcategory_2` smallint(5) unsigned NOT NULL default '0',
+ `spellcategorycooldown_2` int(11) NOT NULL default '-1',
+ `spellid_3` mediumint(8) unsigned NOT NULL default '0',
+ `spelltrigger_3` tinyint(3) unsigned NOT NULL default '0',
+ `spellcharges_3` tinyint(4) NOT NULL default '0',
+ `spellppmRate_3` float NOT NULL default '0',
+ `spellcooldown_3` int(11) NOT NULL default '-1',
+ `spellcategory_3` smallint(5) unsigned NOT NULL default '0',
+ `spellcategorycooldown_3` int(11) NOT NULL default '-1',
+ `spellid_4` mediumint(8) unsigned NOT NULL default '0',
+ `spelltrigger_4` tinyint(3) unsigned NOT NULL default '0',
+ `spellcharges_4` tinyint(4) NOT NULL default '0',
+ `spellppmRate_4` float NOT NULL default '0',
+ `spellcooldown_4` int(11) NOT NULL default '-1',
+ `spellcategory_4` smallint(5) unsigned NOT NULL default '0',
+ `spellcategorycooldown_4` int(11) NOT NULL default '-1',
+ `spellid_5` mediumint(8) unsigned NOT NULL default '0',
+ `spelltrigger_5` tinyint(3) unsigned NOT NULL default '0',
+ `spellcharges_5` tinyint(4) NOT NULL default '0',
+ `spellppmRate_5` float NOT NULL default '0',
+ `spellcooldown_5` int(11) NOT NULL default '-1',
+ `spellcategory_5` smallint(5) unsigned NOT NULL default '0',
+ `spellcategorycooldown_5` int(11) NOT NULL default '-1',
+ `bonding` tinyint(3) unsigned NOT NULL default '0',
+ `description` varchar(255) NOT NULL default '',
+ `PageText` mediumint(8) unsigned NOT NULL default '0',
+ `LanguageID` tinyint(3) unsigned NOT NULL default '0',
+ `PageMaterial` tinyint(3) unsigned NOT NULL default '0',
+ `startquest` mediumint(8) unsigned NOT NULL default '0',
+ `lockid` mediumint(8) unsigned NOT NULL default '0',
+ `Material` tinyint(4) NOT NULL default '0',
+ `sheath` tinyint(3) unsigned NOT NULL default '0',
+ `RandomProperty` mediumint(8) unsigned NOT NULL default '0',
+ `RandomSuffix` mediumint(8) unsigned NOT NULL default '0',
+ `block` mediumint(8) unsigned NOT NULL default '0',
+ `itemset` mediumint(8) unsigned NOT NULL default '0',
+ `MaxDurability` smallint(5) unsigned NOT NULL default '0',
+ `area` mediumint(8) unsigned NOT NULL default '0',
+ `Map` smallint(6) NOT NULL default '0',
+ `BagFamily` mediumint(9) NOT NULL default '0',
+ `TotemCategory` mediumint(9) NOT NULL default '0',
+ `socketColor_1` tinyint(4) NOT NULL default '0',
+ `socketContent_1` mediumint(9) NOT NULL default '0',
+ `socketColor_2` tinyint(4) NOT NULL default '0',
+ `socketContent_2` mediumint(9) NOT NULL default '0',
+ `socketColor_3` tinyint(4) NOT NULL default '0',
+ `socketContent_3` mediumint(9) NOT NULL default '0',
+ `socketBonus` mediumint(9) NOT NULL default '0',
+ `GemProperties` mediumint(9) NOT NULL default '0',
+ `RequiredDisenchantSkill` smallint(6) NOT NULL default '-1',
+ `ArmorDamageModifier` float NOT NULL default '0',
+ `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time',
+ `ItemLimitCategory` smallint(6) NOT NULL default '0',
+ `ScriptName` varchar(64) NOT NULL default '',
+ `DisenchantID` mediumint(8) unsigned NOT NULL default '0',
+ `FoodType` tinyint(3) unsigned NOT NULL default '0',
+ `minMoneyLoot` int(10) unsigned NOT NULL default '0',
+ `maxMoneyLoot` int(10) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`),
+ KEY `items_index` (`class`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
+
+--
+-- Dumping data for table `item_template`
+--
+
+LOCK TABLES `item_template` WRITE;
+/*!40000 ALTER TABLE `item_template` DISABLE KEYS */;
+INSERT INTO `item_template` VALUES
+(25,2,7,-1,'Worn Shortsword',1542,1,0,1,35,7,21,32767,511,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,1,0,0,0,1,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(35,2,10,-1,'Bent Staff',472,1,0,1,47,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,2,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(36,2,4,-1,'Worn Mace',5194,1,0,1,38,7,21,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(37,2,0,-1,'Worn Axe',14029,1,0,1,38,7,21,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(38,4,0,-1,'Recruit\'s Shirt',9891,1,0,1,1,1,4,-1,-1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(39,4,1,-1,'Recruit\'s Pants',9892,0,0,1,5,1,7,32767,511,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(40,4,0,-1,'Recruit\'s Boots',10141,1,0,1,4,1,8,32767,511,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(43,4,0,-1,'Squire\'s Boots',9938,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(44,4,1,-1,'Squire\'s Pants',9937,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(45,4,0,-1,'Squire\'s Shirt',3265,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(47,4,0,-1,'Footpad\'s Shoes',9915,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(48,4,1,-1,'Footpad\'s Pants',9913,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(49,4,0,-1,'Footpad\'s Shirt',9906,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(51,4,0,-1,'Neophyte\'s Boots',9946,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(52,4,1,-1,'Neophyte\'s Pants',9945,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(53,4,0,-1,'Neophyte\'s Shirt',9944,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(55,4,0,-1,'Apprentice\'s Boots',9929,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(56,4,1,-1,'Apprentice\'s Robe',12647,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(57,4,1,-1,'Acolyte\'s Robe',12645,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(59,4,0,-1,'Acolyte\'s Shoes',3261,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(117,0,0,-1,'Tough Jerky',2473,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(120,4,1,-1,'Thug Pants',10006,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(121,4,0,-1,'Thug Boots',10008,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(127,4,0,-1,'Trapper\'s Shirt',9996,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(139,4,1,-1,'Brawler\'s Pants',9988,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(140,4,0,-1,'Brawler\'s Boots',9992,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(147,4,1,-1,'Rugged Trapper\'s Pants',9975,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(148,4,0,-1,'Rugged Trapper\'s Shirt',9976,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(153,4,2,-1,'Primitive Kilt',10050,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,8,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(154,4,0,-1,'Primitive Mantle',10058,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(159,0,0,-1,'Refreshing Spring Water',18084,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,430,0,-1,0,-1,59,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(1395,4,1,-1,'Apprentice\'s Pants',9924,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(1396,4,1,-1,'Acolyte\'s Pants',3260,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2070,0,0,-1,'Darnassian Bleu',6353,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2092,2,15,-1,'Worn Dagger',6442,1,0,1,35,7,13,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1600,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,3,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2101,1,2,-1,'Light Quiver',21328,1,0,1,4,1,18,2047,255,1,1,0,0,0,0,0,0,0,0,1,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,14824,1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2102,1,3,-1,'Small Ammo Pouch',1816,1,0,1,4,1,18,2047,255,1,1,0,0,0,0,0,0,0,0,1,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,14824,1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2105,4,0,-1,'Thug Shirt',10005,1,0,1,5,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2361,2,5,-1,'Battleworn Hammer',8690,1,0,1,45,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,1,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2362,4,6,-1,'Worn Wooden Shield',18730,0,0,1,7,1,14,32767,511,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,4,0,0,1,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2504,2,2,-1,'Worn Shortbow',8106,1,0,1,29,5,15,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2300,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2508,2,3,-1,'Old Blunderbuss',6606,1,0,1,27,5,26,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2300,3,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2512,6,2,-1,'Rough Arrow',5996,1,0,1,10,0,24,2047,255,5,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2516,6,3,-1,'Light Shot',5998,1,0,1,10,0,24,2047,255,5,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2947,2,16,-1,'Small Throwing Knife',16754,1,0,1,15,0,25,2047,255,3,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,4,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(3661,2,10,-1,'Handcrafted Staff',18530,1,0,1,45,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,2,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4536,0,0,-1,'Shiny Red Apple',6410,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4540,0,0,-1,'Tough Hunk of Bread',6399,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4604,0,0,-1,'Forest Mushroom Cap',15852,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6096,4,0,-1,'Apprentice\'s Shirt',2163,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6097,4,0,-1,'Acolyte\'s Shirt',2470,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6098,4,1,-1,'Neophyte\'s Robe',12679,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6119,4,1,-1,'Neophyte\'s Robe',12681,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6123,4,1,-1,'Novice\'s Robe',12683,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6124,4,1,-1,'Novice\'s Pants',9987,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6125,4,0,-1,'Brawler\'s Harness',9995,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6126,4,1,-1,'Trapper\'s Pants',10002,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6127,4,0,-1,'Trapper\'s Boots',10003,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6129,4,1,-1,'Acolyte\'s Robe',12646,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6134,4,0,-1,'Primitive Mantle',10108,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6135,4,2,-1,'Primitive Kilt',10109,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,8,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6139,4,1,-1,'Novice\'s Robe',12684,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6140,4,1,-1,'Apprentice\'s Robe',12649,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6144,4,1,-1,'Neophyte\'s Robe',12680,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6948,15,0,-1,'Hearthstone',6418,1,64,1,0,0,0,32767,511,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8690,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(12282,2,1,-1,'Worn Battleaxe',22291,1,0,1,43,8,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,1,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14646,12,0,-1,'Northshire Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14647,12,0,-1,'Coldridge Valley Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14648,12,0,-1,'Shadowglen Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5842,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14649,12,0,-1,'Valley of Trials Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5843,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14650,12,0,-1,'Camp Narache Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14651,12,0,-1,'Deathknell Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5847,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(25861,2,16,-1,'Crude Throwing Axe',20777,1,0,1,15,0,25,2047,255,3,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,4,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(34648,4,4,-1,'Acherus Knight\'s Greaves',51496,2,32768,1,51,10,8,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,10,7,12,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34649,4,4,-1,'Acherus Knight\'s Gauntlets',51498,2,32768,1,34,6,10,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,6,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34650,4,4,-1,'Acherus Knight\'s Tunic',51494,2,32768,1,69,13,5,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,20,7,11,32,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,570,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34651,4,4,-1,'Acherus Knight\'s Girdle',51497,2,32768,1,35,7,6,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,10,32,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,320,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34652,4,4,-1,'Acherus Knight\'s Hood',51495,2,32768,1,52,10,1,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,15,32,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,463,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34653,4,4,-1,'Acherus Knight\'s Wristguard',51500,2,32768,1,36,7,9,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,7,31,7,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34655,4,4,-1,'Acherus Knight\'s Pauldrons',51501,2,32768,1,54,10,3,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,9,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34656,4,4,-1,'Acherus Knight\'s Cover',51499,2,32768,1,73,14,7,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,13,3,10,7,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34657,4,0,-1,'Choker of Damnation',6539,2,32768,1,2303,575,2,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,9,7,8,31,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34658,4,0,-1,'Plague Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34659,4,1,-1,'Acherus Knight\'s Shroud',49738,2,32768,1,31,6,16,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38145,1,0,-1,'Deathweave Bag',1282,1,32768,1,0,0,18,-1,-1,35,0,0,0,0,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38147,4,0,-1,'Corrupted Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(41751,0,5,-1,'Black Mushroom',36728,1,0,1,100,5,0,-1,-1,65,55,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27094,0,-1,0,0,11,1000,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,'',0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0);
+/*!40000 ALTER TABLE `item_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_achievement_reward`
+--
+
+DROP TABLE IF EXISTS `locales_achievement_reward`;
+CREATE TABLE `locales_achievement_reward` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `subject_loc1` varchar(100) NOT NULL default '',
+ `subject_loc2` varchar(100) NOT NULL default '',
+ `subject_loc3` varchar(100) NOT NULL default '',
+ `subject_loc4` varchar(100) NOT NULL default '',
+ `subject_loc5` varchar(100) NOT NULL default '',
+ `subject_loc6` varchar(100) NOT NULL default '',
+ `subject_loc7` varchar(100) NOT NULL default '',
+ `subject_loc8` varchar(100) NOT NULL default '',
+ `text_loc1` text default NULL,
+ `text_loc2` text default NULL,
+ `text_loc3` text default NULL,
+ `text_loc4` text default NULL,
+ `text_loc5` text default NULL,
+ `text_loc6` text default NULL,
+ `text_loc7` text default NULL,
+ `text_loc8` text default NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_achievement_reward`
+--
+
+LOCK TABLES `locales_achievement_reward` WRITE;
+/*!40000 ALTER TABLE `locales_achievement_reward` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_achievement_reward` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_creature`
+--
+
+DROP TABLE IF EXISTS `locales_creature`;
+CREATE TABLE `locales_creature` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `name_loc1` varchar(100) NOT NULL default '',
+ `name_loc2` varchar(100) NOT NULL default '',
+ `name_loc3` varchar(100) NOT NULL default '',
+ `name_loc4` varchar(100) NOT NULL default '',
+ `name_loc5` varchar(100) NOT NULL default '',
+ `name_loc6` varchar(100) NOT NULL default '',
+ `name_loc7` varchar(100) NOT NULL default '',
+ `name_loc8` varchar(100) NOT NULL default '',
+ `subname_loc1` varchar(100) default NULL,
+ `subname_loc2` varchar(100) default NULL,
+ `subname_loc3` varchar(100) default NULL,
+ `subname_loc4` varchar(100) default NULL,
+ `subname_loc5` varchar(100) default NULL,
+ `subname_loc6` varchar(100) default NULL,
+ `subname_loc7` varchar(100) default NULL,
+ `subname_loc8` varchar(100) default NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_creature`
+--
+
+LOCK TABLES `locales_creature` WRITE;
+/*!40000 ALTER TABLE `locales_creature` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_creature` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_gameobject`
+--
+
+DROP TABLE IF EXISTS `locales_gameobject`;
+CREATE TABLE `locales_gameobject` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `name_loc1` varchar(100) NOT NULL default '',
+ `name_loc2` varchar(100) NOT NULL default '',
+ `name_loc3` varchar(100) NOT NULL default '',
+ `name_loc4` varchar(100) NOT NULL default '',
+ `name_loc5` varchar(100) NOT NULL default '',
+ `name_loc6` varchar(100) NOT NULL default '',
+ `name_loc7` varchar(100) NOT NULL default '',
+ `name_loc8` varchar(100) NOT NULL default '',
+ `castbarcaption_loc1` varchar(100) NOT NULL default '',
+ `castbarcaption_loc2` varchar(100) NOT NULL default '',
+ `castbarcaption_loc3` varchar(100) NOT NULL default '',
+ `castbarcaption_loc4` varchar(100) NOT NULL default '',
+ `castbarcaption_loc5` varchar(100) NOT NULL default '',
+ `castbarcaption_loc6` varchar(100) NOT NULL default '',
+ `castbarcaption_loc7` varchar(100) NOT NULL default '',
+ `castbarcaption_loc8` varchar(100) NOT NULL default '',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_gameobject`
+--
+
+LOCK TABLES `locales_gameobject` WRITE;
+/*!40000 ALTER TABLE `locales_gameobject` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_gameobject` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_item`
+--
+
+DROP TABLE IF EXISTS `locales_item`;
+CREATE TABLE `locales_item` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `name_loc1` varchar(100) NOT NULL default '',
+ `name_loc2` varchar(100) NOT NULL default '',
+ `name_loc3` varchar(100) NOT NULL default '',
+ `name_loc4` varchar(100) NOT NULL default '',
+ `name_loc5` varchar(100) NOT NULL default '',
+ `name_loc6` varchar(100) NOT NULL default '',
+ `name_loc7` varchar(100) NOT NULL default '',
+ `name_loc8` varchar(100) NOT NULL default '',
+ `description_loc1` varchar(255) default NULL,
+ `description_loc2` varchar(255) default NULL,
+ `description_loc3` varchar(255) default NULL,
+ `description_loc4` varchar(255) default NULL,
+ `description_loc5` varchar(255) default NULL,
+ `description_loc6` varchar(255) default NULL,
+ `description_loc7` varchar(255) default NULL,
+ `description_loc8` varchar(255) default NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_item`
+--
+
+LOCK TABLES `locales_item` WRITE;
+/*!40000 ALTER TABLE `locales_item` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_item` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+--
+-- Table structure for table `locales_npc_option`
+--
+
+DROP TABLE IF EXISTS `locales_npc_option`;
+CREATE TABLE `locales_npc_option` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `option_text_loc1` text,
+ `option_text_loc2` text,
+ `option_text_loc3` text,
+ `option_text_loc4` text,
+ `option_text_loc5` text,
+ `option_text_loc6` text,
+ `option_text_loc7` text,
+ `option_text_loc8` text,
+ `box_text_loc1` text,
+ `box_text_loc2` text,
+ `box_text_loc3` text,
+ `box_text_loc4` text,
+ `box_text_loc5` text,
+ `box_text_loc6` text,
+ `box_text_loc7` text,
+ `box_text_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_npc_option`
+--
+
+LOCK TABLES `locales_npc_option` WRITE;
+/*!40000 ALTER TABLE `locales_npc_option` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_npc_option` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_npc_text`
+--
+
+DROP TABLE IF EXISTS `locales_npc_text`;
+CREATE TABLE `locales_npc_text` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `Text0_0_loc1` longtext,
+ `Text0_0_loc2` longtext,
+ `Text0_0_loc3` longtext,
+ `Text0_0_loc4` longtext,
+ `Text0_0_loc5` longtext,
+ `Text0_0_loc6` longtext,
+ `Text0_0_loc7` longtext,
+ `Text0_0_loc8` longtext,
+ `Text0_1_loc1` longtext,
+ `Text0_1_loc2` longtext,
+ `Text0_1_loc3` longtext,
+ `Text0_1_loc4` longtext,
+ `Text0_1_loc5` longtext,
+ `Text0_1_loc6` longtext,
+ `Text0_1_loc7` longtext,
+ `Text0_1_loc8` longtext,
+ `Text1_0_loc1` longtext,
+ `Text1_0_loc2` longtext,
+ `Text1_0_loc3` longtext,
+ `Text1_0_loc4` longtext,
+ `Text1_0_loc5` longtext,
+ `Text1_0_loc6` longtext,
+ `Text1_0_loc7` longtext,
+ `Text1_0_loc8` longtext,
+ `Text1_1_loc1` longtext,
+ `Text1_1_loc2` longtext,
+ `Text1_1_loc3` longtext,
+ `Text1_1_loc4` longtext,
+ `Text1_1_loc5` longtext,
+ `Text1_1_loc6` longtext,
+ `Text1_1_loc7` longtext,
+ `Text1_1_loc8` longtext,
+ `Text2_0_loc1` longtext,
+ `Text2_0_loc2` longtext,
+ `Text2_0_loc3` longtext,
+ `Text2_0_loc4` longtext,
+ `Text2_0_loc5` longtext,
+ `Text2_0_loc6` longtext,
+ `Text2_0_loc7` longtext,
+ `Text2_0_loc8` longtext,
+ `Text2_1_loc1` longtext,
+ `Text2_1_loc2` longtext,
+ `Text2_1_loc3` longtext,
+ `Text2_1_loc4` longtext,
+ `Text2_1_loc5` longtext,
+ `Text2_1_loc6` longtext,
+ `Text2_1_loc7` longtext,
+ `Text2_1_loc8` longtext,
+ `Text3_0_loc1` longtext,
+ `Text3_0_loc2` longtext,
+ `Text3_0_loc3` longtext,
+ `Text3_0_loc4` longtext,
+ `Text3_0_loc5` longtext,
+ `Text3_0_loc6` longtext,
+ `Text3_0_loc7` longtext,
+ `Text3_0_loc8` longtext,
+ `Text3_1_loc1` longtext,
+ `Text3_1_loc2` longtext,
+ `Text3_1_loc3` longtext,
+ `Text3_1_loc4` longtext,
+ `Text3_1_loc5` longtext,
+ `Text3_1_loc6` longtext,
+ `Text3_1_loc7` longtext,
+ `Text3_1_loc8` longtext,
+ `Text4_0_loc1` longtext,
+ `Text4_0_loc2` longtext,
+ `Text4_0_loc3` longtext,
+ `Text4_0_loc4` longtext,
+ `Text4_0_loc5` longtext,
+ `Text4_0_loc6` longtext,
+ `Text4_0_loc7` longtext,
+ `Text4_0_loc8` longtext,
+ `Text4_1_loc1` longtext,
+ `Text4_1_loc2` longtext,
+ `Text4_1_loc3` longtext,
+ `Text4_1_loc4` longtext,
+ `Text4_1_loc5` longtext,
+ `Text4_1_loc6` longtext,
+ `Text4_1_loc7` longtext,
+ `Text4_1_loc8` longtext,
+ `Text5_0_loc1` longtext,
+ `Text5_0_loc2` longtext,
+ `Text5_0_loc3` longtext,
+ `Text5_0_loc4` longtext,
+ `Text5_0_loc5` longtext,
+ `Text5_0_loc6` longtext,
+ `Text5_0_loc7` longtext,
+ `Text5_0_loc8` longtext,
+ `Text5_1_loc1` longtext,
+ `Text5_1_loc2` longtext,
+ `Text5_1_loc3` longtext,
+ `Text5_1_loc4` longtext,
+ `Text5_1_loc5` longtext,
+ `Text5_1_loc6` longtext,
+ `Text5_1_loc7` longtext,
+ `Text5_1_loc8` longtext,
+ `Text6_0_loc1` longtext,
+ `Text6_0_loc2` longtext,
+ `Text6_0_loc3` longtext,
+ `Text6_0_loc4` longtext,
+ `Text6_0_loc5` longtext,
+ `Text6_0_loc6` longtext,
+ `Text6_0_loc7` longtext,
+ `Text6_0_loc8` longtext,
+ `Text6_1_loc1` longtext,
+ `Text6_1_loc2` longtext,
+ `Text6_1_loc3` longtext,
+ `Text6_1_loc4` longtext,
+ `Text6_1_loc5` longtext,
+ `Text6_1_loc6` longtext,
+ `Text6_1_loc7` longtext,
+ `Text6_1_loc8` longtext,
+ `Text7_0_loc1` longtext,
+ `Text7_0_loc2` longtext,
+ `Text7_0_loc3` longtext,
+ `Text7_0_loc4` longtext,
+ `Text7_0_loc5` longtext,
+ `Text7_0_loc6` longtext,
+ `Text7_0_loc7` longtext,
+ `Text7_0_loc8` longtext,
+ `Text7_1_loc1` longtext,
+ `Text7_1_loc2` longtext,
+ `Text7_1_loc3` longtext,
+ `Text7_1_loc4` longtext,
+ `Text7_1_loc5` longtext,
+ `Text7_1_loc6` longtext,
+ `Text7_1_loc7` longtext,
+ `Text7_1_loc8` longtext,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_npc_text`
+--
+
+LOCK TABLES `locales_npc_text` WRITE;
+/*!40000 ALTER TABLE `locales_npc_text` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_npc_text` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_page_text`
+--
+
+DROP TABLE IF EXISTS `locales_page_text`;
+CREATE TABLE `locales_page_text` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `Text_loc1` longtext,
+ `Text_loc2` longtext,
+ `Text_loc3` longtext,
+ `Text_loc4` longtext,
+ `Text_loc5` longtext,
+ `Text_loc6` longtext,
+ `Text_loc7` longtext,
+ `Text_loc8` longtext,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_page_text`
+--
+
+LOCK TABLES `locales_page_text` WRITE;
+/*!40000 ALTER TABLE `locales_page_text` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_page_text` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_points_of_interest`
+--
+
+DROP TABLE IF EXISTS `locales_points_of_interest`;
+CREATE TABLE `locales_points_of_interest` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `icon_name_loc1` text,
+ `icon_name_loc2` text,
+ `icon_name_loc3` text,
+ `icon_name_loc4` text,
+ `icon_name_loc5` text,
+ `icon_name_loc6` text,
+ `icon_name_loc7` text,
+ `icon_name_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_points_of_interest`
+--
+
+LOCK TABLES `locales_points_of_interest` WRITE;
+/*!40000 ALTER TABLE `locales_points_of_interest` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_points_of_interest` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_quest`
+--
+
+DROP TABLE IF EXISTS `locales_quest`;
+CREATE TABLE `locales_quest` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `Title_loc1` text,
+ `Title_loc2` text,
+ `Title_loc3` text,
+ `Title_loc4` text,
+ `Title_loc5` text,
+ `Title_loc6` text,
+ `Title_loc7` text,
+ `Title_loc8` text,
+ `Details_loc1` text,
+ `Details_loc2` text,
+ `Details_loc3` text,
+ `Details_loc4` text,
+ `Details_loc5` text,
+ `Details_loc6` text,
+ `Details_loc7` text,
+ `Details_loc8` text,
+ `Objectives_loc1` text,
+ `Objectives_loc2` text,
+ `Objectives_loc3` text,
+ `Objectives_loc4` text,
+ `Objectives_loc5` text,
+ `Objectives_loc6` text,
+ `Objectives_loc7` text,
+ `Objectives_loc8` text,
+ `OfferRewardText_loc1` text,
+ `OfferRewardText_loc2` text,
+ `OfferRewardText_loc3` text,
+ `OfferRewardText_loc4` text,
+ `OfferRewardText_loc5` text,
+ `OfferRewardText_loc6` text,
+ `OfferRewardText_loc7` text,
+ `OfferRewardText_loc8` text,
+ `RequestItemsText_loc1` text,
+ `RequestItemsText_loc2` text,
+ `RequestItemsText_loc3` text,
+ `RequestItemsText_loc4` text,
+ `RequestItemsText_loc5` text,
+ `RequestItemsText_loc6` text,
+ `RequestItemsText_loc7` text,
+ `RequestItemsText_loc8` text,
+ `EndText_loc1` text,
+ `EndText_loc2` text,
+ `EndText_loc3` text,
+ `EndText_loc4` text,
+ `EndText_loc5` text,
+ `EndText_loc6` text,
+ `EndText_loc7` text,
+ `EndText_loc8` text,
+ `ObjectiveText1_loc1` text,
+ `ObjectiveText1_loc2` text,
+ `ObjectiveText1_loc3` text,
+ `ObjectiveText1_loc4` text,
+ `ObjectiveText1_loc5` text,
+ `ObjectiveText1_loc6` text,
+ `ObjectiveText1_loc7` text,
+ `ObjectiveText1_loc8` text,
+ `ObjectiveText2_loc1` text,
+ `ObjectiveText2_loc2` text,
+ `ObjectiveText2_loc3` text,
+ `ObjectiveText2_loc4` text,
+ `ObjectiveText2_loc5` text,
+ `ObjectiveText2_loc6` text,
+ `ObjectiveText2_loc7` text,
+ `ObjectiveText2_loc8` text,
+ `ObjectiveText3_loc1` text,
+ `ObjectiveText3_loc2` text,
+ `ObjectiveText3_loc3` text,
+ `ObjectiveText3_loc4` text,
+ `ObjectiveText3_loc5` text,
+ `ObjectiveText3_loc6` text,
+ `ObjectiveText3_loc7` text,
+ `ObjectiveText3_loc8` text,
+ `ObjectiveText4_loc1` text,
+ `ObjectiveText4_loc2` text,
+ `ObjectiveText4_loc3` text,
+ `ObjectiveText4_loc4` text,
+ `ObjectiveText4_loc5` text,
+ `ObjectiveText4_loc6` text,
+ `ObjectiveText4_loc7` text,
+ `ObjectiveText4_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_quest`
+--
+
+LOCK TABLES `locales_quest` WRITE;
+/*!40000 ALTER TABLE `locales_quest` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_quest` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `mangos_string`
+--
+
+DROP TABLE IF EXISTS `mangos_string`;
+CREATE TABLE `mangos_string` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `content_default` text NOT NULL,
+ `content_loc1` text,
+ `content_loc2` text,
+ `content_loc3` text,
+ `content_loc4` text,
+ `content_loc5` text,
+ `content_loc6` text,
+ `content_loc7` text,
+ `content_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `mangos_string`
+--
+
+LOCK TABLES `mangos_string` WRITE;
+/*!40000 ALTER TABLE `mangos_string` DISABLE KEYS */;
+INSERT INTO `mangos_string` VALUES
+(1,'You should select a character or a creature.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(2,'You should select a creature.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(3,'|cffff0000[System Message]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(4,'|cffff0000[Event Message]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(5,'There is no help for that command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(6,'There is no such command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(7,'There is no such subcommand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(8,'Command %s have subcommands:%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(9,'Commands available to you:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10,'Incorrect syntax.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(11,'Your account level is: %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(12,'Online players: %u (max: %u) Queued players: %u (max: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(13,'Server uptime: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(14,'Player saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(15,'All players saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(16,'There are the following active GMs on this server:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(17,'There are no GMs currently logged in on this server.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(18,'Cannot do that while flying.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(19,'Cannot do that in Battlegrounds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(20,'Target is flying you can\'t do that.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(21,'%s is flying command failed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(22,'You are not mounted so you can\'t dismount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(23,'Cannot do that while fighting.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(24,'You used it recently.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(25,'Password not changed (unknown error)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(26,'The password was changed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(27,'The new passwords do not match or the old password is wrong',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(28,'Your account is now locked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(29,'Your account is now unlocked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(30,', rank ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(31,' [known]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(32,' [learn]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(33,' [passive]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(34,' [talent]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(35,' [active]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(36,' [complete]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(37,' (offline)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(38,'on',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(39,'off',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(40,'You are: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(41,'visible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(42,'invisible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(43,'done',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(44,'You',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(45,' <unknown> ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(46,'<error>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(47,'<non-existing character>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(48,'UNKNOWN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(49,'You must be at least level %u to enter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(50,'You must be at least level %u and have item %s to enter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(51,'Hello! Ready for some training?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(52,'Invaid item count (%u) for item %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(53,'Mail can\'t have more %u item stacks',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(54,'The new passwords do not match',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(55,'Your password can\'t be longer than 16 characters (client limit), password not changed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(56,'Current Message of the day: \r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(57,'Using World DB: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(58,'Using script library: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(100,'Global notify: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(101,'Map: %u (%s) Zone: %u (%s) Area: %u (%s) Phase: %u\nX: %f Y: %f Z: %f Orientation: %f\ngrid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(102,'%s is already being teleported.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(103,'You can summon a player to your instance only if he is in your party with you as leader.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(104,'You cannot go to the player\'s instance because you are in a party now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(105,'You can go to the player\'s instance while not being in his party only if your GM mode is on.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(106,'You can not go to player %s from instance to instance.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(107,'You can not summon player %s from instance to instance.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(108,'You are summoning %s%s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(109,'You are being summoned by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(110,'You are teleporting %s%s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(111,'You are being teleported by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(112,'Player (%s) does not exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(113,'Appearing at %s\'s location.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(114,'%s is appearing to your location.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(115,'Incorrect values.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(116,'No character selected.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(117,'%s is not in a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(118,'You changed HP of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(119,'%s changed your HP to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(120,'You changed MANA of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(121,'%s changed your MANA to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(122,'You changed ENERGY of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(123,'%s changed your ENERGY to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(124,'Current energy: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(125,'You changed rage of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(126,'%s changed your rage to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(127,'You changed level of %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(128,'GUID %i, faction is %i, flags is %i, npcflag is %i, DY flag is %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(129,'Wrong faction: %u (not found in factiontemplate.dbc).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(130,'You changed GUID=%i \'s Faction to %i, flags to %i, npcflag to %i, dyflag to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(131,'You changed the spellflatid=%i, val= %i, mark =%i to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(132,'%s changed your spellflatid=%i, val= %i, mark =%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(133,'%s has access to all taxi nodes now (until logout).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(134,'%s has no more access to all taxi nodes now (only visited accessible).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(135,'%s has given you access to all taxi nodes (until logout).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(136,'%s has removed access to all taxi nodes (only visited still accessible).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(137,'You set all speeds to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(138,'%s set all your speeds to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(139,'You set the speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(140,'%s set your speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(141,'You set the swim speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(142,'%s set your swim speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(143,'You set the backwards run speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(144,'%s set your backwards run speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(145,'You set the fly speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(146,'%s set your fly speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(147,'You set the size %2.2f of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(148,'%s set your size to %2.2f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(149,'There is no such mount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(150,'You give a mount to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(151,'%s gave you a mount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(152,'USER1: %i, ADD: %i, DIF: %i\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(153,'You take all copper of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(154,'%s took you all of your copper.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(155,'You take %i copper from %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(156,'%s took %i copper from you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(157,'You give %i copper to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(158,'%s gave you %i copper.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(159,'You hear sound %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(160,'USER2: %i, ADD: %i, RESULT: %i\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(161,'Removed bit %i in field %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(162,'Set bit %i in field %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(163,'Teleport location table is empty!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(164,'Teleport location not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(165,'Requires search parameter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(166,'There are no teleport locations matching your request.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(168,'Locations found are:\n %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(169,'Mail sent to %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(170,'You try to hear sound %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(172,'server console command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(173,'You changed runic power of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(174,'%s changed your runic power to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(200,'No selection.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(201,'Object GUID is: lowpart %u highpart %X',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(202,'The name was too long by %i characters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(203,'Error, name can only contain characters A-Z and a-z.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(204,'The subname was too long by %i characters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(205,'Not yet implemented',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(206,'Item \'%i\' \'%s\' added to list with maxcount \'%i\' and incrtime \'%i\' and extendedcost \'%i\'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(207,'Item \'%i\' not found in database.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(208,'Item \'%i\' \'%s\' deleted from vendor list',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(209,'Item \'%i\' not found in vendor list.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(210,'Item \'%i\' already in vendor list.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(211,'Spells of %s reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(212,'Spells of %s will reset at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(213,'Talents of %s reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(214,'Talents of %s will reset at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(215,'Your spells have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(216,'Your talents have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(217,'Unknown case \'%s\' for .resetall command. Type full correct case name.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(218,'Spells will reset for all players at login. Strongly recommend re-login!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(219,'Talents will reset for all players at login. Strongly recommend re-login!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(220,'Creature (GUID: %u) No waypoint found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(221,'Creature (GUID: %u) Last waypoint not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(222,'Creature (GUID: %u) No waypoint found - used \'wpguid\'. Now trying to find it by its position...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(223,'Creature (GUID: %u) No waypoints found - This is a MaNGOS db problem (single float).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(224,'Selected creature is ignored - provided GUID is used',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(225,'Creature (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(226,'You must select a visual waypoint.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(227,'No visual waypoints found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(228,'Could not create visual waypoint with creatureID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(229,'All visual waypoints removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(230,'Could not create waypoint-creature with ID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(231,'No GUID provided.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(232,'No waypoint number provided.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(233,'Argument required for \'%s\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(234,'Waypoint %i added to GUID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(235,'Waypoint %d added.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(236,'Waypoint changed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(237,'Waypoint %s modified.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(238,'WP export successfull.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(239,'No waypoints found inside the database.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(240,'File imported.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(241,'Waypoint removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(242,'Warning: Could not delete WP from the world with ID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(243,'This happens if the waypoint is too far away from your char.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(244,'The WP is deleted from the database, but not from the world here.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(245,'They will disappear after a server restart.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(246,'Waypoint %d: Info for creature: %s, GUID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(247,'Waittime: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(248,'Model %d: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(249,'Emote: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(250,'Spell: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(251,'Text%d (ID: %i): %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(252,'AIScript: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(253,'Forced rename for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(254,'Forced rename for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(255,'Waypoint-Creature (GUID: %u) Not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(256,'Could not find NPC...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(257,'Creature movement type set to \'%s\', waypoints removed (if any).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(258,'Creature movement type set to \'%s\', waypoints were not removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(259,'Incorrect value, use on or off',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(260,'Value saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(261,'Value saved, you may need to rejoin or clean your client cache.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(262,'Areatrigger ID %u not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(263,'Target map or coordinates is invalid (X: %f Y: %f MapId: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(264,'Zone coordinates is invalid (X: %f Y: %f AreaId: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(265,'Zone %u (%s) is part of instanceable map %u (%s)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(266,'Nothing found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(267,'Object not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(268,'Creature not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(269,'Warning: Mob found more than once - you will be teleported to the first one found in DB.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(270,'Creature Removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(271,'Creature moved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(272,'Creature (GUID:%u) must be on the same map as player!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(273,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(274,'Game Object (GUID: %u) has references in not found creature %u GO list, can\'t be deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(275,'Game Object (GUID: %u) removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(276,'Game Object (GUID: %u) turned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(277,'Game Object (GUID: %u) moved',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(278,'You must select a vendor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(279,'You must send id for item',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(280,'Vendor has too many items (max 128)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(281,'You can\'t kick self, logout instead',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(282,'Player %s kicked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(283,'Player %s not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(284,'Accepting Whisper: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(285,'Accepting Whisper: ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(286,'Accepting Whisper: OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(287,'Creature (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(288,'Tickets count: %i show new tickets: %s\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(289,'New ticket from %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(290,'Ticket of %s (Last updated: %s):\n%s ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(291,'New ticket show: ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(292,'New ticket show: OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(293,'Ticket %i doesn\'t exist',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(294,'All tickets deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(295,'Character %s ticket deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(296,'Ticket deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(297,'Spawn distance changed to: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(298,'Spawn time changed to: %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(299,'The honor of %s was set to %u!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(300,'Your chat has been disabled for %u minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(301,'You have disabled %s\'s chat for %u minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(302,'Player\'s chat is already enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(303,'Your chat has been enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(304,'You have enabled %s\'s chat.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(305, 'Faction %s (%u) reputation of %s was set to %5d!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(306, 'The arena points of %s was set to %u!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(307, 'No faction found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(308, 'Faction %i unknown!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(309, 'Invalid parameter %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(310, 'delta must be between 0 and %d (inclusive)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(311, '%d - |cffffffff|Hfaction:%d|h[%s]|h|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(312, ' [visible]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(313, ' [at war]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(314, ' [peace forced]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(315, ' [hidden]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(316, ' [invisible forced]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(317, ' [inactive]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(318, 'Hated',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(319, 'Hostile',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(320, 'Unfriendly',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(321, 'Neutral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(322, 'Friendly',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(323, 'Honored',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(324, 'Revered',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(325, 'Exalted',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(326, 'Faction %s (%u) can\'not have reputation.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(327, ' [no reputation]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(328,'Characters at account %s (Id: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(329,' %s (GUID %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(330,'No players found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(331,'Extended item cost %u not exist',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(332,'GM mode is ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(333,'GM mode is OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(334,'GM Chat Badge is ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(335,'GM Chat Badge is OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(336,'You repair all %s''s items.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(337,'All your items repaired by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(338,'You set waterwalk mode %s for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(339,'Your waterwalk mode %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(340,'%s is now following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(341,'%s is not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(342,'%s is now not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(343,'Creature (Entry: %u) cannot be tamed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(344,'You already have pet.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(400,'|cffff0000[System Message]:|rScripts reloaded',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(401,'You change security level of account %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(402,'%s changed your security level to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(403,'You have low security level for this.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(404,'Creature movement disabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(405,'Creature movement enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(406,'Weather can\'t be changed for this zone.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(407,'Weather system disabled at server.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(408,'%s is banned for %s. Reason: %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(409,'%s is banned permanently for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(410,'%s %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(411,'%s unbanned.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(412,'There was an error removing the ban on %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(413,'Account not exist: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(414,'There is no such character.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(415,'There is no such IP in banlist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(416,'Account %s has never been banned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(417,'Ban history for account %s:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(418,'Ban Date: %s Bantime: %s Still active: %s Reason: %s Set by: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(419,'Inf.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(420,'Never',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(421,'Yes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(422,'No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(423,'IP: %s\nBan Date: %s\nUnban Date: %s\nRemaining: %s\nReason: %s\nSet by: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(424,'There is no matching IPban.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(425,'There is no matching account.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(426,'There is no banned account owning a character matching this part.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(427,'The following IPs match your pattern:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(428,'The following accounts match your query:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(429,'You learned many spells/skills.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(430,'You learned all spells for class.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(431,'You learned all talents for class.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(432,'You learned all languages.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(433,'You learned all craft skills and recipes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(434,'Could not find \'%s\'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(435,'Invalid item id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(436,'No items found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(437,'Invalid gameobject id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(438,'Found items %u: %u ( inventory %u mail %u auction %u guild %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(439,'Found gameobjects %u: %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(440,'Invalid creature id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(441,'Found creatures %u: %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(442,'No area found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(443,'No item sets found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(444,'No skills found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(445,'No spells found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(446,'No quests found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(447,'No creatures found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(448,'No gameobjects found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(449,'Graveyard #%u doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(450,'Graveyard #%u already linked to zone #%u (current).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(451,'Graveyard #%u linked to zone #%u (current).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(452,'Graveyard #%u can\'t be linked to subzone or not existed zone #%u (internal error).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(454,'No faction in Graveyard with id= #%u , fix your DB',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(455,'invalid team, please fix database',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(456,'any',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(457,'alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(458,'horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(459,'Graveyard #%u (faction: %s) is nearest from linked to zone #%u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(460,'Zone #%u doesn\'t have linked graveyards.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(461,'Zone #%u doesn\'t have linked graveyards for faction: %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(462,'Teleport location already exists!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(463,'Teleport location added.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(464,'Teleport location NOT added: database error.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(465,'Teleport location deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(467,'Target unit has %d auras:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(468,'id: %d eff: %d type: %d duration: %d maxduration: %d name: %s%s%s caster: %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(469,'Target unit has %d auras of type %d:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(470,'id: %d eff: %d name: %s%s%s caster: %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(471,'Quest %u not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(472,'Quest %u started from item. For correct work, please, add item to inventory and start quest in normal way: .additem %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(473,'Quest removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(474,' [rewarded]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(475,' [complete]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(476,' [active]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(477,'%s\'s Fly Mode %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(478,'Opcode %u sent to %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(479,'Character loaded successfully!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(480,'Failed to load the character!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(481,'Character dumped successfully!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(482,'Character dump failed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(483,'Spell %u broken and not allowed to cast or learn!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(484,'Skill %u (%s) for player %s set to %u and current maximum set to %u (without permanent (talent) bonuses).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(485,'Player %s must have skill %u (%s) before using this command.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(486,'Invalid skill id (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(487,'You learned default GM spells/skills.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(488,'You already know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(489,'Target(%s) already know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(490,'%s doesn\'t know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(491,'You already forgot that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(492,'All spell cooldowns removed for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(493,'Spell %u cooldown removed for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(494,'Command : Additem, itemId = %i, amount = %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(495,'Command : Additemset, itemsetId = %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(496,'Removed itemID = %i, amount = %i from %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(497,'Cannot create item \'%i\' (amount: %i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(498,'You need to provide a guild name!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(499,'Player not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(500,'Player already has a guild!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(501,'Guild not created! (already exists?)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(502,'No items from itemset \'%u\' found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(503,'The distance is: (3D) %f (2D) %f yards.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(504,'Item \'%i\' \'%s\' Item Slot %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(505,'Item \'%i\' doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(506,'Item \'%i\' \'%s\' Added to Slot %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(507,'Item save failed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(508,'%d - owner: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(509,'%d - sender: %s (guid: %u account: %u ) receiver: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(510,'%d - owner: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(511,'Wrong link type!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(512,'%d - |cffffffff|Hitem:%d:0:0:0:0:0:0:0|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(513,'%d - |cffffffff|Hquest:%d|h[%s]|h|r %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(514,'%d - |cffffffff|Hcreature_entry:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(515,'%d - |cffffffff|Hcreature:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(516,'%d - |cffffffff|Hgameobject_entry:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(517,'%d - |cffffffff|Hgameobject:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(518,'%d - |cffffffff|Hitemset:%d|h[%s %s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(519,'|cffffffff|Htele:%s|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(520,'%d - |cffffffff|Hspell:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(521,'%d - |cffffffff|Hskill:%d|h[%s %s]|h|r %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(522,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(523,'>> Game Object %s (GUID: %u) at %f %f %f. Orientation %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(524,'Selected object:\n|cffffffff|Hitemset:%d|h[%s]|h|r\nGUID: %u ID: %u\nX: %f Y: %f Z: %f MapId: %u\nOrientation: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(525,'>> Add Game Object \'%i\' (%s) (GUID: %i) added at \'%f %f %f\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(526,'%s (lowguid: %u) movement generators stack:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(527,' Idle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(528,' Random',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(529,' Waypoint',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(530,' Animal random',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(531,' Confused',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(532,' Targeted to player %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(533,' Targeted to creature %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(534,' Targeted to <NULL>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(535,' Home movement to (X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(536,' Home movement used for player?!?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(537,' Taxi flight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(538,' Unknown movement generator (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(539,'Player selected NPC\nGUID: %u.\nFaction: %u.\nnpcFlags: %u.\nEntry: %u.\nDisplayID: %u (Native: %u).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(540,'Level: %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(541,'Health (base): %u. (max): %u. (current): %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(542,'Unit Flags: %u.\nDynamic Flags: %u.\nFaction Template: %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(543,'Loot: %u Pickpocket: %u Skinning: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(544,'Position: %f %f %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(545,'*** Is a vendor!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(546,'*** Is a trainer!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(547,'InstanceID: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(548,'Player%s %s (guid: %u) Account: %s (id: %u) GMLevel: %u Last IP: %s Last login: %s Latency: %ums',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(549,'Played time: %s Level: %u Money: %ug%us%uc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(550,'Command .pinfo doesn\'t support \'rep\' option for offline players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(551,'%s has explored all zones now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(552,'%s has no more explored zones.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(553,'%s has explored all zones for you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(554,'%s has hidden all zones from you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(555,'Hover enabled',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(556,'Hover disabled',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(557,'You have been leveled up (%i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(558,'You have been leveled down (%i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(559,'Your level progress has been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(560,'The area has been set as explored.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(561,'The area has been set as not explored.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(562,'GUID=%i \'s updateIndex: %i, value: %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(563,'You change GUID=%i \'s UpdateIndex: %i value to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(564,'The value index %u is too big to %u(count: %u).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(565,'Set %u uint32 Value:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(566,'You Set %u Field:%u to uint32 Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(567,'Set %u float Value:[OPCODE]:%u [VALUE]:%f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(568,'You Set %u Field:%i to float Value: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(569,'Get %u uint32 Value:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(570,'The uint32 value of %u in %u is: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(571,'Get %u float Value:[OPCODE]:%u [VALUE]:%f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(572,'The float of %u value in %u is: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(573,'.Set32Bit:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(574,'You set Bit of Field:%u to Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(575,'.Mod32Value:[OPCODE]:%u [VALUE]:%i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(576,'You modified the value of Field:%u to Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(577,'You are now invisible.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(578,'You are now visible.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(579,'Selected player or creature not have victim.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(580,'You learned all default spells for race/class and completed quests rewarded spells.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(581,'Found near gameobjects (distance %f): %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(582,'SpawnTime: Full:%s Remain:%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(583,'%d - |cffffffff|Hgameevent:%d|h[%s]|h|r%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(584,'No event found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(585,'Event not exist!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(586,'Event %u: %s%s\nStart: %s End: %s Occurence: %s Length: %s\nNext state change: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(587,'Event %u already active!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(588,'Event %u not active!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(589,' Point movement to (X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(590,' Fear movement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(591,' Distract movement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(592,'You have learned all spells in craft: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(593,'Currently Banned Accounts:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(594,'| Account | BanDate | UnbanDate | Banned By | Ban Reason |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(595,'Currently Banned IPs:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(596,'| IP | BanDate | UnbanDate | Banned By | Ban Reason |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(597,'Current gamemasters:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(598,'| Account | GM |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(599,'No gamemasters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(600,'The Alliance wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(601,'The Horde wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(602,'The battle for Warsong Gulch begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(603,'The battle for Warsong Gulch begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(604,'Let the battle for Warsong Gulch begin!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(605,'$n captured the Horde flag!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(606,'$n captured the Alliance flag!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(607,'The Horde flag was dropped by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(608,'The Alliance Flag was dropped by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(609,'The Alliance Flag was returned to its base by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(610,'The Horde flag was returned to its base by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(611,'The Horde flag was picked up by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(612,'The Alliance Flag was picked up by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(613,'The flags are now placed at their bases.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(636,'The Battle for Eye of the Storm begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(637,'The Battle for Eye of the Storm begins in 30 seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(638,'The Battle for Eye of the Storm has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(650,'Alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(651,'Horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(652,'stables',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(653,'blacksmith',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(654,'farm',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(655,'lumber mill',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(656,'mine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(657,'The %s has taken the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(658,'$n has defended the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(659,'$n has assaulted the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(660,'$n claims the %s! If left unchallenged, the %s will control it in 1 minute!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(661,'The Battle for Arathi Basin begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(662,'The Battle for Arathi Basin begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(663,'The Battle for Arathi Basin has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(664,'The Alliance has gathered $1776W resources, and is near victory!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(665,'The Horde has gathered $1777W resources, and is near victory!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(666,'After your recent battle in %s our best attempts to award you a Mark of Honor failed. Enclosed you will find the Mark of Honor we were not able to deliver to you at the time. Thanks for fighting in %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(700,'You must be level %u to form an arena team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(701,'One minute until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(702,'Thirty seconds until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(703,'Fifteen seconds until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(704,'The Arena battle has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(705,'You must wait %s before speaking again.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(706,'This item(s) have problems with equipping/storing in inventory.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(707,'%s wishes to not be disturbed and cannot receive whisper messages: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(708,'%s is Away from Keyboard: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(709,'Do not Disturb',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(710,'Away from Keyboard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(711,'Queue status for %s (Lvl: %u to %u)\nQueued alliances: %u (Need at least %u more)\nQueued hordes: %u (Need at least %u more)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(713,'You must be level %u to join an arena team!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(714,'%s is not high enough level to join your team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(715,'You don\'t meet Battleground level requirements',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(716,'Your arena team is full, %s cannot join it.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(717,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(718,'|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(719,'|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(720,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(721,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(722,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(726,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(730,'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(731,'Someone in your party is Deserter. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(732,'Someone in your party is already in three battleground queues. You cannot join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(733,'You cannot teleport to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(734,'You cannot summon players to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(735,'You must be in GM mode to teleport to a player in a battleground.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(736,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(737,'Arenas are set to 1v1 for debugging. So, don\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(738,'Arenas are set to normal playercount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(739,'Battlegrounds are set to 1v0 for debugging.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(740,'Battlegrounds are set to normal playercount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(741,'Flushing Arena points based on team ratings, this may take a few minutes. Please stand by...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(742,'Distributing arena points to players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(743,'Finished setting arena points for online players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(744,'Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(745,'Modification done.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(801,'You do not have enough gold',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(802,'You do not have enough free slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(803,'Your partner does not have enough free bag slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(804,'You do not have permission to perform that function',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(805,'Unknown language',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(806,'You don\'t know that language',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(807,'Please provide character name',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(808,'Player %s not found or offline',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(809,'Account for character %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(810,'|Hplayer:$N|h[$N]|h has earned the achievement $a!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1000,'Exiting daemon...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1001,'Account deleted: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1002,'Account %s NOT deleted (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1003,'Account %s NOT deleted (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1004,'Account created: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1005,'Account name can\'t be longer than 16 characters (client limit), account not created!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1006,'Account with this name already exist!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1010,'| Account | Character | IP | GM | TBC |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1011,'|<Error> | %20s |<Error> |<Er>|<Err>|',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1100,'Account %s (Id: %u) have up to %u expansion allowed now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1101,'Message of the day changed to:\r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1102,'Message sent to %s: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1103,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1104,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1105,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1106,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1107,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1108,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1109,'%d - %s %s %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1110,'%d - %s X:%f Y:%f Z:%f MapId:%d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1111,'%d - %s X:%f Y:%f Z:%f MapId:%d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1112,'Failed to open file: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1113,'Account %s (%u) have max amount allowed characters (client limit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1114,'Dump file have broken data!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1115,'Invalid character name!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1116,'Invalid character guid!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1117,'Character guid %u in use!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1118,'%d - guild: %s (guid: %u) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1119,'You must use male or female as gender.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1120,'You change gender of %s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1121,'Your gender changed to %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1122,'(%u/%u +perm %u +temp %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+/*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `milling_loot_template`
+--
+
+DROP TABLE IF EXISTS `milling_loot_template`;
+CREATE TABLE `milling_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `milling_loot_template`
+--
+
+LOCK TABLES `milling_loot_template` WRITE;
+/*!40000 ALTER TABLE `milling_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `milling_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `npc_gossip`
+--
+
+DROP TABLE IF EXISTS `npc_gossip`;
+CREATE TABLE `npc_gossip` (
+ `npc_guid` int(10) unsigned NOT NULL default '0',
+ `textid` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`npc_guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `npc_gossip`
+--
+
+LOCK TABLES `npc_gossip` WRITE;
+/*!40000 ALTER TABLE `npc_gossip` DISABLE KEYS */;
+/*!40000 ALTER TABLE `npc_gossip` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `npc_gossip_textid`
+--
+
+DROP TABLE IF EXISTS `npc_gossip_textid`;
+CREATE TABLE `npc_gossip_textid` (
+ `zoneid` smallint(5) unsigned NOT NULL default '0',
+ `action` smallint(5) unsigned NOT NULL default '0',
+ `textid` mediumint(8) unsigned NOT NULL default '0',
+ KEY `zoneid` (`zoneid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `npc_gossip_textid`
+--
+
+LOCK TABLES `npc_gossip_textid` WRITE;
+/*!40000 ALTER TABLE `npc_gossip_textid` DISABLE KEYS */;
+/*!40000 ALTER TABLE `npc_gossip_textid` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `npc_option`
+--
+
+DROP TABLE IF EXISTS `npc_option`;
+CREATE TABLE `npc_option` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `gossip_id` mediumint(8) unsigned NOT NULL default '0',
+ `npcflag` int(10) unsigned NOT NULL default '0',
+ `icon` tinyint(3) unsigned NOT NULL default '0',
+ `action` mediumint(8) unsigned NOT NULL default '0',
+ `box_money` int(10) unsigned NOT NULL default '0',
+ `coded` tinyint(3) unsigned NOT NULL default '0',
+ `option_text` text,
+ `box_text` text,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `npc_option`
+--
+
+LOCK TABLES `npc_option` WRITE;
+/*!40000 ALTER TABLE `npc_option` DISABLE KEYS */;
+/*!40000 ALTER TABLE `npc_option` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `npc_text`
+--
+
+DROP TABLE IF EXISTS `npc_text`;
+CREATE TABLE `npc_text` (
+ `ID` mediumint(8) unsigned NOT NULL default '0',
+ `text0_0` longtext,
+ `text0_1` longtext,
+ `lang0` tinyint(3) unsigned NOT NULL default '0',
+ `prob0` float NOT NULL default '0',
+ `em0_0` smallint(5) unsigned NOT NULL default '0',
+ `em0_1` smallint(5) unsigned NOT NULL default '0',
+ `em0_2` smallint(5) unsigned NOT NULL default '0',
+ `em0_3` smallint(5) unsigned NOT NULL default '0',
+ `em0_4` smallint(5) unsigned NOT NULL default '0',
+ `em0_5` smallint(5) unsigned NOT NULL default '0',
+ `text1_0` longtext,
+ `text1_1` longtext,
+ `lang1` tinyint(3) unsigned NOT NULL default '0',
+ `prob1` float NOT NULL default '0',
+ `em1_0` smallint(5) unsigned NOT NULL default '0',
+ `em1_1` smallint(5) unsigned NOT NULL default '0',
+ `em1_2` smallint(5) unsigned NOT NULL default '0',
+ `em1_3` smallint(5) unsigned NOT NULL default '0',
+ `em1_4` smallint(5) unsigned NOT NULL default '0',
+ `em1_5` smallint(5) unsigned NOT NULL default '0',
+ `text2_0` longtext,
+ `text2_1` longtext,
+ `lang2` tinyint(3) unsigned NOT NULL default '0',
+ `prob2` float NOT NULL default '0',
+ `em2_0` smallint(5) unsigned NOT NULL default '0',
+ `em2_1` smallint(5) unsigned NOT NULL default '0',
+ `em2_2` smallint(5) unsigned NOT NULL default '0',
+ `em2_3` smallint(5) unsigned NOT NULL default '0',
+ `em2_4` smallint(5) unsigned NOT NULL default '0',
+ `em2_5` smallint(5) unsigned NOT NULL default '0',
+ `text3_0` longtext,
+ `text3_1` longtext,
+ `lang3` tinyint(3) unsigned NOT NULL default '0',
+ `prob3` float NOT NULL default '0',
+ `em3_0` smallint(5) unsigned NOT NULL default '0',
+ `em3_1` smallint(5) unsigned NOT NULL default '0',
+ `em3_2` smallint(5) unsigned NOT NULL default '0',
+ `em3_3` smallint(5) unsigned NOT NULL default '0',
+ `em3_4` smallint(5) unsigned NOT NULL default '0',
+ `em3_5` smallint(5) unsigned NOT NULL default '0',
+ `text4_0` longtext,
+ `text4_1` longtext,
+ `lang4` tinyint(3) unsigned NOT NULL default '0',
+ `prob4` float NOT NULL default '0',
+ `em4_0` smallint(5) unsigned NOT NULL default '0',
+ `em4_1` smallint(5) unsigned NOT NULL default '0',
+ `em4_2` smallint(5) unsigned NOT NULL default '0',
+ `em4_3` smallint(5) unsigned NOT NULL default '0',
+ `em4_4` smallint(5) unsigned NOT NULL default '0',
+ `em4_5` smallint(5) unsigned NOT NULL default '0',
+ `text5_0` longtext,
+ `text5_1` longtext,
+ `lang5` tinyint(3) unsigned NOT NULL default '0',
+ `prob5` float NOT NULL default '0',
+ `em5_0` smallint(5) unsigned NOT NULL default '0',
+ `em5_1` smallint(5) unsigned NOT NULL default '0',
+ `em5_2` smallint(5) unsigned NOT NULL default '0',
+ `em5_3` smallint(5) unsigned NOT NULL default '0',
+ `em5_4` smallint(5) unsigned NOT NULL default '0',
+ `em5_5` smallint(5) unsigned NOT NULL default '0',
+ `text6_0` longtext,
+ `text6_1` longtext,
+ `lang6` tinyint(3) unsigned NOT NULL default '0',
+ `prob6` float NOT NULL default '0',
+ `em6_0` smallint(5) unsigned NOT NULL default '0',
+ `em6_1` smallint(5) unsigned NOT NULL default '0',
+ `em6_2` smallint(5) unsigned NOT NULL default '0',
+ `em6_3` smallint(5) unsigned NOT NULL default '0',
+ `em6_4` smallint(5) unsigned NOT NULL default '0',
+ `em6_5` smallint(5) unsigned NOT NULL default '0',
+ `text7_0` longtext,
+ `text7_1` longtext,
+ `lang7` tinyint(3) unsigned NOT NULL default '0',
+ `prob7` float NOT NULL default '0',
+ `em7_0` smallint(5) unsigned NOT NULL default '0',
+ `em7_1` smallint(5) unsigned NOT NULL default '0',
+ `em7_2` smallint(5) unsigned NOT NULL default '0',
+ `em7_3` smallint(5) unsigned NOT NULL default '0',
+ `em7_4` smallint(5) unsigned NOT NULL default '0',
+ `em7_5` smallint(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `npc_text`
+--
+
+LOCK TABLES `npc_text` WRITE;
+/*!40000 ALTER TABLE `npc_text` DISABLE KEYS */;
+/*!40000 ALTER TABLE `npc_text` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `npc_trainer`
+--
+
+DROP TABLE IF EXISTS `npc_trainer`;
+CREATE TABLE `npc_trainer` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `spell` mediumint(8) unsigned NOT NULL default '0',
+ `spellcost` int(10) unsigned NOT NULL default '0',
+ `reqskill` smallint(5) unsigned NOT NULL default '0',
+ `reqskillvalue` smallint(5) unsigned NOT NULL default '0',
+ `reqlevel` tinyint(3) unsigned NOT NULL default '0',
+ UNIQUE KEY `entry_spell` (`entry`,`spell`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `npc_trainer`
+--
+
+LOCK TABLES `npc_trainer` WRITE;
+/*!40000 ALTER TABLE `npc_trainer` DISABLE KEYS */;
+/*!40000 ALTER TABLE `npc_trainer` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `npc_vendor`
+--
+
+DROP TABLE IF EXISTS `npc_vendor`;
+CREATE TABLE `npc_vendor` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `maxcount` tinyint(3) unsigned NOT NULL default '0',
+ `incrtime` int(10) unsigned NOT NULL default '0',
+ `ExtendedCost` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Npc System';
+
+--
+-- Dumping data for table `npc_vendor`
+--
+
+LOCK TABLES `npc_vendor` WRITE;
+/*!40000 ALTER TABLE `npc_vendor` DISABLE KEYS */;
+/*!40000 ALTER TABLE `npc_vendor` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `page_text`
+--
+
+DROP TABLE IF EXISTS `page_text`;
+CREATE TABLE `page_text` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `text` longtext NOT NULL,
+ `next_page` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
+
+--
+-- Dumping data for table `page_text`
+--
+
+LOCK TABLES `page_text` WRITE;
+/*!40000 ALTER TABLE `page_text` DISABLE KEYS */;
+/*!40000 ALTER TABLE `page_text` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pet_levelstats`
+--
+
+DROP TABLE IF EXISTS `pet_levelstats`;
+CREATE TABLE `pet_levelstats` (
+ `creature_entry` mediumint(8) unsigned NOT NULL,
+ `level` tinyint(3) unsigned NOT NULL,
+ `hp` smallint(5) unsigned NOT NULL,
+ `mana` smallint(5) unsigned NOT NULL,
+ `armor` int(10) unsigned NOT NULL default '0',
+ `str` smallint(5) unsigned NOT NULL,
+ `agi` smallint(5) unsigned NOT NULL,
+ `sta` smallint(5) unsigned NOT NULL,
+ `inte` smallint(5) unsigned NOT NULL,
+ `spi` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`creature_entry`,`level`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 COMMENT='Stores pet levels stats.';
+
+--
+-- Dumping data for table `pet_levelstats`
+--
+
+LOCK TABLES `pet_levelstats` WRITE;
+/*!40000 ALTER TABLE `pet_levelstats` DISABLE KEYS */;
+/*!40000 ALTER TABLE `pet_levelstats` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pet_name_generation`
+--
+
+DROP TABLE IF EXISTS `pet_name_generation`;
+CREATE TABLE `pet_name_generation` (
+ `id` mediumint(8) unsigned NOT NULL auto_increment,
+ `word` tinytext NOT NULL,
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `half` tinyint(4) NOT NULL default '0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `pet_name_generation`
+--
+
+LOCK TABLES `pet_name_generation` WRITE;
+/*!40000 ALTER TABLE `pet_name_generation` DISABLE KEYS */;
+INSERT INTO `pet_name_generation` (`word`,`entry`,`half`) VALUES
+('Aba',416,0),
+('Az',416,0),
+('Bel',416,0),
+('Biz',416,0),
+('Cho',416,0),
+('Dag',416,0),
+('Gak',416,0),
+('Gar',416,0),
+('Gel',416,0),
+('Gho',416,0),
+('Gob',416,0),
+('Gra',416,0),
+('Jak',416,0),
+('Jub',416,0),
+('Kar',416,0),
+('Kup',416,0),
+('Laz',416,0),
+('Nal',416,0),
+('Nok',416,0),
+('Pag',416,0),
+('Pig',416,0),
+('Pip',416,0),
+('Piz',416,0),
+('Quz',416,0),
+('Rui',416,0),
+('Rul',416,0),
+('Rup',416,0),
+('Tar',416,0),
+('Vol',416,0),
+('Yaz',416,0),
+('Zep',416,0),
+('Zig',416,0),
+('Zil',416,0),
+('Zor',416,0),
+('bis',416,1),
+('fip',416,1),
+('gup',416,1),
+('ham',416,1),
+('jub',416,1),
+('kin',416,1),
+('kol',416,1),
+('lop',416,1),
+('loz',416,1),
+('mat',416,1),
+('mir',416,1),
+('nam',416,1),
+('nar',416,1),
+('nik',416,1),
+('nip',416,1),
+('pad',416,1),
+('pep',416,1),
+('pit',416,1),
+('qua',416,1),
+('rai',416,1),
+('rin',416,1),
+('rot',416,1),
+('tai',416,1),
+('tal',416,1),
+('tik',416,1),
+('tip',416,1),
+('tog',416,1),
+('tuk',416,1),
+('uri',416,1),
+('yal',416,1),
+('yap',416,1),
+('Bhee',417,0),
+('Bruu',417,0),
+('Czaa',417,0),
+('Droo',417,0),
+('Flaa',417,0),
+('Fzuu',417,0),
+('Ghaa',417,0),
+('Gree',417,0),
+('Gzaa',417,0),
+('Haa',417,0),
+('Haad',417,0),
+('Haag',417,0),
+('Haap',417,0),
+('Jhaa',417,0),
+('Jhuu',417,0),
+('Khaa',417,0),
+('Khii',417,0),
+('Khuu',417,0),
+('Kree',417,0),
+('Luu',417,0),
+('Maa',417,0),
+('Nhee',417,0),
+('Phuu',417,0),
+('Pryy',417,0),
+('Rhuu',417,0),
+('Shaa',417,0),
+('Sloo',417,0),
+('Sruu',417,0),
+('Thoo',417,0),
+('Traa',417,0),
+('Wraa',417,0),
+('Zhaa',417,0),
+('dhon',417,1),
+('dhum',417,1),
+('dhun',417,1),
+('dom',417,1),
+('don',417,1),
+('drom',417,1),
+('dym',417,1),
+('fenn',417,1),
+('fum',417,1),
+('fun',417,1),
+('ghon',417,1),
+('ghun',417,1),
+('grom',417,1),
+('grym',417,1),
+('hom',417,1),
+('hon',417,1),
+('hun',417,1),
+('jhom',417,1),
+('kun',417,1),
+('lum',417,1),
+('mmon',417,1),
+('mon',417,1),
+('myn',417,1),
+('nam',417,1),
+('nem',417,1),
+('nhym',417,1),
+('nom',417,1),
+('num',417,1),
+('phom',417,1),
+('roon',417,1),
+('rym',417,1),
+('shon',417,1),
+('thun',417,1),
+('tom',417,1),
+('zhem',417,1),
+('zhum',417,1),
+('zun',417,1),
+('Bar',1860,0),
+('Bel',1860,0),
+('Char',1860,0),
+('Grak\'',1860,0),
+('Graz\'',1860,0),
+('Grim',1860,0),
+('Hath',1860,0),
+('Hel',1860,0),
+('Hok',1860,0),
+('Huk',1860,0),
+('Jhaz',1860,0),
+('Jhom',1860,0),
+('Juk\'',1860,0),
+('Kal\'',1860,0),
+('Klath',1860,0),
+('Kon',1860,0),
+('Krag',1860,0),
+('Krak',1860,0),
+('Mak',1860,0),
+('Mezz',1860,0),
+('Orm',1860,0),
+('Phan',1860,0),
+('Sar',1860,0),
+('Tang',1860,0),
+('Than',1860,0),
+('Thog',1860,0),
+('Thok',1860,0),
+('Thul',1860,0),
+('Zag\'',1860,0),
+('Zang',1860,0),
+('Zhar\'',1860,0),
+('kath',1860,1),
+('doc',1860,1),
+('dok',1860,1),
+('gak',1860,1),
+('garth',1860,1),
+('gore',1860,1),
+('gorg',1860,1),
+('grave',1860,1),
+('gron',1860,1),
+('juk',1860,1),
+('krast',1860,1),
+('kresh',1860,1),
+('krit',1860,1),
+('los',1860,1),
+('mon',1860,1),
+('mos',1860,1),
+('moth',1860,1),
+('nagma',1860,1),
+('nak',1860,1),
+('nar',1860,1),
+('nos',1860,1),
+('nuz',1860,1),
+('phog',1860,1),
+('rath',1860,1),
+('tast',1860,1),
+('taz',1860,1),
+('thak',1860,1),
+('thang',1860,1),
+('thyk',1860,1),
+('vhug',1860,1),
+('zazt',1860,1),
+('Ael',1863,0),
+('Aez',1863,0),
+('Ang',1863,0),
+('Ban',1863,0),
+('Bet',1863,0),
+('Bro',1863,0),
+('Bry',1863,0),
+('Cat',1863,0),
+('Dir',1863,0),
+('Dis',1863,0),
+('Dom',1863,0),
+('Drus',1863,0),
+('Fie',1863,0),
+('Fier',1863,0),
+('Gly',1863,0),
+('Hel',1863,0),
+('Hes',1863,0),
+('Kal',1863,0),
+('Lyn',1863,0),
+('Mir',1863,0),
+('Nim',1863,0),
+('Sar',1863,0),
+('Sel',1863,0),
+('Vil',1863,0),
+('Zah',1863,0),
+('aith',1863,1),
+('anda',1863,1),
+('antia',1863,1),
+('evere',1863,1),
+('lia',1863,1),
+('lissa',1863,1),
+('neri',1863,1),
+('neth',1863,1),
+('nia',1863,1),
+('nlissa',1863,1),
+('nora',1863,1),
+('nva',1863,1),
+('nys',1863,1),
+('ola',1863,1),
+('ona',1863,1),
+('ora',1863,1),
+('rah',1863,1),
+('riana',1863,1),
+('riel',1863,1),
+('rona',1863,1),
+('tai',1863,1),
+('tevere',1863,1),
+('thea',1863,1),
+('vina',1863,1),
+('wena',1863,1),
+('wyn',1863,1),
+('xia',1863,1),
+('yla',1863,1),
+('yssa',1863,1),
+('Flaa',17252,0),
+('Haa',17252,0),
+('Jhuu',17252,0),
+('Shaa',17252,0),
+('Thoo',17252,0),
+('dhun',17252,1),
+('ghun',17252,1),
+('roon',17252,1),
+('thun',17252,1),
+('tom',17252,1);
+
+/*!40000 ALTER TABLE `pet_name_generation` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `petcreateinfo_spell`
+--
+
+DROP TABLE IF EXISTS `petcreateinfo_spell`;
+CREATE TABLE `petcreateinfo_spell` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `Spell1` mediumint(8) unsigned NOT NULL default '0',
+ `Spell2` mediumint(8) unsigned NOT NULL default '0',
+ `Spell3` mediumint(8) unsigned NOT NULL default '0',
+ `Spell4` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Pet Create Spells';
+
+--
+-- Dumping data for table `petcreateinfo_spell`
+--
+
+LOCK TABLES `petcreateinfo_spell` WRITE;
+/*!40000 ALTER TABLE `petcreateinfo_spell` DISABLE KEYS */;
+/*!40000 ALTER TABLE `petcreateinfo_spell` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pickpocketing_loot_template`
+--
+
+DROP TABLE IF EXISTS `pickpocketing_loot_template`;
+CREATE TABLE `pickpocketing_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `pickpocketing_loot_template`
+--
+
+LOCK TABLES `pickpocketing_loot_template` WRITE;
+/*!40000 ALTER TABLE `pickpocketing_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `pickpocketing_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `player_classlevelstats`
+--
+
+DROP TABLE IF EXISTS `player_classlevelstats`;
+CREATE TABLE `player_classlevelstats` (
+ `class` tinyint(3) unsigned NOT NULL,
+ `level` tinyint(3) unsigned NOT NULL,
+ `basehp` smallint(5) unsigned NOT NULL,
+ `basemana` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`class`,`level`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 COMMENT='Stores levels stats.';
+
+--
+-- Dumping data for table `player_classlevelstats`
+--
+
+LOCK TABLES `player_classlevelstats` WRITE;
+/*!40000 ALTER TABLE `player_classlevelstats` DISABLE KEYS */;
+INSERT INTO `player_classlevelstats` VALUES
+(1,1,20,0),
+(1,2,29,0),
+(1,3,38,0),
+(1,4,47,0),
+(1,5,56,0),
+(1,6,65,0),
+(1,7,74,0),
+(1,8,83,0),
+(1,9,92,0),
+(1,10,101,0),
+(1,11,100,0),
+(1,12,109,0),
+(1,13,118,0),
+(1,14,128,0),
+(1,15,139,0),
+(1,16,151,0),
+(1,17,154,0),
+(1,18,168,0),
+(1,19,183,0),
+(1,20,199,0),
+(1,21,206,0),
+(1,22,224,0),
+(1,23,243,0),
+(1,24,253,0),
+(1,25,274,0),
+(1,26,296,0),
+(1,27,309,0),
+(1,28,333,0),
+(1,29,348,0),
+(1,30,374,0),
+(1,31,401,0),
+(1,32,419,0),
+(1,33,448,0),
+(1,34,468,0),
+(1,35,499,0),
+(1,36,521,0),
+(1,37,545,0),
+(1,38,581,0),
+(1,39,609,0),
+(1,40,649,0),
+(1,41,681,0),
+(1,42,715,0),
+(1,43,761,0),
+(1,44,799,0),
+(1,45,839,0),
+(1,46,881,0),
+(1,47,935,0),
+(1,48,981,0),
+(1,49,1029,0),
+(1,50,1079,0),
+(1,51,1131,0),
+(1,52,1185,0),
+(1,53,1241,0),
+(1,54,1299,0),
+(1,55,1359,0),
+(1,56,1421,0),
+(1,57,1485,0),
+(1,58,1551,0),
+(1,59,1619,0),
+(1,60,1689,0),
+(1,61,1902,0),
+(1,62,2129,0),
+(1,63,2357,0),
+(1,64,2612,0),
+(1,65,2883,0),
+(1,66,3169,0),
+(1,67,3455,0),
+(1,68,3774,0),
+(1,69,4109,0),
+(1,70,4444,0),
+(1,71,4720,0),
+(1,72,5013,0),
+(1,73,5325,0),
+(1,74,5656,0),
+(1,75,6008,0),
+(1,76,6381,0),
+(1,77,6778,0),
+(1,78,7198,0),
+(1,79,7646,0),
+(1,80,8121,0),
+(2,1,28,60),
+(2,2,36,78),
+(2,3,44,98),
+(2,4,52,104),
+(2,5,60,111),
+(2,6,68,134),
+(2,7,76,143),
+(2,8,84,153),
+(2,9,92,179),
+(2,10,100,192),
+(2,11,108,205),
+(2,12,116,219),
+(2,13,124,249),
+(2,14,132,265),
+(2,15,131,282),
+(2,16,141,315),
+(2,17,152,334),
+(2,18,164,354),
+(2,19,177,390),
+(2,20,191,412),
+(2,21,206,435),
+(2,22,222,459),
+(2,23,239,499),
+(2,24,247,525),
+(2,25,266,552),
+(2,26,286,579),
+(2,27,307,621),
+(2,28,329,648),
+(2,29,342,675),
+(2,30,366,702),
+(2,31,391,729),
+(2,32,407,756),
+(2,33,434,798),
+(2,34,462,825),
+(2,35,481,852),
+(2,36,511,879),
+(2,37,542,906),
+(2,38,564,933),
+(2,39,597,960),
+(2,40,621,987),
+(2,41,656,1014),
+(2,42,682,1041),
+(2,43,719,1068),
+(2,44,747,1110),
+(2,45,786,1137),
+(2,46,816,1164),
+(2,47,857,1176),
+(2,48,889,1203),
+(2,49,922,1230),
+(2,50,966,1257),
+(2,51,1001,1284),
+(2,52,1037,1311),
+(2,53,1084,1338),
+(2,54,1122,1365),
+(2,55,1161,1392),
+(2,56,1201,1419),
+(2,57,1252,1446),
+(2,58,1294,1458),
+(2,59,1337,1485),
+(2,60,1381,1512),
+(2,61,1540,1656),
+(2,62,1708,1800),
+(2,63,1884,1944),
+(2,64,2068,2088),
+(2,65,2262,2232),
+(2,66,2466,2377),
+(2,67,2679,2521),
+(2,68,2901,2665),
+(2,69,3134,2809),
+(2,70,3377,2953),
+(2,71,3629,3097),
+(2,72,3900,3241),
+(2,73,4191,3385),
+(2,74,4503,3529),
+(2,75,4839,3673),
+(2,76,5200,3817),
+(2,77,5588,3962),
+(2,78,6005,4106),
+(2,79,6453,4250),
+(2,80,6934,4394),
+(3,1,46,65),
+(3,2,53,70),
+(3,3,60,76),
+(3,4,67,98),
+(3,5,74,106),
+(3,6,81,130),
+(3,7,88,140),
+(3,8,95,166),
+(3,9,102,193),
+(3,10,109,206),
+(3,11,116,235),
+(3,12,123,250),
+(3,13,130,266),
+(3,14,138,298),
+(3,15,147,316),
+(3,16,157,350),
+(3,17,168,370),
+(3,18,180,391),
+(3,19,193,428),
+(3,20,207,451),
+(3,21,222,475),
+(3,22,238,515),
+(3,23,255,541),
+(3,24,273,568),
+(3,25,292,611),
+(3,26,312,640),
+(3,27,333,670),
+(3,28,355,715),
+(3,29,378,745),
+(3,30,402,775),
+(3,31,417,805),
+(3,32,443,850),
+(3,33,470,880),
+(3,34,498,910),
+(3,35,527,940),
+(3,36,547,970),
+(3,37,578,1015),
+(3,38,610,1045),
+(3,39,643,1075),
+(3,40,667,1105),
+(3,41,702,1135),
+(3,42,738,1180),
+(3,43,775,1210),
+(3,44,803,1240),
+(3,45,842,1270),
+(3,46,872,1300),
+(3,47,913,1330),
+(3,48,955,1360),
+(3,49,994,1390),
+(3,50,1047,1420),
+(3,51,1067,1450),
+(3,52,1113,1480),
+(3,53,1150,1510),
+(3,54,1198,1540),
+(3,55,1237,1570),
+(3,56,1287,1600),
+(3,57,1328,1630),
+(3,58,1370,1660),
+(3,59,1423,1690),
+(3,60,1467,1720),
+(3,61,1633,1886),
+(3,62,1819,2053),
+(3,63,2003,2219),
+(3,64,2195,2385),
+(3,65,2397,2552),
+(3,66,2623,2718),
+(3,67,2844,2884),
+(3,68,3075,3050),
+(3,69,3316,3217),
+(3,70,3568,3383),
+(3,71,3834,3549),
+(3,72,4120,3716),
+(3,73,4427,3882),
+(3,74,4757,4048),
+(3,75,5112,4215),
+(3,76,5493,4381),
+(3,77,5903,4547),
+(3,78,6343,4713),
+(3,79,6816,4880),
+(3,80,7324,5046),
+(4,1,25,0),
+(4,2,32,0),
+(4,3,49,0),
+(4,4,56,0),
+(4,5,63,0),
+(4,6,70,0),
+(4,7,87,0),
+(4,8,94,0),
+(4,9,101,0),
+(4,10,118,0),
+(4,11,125,0),
+(4,12,142,0),
+(4,13,149,0),
+(4,14,156,0),
+(4,15,173,0),
+(4,16,181,0),
+(4,17,190,0),
+(4,18,200,0),
+(4,19,221,0),
+(4,20,233,0),
+(4,21,246,0),
+(4,22,260,0),
+(4,23,275,0),
+(4,24,301,0),
+(4,25,318,0),
+(4,26,336,0),
+(4,27,355,0),
+(4,28,375,0),
+(4,29,396,0),
+(4,30,428,0),
+(4,31,451,0),
+(4,32,475,0),
+(4,33,500,0),
+(4,34,526,0),
+(4,35,553,0),
+(4,36,581,0),
+(4,37,610,0),
+(4,38,640,0),
+(4,39,671,0),
+(4,40,703,0),
+(4,41,736,0),
+(4,42,770,0),
+(4,43,805,0),
+(4,44,841,0),
+(4,45,878,0),
+(4,46,916,0),
+(4,47,955,0),
+(4,48,995,0),
+(4,49,1026,0),
+(4,50,1068,0),
+(4,51,1111,0),
+(4,52,1155,0),
+(4,53,1200,0),
+(4,54,1246,0),
+(4,55,1283,0),
+(4,56,1331,0),
+(4,57,1380,0),
+(4,58,1430,0),
+(4,59,1471,0),
+(4,60,1523,0),
+(4,61,1702,0),
+(4,62,1879,0),
+(4,63,2077,0),
+(4,64,2285,0),
+(4,65,2489,0),
+(4,66,2717,0),
+(4,67,2941,0),
+(4,68,3190,0),
+(4,69,3450,0),
+(4,70,3704,0),
+(4,71,3980,0),
+(4,72,4277,0),
+(4,73,4596,0),
+(4,74,4939,0),
+(4,75,5307,0),
+(4,76,5703,0),
+(4,77,6128,0),
+(4,78,6585,0),
+(4,79,7076,0),
+(4,80,7604,0),
+(5,1,52,73),
+(5,2,57,76),
+(5,3,72,95),
+(5,4,77,114),
+(5,5,92,133),
+(5,6,97,152),
+(5,7,112,171),
+(5,8,117,190),
+(5,9,132,209),
+(5,10,137,212),
+(5,11,142,215),
+(5,12,157,234),
+(5,13,172,254),
+(5,14,177,260),
+(5,15,192,282),
+(5,16,197,305),
+(5,17,212,329),
+(5,18,227,339),
+(5,19,232,365),
+(5,20,247,377),
+(5,21,252,405),
+(5,22,268,434),
+(5,23,275,449),
+(5,24,293,480),
+(5,25,302,497),
+(5,26,322,530),
+(5,27,343,549),
+(5,28,355,584),
+(5,29,378,605),
+(5,30,392,627),
+(5,31,417,665),
+(5,32,433,689),
+(5,33,460,728),
+(5,34,478,752),
+(5,35,507,776),
+(5,36,527,800),
+(5,37,548,839),
+(5,38,580,863),
+(5,39,603,887),
+(5,40,637,911),
+(5,41,662,950),
+(5,42,698,974),
+(5,43,725,998),
+(5,44,763,1022),
+(5,45,792,1046),
+(5,46,822,1070),
+(5,47,863,1094),
+(5,48,895,1118),
+(5,49,928,1142),
+(5,50,972,1166),
+(5,51,1007,1190),
+(5,52,1053,1214),
+(5,53,1090,1238),
+(5,54,1128,1262),
+(5,55,1177,1271),
+(5,56,1217,1295),
+(5,57,1258,1319),
+(5,58,1300,1343),
+(5,59,1353,1352),
+(5,60,1397,1376),
+(5,61,1557,1500),
+(5,62,1738,1625),
+(5,63,1916,1749),
+(5,64,2101,1873),
+(5,65,2295,1998),
+(5,66,2495,2122),
+(5,67,2719,2247),
+(5,68,2936,2371),
+(5,69,3160,2495),
+(5,70,3391,2620),
+(5,71,3644,2744),
+(5,72,3916,2868),
+(5,73,4208,2993),
+(5,74,4522,3117),
+(5,75,4859,3242),
+(5,76,5221,3366),
+(5,77,5610,3490),
+(5,78,6028,3615),
+(5,79,6477,3739),
+(5,80,6960,3863),
+(6,1,22,0),
+(6,2,27,0),
+(6,3,32,0),
+(6,4,37,0),
+(6,5,42,0),
+(6,6,47,0),
+(6,7,52,0),
+(6,8,58,0),
+(6,9,64,0),
+(6,10,70,0),
+(6,11,77,0),
+(6,12,84,0),
+(6,13,92,0),
+(6,14,100,0),
+(6,15,117,0),
+(6,16,127,0),
+(6,17,138,0),
+(6,18,150,0),
+(6,19,163,0),
+(6,20,177,0),
+(6,21,192,0),
+(6,22,208,0),
+(6,23,225,0),
+(6,24,239,0),
+(6,25,258,0),
+(6,26,278,0),
+(6,27,299,0),
+(6,28,321,0),
+(6,29,344,0),
+(6,30,368,0),
+(6,31,393,0),
+(6,32,419,0),
+(6,33,446,0),
+(6,34,474,0),
+(6,35,503,0),
+(6,36,533,0),
+(6,37,564,0),
+(6,38,596,0),
+(6,39,629,0),
+(6,40,698,0),
+(6,41,698,0),
+(6,42,734,0),
+(6,43,771,0),
+(6,44,809,0),
+(6,45,849,0),
+(6,46,891,0),
+(6,47,935,0),
+(6,48,981,0),
+(6,49,1029,0),
+(6,50,1079,0),
+(6,51,1131,0),
+(6,52,1185,0),
+(6,53,1241,0),
+(6,54,1299,0),
+(6,55,1359,0),
+(6,56,1421,0),
+(6,57,1485,0),
+(6,58,1551,0),
+(6,59,1619,0),
+(6,60,1689,0),
+(6,61,1902,0),
+(6,62,2129,0),
+(6,63,2357,0),
+(6,64,2612,0),
+(6,65,2883,0),
+(6,66,3169,0),
+(6,67,3455,0),
+(6,68,3774,0),
+(6,69,4109,0),
+(6,70,4444,0),
+(6,71,4720,0),
+(6,72,5013,0),
+(6,73,5325,0),
+(6,74,5656,0),
+(6,75,6008,0),
+(6,76,6381,0),
+(6,77,6778,0),
+(6,78,7199,0),
+(6,79,7646,0),
+(6,80,8121,0),
+(7,1,37,85),
+(7,2,44,91),
+(7,3,51,98),
+(7,4,58,106),
+(7,5,65,115),
+(7,6,72,125),
+(7,7,79,136),
+(7,8,86,148),
+(7,9,93,161),
+(7,10,100,175),
+(7,11,107,190),
+(7,12,114,206),
+(7,13,121,223),
+(7,14,128,241),
+(7,15,135,260),
+(7,16,142,280),
+(7,17,150,301),
+(7,18,159,323),
+(7,19,169,346),
+(7,20,180,370),
+(7,21,192,395),
+(7,22,205,421),
+(7,23,219,448),
+(7,24,234,476),
+(7,25,240,505),
+(7,26,257,535),
+(7,27,275,566),
+(7,28,294,598),
+(7,29,314,631),
+(7,30,335,665),
+(7,31,347,699),
+(7,32,370,733),
+(7,33,394,767),
+(7,34,419,786),
+(7,35,435,820),
+(7,36,462,854),
+(7,37,490,888),
+(7,38,509,922),
+(7,39,539,941),
+(7,40,570,975),
+(7,41,592,1009),
+(7,42,625,1028),
+(7,43,649,1062),
+(7,44,684,1096),
+(7,45,710,1115),
+(7,46,747,1149),
+(7,47,775,1183),
+(7,48,814,1202),
+(7,49,844,1236),
+(7,50,885,1255),
+(7,51,917,1289),
+(7,52,960,1323),
+(7,53,994,1342),
+(7,54,1029,1376),
+(7,55,1075,1395),
+(7,56,1112,1414),
+(7,57,1150,1448),
+(7,58,1199,1467),
+(7,59,1239,1501),
+(7,60,1330,1520),
+(7,61,1428,1664),
+(7,62,1583,1808),
+(7,63,1760,1951),
+(7,64,1932,2095),
+(7,65,2114,2239),
+(7,66,2304,2383),
+(7,67,2504,2527),
+(7,68,2713,2670),
+(7,69,2931,2814),
+(7,70,3159,2958),
+(7,71,3395,3102),
+(7,72,3648,3246),
+(7,73,3920,3389),
+(7,74,4212,3533),
+(7,75,4526,3677),
+(7,76,4863,3821),
+(7,77,5226,3965),
+(7,78,5616,4108),
+(7,79,6035,4252),
+(7,80,6485,4396),
+(8,1,32,100),
+(8,2,47,110),
+(8,3,52,106),
+(8,4,67,118),
+(8,5,82,131),
+(8,6,97,130),
+(8,7,102,145),
+(8,8,117,146),
+(8,9,132,163),
+(8,10,137,196),
+(8,11,152,215),
+(8,12,167,220),
+(8,13,172,241),
+(8,14,187,263),
+(8,15,202,271),
+(8,16,207,295),
+(8,17,222,305),
+(8,18,237,331),
+(8,19,242,343),
+(8,20,257,371),
+(8,21,272,385),
+(8,22,277,415),
+(8,23,292,431),
+(8,24,298,463),
+(8,25,315,481),
+(8,26,333,515),
+(8,27,342,535),
+(8,28,362,556),
+(8,29,373,592),
+(8,30,395,613),
+(8,31,418,634),
+(8,32,432,670),
+(8,33,457,691),
+(8,34,473,712),
+(8,35,500,733),
+(8,36,518,754),
+(8,37,547,790),
+(8,38,577,811),
+(8,39,598,832),
+(8,40,630,853),
+(8,41,653,874),
+(8,42,687,895),
+(8,43,712,916),
+(8,44,748,937),
+(8,45,775,958),
+(8,46,813,979),
+(8,47,842,1000),
+(8,48,882,1021),
+(8,49,913,1042),
+(8,50,955,1048),
+(8,51,988,1069),
+(8,52,1032,1090),
+(8,53,1067,1111),
+(8,54,1103,1117),
+(8,55,1150,1138),
+(8,56,1188,1159),
+(8,57,1237,1165),
+(8,58,1277,1186),
+(8,59,1328,1192),
+(8,60,1370,1213),
+(8,61,1526,1316),
+(8,62,1702,1419),
+(8,63,1875,1521),
+(8,64,2070,1624),
+(8,65,2261,1727),
+(8,66,2461,1830),
+(8,67,2686,1932),
+(8,68,2906,2035),
+(8,69,3136,2138),
+(8,70,3393,2241),
+(8,71,3646,2343),
+(8,72,3918,2446),
+(8,73,4210,2549),
+(8,74,4524,2652),
+(8,75,4861,2754),
+(8,76,5223,2857),
+(8,77,5612,2960),
+(8,78,6030,3063),
+(8,79,6480,3165),
+(8,80,6963,3268),
+(9,1,23,90),
+(9,2,28,98),
+(9,3,43,107),
+(9,4,48,102),
+(9,5,63,113),
+(9,6,68,126),
+(9,7,83,144),
+(9,8,88,162),
+(9,9,93,180),
+(9,10,108,198),
+(9,11,123,200),
+(9,12,128,218),
+(9,13,143,237),
+(9,14,148,257),
+(9,15,153,278),
+(9,16,168,300),
+(9,17,173,308),
+(9,18,189,332),
+(9,19,196,357),
+(9,20,204,383),
+(9,21,223,395),
+(9,22,233,423),
+(9,23,244,452),
+(9,24,266,467),
+(9,25,279,498),
+(9,26,293,530),
+(9,27,318,548),
+(9,28,334,582),
+(9,29,351,602),
+(9,30,379,638),
+(9,31,398,674),
+(9,32,418,695),
+(9,33,439,731),
+(9,34,471,752),
+(9,35,494,788),
+(9,36,518,809),
+(9,37,543,830),
+(9,38,569,866),
+(9,39,606,887),
+(9,40,634,923),
+(9,41,663,944),
+(9,42,693,965),
+(9,43,724,1001),
+(9,44,756,1022),
+(9,45,799,1043),
+(9,46,832,1064),
+(9,47,868,1100),
+(9,48,904,1121),
+(9,49,941,1142),
+(9,50,979,1163),
+(9,51,1018,1184),
+(9,52,1058,1205),
+(9,53,1099,1226),
+(9,54,1141,1247),
+(9,55,1184,1268),
+(9,56,1228,1289),
+(9,57,1273,1310),
+(9,58,1319,1331),
+(9,59,1366,1352),
+(9,60,1414,1373),
+(9,61,1580,1497),
+(9,62,1755,1621),
+(9,63,1939,1745),
+(9,64,2133,1870),
+(9,65,2323,1994),
+(9,66,2535,2118),
+(9,67,2758,2242),
+(9,68,2991,2366),
+(9,69,3235,2490),
+(9,70,3490,2615),
+(9,71,3750,2739),
+(9,72,4025,2863),
+(9,73,4330,2987),
+(9,74,4646,3111),
+(9,75,4997,3235),
+(9,76,5373,3360),
+(9,77,5774,3483),
+(9,78,6207,3608),
+(9,79,6667,3732),
+(9,80,7136,3856),
+(11,1,44,60),
+(11,2,51,66),
+(11,3,58,73),
+(11,4,75,81),
+(11,5,82,90),
+(11,6,89,100),
+(11,7,106,111),
+(11,8,113,123),
+(11,9,120,136),
+(11,10,137,150),
+(11,11,144,165),
+(11,12,151,182),
+(11,13,168,200),
+(11,14,175,219),
+(11,15,182,239),
+(11,16,199,260),
+(11,17,206,282),
+(11,18,214,305),
+(11,19,233,329),
+(11,20,243,354),
+(11,21,254,380),
+(11,22,266,392),
+(11,23,289,420),
+(11,24,303,449),
+(11,25,318,479),
+(11,26,334,509),
+(11,27,361,524),
+(11,28,379,554),
+(11,29,398,584),
+(11,30,418,614),
+(11,31,439,629),
+(11,32,461,659),
+(11,33,494,689),
+(11,34,518,704),
+(11,35,543,734),
+(11,36,569,749),
+(11,37,596,779),
+(11,38,624,809),
+(11,39,653,824),
+(11,40,683,854),
+(11,41,714,869),
+(11,42,746,899),
+(11,43,779,914),
+(11,44,823,944),
+(11,45,858,959),
+(11,46,894,989),
+(11,47,921,1004),
+(11,48,959,1019),
+(11,49,998,1049),
+(11,50,1038,1064),
+(11,51,1079,1079),
+(11,52,1121,1109),
+(11,53,1164,1124),
+(11,54,1208,1139),
+(11,55,1253,1154),
+(11,56,1299,1169),
+(11,57,1346,1199),
+(11,58,1384,1214),
+(11,59,1433,1229),
+(11,60,1483,1244),
+(11,61,1657,1357),
+(11,62,1840,1469),
+(11,63,2020,1582),
+(11,64,2222,1694),
+(11,65,2433,1807),
+(11,66,2640,1919),
+(11,67,2872,2032),
+(11,68,3114,2145),
+(11,69,3351,2257),
+(11,70,3614,2370),
+(11,71,3883,2482),
+(11,72,4172,2595),
+(11,73,4483,2708),
+(11,74,4817,2820),
+(11,75,5176,2933),
+(11,76,5562,3045),
+(11,77,5977,3158),
+(11,78,6423,3270),
+(11,79,6902,3383),
+(11,80,7417,3496);
+/*!40000 ALTER TABLE `player_classlevelstats` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `player_levelstats`
+--
+
+DROP TABLE IF EXISTS `player_levelstats`;
+CREATE TABLE `player_levelstats` (
+ `race` tinyint(3) unsigned NOT NULL,
+ `class` tinyint(3) unsigned NOT NULL,
+ `level` tinyint(3) unsigned NOT NULL,
+ `str` tinyint(3) unsigned NOT NULL,
+ `agi` tinyint(3) unsigned NOT NULL,
+ `sta` tinyint(3) unsigned NOT NULL,
+ `inte` tinyint(3) unsigned NOT NULL,
+ `spi` tinyint(3) unsigned NOT NULL,
+ PRIMARY KEY (`race`,`class`,`level`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 COMMENT='Stores levels stats.';
+
+--
+-- Dumping data for table `player_levelstats`
+--
+
+LOCK TABLES `player_levelstats` WRITE;
+/*!40000 ALTER TABLE `player_levelstats` DISABLE KEYS */;
+INSERT INTO `player_levelstats` VALUES
+(1,1,1,23,20,22,20,20),
+(1,1,2,24,21,23,20,20),
+(1,1,3,26,22,24,20,21),
+(1,1,4,27,22,26,20,21),
+(1,1,5,28,23,27,20,21),
+(1,1,6,30,24,28,20,21),
+(1,1,7,31,25,29,21,22),
+(1,1,8,32,26,30,21,22),
+(1,1,9,34,26,32,21,22),
+(1,1,10,35,27,33,21,23),
+(1,1,11,36,28,34,21,23),
+(1,1,12,38,29,35,21,23),
+(1,1,13,39,30,37,21,24),
+(1,1,14,41,31,38,21,24),
+(1,1,15,42,32,39,21,24),
+(1,1,16,44,33,41,21,25),
+(1,1,17,45,34,42,22,25),
+(1,1,18,47,34,43,22,25),
+(1,1,19,48,35,45,22,26),
+(1,1,20,50,36,46,22,26),
+(1,1,21,51,37,48,22,26),
+(1,1,22,53,38,49,22,27),
+(1,1,23,54,39,51,22,27),
+(1,1,24,56,40,52,23,28),
+(1,1,25,58,41,53,23,28),
+(1,1,26,59,42,55,23,28),
+(1,1,27,61,43,56,23,29),
+(1,1,28,63,44,58,23,29),
+(1,1,29,64,45,59,23,30),
+(1,1,30,66,46,61,24,30),
+(1,1,31,68,47,62,24,30),
+(1,1,32,69,48,64,24,31),
+(1,1,33,71,50,66,24,31),
+(1,1,34,73,51,67,24,32),
+(1,1,35,74,52,69,24,32),
+(1,1,36,76,53,70,25,33),
+(1,1,37,78,54,72,25,33),
+(1,1,38,80,55,74,25,34),
+(1,1,39,82,56,75,25,34),
+(1,1,40,83,57,77,25,35),
+(1,1,41,85,58,79,26,35),
+(1,1,42,87,60,80,26,35),
+(1,1,43,89,61,82,26,36),
+(1,1,44,91,62,84,26,36),
+(1,1,45,93,63,85,26,37),
+(1,1,46,95,64,87,27,37),
+(1,1,47,97,66,89,27,38),
+(1,1,48,99,67,91,27,38),
+(1,1,49,101,68,93,27,39),
+(1,1,50,103,69,94,28,40),
+(1,1,51,105,71,96,28,40),
+(1,1,52,107,72,98,28,41),
+(1,1,53,109,73,100,28,41),
+(1,1,54,111,74,102,29,42),
+(1,1,55,113,76,103,29,42),
+(1,1,56,115,77,105,29,43),
+(1,1,57,117,78,107,29,43),
+(1,1,58,119,79,109,30,44),
+(1,1,59,121,81,111,30,44),
+(1,1,60,123,82,113,30,45),
+(1,1,61,125,83,115,30,46),
+(1,1,62,127,85,117,31,46),
+(1,1,63,129,86,119,31,47),
+(1,1,64,132,88,121,31,47),
+(1,1,65,134,89,123,32,48),
+(1,1,66,136,90,125,32,49),
+(1,1,67,138,92,127,32,49),
+(1,1,68,140,93,129,32,50),
+(1,1,69,143,95,131,33,50),
+(1,1,70,145,96,133,33,51),
+(1,1,71,148,97,140,33,53),
+(1,1,72,156,99,143,33,54),
+(1,1,73,162,101,148,33,55),
+(1,1,74,162,102,148,34,55),
+(1,1,75,165,104,150,34,56),
+(1,1,76,171,106,156,34,57),
+(1,1,77,171,108,157,35,58),
+(1,1,78,174,109,159,35,58),
+(1,1,79,181,111,165,35,59),
+(1,1,80,184,113,168,36,60),
+(1,2,1,22,20,22,20,21),
+(1,2,2,23,21,23,21,22),
+(1,2,3,24,21,24,21,22),
+(1,2,4,25,22,25,22,23),
+(1,2,5,26,22,26,23,24),
+(1,2,6,28,23,27,23,25),
+(1,2,7,29,24,28,24,25),
+(1,2,8,30,24,29,25,26),
+(1,2,9,31,25,30,25,27),
+(1,2,10,32,25,32,26,27),
+(1,2,11,33,26,33,27,28),
+(1,2,12,35,27,34,27,29),
+(1,2,13,36,27,35,28,30),
+(1,2,14,37,28,36,29,31),
+(1,2,15,38,29,37,30,31),
+(1,2,16,40,29,38,30,32),
+(1,2,17,41,30,40,31,33),
+(1,2,18,42,31,41,32,34),
+(1,2,19,43,31,42,33,35),
+(1,2,20,45,32,43,33,35),
+(1,2,21,46,33,45,34,36),
+(1,2,22,47,33,46,35,37),
+(1,2,23,49,34,47,36,38),
+(1,2,24,50,35,48,37,39),
+(1,2,25,51,36,50,37,40),
+(1,2,26,53,36,51,38,41),
+(1,2,27,54,37,52,39,42),
+(1,2,28,56,38,54,40,43),
+(1,2,29,57,39,55,41,43),
+(1,2,30,58,39,56,42,44),
+(1,2,31,60,40,58,43,45),
+(1,2,32,61,41,59,43,46),
+(1,2,33,63,42,60,44,47),
+(1,2,34,64,43,62,45,48),
+(1,2,35,66,44,63,46,49),
+(1,2,36,67,44,65,47,50),
+(1,2,37,69,45,66,48,51),
+(1,2,38,70,46,67,49,52),
+(1,2,39,72,47,69,50,53),
+(1,2,40,73,48,70,51,54),
+(1,2,41,75,49,72,52,55),
+(1,2,42,77,49,73,53,56),
+(1,2,43,78,50,75,54,57),
+(1,2,44,80,51,76,55,58),
+(1,2,45,81,52,78,56,59),
+(1,2,46,83,53,79,57,61),
+(1,2,47,85,54,81,58,62),
+(1,2,48,86,55,83,59,63),
+(1,2,49,88,56,84,60,64),
+(1,2,50,90,57,86,61,65),
+(1,2,51,91,58,87,62,66),
+(1,2,52,93,59,89,63,67),
+(1,2,53,95,60,91,64,68),
+(1,2,54,97,61,92,65,69),
+(1,2,55,98,61,94,66,71),
+(1,2,56,100,62,95,67,72),
+(1,2,57,102,63,97,68,73),
+(1,2,58,104,64,99,69,74),
+(1,2,59,105,65,101,70,75),
+(1,2,60,107,66,102,71,77),
+(1,2,61,109,67,104,73,78),
+(1,2,62,111,69,106,74,79),
+(1,2,63,113,70,107,75,80),
+(1,2,64,115,71,109,76,81),
+(1,2,65,116,72,111,77,83),
+(1,2,66,118,73,113,78,84),
+(1,2,67,120,74,115,79,85),
+(1,2,68,122,75,116,81,86),
+(1,2,69,124,76,118,82,88),
+(1,2,70,126,77,120,83,89),
+(1,2,71,148,78,122,84,92),
+(1,2,72,150,79,125,86,94),
+(1,2,73,152,80,127,87,96),
+(1,2,74,156,82,129,89,97),
+(1,2,75,158,83,131,90,99),
+(1,2,76,162,84,134,92,100),
+(1,2,77,164,86,136,93,103),
+(1,2,78,167,87,138,95,105),
+(1,2,79,170,88,153,96,106),
+(1,2,80,173,90,160,98,108),
+(1,4,1,21,23,21,20,20),
+(1,4,2,22,24,22,20,20),
+(1,4,3,23,26,22,20,21),
+(1,4,4,23,27,23,20,21),
+(1,4,5,24,29,24,21,21),
+(1,4,6,25,30,25,21,22),
+(1,4,7,26,32,25,21,22),
+(1,4,8,26,33,26,21,23),
+(1,4,9,27,35,27,21,23),
+(1,4,10,28,36,27,21,23),
+(1,4,11,29,38,28,22,24),
+(1,4,12,30,39,29,22,24),
+(1,4,13,31,41,30,22,25),
+(1,4,14,31,43,31,22,25),
+(1,4,15,32,44,31,22,25),
+(1,4,16,33,46,32,23,26),
+(1,4,17,34,48,33,23,26),
+(1,4,18,35,49,34,23,27),
+(1,4,19,36,51,35,23,27),
+(1,4,20,37,53,35,23,28),
+(1,4,21,38,54,36,24,28),
+(1,4,22,39,56,37,24,29),
+(1,4,23,40,58,38,24,29),
+(1,4,24,41,60,39,24,30),
+(1,4,25,42,61,40,25,30),
+(1,4,26,43,63,41,25,31),
+(1,4,27,44,65,42,25,31),
+(1,4,28,45,67,43,25,32),
+(1,4,29,46,69,43,25,32),
+(1,4,30,47,71,44,26,33),
+(1,4,31,48,72,45,26,33),
+(1,4,32,49,74,46,26,34),
+(1,4,33,50,76,47,27,34),
+(1,4,34,51,78,48,27,35),
+(1,4,35,52,80,49,27,35),
+(1,4,36,53,82,50,27,36),
+(1,4,37,54,84,51,28,36),
+(1,4,38,55,86,52,28,37),
+(1,4,39,56,88,53,28,38),
+(1,4,40,57,90,54,28,38),
+(1,4,41,58,92,55,29,39),
+(1,4,42,60,94,56,29,39),
+(1,4,43,61,96,57,29,40),
+(1,4,44,62,98,58,30,40),
+(1,4,45,63,100,59,30,41),
+(1,4,46,64,103,61,30,42),
+(1,4,47,65,105,62,31,42),
+(1,4,48,66,107,63,31,43),
+(1,4,49,68,109,64,31,44),
+(1,4,50,69,111,65,32,44),
+(1,4,51,70,113,66,32,45),
+(1,4,52,71,116,67,32,45),
+(1,4,53,73,118,68,33,46),
+(1,4,54,74,120,69,33,47),
+(1,4,55,75,122,71,33,47),
+(1,4,56,76,125,72,34,48),
+(1,4,57,78,127,73,34,49),
+(1,4,58,79,129,74,34,49),
+(1,4,59,80,131,75,35,50),
+(1,4,60,81,134,77,35,51),
+(1,4,61,83,136,78,35,51),
+(1,4,62,84,138,79,36,52),
+(1,4,63,85,141,80,36,53),
+(1,4,64,87,143,81,37,54),
+(1,4,65,88,146,83,37,54),
+(1,4,66,89,148,84,37,55),
+(1,4,67,91,151,85,38,56),
+(1,4,68,92,153,86,38,57),
+(1,4,69,94,156,88,39,57),
+(1,4,70,95,158,89,39,58),
+(1,4,71,97,161,90,39,60),
+(1,4,72,99,164,92,40,60),
+(1,4,73,100,167,94,40,61),
+(1,4,74,102,170,95,41,62),
+(1,4,75,104,173,97,41,63),
+(1,4,76,105,176,98,41,64),
+(1,4,77,107,179,100,42,65),
+(1,4,78,109,183,106,42,66),
+(1,4,79,111,186,107,43,67),
+(1,4,80,113,189,109,43,69),
+(1,5,1,20,20,20,22,23),
+(1,5,2,20,20,20,23,24),
+(1,5,3,20,20,21,25,26),
+(1,5,4,20,21,21,26,27),
+(1,5,5,21,21,21,27,28),
+(1,5,6,21,21,22,29,30),
+(1,5,7,21,21,22,30,31),
+(1,5,8,21,22,23,31,33),
+(1,5,9,21,22,23,33,34),
+(1,5,10,21,22,23,34,36),
+(1,5,11,22,22,24,36,37),
+(1,5,12,22,23,24,37,39),
+(1,5,13,22,23,25,38,40),
+(1,5,14,22,23,25,40,42),
+(1,5,15,22,23,25,41,43),
+(1,5,16,23,24,26,43,45),
+(1,5,17,23,24,26,44,46),
+(1,5,18,23,24,27,46,48),
+(1,5,19,23,24,27,47,49),
+(1,5,20,23,25,28,49,51),
+(1,5,21,24,25,28,51,53),
+(1,5,22,24,25,29,52,54),
+(1,5,23,24,26,29,54,56),
+(1,5,24,24,26,30,55,58),
+(1,5,25,25,26,30,57,59),
+(1,5,26,25,27,31,59,61),
+(1,5,27,25,27,31,60,63),
+(1,5,28,25,27,32,62,65),
+(1,5,29,25,28,32,64,66),
+(1,5,30,26,28,33,65,68),
+(1,5,31,26,28,33,67,70),
+(1,5,32,26,29,34,69,72),
+(1,5,33,27,29,34,70,73),
+(1,5,34,27,29,35,72,75),
+(1,5,35,27,30,35,74,77),
+(1,5,36,27,30,36,76,79),
+(1,5,37,28,30,36,78,81),
+(1,5,38,28,31,37,79,83),
+(1,5,39,28,31,38,81,85),
+(1,5,40,28,31,38,83,87),
+(1,5,41,29,32,39,85,88),
+(1,5,42,29,32,39,87,90),
+(1,5,43,29,33,40,89,92),
+(1,5,44,30,33,40,91,94),
+(1,5,45,30,33,41,92,96),
+(1,5,46,30,34,42,94,98),
+(1,5,47,31,34,42,96,100),
+(1,5,48,31,35,43,98,102),
+(1,5,49,31,35,44,100,104),
+(1,5,50,32,36,44,102,106),
+(1,5,51,32,36,45,104,109),
+(1,5,52,32,36,45,106,111),
+(1,5,53,33,37,46,108,113),
+(1,5,54,33,37,47,110,115),
+(1,5,55,33,38,47,112,117),
+(1,5,56,34,38,48,114,119),
+(1,5,57,34,39,49,117,121),
+(1,5,58,34,39,49,119,124),
+(1,5,59,35,40,50,121,126),
+(1,5,60,35,40,51,123,128),
+(1,5,61,35,41,51,125,130),
+(1,5,62,36,41,52,127,132),
+(1,5,63,36,41,53,129,135),
+(1,5,64,37,42,54,132,137),
+(1,5,65,37,42,54,134,139),
+(1,5,66,37,43,55,136,142),
+(1,5,67,38,43,56,138,144),
+(1,5,68,38,44,57,140,146),
+(1,5,69,39,44,57,143,149),
+(1,5,70,39,45,58,145,151),
+(1,5,71,39,46,59,148,158),
+(1,5,72,40,46,59,151,161),
+(1,5,73,40,47,60,154,164),
+(1,5,74,41,47,61,156,167),
+(1,5,75,41,48,62,159,170),
+(1,5,76,41,49,63,162,174),
+(1,5,77,42,49,64,165,177),
+(1,5,78,42,50,65,168,180),
+(1,5,79,43,50,66,171,183),
+(1,5,80,43,51,67,174,186),
+(1,6,1,23,20,22,20,20),
+(1,6,2,24,21,23,20,20),
+(1,6,3,26,22,24,20,21),
+(1,6,4,27,22,26,20,21),
+(1,6,5,28,23,27,20,21),
+(1,6,6,30,24,28,20,21),
+(1,6,7,31,25,29,21,22),
+(1,6,8,32,26,30,21,22),
+(1,6,9,34,26,32,21,22),
+(1,6,10,35,27,33,21,23),
+(1,6,11,36,28,34,21,23),
+(1,6,12,38,29,35,21,23),
+(1,6,13,39,30,37,21,24),
+(1,6,14,41,31,38,21,24),
+(1,6,15,42,32,39,21,24),
+(1,6,16,44,33,41,21,25),
+(1,6,17,45,34,42,22,25),
+(1,6,18,47,34,43,22,25),
+(1,6,19,48,35,45,22,26),
+(1,6,20,50,36,46,22,26),
+(1,6,21,51,37,48,22,26),
+(1,6,22,53,38,49,22,27),
+(1,6,23,54,39,51,22,27),
+(1,6,24,56,40,52,23,28),
+(1,6,25,58,41,53,23,28),
+(1,6,26,59,42,55,23,28),
+(1,6,27,61,43,56,23,29),
+(1,6,28,63,44,58,23,29),
+(1,6,29,64,45,59,23,30),
+(1,6,30,66,46,61,24,30),
+(1,6,31,68,47,62,24,30),
+(1,6,32,69,48,64,24,31),
+(1,6,33,71,50,66,24,31),
+(1,6,34,73,51,67,24,32),
+(1,6,35,74,52,69,24,32),
+(1,6,36,76,53,70,25,33),
+(1,6,37,78,54,72,25,33),
+(1,6,38,80,55,74,25,34),
+(1,6,39,82,56,75,25,34),
+(1,6,40,83,57,77,25,35),
+(1,6,41,85,58,79,26,35),
+(1,6,42,87,60,80,26,35),
+(1,6,43,89,61,82,26,36),
+(1,6,44,91,62,84,26,36),
+(1,6,45,93,63,85,26,37),
+(1,6,46,95,64,87,27,37),
+(1,6,47,97,66,89,27,38),
+(1,6,48,99,67,91,27,38),
+(1,6,49,101,68,93,27,39),
+(1,6,50,103,69,94,28,40),
+(1,6,51,105,71,96,28,40),
+(1,6,52,106,72,97,28,41),
+(1,6,53,107,72,98,28,41),
+(1,6,54,107,73,98,29,42),
+(1,6,55,108,73,99,29,43),
+(1,6,56,111,75,102,29,44),
+(1,6,57,113,76,104,29,44),
+(1,6,58,118,77,106,30,45),
+(1,6,59,118,79,108,30,45),
+(1,6,60,123,80,110,30,46),
+(1,6,61,125,81,112,30,47),
+(1,6,62,128,83,114,30,47),
+(1,6,63,130,84,117,31,48),
+(1,6,64,130,86,119,31,48),
+(1,6,65,140,87,128,31,49),
+(1,6,66,143,89,131,31,50),
+(1,6,67,146,90,133,32,50),
+(1,6,68,148,92,135,32,51),
+(1,6,69,151,93,138,32,52),
+(1,6,70,154,95,140,32,52),
+(1,6,71,162,97,144,33,53),
+(1,6,72,164,98,146,33,54),
+(1,6,73,165,100,148,33,55),
+(1,6,74,166,102,151,33,55),
+(1,6,75,169,103,154,34,56),
+(1,6,76,172,105,157,34,57),
+(1,6,77,175,107,157,34,58),
+(1,6,78,176,108,157,34,58),
+(1,6,79,177,110,157,35,59),
+(1,6,80,180,112,160,35,60),
+(1,8,1,20,20,20,23,22),
+(1,8,2,20,20,20,24,23),
+(1,8,3,20,20,21,26,25),
+(1,8,4,20,20,21,27,26),
+(1,8,5,20,21,21,28,27),
+(1,8,6,20,21,21,30,29),
+(1,8,7,21,21,22,31,30),
+(1,8,8,21,21,22,33,31),
+(1,8,9,21,21,22,34,33),
+(1,8,10,21,21,23,36,34),
+(1,8,11,21,22,23,37,36),
+(1,8,12,21,22,23,39,37),
+(1,8,13,21,22,24,40,38),
+(1,8,14,21,22,24,42,40),
+(1,8,15,21,22,24,43,41),
+(1,8,16,21,23,25,45,43),
+(1,8,17,22,23,25,46,44),
+(1,8,18,22,23,25,48,46),
+(1,8,19,22,23,26,49,47),
+(1,8,20,22,23,26,51,49),
+(1,8,21,22,24,26,53,51),
+(1,8,22,22,24,27,54,52),
+(1,8,23,22,24,27,56,54),
+(1,8,24,23,24,28,58,55),
+(1,8,25,23,25,28,59,57),
+(1,8,26,23,25,28,61,59),
+(1,8,27,23,25,29,63,60),
+(1,8,28,23,25,29,65,62),
+(1,8,29,23,25,30,66,64),
+(1,8,30,24,26,30,68,65),
+(1,8,31,24,26,30,70,67),
+(1,8,32,24,26,31,72,69),
+(1,8,33,24,27,31,73,70),
+(1,8,34,24,27,32,75,72),
+(1,8,35,24,27,32,77,74),
+(1,8,36,25,27,33,79,76),
+(1,8,37,25,28,33,81,78),
+(1,8,38,25,28,34,83,79),
+(1,8,39,25,28,34,85,81),
+(1,8,40,25,28,35,87,83),
+(1,8,41,26,29,35,88,85),
+(1,8,42,26,29,35,90,87),
+(1,8,43,26,29,36,92,89),
+(1,8,44,26,30,36,94,91),
+(1,8,45,26,30,37,96,92),
+(1,8,46,27,30,37,98,94),
+(1,8,47,27,31,38,100,96),
+(1,8,48,27,31,38,102,98),
+(1,8,49,27,31,39,104,100),
+(1,8,50,28,32,40,106,102),
+(1,8,51,28,32,40,109,104),
+(1,8,52,28,32,41,111,106),
+(1,8,53,28,33,41,113,108),
+(1,8,54,29,33,42,115,110),
+(1,8,55,29,33,42,117,112),
+(1,8,56,29,34,43,119,114),
+(1,8,57,29,34,43,121,117),
+(1,8,58,30,34,44,124,119),
+(1,8,59,30,35,44,126,121),
+(1,8,60,30,35,45,128,123),
+(1,8,61,30,35,46,130,125),
+(1,8,62,31,36,46,132,127),
+(1,8,63,31,36,47,135,129),
+(1,8,64,31,37,47,137,132),
+(1,8,65,32,37,48,139,134),
+(1,8,66,32,37,49,142,136),
+(1,8,67,32,38,49,144,138),
+(1,8,68,32,38,50,146,140),
+(1,8,69,33,39,50,149,143),
+(1,8,70,33,39,51,151,145),
+(1,8,71,33,39,52,154,152),
+(1,8,72,33,40,53,160,155),
+(1,8,73,33,40,54,160,158),
+(1,8,74,34,41,54,163,160),
+(1,8,75,34,41,55,166,163),
+(1,8,76,34,41,56,169,166),
+(1,8,77,35,42,57,172,169),
+(1,8,78,35,42,57,175,173),
+(1,8,79,35,43,58,178,176),
+(1,8,80,36,43,59,181,179),
+(1,9,1,20,20,21,22,22),
+(1,9,2,20,20,22,23,23),
+(1,9,3,21,21,22,24,24),
+(1,9,4,21,21,23,26,25),
+(1,9,5,21,21,23,27,27),
+(1,9,6,21,22,24,28,28),
+(1,9,7,22,22,24,29,29),
+(1,9,8,22,23,25,30,30),
+(1,9,9,22,23,26,32,31),
+(1,9,10,23,23,26,33,33),
+(1,9,11,23,24,27,34,34),
+(1,9,12,23,24,27,35,35),
+(1,9,13,24,25,28,37,36),
+(1,9,14,24,25,29,38,38),
+(1,9,15,24,25,29,39,39),
+(1,9,16,25,26,30,41,40),
+(1,9,17,25,26,31,42,42),
+(1,9,18,25,27,31,43,43),
+(1,9,19,26,27,32,45,44),
+(1,9,20,26,28,33,46,46),
+(1,9,21,26,28,33,48,47),
+(1,9,22,27,29,34,49,49),
+(1,9,23,27,29,35,51,50),
+(1,9,24,28,30,35,52,51),
+(1,9,25,28,30,36,53,53),
+(1,9,26,28,31,37,55,54),
+(1,9,27,29,31,37,56,56),
+(1,9,28,29,32,38,58,57),
+(1,9,29,30,32,39,59,59),
+(1,9,30,30,33,40,61,60),
+(1,9,31,30,33,40,62,62),
+(1,9,32,31,34,41,64,63),
+(1,9,33,31,34,42,66,65),
+(1,9,34,32,35,43,67,66),
+(1,9,35,32,35,44,69,68),
+(1,9,36,33,36,44,70,69),
+(1,9,37,33,36,45,72,71),
+(1,9,38,34,37,46,74,73),
+(1,9,39,34,38,47,75,74),
+(1,9,40,35,38,48,77,76),
+(1,9,41,35,39,48,79,78),
+(1,9,42,35,39,49,80,79),
+(1,9,43,36,40,50,82,81),
+(1,9,44,36,40,51,84,83),
+(1,9,45,37,41,52,85,84),
+(1,9,46,37,42,53,87,86),
+(1,9,47,38,42,54,89,88),
+(1,9,48,38,43,55,91,89),
+(1,9,49,39,44,55,93,91),
+(1,9,50,40,44,56,94,93),
+(1,9,51,40,45,57,96,95),
+(1,9,52,41,45,58,98,97),
+(1,9,53,41,46,59,100,98),
+(1,9,54,42,47,60,102,100),
+(1,9,55,42,47,61,103,102),
+(1,9,56,43,48,62,105,104),
+(1,9,57,43,49,63,107,106),
+(1,9,58,44,49,64,109,108),
+(1,9,59,44,50,65,111,109),
+(1,9,60,45,51,66,113,111),
+(1,9,61,46,51,67,115,113),
+(1,9,62,46,52,68,117,115),
+(1,9,63,47,53,69,119,117),
+(1,9,64,47,54,70,121,119),
+(1,9,65,48,54,71,123,121),
+(1,9,66,49,55,72,125,123),
+(1,9,67,49,56,73,127,125),
+(1,9,68,50,57,74,129,127),
+(1,9,69,50,57,75,131,129),
+(1,9,70,51,58,76,133,131),
+(1,9,71,52,59,78,135,146),
+(1,9,72,53,59,79,138,148),
+(1,9,73,54,60,80,140,151),
+(1,9,74,54,61,89,143,154),
+(1,9,75,55,62,91,145,156),
+(1,9,76,56,63,92,148,159),
+(1,9,77,57,64,93,151,162),
+(1,9,78,57,65,95,153,165),
+(1,9,79,58,66,96,156,168),
+(1,9,80,59,67,97,159,170),
+(2,1,1,26,17,24,17,23),
+(2,1,2,27,18,25,17,23),
+(2,1,3,29,19,26,17,24),
+(2,1,4,30,19,27,17,24),
+(2,1,5,31,20,29,17,24),
+(2,1,6,32,21,30,17,24),
+(2,1,7,34,22,31,18,25),
+(2,1,8,35,23,32,18,25),
+(2,1,9,37,24,34,18,25),
+(2,1,10,38,24,35,18,26),
+(2,1,11,39,25,36,18,26),
+(2,1,12,41,26,37,18,26),
+(2,1,13,42,27,39,18,27),
+(2,1,14,44,28,40,18,27),
+(2,1,15,45,29,41,18,27),
+(2,1,16,47,30,43,19,28),
+(2,1,17,48,31,44,19,28),
+(2,1,18,50,32,45,19,28),
+(2,1,19,51,33,47,19,29),
+(2,1,20,53,34,48,19,29),
+(2,1,21,54,34,50,19,29),
+(2,1,22,56,35,51,19,30),
+(2,1,23,57,36,52,20,30),
+(2,1,24,59,37,54,20,30),
+(2,1,25,60,38,55,20,31),
+(2,1,26,62,39,57,20,31),
+(2,1,27,64,40,58,20,32),
+(2,1,28,65,41,60,20,32),
+(2,1,29,67,43,61,21,32),
+(2,1,30,69,44,63,21,33),
+(2,1,31,70,45,64,21,33),
+(2,1,32,72,46,66,21,34),
+(2,1,33,74,47,67,21,34),
+(2,1,34,76,48,69,21,35),
+(2,1,35,77,49,71,22,35),
+(2,1,36,79,50,72,22,36),
+(2,1,37,81,51,74,22,36),
+(2,1,38,83,52,76,22,36),
+(2,1,39,84,53,77,22,37),
+(2,1,40,86,55,79,23,37),
+(2,1,41,88,56,81,23,38),
+(2,1,42,90,57,82,23,38),
+(2,1,43,92,58,84,23,39),
+(2,1,44,94,59,86,23,39),
+(2,1,45,96,60,87,24,40),
+(2,1,46,98,62,89,24,40),
+(2,1,47,100,63,91,24,41),
+(2,1,48,101,64,93,24,41),
+(2,1,49,103,65,94,25,42),
+(2,1,50,105,66,96,25,42),
+(2,1,51,107,68,98,25,43),
+(2,1,52,109,69,100,25,43),
+(2,1,53,111,70,102,25,44),
+(2,1,54,113,71,104,26,45),
+(2,1,55,115,73,105,26,45),
+(2,1,56,118,74,107,26,46),
+(2,1,57,120,75,109,26,46),
+(2,1,58,122,77,111,27,47),
+(2,1,59,124,78,113,27,47),
+(2,1,60,126,79,115,27,48),
+(2,1,61,128,81,117,27,48),
+(2,1,62,130,82,119,28,49),
+(2,1,63,132,83,121,28,50),
+(2,1,64,135,85,123,28,50),
+(2,1,65,137,86,125,29,51),
+(2,1,66,139,87,127,29,52),
+(2,1,67,141,89,129,29,52),
+(2,1,68,143,90,131,29,53),
+(2,1,69,146,92,133,30,53),
+(2,1,70,148,93,135,30,54),
+(2,1,71,157,94,142,30,55),
+(2,1,72,162,96,148,30,56),
+(2,1,73,165,98,150,30,57),
+(2,1,74,168,99,153,31,57),
+(2,1,75,170,101,154,31,58),
+(2,1,76,172,103,156,31,59),
+(2,1,77,174,105,159,32,60),
+(2,1,78,179,106,162,32,60),
+(2,1,79,184,108,167,32,61),
+(2,1,80,187,110,170,33,62),
+(2,3,1,23,20,23,17,24),
+(2,3,2,23,21,24,18,25),
+(2,3,3,24,23,25,18,25),
+(2,3,4,24,24,26,19,26),
+(2,3,5,25,25,27,19,26),
+(2,3,6,25,27,28,20,27),
+(2,3,7,26,28,28,21,28),
+(2,3,8,26,30,29,21,28),
+(2,3,9,26,31,30,22,29),
+(2,3,10,27,33,31,22,30),
+(2,3,11,27,34,32,23,30),
+(2,3,12,28,36,33,24,31),
+(2,3,13,28,37,34,24,32),
+(2,3,14,29,39,35,25,33),
+(2,3,15,29,40,36,26,33),
+(2,3,16,30,42,37,26,34),
+(2,3,17,30,43,39,27,35),
+(2,3,18,31,45,40,28,35),
+(2,3,19,31,47,41,28,36),
+(2,3,20,32,48,42,29,37),
+(2,3,21,32,50,43,30,38),
+(2,3,22,33,51,44,31,39),
+(2,3,23,34,53,45,31,39),
+(2,3,24,34,55,46,32,40),
+(2,3,25,35,57,47,33,41),
+(2,3,26,35,58,48,34,42),
+(2,3,27,36,60,50,34,43),
+(2,3,28,36,62,51,35,43),
+(2,3,29,37,63,52,36,44),
+(2,3,30,38,65,53,37,45),
+(2,3,31,38,67,54,37,46),
+(2,3,32,39,69,56,38,47),
+(2,3,33,39,71,57,39,48),
+(2,3,34,40,72,58,40,49),
+(2,3,35,41,74,59,41,49),
+(2,3,36,41,76,61,42,50),
+(2,3,37,42,78,62,42,51),
+(2,3,38,43,80,63,43,52),
+(2,3,39,43,82,64,44,53),
+(2,3,40,44,84,66,45,54),
+(2,3,41,45,86,67,46,55),
+(2,3,42,45,88,68,47,56),
+(2,3,43,46,90,70,47,57),
+(2,3,44,47,91,71,48,58),
+(2,3,45,47,93,72,49,59),
+(2,3,46,48,95,74,50,60),
+(2,3,47,49,98,75,51,61),
+(2,3,48,50,100,77,52,62),
+(2,3,49,50,102,78,53,63),
+(2,3,50,51,104,79,54,64),
+(2,3,51,52,106,81,55,65),
+(2,3,52,52,108,82,56,66),
+(2,3,53,53,110,84,57,67),
+(2,3,54,54,112,85,58,68),
+(2,3,55,55,114,87,59,69),
+(2,3,56,55,116,88,60,70),
+(2,3,57,56,118,90,61,71),
+(2,3,58,57,121,91,62,72),
+(2,3,59,58,123,93,63,73),
+(2,3,60,59,125,94,64,74),
+(2,3,61,59,127,96,65,76),
+(2,3,62,60,130,97,66,77),
+(2,3,63,61,132,99,67,78),
+(2,3,64,62,134,100,68,79),
+(2,3,65,63,136,102,69,80),
+(2,3,66,64,139,104,70,81),
+(2,3,67,64,141,105,71,82),
+(2,3,68,65,143,107,72,84),
+(2,3,69,66,146,108,73,85),
+(2,3,70,67,148,110,74,86),
+(2,3,71,68,151,112,75,87),
+(2,3,72,69,154,114,76,88),
+(2,3,73,70,157,116,77,90),
+(2,3,74,71,160,118,79,91),
+(2,3,75,72,163,120,80,93),
+(2,3,76,73,166,122,81,94),
+(2,3,77,74,169,124,83,96),
+(2,3,78,75,172,126,84,97),
+(2,3,79,76,175,128,85,99),
+(2,3,80,77,178,130,87,100),
+(2,4,1,24,20,23,17,23),
+(2,4,2,25,21,24,17,23),
+(2,4,3,25,23,24,17,24),
+(2,4,4,26,24,25,17,24),
+(2,4,5,27,26,26,18,24),
+(2,4,6,28,27,26,18,25),
+(2,4,7,29,29,27,18,25),
+(2,4,8,29,30,28,18,26),
+(2,4,9,30,32,29,18,26),
+(2,4,10,31,33,29,19,26),
+(2,4,11,32,35,30,19,27),
+(2,4,12,33,37,31,19,27),
+(2,4,13,34,38,32,19,28),
+(2,4,14,34,40,32,19,28),
+(2,4,15,35,41,33,19,28),
+(2,4,16,36,43,34,20,29),
+(2,4,17,37,45,35,20,29),
+(2,4,18,38,46,36,20,30),
+(2,4,19,39,48,37,20,30),
+(2,4,20,40,50,37,21,31),
+(2,4,21,41,52,38,21,31),
+(2,4,22,42,53,39,21,31),
+(2,4,23,43,55,40,21,32),
+(2,4,24,43,57,41,21,32),
+(2,4,25,44,59,42,22,33),
+(2,4,26,45,60,43,22,33),
+(2,4,27,46,62,44,22,34),
+(2,4,28,47,64,44,22,34),
+(2,4,29,48,66,45,23,35),
+(2,4,30,49,68,46,23,35),
+(2,4,31,50,70,47,23,36),
+(2,4,32,51,72,48,23,36),
+(2,4,33,53,73,49,24,37),
+(2,4,34,54,75,50,24,38),
+(2,4,35,55,77,51,24,38),
+(2,4,36,56,79,52,24,39),
+(2,4,37,57,81,53,25,39),
+(2,4,38,58,83,54,25,40),
+(2,4,39,59,85,55,25,40),
+(2,4,40,60,87,56,26,41),
+(2,4,41,61,89,57,26,41),
+(2,4,42,62,91,58,26,42),
+(2,4,43,63,93,59,27,43),
+(2,4,44,65,95,60,27,43),
+(2,4,45,66,98,61,27,44),
+(2,4,46,67,100,62,27,44),
+(2,4,47,68,102,64,28,45),
+(2,4,48,69,104,65,28,46),
+(2,4,49,71,106,66,28,46),
+(2,4,50,72,108,67,29,47),
+(2,4,51,73,110,68,29,48),
+(2,4,52,74,113,69,29,48),
+(2,4,53,75,115,70,30,49),
+(2,4,54,77,117,71,30,50),
+(2,4,55,78,119,73,30,50),
+(2,4,56,79,122,74,31,51),
+(2,4,57,80,124,75,31,52),
+(2,4,58,82,126,76,31,52),
+(2,4,59,83,129,77,32,53),
+(2,4,60,84,131,78,32,54),
+(2,4,61,86,133,80,33,54),
+(2,4,62,87,136,81,33,55),
+(2,4,63,88,138,82,33,56),
+(2,4,64,90,140,83,34,57),
+(2,4,65,91,143,85,34,57),
+(2,4,66,92,145,86,34,58),
+(2,4,67,94,148,87,35,59),
+(2,4,68,95,150,88,35,59),
+(2,4,69,97,153,90,36,60),
+(2,4,70,98,155,91,36,61),
+(2,4,71,100,158,92,36,62),
+(2,4,72,102,161,94,37,62),
+(2,4,73,103,164,99,37,63),
+(2,4,74,105,167,100,38,64),
+(2,4,75,107,170,102,38,65),
+(2,4,76,108,173,102,38,66),
+(2,4,77,110,176,102,39,67),
+(2,4,78,112,180,103,39,68),
+(2,4,79,114,183,105,40,69),
+(2,4,80,116,186,107,40,70),
+(2,6,1,26,17,24,17,23),
+(2,6,2,27,18,25,17,23),
+(2,6,3,29,19,26,17,24),
+(2,6,4,30,19,27,17,24),
+(2,6,5,31,20,29,17,24),
+(2,6,6,32,21,30,17,24),
+(2,6,7,34,22,31,18,25),
+(2,6,8,35,23,32,18,25),
+(2,6,9,37,24,34,18,25),
+(2,6,10,38,24,35,18,26),
+(2,6,11,39,25,36,18,26),
+(2,6,12,41,26,37,18,26),
+(2,6,13,42,27,39,18,27),
+(2,6,14,44,28,40,18,27),
+(2,6,15,45,29,41,18,27),
+(2,6,16,47,30,43,19,28),
+(2,6,17,48,31,44,19,28),
+(2,6,18,50,32,45,19,28),
+(2,6,19,51,33,47,19,29),
+(2,6,20,53,34,48,19,29),
+(2,6,21,54,34,50,19,29),
+(2,6,22,56,35,51,19,30),
+(2,6,23,57,36,52,20,30),
+(2,6,24,59,37,54,20,30),
+(2,6,25,60,38,55,20,31),
+(2,6,26,62,39,57,20,31),
+(2,6,27,64,40,58,20,32),
+(2,6,28,65,41,60,20,32),
+(2,6,29,67,43,61,21,32),
+(2,6,30,69,44,63,21,33),
+(2,6,31,70,45,64,21,33),
+(2,6,32,72,46,66,21,34),
+(2,6,33,74,47,67,21,34),
+(2,6,34,76,48,69,21,35),
+(2,6,35,77,49,71,22,35),
+(2,6,36,79,50,72,22,36),
+(2,6,37,81,51,74,22,36),
+(2,6,38,83,52,76,22,36),
+(2,6,39,84,53,77,22,37),
+(2,6,40,86,55,79,23,37),
+(2,6,41,88,56,81,23,38),
+(2,6,42,90,57,82,23,38),
+(2,6,43,92,58,84,23,39),
+(2,6,44,94,59,86,23,39),
+(2,6,45,96,60,87,24,40),
+(2,6,46,98,62,89,24,40),
+(2,6,47,100,63,91,24,41),
+(2,6,48,101,64,93,24,41),
+(2,6,49,103,65,94,25,42),
+(2,6,50,105,66,96,25,42),
+(2,6,51,107,68,98,25,43),
+(2,6,52,109,69,100,25,43),
+(2,6,53,110,69,100,25,44),
+(2,6,54,111,70,101,26,45),
+(2,6,55,111,70,101,26,45),
+(2,6,56,114,72,104,26,46),
+(2,6,57,116,73,106,26,46),
+(2,6,58,118,74,108,27,47),
+(2,6,59,124,76,110,27,47),
+(2,6,60,126,77,112,27,48),
+(2,6,61,128,78,114,27,49),
+(2,6,62,131,80,116,27,49),
+(2,6,63,133,81,119,28,50),
+(2,6,64,136,83,121,28,50),
+(2,6,65,136,84,123,28,51),
+(2,6,66,142,86,126,28,52),
+(2,6,67,145,87,128,29,52),
+(2,6,68,147,89,130,29,53),
+(2,6,69,150,90,133,29,54),
+(2,6,70,157,92,135,29,54),
+(2,6,71,160,94,138,30,55),
+(2,6,72,163,95,140,30,56),
+(2,6,73,166,97,151,30,57),
+(2,6,74,169,99,154,30,57),
+(2,6,75,172,100,156,31,58),
+(2,6,76,175,102,160,31,59),
+(2,6,77,179,104,162,31,60),
+(2,6,78,182,105,165,31,60),
+(2,6,79,191,107,168,32,61),
+(2,6,80,194,109,171,32,62),
+(2,7,1,24,17,23,18,25),
+(2,7,2,25,17,24,19,26),
+(2,7,3,26,18,25,20,27),
+(2,7,4,26,18,26,21,28),
+(2,7,5,27,19,27,22,29),
+(2,7,6,28,19,28,23,30),
+(2,7,7,29,20,29,24,31),
+(2,7,8,30,20,30,25,32),
+(2,7,9,31,21,31,26,33),
+(2,7,10,32,21,32,27,34),
+(2,7,11,33,22,33,28,36),
+(2,7,12,34,22,34,29,37),
+(2,7,13,34,23,35,30,38),
+(2,7,14,35,23,36,31,39),
+(2,7,15,36,24,37,32,40),
+(2,7,16,37,24,39,33,41),
+(2,7,17,38,25,40,34,43),
+(2,7,18,39,25,41,35,44),
+(2,7,19,40,26,42,36,45),
+(2,7,20,41,26,43,37,46),
+(2,7,21,42,27,44,38,47),
+(2,7,22,43,27,45,39,49),
+(2,7,23,44,28,47,40,50),
+(2,7,24,45,28,48,41,51),
+(2,7,25,47,29,49,43,52),
+(2,7,26,48,30,50,44,54),
+(2,7,27,49,30,52,45,55),
+(2,7,28,50,31,53,46,56),
+(2,7,29,51,31,54,47,58),
+(2,7,30,52,32,55,48,59),
+(2,7,31,53,33,57,50,60),
+(2,7,32,54,33,58,51,62),
+(2,7,33,55,34,59,52,63),
+(2,7,34,57,34,61,53,65),
+(2,7,35,58,35,62,55,66),
+(2,7,36,59,36,63,56,67),
+(2,7,37,60,36,65,57,69),
+(2,7,38,61,37,66,58,70),
+(2,7,39,62,38,67,60,72),
+(2,7,40,64,38,69,61,73),
+(2,7,41,65,39,70,62,75),
+(2,7,42,66,40,72,64,76),
+(2,7,43,67,40,73,65,78),
+(2,7,44,69,41,74,66,79),
+(2,7,45,70,42,76,68,81),
+(2,7,46,71,42,77,69,82),
+(2,7,47,72,43,79,70,84),
+(2,7,48,74,44,80,72,85),
+(2,7,49,75,45,82,73,87),
+(2,7,50,76,45,83,75,89),
+(2,7,51,78,46,85,76,90),
+(2,7,52,79,47,86,77,92),
+(2,7,53,80,47,88,79,93),
+(2,7,54,82,48,90,80,95),
+(2,7,55,83,49,91,82,97),
+(2,7,56,85,50,93,83,98),
+(2,7,57,86,50,94,85,100),
+(2,7,58,87,51,96,86,102),
+(2,7,59,89,52,97,88,103),
+(2,7,60,90,53,99,89,105),
+(2,7,61,92,54,101,91,107),
+(2,7,62,93,54,102,92,109),
+(2,7,63,95,55,104,94,110),
+(2,7,64,96,56,106,95,112),
+(2,7,65,97,57,107,97,114),
+(2,7,66,99,58,109,99,116),
+(2,7,67,100,58,111,100,118),
+(2,7,68,102,59,113,102,119),
+(2,7,69,103,60,114,103,121),
+(2,7,70,105,61,116,105,123),
+(2,7,71,106,62,118,117,125),
+(2,7,72,108,63,120,119,128),
+(2,7,73,110,64,122,122,130),
+(2,7,74,112,65,125,124,132),
+(2,7,75,114,66,127,126,134),
+(2,7,76,116,67,129,128,137),
+(2,7,77,117,68,131,128,139),
+(2,7,78,119,69,133,133,141),
+(2,7,79,121,70,136,135,144),
+(2,7,80,123,71,138,137,146),
+(2,9,1,23,17,23,19,25),
+(2,9,2,23,17,24,20,26),
+(2,9,3,24,18,24,21,27),
+(2,9,4,24,18,25,23,28),
+(2,9,5,24,18,25,24,30),
+(2,9,6,24,19,26,25,31),
+(2,9,7,25,19,26,26,32),
+(2,9,8,25,20,27,27,33),
+(2,9,9,25,20,27,29,34),
+(2,9,10,26,20,28,30,36),
+(2,9,11,26,21,29,31,37),
+(2,9,12,26,21,29,33,38),
+(2,9,13,27,22,30,34,39),
+(2,9,14,27,22,31,35,41),
+(2,9,15,27,23,31,37,42),
+(2,9,16,28,23,32,38,43),
+(2,9,17,28,23,32,39,45),
+(2,9,18,28,24,33,41,46),
+(2,9,19,29,24,34,42,47),
+(2,9,20,29,25,34,43,49),
+(2,9,21,29,25,35,45,50),
+(2,9,22,30,26,36,46,51),
+(2,9,23,30,26,37,48,53),
+(2,9,24,30,27,37,49,54),
+(2,9,25,31,27,38,51,56),
+(2,9,26,31,28,39,52,57),
+(2,9,27,32,28,39,54,59),
+(2,9,28,32,29,40,55,60),
+(2,9,29,32,29,41,57,62),
+(2,9,30,33,30,42,58,63),
+(2,9,31,33,30,42,60,65),
+(2,9,32,34,31,43,61,66),
+(2,9,33,34,31,44,63,68),
+(2,9,34,35,32,45,64,69),
+(2,9,35,35,32,45,66,71),
+(2,9,36,36,33,46,68,72),
+(2,9,37,36,34,47,69,74),
+(2,9,38,36,34,48,71,76),
+(2,9,39,37,35,49,72,77),
+(2,9,40,37,35,50,74,79),
+(2,9,41,38,36,50,76,80),
+(2,9,42,38,36,51,77,82),
+(2,9,43,39,37,52,79,84),
+(2,9,44,39,38,53,81,85),
+(2,9,45,40,38,54,83,87),
+(2,9,46,40,39,55,84,89),
+(2,9,47,41,39,56,86,91),
+(2,9,48,41,40,56,88,92),
+(2,9,49,42,41,57,90,94),
+(2,9,50,42,41,58,91,96),
+(2,9,51,43,42,59,93,98),
+(2,9,52,43,43,60,95,99),
+(2,9,53,44,43,61,97,101),
+(2,9,54,45,44,62,99,103),
+(2,9,55,45,45,63,101,105),
+(2,9,56,46,45,64,102,107),
+(2,9,57,46,46,65,104,109),
+(2,9,58,47,47,66,106,110),
+(2,9,59,47,47,67,108,112),
+(2,9,60,48,48,68,110,114),
+(2,9,61,48,49,69,112,116),
+(2,9,62,49,49,70,114,118),
+(2,9,63,50,50,71,116,120),
+(2,9,64,50,51,72,118,122),
+(2,9,65,51,51,73,120,124),
+(2,9,66,52,52,74,122,126),
+(2,9,67,52,53,75,124,128),
+(2,9,68,53,54,76,126,130),
+(2,9,69,53,54,77,128,132),
+(2,9,70,54,55,78,130,134),
+(2,9,71,55,56,88,134,145),
+(2,9,72,56,56,89,135,147),
+(2,9,73,57,57,90,137,150),
+(2,9,74,57,58,91,142,153),
+(2,9,75,58,59,93,142,155),
+(2,9,76,59,60,94,145,158),
+(2,9,77,60,61,95,148,161),
+(2,9,78,60,62,97,150,164),
+(2,9,79,61,63,98,153,167),
+(2,9,80,62,64,99,156,169),
+(3,1,1,25,16,25,19,19),
+(3,1,2,26,17,26,19,19),
+(3,1,3,28,18,27,19,20),
+(3,1,4,29,18,28,19,20),
+(3,1,5,30,19,30,19,20),
+(3,1,6,31,20,31,19,20),
+(3,1,7,33,21,32,20,21),
+(3,1,8,34,22,33,20,21),
+(3,1,9,36,23,35,20,21),
+(3,1,10,37,23,36,20,22),
+(3,1,11,38,24,37,20,22),
+(3,1,12,40,25,38,20,22),
+(3,1,13,41,26,40,20,23),
+(3,1,14,43,27,41,20,23),
+(3,1,15,44,28,42,20,23),
+(3,1,16,46,29,44,21,24),
+(3,1,17,47,30,45,21,24),
+(3,1,18,49,31,46,21,24),
+(3,1,19,50,32,48,21,25),
+(3,1,20,52,33,49,21,25),
+(3,1,21,53,34,51,21,26),
+(3,1,22,55,34,52,21,26),
+(3,1,23,56,35,53,21,26),
+(3,1,24,58,36,55,22,27),
+(3,1,25,59,37,56,22,27),
+(3,1,26,61,38,58,22,27),
+(3,1,27,63,39,59,22,28),
+(3,1,28,64,41,61,22,28),
+(3,1,29,66,42,62,22,29),
+(3,1,30,68,43,64,23,29),
+(3,1,31,69,44,65,23,30),
+(3,1,32,71,45,67,23,30),
+(3,1,33,73,46,68,23,30),
+(3,1,34,75,47,70,23,31),
+(3,1,35,76,48,72,24,31),
+(3,1,36,78,49,73,24,32),
+(3,1,37,80,50,75,24,32),
+(3,1,38,82,51,76,24,33),
+(3,1,39,84,52,78,24,33),
+(3,1,40,85,54,80,24,34),
+(3,1,41,87,55,81,25,34),
+(3,1,42,89,56,83,25,35),
+(3,1,43,91,57,85,25,35),
+(3,1,44,93,58,87,25,36),
+(3,1,45,95,59,88,26,36),
+(3,1,46,97,61,90,26,37),
+(3,1,47,99,62,92,26,37),
+(3,1,48,101,63,94,26,38),
+(3,1,49,102,64,95,26,38),
+(3,1,50,104,65,97,27,39),
+(3,1,51,106,67,99,27,39),
+(3,1,52,108,68,101,27,40),
+(3,1,53,110,69,103,27,40),
+(3,1,54,112,70,104,28,41),
+(3,1,55,115,72,106,28,41),
+(3,1,56,117,73,108,28,42),
+(3,1,57,119,74,110,28,42),
+(3,1,58,121,76,112,29,43),
+(3,1,59,123,77,114,29,43),
+(3,1,60,125,78,116,29,44),
+(3,1,61,127,80,118,29,45),
+(3,1,62,129,81,120,30,45),
+(3,1,63,131,82,122,30,46),
+(3,1,64,134,84,124,30,46),
+(3,1,65,136,85,126,31,47),
+(3,1,66,138,86,128,31,48),
+(3,1,67,140,88,130,31,48),
+(3,1,68,142,89,132,31,49),
+(3,1,69,145,91,134,32,49),
+(3,1,70,147,92,136,32,50),
+(3,1,71,150,93,138,32,51),
+(3,1,72,152,95,141,32,52),
+(3,1,73,164,97,151,32,53),
+(3,1,74,164,98,151,33,53),
+(3,1,75,170,100,156,33,54),
+(3,1,76,173,102,160,33,55),
+(3,1,77,173,104,160,34,56),
+(3,1,78,176,105,162,34,56),
+(3,1,79,183,107,168,34,57),
+(3,1,80,186,109,171,35,58),
+(3,2,1,24,16,25,19,20),
+(3,2,2,25,17,26,20,21),
+(3,2,3,26,17,27,20,21),
+(3,2,4,27,18,28,21,22),
+(3,2,5,28,18,29,22,23),
+(3,2,6,29,19,30,22,24),
+(3,2,7,31,20,31,23,24),
+(3,2,8,32,20,32,24,25),
+(3,2,9,33,21,33,24,26),
+(3,2,10,34,21,34,25,26),
+(3,2,11,35,22,36,26,27),
+(3,2,12,36,23,37,26,28),
+(3,2,13,38,23,38,27,29),
+(3,2,14,39,24,39,28,30),
+(3,2,15,40,25,40,29,30),
+(3,2,16,41,25,41,29,31),
+(3,2,17,43,26,43,30,32),
+(3,2,18,44,27,44,31,33),
+(3,2,19,45,28,45,32,34),
+(3,2,20,47,28,46,32,35),
+(3,2,21,48,29,47,33,35),
+(3,2,22,49,30,49,34,36),
+(3,2,23,51,30,50,35,37),
+(3,2,24,52,31,51,36,38),
+(3,2,25,53,32,52,36,39),
+(3,2,26,55,33,54,37,40),
+(3,2,27,56,33,55,38,41),
+(3,2,28,57,34,56,39,42),
+(3,2,29,59,35,58,40,43),
+(3,2,30,60,36,59,41,43),
+(3,2,31,62,37,60,42,44),
+(3,2,32,63,37,62,42,45),
+(3,2,33,65,38,63,43,46),
+(3,2,34,66,39,65,44,47),
+(3,2,35,68,40,66,45,48),
+(3,2,36,69,41,67,46,49),
+(3,2,37,71,41,69,47,50),
+(3,2,38,72,42,70,48,51),
+(3,2,39,74,43,72,49,52),
+(3,2,40,75,44,73,50,53),
+(3,2,41,77,45,75,51,54),
+(3,2,42,78,46,76,52,55),
+(3,2,43,80,47,78,53,56),
+(3,2,44,82,47,79,54,57),
+(3,2,45,83,48,81,55,59),
+(3,2,46,85,49,82,56,60),
+(3,2,47,87,50,84,57,61),
+(3,2,48,88,51,85,58,62),
+(3,2,49,90,52,87,59,63),
+(3,2,50,92,53,89,60,64),
+(3,2,51,93,54,90,61,65),
+(3,2,52,95,55,92,62,66),
+(3,2,53,97,56,93,63,67),
+(3,2,54,98,57,95,64,69),
+(3,2,55,100,58,97,65,70),
+(3,2,56,102,59,98,66,71),
+(3,2,57,104,60,100,67,72),
+(3,2,58,106,61,102,68,73),
+(3,2,59,107,62,103,69,74),
+(3,2,60,109,63,105,70,76),
+(3,2,61,111,64,107,72,77),
+(3,2,62,113,65,109,73,78),
+(3,2,63,115,66,110,74,79),
+(3,2,64,117,67,112,75,80),
+(3,2,65,118,68,114,76,82),
+(3,2,66,120,69,116,77,83),
+(3,2,67,122,70,118,78,84),
+(3,2,68,124,71,119,80,85),
+(3,2,69,126,72,121,81,87),
+(3,2,70,128,73,123,82,88),
+(3,2,71,150,74,125,83,89),
+(3,2,72,152,75,128,85,91),
+(3,2,73,156,76,130,86,93),
+(3,2,74,158,78,132,88,94),
+(3,2,75,161,79,134,89,96),
+(3,2,76,164,80,137,91,97),
+(3,2,77,166,82,139,92,99),
+(3,2,78,170,83,141,94,101),
+(3,2,79,172,84,144,95,102),
+(3,2,80,175,86,146,97,104),
+(3,3,1,22,19,24,19,20),
+(3,3,2,22,20,25,20,21),
+(3,3,3,23,22,26,20,21),
+(3,3,4,23,23,27,21,22),
+(3,3,5,24,25,28,21,23),
+(3,3,6,24,26,29,22,23),
+(3,3,7,25,27,29,23,24),
+(3,3,8,25,29,30,23,25),
+(3,3,9,25,30,31,24,25),
+(3,3,10,26,32,32,24,26),
+(3,3,11,26,33,33,25,27),
+(3,3,12,27,35,34,26,27),
+(3,3,13,27,36,35,26,28),
+(3,3,14,28,38,36,27,29),
+(3,3,15,28,39,37,28,29),
+(3,3,16,29,41,38,28,30),
+(3,3,17,29,42,39,29,31),
+(3,3,18,30,44,41,30,32),
+(3,3,19,30,46,42,30,32),
+(3,3,20,31,47,43,31,33),
+(3,3,21,32,49,44,32,34),
+(3,3,22,32,51,45,33,35),
+(3,3,23,33,52,46,33,36),
+(3,3,24,33,54,47,34,36),
+(3,3,25,34,56,48,35,37),
+(3,3,26,34,57,49,35,38),
+(3,3,27,35,59,51,36,39),
+(3,3,28,35,61,52,37,40),
+(3,3,29,36,63,53,38,40),
+(3,3,30,37,64,54,39,41),
+(3,3,31,37,66,55,39,42),
+(3,3,32,38,68,57,40,43),
+(3,3,33,38,70,58,41,44),
+(3,3,34,39,71,59,42,45),
+(3,3,35,40,73,60,43,46),
+(3,3,36,40,75,62,43,47),
+(3,3,37,41,77,63,44,47),
+(3,3,38,42,79,64,45,48),
+(3,3,39,42,81,65,46,49),
+(3,3,40,43,83,67,47,50),
+(3,3,41,44,85,68,48,51),
+(3,3,42,44,87,69,49,52),
+(3,3,43,45,89,71,49,53),
+(3,3,44,46,91,72,50,54),
+(3,3,45,46,93,73,51,55),
+(3,3,46,47,95,75,52,56),
+(3,3,47,48,97,76,53,57),
+(3,3,48,49,99,78,54,58),
+(3,3,49,49,101,79,55,59),
+(3,3,50,50,103,80,56,60),
+(3,3,51,51,105,82,57,61),
+(3,3,52,51,107,83,58,62),
+(3,3,53,52,109,85,59,63),
+(3,3,54,53,111,86,60,64),
+(3,3,55,54,113,88,61,65),
+(3,3,56,55,115,89,62,66),
+(3,3,57,55,118,91,62,67),
+(3,3,58,56,120,92,63,68),
+(3,3,59,57,122,94,64,70),
+(3,3,60,58,124,95,65,71),
+(3,3,61,58,126,97,67,72),
+(3,3,62,59,129,98,68,73),
+(3,3,63,60,131,100,69,74),
+(3,3,64,61,133,101,70,75),
+(3,3,65,62,135,103,71,76),
+(3,3,66,63,138,105,72,77),
+(3,3,67,63,140,106,73,78),
+(3,3,68,64,142,108,74,80),
+(3,3,69,65,145,109,75,81),
+(3,3,70,66,147,111,76,82),
+(3,3,71,67,150,113,77,83),
+(3,3,72,68,153,115,78,84),
+(3,3,73,69,156,117,79,86),
+(3,3,74,70,159,119,81,87),
+(3,3,75,71,162,121,82,89),
+(3,3,76,72,165,123,83,90),
+(3,3,77,73,168,125,85,92),
+(3,3,78,74,171,127,86,93),
+(3,3,79,75,174,129,87,95),
+(3,3,80,76,177,131,89,96),
+(3,4,1,23,19,24,19,19),
+(3,4,2,24,20,25,19,19),
+(3,4,3,24,22,25,19,20),
+(3,4,4,25,23,26,19,20),
+(3,4,5,26,25,27,20,20),
+(3,4,6,27,26,27,20,21),
+(3,4,7,28,28,28,20,21),
+(3,4,8,28,29,29,20,22),
+(3,4,9,29,31,30,20,22),
+(3,4,10,30,32,30,20,22),
+(3,4,11,31,34,31,21,23),
+(3,4,12,32,36,32,21,23),
+(3,4,13,33,37,33,21,24),
+(3,4,14,33,39,33,21,24),
+(3,4,15,34,40,34,21,25),
+(3,4,16,35,42,35,22,25),
+(3,4,17,36,44,36,22,25),
+(3,4,18,37,45,37,22,26),
+(3,4,19,38,47,38,22,26),
+(3,4,20,39,49,38,22,27),
+(3,4,21,40,51,39,23,27),
+(3,4,22,41,52,40,23,28),
+(3,4,23,42,54,41,23,28),
+(3,4,24,43,56,42,23,29),
+(3,4,25,44,58,43,24,29),
+(3,4,26,44,59,44,24,30),
+(3,4,27,45,61,44,24,30),
+(3,4,28,46,63,45,24,31),
+(3,4,29,47,65,46,25,31),
+(3,4,30,48,67,47,25,32),
+(3,4,31,49,69,48,25,32),
+(3,4,32,51,71,49,25,33),
+(3,4,33,52,72,50,26,33),
+(3,4,34,53,74,51,26,34),
+(3,4,35,54,76,52,26,34),
+(3,4,36,55,78,53,26,35),
+(3,4,37,56,80,54,27,35),
+(3,4,38,57,82,55,27,36),
+(3,4,39,58,84,56,27,37),
+(3,4,40,59,86,57,28,37),
+(3,4,41,60,88,58,28,38),
+(3,4,42,61,90,59,28,38),
+(3,4,43,63,92,60,28,39),
+(3,4,44,64,95,61,29,39),
+(3,4,45,65,97,62,29,40),
+(3,4,46,66,99,63,29,41),
+(3,4,47,67,101,64,30,41),
+(3,4,48,68,103,66,30,42),
+(3,4,49,70,105,67,30,43),
+(3,4,50,71,107,68,31,43),
+(3,4,51,72,110,69,31,44),
+(3,4,52,73,112,70,31,44),
+(3,4,53,74,114,71,32,45),
+(3,4,54,76,116,72,32,46),
+(3,4,55,77,118,73,32,46),
+(3,4,56,78,121,75,33,47),
+(3,4,57,80,123,76,33,48),
+(3,4,58,81,125,77,33,48),
+(3,4,59,82,128,78,34,49),
+(3,4,60,83,130,79,34,50),
+(3,4,61,85,132,81,34,51),
+(3,4,62,86,135,82,35,51),
+(3,4,63,87,137,83,35,52),
+(3,4,64,89,139,84,36,53),
+(3,4,65,90,142,86,36,53),
+(3,4,66,91,144,87,36,54),
+(3,4,67,93,147,88,37,55),
+(3,4,68,94,149,89,37,56),
+(3,4,69,96,152,91,38,56),
+(3,4,70,97,154,92,38,57),
+(3,4,71,99,157,93,38,58),
+(3,4,72,101,160,96,39,58),
+(3,4,73,102,163,97,39,59),
+(3,4,74,104,166,98,40,60),
+(3,4,75,106,169,100,40,61),
+(3,4,76,107,172,101,40,62),
+(3,4,77,109,175,103,41,63),
+(3,4,78,111,179,105,41,64),
+(3,4,79,113,182,106,42,65),
+(3,4,80,115,185,108,42,66),
+(3,5,1,22,16,23,21,22),
+(3,5,2,22,16,23,22,23),
+(3,5,3,22,16,24,24,25),
+(3,5,4,22,17,24,25,26),
+(3,5,5,23,17,24,26,27),
+(3,5,6,23,17,25,28,29),
+(3,5,7,23,17,25,29,30),
+(3,5,8,23,18,26,30,32),
+(3,5,9,23,18,26,32,33),
+(3,5,10,23,18,26,33,35),
+(3,5,11,24,18,27,35,36),
+(3,5,12,24,19,27,36,38),
+(3,5,13,24,19,28,37,39),
+(3,5,14,24,19,28,39,41),
+(3,5,15,24,19,28,40,42),
+(3,5,16,24,20,29,42,44),
+(3,5,17,25,20,29,43,45),
+(3,5,18,25,20,30,45,47),
+(3,5,19,25,21,30,46,49),
+(3,5,20,25,21,31,48,50),
+(3,5,21,25,21,31,50,52),
+(3,5,22,26,22,31,51,53),
+(3,5,23,26,22,32,53,55),
+(3,5,24,26,22,32,54,57),
+(3,5,25,26,22,33,56,58),
+(3,5,26,27,23,33,58,60),
+(3,5,27,27,23,34,59,62),
+(3,5,28,27,23,34,61,64),
+(3,5,29,27,24,35,63,65),
+(3,5,30,28,24,35,64,67),
+(3,5,31,28,24,36,66,69),
+(3,5,32,28,25,36,68,71),
+(3,5,33,28,25,37,70,72),
+(3,5,34,29,26,38,71,74),
+(3,5,35,29,26,38,73,76),
+(3,5,36,29,26,39,75,78),
+(3,5,37,29,27,39,77,80),
+(3,5,38,30,27,40,78,82),
+(3,5,39,30,27,40,80,84),
+(3,5,40,30,28,41,82,86),
+(3,5,41,31,28,41,84,88),
+(3,5,42,31,29,42,86,89),
+(3,5,43,31,29,43,88,91),
+(3,5,44,32,29,43,90,93),
+(3,5,45,32,30,44,92,95),
+(3,5,46,32,30,44,93,97),
+(3,5,47,32,30,45,95,99),
+(3,5,48,33,31,46,97,101),
+(3,5,49,33,31,46,99,103),
+(3,5,50,33,32,47,101,106),
+(3,5,51,34,32,48,103,108),
+(3,5,52,34,33,48,105,110),
+(3,5,53,35,33,49,107,112),
+(3,5,54,35,33,50,109,114),
+(3,5,55,35,34,50,111,116),
+(3,5,56,36,34,51,113,118),
+(3,5,57,36,35,52,116,120),
+(3,5,58,36,35,52,118,123),
+(3,5,59,37,36,53,120,125),
+(3,5,60,37,36,54,122,127),
+(3,5,61,37,37,54,124,129),
+(3,5,62,38,37,55,126,131),
+(3,5,63,38,38,56,128,134),
+(3,5,64,39,38,57,131,136),
+(3,5,65,39,39,57,133,138),
+(3,5,66,39,39,58,135,141),
+(3,5,67,40,40,59,137,143),
+(3,5,68,40,40,59,139,145),
+(3,5,69,41,40,60,142,148),
+(3,5,70,41,41,61,144,150),
+(3,5,71,41,42,62,147,153),
+(3,5,72,42,42,62,150,163),
+(3,5,73,42,43,63,153,166),
+(3,5,74,43,43,64,155,170),
+(3,5,75,43,44,65,158,173),
+(3,5,76,43,45,66,161,176),
+(3,5,77,44,45,67,164,179),
+(3,5,78,44,46,68,167,182),
+(3,5,79,45,46,69,170,184),
+(3,5,80,45,47,70,173,189),
+(3,6,1,25,16,25,19,19),
+(3,6,2,26,17,26,19,19),
+(3,6,3,28,18,27,19,20),
+(3,6,4,29,18,28,19,20),
+(3,6,5,30,19,30,19,20),
+(3,6,6,31,20,31,19,20),
+(3,6,7,33,21,32,20,21),
+(3,6,8,34,22,33,20,21),
+(3,6,9,36,23,35,20,21),
+(3,6,10,37,23,36,20,22),
+(3,6,11,38,24,37,20,22),
+(3,6,12,40,25,38,20,22),
+(3,6,13,41,26,40,20,23),
+(3,6,14,43,27,41,20,23),
+(3,6,15,44,28,42,20,23),
+(3,6,16,46,29,44,21,24),
+(3,6,17,47,30,45,21,24),
+(3,6,18,49,31,46,21,24),
+(3,6,19,50,32,48,21,25),
+(3,6,20,52,33,49,21,25),
+(3,6,21,53,34,51,21,26),
+(3,6,22,55,34,52,21,26),
+(3,6,23,56,35,53,21,26),
+(3,6,24,58,36,55,22,27),
+(3,6,25,59,37,56,22,27),
+(3,6,26,61,38,58,22,27),
+(3,6,27,63,39,59,22,28),
+(3,6,28,64,41,61,22,28),
+(3,6,29,66,42,62,22,29),
+(3,6,30,68,43,64,23,29),
+(3,6,31,69,44,65,23,30),
+(3,6,32,71,45,67,23,30),
+(3,6,33,73,46,68,23,30),
+(3,6,34,75,47,70,23,31),
+(3,6,35,76,48,72,24,31),
+(3,6,36,78,49,73,24,32),
+(3,6,37,80,50,75,24,32),
+(3,6,38,82,51,76,24,33),
+(3,6,39,84,52,78,24,33),
+(3,6,40,85,54,80,24,34),
+(3,6,41,87,55,81,25,34),
+(3,6,42,89,56,83,25,35),
+(3,6,43,91,57,85,25,35),
+(3,6,44,93,58,87,25,36),
+(3,6,45,95,59,88,26,36),
+(3,6,46,97,61,90,26,37),
+(3,6,47,99,62,92,26,37),
+(3,6,48,101,63,94,26,38),
+(3,6,49,102,64,95,26,38),
+(3,6,50,104,65,97,27,39),
+(3,6,51,106,67,99,27,39),
+(3,6,52,108,68,99,27,40),
+(3,6,53,109,68,101,27,40),
+(3,6,54,110,69,101,28,41),
+(3,6,55,110,69,102,28,41),
+(3,6,56,113,71,105,28,42),
+(3,6,57,118,72,107,28,42),
+(3,6,58,120,73,109,29,43),
+(3,6,59,123,75,111,29,43),
+(3,6,60,125,76,113,29,44),
+(3,6,61,126,77,115,29,45),
+(3,6,62,127,79,117,29,45),
+(3,6,63,129,80,120,30,46),
+(3,6,64,132,82,122,30,46),
+(3,6,65,135,83,124,30,47),
+(3,6,66,137,85,127,30,48),
+(3,6,67,144,86,129,31,48),
+(3,6,68,146,88,131,31,49),
+(3,6,69,149,89,133,31,50),
+(3,6,70,152,91,136,31,50),
+(3,6,71,154,93,139,32,51),
+(3,6,72,157,94,141,32,52),
+(3,6,73,160,96,144,32,53),
+(3,6,74,163,98,146,32,53),
+(3,6,75,166,99,150,33,54),
+(3,6,76,169,101,152,33,55),
+(3,6,77,172,103,155,33,56),
+(3,6,78,176,104,157,33,56),
+(3,6,79,179,106,160,34,57),
+(3,6,80,182,108,163,34,58),
+(4,1,1,20,25,21,20,20),
+(4,1,2,21,26,22,20,20),
+(4,1,3,23,27,23,20,21),
+(4,1,4,24,27,25,20,21),
+(4,1,5,25,28,26,20,21),
+(4,1,6,27,29,27,20,21),
+(4,1,7,28,30,28,21,22),
+(4,1,8,29,31,29,21,22),
+(4,1,9,31,31,31,21,22),
+(4,1,10,32,32,32,21,23),
+(4,1,11,33,33,33,21,23),
+(4,1,12,35,34,34,21,23),
+(4,1,13,36,35,36,21,24),
+(4,1,14,38,36,37,21,24),
+(4,1,15,39,37,38,21,24),
+(4,1,16,41,37,40,21,25),
+(4,1,17,42,38,41,22,25),
+(4,1,18,44,39,43,22,25),
+(4,1,19,45,40,44,22,26),
+(4,1,20,47,41,45,22,26),
+(4,1,21,48,42,47,22,26),
+(4,1,22,50,43,48,22,27),
+(4,1,23,52,44,50,22,27),
+(4,1,24,53,45,51,23,28),
+(4,1,25,55,46,52,23,28),
+(4,1,26,56,47,54,23,28),
+(4,1,27,58,48,55,23,29),
+(4,1,28,60,49,57,23,29),
+(4,1,29,61,50,58,23,30),
+(4,1,30,63,51,60,24,30),
+(4,1,31,65,52,62,24,30),
+(4,1,32,66,53,63,24,31),
+(4,1,33,68,54,65,24,31),
+(4,1,34,70,55,66,24,32),
+(4,1,35,72,56,68,24,32),
+(4,1,36,73,58,69,25,33),
+(4,1,37,75,59,71,25,33),
+(4,1,38,77,60,73,25,34),
+(4,1,39,79,61,74,25,34),
+(4,1,40,81,62,76,25,35),
+(4,1,41,82,63,78,26,35),
+(4,1,42,84,64,79,26,35),
+(4,1,43,86,66,81,26,36),
+(4,1,44,88,67,83,26,36),
+(4,1,45,90,68,85,26,37),
+(4,1,46,92,69,86,27,37),
+(4,1,47,94,70,88,27,38),
+(4,1,48,96,72,90,27,38),
+(4,1,49,98,73,92,27,39),
+(4,1,50,100,74,93,28,40),
+(4,1,51,102,75,95,28,40),
+(4,1,52,104,77,97,28,41),
+(4,1,53,106,78,99,28,41),
+(4,1,54,108,79,101,29,42),
+(4,1,55,110,80,103,29,42),
+(4,1,56,112,82,104,29,43),
+(4,1,57,114,83,106,29,43),
+(4,1,58,116,84,108,30,44),
+(4,1,59,118,86,110,30,44),
+(4,1,60,120,87,112,30,45),
+(4,1,61,122,88,114,30,46),
+(4,1,62,124,90,116,31,46),
+(4,1,63,127,91,118,31,47),
+(4,1,64,129,92,120,31,47),
+(4,1,65,131,94,122,32,48),
+(4,1,66,133,95,124,32,49),
+(4,1,67,135,97,126,32,49),
+(4,1,68,138,98,128,32,50),
+(4,1,69,140,100,130,33,50),
+(4,1,70,142,101,132,33,51),
+(4,1,71,145,102,134,33,52),
+(4,1,72,147,104,137,33,53),
+(4,1,73,150,106,139,33,54),
+(4,1,74,153,107,142,34,54),
+(4,1,75,156,109,144,34,55),
+(4,1,76,159,111,148,34,56),
+(4,1,77,162,113,150,35,57),
+(4,1,78,165,114,152,35,57),
+(4,1,79,178,116,164,35,58),
+(4,1,80,181,118,167,36,59),
+(4,3,1,17,28,20,20,21),
+(4,3,2,17,29,21,21,22),
+(4,3,3,18,31,22,21,22),
+(4,3,4,18,32,23,22,23),
+(4,3,5,19,33,24,22,24),
+(4,3,6,19,35,25,23,24),
+(4,3,7,20,36,26,24,25),
+(4,3,8,20,38,27,24,25),
+(4,3,9,21,39,27,25,26),
+(4,3,10,21,40,28,25,27),
+(4,3,11,22,42,29,26,28),
+(4,3,12,22,43,30,27,28),
+(4,3,13,23,45,31,27,29),
+(4,3,14,23,46,32,28,30),
+(4,3,15,24,48,34,29,30),
+(4,3,16,24,50,35,29,31),
+(4,3,17,25,51,36,30,32),
+(4,3,18,25,53,37,31,33),
+(4,3,19,26,54,38,31,33),
+(4,3,20,26,56,39,32,34),
+(4,3,21,27,57,40,33,35),
+(4,3,22,27,59,41,33,36),
+(4,3,23,28,61,42,34,36),
+(4,3,24,28,62,43,35,37),
+(4,3,25,29,64,44,36,38),
+(4,3,26,30,66,46,36,39),
+(4,3,27,30,68,47,37,40),
+(4,3,28,31,69,48,38,41),
+(4,3,29,31,71,49,39,41),
+(4,3,30,32,73,50,39,42),
+(4,3,31,33,75,52,40,43),
+(4,3,32,33,76,53,41,44),
+(4,3,33,34,78,54,42,45),
+(4,3,34,34,80,55,43,46),
+(4,3,35,35,82,57,44,47),
+(4,3,36,36,84,58,44,48),
+(4,3,37,36,86,59,45,48),
+(4,3,38,37,87,60,46,49),
+(4,3,39,38,89,62,47,50),
+(4,3,40,38,91,63,48,51),
+(4,3,41,39,93,64,49,52),
+(4,3,42,40,95,66,49,53),
+(4,3,43,40,97,67,50,54),
+(4,3,44,41,99,68,51,55),
+(4,3,45,42,101,70,52,56),
+(4,3,46,42,103,71,53,57),
+(4,3,47,43,105,72,54,58),
+(4,3,48,44,107,74,55,59),
+(4,3,49,45,109,75,56,60),
+(4,3,50,45,111,77,57,61),
+(4,3,51,46,113,78,58,62),
+(4,3,52,47,115,79,59,63),
+(4,3,53,47,118,81,60,64),
+(4,3,54,48,120,82,61,65),
+(4,3,55,49,122,84,61,66),
+(4,3,56,50,124,85,62,67),
+(4,3,57,50,126,87,63,68),
+(4,3,58,51,128,88,64,69),
+(4,3,59,52,131,90,65,70),
+(4,3,60,53,133,91,66,72),
+(4,3,61,54,135,93,67,73),
+(4,3,62,54,137,94,69,74),
+(4,3,63,55,140,96,70,75),
+(4,3,64,56,142,97,71,76),
+(4,3,65,57,144,99,72,77),
+(4,3,66,58,147,101,73,78),
+(4,3,67,58,149,102,74,79),
+(4,3,68,59,151,104,75,81),
+(4,3,69,60,154,105,76,82),
+(4,3,70,61,156,107,77,83),
+(4,3,71,62,159,109,78,84),
+(4,3,72,63,162,111,79,85),
+(4,3,73,64,165,113,80,87),
+(4,3,74,65,168,115,82,88),
+(4,3,75,66,171,117,83,90),
+(4,3,76,67,174,119,84,91),
+(4,3,77,68,177,121,86,93),
+(4,3,78,69,180,123,87,94),
+(4,3,79,70,190,125,91,96),
+(4,3,80,71,193,127,93,97),
+(4,4,1,18,28,20,20,20),
+(4,4,2,19,29,21,20,20),
+(4,4,3,20,31,21,20,21),
+(4,4,4,20,32,22,20,21),
+(4,4,5,21,34,23,21,21),
+(4,4,6,22,35,24,21,22),
+(4,4,7,23,37,24,21,22),
+(4,4,8,24,38,25,21,23),
+(4,4,9,24,40,26,21,23),
+(4,4,10,25,41,26,21,23),
+(4,4,11,26,43,27,22,24),
+(4,4,12,27,44,28,22,24),
+(4,4,13,28,46,29,22,25),
+(4,4,14,29,48,30,22,25),
+(4,4,15,29,49,30,22,25),
+(4,4,16,30,51,31,23,26),
+(4,4,17,31,52,32,23,26),
+(4,4,18,32,54,33,23,27),
+(4,4,19,33,56,34,23,27),
+(4,4,20,34,57,35,23,28),
+(4,4,21,35,59,35,24,28),
+(4,4,22,36,61,36,24,29),
+(4,4,23,37,63,37,24,29),
+(4,4,24,38,64,38,24,30),
+(4,4,25,39,66,39,25,30),
+(4,4,26,40,68,40,25,31),
+(4,4,27,41,70,41,25,31),
+(4,4,28,42,72,42,25,32),
+(4,4,29,43,73,43,25,32),
+(4,4,30,44,75,43,26,33),
+(4,4,31,45,77,44,26,33),
+(4,4,32,46,79,45,26,34),
+(4,4,33,47,81,46,27,34),
+(4,4,34,48,83,47,27,35),
+(4,4,35,49,85,48,27,35),
+(4,4,36,50,87,49,27,36),
+(4,4,37,51,89,50,28,36),
+(4,4,38,52,91,51,28,37),
+(4,4,39,53,93,52,28,38),
+(4,4,40,54,95,53,28,38),
+(4,4,41,56,97,54,29,39),
+(4,4,42,57,99,55,29,39),
+(4,4,43,58,101,56,29,40),
+(4,4,44,59,103,57,30,40),
+(4,4,45,60,105,59,30,41),
+(4,4,46,61,107,60,30,42),
+(4,4,47,62,109,61,31,42),
+(4,4,48,64,112,62,31,43),
+(4,4,49,65,114,63,31,44),
+(4,4,50,66,116,64,32,44),
+(4,4,51,67,118,65,32,45),
+(4,4,52,68,120,66,32,45),
+(4,4,53,70,123,67,33,46),
+(4,4,54,71,125,69,33,47),
+(4,4,55,72,127,70,33,47),
+(4,4,56,73,129,71,34,48),
+(4,4,57,75,132,72,34,49),
+(4,4,58,76,134,73,34,49),
+(4,4,59,77,136,74,35,50),
+(4,4,60,79,139,76,35,51),
+(4,4,61,80,141,77,35,51),
+(4,4,62,81,143,78,36,52),
+(4,4,63,82,146,79,36,53),
+(4,4,64,84,148,80,37,54),
+(4,4,65,85,151,82,37,54),
+(4,4,66,87,153,83,37,55),
+(4,4,67,88,156,84,38,56),
+(4,4,68,89,158,85,38,57),
+(4,4,69,91,160,87,39,57),
+(4,4,70,92,163,88,39,58),
+(4,4,71,94,166,90,39,59),
+(4,4,72,96,169,91,40,59),
+(4,4,73,97,172,93,40,60),
+(4,4,74,99,175,94,41,61),
+(4,4,75,101,178,96,41,62),
+(4,4,76,102,181,97,41,63),
+(4,4,77,104,184,99,42,64),
+(4,4,78,106,188,101,42,65),
+(4,4,79,108,191,102,43,66),
+(4,4,80,110,194,104,43,67),
+(4,5,1,17,25,19,22,23),
+(4,5,2,17,25,19,23,24),
+(4,5,3,17,25,20,25,26),
+(4,5,4,17,26,20,26,27),
+(4,5,5,18,26,20,27,28),
+(4,5,6,18,26,21,29,30),
+(4,5,7,18,26,21,30,31),
+(4,5,8,18,26,22,31,33),
+(4,5,9,18,27,22,33,34),
+(4,5,10,19,27,22,34,36),
+(4,5,11,19,27,23,36,37),
+(4,5,12,19,27,23,37,39),
+(4,5,13,19,28,24,38,40),
+(4,5,14,19,28,24,40,42),
+(4,5,15,19,28,25,41,43),
+(4,5,16,20,28,25,43,45),
+(4,5,17,20,29,25,44,46),
+(4,5,18,20,29,26,46,48),
+(4,5,19,20,29,26,47,49),
+(4,5,20,21,30,27,49,51),
+(4,5,21,21,30,27,51,53),
+(4,5,22,21,30,28,52,54),
+(4,5,23,21,30,28,54,56),
+(4,5,24,21,31,29,55,58),
+(4,5,25,22,31,29,57,59),
+(4,5,26,22,31,30,59,61),
+(4,5,27,22,32,30,60,63),
+(4,5,28,22,32,31,62,65),
+(4,5,29,23,32,31,64,66),
+(4,5,30,23,33,32,65,68),
+(4,5,31,23,33,32,67,70),
+(4,5,32,23,33,33,69,72),
+(4,5,33,24,34,33,70,73),
+(4,5,34,24,34,34,72,75),
+(4,5,35,24,34,34,74,77),
+(4,5,36,24,35,35,76,79),
+(4,5,37,25,35,35,78,81),
+(4,5,38,25,35,36,79,83),
+(4,5,39,25,36,37,81,85),
+(4,5,40,26,36,37,83,87),
+(4,5,41,26,37,38,85,88),
+(4,5,42,26,37,38,87,90),
+(4,5,43,27,37,39,89,92),
+(4,5,44,27,38,39,91,94),
+(4,5,45,27,38,40,92,96),
+(4,5,46,27,39,41,94,98),
+(4,5,47,28,39,41,96,100),
+(4,5,48,28,39,42,98,102),
+(4,5,49,28,40,43,100,104),
+(4,5,50,29,40,43,102,106),
+(4,5,51,29,41,44,104,109),
+(4,5,52,29,41,44,106,111),
+(4,5,53,30,42,45,108,113),
+(4,5,54,30,42,46,110,115),
+(4,5,55,30,43,46,112,117),
+(4,5,56,31,43,47,114,119),
+(4,5,57,31,43,48,117,121),
+(4,5,58,31,44,48,119,124),
+(4,5,59,32,44,49,121,126),
+(4,5,60,32,45,50,123,128),
+(4,5,61,33,45,51,125,130),
+(4,5,62,33,46,51,127,132),
+(4,5,63,33,46,52,129,135),
+(4,5,64,34,47,53,132,137),
+(4,5,65,34,47,53,134,139),
+(4,5,66,34,48,54,136,142),
+(4,5,67,35,48,55,138,144),
+(4,5,68,35,49,56,140,146),
+(4,5,69,36,49,56,143,149),
+(4,5,70,36,50,57,145,151),
+(4,5,71,36,51,58,148,161),
+(4,5,72,37,51,58,151,164),
+(4,5,73,37,52,59,154,168),
+(4,5,74,38,52,60,156,171),
+(4,5,75,38,53,61,159,174),
+(4,5,76,38,54,62,162,177),
+(4,5,77,39,54,63,165,180),
+(4,5,78,39,55,64,168,183),
+(4,5,79,40,55,65,171,186),
+(4,5,80,40,56,66,200,191),
+(4,6,1,20,25,21,20,20),
+(4,6,2,21,26,22,20,20),
+(4,6,3,23,27,23,20,21),
+(4,6,4,24,27,25,20,21),
+(4,6,5,25,28,26,20,21),
+(4,6,6,27,29,27,20,21),
+(4,6,7,28,30,28,21,22),
+(4,6,8,29,31,29,21,22),
+(4,6,9,31,31,31,21,22),
+(4,6,10,32,32,32,21,23),
+(4,6,11,33,33,33,21,23),
+(4,6,12,35,34,34,21,23),
+(4,6,13,36,35,36,21,24),
+(4,6,14,38,36,37,21,24),
+(4,6,15,39,37,38,21,24),
+(4,6,16,41,37,40,21,25),
+(4,6,17,42,38,41,22,25),
+(4,6,18,44,39,43,22,25),
+(4,6,19,45,40,44,22,26),
+(4,6,20,47,41,45,22,26),
+(4,6,21,48,42,47,22,26),
+(4,6,22,50,43,48,22,27),
+(4,6,23,52,44,50,22,27),
+(4,6,24,53,45,51,23,28),
+(4,6,25,55,46,52,23,28),
+(4,6,26,56,47,54,23,28),
+(4,6,27,58,48,55,23,29),
+(4,6,28,60,49,57,23,29),
+(4,6,29,61,50,58,23,30),
+(4,6,30,63,51,60,24,30),
+(4,6,31,65,52,62,24,30),
+(4,6,32,66,53,63,24,31),
+(4,6,33,68,54,65,24,31),
+(4,6,34,70,55,66,24,32),
+(4,6,35,72,56,68,24,32),
+(4,6,36,73,58,69,25,33),
+(4,6,37,75,59,71,25,33),
+(4,6,38,77,60,73,25,34),
+(4,6,39,79,61,74,25,34),
+(4,6,40,81,62,76,25,35),
+(4,6,41,82,63,78,26,35),
+(4,6,42,84,64,79,26,35),
+(4,6,43,86,66,81,26,36),
+(4,6,44,88,67,83,26,36),
+(4,6,45,90,68,85,26,37),
+(4,6,46,92,69,86,27,37),
+(4,6,47,94,70,88,27,38),
+(4,6,48,96,72,90,27,38),
+(4,6,49,98,73,92,27,39),
+(4,6,50,100,74,93,28,40),
+(4,6,51,101,75,94,28,40),
+(4,6,52,102,76,95,28,41),
+(4,6,53,103,77,96,28,41),
+(4,6,54,104,77,97,29,42),
+(4,6,55,105,78,98,29,42),
+(4,6,56,108,80,101,29,43),
+(4,6,57,113,81,103,29,43),
+(4,6,58,115,82,105,30,44),
+(4,6,59,115,84,107,30,44),
+(4,6,60,120,85,109,30,45),
+(4,6,61,122,86,111,30,46),
+(4,6,62,122,88,113,30,46),
+(4,6,63,127,89,116,31,47),
+(4,6,64,127,91,118,31,47),
+(4,6,65,133,92,120,31,48),
+(4,6,66,135,94,123,31,49),
+(4,6,67,136,95,125,32,49),
+(4,6,68,137,97,127,32,50),
+(4,6,69,140,98,130,32,51),
+(4,6,70,147,100,132,32,51),
+(4,6,71,154,102,135,33,52),
+(4,6,72,156,103,137,33,53),
+(4,6,73,157,105,140,33,54),
+(4,6,74,158,107,142,33,54),
+(4,6,75,161,108,145,34,55),
+(4,6,76,164,110,148,34,56),
+(4,6,77,167,112,150,34,57),
+(4,6,78,170,113,153,34,57),
+(4,6,79,172,115,156,35,58),
+(4,6,80,177,117,159,35,59),
+(4,11,1,18,25,19,22,22),
+(4,11,2,19,25,20,23,23),
+(4,11,3,19,26,20,24,24),
+(4,11,4,20,26,21,25,26),
+(4,11,5,20,27,22,26,27),
+(4,11,6,21,27,22,27,28),
+(4,11,7,21,28,23,28,29),
+(4,11,8,22,28,24,29,30),
+(4,11,9,23,29,24,30,32),
+(4,11,10,23,29,25,32,33),
+(4,11,11,24,30,26,33,34),
+(4,11,12,24,31,26,34,35),
+(4,11,13,25,31,27,35,37),
+(4,11,14,26,32,28,36,38),
+(4,11,15,26,32,29,37,39),
+(4,11,16,27,33,29,38,41),
+(4,11,17,28,33,30,40,42),
+(4,11,18,28,34,31,41,43),
+(4,11,19,29,35,32,42,45),
+(4,11,20,30,35,32,43,46),
+(4,11,21,30,36,33,45,48),
+(4,11,22,31,36,34,46,49),
+(4,11,23,32,37,35,47,51),
+(4,11,24,32,38,36,48,52),
+(4,11,25,33,38,36,50,53),
+(4,11,26,34,39,37,51,55),
+(4,11,27,35,40,38,52,56),
+(4,11,28,35,40,39,54,58),
+(4,11,29,36,41,40,55,59),
+(4,11,30,37,42,41,56,61),
+(4,11,31,38,42,42,58,62),
+(4,11,32,38,43,42,59,64),
+(4,11,33,39,44,43,60,66),
+(4,11,34,40,44,44,62,67),
+(4,11,35,41,45,45,63,69),
+(4,11,36,42,46,46,65,70),
+(4,11,37,42,47,47,66,72),
+(4,11,38,43,47,48,67,74),
+(4,11,39,44,48,49,69,75),
+(4,11,40,45,49,50,70,77),
+(4,11,41,46,50,51,72,79),
+(4,11,42,46,50,52,73,80),
+(4,11,43,47,51,53,75,82),
+(4,11,44,48,52,54,76,84),
+(4,11,45,49,53,55,78,85),
+(4,11,46,50,54,56,79,87),
+(4,11,47,51,54,57,81,89),
+(4,11,48,52,55,58,83,91),
+(4,11,49,53,56,59,84,93),
+(4,11,50,53,57,60,86,94),
+(4,11,51,54,58,61,87,96),
+(4,11,52,55,59,62,89,98),
+(4,11,53,56,59,63,91,100),
+(4,11,54,57,60,64,92,102),
+(4,11,55,58,61,65,94,103),
+(4,11,56,59,62,66,95,105),
+(4,11,57,60,63,67,97,107),
+(4,11,58,61,64,68,99,109),
+(4,11,59,62,65,69,101,111),
+(4,11,60,63,66,70,102,113),
+(4,11,61,64,66,72,104,115),
+(4,11,62,65,67,73,106,117),
+(4,11,63,66,68,74,107,119),
+(4,11,64,67,69,75,109,121),
+(4,11,65,68,70,76,111,123),
+(4,11,66,69,71,77,113,125),
+(4,11,67,70,72,78,115,127),
+(4,11,68,71,73,80,116,129),
+(4,11,69,72,74,81,118,131),
+(4,11,70,73,75,82,120,133),
+(4,11,71,75,76,83,122,135),
+(4,11,72,76,78,85,125,138),
+(4,11,73,77,79,86,127,140),
+(4,11,74,78,80,88,131,143),
+(4,11,75,80,81,89,133,145),
+(4,11,76,81,82,91,134,148),
+(4,11,77,82,83,92,136,151),
+(4,11,78,84,85,94,138,153),
+(4,11,79,85,86,95,141,156),
+(4,11,80,86,87,97,143,159),
+(5,1,1,22,18,23,18,25),
+(5,1,2,23,19,24,18,25),
+(5,1,3,25,20,25,18,26),
+(5,1,4,26,20,26,18,26),
+(5,1,5,27,21,28,18,26),
+(5,1,6,29,22,29,18,26),
+(5,1,7,30,23,30,19,27),
+(5,1,8,31,24,31,19,27),
+(5,1,9,33,25,33,19,27),
+(5,1,10,34,25,34,19,28),
+(5,1,11,35,26,35,19,28),
+(5,1,12,37,27,36,19,28),
+(5,1,13,38,28,38,19,28),
+(5,1,14,40,29,39,19,29),
+(5,1,15,41,30,40,19,29),
+(5,1,16,43,31,42,20,29),
+(5,1,17,44,32,43,20,30),
+(5,1,18,46,33,44,20,30),
+(5,1,19,47,34,46,20,31),
+(5,1,20,49,34,47,20,31),
+(5,1,21,50,35,49,20,31),
+(5,1,22,52,36,50,20,32),
+(5,1,23,53,37,51,21,32),
+(5,1,24,55,38,53,21,32),
+(5,1,25,57,39,54,21,33),
+(5,1,26,58,40,56,21,33),
+(5,1,27,60,41,57,21,34),
+(5,1,28,62,42,59,21,34),
+(5,1,29,63,43,60,21,34),
+(5,1,30,65,44,62,22,35),
+(5,1,31,67,46,63,22,35),
+(5,1,32,68,47,65,22,36),
+(5,1,33,70,48,67,22,36),
+(5,1,34,72,49,68,22,36),
+(5,1,35,74,50,70,23,37),
+(5,1,36,75,51,71,23,37),
+(5,1,37,77,52,73,23,38),
+(5,1,38,79,53,75,23,38),
+(5,1,39,81,54,76,23,39),
+(5,1,40,83,55,78,24,39),
+(5,1,41,84,57,80,24,40),
+(5,1,42,86,58,81,24,40),
+(5,1,43,88,59,83,24,41),
+(5,1,44,90,60,85,24,41),
+(5,1,45,92,61,86,25,42),
+(5,1,46,94,62,88,25,42),
+(5,1,47,96,64,90,25,43),
+(5,1,48,98,65,92,25,43),
+(5,1,49,100,66,93,25,44),
+(5,1,50,102,67,95,26,44),
+(5,1,51,104,69,97,26,45),
+(5,1,52,106,70,99,26,45),
+(5,1,53,108,71,101,26,46),
+(5,1,54,110,72,103,27,46),
+(5,1,55,112,74,104,27,47),
+(5,1,56,114,75,106,27,48),
+(5,1,57,116,76,108,27,48),
+(5,1,58,118,78,110,28,49),
+(5,1,59,120,79,112,28,49),
+(5,1,60,122,80,114,28,50),
+(5,1,61,124,82,116,28,50),
+(5,1,62,126,83,118,29,51),
+(5,1,63,128,84,120,29,52),
+(5,1,64,131,86,122,29,52),
+(5,1,65,133,87,124,30,53),
+(5,1,66,135,88,126,30,53),
+(5,1,67,137,90,128,30,54),
+(5,1,68,139,91,130,30,55),
+(5,1,69,142,93,132,31,55),
+(5,1,70,144,94,134,31,56),
+(5,1,71,147,95,136,31,57),
+(5,1,72,150,97,139,31,58),
+(5,1,73,152,99,141,31,59),
+(5,1,74,155,100,144,32,59),
+(5,1,75,158,102,146,32,60),
+(5,1,76,163,104,149,32,61),
+(5,1,77,167,106,152,33,62),
+(5,1,78,167,107,154,33,62),
+(5,1,79,170,109,157,33,63),
+(5,1,80,173,111,160,34,64),
+(5,4,1,20,21,22,18,25),
+(5,4,2,21,22,23,18,25),
+(5,4,3,22,24,23,18,26),
+(5,4,4,22,25,24,18,26),
+(5,4,5,23,27,25,19,26),
+(5,4,6,24,28,25,19,27),
+(5,4,7,25,30,26,19,27),
+(5,4,8,25,31,27,19,27),
+(5,4,9,26,33,28,19,28),
+(5,4,10,27,34,28,19,28),
+(5,4,11,28,36,29,20,29),
+(5,4,12,29,38,30,20,29),
+(5,4,13,30,39,31,20,29),
+(5,4,14,31,41,32,20,30),
+(5,4,15,31,42,32,20,30),
+(5,4,16,32,44,33,21,31),
+(5,4,17,33,46,34,21,31),
+(5,4,18,34,47,35,21,32),
+(5,4,19,35,49,36,21,32),
+(5,4,20,36,51,36,21,32),
+(5,4,21,37,52,37,22,33),
+(5,4,22,38,54,38,22,33),
+(5,4,23,39,56,39,22,34),
+(5,4,24,40,58,40,22,34),
+(5,4,25,41,60,41,23,35),
+(5,4,26,42,61,42,23,35),
+(5,4,27,43,63,43,23,36),
+(5,4,28,44,65,44,23,36),
+(5,4,29,45,67,44,24,37),
+(5,4,30,46,69,45,24,37),
+(5,4,31,47,71,46,24,38),
+(5,4,32,48,72,47,24,38),
+(5,4,33,49,74,48,25,39),
+(5,4,34,50,76,49,25,39),
+(5,4,35,51,78,50,25,40),
+(5,4,36,52,80,51,25,41),
+(5,4,37,53,82,52,26,41),
+(5,4,38,54,84,53,26,42),
+(5,4,39,55,86,54,26,42),
+(5,4,40,56,88,55,27,43),
+(5,4,41,57,90,56,27,43),
+(5,4,42,59,92,57,27,44),
+(5,4,43,60,94,58,27,45),
+(5,4,44,61,96,59,28,45),
+(5,4,45,62,99,60,28,46),
+(5,4,46,63,101,61,28,46),
+(5,4,47,64,103,63,29,47),
+(5,4,48,66,105,64,29,48),
+(5,4,49,67,107,65,29,48),
+(5,4,50,68,109,66,30,49),
+(5,4,51,69,111,67,30,50),
+(5,4,52,70,114,68,30,50),
+(5,4,53,72,116,69,31,51),
+(5,4,54,73,118,70,31,52),
+(5,4,55,74,120,72,31,52),
+(5,4,56,75,123,73,32,53),
+(5,4,57,77,125,74,32,54),
+(5,4,58,78,127,75,32,54),
+(5,4,59,79,130,76,33,55),
+(5,4,60,81,132,77,33,56),
+(5,4,61,82,134,79,34,56),
+(5,4,62,83,137,80,34,57),
+(5,4,63,84,139,81,34,58),
+(5,4,64,86,141,82,35,59),
+(5,4,65,87,144,84,35,59),
+(5,4,66,88,146,85,35,60),
+(5,4,67,90,149,86,36,61),
+(5,4,68,91,151,87,36,61),
+(5,4,69,93,154,89,37,62),
+(5,4,70,94,156,90,37,63),
+(5,4,71,96,159,91,37,64),
+(5,4,72,98,162,93,38,64),
+(5,4,73,99,165,95,38,65),
+(5,4,74,101,168,96,39,66),
+(5,4,75,103,171,98,39,67),
+(5,4,76,104,174,99,39,68),
+(5,4,77,106,177,101,40,69),
+(5,4,78,108,181,103,40,70),
+(5,4,79,110,184,104,41,71),
+(5,4,80,112,187,106,41,72),
+(5,5,1,19,18,21,20,28),
+(5,5,2,19,18,21,21,29),
+(5,5,3,19,18,22,23,31),
+(5,5,4,19,19,22,24,32),
+(5,5,5,20,19,22,25,33),
+(5,5,6,20,19,23,27,35),
+(5,5,7,20,19,23,28,36),
+(5,5,8,20,20,24,29,38),
+(5,5,9,20,20,24,31,39),
+(5,5,10,20,20,24,32,40),
+(5,5,11,21,20,25,34,42),
+(5,5,12,21,21,25,35,43),
+(5,5,13,21,21,26,37,45),
+(5,5,14,21,21,26,38,46),
+(5,5,15,21,21,26,39,48),
+(5,5,16,22,22,27,41,50),
+(5,5,17,22,22,27,42,51),
+(5,5,18,22,22,28,44,53),
+(5,5,19,22,23,28,46,54),
+(5,5,20,22,23,29,47,56),
+(5,5,21,23,23,29,49,57),
+(5,5,22,23,23,30,50,59),
+(5,5,23,23,24,30,52,61),
+(5,5,24,23,24,31,53,62),
+(5,5,25,24,24,31,55,64),
+(5,5,26,24,25,32,57,66),
+(5,5,27,24,25,32,58,68),
+(5,5,28,24,25,33,60,69),
+(5,5,29,25,26,33,62,71),
+(5,5,30,25,26,34,63,73),
+(5,5,31,25,26,34,65,75),
+(5,5,32,25,27,35,67,76),
+(5,5,33,26,27,35,69,78),
+(5,5,34,26,27,36,70,80),
+(5,5,35,26,28,36,72,82),
+(5,5,36,26,28,37,74,84),
+(5,5,37,27,28,37,76,86),
+(5,5,38,27,29,38,77,87),
+(5,5,39,27,29,38,79,89),
+(5,5,40,28,30,39,81,91),
+(5,5,41,28,30,40,83,93),
+(5,5,42,28,30,40,85,95),
+(5,5,43,28,31,41,87,97),
+(5,5,44,29,31,41,89,99),
+(5,5,45,29,32,42,91,101),
+(5,5,46,29,32,43,92,103),
+(5,5,47,30,32,43,94,105),
+(5,5,48,30,33,44,96,107),
+(5,5,49,30,33,44,98,109),
+(5,5,50,31,34,45,100,111),
+(5,5,51,31,34,46,102,113),
+(5,5,52,31,35,46,104,115),
+(5,5,53,32,35,47,106,118),
+(5,5,54,32,35,48,108,120),
+(5,5,55,32,36,48,110,122),
+(5,5,56,33,36,49,113,124),
+(5,5,57,33,37,50,115,126),
+(5,5,58,33,37,50,117,128),
+(5,5,59,34,38,51,119,131),
+(5,5,60,34,38,52,121,133),
+(5,5,61,34,39,52,123,135),
+(5,5,62,35,39,53,125,137),
+(5,5,63,35,40,54,127,140),
+(5,5,64,36,40,55,130,142),
+(5,5,65,36,41,55,132,144),
+(5,5,66,36,41,56,134,147),
+(5,5,67,37,41,57,136,149),
+(5,5,68,37,42,58,138,151),
+(5,5,69,38,42,58,141,154),
+(5,5,70,38,43,59,143,156),
+(5,5,71,38,44,60,146,159),
+(5,5,72,39,44,60,149,162),
+(5,5,73,39,45,61,152,165),
+(5,5,74,40,45,62,157,168),
+(5,5,75,40,46,63,157,171),
+(5,5,76,40,47,64,160,174),
+(5,5,77,41,47,65,163,177),
+(5,5,78,41,48,66,166,180),
+(5,5,79,42,48,67,169,183),
+(5,5,80,42,49,68,172,186),
+(5,6,1,22,18,23,18,25),
+(5,6,2,23,19,24,18,25),
+(5,6,3,25,20,25,18,26),
+(5,6,4,26,20,26,18,26),
+(5,6,5,27,21,28,18,26),
+(5,6,6,29,22,29,18,26),
+(5,6,7,30,23,30,19,27),
+(5,6,8,31,24,31,19,27),
+(5,6,9,33,25,33,19,27),
+(5,6,10,34,25,34,19,28),
+(5,6,11,35,26,35,19,28),
+(5,6,12,37,27,36,19,28),
+(5,6,13,38,28,38,19,28),
+(5,6,14,40,29,39,19,29),
+(5,6,15,41,30,40,19,29),
+(5,6,16,43,31,42,20,29),
+(5,6,17,44,32,43,20,30),
+(5,6,18,46,33,44,20,30),
+(5,6,19,47,34,46,20,31),
+(5,6,20,49,34,47,20,31),
+(5,6,21,50,35,49,20,31),
+(5,6,22,52,36,50,20,32),
+(5,6,23,53,37,51,21,32),
+(5,6,24,55,38,53,21,32),
+(5,6,25,57,39,54,21,33),
+(5,6,26,58,40,56,21,33),
+(5,6,27,60,41,57,21,34),
+(5,6,28,62,42,59,21,34),
+(5,6,29,63,43,60,21,34),
+(5,6,30,65,44,62,22,35),
+(5,6,31,67,46,63,22,35),
+(5,6,32,68,47,65,22,36),
+(5,6,33,70,48,67,22,36),
+(5,6,34,72,49,68,22,36),
+(5,6,35,74,50,70,23,37),
+(5,6,36,75,51,71,23,37),
+(5,6,37,77,52,73,23,38),
+(5,6,38,79,53,75,23,38),
+(5,6,39,81,54,76,23,39),
+(5,6,40,83,55,78,24,39),
+(5,6,41,84,57,80,24,40),
+(5,6,42,86,58,81,24,40),
+(5,6,43,88,59,83,24,41),
+(5,6,44,90,60,85,24,41),
+(5,6,45,92,61,86,25,42),
+(5,6,46,94,62,88,25,42),
+(5,6,47,96,64,90,25,43),
+(5,6,48,98,65,92,25,43),
+(5,6,49,100,66,93,25,44),
+(5,6,50,102,67,95,26,44),
+(5,6,51,103,67,96,26,45),
+(5,6,52,104,68,97,26,45),
+(5,6,53,105,69,98,26,46),
+(5,6,54,106,70,99,27,46),
+(5,6,55,107,71,100,27,47),
+(5,6,56,110,73,103,27,48),
+(5,6,57,112,74,105,27,48),
+(5,6,58,114,75,107,28,49),
+(5,6,59,119,77,109,28,49),
+(5,6,60,122,78,111,28,50),
+(5,6,61,124,79,113,28,51),
+(5,6,62,127,81,115,28,51),
+(5,6,63,129,82,118,29,52),
+(5,6,64,136,84,120,29,52),
+(5,6,65,137,85,123,29,53),
+(5,6,66,138,87,125,29,54),
+(5,6,67,141,88,127,30,54),
+(5,6,68,143,90,129,30,55),
+(5,6,69,146,91,132,30,56),
+(5,6,70,149,93,134,30,56),
+(5,6,71,152,95,137,31,57),
+(5,6,72,154,96,139,31,58),
+(5,6,73,157,98,142,31,59),
+(5,6,74,158,100,145,31,59),
+(5,6,75,159,101,147,32,60),
+(5,6,76,162,103,150,32,61),
+(5,6,77,167,105,152,32,62),
+(5,6,78,173,106,155,32,62),
+(5,6,79,174,108,158,33,63),
+(5,6,80,174,110,161,33,64),
+(5,8,1,19,18,21,21,27),
+(5,8,2,19,18,21,22,28),
+(5,8,3,19,18,22,24,30),
+(5,8,4,19,18,22,25,31),
+(5,8,5,19,19,22,26,32),
+(5,8,6,19,19,22,28,34),
+(5,8,7,20,19,23,29,35),
+(5,8,8,20,19,23,31,36),
+(5,8,9,20,19,23,32,38),
+(5,8,10,20,19,24,34,39),
+(5,8,11,20,20,24,35,40),
+(5,8,12,20,20,24,37,42),
+(5,8,13,20,20,25,38,43),
+(5,8,14,20,20,25,40,45),
+(5,8,15,20,20,25,41,46),
+(5,8,16,21,21,26,43,48),
+(5,8,17,21,21,26,44,49),
+(5,8,18,21,21,26,46,51),
+(5,8,19,21,21,27,48,52),
+(5,8,20,21,21,27,49,54),
+(5,8,21,21,22,27,51,55),
+(5,8,22,21,22,28,52,57),
+(5,8,23,21,22,28,54,58),
+(5,8,24,22,22,29,56,60),
+(5,8,25,22,23,29,57,62),
+(5,8,26,22,23,29,59,63),
+(5,8,27,22,23,30,61,65),
+(5,8,28,22,23,30,63,67),
+(5,8,29,22,24,31,64,68),
+(5,8,30,23,24,31,66,70),
+(5,8,31,23,24,31,68,72),
+(5,8,32,23,24,32,70,73),
+(5,8,33,23,25,32,72,75),
+(5,8,34,23,25,33,73,77),
+(5,8,35,24,25,33,75,79),
+(5,8,36,24,25,34,77,80),
+(5,8,37,24,26,34,79,82),
+(5,8,38,24,26,35,81,84),
+(5,8,39,24,26,35,83,86),
+(5,8,40,24,27,35,85,88),
+(5,8,41,25,27,36,87,90),
+(5,8,42,25,27,36,89,91),
+(5,8,43,25,27,37,90,93),
+(5,8,44,25,28,37,92,95),
+(5,8,45,26,28,38,94,97),
+(5,8,46,26,28,38,96,99),
+(5,8,47,26,29,39,98,101),
+(5,8,48,26,29,39,100,103),
+(5,8,49,26,29,40,103,105),
+(5,8,50,27,30,40,105,107),
+(5,8,51,27,30,41,107,109),
+(5,8,52,27,30,42,109,111),
+(5,8,53,27,31,42,111,113),
+(5,8,54,28,31,43,113,115),
+(5,8,55,28,31,43,115,117),
+(5,8,56,28,32,44,117,119),
+(5,8,57,28,32,44,119,121),
+(5,8,58,29,32,45,122,123),
+(5,8,59,29,33,45,124,126),
+(5,8,60,29,33,46,126,128),
+(5,8,61,29,34,47,128,130),
+(5,8,62,30,34,47,131,132),
+(5,8,63,30,34,48,133,134),
+(5,8,64,30,35,48,135,136),
+(5,8,65,31,35,49,137,139),
+(5,8,66,31,35,50,140,141),
+(5,8,67,31,36,50,142,143),
+(5,8,68,31,36,51,144,145),
+(5,8,69,32,37,51,147,148),
+(5,8,70,32,37,52,149,150),
+(5,8,71,32,37,53,152,153),
+(5,8,72,32,38,54,155,156),
+(5,8,73,32,38,55,158,159),
+(5,8,74,33,39,55,161,161),
+(5,8,75,33,39,56,164,164),
+(5,8,76,33,39,57,167,167),
+(5,8,77,34,40,58,170,170),
+(5,8,78,34,40,58,173,173),
+(5,8,79,34,41,59,176,176),
+(5,8,80,35,41,60,179,179),
+(5,9,1,19,18,22,20,27),
+(5,9,2,19,18,23,21,28),
+(5,9,3,20,19,23,22,29),
+(5,9,4,20,19,24,24,30),
+(5,9,5,20,19,24,25,32),
+(5,9,6,20,20,25,26,33),
+(5,9,7,21,20,25,27,34),
+(5,9,8,21,21,26,28,35),
+(5,9,9,21,21,26,30,36),
+(5,9,10,22,21,27,31,38),
+(5,9,11,22,22,28,32,39),
+(5,9,12,22,22,28,34,40),
+(5,9,13,23,23,29,35,41),
+(5,9,14,23,23,30,36,43),
+(5,9,15,23,24,30,37,44),
+(5,9,16,24,24,31,39,45),
+(5,9,17,24,24,31,40,47),
+(5,9,18,24,25,32,42,48),
+(5,9,19,25,25,33,43,49),
+(5,9,20,25,26,33,44,51),
+(5,9,21,26,26,34,46,52),
+(5,9,22,26,27,35,47,53),
+(5,9,23,26,27,36,49,55),
+(5,9,24,27,28,36,50,56),
+(5,9,25,27,28,37,52,58),
+(5,9,26,27,29,38,53,59),
+(5,9,27,28,29,38,55,60),
+(5,9,28,28,30,39,56,62),
+(5,9,29,29,30,40,58,63),
+(5,9,30,29,31,41,59,65),
+(5,9,31,30,31,41,61,66),
+(5,9,32,30,32,42,62,68),
+(5,9,33,30,32,43,64,69),
+(5,9,34,31,33,44,65,71),
+(5,9,35,31,33,45,67,73),
+(5,9,36,32,34,45,69,74),
+(5,9,37,32,34,46,70,76),
+(5,9,38,33,35,47,72,77),
+(5,9,39,33,36,48,73,79),
+(5,9,40,34,36,49,75,81),
+(5,9,41,34,37,49,77,82),
+(5,9,42,35,37,50,78,84),
+(5,9,43,35,38,51,80,86),
+(5,9,44,36,39,52,82,87),
+(5,9,45,36,39,53,84,89),
+(5,9,46,37,40,54,85,91),
+(5,9,47,37,40,55,87,92),
+(5,9,48,38,41,55,89,94),
+(5,9,49,38,42,56,91,96),
+(5,9,50,39,42,57,92,98),
+(5,9,51,39,43,58,94,100),
+(5,9,52,40,44,59,96,101),
+(5,9,53,40,44,60,98,103),
+(5,9,54,41,45,61,100,105),
+(5,9,55,41,45,62,102,107),
+(5,9,56,42,46,63,103,109),
+(5,9,57,42,47,64,105,111),
+(5,9,58,43,47,65,107,112),
+(5,9,59,43,48,66,109,114),
+(5,9,60,44,49,67,111,116),
+(5,9,61,45,50,68,113,118),
+(5,9,62,45,50,69,115,120),
+(5,9,63,46,51,70,117,122),
+(5,9,64,46,52,71,119,124),
+(5,9,65,47,52,72,121,126),
+(5,9,66,48,53,73,123,128),
+(5,9,67,48,54,74,125,130),
+(5,9,68,49,55,75,127,132),
+(5,9,69,49,55,76,129,134),
+(5,9,70,50,56,77,131,136),
+(5,9,71,51,57,86,135,147),
+(5,9,72,52,57,88,136,149),
+(5,9,73,53,58,89,138,152),
+(5,9,74,53,59,90,141,155),
+(5,9,75,54,60,92,143,157),
+(5,9,76,55,61,93,146,160),
+(5,9,77,56,62,94,149,163),
+(5,9,78,56,63,96,151,166),
+(5,9,79,57,64,97,154,169),
+(5,9,80,58,65,99,157,171),
+(6,1,1,28,15,24,15,22),
+(6,1,2,29,16,25,15,22),
+(6,1,3,31,17,26,15,23),
+(6,1,4,32,17,27,15,23),
+(6,1,5,33,18,29,15,23),
+(6,1,6,34,19,30,15,23),
+(6,1,7,36,20,31,16,24),
+(6,1,8,37,21,32,16,24),
+(6,1,9,38,22,34,16,24),
+(6,1,10,40,22,35,16,25),
+(6,1,11,41,23,36,16,25),
+(6,1,12,43,24,37,16,25),
+(6,1,13,44,25,39,16,26),
+(6,1,14,46,26,40,16,26),
+(6,1,15,47,27,41,17,26),
+(6,1,16,48,28,43,17,27),
+(6,1,17,50,29,44,17,27),
+(6,1,18,51,30,45,17,27),
+(6,1,19,53,31,47,17,28),
+(6,1,20,54,32,48,17,28),
+(6,1,21,56,33,50,17,28),
+(6,1,22,58,34,51,18,29),
+(6,1,23,59,35,52,18,29),
+(6,1,24,61,36,54,18,30),
+(6,1,25,62,37,55,18,30),
+(6,1,26,64,38,57,18,30),
+(6,1,27,66,39,58,18,31),
+(6,1,28,67,40,60,18,31),
+(6,1,29,69,41,61,19,32),
+(6,1,30,71,42,63,19,32),
+(6,1,31,72,43,64,19,32),
+(6,1,32,74,44,66,19,33),
+(6,1,33,76,45,67,19,33),
+(6,1,34,77,46,69,20,34),
+(6,1,35,79,47,71,20,34),
+(6,1,36,81,48,72,20,35),
+(6,1,37,83,49,74,20,35),
+(6,1,38,85,50,76,20,35),
+(6,1,39,86,51,77,21,36),
+(6,1,40,88,53,79,21,36),
+(6,1,41,90,54,81,21,37),
+(6,1,42,92,55,82,21,37),
+(6,1,43,94,56,84,21,38),
+(6,1,44,96,57,86,22,38),
+(6,1,45,98,58,87,22,39),
+(6,1,46,99,60,89,22,39),
+(6,1,47,101,61,91,22,40),
+(6,1,48,103,62,93,22,40),
+(6,1,49,105,63,94,23,41),
+(6,1,50,107,65,96,23,41),
+(6,1,51,109,66,98,23,42),
+(6,1,52,111,67,100,23,42),
+(6,1,53,113,68,102,24,43),
+(6,1,54,115,70,104,24,44),
+(6,1,55,117,71,105,24,44),
+(6,1,56,119,72,107,24,45),
+(6,1,57,122,73,109,25,45),
+(6,1,58,124,75,111,25,46),
+(6,1,59,126,76,113,25,46),
+(6,1,60,128,77,115,25,47),
+(6,1,61,130,79,117,26,48),
+(6,1,62,132,80,119,26,48),
+(6,1,63,134,81,121,26,49),
+(6,1,64,137,83,123,26,49),
+(6,1,65,139,84,125,27,50),
+(6,1,66,141,85,127,27,51),
+(6,1,67,143,87,129,27,51),
+(6,1,68,145,88,131,27,52),
+(6,1,69,148,90,133,28,52),
+(6,1,70,150,91,135,28,53),
+(6,1,71,153,92,137,28,54),
+(6,1,72,155,94,140,28,55),
+(6,1,73,158,96,142,28,56),
+(6,1,74,161,97,145,29,56),
+(6,1,75,164,99,147,29,57),
+(6,1,76,167,101,150,29,58),
+(6,1,77,170,103,153,30,59),
+(6,1,78,173,104,155,30,59),
+(6,1,79,176,106,164,30,60),
+(6,1,80,179,108,170,31,61),
+(6,3,1,25,18,23,15,23),
+(6,3,2,25,19,24,16,24),
+(6,3,3,26,21,25,16,24),
+(6,3,4,26,22,26,17,25),
+(6,3,5,27,24,27,17,25),
+(6,3,6,27,25,28,18,26),
+(6,3,7,28,26,28,19,27),
+(6,3,8,28,28,29,19,27),
+(6,3,9,28,29,30,20,28),
+(6,3,10,29,31,31,20,29),
+(6,3,11,29,32,32,21,29),
+(6,3,12,30,34,33,22,30),
+(6,3,13,30,35,34,22,31),
+(6,3,14,31,37,35,23,32),
+(6,3,15,31,38,36,24,32),
+(6,3,16,32,40,37,24,33),
+(6,3,17,32,41,39,25,34),
+(6,3,18,33,43,40,26,35),
+(6,3,19,33,45,41,27,35),
+(6,3,20,34,46,42,27,36),
+(6,3,21,34,48,43,28,37),
+(6,3,22,35,50,44,29,38),
+(6,3,23,35,51,45,29,38),
+(6,3,24,36,53,46,30,39),
+(6,3,25,37,55,47,31,40),
+(6,3,26,37,56,48,32,41),
+(6,3,27,38,58,50,32,42),
+(6,3,28,38,60,51,33,42),
+(6,3,29,39,62,52,34,43),
+(6,3,30,39,63,53,35,44),
+(6,3,31,40,65,54,36,45),
+(6,3,32,41,67,56,36,46),
+(6,3,33,41,69,57,37,47),
+(6,3,34,42,71,58,38,48),
+(6,3,35,43,72,59,39,48),
+(6,3,36,43,74,61,40,49),
+(6,3,37,44,76,62,40,50),
+(6,3,38,45,78,63,41,51),
+(6,3,39,45,80,64,42,52),
+(6,3,40,46,82,66,43,53),
+(6,3,41,47,84,67,44,54),
+(6,3,42,47,86,68,45,55),
+(6,3,43,48,88,70,46,56),
+(6,3,44,49,90,71,46,57),
+(6,3,45,49,92,72,47,58),
+(6,3,46,50,94,74,48,59),
+(6,3,47,51,96,75,49,60),
+(6,3,48,51,98,77,50,61),
+(6,3,49,52,100,78,51,62),
+(6,3,50,53,102,79,52,63),
+(6,3,51,54,104,81,53,64),
+(6,3,52,54,106,82,54,65),
+(6,3,53,55,108,84,55,66),
+(6,3,54,56,110,85,56,67),
+(6,3,55,57,112,87,57,68),
+(6,3,56,57,114,88,58,69),
+(6,3,57,58,117,90,59,70),
+(6,3,58,59,119,91,60,71),
+(6,3,59,60,121,93,61,72),
+(6,3,60,61,123,94,62,74),
+(6,3,61,61,125,96,63,75),
+(6,3,62,62,128,97,64,76),
+(6,3,63,63,130,99,65,77),
+(6,3,64,64,132,100,66,78),
+(6,3,65,65,134,102,67,79),
+(6,3,66,66,137,104,68,80),
+(6,3,67,66,139,105,69,81),
+(6,3,68,67,141,107,70,83),
+(6,3,69,68,144,108,71,84),
+(6,3,70,69,146,110,72,85),
+(6,3,71,70,149,112,73,86),
+(6,3,72,71,152,114,74,87),
+(6,3,73,72,155,116,75,89),
+(6,3,74,73,158,118,77,90),
+(6,3,75,74,161,120,78,92),
+(6,3,76,75,164,122,79,93),
+(6,3,77,76,167,124,81,95),
+(6,3,78,77,176,126,85,96),
+(6,3,79,78,179,128,86,98),
+(6,3,80,79,183,130,88,99),
+(6,6,1,28,15,24,15,22),
+(6,6,2,29,16,25,15,22),
+(6,6,3,31,17,26,15,23),
+(6,6,4,32,17,27,15,23),
+(6,6,5,33,18,29,15,23),
+(6,6,6,34,19,30,15,23),
+(6,6,7,36,20,31,16,24),
+(6,6,8,37,21,32,16,24),
+(6,6,9,38,22,34,16,24),
+(6,6,10,40,22,35,16,25),
+(6,6,11,41,23,36,16,25),
+(6,6,12,43,24,37,16,25),
+(6,6,13,44,25,39,16,26),
+(6,6,14,46,26,40,16,26),
+(6,6,15,47,27,41,17,26),
+(6,6,16,48,28,43,17,27),
+(6,6,17,50,29,44,17,27),
+(6,6,18,51,30,45,17,27),
+(6,6,19,53,31,47,17,28),
+(6,6,20,54,32,48,17,28),
+(6,6,21,56,33,50,17,28),
+(6,6,22,58,34,51,18,29),
+(6,6,23,59,35,52,18,29),
+(6,6,24,61,36,54,18,30),
+(6,6,25,62,37,55,18,30),
+(6,6,26,64,38,57,18,30),
+(6,6,27,66,39,58,18,31),
+(6,6,28,67,40,60,18,31),
+(6,6,29,69,41,61,19,32),
+(6,6,30,71,42,63,19,32),
+(6,6,31,72,43,64,19,32),
+(6,6,32,74,44,66,19,33),
+(6,6,33,76,45,67,19,33),
+(6,6,34,77,46,69,20,34),
+(6,6,35,79,47,71,20,34),
+(6,6,36,81,48,72,20,35),
+(6,6,37,83,49,74,20,35),
+(6,6,38,85,50,76,20,35),
+(6,6,39,86,51,77,21,36),
+(6,6,40,88,53,79,21,36),
+(6,6,41,90,54,81,21,37),
+(6,6,42,92,55,82,21,37),
+(6,6,43,94,56,84,21,38),
+(6,6,44,96,57,86,22,38),
+(6,6,45,98,58,87,22,39),
+(6,6,46,99,60,89,22,39),
+(6,6,47,101,60,91,22,40),
+(6,6,48,103,61,93,22,40),
+(6,6,49,105,62,94,23,41),
+(6,6,50,107,63,96,23,41),
+(6,6,51,109,64,97,23,42),
+(6,6,52,110,65,98,23,42),
+(6,6,53,111,66,99,24,43),
+(6,6,54,112,67,100,24,44),
+(6,6,55,113,68,101,24,44),
+(6,6,56,116,70,104,24,45),
+(6,6,57,121,71,106,24,45),
+(6,6,58,123,72,108,25,46),
+(6,6,59,123,74,110,25,46),
+(6,6,60,125,75,112,25,47),
+(6,6,61,127,76,114,25,48),
+(6,6,62,133,78,116,25,48),
+(6,6,63,135,79,119,26,49),
+(6,6,64,139,81,121,26,49),
+(6,6,65,142,82,123,26,50),
+(6,6,66,146,84,126,26,51),
+(6,6,67,150,85,132,27,51),
+(6,6,68,153,87,137,27,52),
+(6,6,69,157,88,140,27,53),
+(6,6,70,160,90,143,27,53),
+(6,6,71,163,92,146,28,54),
+(6,6,72,165,93,148,28,55),
+(6,6,73,167,95,150,28,56),
+(6,6,74,171,97,153,28,56),
+(6,6,75,174,98,156,29,57),
+(6,6,76,178,100,156,29,58),
+(6,6,77,179,102,156,29,59),
+(6,6,78,179,103,156,29,59),
+(6,6,79,182,105,159,30,60),
+(6,6,80,185,107,162,30,61),
+(6,7,1,26,15,23,16,24),
+(6,7,2,27,15,24,17,25),
+(6,7,3,28,16,25,18,26),
+(6,7,4,28,16,26,19,27),
+(6,7,5,29,17,27,20,28),
+(6,7,6,30,17,28,21,29),
+(6,7,7,31,18,29,22,30),
+(6,7,8,32,18,30,23,31),
+(6,7,9,33,19,31,24,32),
+(6,7,10,34,19,32,25,33),
+(6,7,11,35,20,33,26,35),
+(6,7,12,35,20,34,27,36),
+(6,7,13,36,21,35,28,37),
+(6,7,14,37,21,36,29,38),
+(6,7,15,38,22,37,30,39),
+(6,7,16,39,22,39,31,40),
+(6,7,17,40,23,40,32,42),
+(6,7,18,41,23,41,33,43),
+(6,7,19,42,24,42,34,44),
+(6,7,20,43,24,43,35,45),
+(6,7,21,44,25,44,36,46),
+(6,7,22,45,25,45,37,48),
+(6,7,23,46,26,47,38,49),
+(6,7,24,47,27,48,40,50),
+(6,7,25,48,27,49,41,51),
+(6,7,26,49,28,50,42,53),
+(6,7,27,51,28,52,43,54),
+(6,7,28,52,29,53,44,55),
+(6,7,29,53,29,54,45,57),
+(6,7,30,54,30,55,47,58),
+(6,7,31,55,31,57,48,59),
+(6,7,32,56,31,58,49,61),
+(6,7,33,57,32,59,50,62),
+(6,7,34,58,33,61,51,64),
+(6,7,35,60,33,62,53,65),
+(6,7,36,61,34,63,54,66),
+(6,7,37,62,34,65,55,68),
+(6,7,38,63,35,66,57,69),
+(6,7,39,64,36,67,58,71),
+(6,7,40,66,36,69,59,72),
+(6,7,41,67,37,70,60,74),
+(6,7,42,68,38,72,62,75),
+(6,7,43,69,38,73,63,77),
+(6,7,44,70,39,74,64,78),
+(6,7,45,72,40,76,66,80),
+(6,7,46,73,41,77,67,81),
+(6,7,47,74,41,79,69,83),
+(6,7,48,76,42,80,70,84),
+(6,7,49,77,43,82,71,86),
+(6,7,50,78,43,83,73,88),
+(6,7,51,80,44,85,74,89),
+(6,7,52,81,45,86,76,91),
+(6,7,53,82,46,88,77,92),
+(6,7,54,84,46,90,78,94),
+(6,7,55,85,47,91,80,96),
+(6,7,56,86,48,93,81,97),
+(6,7,57,88,49,94,83,99),
+(6,7,58,89,49,96,84,101),
+(6,7,59,91,50,97,86,102),
+(6,7,60,92,51,99,87,104),
+(6,7,61,94,52,101,89,106),
+(6,7,62,95,52,102,90,108),
+(6,7,63,96,53,104,92,109),
+(6,7,64,98,54,106,93,111),
+(6,7,65,99,55,107,95,113),
+(6,7,66,101,56,109,97,115),
+(6,7,67,102,57,111,98,117),
+(6,7,68,104,57,113,100,118),
+(6,7,69,105,58,114,101,120),
+(6,7,70,107,59,116,103,122),
+(6,7,71,108,60,118,113,124),
+(6,7,72,110,61,120,117,127),
+(6,7,73,112,62,122,119,129),
+(6,7,74,114,63,125,122,131),
+(6,7,75,116,64,127,124,133),
+(6,7,76,118,65,129,126,136),
+(6,7,77,119,66,131,128,138),
+(6,7,78,121,67,133,130,140),
+(6,7,79,123,68,136,133,143),
+(6,7,80,125,69,138,135,145),
+(6,11,1,26,15,22,17,24),
+(6,11,2,27,16,23,18,25),
+(6,11,3,27,16,23,19,26),
+(6,11,4,28,17,24,20,27),
+(6,11,5,28,17,25,21,29),
+(6,11,6,29,18,25,22,30),
+(6,11,7,29,18,26,23,31),
+(6,11,8,30,19,27,24,32),
+(6,11,9,30,19,27,26,34),
+(6,11,10,31,20,28,27,35),
+(6,11,11,32,20,29,28,36),
+(6,11,12,32,21,29,29,37),
+(6,11,13,33,21,30,30,39),
+(6,11,14,33,22,31,31,40),
+(6,11,15,34,23,32,32,41),
+(6,11,16,35,23,32,34,43),
+(6,11,17,35,24,33,35,44),
+(6,11,18,36,24,34,36,45),
+(6,11,19,37,25,35,37,47),
+(6,11,20,37,26,35,39,48),
+(6,11,21,38,26,36,40,50),
+(6,11,22,39,27,37,41,51),
+(6,11,23,39,28,38,42,52),
+(6,11,24,40,28,39,44,54),
+(6,11,25,41,29,39,45,55),
+(6,11,26,41,30,40,46,57),
+(6,11,27,42,30,41,47,58),
+(6,11,28,43,31,42,49,60),
+(6,11,29,44,32,43,50,61),
+(6,11,30,44,32,44,52,63),
+(6,11,31,45,33,44,53,64),
+(6,11,32,46,34,45,54,66),
+(6,11,33,47,34,46,56,67),
+(6,11,34,47,35,47,57,69),
+(6,11,35,48,36,48,58,71),
+(6,11,36,49,36,49,60,72),
+(6,11,37,50,37,50,61,74),
+(6,11,38,51,38,51,63,76),
+(6,11,39,52,39,52,64,77),
+(6,11,40,52,39,53,66,79),
+(6,11,41,53,40,54,67,81),
+(6,11,42,54,41,55,69,82),
+(6,11,43,55,42,56,70,84),
+(6,11,44,56,43,57,72,86),
+(6,11,45,57,43,57,73,87),
+(6,11,46,57,44,58,75,89),
+(6,11,47,58,45,60,76,91),
+(6,11,48,59,46,61,78,93),
+(6,11,49,60,47,62,79,94),
+(6,11,50,61,47,63,81,96),
+(6,11,51,62,48,64,83,98),
+(6,11,52,63,49,65,84,100),
+(6,11,53,64,50,66,86,102),
+(6,11,54,65,51,67,87,104),
+(6,11,55,66,51,68,89,105),
+(6,11,56,67,52,69,91,107),
+(6,11,57,68,53,70,92,109),
+(6,11,58,69,54,71,94,111),
+(6,11,59,70,55,72,96,113),
+(6,11,60,71,56,73,97,115),
+(6,11,61,72,57,74,99,117),
+(6,11,62,73,58,76,101,119),
+(6,11,63,74,59,77,103,121),
+(6,11,64,75,59,78,104,123),
+(6,11,65,76,60,79,106,125),
+(6,11,66,77,61,80,108,127),
+(6,11,67,78,62,81,110,129),
+(6,11,68,79,63,83,111,131),
+(6,11,69,80,64,84,113,133),
+(6,11,70,81,65,85,115,135),
+(6,11,71,83,66,86,117,137),
+(6,11,72,84,68,88,120,140),
+(6,11,73,85,69,89,122,142),
+(6,11,74,86,70,91,124,145),
+(6,11,75,88,71,92,126,147),
+(6,11,76,89,72,94,128,150),
+(6,11,77,90,73,95,131,153),
+(6,11,78,92,75,97,133,155),
+(6,11,79,93,76,98,136,158),
+(6,11,80,94,77,100,138,185),
+(7,1,1,18,23,21,24,20),
+(7,1,2,19,24,22,24,20),
+(7,1,3,21,25,23,24,21),
+(7,1,4,22,25,25,24,21),
+(7,1,5,23,26,26,24,21),
+(7,1,6,25,27,27,24,21),
+(7,1,7,26,28,28,24,22),
+(7,1,8,27,29,29,25,22),
+(7,1,9,29,29,31,25,22),
+(7,1,10,30,30,32,25,23),
+(7,1,11,32,31,33,25,23),
+(7,1,12,33,32,34,25,23),
+(7,1,13,34,33,36,25,24),
+(7,1,14,36,34,37,25,24),
+(7,1,15,37,35,38,25,24),
+(7,1,16,39,36,40,25,25),
+(7,1,17,40,36,41,25,25),
+(7,1,18,42,37,43,26,25),
+(7,1,19,43,38,44,26,26),
+(7,1,20,45,39,45,26,26),
+(7,1,21,47,40,47,26,26),
+(7,1,22,48,41,48,26,27),
+(7,1,23,50,42,50,26,27),
+(7,1,24,51,43,51,26,28),
+(7,1,25,53,44,52,27,28),
+(7,1,26,55,45,54,27,28),
+(7,1,27,56,46,55,27,29),
+(7,1,28,58,47,57,27,29),
+(7,1,29,59,48,58,27,30),
+(7,1,30,61,49,60,27,30),
+(7,1,31,63,50,62,27,30),
+(7,1,32,65,51,63,28,31),
+(7,1,33,66,52,65,28,31),
+(7,1,34,68,53,66,28,32),
+(7,1,35,70,55,68,28,32),
+(7,1,36,72,56,69,28,33),
+(7,1,37,73,57,71,29,33),
+(7,1,38,75,58,73,29,34),
+(7,1,39,77,59,74,29,34),
+(7,1,40,79,60,76,29,35),
+(7,1,41,81,61,78,29,35),
+(7,1,42,82,62,79,30,35),
+(7,1,43,84,64,81,30,36),
+(7,1,44,86,65,83,30,36),
+(7,1,45,88,66,85,30,37),
+(7,1,46,90,67,86,30,37),
+(7,1,47,92,68,88,31,38),
+(7,1,48,94,70,90,31,38),
+(7,1,49,96,71,92,31,39),
+(7,1,50,98,72,93,31,40),
+(7,1,51,100,73,95,32,40),
+(7,1,52,102,75,97,32,41),
+(7,1,53,104,76,99,32,41),
+(7,1,54,106,77,101,32,42),
+(7,1,55,108,78,103,33,42),
+(7,1,56,110,80,104,33,43),
+(7,1,57,112,81,106,33,43),
+(7,1,58,114,82,108,33,44),
+(7,1,59,116,84,110,34,44),
+(7,1,60,118,85,112,34,45),
+(7,1,61,120,86,114,34,46),
+(7,1,62,122,88,116,35,46),
+(7,1,63,125,89,118,35,47),
+(7,1,64,127,91,120,35,47),
+(7,1,65,129,92,122,35,48),
+(7,1,66,131,93,124,36,49),
+(7,1,67,133,95,126,36,49),
+(7,1,68,136,96,128,36,50),
+(7,1,69,138,98,130,37,50),
+(7,1,70,140,99,132,37,51),
+(7,1,71,143,100,134,37,52),
+(7,1,72,145,102,137,37,53),
+(7,1,73,148,104,139,37,54),
+(7,1,74,151,105,142,38,54),
+(7,1,75,154,107,144,38,55),
+(7,1,76,157,109,147,38,56),
+(7,1,77,163,111,153,39,57),
+(7,1,78,169,112,158,39,57),
+(7,1,79,172,114,161,39,58),
+(7,1,80,175,116,164,40,59),
+(7,4,1,16,26,20,24,20),
+(7,4,2,17,27,21,24,20),
+(7,4,3,18,29,21,24,21),
+(7,4,4,18,30,22,24,21),
+(7,4,5,19,32,23,25,21),
+(7,4,6,20,33,24,25,22),
+(7,4,7,21,35,24,25,22),
+(7,4,8,22,36,25,25,23),
+(7,4,9,22,38,26,25,23),
+(7,4,10,23,39,26,25,23),
+(7,4,11,24,41,27,25,24),
+(7,4,12,25,42,28,26,24),
+(7,4,13,26,44,29,26,25),
+(7,4,14,27,46,30,26,25),
+(7,4,15,28,47,30,26,25),
+(7,4,16,28,49,31,26,26),
+(7,4,17,29,50,32,27,26),
+(7,4,18,30,52,33,27,27),
+(7,4,19,31,54,34,27,27),
+(7,4,20,32,56,35,27,28),
+(7,4,21,33,57,35,27,28),
+(7,4,22,34,59,36,28,29),
+(7,4,23,35,61,37,28,29),
+(7,4,24,36,62,38,28,30),
+(7,4,25,37,64,39,28,30),
+(7,4,26,38,66,40,29,31),
+(7,4,27,39,68,41,29,31),
+(7,4,28,40,70,42,29,32),
+(7,4,29,41,72,43,29,32),
+(7,4,30,42,73,43,29,33),
+(7,4,31,43,75,44,30,33),
+(7,4,32,44,77,45,30,34),
+(7,4,33,45,79,46,30,34),
+(7,4,34,46,81,47,31,35),
+(7,4,35,47,83,48,31,35),
+(7,4,36,48,85,49,31,36),
+(7,4,37,49,87,50,31,36),
+(7,4,38,50,89,51,32,37),
+(7,4,39,51,91,52,32,38),
+(7,4,40,53,93,53,32,38),
+(7,4,41,54,95,54,33,39),
+(7,4,42,55,97,55,33,39),
+(7,4,43,56,99,56,33,40),
+(7,4,44,57,101,57,33,40),
+(7,4,45,58,103,59,34,41),
+(7,4,46,59,105,60,34,42),
+(7,4,47,61,107,61,34,42),
+(7,4,48,62,110,62,35,43),
+(7,4,49,63,112,63,35,44),
+(7,4,50,64,114,64,35,44),
+(7,4,51,65,116,65,36,45),
+(7,4,52,67,118,66,36,45),
+(7,4,53,68,121,67,36,46),
+(7,4,54,69,123,69,37,47),
+(7,4,55,70,125,70,37,47),
+(7,4,56,72,127,71,37,48),
+(7,4,57,73,130,72,38,49),
+(7,4,58,74,132,73,38,49),
+(7,4,59,75,134,74,39,50),
+(7,4,60,77,137,76,39,51),
+(7,4,61,78,139,77,39,51),
+(7,4,62,79,141,78,40,52),
+(7,4,63,81,144,79,40,53),
+(7,4,64,82,146,80,41,54),
+(7,4,65,83,149,82,41,54),
+(7,4,66,85,151,83,41,55),
+(7,4,67,86,154,84,42,56),
+(7,4,68,87,156,85,42,57),
+(7,4,69,89,158,87,43,57),
+(7,4,70,90,161,88,43,58),
+(7,4,71,92,164,89,44,59),
+(7,4,72,94,167,91,45,59),
+(7,4,73,95,170,93,45,60),
+(7,4,74,97,173,94,46,61),
+(7,4,75,99,176,96,46,62),
+(7,4,76,100,179,97,46,63),
+(7,4,77,102,182,102,47,64),
+(7,4,78,104,186,105,47,65),
+(7,4,79,106,189,106,48,66),
+(7,4,80,108,192,108,48,67),
+(7,6,1,18,23,21,24,20),
+(7,6,2,19,24,22,24,20),
+(7,6,3,21,25,23,24,21),
+(7,6,4,22,25,25,24,21),
+(7,6,5,23,26,26,24,21),
+(7,6,6,25,27,27,24,21),
+(7,6,7,26,28,28,24,22),
+(7,6,8,27,29,29,25,22),
+(7,6,9,29,29,31,25,22),
+(7,6,10,30,30,32,25,23),
+(7,6,11,32,31,33,25,23),
+(7,6,12,33,32,34,25,23),
+(7,6,13,34,33,36,25,24),
+(7,6,14,36,34,37,25,24),
+(7,6,15,37,35,38,25,24),
+(7,6,16,39,36,40,25,25),
+(7,6,17,40,36,41,25,25),
+(7,6,18,42,37,43,26,25),
+(7,6,19,43,38,44,26,26),
+(7,6,20,45,39,45,26,26),
+(7,6,21,47,40,47,26,26),
+(7,6,22,48,41,48,26,27),
+(7,6,23,50,42,50,26,27),
+(7,6,24,51,43,51,26,28),
+(7,6,25,53,44,52,27,28),
+(7,6,26,55,45,54,27,28),
+(7,6,27,56,46,55,27,29),
+(7,6,28,58,47,57,27,29),
+(7,6,29,59,48,58,27,30),
+(7,6,30,61,49,60,27,30),
+(7,6,31,63,50,62,27,30),
+(7,6,32,65,51,63,28,31),
+(7,6,33,66,52,65,28,31),
+(7,6,34,68,53,66,28,32),
+(7,6,35,70,55,68,28,32),
+(7,6,36,72,56,69,28,33),
+(7,6,37,73,57,71,29,33),
+(7,6,38,75,58,73,29,34),
+(7,6,39,77,59,74,29,34),
+(7,6,40,79,60,76,29,35),
+(7,6,41,81,61,78,29,35),
+(7,6,42,82,62,79,30,35),
+(7,6,43,84,64,81,30,36),
+(7,6,44,86,65,83,30,36),
+(7,6,45,88,66,85,30,37),
+(7,6,46,90,67,86,30,37),
+(7,6,47,92,68,88,31,38),
+(7,6,48,94,70,90,31,38),
+(7,6,49,96,71,92,31,39),
+(7,6,50,98,72,93,31,40),
+(7,6,51,99,72,93,32,40),
+(7,6,52,100,73,95,32,41),
+(7,6,53,101,74,96,32,41),
+(7,6,54,102,75,97,32,42),
+(7,6,55,103,76,98,33,42),
+(7,6,56,106,78,101,33,43),
+(7,6,57,111,79,103,33,43),
+(7,6,58,113,80,105,34,44),
+(7,6,59,116,82,107,34,44),
+(7,6,60,118,83,109,34,45),
+(7,6,61,120,84,111,34,46),
+(7,6,62,127,86,119,34,46),
+(7,6,63,129,87,122,35,47),
+(7,6,64,132,89,125,35,47),
+(7,6,65,135,90,127,35,48),
+(7,6,66,137,92,130,35,49),
+(7,6,67,138,93,130,36,49),
+(7,6,68,140,95,131,36,50),
+(7,6,69,142,96,131,36,51),
+(7,6,70,145,98,132,36,51),
+(7,6,71,148,100,135,37,52),
+(7,6,72,150,101,137,37,53),
+(7,6,73,153,103,140,37,54),
+(7,6,74,154,105,142,37,54),
+(7,6,75,155,106,145,38,55),
+(7,6,76,158,108,151,38,56),
+(7,6,77,161,110,157,38,57),
+(7,6,78,164,111,162,38,57),
+(7,6,79,167,113,165,39,58),
+(7,6,80,170,115,168,39,59),
+(7,8,1,15,23,19,27,22),
+(7,8,2,15,23,19,28,23),
+(7,8,3,15,23,20,30,25),
+(7,8,4,15,23,20,31,26),
+(7,8,5,15,24,20,32,27),
+(7,8,6,15,24,20,34,29),
+(7,8,7,16,24,21,35,30),
+(7,8,8,16,24,21,37,31),
+(7,8,9,16,24,21,38,33),
+(7,8,10,16,24,22,40,34),
+(7,8,11,16,25,22,41,36),
+(7,8,12,16,25,22,42,37),
+(7,8,13,16,25,23,44,38),
+(7,8,14,16,25,23,45,40),
+(7,8,15,17,25,23,47,41),
+(7,8,16,17,25,24,49,43),
+(7,8,17,17,26,24,50,44),
+(7,8,18,17,26,24,52,46),
+(7,8,19,17,26,25,53,47),
+(7,8,20,17,26,25,55,49),
+(7,8,21,17,26,26,57,51),
+(7,8,22,18,27,26,58,52),
+(7,8,23,18,27,26,60,54),
+(7,8,24,18,27,27,61,55),
+(7,8,25,18,27,27,63,57),
+(7,8,26,18,28,27,65,59),
+(7,8,27,18,28,28,67,60),
+(7,8,28,18,28,28,68,62),
+(7,8,29,19,28,29,70,64),
+(7,8,30,19,29,29,72,65),
+(7,8,31,19,29,30,74,67),
+(7,8,32,19,29,30,75,69),
+(7,8,33,19,29,30,77,70),
+(7,8,34,20,30,31,79,72),
+(7,8,35,20,30,31,81,74),
+(7,8,36,20,30,32,83,76),
+(7,8,37,20,30,32,85,78),
+(7,8,38,20,31,33,86,79),
+(7,8,39,21,31,33,88,81),
+(7,8,40,21,31,34,90,83),
+(7,8,41,21,32,34,92,85),
+(7,8,42,21,32,35,94,87),
+(7,8,43,21,32,35,96,89),
+(7,8,44,22,32,36,98,91),
+(7,8,45,22,33,36,100,92),
+(7,8,46,22,33,37,102,94),
+(7,8,47,22,33,37,104,96),
+(7,8,48,22,34,38,106,98),
+(7,8,49,23,34,38,108,100),
+(7,8,50,23,34,39,110,102),
+(7,8,51,23,35,39,112,104),
+(7,8,52,23,35,40,114,106),
+(7,8,53,24,35,40,117,108),
+(7,8,54,24,36,41,119,110),
+(7,8,55,24,36,41,121,112),
+(7,8,56,24,37,42,123,114),
+(7,8,57,25,37,42,125,117),
+(7,8,58,25,37,43,127,119),
+(7,8,59,25,38,43,130,121),
+(7,8,60,25,38,44,132,123),
+(7,8,61,26,38,45,134,125),
+(7,8,62,26,39,45,136,127),
+(7,8,63,26,39,46,139,129),
+(7,8,64,26,40,46,141,132),
+(7,8,65,27,40,47,143,134),
+(7,8,66,27,40,48,146,136),
+(7,8,67,27,41,48,148,138),
+(7,8,68,27,41,49,150,140),
+(7,8,69,28,42,49,153,143),
+(7,8,70,28,42,50,155,145),
+(7,8,71,28,42,51,168,148),
+(7,8,72,28,43,52,168,151),
+(7,8,73,28,43,53,171,154),
+(7,8,74,29,44,53,174,156),
+(7,8,75,29,44,54,177,159),
+(7,8,76,29,44,55,180,162),
+(7,8,77,30,45,56,183,165),
+(7,8,78,30,45,56,186,168),
+(7,8,79,30,46,57,190,171),
+(7,8,80,31,46,58,193,174),
+(7,9,1,15,23,20,26,22),
+(7,9,2,15,23,21,27,23),
+(7,9,3,16,24,21,28,24),
+(7,9,4,16,24,22,29,25),
+(7,9,5,16,24,22,31,27),
+(7,9,6,17,25,23,32,28),
+(7,9,7,17,25,23,33,29),
+(7,9,8,17,26,24,34,30),
+(7,9,9,17,26,25,36,31),
+(7,9,10,18,26,25,37,33),
+(7,9,11,18,27,26,38,34),
+(7,9,12,18,27,26,39,35),
+(7,9,13,19,28,27,41,36),
+(7,9,14,19,28,28,42,38),
+(7,9,15,20,28,28,43,39),
+(7,9,16,20,29,29,45,40),
+(7,9,17,20,29,30,46,42),
+(7,9,18,21,30,30,47,43),
+(7,9,19,21,30,31,49,44),
+(7,9,20,21,31,32,50,46),
+(7,9,21,22,31,32,51,47),
+(7,9,22,22,31,33,53,49),
+(7,9,23,23,32,34,54,50),
+(7,9,24,23,32,34,56,51),
+(7,9,25,23,33,35,57,53),
+(7,9,26,24,33,36,59,54),
+(7,9,27,24,34,37,60,56),
+(7,9,28,25,34,37,62,57),
+(7,9,29,25,35,38,63,59),
+(7,9,30,25,35,39,65,60),
+(7,9,31,26,36,40,66,62),
+(7,9,32,26,36,40,68,63),
+(7,9,33,27,37,41,69,65),
+(7,9,34,27,38,42,71,66),
+(7,9,35,28,38,43,73,68),
+(7,9,36,28,39,43,74,69),
+(7,9,37,28,39,44,76,71),
+(7,9,38,29,40,45,77,73),
+(7,9,39,29,40,46,79,74),
+(7,9,40,30,41,47,81,76),
+(7,9,41,30,41,48,82,78),
+(7,9,42,31,42,48,84,79),
+(7,9,43,31,43,49,86,81),
+(7,9,44,32,43,50,88,83),
+(7,9,45,32,44,51,89,84),
+(7,9,46,33,44,52,91,86),
+(7,9,47,33,45,53,93,88),
+(7,9,48,34,46,54,95,89),
+(7,9,49,34,46,54,96,91),
+(7,9,50,35,47,55,98,93),
+(7,9,51,35,48,56,100,95),
+(7,9,52,36,48,57,102,97),
+(7,9,53,36,49,58,104,98),
+(7,9,54,37,50,59,105,100),
+(7,9,55,37,50,60,107,102),
+(7,9,56,38,51,61,109,104),
+(7,9,57,38,52,62,111,106),
+(7,9,58,39,52,63,113,108),
+(7,9,59,40,53,64,115,109),
+(7,9,60,40,54,65,117,111),
+(7,9,61,41,54,66,119,113),
+(7,9,62,41,55,67,121,115),
+(7,9,63,42,56,68,123,117),
+(7,9,64,42,57,69,125,119),
+(7,9,65,43,57,70,127,121),
+(7,9,66,44,58,71,129,123),
+(7,9,67,44,59,72,131,125),
+(7,9,68,45,59,73,133,127),
+(7,9,69,45,60,74,135,129),
+(7,9,70,46,61,75,137,131),
+(7,9,71,47,62,84,147,142),
+(7,9,72,48,62,85,148,144),
+(7,9,73,49,63,85,153,147),
+(7,9,74,49,64,88,153,150),
+(7,9,75,50,65,90,155,152),
+(7,9,76,51,66,91,158,155),
+(7,9,77,52,67,92,161,158),
+(7,9,78,52,68,93,163,161),
+(7,9,79,53,69,95,166,164),
+(7,9,80,54,70,96,170,166),
+(8,1,1,24,22,23,16,21),
+(8,1,2,25,23,24,16,21),
+(8,1,3,27,24,25,16,22),
+(8,1,4,28,24,26,16,22),
+(8,1,5,29,25,28,16,22),
+(8,1,6,31,26,29,16,22),
+(8,1,7,32,27,30,17,23),
+(8,1,8,33,28,31,17,23),
+(8,1,9,35,28,33,17,23),
+(8,1,10,36,29,34,17,24),
+(8,1,11,37,30,35,17,24),
+(8,1,12,39,31,36,17,24),
+(8,1,13,40,32,38,17,25),
+(8,1,14,42,33,39,17,25),
+(8,1,15,43,34,40,18,25),
+(8,1,16,45,35,42,18,26),
+(8,1,17,46,35,43,18,26),
+(8,1,18,48,36,44,18,26),
+(8,1,19,49,37,46,18,27),
+(8,1,20,51,38,47,18,27),
+(8,1,21,52,39,49,18,27),
+(8,1,22,54,40,50,18,28),
+(8,1,23,55,41,51,19,28),
+(8,1,24,57,42,53,19,29),
+(8,1,25,59,43,54,19,29),
+(8,1,26,60,44,56,19,29),
+(8,1,27,62,45,57,19,30),
+(8,1,28,63,46,59,19,30),
+(8,1,29,65,47,60,20,31),
+(8,1,30,67,48,62,20,31),
+(8,1,31,69,49,63,20,31),
+(8,1,32,70,50,65,20,32),
+(8,1,33,72,51,67,20,32),
+(8,1,34,74,53,68,20,33),
+(8,1,35,75,54,70,21,33),
+(8,1,36,77,55,71,21,34),
+(8,1,37,79,56,73,21,34),
+(8,1,38,81,57,75,21,35),
+(8,1,39,83,58,76,21,35),
+(8,1,40,84,59,78,22,35),
+(8,1,41,86,60,80,22,36),
+(8,1,42,88,62,81,22,36),
+(8,1,43,90,63,83,22,37),
+(8,1,44,92,64,85,22,37),
+(8,1,45,94,65,86,23,38),
+(8,1,46,96,66,88,23,38),
+(8,1,47,98,67,90,23,39),
+(8,1,48,100,69,92,23,39),
+(8,1,49,102,70,93,24,40),
+(8,1,50,103,71,95,24,40),
+(8,1,51,105,72,97,24,41),
+(8,1,52,107,74,99,24,42),
+(8,1,53,109,75,101,25,42),
+(8,1,54,112,76,103,25,43),
+(8,1,55,114,78,104,25,43),
+(8,1,56,116,79,106,25,44),
+(8,1,57,118,80,108,25,44),
+(8,1,58,120,81,110,26,45),
+(8,1,59,122,83,112,26,45),
+(8,1,60,124,84,114,26,46),
+(8,1,61,126,85,116,27,47),
+(8,1,62,128,87,118,27,47),
+(8,1,63,130,88,120,27,48),
+(8,1,64,133,90,122,27,48),
+(8,1,65,135,91,124,28,49),
+(8,1,66,137,92,126,28,50),
+(8,1,67,139,94,128,28,50),
+(8,1,68,141,95,130,28,51),
+(8,1,69,144,97,132,29,51),
+(8,1,70,146,98,134,29,52),
+(8,1,71,149,99,136,29,53),
+(8,1,72,151,101,139,29,54),
+(8,1,73,154,103,141,29,55),
+(8,1,74,157,104,144,30,55),
+(8,1,75,166,106,151,30,56),
+(8,1,76,172,108,157,30,57),
+(8,1,77,175,110,161,31,58),
+(8,1,78,179,111,163,31,58),
+(8,1,79,182,113,164,31,59),
+(8,1,80,185,115,169,32,60),
+(8,3,1,21,25,22,16,22),
+(8,3,2,21,26,23,17,23),
+(8,3,3,22,28,24,17,23),
+(8,3,4,22,29,25,18,24),
+(8,3,5,23,30,26,18,25),
+(8,3,6,23,32,27,19,25),
+(8,3,7,24,33,28,20,26),
+(8,3,8,24,35,28,20,26),
+(8,3,9,25,36,29,21,27),
+(8,3,10,25,38,30,21,28),
+(8,3,11,25,39,31,22,29),
+(8,3,12,26,41,32,23,29),
+(8,3,13,26,42,33,23,30),
+(8,3,14,27,44,34,24,31),
+(8,3,15,27,45,35,25,31),
+(8,3,16,28,47,36,25,32),
+(8,3,17,28,48,38,26,33),
+(8,3,18,29,50,39,27,34),
+(8,3,19,29,51,40,28,34),
+(8,3,20,30,53,41,28,35),
+(8,3,21,31,55,42,29,36),
+(8,3,22,31,56,43,30,37),
+(8,3,23,32,58,44,30,37),
+(8,3,24,32,60,45,31,38),
+(8,3,25,33,61,46,32,39),
+(8,3,26,33,63,48,33,40),
+(8,3,27,34,65,49,33,41),
+(8,3,28,35,66,50,34,41),
+(8,3,29,35,68,51,35,42),
+(8,3,30,36,70,52,36,43),
+(8,3,31,36,72,53,37,44),
+(8,3,32,37,73,55,37,45),
+(8,3,33,38,75,56,38,46),
+(8,3,34,38,77,57,39,47),
+(8,3,35,39,79,58,40,48),
+(8,3,36,39,81,60,41,48),
+(8,3,37,40,83,61,41,49),
+(8,3,38,41,85,62,42,50),
+(8,3,39,41,86,63,43,51),
+(8,3,40,42,88,65,44,52),
+(8,3,41,43,90,66,45,53),
+(8,3,42,43,92,67,46,54),
+(8,3,43,44,94,69,47,55),
+(8,3,44,45,96,70,47,56),
+(8,3,45,45,98,71,48,57),
+(8,3,46,46,100,73,49,58),
+(8,3,47,47,102,74,50,59),
+(8,3,48,48,104,76,51,60),
+(8,3,49,48,106,77,52,61),
+(8,3,50,49,108,78,53,62),
+(8,3,51,50,110,80,54,63),
+(8,3,52,51,113,81,55,64),
+(8,3,53,51,115,83,56,65),
+(8,3,54,52,117,84,57,66),
+(8,3,55,53,119,86,58,67),
+(8,3,56,54,121,87,59,68),
+(8,3,57,54,123,89,60,69),
+(8,3,58,55,126,90,61,70),
+(8,3,59,56,128,92,62,71),
+(8,3,60,57,130,93,63,73),
+(8,3,61,58,132,95,64,74),
+(8,3,62,58,134,96,65,75),
+(8,3,63,59,137,98,66,76),
+(8,3,64,60,139,99,67,77),
+(8,3,65,61,141,101,68,78),
+(8,3,66,62,144,103,69,79),
+(8,3,67,62,146,104,70,80),
+(8,3,68,63,148,106,71,82),
+(8,3,69,64,151,107,72,83),
+(8,3,70,65,153,109,73,84),
+(8,3,71,66,156,111,74,85),
+(8,3,72,67,159,113,75,86),
+(8,3,73,68,162,115,76,88),
+(8,3,74,69,165,117,78,89),
+(8,3,75,70,174,119,82,91),
+(8,3,76,71,177,121,83,92),
+(8,3,77,72,180,123,85,94),
+(8,3,78,73,184,125,86,95),
+(8,3,79,74,187,127,87,97),
+(8,3,80,75,190,129,89,98),
+(8,4,1,22,25,22,16,21),
+(8,4,2,23,26,23,16,21),
+(8,4,3,24,28,23,16,22),
+(8,4,4,24,29,24,16,22),
+(8,4,5,25,31,25,17,22),
+(8,4,6,26,32,25,17,23),
+(8,4,7,27,34,26,17,23),
+(8,4,8,27,35,27,17,24),
+(8,4,9,28,37,28,17,24),
+(8,4,10,29,38,28,18,24),
+(8,4,11,30,40,29,18,25),
+(8,4,12,31,41,30,18,25),
+(8,4,13,32,43,31,18,26),
+(8,4,14,32,45,32,18,26),
+(8,4,15,33,46,32,19,26),
+(8,4,16,34,48,33,19,27),
+(8,4,17,35,50,34,19,27),
+(8,4,18,36,51,35,19,28),
+(8,4,19,37,53,36,19,28),
+(8,4,20,38,55,36,20,29),
+(8,4,21,39,56,37,20,29),
+(8,4,22,40,58,38,20,30),
+(8,4,23,41,60,39,20,30),
+(8,4,24,42,62,40,20,31),
+(8,4,25,43,63,41,21,31),
+(8,4,26,44,65,42,21,32),
+(8,4,27,45,67,43,21,32),
+(8,4,28,46,69,44,21,33),
+(8,4,29,47,71,44,22,33),
+(8,4,30,48,72,45,22,34),
+(8,4,31,49,74,46,22,34),
+(8,4,32,50,76,47,22,35),
+(8,4,33,51,78,48,23,35),
+(8,4,34,52,80,49,23,36),
+(8,4,35,53,82,50,23,36),
+(8,4,36,54,84,51,24,37),
+(8,4,37,55,86,52,24,37),
+(8,4,38,56,88,53,24,38),
+(8,4,39,57,90,54,24,38),
+(8,4,40,58,92,55,25,39),
+(8,4,41,59,94,56,25,40),
+(8,4,42,60,96,57,25,40),
+(8,4,43,62,98,58,26,41),
+(8,4,44,63,100,59,26,41),
+(8,4,45,64,102,60,26,42),
+(8,4,46,65,104,61,27,43),
+(8,4,47,66,107,63,27,43),
+(8,4,48,67,109,64,27,44),
+(8,4,49,69,111,65,27,44),
+(8,4,50,70,113,66,28,45),
+(8,4,51,71,115,67,28,46),
+(8,4,52,72,117,68,28,46),
+(8,4,53,74,120,69,29,47),
+(8,4,54,75,122,70,29,48),
+(8,4,55,76,124,72,29,48),
+(8,4,56,77,126,73,30,49),
+(8,4,57,79,129,74,30,50),
+(8,4,58,80,131,75,30,50),
+(8,4,59,81,133,76,31,51),
+(8,4,60,82,136,77,31,52),
+(8,4,61,84,138,79,32,52),
+(8,4,62,85,140,80,32,53),
+(8,4,63,86,143,81,32,54),
+(8,4,64,88,145,82,33,55),
+(8,4,65,89,148,84,33,55),
+(8,4,66,90,150,85,33,56),
+(8,4,67,92,153,86,34,57),
+(8,4,68,93,155,87,34,58),
+(8,4,69,95,157,89,35,58),
+(8,4,70,96,160,90,35,59),
+(8,4,71,98,163,94,35,60),
+(8,4,72,100,166,96,36,60),
+(8,4,73,101,169,96,36,61),
+(8,4,74,103,172,97,37,62),
+(8,4,75,105,175,98,37,63),
+(8,4,76,106,178,99,37,64),
+(8,4,77,108,181,105,38,65),
+(8,4,78,110,185,107,38,66),
+(8,4,79,112,188,109,39,67),
+(8,4,80,114,191,110,39,68),
+(8,5,1,21,22,21,18,24),
+(8,5,2,21,22,21,19,25),
+(8,5,3,21,22,22,21,27),
+(8,5,4,21,23,22,22,28),
+(8,5,5,22,23,22,23,29),
+(8,5,6,22,23,23,25,31),
+(8,5,7,22,23,23,26,32),
+(8,5,8,22,24,24,27,34),
+(8,5,9,22,24,24,29,35),
+(8,5,10,22,24,24,30,37),
+(8,5,11,23,24,25,32,38),
+(8,5,12,23,24,25,33,40),
+(8,5,13,23,25,26,35,41),
+(8,5,14,23,25,26,36,43),
+(8,5,15,23,25,26,38,44),
+(8,5,16,24,26,27,39,46),
+(8,5,17,24,26,27,41,47),
+(8,5,18,24,26,28,42,49),
+(8,5,19,24,26,28,44,50),
+(8,5,20,24,27,29,45,52),
+(8,5,21,25,27,29,47,54),
+(8,5,22,25,27,30,48,55),
+(8,5,23,25,28,30,50,57),
+(8,5,24,25,28,31,52,59),
+(8,5,25,25,28,31,53,60),
+(8,5,26,26,28,32,55,62),
+(8,5,27,26,29,32,56,64),
+(8,5,28,26,29,33,58,65),
+(8,5,29,26,29,33,60,67),
+(8,5,30,27,30,34,62,69),
+(8,5,31,27,30,34,63,71),
+(8,5,32,27,30,35,65,73),
+(8,5,33,27,31,35,67,74),
+(8,5,34,28,31,36,68,76),
+(8,5,35,28,32,36,70,78),
+(8,5,36,28,32,37,72,80),
+(8,5,37,29,32,37,74,82),
+(8,5,38,29,33,38,76,84),
+(8,5,39,29,33,38,77,86),
+(8,5,40,29,33,39,79,87),
+(8,5,41,30,34,40,81,89),
+(8,5,42,30,34,40,83,91),
+(8,5,43,30,35,41,85,93),
+(8,5,44,31,35,41,87,95),
+(8,5,45,31,35,42,89,97),
+(8,5,46,31,36,43,91,99),
+(8,5,47,32,36,43,93,101),
+(8,5,48,32,37,44,94,103),
+(8,5,49,32,37,44,96,105),
+(8,5,50,33,37,45,98,107),
+(8,5,51,33,38,46,100,110),
+(8,5,52,33,38,46,102,112),
+(8,5,53,34,39,47,104,114),
+(8,5,54,34,39,48,106,116),
+(8,5,55,34,40,48,109,118),
+(8,5,56,35,40,49,111,120),
+(8,5,57,35,41,50,113,122),
+(8,5,58,35,41,50,115,125),
+(8,5,59,36,42,51,117,127),
+(8,5,60,36,42,52,119,129),
+(8,5,61,36,42,52,121,131),
+(8,5,62,37,43,53,123,133),
+(8,5,63,37,43,54,125,136),
+(8,5,64,38,44,55,128,138),
+(8,5,65,38,44,55,130,140),
+(8,5,66,38,45,56,132,143),
+(8,5,67,39,45,57,134,145),
+(8,5,68,39,46,58,136,147),
+(8,5,69,40,46,58,139,150),
+(8,5,70,40,47,59,141,152),
+(8,5,71,40,48,60,144,155),
+(8,5,72,41,48,60,147,158),
+(8,5,73,41,49,61,150,161),
+(8,5,74,42,49,62,152,164),
+(8,5,75,42,50,63,155,167),
+(8,5,76,42,51,64,158,170),
+(8,5,77,43,51,65,161,173),
+(8,5,78,43,52,66,164,176),
+(8,5,79,44,52,67,167,179),
+(8,5,80,44,53,68,170,182),
+(8,6,1,24,22,23,16,21),
+(8,6,2,25,23,24,16,21),
+(8,6,3,27,24,25,16,22),
+(8,6,4,28,24,26,16,22),
+(8,6,5,29,25,28,16,22),
+(8,6,6,31,26,29,16,22),
+(8,6,7,32,27,30,17,23),
+(8,6,8,33,28,31,17,23),
+(8,6,9,35,28,33,17,23),
+(8,6,10,36,29,34,17,24),
+(8,6,11,37,30,35,17,24),
+(8,6,12,39,31,36,17,24),
+(8,6,13,40,32,38,17,25),
+(8,6,14,42,33,39,17,25),
+(8,6,15,43,34,40,18,25),
+(8,6,16,45,35,42,18,26),
+(8,6,17,46,35,43,18,26),
+(8,6,18,48,36,44,18,26),
+(8,6,19,49,37,46,18,27),
+(8,6,20,51,38,47,18,27),
+(8,6,21,52,39,49,18,27),
+(8,6,22,54,40,50,18,28),
+(8,6,23,55,41,51,19,28),
+(8,6,24,57,42,53,19,29),
+(8,6,25,59,43,54,19,29),
+(8,6,26,60,44,56,19,29),
+(8,6,27,62,45,57,19,30),
+(8,6,28,63,46,59,19,30),
+(8,6,29,65,47,60,20,31),
+(8,6,30,67,48,62,20,31),
+(8,6,31,69,49,63,20,31),
+(8,6,32,70,50,65,20,32),
+(8,6,33,72,51,67,20,32),
+(8,6,34,74,53,68,20,33),
+(8,6,35,75,54,70,21,33),
+(8,6,36,77,55,71,21,34),
+(8,6,37,79,56,73,21,34),
+(8,6,38,81,57,75,21,35),
+(8,6,39,83,58,76,21,35),
+(8,6,40,84,59,78,22,35),
+(8,6,41,86,60,80,22,36),
+(8,6,42,88,62,81,22,36),
+(8,6,43,90,63,83,22,37),
+(8,6,44,92,64,85,22,37),
+(8,6,45,94,65,86,23,38),
+(8,6,46,96,66,88,23,38),
+(8,6,47,98,67,90,23,39),
+(8,6,48,100,69,92,23,39),
+(8,6,49,102,70,93,24,40),
+(8,6,50,103,71,95,24,40),
+(8,6,51,105,72,96,24,41),
+(8,6,52,106,74,97,24,42),
+(8,6,53,107,73,98,25,42),
+(8,6,54,108,74,99,25,43),
+(8,6,55,109,75,100,25,43),
+(8,6,56,112,77,103,25,44),
+(8,6,57,114,78,105,25,44),
+(8,6,58,118,79,107,26,45),
+(8,6,59,119,81,109,26,45),
+(8,6,60,121,82,111,26,46),
+(8,6,61,123,83,113,26,47),
+(8,6,62,126,85,115,26,47),
+(8,6,63,128,86,118,27,48),
+(8,6,64,131,88,120,27,48),
+(8,6,65,138,89,122,27,49),
+(8,6,66,140,91,125,27,50),
+(8,6,67,143,92,127,28,50),
+(8,6,68,145,94,129,28,51),
+(8,6,69,148,95,132,28,52),
+(8,6,70,151,97,134,28,52),
+(8,6,71,154,99,137,29,53),
+(8,6,72,156,100,139,29,54),
+(8,6,73,159,102,142,29,55),
+(8,6,74,162,104,144,29,55),
+(8,6,75,165,105,147,30,56),
+(8,6,76,168,107,150,30,57),
+(8,6,77,169,109,153,30,58),
+(8,6,78,170,110,155,30,58),
+(8,6,79,178,112,158,31,59),
+(8,6,80,181,114,161,31,60),
+(8,7,1,22,22,22,17,23),
+(8,7,2,23,22,23,18,24),
+(8,7,3,24,23,24,19,25),
+(8,7,4,25,23,25,20,26),
+(8,7,5,25,24,26,21,27),
+(8,7,6,26,24,27,22,28),
+(8,7,7,27,25,28,23,29),
+(8,7,8,28,25,29,24,30),
+(8,7,9,29,25,30,25,31),
+(8,7,10,30,26,31,26,33),
+(8,7,11,31,26,32,27,34),
+(8,7,12,32,27,33,28,35),
+(8,7,13,33,27,34,29,36),
+(8,7,14,34,28,35,30,37),
+(8,7,15,34,28,36,31,38),
+(8,7,16,35,29,38,32,39),
+(8,7,17,36,29,39,33,41),
+(8,7,18,37,30,40,34,42),
+(8,7,19,38,30,41,35,43),
+(8,7,20,39,31,42,36,44),
+(8,7,21,40,32,43,37,45),
+(8,7,22,41,32,45,38,47),
+(8,7,23,43,33,46,39,48),
+(8,7,24,44,33,47,40,49),
+(8,7,25,45,34,48,42,51),
+(8,7,26,46,34,49,43,52),
+(8,7,27,47,35,51,44,53),
+(8,7,28,48,35,52,45,54),
+(8,7,29,49,36,53,46,56),
+(8,7,30,50,37,54,48,57),
+(8,7,31,51,37,56,49,59),
+(8,7,32,52,38,57,50,60),
+(8,7,33,53,38,58,51,61),
+(8,7,34,55,39,60,52,63),
+(8,7,35,56,40,61,54,64),
+(8,7,36,57,40,62,55,66),
+(8,7,37,58,41,64,56,67),
+(8,7,38,59,42,65,57,68),
+(8,7,39,61,42,66,59,70),
+(8,7,40,62,43,68,60,71),
+(8,7,41,63,44,69,61,73),
+(8,7,42,64,44,71,63,74),
+(8,7,43,65,45,72,64,76),
+(8,7,44,67,46,74,65,77),
+(8,7,45,68,46,75,67,79),
+(8,7,46,69,47,76,68,80),
+(8,7,47,71,48,78,69,82),
+(8,7,48,72,49,79,71,83),
+(8,7,49,73,49,81,72,85),
+(8,7,50,74,50,82,74,87),
+(8,7,51,76,51,84,75,88),
+(8,7,52,77,51,85,77,90),
+(8,7,53,78,52,87,78,92),
+(8,7,54,80,53,89,79,93),
+(8,7,55,81,54,90,81,95),
+(8,7,56,83,55,92,82,96),
+(8,7,57,84,55,93,84,98),
+(8,7,58,85,56,95,85,100),
+(8,7,59,87,57,97,87,102),
+(8,7,60,88,58,98,88,103),
+(8,7,61,90,58,100,90,105),
+(8,7,62,91,59,101,91,107),
+(8,7,63,93,60,103,93,108),
+(8,7,64,94,61,105,94,110),
+(8,7,65,95,62,106,96,112),
+(8,7,66,97,63,108,98,114),
+(8,7,67,98,63,110,99,116),
+(8,7,68,100,64,112,101,117),
+(8,7,69,101,65,113,102,119),
+(8,7,70,103,66,115,104,121),
+(8,7,71,104,67,117,116,123),
+(8,7,72,106,68,119,118,126),
+(8,7,73,108,69,121,121,128),
+(8,7,74,110,70,124,123,130),
+(8,7,75,112,71,126,125,132),
+(8,7,76,114,72,128,127,135),
+(8,7,77,115,73,130,129,137),
+(8,7,78,117,74,132,132,139),
+(8,7,79,119,75,135,134,142),
+(8,7,80,121,76,137,136,144),
+(8,8,1,21,22,21,19,23),
+(8,8,2,21,22,21,20,24),
+(8,8,3,21,22,22,22,26),
+(8,8,4,21,22,22,23,27),
+(8,8,5,21,23,22,25,28),
+(8,8,6,21,23,22,26,30),
+(8,8,7,21,23,23,27,31),
+(8,8,8,22,23,23,29,32),
+(8,8,9,22,23,23,30,34),
+(8,8,10,22,23,24,32,35),
+(8,8,11,22,24,24,33,37),
+(8,8,12,22,24,24,35,38),
+(8,8,13,22,24,25,36,39),
+(8,8,14,22,24,25,38,41),
+(8,8,15,22,24,25,39,42),
+(8,8,16,22,24,26,41,44),
+(8,8,17,23,25,26,42,45),
+(8,8,18,23,25,26,44,47),
+(8,8,19,23,25,27,46,48),
+(8,8,20,23,25,27,47,50),
+(8,8,21,23,25,27,49,51),
+(8,8,22,23,26,28,51,53),
+(8,8,23,23,26,28,52,55),
+(8,8,24,24,26,29,54,56),
+(8,8,25,24,26,29,56,58),
+(8,8,26,24,27,29,57,60),
+(8,8,27,24,27,30,59,61),
+(8,8,28,24,27,30,61,63),
+(8,8,29,24,27,31,63,65),
+(8,8,30,24,28,31,64,66),
+(8,8,31,25,28,31,66,68),
+(8,8,32,25,28,32,68,70),
+(8,8,33,25,28,32,70,71),
+(8,8,34,25,29,33,71,73),
+(8,8,35,25,29,33,73,75),
+(8,8,36,26,29,34,75,77),
+(8,8,37,26,29,34,77,79),
+(8,8,38,26,30,35,79,80),
+(8,8,39,26,30,35,81,82),
+(8,8,40,26,30,35,83,84),
+(8,8,41,27,31,36,85,86),
+(8,8,42,27,31,36,87,88),
+(8,8,43,27,31,37,89,90),
+(8,8,44,27,32,37,91,91),
+(8,8,45,27,32,38,93,93),
+(8,8,46,28,32,38,95,95),
+(8,8,47,28,32,39,97,97),
+(8,8,48,28,33,39,99,99),
+(8,8,49,28,33,40,101,101),
+(8,8,50,29,33,40,103,103),
+(8,8,51,29,34,41,105,105),
+(8,8,52,29,34,42,107,107),
+(8,8,53,29,35,42,109,109),
+(8,8,54,30,35,43,111,111),
+(8,8,55,30,35,43,113,113),
+(8,8,56,30,36,44,115,115),
+(8,8,57,30,36,44,118,118),
+(8,8,58,31,36,45,120,120),
+(8,8,59,31,37,45,122,122),
+(8,8,60,31,37,46,124,124),
+(8,8,61,31,37,47,126,126),
+(8,8,62,32,38,47,129,128),
+(8,8,63,32,38,48,131,130),
+(8,8,64,32,39,48,133,133),
+(8,8,65,33,39,49,135,135),
+(8,8,66,33,39,50,138,137),
+(8,8,67,33,40,50,140,139),
+(8,8,68,33,40,51,142,141),
+(8,8,69,34,41,51,145,144),
+(8,8,70,34,41,52,147,146),
+(8,8,71,34,41,53,150,149),
+(8,8,72,34,42,54,153,152),
+(8,8,73,34,42,55,156,155),
+(8,8,74,35,43,55,159,157),
+(8,8,75,35,43,56,162,160),
+(8,8,76,35,43,57,168,163),
+(8,8,77,36,44,58,168,166),
+(8,8,78,36,44,58,171,169),
+(8,8,79,36,45,59,177,172),
+(8,8,80,37,45,60,177,175),
+(10,2,1,19,22,21,24,20),
+(10,2,2,20,23,22,25,21),
+(10,2,3,21,23,23,25,21),
+(10,2,4,22,24,24,26,22),
+(10,2,5,23,24,25,27,23),
+(10,2,6,25,25,26,27,24),
+(10,2,7,26,25,27,28,24),
+(10,2,8,27,26,28,29,25),
+(10,2,9,28,27,29,29,26),
+(10,2,10,29,27,31,30,26),
+(10,2,11,30,28,32,31,27),
+(10,2,12,32,29,33,31,28),
+(10,2,13,33,29,34,32,29),
+(10,2,14,34,30,35,33,30),
+(10,2,15,35,31,36,33,30),
+(10,2,16,37,31,37,34,31),
+(10,2,17,38,32,39,35,32),
+(10,2,18,39,33,40,36,33),
+(10,2,19,40,33,41,36,34),
+(10,2,20,42,34,42,37,35),
+(10,2,21,43,35,44,38,35),
+(10,2,22,44,35,45,39,36),
+(10,2,23,46,36,46,40,37),
+(10,2,24,47,37,47,40,38),
+(10,2,25,49,38,49,41,39),
+(10,2,26,50,38,50,42,40),
+(10,2,27,51,39,51,43,41),
+(10,2,28,53,40,53,44,42),
+(10,2,29,54,41,54,45,43),
+(10,2,30,56,41,55,45,43),
+(10,2,31,57,42,57,46,44),
+(10,2,32,58,43,58,47,45),
+(10,2,33,60,44,59,48,46),
+(10,2,34,61,45,61,49,47),
+(10,2,35,63,45,62,50,48),
+(10,2,36,64,46,64,51,49),
+(10,2,37,66,47,65,52,50),
+(10,2,38,67,48,67,53,51),
+(10,2,39,69,49,68,54,52),
+(10,2,40,71,50,69,55,53),
+(10,2,41,72,50,71,55,54),
+(10,2,42,74,51,72,56,55),
+(10,2,43,75,52,74,57,56),
+(10,2,44,77,53,75,58,57),
+(10,2,45,79,54,77,59,59),
+(10,2,46,80,55,78,60,60),
+(10,2,47,82,56,80,61,61),
+(10,2,48,83,57,82,62,62),
+(10,2,49,85,58,83,63,63),
+(10,2,50,87,59,85,64,64),
+(10,2,51,89,60,86,66,65),
+(10,2,52,90,61,88,67,66),
+(10,2,53,92,61,90,68,67),
+(10,2,54,94,62,91,69,69),
+(10,2,55,95,63,93,70,70),
+(10,2,56,97,64,95,71,71),
+(10,2,57,99,65,96,72,72),
+(10,2,58,101,66,98,73,73),
+(10,2,59,102,67,100,74,74),
+(10,2,60,104,68,101,75,76),
+(10,2,61,106,69,103,76,77),
+(10,2,62,108,70,105,78,78),
+(10,2,63,110,72,106,79,79),
+(10,2,64,112,73,108,80,80),
+(10,2,65,113,74,110,81,82),
+(10,2,66,115,75,112,82,83),
+(10,2,67,117,76,114,83,84),
+(10,2,68,119,77,115,85,85),
+(10,2,69,121,78,117,86,87),
+(10,2,70,123,79,119,87,88),
+(10,2,71,125,80,120,88,89),
+(10,2,72,128,81,123,90,91),
+(10,2,73,130,82,125,91,93),
+(10,2,74,133,84,127,93,94),
+(10,2,75,135,85,129,94,96),
+(10,2,76,137,86,132,96,97),
+(10,2,77,140,88,134,97,99),
+(10,2,78,143,89,136,99,101),
+(10,2,79,145,90,139,100,102),
+(10,2,80,148,92,141,102,104),
+(10,3,1,17,25,20,24,20),
+(10,3,2,17,26,21,25,21),
+(10,3,3,18,28,22,25,21),
+(10,3,4,18,29,23,26,22),
+(10,3,5,19,30,24,26,23),
+(10,3,6,19,32,25,27,23),
+(10,3,7,20,33,26,27,24),
+(10,3,8,20,35,27,28,25),
+(10,3,9,21,36,27,29,25),
+(10,3,10,21,38,28,29,26),
+(10,3,11,22,39,29,30,27),
+(10,3,12,22,41,30,31,27),
+(10,3,13,23,42,31,31,28),
+(10,3,14,23,44,32,32,29),
+(10,3,15,24,45,34,32,29),
+(10,3,16,24,47,35,33,30),
+(10,3,17,25,48,36,34,31),
+(10,3,18,25,50,37,34,32),
+(10,3,19,26,51,38,35,32),
+(10,3,20,26,53,39,36,33),
+(10,3,21,27,55,40,37,34),
+(10,3,22,27,56,41,37,35),
+(10,3,23,28,58,42,38,36),
+(10,3,24,28,60,43,39,36),
+(10,3,25,29,61,44,39,37),
+(10,3,26,30,63,46,40,38),
+(10,3,27,30,65,47,41,39),
+(10,3,28,31,66,48,42,40),
+(10,3,29,31,68,49,42,40),
+(10,3,30,32,70,50,43,41),
+(10,3,31,33,72,52,44,42),
+(10,3,32,33,73,53,45,43),
+(10,3,33,34,75,54,46,44),
+(10,3,34,34,77,55,46,45),
+(10,3,35,35,79,57,47,46),
+(10,3,36,36,81,58,48,47),
+(10,3,37,36,83,59,49,47),
+(10,3,38,37,85,60,50,48),
+(10,3,39,38,86,62,51,49),
+(10,3,40,38,88,63,51,50),
+(10,3,41,39,90,64,52,51),
+(10,3,42,40,92,66,53,52),
+(10,3,43,40,94,67,54,53),
+(10,3,44,41,96,68,55,54),
+(10,3,45,42,98,70,56,55),
+(10,3,46,42,100,71,57,56),
+(10,3,47,43,102,72,58,57),
+(10,3,48,44,104,74,59,58),
+(10,3,49,45,106,75,60,59),
+(10,3,50,45,108,77,61,60),
+(10,3,51,46,110,78,61,61),
+(10,3,52,47,113,79,62,62),
+(10,3,53,47,115,81,63,63),
+(10,3,54,48,117,82,64,64),
+(10,3,55,49,119,84,65,65),
+(10,3,56,50,121,85,66,66),
+(10,3,57,50,123,87,67,67),
+(10,3,58,51,126,88,68,68),
+(10,3,59,52,128,90,69,70),
+(10,3,60,53,130,91,70,71),
+(10,3,61,54,132,93,71,72),
+(10,3,62,54,134,94,72,73),
+(10,3,63,55,137,96,73,74),
+(10,3,64,56,139,97,75,75),
+(10,3,65,57,141,99,76,76),
+(10,3,66,58,144,101,77,77),
+(10,3,67,58,146,102,78,78),
+(10,3,68,59,148,104,79,80),
+(10,3,69,60,151,105,80,81),
+(10,3,70,61,153,107,81,82),
+(10,3,71,62,156,108,82,83),
+(10,3,72,63,159,110,83,84),
+(10,3,73,64,162,112,84,86),
+(10,3,74,65,165,114,86,87),
+(10,3,75,66,168,116,87,89),
+(10,3,76,67,171,118,89,90),
+(10,3,77,68,174,120,90,92),
+(10,3,78,69,177,122,91,93),
+(10,3,79,70,180,124,92,95),
+(10,3,80,71,183,126,94,96),
+(10,4,1,18,25,20,24,19),
+(10,4,2,19,26,21,24,19),
+(10,4,3,20,28,21,24,20),
+(10,4,4,20,29,22,24,20),
+(10,4,5,21,31,23,25,20),
+(10,4,6,22,32,24,25,21),
+(10,4,7,23,34,24,25,21),
+(10,4,8,24,35,25,25,22),
+(10,4,9,24,37,26,25,22),
+(10,4,10,25,38,26,25,22),
+(10,4,11,26,40,27,25,23),
+(10,4,12,27,41,28,26,23),
+(10,4,13,28,43,29,26,24),
+(10,4,14,29,45,30,26,24),
+(10,4,15,29,46,30,26,25),
+(10,4,16,30,48,31,26,25),
+(10,4,17,31,50,32,27,25),
+(10,4,18,32,51,33,27,26),
+(10,4,19,33,53,34,27,26),
+(10,4,20,34,55,35,27,27),
+(10,4,21,35,56,35,27,27),
+(10,4,22,36,58,36,28,28),
+(10,4,23,37,60,37,28,28),
+(10,4,24,38,62,38,28,29),
+(10,4,25,39,63,39,28,29),
+(10,4,26,40,65,40,29,30),
+(10,4,27,41,67,41,29,30),
+(10,4,28,42,69,42,29,31),
+(10,4,29,43,71,43,29,31),
+(10,4,30,44,72,43,29,32),
+(10,4,31,45,74,44,30,32),
+(10,4,32,46,76,45,30,33),
+(10,4,33,47,78,46,30,33),
+(10,4,34,48,80,47,31,34),
+(10,4,35,49,82,48,31,34),
+(10,4,36,50,84,49,31,35),
+(10,4,37,51,86,50,31,35),
+(10,4,38,52,88,51,32,36),
+(10,4,39,53,90,52,32,37),
+(10,4,40,54,92,53,32,37),
+(10,4,41,56,94,54,33,38),
+(10,4,42,57,96,55,33,38),
+(10,4,43,58,98,56,33,39),
+(10,4,44,59,100,57,33,39),
+(10,4,45,60,102,59,34,40),
+(10,4,46,61,104,60,34,41),
+(10,4,47,62,107,61,34,41),
+(10,4,48,64,109,62,35,42),
+(10,4,49,65,111,63,35,43),
+(10,4,50,66,113,64,35,43),
+(10,4,51,67,115,65,36,44),
+(10,4,52,68,117,66,36,44),
+(10,4,53,70,120,67,36,45),
+(10,4,54,71,122,69,37,46),
+(10,4,55,72,124,70,37,46),
+(10,4,56,73,126,71,37,47),
+(10,4,57,75,129,72,38,48),
+(10,4,58,76,131,73,38,48),
+(10,4,59,77,133,74,39,49),
+(10,4,60,79,136,76,39,50),
+(10,4,61,80,138,77,39,51),
+(10,4,62,81,140,78,40,51),
+(10,4,63,82,143,79,40,52),
+(10,4,64,84,145,80,41,53),
+(10,4,65,85,148,82,41,53),
+(10,4,66,87,150,83,41,54),
+(10,4,67,88,153,84,42,55),
+(10,4,68,89,155,85,42,56),
+(10,4,69,91,157,87,43,56),
+(10,4,70,92,160,88,43,57),
+(10,4,71,94,163,88,43,58),
+(10,4,72,96,166,90,44,58),
+(10,4,73,97,169,92,44,59),
+(10,4,74,99,172,93,45,60),
+(10,4,75,101,175,95,45,61),
+(10,4,76,102,178,96,45,62),
+(10,4,77,104,181,101,46,63),
+(10,4,78,106,185,104,46,64),
+(10,4,79,108,188,105,47,65),
+(10,4,80,110,191,107,47,66),
+(10,5,1,17,22,19,26,22),
+(10,5,2,17,22,19,27,23),
+(10,5,3,17,22,20,29,25),
+(10,5,4,17,23,20,30,26),
+(10,5,5,18,23,20,31,27),
+(10,5,6,18,23,21,33,29),
+(10,5,7,18,23,21,34,30),
+(10,5,8,18,24,22,35,32),
+(10,5,9,18,24,22,37,33),
+(10,5,10,19,24,22,38,35),
+(10,5,11,19,24,23,39,36),
+(10,5,12,19,24,23,41,38),
+(10,5,13,19,25,24,42,39),
+(10,5,14,19,25,24,44,41),
+(10,5,15,19,25,25,45,42),
+(10,5,16,20,26,25,47,44),
+(10,5,17,20,26,25,48,45),
+(10,5,18,20,26,26,50,47),
+(10,5,19,20,26,26,51,49),
+(10,5,20,21,27,27,53,50),
+(10,5,21,21,27,27,54,52),
+(10,5,22,21,27,28,56,53),
+(10,5,23,21,28,28,58,55),
+(10,5,24,21,28,29,59,57),
+(10,5,25,22,28,29,61,58),
+(10,5,26,22,28,30,62,60),
+(10,5,27,22,29,30,64,62),
+(10,5,28,22,29,31,66,64),
+(10,5,29,23,29,31,67,65),
+(10,5,30,23,30,32,69,67),
+(10,5,31,23,30,32,71,69),
+(10,5,32,23,30,33,72,71),
+(10,5,33,24,31,33,74,72),
+(10,5,34,24,31,34,76,74),
+(10,5,35,24,32,34,78,76),
+(10,5,36,24,32,35,80,78),
+(10,5,37,25,32,35,81,80),
+(10,5,38,25,33,36,83,82),
+(10,5,39,25,33,37,85,84),
+(10,5,40,26,33,37,87,86),
+(10,5,41,26,34,38,89,88),
+(10,5,42,26,34,38,91,89),
+(10,5,43,27,35,39,92,91),
+(10,5,44,27,35,39,94,93),
+(10,5,45,27,35,40,96,95),
+(10,5,46,27,36,41,98,97),
+(10,5,47,28,36,41,100,99),
+(10,5,48,28,37,42,102,101),
+(10,5,49,28,37,43,104,103),
+(10,5,50,29,37,43,106,106),
+(10,5,51,29,38,44,108,108),
+(10,5,52,29,38,44,110,110),
+(10,5,53,30,39,45,112,112),
+(10,5,54,30,39,46,114,114),
+(10,5,55,30,40,46,116,116),
+(10,5,56,31,40,47,118,118),
+(10,5,57,31,41,48,120,120),
+(10,5,58,31,41,48,123,123),
+(10,5,59,32,42,49,125,125),
+(10,5,60,32,42,50,127,127),
+(10,5,61,33,42,51,129,129),
+(10,5,62,33,43,51,131,131),
+(10,5,63,33,43,52,133,134),
+(10,5,64,34,44,53,135,136),
+(10,5,65,34,44,53,138,138),
+(10,5,66,34,45,54,140,141),
+(10,5,67,35,45,55,142,143),
+(10,5,68,35,46,56,144,145),
+(10,5,69,36,46,56,147,148),
+(10,5,70,36,47,57,149,150),
+(10,5,71,36,48,57,152,153),
+(10,5,72,37,48,57,155,156),
+(10,5,73,37,49,58,158,159),
+(10,5,74,38,49,59,160,163),
+(10,5,75,38,50,60,163,165),
+(10,5,76,38,51,61,166,170),
+(10,5,77,39,51,62,168,175),
+(10,5,78,39,52,63,172,174),
+(10,5,79,40,52,64,175,177),
+(10,5,80,40,53,65,178,180),
+(10,6,1,18,23,21,24,20),
+(10,6,2,19,24,22,24,20),
+(10,6,3,21,25,23,24,21),
+(10,6,4,22,25,25,24,21),
+(10,6,5,23,26,26,24,21),
+(10,6,6,25,27,27,24,21),
+(10,6,7,26,28,28,24,22),
+(10,6,8,27,29,29,25,22),
+(10,6,9,29,29,31,25,22),
+(10,6,10,30,30,32,25,23),
+(10,6,11,32,31,33,25,23),
+(10,6,12,33,32,34,25,23),
+(10,6,13,34,33,36,25,24),
+(10,6,14,36,34,37,25,24),
+(10,6,15,37,35,38,25,24),
+(10,6,16,39,36,40,25,25),
+(10,6,17,40,36,41,25,25),
+(10,6,18,42,37,43,26,25),
+(10,6,19,43,38,44,26,26),
+(10,6,20,45,39,45,26,26),
+(10,6,21,47,40,47,26,26),
+(10,6,22,48,41,48,26,27),
+(10,6,23,50,42,50,26,27),
+(10,6,24,51,43,51,26,28),
+(10,6,25,53,44,52,27,28),
+(10,6,26,55,45,54,27,28),
+(10,6,27,56,46,55,27,29),
+(10,6,28,58,47,57,27,29),
+(10,6,29,59,48,58,27,30),
+(10,6,30,61,49,60,27,30),
+(10,6,31,63,50,62,27,30),
+(10,6,32,65,51,63,28,31),
+(10,6,33,66,52,65,28,31),
+(10,6,34,68,53,66,28,32),
+(10,6,35,70,55,68,28,32),
+(10,6,36,72,56,69,28,33),
+(10,6,37,73,57,71,29,33),
+(10,6,38,75,58,73,29,34),
+(10,6,39,77,59,74,29,34),
+(10,6,40,79,60,76,29,35),
+(10,6,41,81,61,78,29,35),
+(10,6,42,82,62,79,30,35),
+(10,6,43,84,64,81,30,36),
+(10,6,44,86,65,83,30,36),
+(10,6,45,88,66,85,30,37),
+(10,6,46,90,67,86,30,37),
+(10,6,47,92,68,88,31,38),
+(10,6,48,94,69,90,31,38),
+(10,6,49,96,69,92,31,39),
+(10,6,50,98,70,93,31,40),
+(10,6,51,100,71,95,32,40),
+(10,6,52,102,72,96,32,41),
+(10,6,53,103,73,97,32,41),
+(10,6,54,104,74,98,32,41),
+(10,6,55,105,75,97,33,41),
+(10,6,56,108,77,100,33,42),
+(10,6,57,113,78,102,33,42),
+(10,6,58,115,79,104,34,43),
+(10,6,59,117,81,106,34,43),
+(10,6,60,118,82,108,34,44),
+(10,6,61,119,83,110,34,45),
+(10,6,62,121,85,112,34,45),
+(10,6,63,124,86,115,35,46),
+(10,6,64,127,88,117,35,46),
+(10,6,65,133,89,119,35,47),
+(10,6,66,135,91,122,35,48),
+(10,6,67,139,92,124,36,48),
+(10,6,68,141,94,126,36,49),
+(10,6,69,142,95,129,36,50),
+(10,6,70,145,97,131,36,50),
+(10,6,71,150,99,134,37,51),
+(10,6,72,152,100,136,37,52),
+(10,6,73,155,102,139,37,53),
+(10,6,74,158,104,141,37,53),
+(10,6,75,159,105,144,38,54),
+(10,6,76,160,107,147,38,55),
+(10,6,77,163,109,149,38,56),
+(10,6,78,166,110,152,38,56),
+(10,6,79,169,112,155,39,57),
+(10,6,80,172,114,158,39,58),
+(10,8,1,17,22,19,27,21),
+(10,8,2,17,22,19,28,22),
+(10,8,3,17,22,20,30,24),
+(10,8,4,17,22,20,31,25),
+(10,8,5,17,23,20,32,26),
+(10,8,6,17,23,20,34,28),
+(10,8,7,18,23,21,35,29),
+(10,8,8,18,23,21,37,30),
+(10,8,9,18,23,21,38,32),
+(10,8,10,18,23,22,40,33),
+(10,8,11,18,24,22,41,35),
+(10,8,12,18,24,22,42,36),
+(10,8,13,18,24,23,44,37),
+(10,8,14,18,24,23,45,39),
+(10,8,15,18,24,23,47,40),
+(10,8,16,19,24,24,49,42),
+(10,8,17,19,25,24,50,43),
+(10,8,18,19,25,24,52,45),
+(10,8,19,19,25,25,53,46),
+(10,8,20,19,25,25,55,48),
+(10,8,21,19,25,26,57,50),
+(10,8,22,19,26,26,58,51),
+(10,8,23,20,26,26,60,53),
+(10,8,24,20,26,27,61,54),
+(10,8,25,20,26,27,63,56),
+(10,8,26,20,27,27,65,58),
+(10,8,27,20,27,28,67,59),
+(10,8,28,20,27,28,68,61),
+(10,8,29,21,27,29,70,63),
+(10,8,30,21,28,29,72,64),
+(10,8,31,21,28,30,74,66),
+(10,8,32,21,28,30,75,68),
+(10,8,33,21,28,30,77,70),
+(10,8,34,21,29,31,79,71),
+(10,8,35,22,29,31,81,73),
+(10,8,36,22,29,32,83,75),
+(10,8,37,22,29,32,85,77),
+(10,8,38,22,30,33,86,78),
+(10,8,39,22,30,33,88,80),
+(10,8,40,23,30,34,90,82),
+(10,8,41,23,31,34,92,84),
+(10,8,42,23,31,35,94,86),
+(10,8,43,23,31,35,96,88),
+(10,8,44,23,32,36,98,90),
+(10,8,45,24,32,36,100,92),
+(10,8,46,24,32,37,102,93),
+(10,8,47,24,32,37,104,95),
+(10,8,48,24,33,38,106,97),
+(10,8,49,25,33,38,108,99),
+(10,8,50,25,33,39,110,101),
+(10,8,51,25,34,39,112,103),
+(10,8,52,25,34,40,114,105),
+(10,8,53,25,35,40,117,107),
+(10,8,54,26,35,41,119,109),
+(10,8,55,26,35,41,121,111),
+(10,8,56,26,36,42,123,113),
+(10,8,57,26,36,42,125,116),
+(10,8,58,27,36,43,127,118),
+(10,8,59,27,37,43,130,120),
+(10,8,60,27,37,44,132,122),
+(10,8,61,27,37,45,134,124),
+(10,8,62,28,38,45,136,126),
+(10,8,63,28,38,46,139,128),
+(10,8,64,28,39,46,141,131),
+(10,8,65,29,39,47,143,133),
+(10,8,66,29,39,48,146,135),
+(10,8,67,29,40,48,148,137),
+(10,8,68,29,40,49,150,139),
+(10,8,69,30,41,49,153,142),
+(10,8,70,30,41,50,155,144),
+(10,8,71,30,41,50,158,147),
+(10,8,72,30,42,51,161,150),
+(10,8,73,30,42,52,164,153),
+(10,8,74,31,43,52,167,155),
+(10,8,75,31,43,53,170,158),
+(10,8,76,31,43,54,173,161),
+(10,8,77,32,44,55,176,164),
+(10,8,78,32,44,55,179,167),
+(10,8,79,32,45,56,182,170),
+(10,8,80,33,45,57,185,173),
+(10,9,1,17,22,20,26,21),
+(10,9,2,17,22,21,27,22),
+(10,9,3,18,23,21,28,23),
+(10,9,4,18,23,22,29,24),
+(10,9,5,18,23,22,31,26),
+(10,9,6,18,24,23,32,27),
+(10,9,7,19,24,23,33,28),
+(10,9,8,19,25,24,34,29),
+(10,9,9,19,25,25,36,30),
+(10,9,10,20,25,25,37,32),
+(10,9,11,20,26,26,38,33),
+(10,9,12,20,26,26,39,34),
+(10,9,13,21,27,27,41,36),
+(10,9,14,21,27,28,42,37),
+(10,9,15,21,27,28,43,38),
+(10,9,16,22,28,29,45,39),
+(10,9,17,22,28,30,46,41),
+(10,9,18,23,29,30,47,42),
+(10,9,19,23,29,31,49,43),
+(10,9,20,23,30,32,50,45),
+(10,9,21,24,30,32,51,46),
+(10,9,22,24,31,33,53,48),
+(10,9,23,24,31,34,54,49),
+(10,9,24,25,31,34,56,50),
+(10,9,25,25,32,35,57,52),
+(10,9,26,26,32,36,59,53),
+(10,9,27,26,33,37,60,55),
+(10,9,28,26,33,37,62,56),
+(10,9,29,27,34,38,63,58),
+(10,9,30,27,34,39,65,59),
+(10,9,31,28,35,40,66,61),
+(10,9,32,28,36,40,68,62),
+(10,9,33,29,36,41,69,64),
+(10,9,34,29,37,42,71,65),
+(10,9,35,29,37,43,73,67),
+(10,9,36,30,38,43,74,69),
+(10,9,37,30,38,44,76,70),
+(10,9,38,31,39,45,77,72),
+(10,9,39,31,39,46,79,73),
+(10,9,40,32,40,47,81,75),
+(10,9,41,32,41,48,82,77),
+(10,9,42,33,41,48,84,78),
+(10,9,43,33,42,49,86,80),
+(10,9,44,34,42,50,88,82),
+(10,9,45,34,43,51,89,83),
+(10,9,46,35,44,52,91,85),
+(10,9,47,35,44,53,93,87),
+(10,9,48,36,45,54,95,89),
+(10,9,49,36,45,54,96,90),
+(10,9,50,37,46,55,98,92),
+(10,9,51,37,47,56,100,94),
+(10,9,52,38,47,57,102,96),
+(10,9,53,38,48,58,104,97),
+(10,9,54,39,49,59,105,99),
+(10,9,55,39,49,60,107,101),
+(10,9,56,40,50,61,109,103),
+(10,9,57,40,51,62,111,105),
+(10,9,58,41,51,63,113,107),
+(10,9,59,42,52,64,115,108),
+(10,9,60,42,53,65,117,110),
+(10,9,61,43,53,66,119,112),
+(10,9,62,43,54,67,121,114),
+(10,9,63,44,55,68,123,116),
+(10,9,64,44,56,69,125,118),
+(10,9,65,45,56,70,127,120),
+(10,9,66,46,57,71,129,122),
+(10,9,67,46,58,72,131,124),
+(10,9,68,47,58,73,133,126),
+(10,9,69,47,59,74,135,128),
+(10,9,70,48,60,75,137,130),
+(10,9,71,49,61,83,139,141),
+(10,9,72,50,61,84,142,143),
+(10,9,73,51,62,84,144,146),
+(10,9,74,51,63,86,147,149),
+(10,9,75,52,64,89,149,151),
+(10,9,76,53,65,90,155,154),
+(10,9,77,54,66,91,155,157),
+(10,9,78,54,67,93,157,160),
+(10,9,79,55,68,94,160,163),
+(10,9,80,56,69,95,163,165),
+(11,1,1,24,17,21,21,22),
+(11,1,2,25,18,22,21,22),
+(11,1,3,27,19,23,21,23),
+(11,1,4,28,19,25,21,23),
+(11,1,5,29,20,26,21,23),
+(11,1,6,31,21,27,21,23),
+(11,1,7,32,22,28,21,24),
+(11,1,8,33,23,29,22,24),
+(11,1,9,35,24,31,22,24),
+(11,1,10,36,24,32,22,25),
+(11,1,11,37,25,33,22,25),
+(11,1,12,39,26,34,22,25),
+(11,1,13,40,27,36,22,26),
+(11,1,14,42,28,37,22,26),
+(11,1,15,43,29,38,22,26),
+(11,1,16,45,30,40,22,27),
+(11,1,17,46,31,41,23,27),
+(11,1,18,48,32,43,23,27),
+(11,1,19,49,33,44,23,28),
+(11,1,20,51,34,45,23,28),
+(11,1,21,52,34,47,23,28),
+(11,1,22,54,35,48,23,29),
+(11,1,23,55,36,50,23,29),
+(11,1,24,57,37,51,24,30),
+(11,1,25,59,38,52,24,30),
+(11,1,26,60,39,54,24,30),
+(11,1,27,62,40,55,24,31),
+(11,1,28,63,41,57,24,31),
+(11,1,29,65,43,58,24,32),
+(11,1,30,67,44,60,24,32),
+(11,1,31,69,45,62,25,32),
+(11,1,32,70,46,63,25,33),
+(11,1,33,72,47,65,25,33),
+(11,1,34,74,48,66,25,34),
+(11,1,35,75,49,68,25,34),
+(11,1,36,77,50,69,26,35),
+(11,1,37,79,51,71,26,35),
+(11,1,38,81,52,73,26,35),
+(11,1,39,83,53,74,26,36),
+(11,1,40,84,55,76,26,36),
+(11,1,41,86,56,78,27,37),
+(11,1,42,88,57,79,27,37),
+(11,1,43,90,58,81,27,38),
+(11,1,44,92,59,83,27,38),
+(11,1,45,94,60,85,27,39),
+(11,1,46,96,62,86,28,39),
+(11,1,47,98,63,88,28,40),
+(11,1,48,100,64,90,28,40),
+(11,1,49,102,65,92,28,41),
+(11,1,50,103,66,93,29,41),
+(11,1,51,105,68,95,29,42),
+(11,1,52,107,69,97,29,42),
+(11,1,53,109,70,99,29,43),
+(11,1,54,112,71,101,30,44),
+(11,1,55,114,73,103,30,44),
+(11,1,56,116,74,104,30,45),
+(11,1,57,118,75,106,30,45),
+(11,1,58,120,77,108,31,46),
+(11,1,59,122,78,110,31,46),
+(11,1,60,124,79,112,31,47),
+(11,1,61,126,81,114,31,48),
+(11,1,62,128,82,116,32,48),
+(11,1,63,130,83,118,32,49),
+(11,1,64,133,85,120,32,49),
+(11,1,65,135,86,122,33,50),
+(11,1,66,137,87,124,33,51),
+(11,1,67,139,89,126,33,51),
+(11,1,68,141,90,128,33,52),
+(11,1,69,144,92,130,34,52),
+(11,1,70,146,93,132,34,53),
+(11,1,71,149,94,134,34,54),
+(11,1,72,151,96,137,34,55),
+(11,1,73,154,98,139,34,56),
+(11,1,74,157,99,142,35,56),
+(11,1,75,166,101,149,35,57),
+(11,1,76,172,103,155,35,58),
+(11,1,77,175,105,159,36,59),
+(11,1,78,179,106,161,36,59),
+(11,1,79,182,108,164,36,60),
+(11,1,80,185,110,167,37,61),
+(11,2,1,23,17,21,21,23),
+(11,2,2,24,18,22,22,24),
+(11,2,3,25,18,23,22,24),
+(11,2,4,26,19,24,23,25),
+(11,2,5,27,19,25,24,26),
+(11,2,6,29,20,26,24,26),
+(11,2,7,30,21,27,25,27),
+(11,2,8,31,21,28,26,28),
+(11,2,9,32,22,29,26,29),
+(11,2,10,33,22,31,27,29),
+(11,2,11,34,23,32,28,30),
+(11,2,12,36,24,33,28,31),
+(11,2,13,37,24,34,29,32),
+(11,2,14,38,25,35,30,32),
+(11,2,15,39,26,36,31,33),
+(11,2,16,40,26,37,31,34),
+(11,2,17,42,27,39,32,35),
+(11,2,18,43,28,40,33,36),
+(11,2,19,44,28,41,34,37),
+(11,2,20,46,29,42,34,37),
+(11,2,21,47,30,44,35,38),
+(11,2,22,48,31,45,36,39),
+(11,2,23,50,31,46,37,40),
+(11,2,24,51,32,47,38,41),
+(11,2,25,52,33,49,38,42),
+(11,2,26,54,34,50,39,43),
+(11,2,27,55,34,51,40,44),
+(11,2,28,56,35,53,41,44),
+(11,2,29,58,36,54,42,45),
+(11,2,30,59,37,55,43,46),
+(11,2,31,61,37,57,43,47),
+(11,2,32,62,38,58,44,48),
+(11,2,33,64,39,59,45,49),
+(11,2,34,65,40,61,46,50),
+(11,2,35,67,41,62,47,51),
+(11,2,36,68,42,64,48,52),
+(11,2,37,70,42,65,49,53),
+(11,2,38,71,43,67,50,54),
+(11,2,39,73,44,68,51,55),
+(11,2,40,74,45,69,52,56),
+(11,2,41,76,46,71,53,57),
+(11,2,42,78,47,72,54,58),
+(11,2,43,79,47,74,55,59),
+(11,2,44,81,48,75,56,60),
+(11,2,45,82,49,77,57,61),
+(11,2,46,84,50,78,58,62),
+(11,2,47,86,51,80,59,64),
+(11,2,48,87,52,82,60,65),
+(11,2,49,89,53,83,61,66),
+(11,2,50,91,54,85,62,67),
+(11,2,51,92,55,86,63,68),
+(11,2,52,94,56,88,64,69),
+(11,2,53,96,57,90,65,70),
+(11,2,54,97,58,91,66,71),
+(11,2,55,99,59,93,67,73),
+(11,2,56,101,60,95,68,74),
+(11,2,57,103,61,96,69,75),
+(11,2,58,105,62,98,70,76),
+(11,2,59,106,63,100,71,77),
+(11,2,60,108,64,101,72,78),
+(11,2,61,110,65,103,74,80),
+(11,2,62,112,66,105,75,81),
+(11,2,63,114,67,106,76,82),
+(11,2,64,116,68,108,77,83),
+(11,2,65,117,69,110,78,85),
+(11,2,66,119,70,112,79,86),
+(11,2,67,121,71,114,80,87),
+(11,2,68,123,72,115,82,88),
+(11,2,69,125,73,117,83,90),
+(11,2,70,127,74,119,84,91),
+(11,2,71,130,75,121,87,92),
+(11,2,72,132,76,124,90,94),
+(11,2,73,134,77,126,93,96),
+(11,2,74,137,79,128,97,97),
+(11,2,75,139,80,130,101,99),
+(11,2,76,142,81,133,106,100),
+(11,2,77,144,83,135,108,102),
+(11,2,78,147,84,137,110,104),
+(11,2,79,149,85,140,111,105),
+(11,2,80,152,87,142,113,107),
+(11,3,1,21,20,20,21,23),
+(11,3,2,21,21,21,22,24),
+(11,3,3,22,23,22,22,24),
+(11,3,4,22,24,23,23,25),
+(11,3,5,23,25,24,23,25),
+(11,3,6,23,27,25,24,26),
+(11,3,7,24,28,26,24,27),
+(11,3,8,24,30,27,25,27),
+(11,3,9,25,31,27,26,28),
+(11,3,10,25,33,28,26,29),
+(11,3,11,25,34,29,27,29),
+(11,3,12,26,36,30,28,30),
+(11,3,13,26,37,31,28,31),
+(11,3,14,27,39,32,29,32),
+(11,3,15,27,40,34,30,32),
+(11,3,16,28,42,35,30,33),
+(11,3,17,28,43,36,31,34),
+(11,3,18,29,45,37,32,35),
+(11,3,19,29,47,38,32,35),
+(11,3,20,30,48,39,33,36),
+(11,3,21,31,50,40,34,37),
+(11,3,22,31,51,41,34,38),
+(11,3,23,32,53,42,35,38),
+(11,3,24,32,55,43,36,39),
+(11,3,25,33,57,44,37,40),
+(11,3,26,33,58,46,37,41),
+(11,3,27,34,60,47,38,42),
+(11,3,28,35,62,48,39,42),
+(11,3,29,35,63,49,40,43),
+(11,3,30,36,65,50,40,44),
+(11,3,31,36,67,52,41,45),
+(11,3,32,37,69,53,42,46),
+(11,3,33,38,71,54,43,47),
+(11,3,34,38,72,55,44,48),
+(11,3,35,39,74,57,44,48),
+(11,3,36,39,76,58,45,49),
+(11,3,37,40,78,59,46,50),
+(11,3,38,41,80,60,47,51),
+(11,3,39,41,82,62,48,52),
+(11,3,40,42,84,63,49,53),
+(11,3,41,43,86,64,50,54),
+(11,3,42,43,88,66,50,55),
+(11,3,43,44,90,67,51,56),
+(11,3,44,45,91,68,52,57),
+(11,3,45,45,93,70,53,58),
+(11,3,46,46,95,71,54,59),
+(11,3,47,47,98,72,55,60),
+(11,3,48,48,100,74,56,61),
+(11,3,49,48,102,75,57,62),
+(11,3,50,49,104,77,58,63),
+(11,3,51,50,106,78,59,64),
+(11,3,52,51,108,79,60,65),
+(11,3,53,51,110,81,61,66),
+(11,3,54,52,112,82,61,67),
+(11,3,55,53,114,84,62,68),
+(11,3,56,54,116,85,63,69),
+(11,3,57,54,118,87,64,70),
+(11,3,58,55,121,88,65,71),
+(11,3,59,56,123,90,66,72),
+(11,3,60,57,125,91,67,74),
+(11,3,61,58,127,93,68,75),
+(11,3,62,58,130,94,69,76),
+(11,3,63,59,132,96,71,77),
+(11,3,64,60,134,97,72,78),
+(11,3,65,61,136,99,73,79),
+(11,3,66,62,139,101,74,80),
+(11,3,67,62,141,102,75,81),
+(11,3,68,63,143,104,76,83),
+(11,3,69,64,146,105,77,84),
+(11,3,70,65,148,107,78,85),
+(11,3,71,66,151,109,79,86),
+(11,3,72,67,154,111,80,87),
+(11,3,73,68,157,113,81,89),
+(11,3,74,69,160,115,83,90),
+(11,3,75,70,163,117,84,92),
+(11,3,76,71,166,119,85,93),
+(11,3,77,72,169,121,87,95),
+(11,3,78,73,172,123,88,96),
+(11,3,79,74,175,125,89,98),
+(11,3,80,75,178,127,91,99),
+(11,5,1,21,17,19,23,25),
+(11,5,2,21,17,19,24,26),
+(11,5,3,21,17,20,26,28),
+(11,5,4,21,18,20,27,29),
+(11,5,5,22,18,20,28,30),
+(11,5,6,22,18,21,30,32),
+(11,5,7,22,18,21,31,33),
+(11,5,8,22,19,22,32,35),
+(11,5,9,22,19,22,34,36),
+(11,5,10,22,19,22,35,38),
+(11,5,11,23,19,23,37,39),
+(11,5,12,23,20,23,38,41),
+(11,5,13,23,20,24,39,42),
+(11,5,14,23,20,24,41,44),
+(11,5,15,23,20,25,42,45),
+(11,5,16,24,21,25,44,47),
+(11,5,17,24,21,25,45,48),
+(11,5,18,24,21,26,47,50),
+(11,5,19,24,22,26,48,51),
+(11,5,20,24,22,27,50,53),
+(11,5,21,25,22,27,51,55),
+(11,5,22,25,22,28,53,56),
+(11,5,23,25,23,28,55,58),
+(11,5,24,25,23,29,56,60),
+(11,5,25,25,23,29,58,61),
+(11,5,26,26,24,30,60,63),
+(11,5,27,26,24,30,61,65),
+(11,5,28,26,24,31,63,66),
+(11,5,29,26,25,31,65,68),
+(11,5,30,27,25,32,66,70),
+(11,5,31,27,25,32,68,72),
+(11,5,32,27,26,33,70,73),
+(11,5,33,27,26,33,71,75),
+(11,5,34,28,26,34,73,77),
+(11,5,35,28,27,34,75,79),
+(11,5,36,28,27,35,77,81),
+(11,5,37,29,28,35,79,83),
+(11,5,38,29,28,36,80,85),
+(11,5,39,29,28,37,82,86),
+(11,5,40,29,29,37,84,88),
+(11,5,41,30,29,38,86,90),
+(11,5,42,30,29,38,88,92),
+(11,5,43,30,30,39,90,94),
+(11,5,44,31,30,39,91,96),
+(11,5,45,31,31,40,93,98),
+(11,5,46,31,31,41,95,100),
+(11,5,47,32,31,41,97,102),
+(11,5,48,32,32,42,99,104),
+(11,5,49,32,32,43,101,106),
+(11,5,50,33,33,43,103,108),
+(11,5,51,33,33,44,105,110),
+(11,5,52,33,34,44,107,113),
+(11,5,53,34,34,45,109,115),
+(11,5,54,34,34,46,111,117),
+(11,5,55,34,35,46,113,119),
+(11,5,56,35,35,47,115,121),
+(11,5,57,35,36,48,118,123),
+(11,5,58,35,36,48,120,126),
+(11,5,59,36,37,49,122,128),
+(11,5,60,36,37,50,124,130),
+(11,5,61,36,38,51,126,132),
+(11,5,62,37,38,51,128,134),
+(11,5,63,37,39,52,130,137),
+(11,5,64,38,39,53,133,139),
+(11,5,65,38,40,53,135,141),
+(11,5,66,38,40,54,137,144),
+(11,5,67,39,40,55,139,146),
+(11,5,68,39,41,56,141,148),
+(11,5,69,40,41,56,144,151),
+(11,5,70,40,42,57,146,153),
+(11,5,71,40,43,58,149,156),
+(11,5,72,41,43,58,155,159),
+(11,5,73,41,44,59,157,160),
+(11,5,74,42,44,61,160,163),
+(11,5,75,42,45,62,164,166),
+(11,5,76,42,46,62,167,169),
+(11,5,77,43,46,63,168,172),
+(11,5,78,43,47,64,169,177),
+(11,5,79,44,47,65,172,180),
+(11,5,80,44,48,66,175,183),
+(11,6,1,24,17,21,21,22),
+(11,6,2,25,18,22,21,22),
+(11,6,3,27,19,23,21,23),
+(11,6,4,28,19,25,21,23),
+(11,6,5,29,20,26,21,23),
+(11,6,6,31,21,27,21,23),
+(11,6,7,32,22,28,21,24),
+(11,6,8,33,23,29,22,24),
+(11,6,9,35,24,31,22,24),
+(11,6,10,36,24,32,22,25),
+(11,6,11,37,25,33,22,25),
+(11,6,12,39,26,34,22,25),
+(11,6,13,40,27,36,22,26),
+(11,6,14,42,28,37,22,26),
+(11,6,15,43,29,38,22,26),
+(11,6,16,45,30,40,22,27),
+(11,6,17,46,31,41,23,27),
+(11,6,18,48,32,43,23,27),
+(11,6,19,49,33,44,23,28),
+(11,6,20,51,34,45,23,28),
+(11,6,21,52,34,47,23,28),
+(11,6,22,54,35,48,23,29),
+(11,6,23,55,36,50,23,29),
+(11,6,24,57,37,51,24,30),
+(11,6,25,59,38,52,24,30),
+(11,6,26,60,39,54,24,30),
+(11,6,27,62,40,55,24,31),
+(11,6,28,63,41,57,24,31),
+(11,6,29,65,43,58,24,32),
+(11,6,30,67,44,60,24,32),
+(11,6,31,69,45,62,25,32),
+(11,6,32,70,46,63,25,33),
+(11,6,33,72,47,65,25,33),
+(11,6,34,74,48,66,25,34),
+(11,6,35,75,49,68,25,34),
+(11,6,36,77,50,69,26,35),
+(11,6,37,79,51,71,26,35),
+(11,6,38,81,52,73,26,35),
+(11,6,39,83,53,74,26,36),
+(11,6,40,84,55,76,26,36),
+(11,6,41,86,56,78,27,37),
+(11,6,42,88,57,79,27,37),
+(11,6,43,90,58,81,27,38),
+(11,6,44,92,59,83,27,38),
+(11,6,45,94,60,85,27,39),
+(11,6,46,96,62,86,28,39),
+(11,6,47,98,63,88,28,40),
+(11,6,48,100,64,90,28,40),
+(11,6,49,102,65,92,28,41),
+(11,6,50,103,65,93,29,41),
+(11,6,51,105,66,94,29,42),
+(11,6,52,106,67,95,29,42),
+(11,6,53,107,68,96,29,43),
+(11,6,54,108,69,97,30,44),
+(11,6,55,109,70,98,30,44),
+(11,6,56,112,72,101,30,45),
+(11,6,57,114,73,103,30,45),
+(11,6,58,117,74,105,31,46),
+(11,6,59,119,76,107,31,46),
+(11,6,60,121,77,109,31,47),
+(11,6,61,123,78,111,31,48),
+(11,6,62,126,80,113,31,48),
+(11,6,63,128,81,116,32,49),
+(11,6,64,131,83,118,32,49),
+(11,6,65,136,84,120,32,50),
+(11,6,66,140,86,123,32,51),
+(11,6,67,141,87,125,33,51),
+(11,6,68,141,89,127,33,52),
+(11,6,69,144,90,130,33,53),
+(11,6,70,147,92,132,33,53),
+(11,6,71,150,94,135,34,54),
+(11,6,72,152,95,137,34,55),
+(11,6,73,155,97,140,34,56),
+(11,6,74,162,99,142,34,56),
+(11,6,75,165,100,145,35,57),
+(11,6,76,167,102,146,35,58),
+(11,6,77,169,104,150,35,59),
+(11,6,78,170,105,152,35,59),
+(11,6,79,173,107,156,36,60),
+(11,6,80,176,109,159,36,61),
+(11,7,1,22,17,20,22,24),
+(11,7,2,23,17,21,23,25),
+(11,7,3,24,18,22,24,26),
+(11,7,4,25,18,23,25,27),
+(11,7,5,25,19,24,26,28),
+(11,7,6,26,19,25,27,29),
+(11,7,7,27,20,26,28,30),
+(11,7,8,28,20,27,28,31),
+(11,7,9,29,21,28,29,32),
+(11,7,10,30,21,29,30,33),
+(11,7,11,31,22,30,31,35),
+(11,7,12,32,22,31,32,36),
+(11,7,13,33,23,32,33,37),
+(11,7,14,34,23,33,34,38),
+(11,7,15,34,24,35,35,39),
+(11,7,16,35,24,36,36,40),
+(11,7,17,36,25,37,38,42),
+(11,7,18,37,25,38,39,43),
+(11,7,19,38,26,39,40,44),
+(11,7,20,39,26,40,41,45),
+(11,7,21,40,27,41,42,46),
+(11,7,22,41,27,43,43,48),
+(11,7,23,43,28,44,44,49),
+(11,7,24,44,28,45,45,50),
+(11,7,25,45,29,46,46,51),
+(11,7,26,46,30,47,48,53),
+(11,7,27,47,30,49,49,54),
+(11,7,28,48,31,50,50,55),
+(11,7,29,49,31,51,51,57),
+(11,7,30,50,32,53,52,58),
+(11,7,31,51,33,54,53,59),
+(11,7,32,52,33,55,55,61),
+(11,7,33,53,34,56,56,62),
+(11,7,34,55,34,58,57,64),
+(11,7,35,56,35,59,58,65),
+(11,7,36,57,36,60,60,66),
+(11,7,37,58,36,62,61,68),
+(11,7,38,59,37,63,62,69),
+(11,7,39,61,38,65,63,71),
+(11,7,40,62,38,66,65,72),
+(11,7,41,63,39,67,66,74),
+(11,7,42,64,40,69,67,75),
+(11,7,43,65,40,70,69,77),
+(11,7,44,67,41,72,70,78),
+(11,7,45,68,42,73,71,80),
+(11,7,46,69,42,75,73,81),
+(11,7,47,71,43,76,74,83),
+(11,7,48,72,44,78,76,84),
+(11,7,49,73,45,79,77,86),
+(11,7,50,74,45,81,78,88),
+(11,7,51,76,46,82,80,89),
+(11,7,52,77,47,84,81,91),
+(11,7,53,78,47,85,83,92),
+(11,7,54,80,48,87,84,94),
+(11,7,55,81,49,88,86,96),
+(11,7,56,83,50,90,87,97),
+(11,7,57,84,50,91,89,99),
+(11,7,58,85,51,93,90,101),
+(11,7,59,87,52,95,92,102),
+(11,7,60,88,53,96,93,104),
+(11,7,61,90,54,98,95,106),
+(11,7,62,91,54,99,96,108),
+(11,7,63,93,55,101,98,109),
+(11,7,64,94,56,103,99,111),
+(11,7,65,95,57,104,101,113),
+(11,7,66,97,58,106,103,115),
+(11,7,67,98,58,108,104,117),
+(11,7,68,100,59,110,106,118),
+(11,7,69,101,60,111,107,120),
+(11,7,70,103,61,113,109,122),
+(11,7,71,104,62,115,122,124),
+(11,7,72,106,63,117,124,127),
+(11,7,73,108,64,119,126,129),
+(11,7,74,110,65,122,128,131),
+(11,7,75,112,66,124,130,133),
+(11,7,76,114,67,126,133,136),
+(11,7,77,115,68,128,135,138),
+(11,7,78,117,69,130,137,140),
+(11,7,79,119,70,133,139,143),
+(11,7,80,121,71,135,141,145),
+(11,8,1,21,17,19,24,24),
+(11,8,2,21,17,19,25,25),
+(11,8,3,21,17,20,27,27),
+(11,8,4,21,17,20,28,28),
+(11,8,5,21,18,20,29,29),
+(11,8,6,21,18,20,31,31),
+(11,8,7,21,18,21,32,32),
+(11,8,8,22,18,21,34,33),
+(11,8,9,22,18,21,35,35),
+(11,8,10,22,19,22,37,36),
+(11,8,11,22,19,22,38,37),
+(11,8,12,22,19,22,40,39),
+(11,8,13,22,19,23,41,40),
+(11,8,14,22,19,23,43,42),
+(11,8,15,22,19,23,44,43),
+(11,8,16,22,20,24,46,45),
+(11,8,17,23,20,24,47,46),
+(11,8,18,23,20,24,49,48),
+(11,8,19,23,20,25,50,49),
+(11,8,20,23,21,25,52,51),
+(11,8,21,23,21,26,54,52),
+(11,8,22,23,21,26,55,54),
+(11,8,23,23,21,26,57,56),
+(11,8,24,24,21,27,59,57),
+(11,8,25,24,22,27,60,59),
+(11,8,26,24,22,27,62,60),
+(11,8,27,24,22,28,64,62),
+(11,8,28,24,22,28,65,64),
+(11,8,29,24,23,29,67,65),
+(11,8,30,24,23,29,69,67),
+(11,8,31,25,23,30,71,69),
+(11,8,32,25,23,30,73,71),
+(11,8,33,25,24,30,74,72),
+(11,8,34,25,24,31,76,74),
+(11,8,35,25,24,31,78,76),
+(11,8,36,26,24,32,80,78),
+(11,8,37,26,25,32,82,79),
+(11,8,38,26,25,33,84,81),
+(11,8,39,26,25,33,86,83),
+(11,8,40,26,26,34,87,85),
+(11,8,41,27,26,34,89,87),
+(11,8,42,27,26,35,91,89),
+(11,8,43,27,27,35,93,91),
+(11,8,44,27,27,36,95,92),
+(11,8,45,27,27,36,97,94),
+(11,8,46,28,27,37,99,96),
+(11,8,47,28,28,37,101,98),
+(11,8,48,28,28,38,103,100),
+(11,8,49,28,28,38,105,102),
+(11,8,50,29,29,39,107,104),
+(11,8,51,29,29,39,110,106),
+(11,8,52,29,29,40,112,108),
+(11,8,53,29,30,40,114,110),
+(11,8,54,30,30,41,116,112),
+(11,8,55,30,30,41,118,114),
+(11,8,56,30,31,42,120,116),
+(11,8,57,30,31,42,122,118),
+(11,8,58,31,31,43,125,121),
+(11,8,59,31,32,43,127,123),
+(11,8,60,31,32,44,129,125),
+(11,8,61,31,33,45,131,127),
+(11,8,62,32,33,45,133,129),
+(11,8,63,32,33,46,136,131),
+(11,8,64,32,34,46,138,134),
+(11,8,65,33,34,47,140,136),
+(11,8,66,33,34,48,143,138),
+(11,8,67,33,35,48,145,140),
+(11,8,68,33,35,49,147,142),
+(11,8,69,34,36,49,150,145),
+(11,8,70,34,36,50,152,147),
+(11,8,71,34,36,51,155,150),
+(11,8,72,34,37,52,161,153),
+(11,8,73,34,37,53,161,156),
+(11,8,74,35,38,53,164,158),
+(11,8,75,35,38,54,167,161),
+(11,8,76,35,38,55,170,164),
+(11,8,77,36,39,56,173,167),
+(11,8,78,36,39,56,176,170),
+(11,8,79,36,40,57,179,173),
+(11,8,80,37,40,58,182,176);
+/*!40000 ALTER TABLE `player_levelstats` ENABLE KEYS */;
+UNLOCK TABLES;
+
+-- ----------------------------
+-- Table structure for player_xp_for_level
+-- ----------------------------
+DROP TABLE IF EXISTS `player_xp_for_level`;
+CREATE TABLE `player_xp_for_level` (
+ `lvl` int(3) unsigned NOT NULL,
+ `xp_for_next_level` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`lvl`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `player_xp_for_level`
+--
+
+LOCK TABLES `player_xp_for_level` WRITE;
+/*!40000 ALTER TABLE `player_xp_for_level` DISABLE KEYS */;
+INSERT INTO `player_xp_for_level` VALUES
+('1', '400'),
+('2', '900'),
+('3', '1400'),
+('4', '2100'),
+('5', '2800'),
+('6', '3600'),
+('7', '4500'),
+('8', '5400'),
+('9', '6500'),
+('10', '7600'),
+('11', '8700'),
+('12', '9800'),
+('13', '11000'),
+('14', '12300'),
+('15', '13600'),
+('16', '15000'),
+('17', '16400'),
+('18', '17800'),
+('19', '19300'),
+('20', '20800'),
+('21', '22400'),
+('22', '24000'),
+('23', '25500'),
+('24', '27200'),
+('25', '28900'),
+('26', '30500'),
+('27', '32200'),
+('28', '33900'),
+('29', '36300'),
+('30', '38800'),
+('31', '41600'),
+('32', '44600'),
+('33', '48000'),
+('34', '51400'),
+('35', '55000'),
+('36', '58700'),
+('37', '62400'),
+('38', '66200'),
+('39', '70200'),
+('40', '74300'),
+('41', '78500'),
+('42', '82800'),
+('43', '87100'),
+('44', '91600'),
+('45', '96300'),
+('46', '101000'),
+('47', '105800'),
+('48', '110700'),
+('49', '115700'),
+('50', '120900'),
+('51', '126100'),
+('52', '131500'),
+('53', '137000'),
+('54', '142500'),
+('55', '148200'),
+('56', '154000'),
+('57', '159900'),
+('58', '165800'),
+('59', '172000'),
+('60', '290000'),
+('61', '317000'),
+('62', '349000'),
+('63', '386000'),
+('64', '428000'),
+('65', '475000'),
+('66', '527000'),
+('67', '585000'),
+('68', '648000'),
+('69', '717000'),
+('70', '1523800'),
+('71', '1539600'),
+('72', '1555700'),
+('73', '1571800'),
+('74', '1587900'),
+('75', '1604200'),
+('76', '1620700'),
+('77', '1637400'),
+('78', '1653900'),
+('79', '1670800');
+/*!40000 ALTER TABLE `player_xp_for_level` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `playercreateinfo`
+--
+
+DROP TABLE IF EXISTS `playercreateinfo`;
+CREATE TABLE `playercreateinfo` (
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `map` smallint(5) unsigned NOT NULL default '0',
+ `zone` mediumint(8) unsigned NOT NULL default '0',
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ PRIMARY KEY (`race`,`class`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `playercreateinfo`
+--
+
+LOCK TABLES `playercreateinfo` WRITE;
+/*!40000 ALTER TABLE `playercreateinfo` DISABLE KEYS */;
+INSERT INTO `playercreateinfo` VALUES
+(1,1,0,12,-8949,-132,84),
+(1,2,0,12,-8949,-132,84),
+(1,4,0,12,-8949,-132,84),
+(1,5,0,12,-8949,-132,84),
+(1,6,609,4298,2355.84,-5664.77,426.028),
+(1,8,0,12,-8949,-132,84),
+(1,9,0,12,-8949,-132,84),
+(2,1,1,14,-618,-4251,39),
+(2,3,1,14,-618,-4251,39),
+(2,4,1,14,-618,-4251,39),
+(2,6,609,4298,2358.44,-5666.9,426.023),
+(2,7,1,14,-618,-4251,39),
+(2,9,1,14,-618,-4251,39),
+(3,1,0,1,-6240,331,383),
+(3,2,0,1,-6240,331,383),
+(3,3,0,1,-6240,331,383),
+(3,4,0,1,-6240,331,383),
+(3,5,0,1,-6240,331,383),
+(3,6,609,4298,2358.44,-5666.9,426.023),
+(4,1,1,141,10311,832,1327),
+(4,3,1,141,10311,832,1327),
+(4,4,1,141,10311,832,1327),
+(4,5,1,141,10311,832,1327),
+(4,6,609,4298,2356.21,-5662.21,426.026),
+(4,11,1,141,10311,832,1327),
+(5,1,0,85,1676,1677,122),
+(5,4,0,85,1676,1677,122),
+(5,5,0,85,1676,1677,122),
+(5,8,0,85,1676,1677,122),
+(5,9,0,85,1676,1677,122),
+(5,6,609,4298,2356.21,-5662.21,426.026),
+(6,1,1,215,-2917,-257,53),
+(6,3,1,215,-2917,-257,53),
+(6,6,609,4298,2358.17,-5663.21,426.027),
+(6,7,1,215,-2917,-257,53),
+(6,11,1,215,-2917,-257,53),
+(7,1,0,1,-6240,331,383),
+(7,4,0,1,-6240,331,383),
+(7,6,609,4298,2355.05,-5661.7, 426.026),
+(7,8,0,1,-6240,331,383),
+(7,9,0,1,-6240,331,383),
+(8,1,1,14,-618,-4251,39),
+(8,3,1,14,-618,-4251,39),
+(8,4,1,14,-618,-4251,39),
+(8,5,1,14,-618,-4251,39),
+(8,6,609,4298,2355.05,-5661.7, 426.026),
+(8,7,1,14,-618,-4251,39),
+(8,8,1,14,-618,-4251,39),
+(10,2,530,3431,10349.6,-6357.29,33.4026),
+(10,3,530,3431,10349.6,-6357.29,33.4026),
+(10,4,530,3431,10349.6,-6357.29,33.4026),
+(10,5,530,3431,10349.6,-6357.29,33.4026),
+(10,6,609,4298,2355.84,-5664.77,426.028),
+(10,8,530,3431,10349.6,-6357.29,33.4026),
+(10,9,530,3431,10349.6,-6357.29,33.4026),
+(11,1,530,3526,-3961.64,-13931.2,100.615),
+(11,2,530,3526,-3961.64,-13931.2,100.615),
+(11,3,530,3526,-3961.64,-13931.2,100.615),
+(11,5,530,3526,-3961.64,-13931.2,100.615),
+(11,6,609,4298,2358.17,-5663.21,426.027),
+(11,7,530,3526,-3961.64,-13931.2,100.615),
+(11,8,530,3526,-3961.64,-13931.2,100.615);
+/*!40000 ALTER TABLE `playercreateinfo` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `playercreateinfo_action`
+--
+
+DROP TABLE IF EXISTS `playercreateinfo_action`;
+CREATE TABLE `playercreateinfo_action` (
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `button` smallint(5) unsigned NOT NULL default '0',
+ `action` smallint(5) unsigned NOT NULL default '0',
+ `type` smallint(5) unsigned NOT NULL default '0',
+ `misc` smallint(5) unsigned NOT NULL default '0',
+ KEY `playercreateinfo_race_class_index` (`race`,`class`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `playercreateinfo_action`
+--
+
+LOCK TABLES `playercreateinfo_action` WRITE;
+/*!40000 ALTER TABLE `playercreateinfo_action` DISABLE KEYS */;
+INSERT INTO `playercreateinfo_action` VALUES
+(1,1,1,78,0,0),
+(1,1,0,6603,0,0),
+(1,1,11,117,128,0),
+(1,2,2,635,0,0),
+(1,2,0,6603,0,0),
+(1,2,1,21084,0,0),
+(1,2,10,159,128,0),
+(1,2,11,2070,128,0),
+(1,4,1,1752,0,0),
+(1,4,2,2098,0,0),
+(1,4,3,2764,0,0),
+(1,4,0,6603,0,0),
+(1,4,11,2070,128,0),
+(1,5,1,585,0,0),
+(1,5,2,2050,0,0),
+(1,5,0,6603,0,0),
+(1,5,10,159,128,0),
+(1,5,11,2070,128,0),
+(1,6,0,6603,0,0),
+(1,6,1,49576,0,0),
+(1,6,2,45477,0,0),
+(1,6,3,45462,0,0),
+(1,6,4,45902,0,0),
+(1,6,5,47541,0,0),
+(1,6,11,59752,0,0),
+(1,8,1,133,0,0),
+(1,8,2,168,0,0),
+(1,8,0,6603,0,0),
+(1,8,10,159,128,0),
+(1,8,11,2070,128,0),
+(1,9,1,686,0,0),
+(1,9,2,687,0,0),
+(1,9,0,6603,0,0),
+(1,9,10,159,128,0),
+(1,9,11,4604,128,0),
+(2,1,1,78,0,0),
+(2,1,0,6603,0,0),
+(2,1,11,117,128,0),
+(2,3,2,75,0,0),
+(2,3,1,2973,0,0),
+(2,3,0,6603,0,0),
+(2,3,11,117,128,0),
+(2,3,10,159,128,0),
+(2,4,10,0,128,0),
+(2,4,1,1752,0,0),
+(2,4,2,2098,0,0),
+(2,4,0,6603,0,0),
+(2,4,11,117,128,0),
+(2,6,0,6603,0,0),
+(2,6,1,49576,0,0),
+(2,6,2,45477,0,0),
+(2,6,3,45462,0,0),
+(2,6,4,45902,0,0),
+(2,6,5,47541,0,0),
+(2,6,10,20572,0,0),
+(2,7,2,331,0,0),
+(2,7,1,403,0,0),
+(2,7,0,6603,0,0),
+(2,7,11,117,128,0),
+(2,7,10,159,128,0),
+(2,9,1,686,0,0),
+(2,9,2,687,0,0),
+(2,9,0,6603,0,0),
+(2,9,11,117,128,0),
+(2,9,10,159,128,0),
+(3,1,1,78,0,0),
+(3,1,0,6603,0,0),
+(3,1,11,117,128,0),
+(3,2,2,635,0,0),
+(3,2,0,6603,0,0),
+(3,2,1,21084,0,0),
+(3,2,10,159,128,0),
+(3,2,11,4540,128,0),
+(3,3,2,75,0,0),
+(3,3,1,2973,0,0),
+(3,3,0,6603,0,0),
+(3,3,11,117,128,0),
+(3,3,10,159,128,0),
+(3,4,1,1752,0,0),
+(3,4,2,2098,0,0),
+(3,4,3,2764,0,0),
+(3,4,0,6603,0,0),
+(3,4,11,4540,128,0),
+(3,5,1,585,0,0),
+(3,5,2,2050,0,0),
+(3,5,0,6603,0,0),
+(3,5,10,159,128,0),
+(3,5,11,4540,128,0),
+(3,6,0,6603,0,0),
+(3,6,1,49576,0,0),
+(3,6,2,45477,0,0),
+(3,6,3,45462,0,0),
+(3,6,4,45902,0,0),
+(3,6,5,47541,0,0),
+(3,6,10,2481,0,0),
+(4,1,1,78,0,0),
+(4,1,0,6603,0,0),
+(4,1,11,117,128,0),
+(4,3,2,75,0,0),
+(4,3,1,2973,0,0),
+(4,3,0,6603,0,0),
+(4,3,11,117,128,0),
+(4,3,10,159,128,0),
+(4,4,1,1752,0,0),
+(4,4,2,2098,0,0),
+(4,4,3,2764,0,0),
+(4,4,0,6603,0,0),
+(4,4,11,4540,128,0),
+(4,5,1,585,0,0),
+(4,5,2,2050,0,0),
+(4,5,0,6603,0,0),
+(4,5,10,159,128,0),
+(4,5,11,2070,128,0),
+(4,6,0,6603,0,0),
+(4,6,1,49576,0,0),
+(4,6,2,45477,0,0),
+(4,6,3,45462,0,0),
+(4,6,4,45902,0,0),
+(4,6,5,47541,0,0),
+(4,6,10,58984,0,0),
+(4,6,83,58984,0,0),
+(4,11,1,5176,0,0),
+(4,11,2,5185,0,0),
+(4,11,0,6603,0,0),
+(4,11,10,159,128,0),
+(4,11,11,4536,128,0),
+(5,1,11,4604,128,0),
+(5,1,0,6603,0,0),
+(5,1,1,78,0,0),
+(5,4,11,4604,128,0),
+(5,4,3,2764,0,0),
+(5,4,2,2098,0,0),
+(5,4,1,1752,0,0),
+(5,4,0,6603,0,0),
+(5,5,10,159,128,0),
+(5,5,2,2050,0,0),
+(5,5,1,585,0,0),
+(5,5,11,4604,128,0),
+(5,5,0,6603,0,0),
+(5,6,0,6603,0,0),
+(5,6,1,49576,0,0),
+(5,6,2,45477,0,0),
+(5,6,3,45462,0,0),
+(5,6,4,45902,0,0),
+(5,6,5,47541,0,0),
+(5,6,10,20577,0,0),
+(5,8,11,4604,128,0),
+(5,8,10,159,128,0),
+(5,8,2,168,0,0),
+(5,8,1,133,0,0),
+(5,8,0,6603,0,0),
+(5,9,1,686,0,0),
+(5,9,10,159,128,0),
+(5,9,2,687,0,0),
+(5,9,11,4604,128,0),
+(5,9,0,6603,0,0),
+(6,1,1,78,0,0),
+(6,1,2,20549,0,0),
+(6,1,11,4540,128,0),
+(6,1,0,6603,0,0),
+(6,3,1,2973,0,0),
+(6,3,10,159,128,0),
+(6,3,2,75,0,0),
+(6,3,3,20549,0,0),
+(6,3,11,117,128,0),
+(6,3,0,6603,0,0),
+(6,6,0,6603,0,0),
+(6,6,1,49576,0,0),
+(6,6,2,45477,0,0),
+(6,6,3,45462,0,0),
+(6,6,4,45902,0,0),
+(6,6,5,47541,0,0),
+(6,6,10,20549,0,0),
+(6,6,75,20549,0,0),
+(6,7,1,403,0,0),
+(6,7,10,159,128,0),
+(6,7,2,331,0,0),
+(6,7,3,20549,0,0),
+(6,7,11,4604,128,0),
+(6,7,0,6603,0,0),
+(6,11,1,5176,0,0),
+(6,11,10,159,128,0),
+(6,11,2,5185,0,0),
+(6,11,3,20549,0,0),
+(6,11,11,4536,128,0),
+(6,11,0,6603,0,0),
+(7,1,11,117,128,0),
+(7,1,1,78,0,0),
+(7,1,0,6603,0,0),
+(7,4,11,117,128,0),
+(7,4,3,2764,0,0),
+(7,4,1,1752,0,0),
+(7,4,2,2098,0,0),
+(7,4,0,6603,0,0),
+(7,6,0,6603,0,0),
+(7,6,1,49576,0,0),
+(7,6,2,45477,0,0),
+(7,6,3,45462,0,0),
+(7,6,4,45902,0,0),
+(7,6,5,47541,0,0),
+(7,6,10,20589,0,0),
+(7,6,72,6603,0,0),
+(7,6,83,117,128,0),
+(7,6,84,6603,0,0),
+(7,6,96,6603,0,0),
+(7,6,108,6603,0,0),
+(7,8,11,4536,128,0),
+(7,8,1,133,0,0),
+(7,8,2,168,0,0),
+(7,8,10,159,128,0),
+(7,8,0,6603,0,0),
+(7,9,11,4604,128,0),
+(7,9,1,686,0,0),
+(7,9,2,687,0,0),
+(7,9,10,159,128,0),
+(7,9,0,6603,0,0),
+(8,1,11,117,128,0),
+(8,1,1,78,0,0),
+(8,1,3,2764,0,0),
+(8,1,0,6603,0,0),
+(8,3,10,159,128,0),
+(8,3,11,4604,128,0),
+(8,3,1,2973,0,0),
+(8,3,2,75,0,0),
+(8,3,0,6603,0,0),
+(8,4,1,1752,0,0),
+(8,4,3,2764,0,0),
+(8,4,2,2098,0,0),
+(8,4,11,117,128,0),
+(8,4,0,6603,0,0),
+(8,5,1,585,0,0),
+(8,5,10,159,128,0),
+(8,5,2,2050,0,0),
+(8,5,11,4540,128,0),
+(8,5,0,6603,0,0),
+(8,6,0,6603,0,0),
+(8,6,1,49576,0,0),
+(8,6,2,45477,0,0),
+(8,6,3,45462,0,0),
+(8,6,4,45902,0,0),
+(8,6,5,47541,0,0),
+(8,6,10,50621,0,0),
+(8,7,1,403,0,0),
+(8,7,10,159,128,0),
+(8,7,2,331,0,0),
+(8,7,11,117,128,0),
+(8,7,0,6603,0,0),
+(8,8,1,133,0,0),
+(8,8,10,159,128,0),
+(8,8,2,168,0,0),
+(8,8,11,117,128,0),
+(8,8,0,6603,0,0),
+(10,2,0,6603,0,0),
+(10,2,1,21084,0,0),
+(10,2,2,635,0,0),
+(10,2,3,28734,0,0),
+(10,2,4,28730,0,0),
+(10,2,10,159,128,0),
+(10,2,11,20857,128,0),
+(10,3,0,6603,0,0),
+(10,3,1,2973,0,0),
+(10,3,2,75,0,0),
+(10,3,3,28734,0,0),
+(10,3,4,28730,0,0),
+(10,3,10,159,128,0),
+(10,3,11,20857,128,0),
+(10,4,0,6603,0,0),
+(10,4,1,1752,0,0),
+(10,4,2,2098,0,0),
+(10,4,3,2764,0,0),
+(10,4,4,28734,0,0),
+(10,4,5,25046,0,0),
+(10,4,11,20857,128,0),
+(10,5,0,6603,0,0),
+(10,5,1,585,0,0),
+(10,5,2,2050,0,0),
+(10,5,3,28734,0,0),
+(10,5,4,28730,0,0),
+(10,5,10,159,128,0),
+(10,5,11,20857,128,0),
+(10,6,0,6603,0,0),
+(10,6,1,49576,0,0),
+(10,6,2,45477,0,0),
+(10,6,3,45462,0,0),
+(10,6,4,45902,0,0),
+(10,6,5,47541,0,0),
+(10,6,6,50613,0,0),
+(10,8,0,6603,0,0),
+(10,8,1,133,0,0),
+(10,8,2,168,0,0),
+(10,8,3,28734,0,0),
+(10,8,4,28730,0,0),
+(10,8,10,159,128,0),
+(10,8,11,20857,128,0),
+(10,9,11,20857,128,0),
+(10,9,10,159,128,0),
+(10,9,4,28730,0,0),
+(10,9,3,28734,0,0),
+(10,9,2,687,0,0),
+(10,9,1,686,0,0),
+(10,9,0,6603,0,0),
+(11,1,0,6603,0,0),
+(11,1,72,6603,0,0),
+(11,1,73,78,0,0),
+(11,1,74,28880,0,0),
+(11,1,83,4540,128,0),
+(11,1,84,6603,0,0),
+(11,1,96,6603,0,0),
+(11,1,108,6603,0,0),
+(11,2,0,6603,0,0),
+(11,2,1,21084,0,0),
+(11,2,2,635,0,0),
+(11,2,3,59542,0,0),
+(11,2,10,159,128,0),
+(11,2,11,4540,128,0),
+(11,2,83,4540,128,0),
+(11,3,0,6603,0,0),
+(11,3,1,2973,0,0),
+(11,3,2,75,0,0),
+(11,3,3,59543,0,0),
+(11,3,10,159,128,0),
+(11,3,11,4540,128,0),
+(11,3,72,6603,0,0),
+(11,3,73,2973,0,0),
+(11,3,74,75,0,0),
+(11,3,82,159,128,0),
+(11,3,83,4540,128,0),
+(11,5,0,6603,0,0),
+(11,5,1,585,0,0),
+(11,5,2,2050,0,0),
+(11,5,3,59544,0,0),
+(11,5,10,159,128,0),
+(11,5,11,4540,128,0),
+(11,5,83,4540,128,0),
+(11,6,0,6603,0,0),
+(11,6,1,49576,0,0),
+(11,6,2,45477,0,0),
+(11,6,3,45462,0,0),
+(11,6,4,45902,0,0),
+(11,6,5,47541,0,0),
+(11,6,6,59545,0,0),
+(11,7,0,6603,0,0),
+(11,7,1,403,0,0),
+(11,7,2,331,0,0),
+(11,7,3,59547,0,0),
+(11,7,10,159,128,0),
+(11,7,11,4540,128,0),
+(11,8,0,6603,0,0),
+(11,8,1,133,0,0),
+(11,8,2,168,0,0),
+(11,8,3,59548,0,0),
+(11,8,10,159,128,0),
+(11,8,11,4540,128,0),
+(11,8,83,4540,128,0);
+/*!40000 ALTER TABLE `playercreateinfo_action` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `playercreateinfo_item`
+--
+
+DROP TABLE IF EXISTS `playercreateinfo_item`;
+CREATE TABLE `playercreateinfo_item` (
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `itemid` mediumint(8) unsigned NOT NULL default '0',
+ `amount` tinyint(3) unsigned NOT NULL default '1',
+ KEY `playercreateinfo_race_class_index` (`race`,`class`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `playercreateinfo_item`
+--
+
+LOCK TABLES `playercreateinfo_item` WRITE;
+/*!40000 ALTER TABLE `playercreateinfo_item` DISABLE KEYS */;
+/*!40000 ALTER TABLE `playercreateinfo_item` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `playercreateinfo_spell`
+--
+
+DROP TABLE IF EXISTS `playercreateinfo_spell`;
+CREATE TABLE `playercreateinfo_spell` (
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `Spell` mediumint(8) unsigned NOT NULL default '0',
+ `Note` varchar(255) default NULL,
+ PRIMARY KEY (`race`,`class`,`Spell`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `playercreateinfo_spell`
+--
+
+LOCK TABLES `playercreateinfo_spell` WRITE;
+/*!40000 ALTER TABLE `playercreateinfo_spell` DISABLE KEYS */;
+INSERT INTO `playercreateinfo_spell` VALUES
+(1,1,78,'Heroic Strike'),
+(1,1,81,'Dodge'),
+(1,1,107,'Block'),
+(1,1,196,'One-Handed Axes'),
+(1,1,198,'One-Handed Maces'),
+(1,1,201,'One-Handed Swords'),
+(1,1,203,'Unarmed'),
+(1,1,204,'Defense'),
+(1,1,522,'SPELLDEFENSE (DND)'),
+(1,1,668,'Language Common'),
+(1,1,1843,'Disarm'),
+(1,1,2382,'Generic'),
+(1,1,2457,'Battle Stance'),
+(1,1,2479,'Honorless Target'),
+(1,1,3050,'Detect'),
+(1,1,3365,'Opening'),
+(1,1,5301,'Defensive State (DND)'),
+(1,1,6233,'Closing'),
+(1,1,6246,'Closing'),
+(1,1,6247,'Opening'),
+(1,1,6477,'Opening'),
+(1,1,6478,'Opening'),
+(1,1,6603,'Attack'),
+(1,1,7266,'Duel'),
+(1,1,7267,'Grovel'),
+(1,1,7355,'Stuck'),
+(1,1,8386,'Attacking'),
+(1,1,8737,'Mail'),
+(1,1,9077,'Leather'),
+(1,1,9078,'Cloth'),
+(1,1,9116,'Shield'),
+(1,1,9125,'Generic'),
+(1,1,20597,'Sword Specialization'),
+(1,1,20598,'The Human Spirit'),
+(1,1,20599,'Diplomacy'),
+(1,1,20864,'Mace Specialization'),
+(1,1,21651,'Opening'),
+(1,1,21652,'Closing'),
+(1,1,22027,'Remove Insignia'),
+(1,1,22810,'Opening - No Text'),
+(1,1,32215,'Victorious State'),
+(1,1,45927,'Summon Friend'),
+(1,1,58985,'Perception'),
+(1,1,59752,'Every Man for Himself'),
+(1,1,61437,'Opening'),
+(1,2,81,'Dodge'),
+(1,2,107,'Block'),
+(1,2,198,'One-Handed Maces'),
+(1,2,199,'Two-Handed Maces'),
+(1,2,203,'Unarmed'),
+(1,2,204,'Defense'),
+(1,2,522,'SPELLDEFENSE (DND)'),
+(1,2,635,'Holy Light'),
+(1,2,668,'Language Common'),
+(1,2,1843,'Disarm'),
+(1,2,2382,'Generic'),
+(1,2,2479,'Honorless Target'),
+(1,2,3050,'Detect'),
+(1,2,3365,'Opening'),
+(1,2,6233,'Closing'),
+(1,2,6246,'Closing'),
+(1,2,6247,'Opening'),
+(1,2,6477,'Opening'),
+(1,2,6478,'Opening'),
+(1,2,6603,'Attack'),
+(1,2,7266,'Duel'),
+(1,2,7267,'Grovel'),
+(1,2,7355,'Stuck'),
+(1,2,8386,'Attacking'),
+(1,2,8737,'Mail'),
+(1,2,9077,'Leather'),
+(1,2,9078,'Cloth'),
+(1,2,9116,'Shield'),
+(1,2,9125,'Generic'),
+(1,2,20154,'Seal of Righteousness'),
+(1,2,20597,'Sword Specialization'),
+(1,2,20598,'The Human Spirit'),
+(1,2,20599,'Diplomacy'),
+(1,2,20864,'Mace Specialization'),
+(1,2,21651,'Opening'),
+(1,2,21652,'Closing'),
+(1,2,22027,'Remove Insignia'),
+(1,2,22810,'Opening - No Text'),
+(1,2,27762,'Libram'),
+(1,2,45927,'Summon Friend'),
+(1,2,58985,'Perception'),
+(1,2,59752,'Every Man for Himself'),
+(1,2,61437,'Opening'),
+(1,4,81,'Dodge'),
+(1,4,203,'Unarmed'),
+(1,4,204,'Defense'),
+(1,4,522,'SPELLDEFENSE (DND)'),
+(1,4,668,'Language Common'),
+(1,4,1180,'Daggers'),
+(1,4,1752,'Sinister Strike'),
+(1,4,1843,'Disarm'),
+(1,4,2098,'Eviscerate'),
+(1,4,2382,'Generic'),
+(1,4,2479,'Honorless Target'),
+(1,4,2567,'Thrown'),
+(1,4,2764,'Throw'),
+(1,4,3050,'Detect'),
+(1,4,3365,'Opening'),
+(1,4,6233,'Closing'),
+(1,4,6246,'Closing'),
+(1,4,6247,'Opening'),
+(1,4,6477,'Opening'),
+(1,4,6478,'Opening'),
+(1,4,6603,'Attack'),
+(1,4,7266,'Duel'),
+(1,4,7267,'Grovel'),
+(1,4,7355,'Stuck'),
+(1,4,8386,'Attacking'),
+(1,4,9077,'Leather'),
+(1,4,9078,'Cloth'),
+(1,4,9125,'Generic'),
+(1,4,16092,'Defensive State (DND)'),
+(1,4,20597,'Sword Specialization'),
+(1,4,20598,'The Human Spirit'),
+(1,4,20599,'Diplomacy'),
+(1,4,20864,'Mace Specialization'),
+(1,4,21184,'Rogue Passive (DND)'),
+(1,4,21651,'Opening'),
+(1,4,21652,'Closing'),
+(1,4,22027,'Remove Insignia'),
+(1,4,22810,'Opening - No Text'),
+(1,4,45927,'Summon Friend'),
+(1,4,58985,'Perception'),
+(1,4,59752,'Every Man for Himself'),
+(1,4,61437,'Opening'),
+(1,5,81,'Dodge'),
+(1,5,198,'One-Handed Maces'),
+(1,5,203,'Unarmed'),
+(1,5,204,'Defense'),
+(1,5,522,'SPELLDEFENSE (DND)'),
+(1,5,585,'Smite'),
+(1,5,668,'Language Common'),
+(1,5,1843,'Disarm'),
+(1,5,2050,'Lesser Heal'),
+(1,5,2382,'Generic'),
+(1,5,2479,'Honorless Target'),
+(1,5,3050,'Detect'),
+(1,5,3365,'Opening'),
+(1,5,5009,'Wands'),
+(1,5,5019,'Shoot'),
+(1,5,6233,'Closing'),
+(1,5,6246,'Closing'),
+(1,5,6247,'Opening'),
+(1,5,6477,'Opening'),
+(1,5,6478,'Opening'),
+(1,5,6603,'Attack'),
+(1,5,7266,'Duel'),
+(1,5,7267,'Grovel'),
+(1,5,7355,'Stuck'),
+(1,5,8386,'Attacking'),
+(1,5,9078,'Cloth'),
+(1,5,9125,'Generic'),
+(1,5,20597,'Sword Specialization'),
+(1,5,20598,'The Human Spirit'),
+(1,5,20599,'Diplomacy'),
+(1,5,20864,'Mace Specialization'),
+(1,5,21651,'Opening'),
+(1,5,21652,'Closing'),
+(1,5,22027,'Remove Insignia'),
+(1,5,22810,'Opening - No Text'),
+(1,5,45927,'Summon Friend'),
+(1,5,58985,'Perception'),
+(1,5,59752,'Every Man for Himself'),
+(1,5,61437,'Opening'),
+(1,6,81,'Dodge'),
+(1,6,196,'One-Handed Axes'),
+(1,6,197,'Two-Handed Axes'),
+(1,6,200,'Polearms'),
+(1,6,201,'One-Handed Swords'),
+(1,6,202,'Two-Handed Swords'),
+(1,6,203,'Unarmed'),
+(1,6,204,'Defense'),
+(1,6,522,'SPELLDEFENSE (DND)'),
+(1,6,668,'Language Common'),
+(1,6,674,'Dual Wield'),
+(1,6,750,'Plate Mail'),
+(1,6,1843,'Disarm'),
+(1,6,2382,'Generic'),
+(1,6,2479,'Honorless Target'),
+(1,6,3050,'Detect'),
+(1,6,3127,'Parry'),
+(1,6,3275,'Linen Bandage'),
+(1,6,3276,'Heavy Linen Bandage'),
+(1,6,3277,'Wool Bandage'),
+(1,6,3278,'Heavy Wool Bandage'),
+(1,6,3365,'Opening'),
+(1,6,6233,'Closing'),
+(1,6,6246,'Closing'),
+(1,6,6247,'Opening'),
+(1,6,6477,'Opening'),
+(1,6,6478,'Opening'),
+(1,6,6603,'Attack'),
+(1,6,7266,'Duel'),
+(1,6,7267,'Grovel'),
+(1,6,7355,'Stuck'),
+(1,6,7928,'Silk Bandage'),
+(1,6,7929,'Heavy Silk Bandage'),
+(1,6,7934,'Anti-Venom'),
+(1,6,8386,'Attacking'),
+(1,6,8737,'Mail'),
+(1,6,9077,'Leather'),
+(1,6,9078,'Cloth'),
+(1,6,9125,'Generic'),
+(1,6,10840,'Mageweave Bandage'),
+(1,6,10841,'Heavy Mageweave Bandage'),
+(1,6,10846,'First Aid'),
+(1,6,18629,'Runecloth Bandage'),
+(1,6,18630,'Heavy Runecloth Bandage'),
+(1,6,20597,'Sword Specialization'),
+(1,6,20598,'The Human Spirit'),
+(1,6,20599,'Diplomacy'),
+(1,6,20864,'Mace Specialization'),
+(1,6,21651,'Opening'),
+(1,6,21652,'Closing'),
+(1,6,22027,'Remove Insignia'),
+(1,6,22810,'Opening - No Text'),
+(1,6,33391,'Journeyman Riding'),
+(1,6,45462,'Plague Strike'),
+(1,6,45477,'Icy Touch'),
+(1,6,45902,'Blood Strike'),
+(1,6,45903,'Offensive State (DND)'),
+(1,6,45927,'Summon Friend'),
+(1,6,47541,'Death Coil'),
+(1,6,48266,'Blood Presence'),
+(1,6,49410,'Forceful Deflection'),
+(1,6,49576,'Death Grip'),
+(1,6,52665,'Sigil'),
+(1,6,58985,'Perception'),
+(1,6,59752,'Every Man for Himself'),
+(1,6,59879,'Blood Plague'),
+(1,6,59921,'Frost Fever'),
+(1,6,61437,'Opening'),
+(1,6,61455,'Runic Focus'),
+(1,8,81,'Dodge'),
+(1,8,133,'Fireball'),
+(1,8,168,'Frost Armor'),
+(1,8,203,'Unarmed'),
+(1,8,204,'Defense'),
+(1,8,227,'Staves'),
+(1,8,522,'SPELLDEFENSE (DND)'),
+(1,8,668,'Language Common'),
+(1,8,1843,'Disarm'),
+(1,8,2382,'Generic'),
+(1,8,2479,'Honorless Target'),
+(1,8,3050,'Detect'),
+(1,8,3365,'Opening'),
+(1,8,5009,'Wands'),
+(1,8,5019,'Shoot'),
+(1,8,6233,'Closing'),
+(1,8,6246,'Closing'),
+(1,8,6247,'Opening'),
+(1,8,6477,'Opening'),
+(1,8,6478,'Opening'),
+(1,8,6603,'Attack'),
+(1,8,7266,'Duel'),
+(1,8,7267,'Grovel'),
+(1,8,7355,'Stuck'),
+(1,8,8386,'Attacking'),
+(1,8,9078,'Cloth'),
+(1,8,9125,'Generic'),
+(1,8,20597,'Sword Specialization'),
+(1,8,20598,'The Human Spirit'),
+(1,8,20599,'Diplomacy'),
+(1,8,20864,'Mace Specialization'),
+(1,8,21651,'Opening'),
+(1,8,21652,'Closing'),
+(1,8,22027,'Remove Insignia'),
+(1,8,22810,'Opening - No Text'),
+(1,8,45927,'Summon Friend'),
+(1,8,58985,'Perception'),
+(1,8,59752,'Every Man for Himself'),
+(1,8,61437,'Opening'),
+(1,9,81,'Dodge'),
+(1,9,203,'Unarmed'),
+(1,9,204,'Defense'),
+(1,9,522,'SPELLDEFENSE (DND)'),
+(1,9,668,'Language Common'),
+(1,9,686,'Shadow Bolt'),
+(1,9,687,'Demon Skin'),
+(1,9,1180,'Daggers'),
+(1,9,1843,'Disarm'),
+(1,9,2382,'Generic'),
+(1,9,2479,'Honorless Target'),
+(1,9,3050,'Detect'),
+(1,9,3365,'Opening'),
+(1,9,5009,'Wands'),
+(1,9,5019,'Shoot'),
+(1,9,6233,'Closing'),
+(1,9,6246,'Closing'),
+(1,9,6247,'Opening'),
+(1,9,6477,'Opening'),
+(1,9,6478,'Opening'),
+(1,9,6603,'Attack'),
+(1,9,7266,'Duel'),
+(1,9,7267,'Grovel'),
+(1,9,7355,'Stuck'),
+(1,9,8386,'Attacking'),
+(1,9,9078,'Cloth'),
+(1,9,9125,'Generic'),
+(1,9,20597,'Sword Specialization'),
+(1,9,20598,'The Human Spirit'),
+(1,9,20599,'Diplomacy'),
+(1,9,20864,'Mace Specialization'),
+(1,9,21651,'Opening'),
+(1,9,21652,'Closing'),
+(1,9,22027,'Remove Insignia'),
+(1,9,22810,'Opening - No Text'),
+(1,9,45927,'Summon Friend'),
+(1,9,58284,'Chaos Bolt Passive'),
+(1,9,58985,'Perception'),
+(1,9,59752,'Every Man for Himself'),
+(1,9,61437,'Opening'),
+(2,1,78,'Heroic Strike'),
+(2,1,81,'Dodge'),
+(2,1,107,'Block'),
+(2,1,196,'One-Handed Axes'),
+(2,1,197,'Two-Handed Axes'),
+(2,1,201,'One-Handed Swords'),
+(2,1,203,'Unarmed'),
+(2,1,204,'Defense'),
+(2,1,522,'SPELLDEFENSE (DND)'),
+(2,1,669,'Language Orcish'),
+(2,1,1843,'Disarm'),
+(2,1,2382,'Generic'),
+(2,1,2457,'Battle Stance'),
+(2,1,2479,'Honorless Target'),
+(2,1,3050,'Detect'),
+(2,1,3365,'Opening'),
+(2,1,5301,'Defensive State (DND)'),
+(2,1,6233,'Closing'),
+(2,1,6246,'Closing'),
+(2,1,6247,'Opening'),
+(2,1,6477,'Opening'),
+(2,1,6478,'Opening'),
+(2,1,6603,'Attack'),
+(2,1,7266,'Duel'),
+(2,1,7267,'Grovel'),
+(2,1,7355,'Stuck'),
+(2,1,8386,'Attacking'),
+(2,1,8737,'Mail'),
+(2,1,9077,'Leather'),
+(2,1,9078,'Cloth'),
+(2,1,9116,'Shield'),
+(2,1,9125,'Generic'),
+(2,1,20572,'Blood Fury'),
+(2,1,20573,'Hardiness'),
+(2,1,20574,'Axe Specialization'),
+(2,1,21563,'Command'),
+(2,1,21651,'Opening'),
+(2,1,21652,'Closing'),
+(2,1,22027,'Remove Insignia'),
+(2,1,22810,'Opening - No Text'),
+(2,1,32215,'Victorious State'),
+(2,1,45927,'Summon Friend'),
+(2,1,61437,'Opening'),
+(2,3,75,'Auto Shot'),
+(2,3,81,'Dodge'),
+(2,3,196,'One-Handed Axes'),
+(2,3,203,'Unarmed'),
+(2,3,204,'Defense'),
+(2,3,264,'Bows'),
+(2,3,522,'SPELLDEFENSE (DND)'),
+(2,3,669,'Language Orcish'),
+(2,3,1843,'Disarm'),
+(2,3,2382,'Generic'),
+(2,3,2479,'Honorless Target'),
+(2,3,2973,'Raptor Strike'),
+(2,3,3050,'Detect'),
+(2,3,3365,'Opening'),
+(2,3,6233,'Closing'),
+(2,3,6246,'Closing'),
+(2,3,6247,'Opening'),
+(2,3,6477,'Opening'),
+(2,3,6478,'Opening'),
+(2,3,6603,'Attack'),
+(2,3,7266,'Duel'),
+(2,3,7267,'Grovel'),
+(2,3,7355,'Stuck'),
+(2,3,8386,'Attacking'),
+(2,3,9077,'Leather'),
+(2,3,9078,'Cloth'),
+(2,3,9125,'Generic'),
+(2,3,13358,'Defensive State (DND)'),
+(2,3,20572,'Blood Fury'),
+(2,3,20573,'Hardiness'),
+(2,3,20574,'Axe Specialization'),
+(2,3,20576,'Command'),
+(2,3,21651,'Opening'),
+(2,3,21652,'Closing'),
+(2,3,22027,'Remove Insignia'),
+(2,3,22810,'Opening - No Text'),
+(2,3,24949,'Defensive State 2 (DND)'),
+(2,3,34082,'Advantaged State (DND)'),
+(2,3,45927,'Summon Friend'),
+(2,3,61437,'Opening'),
+(2,4,81,'Dodge'),
+(2,4,203,'Unarmed'),
+(2,4,204,'Defense'),
+(2,4,522,'SPELLDEFENSE (DND)'),
+(2,4,669,'Language Orcish'),
+(2,4,1180,'Daggers'),
+(2,4,1752,'Sinister Strike'),
+(2,4,1843,'Disarm'),
+(2,4,2098,'Eviscerate'),
+(2,4,2382,'Generic'),
+(2,4,2479,'Honorless Target'),
+(2,4,2567,'Thrown'),
+(2,4,2764,'Throw'),
+(2,4,3050,'Detect'),
+(2,4,3365,'Opening'),
+(2,4,6233,'Closing'),
+(2,4,6246,'Closing'),
+(2,4,6247,'Opening'),
+(2,4,6477,'Opening'),
+(2,4,6478,'Opening'),
+(2,4,6603,'Attack'),
+(2,4,7266,'Duel'),
+(2,4,7267,'Grovel'),
+(2,4,7355,'Stuck'),
+(2,4,8386,'Attacking'),
+(2,4,9077,'Leather'),
+(2,4,9078,'Cloth'),
+(2,4,9125,'Generic'),
+(2,4,16092,'Defensive State (DND)'),
+(2,4,20572,'Blood Fury'),
+(2,4,20573,'Hardiness'),
+(2,4,20574,'Axe Specialization'),
+(2,4,21184,'Rogue Passive (DND)'),
+(2,4,21563,'Command'),
+(2,4,21651,'Opening'),
+(2,4,21652,'Closing'),
+(2,4,22027,'Remove Insignia'),
+(2,4,22810,'Opening - No Text'),
+(2,4,45927,'Summon Friend'),
+(2,4,61437,'Opening'),
+(2,6,81,'Dodge'),
+(2,6,196,'One-Handed Axes'),
+(2,6,197,'Two-Handed Axes'),
+(2,6,200,'Polearms'),
+(2,6,201,'One-Handed Swords'),
+(2,6,202,'Two-Handed Swords'),
+(2,6,203,'Unarmed'),
+(2,6,204,'Defense'),
+(2,6,522,'SPELLDEFENSE (DND)'),
+(2,6,669,'Language Orcish'),
+(2,6,674,'Dual Wield'),
+(2,6,750,'Plate Mail'),
+(2,6,1843,'Disarm'),
+(2,6,2382,'Generic'),
+(2,6,2479,'Honorless Target'),
+(2,6,3050,'Detect'),
+(2,6,3127,'Parry'),
+(2,6,3275,'Linen Bandage'),
+(2,6,3276,'Heavy Linen Bandage'),
+(2,6,3277,'Wool Bandage'),
+(2,6,3278,'Heavy Wool Bandage'),
+(2,6,3365,'Opening'),
+(2,6,6233,'Closing'),
+(2,6,6246,'Closing'),
+(2,6,6247,'Opening'),
+(2,6,6477,'Opening'),
+(2,6,6478,'Opening'),
+(2,6,6603,'Attack'),
+(2,6,7266,'Duel'),
+(2,6,7267,'Grovel'),
+(2,6,7355,'Stuck'),
+(2,6,7928,'Silk Bandage'),
+(2,6,7929,'Heavy Silk Bandage'),
+(2,6,7934,'Anti-Venom'),
+(2,6,8386,'Attacking'),
+(2,6,8737,'Mail'),
+(2,6,9077,'Leather'),
+(2,6,9078,'Cloth'),
+(2,6,9125,'Generic'),
+(2,6,10840,'Mageweave Bandage'),
+(2,6,10841,'Heavy Mageweave Bandage'),
+(2,6,10846,'First Aid'),
+(2,6,18629,'Runecloth Bandage'),
+(2,6,18630,'Heavy Runecloth Bandage'),
+(2,6,20572,'Blood Fury'),
+(2,6,20573,'Hardiness'),
+(2,6,20574,'Axe Specialization'),
+(2,6,21651,'Opening'),
+(2,6,21652,'Closing'),
+(2,6,22027,'Remove Insignia'),
+(2,6,22810,'Opening - No Text'),
+(2,6,33391,'Journeyman Riding'),
+(2,6,45462,'Plague Strike'),
+(2,6,45477,'Icy Touch'),
+(2,6,45902,'Blood Strike'),
+(2,6,45903,'Offensive State (DND)'),
+(2,6,45927,'Summon Friend'),
+(2,6,47541,'Death Coil'),
+(2,6,48266,'Blood Presence'),
+(2,6,49410,'Forceful Deflection'),
+(2,6,49576,'Death Grip'),
+(2,6,52665,'Sigil'),
+(2,6,54562,'Command'),
+(2,6,59879,'Blood Plague'),
+(2,6,59921,'Frost Fever'),
+(2,6,61437,'Opening'),
+(2,6,61455,'Runic Focus'),
+(2,7,81,'Dodge'),
+(2,7,107,'Block'),
+(2,7,198,'One-Handed Maces'),
+(2,7,203,'Unarmed'),
+(2,7,204,'Defense'),
+(2,7,227,'Staves'),
+(2,7,331,'Healing Wave'),
+(2,7,403,'Lightning Bolt'),
+(2,7,522,'SPELLDEFENSE (DND)'),
+(2,7,669,'Language Orcish'),
+(2,7,1843,'Disarm'),
+(2,7,2382,'Generic'),
+(2,7,2479,'Honorless Target'),
+(2,7,3050,'Detect'),
+(2,7,3365,'Opening'),
+(2,7,6233,'Closing'),
+(2,7,6246,'Closing'),
+(2,7,6247,'Opening'),
+(2,7,6477,'Opening'),
+(2,7,6478,'Opening'),
+(2,7,6603,'Attack'),
+(2,7,7266,'Duel'),
+(2,7,7267,'Grovel'),
+(2,7,7355,'Stuck'),
+(2,7,8386,'Attacking'),
+(2,7,9077,'Leather'),
+(2,7,9078,'Cloth'),
+(2,7,9116,'Shield'),
+(2,7,9125,'Generic'),
+(2,7,20573,'Hardiness'),
+(2,7,20574,'Axe Specialization'),
+(2,7,21563,'Command'),
+(2,7,21651,'Opening'),
+(2,7,21652,'Closing'),
+(2,7,22027,'Remove Insignia'),
+(2,7,22810,'Opening - No Text'),
+(2,7,27763,'Totem'),
+(2,7,33697,'Blood Fury'),
+(2,7,45927,'Summon Friend'),
+(2,7,61437,'Opening'),
+(2,9,81,'Dodge'),
+(2,9,203,'Unarmed'),
+(2,9,204,'Defense'),
+(2,9,522,'SPELLDEFENSE (DND)'),
+(2,9,669,'Language Orcish'),
+(2,9,686,'Shadow Bolt'),
+(2,9,687,'Demon Skin'),
+(2,9,1180,'Daggers'),
+(2,9,1843,'Disarm'),
+(2,9,2382,'Generic'),
+(2,9,2479,'Honorless Target'),
+(2,9,3050,'Detect'),
+(2,9,3365,'Opening'),
+(2,9,5009,'Wands'),
+(2,9,5019,'Shoot'),
+(2,9,6233,'Closing'),
+(2,9,6246,'Closing'),
+(2,9,6247,'Opening'),
+(2,9,6477,'Opening'),
+(2,9,6478,'Opening'),
+(2,9,6603,'Attack'),
+(2,9,7266,'Duel'),
+(2,9,7267,'Grovel'),
+(2,9,7355,'Stuck'),
+(2,9,8386,'Attacking'),
+(2,9,9078,'Cloth'),
+(2,9,9125,'Generic'),
+(2,9,20573,'Hardiness'),
+(2,9,20574,'Axe Specialization'),
+(2,9,20575,'Command'),
+(2,9,21651,'Opening'),
+(2,9,21652,'Closing'),
+(2,9,22027,'Remove Insignia'),
+(2,9,22810,'Opening - No Text'),
+(2,9,33702,'Blood Fury'),
+(2,9,45927,'Summon Friend'),
+(2,9,58284,'Chaos Bolt Passive'),
+(2,9,61437,'Opening'),
+(3,1,78,'Heroic Strike'),
+(3,1,81,'Dodge'),
+(3,1,107,'Block'),
+(3,1,196,'One-Handed Axes'),
+(3,1,197,'Two-Handed Axes'),
+(3,1,198,'One-Handed Maces'),
+(3,1,203,'Unarmed'),
+(3,1,204,'Defense'),
+(3,1,522,'SPELLDEFENSE (DND)'),
+(3,1,668,'Language Common'),
+(3,1,672,'Language Dwarven'),
+(3,1,1843,'Disarm'),
+(3,1,2382,'Generic'),
+(3,1,2457,'Battle Stance'),
+(3,1,2479,'Honorless Target'),
+(3,1,2481,'Find Treasure'),
+(3,1,3050,'Detect'),
+(3,1,3365,'Opening'),
+(3,1,5301,'Defensive State (DND)'),
+(3,1,6233,'Closing'),
+(3,1,6246,'Closing'),
+(3,1,6247,'Opening'),
+(3,1,6477,'Opening'),
+(3,1,6478,'Opening'),
+(3,1,6603,'Attack'),
+(3,1,7266,'Duel'),
+(3,1,7267,'Grovel'),
+(3,1,7355,'Stuck'),
+(3,1,8386,'Attacking'),
+(3,1,8737,'Mail'),
+(3,1,9077,'Leather'),
+(3,1,9078,'Cloth'),
+(3,1,9116,'Shield'),
+(3,1,9125,'Generic'),
+(3,1,20594,'Stoneform'),
+(3,1,20595,'Gun Specialization'),
+(3,1,20596,'Frost Resistance'),
+(3,1,21651,'Opening'),
+(3,1,21652,'Closing'),
+(3,1,22027,'Remove Insignia'),
+(3,1,22810,'Opening - No Text'),
+(3,1,32215,'Victorious State'),
+(3,1,45927,'Summon Friend'),
+(3,1,59224,'Mace Specialization'),
+(3,1,61437,'Opening'),
+(3,2,81,'Dodge'),
+(3,2,107,'Block'),
+(3,2,198,'One-Handed Maces'),
+(3,2,199,'Two-Handed Maces'),
+(3,2,203,'Unarmed'),
+(3,2,204,'Defense'),
+(3,2,522,'SPELLDEFENSE (DND)'),
+(3,2,635,'Holy Light'),
+(3,2,668,'Language Common'),
+(3,2,672,'Language Dwarven'),
+(3,2,1843,'Disarm'),
+(3,2,2382,'Generic'),
+(3,2,2479,'Honorless Target'),
+(3,2,2481,'Find Treasure'),
+(3,2,3050,'Detect'),
+(3,2,3365,'Opening'),
+(3,2,6233,'Closing'),
+(3,2,6246,'Closing'),
+(3,2,6247,'Opening'),
+(3,2,6477,'Opening'),
+(3,2,6478,'Opening'),
+(3,2,6603,'Attack'),
+(3,2,7266,'Duel'),
+(3,2,7267,'Grovel'),
+(3,2,7355,'Stuck'),
+(3,2,8386,'Attacking'),
+(3,2,8737,'Mail'),
+(3,2,9077,'Leather'),
+(3,2,9078,'Cloth'),
+(3,2,9116,'Shield'),
+(3,2,9125,'Generic'),
+(3,2,20154,'Seal of Righteousness'),
+(3,2,20594,'Stoneform'),
+(3,2,20595,'Gun Specialization'),
+(3,2,20596,'Frost Resistance'),
+(3,2,21651,'Opening'),
+(3,2,21652,'Closing'),
+(3,2,22027,'Remove Insignia'),
+(3,2,22810,'Opening - No Text'),
+(3,2,27762,'Libram'),
+(3,2,45927,'Summon Friend'),
+(3,2,59224,'Mace Specialization'),
+(3,2,61437,'Opening'),
+(3,3,75,'Auto Shot'),
+(3,3,81,'Dodge'),
+(3,3,196,'One-Handed Axes'),
+(3,3,203,'Unarmed'),
+(3,3,204,'Defense'),
+(3,3,266,'Guns'),
+(3,3,522,'SPELLDEFENSE (DND)'),
+(3,3,668,'Language Common'),
+(3,3,672,'Language Dwarven'),
+(3,3,1843,'Disarm'),
+(3,3,2382,'Generic'),
+(3,3,2479,'Honorless Target'),
+(3,3,2481,'Find Treasure'),
+(3,3,2973,'Raptor Strike'),
+(3,3,3050,'Detect'),
+(3,3,3365,'Opening'),
+(3,3,6233,'Closing'),
+(3,3,6246,'Closing'),
+(3,3,6247,'Opening'),
+(3,3,6477,'Opening'),
+(3,3,6478,'Opening'),
+(3,3,6603,'Attack'),
+(3,3,7266,'Duel'),
+(3,3,7267,'Grovel'),
+(3,3,7355,'Stuck'),
+(3,3,8386,'Attacking'),
+(3,3,9077,'Leather'),
+(3,3,9078,'Cloth'),
+(3,3,9125,'Generic'),
+(3,3,13358,'Defensive State (DND)'),
+(3,3,20594,'Stoneform'),
+(3,3,20595,'Gun Specialization'),
+(3,3,20596,'Frost Resistance'),
+(3,3,21651,'Opening'),
+(3,3,21652,'Closing'),
+(3,3,22027,'Remove Insignia'),
+(3,3,22810,'Opening - No Text'),
+(3,3,24949,'Defensive State 2 (DND)'),
+(3,3,34082,'Advantaged State (DND)'),
+(3,3,45927,'Summon Friend'),
+(3,3,59224,'Mace Specialization'),
+(3,3,61437,'Opening'),
+(3,4,81,'Dodge'),
+(3,4,203,'Unarmed'),
+(3,4,204,'Defense'),
+(3,4,522,'SPELLDEFENSE (DND)'),
+(3,4,668,'Language Common'),
+(3,4,672,'Language Dwarven'),
+(3,4,1180,'Daggers'),
+(3,4,1752,'Sinister Strike'),
+(3,4,1843,'Disarm'),
+(3,4,2098,'Eviscerate'),
+(3,4,2382,'Generic'),
+(3,4,2479,'Honorless Target'),
+(3,4,2481,'Find Treasure'),
+(3,4,2567,'Thrown'),
+(3,4,2764,'Throw'),
+(3,4,3050,'Detect'),
+(3,4,3365,'Opening'),
+(3,4,6233,'Closing'),
+(3,4,6246,'Closing'),
+(3,4,6247,'Opening'),
+(3,4,6477,'Opening'),
+(3,4,6478,'Opening'),
+(3,4,6603,'Attack'),
+(3,4,7266,'Duel'),
+(3,4,7267,'Grovel'),
+(3,4,7355,'Stuck'),
+(3,4,8386,'Attacking'),
+(3,4,9077,'Leather'),
+(3,4,9078,'Cloth'),
+(3,4,9125,'Generic'),
+(3,4,16092,'Defensive State (DND)'),
+(3,4,20594,'Stoneform'),
+(3,4,20595,'Gun Specialization'),
+(3,4,20596,'Frost Resistance'),
+(3,4,21184,'Rogue Passive (DND)'),
+(3,4,21651,'Opening'),
+(3,4,21652,'Closing'),
+(3,4,22027,'Remove Insignia'),
+(3,4,22810,'Opening - No Text'),
+(3,4,45927,'Summon Friend'),
+(3,4,59224,'Mace Specialization'),
+(3,4,61437,'Opening'),
+(3,5,81,'Dodge'),
+(3,5,198,'One-Handed Maces'),
+(3,5,203,'Unarmed'),
+(3,5,204,'Defense'),
+(3,5,522,'SPELLDEFENSE (DND)'),
+(3,5,585,'Smite'),
+(3,5,668,'Language Common'),
+(3,5,672,'Language Dwarven'),
+(3,5,1843,'Disarm'),
+(3,5,2050,'Lesser Heal'),
+(3,5,2382,'Generic'),
+(3,5,2479,'Honorless Target'),
+(3,5,2481,'Find Treasure'),
+(3,5,3050,'Detect'),
+(3,5,3365,'Opening'),
+(3,5,5009,'Wands'),
+(3,5,5019,'Shoot'),
+(3,5,6233,'Closing'),
+(3,5,6246,'Closing'),
+(3,5,6247,'Opening'),
+(3,5,6477,'Opening'),
+(3,5,6478,'Opening'),
+(3,5,6603,'Attack'),
+(3,5,7266,'Duel'),
+(3,5,7267,'Grovel'),
+(3,5,7355,'Stuck'),
+(3,5,8386,'Attacking'),
+(3,5,9078,'Cloth'),
+(3,5,9125,'Generic'),
+(3,5,20594,'Stoneform'),
+(3,5,20595,'Gun Specialization'),
+(3,5,20596,'Frost Resistance'),
+(3,5,21651,'Opening'),
+(3,5,21652,'Closing'),
+(3,5,22027,'Remove Insignia'),
+(3,5,22810,'Opening - No Text'),
+(3,5,45927,'Summon Friend'),
+(3,5,59224,'Mace Specialization'),
+(3,5,61437,'Opening'),
+(3,6,81,'Dodge'),
+(3,6,196,'One-Handed Axes'),
+(3,6,197,'Two-Handed Axes'),
+(3,6,200,'Polearms'),
+(3,6,201,'One-Handed Swords'),
+(3,6,202,'Two-Handed Swords'),
+(3,6,203,'Unarmed'),
+(3,6,204,'Defense'),
+(3,6,522,'SPELLDEFENSE (DND)'),
+(3,6,668,'Language Common'),
+(3,6,672,'Language Dwarven'),
+(3,6,674,'Dual Wield'),
+(3,6,750,'Plate Mail'),
+(3,6,1843,'Disarm'),
+(3,6,2382,'Generic'),
+(3,6,2479,'Honorless Target'),
+(3,6,2481,'Find Treasure'),
+(3,6,3050,'Detect'),
+(3,6,3127,'Parry'),
+(3,6,3275,'Linen Bandage'),
+(3,6,3276,'Heavy Linen Bandage'),
+(3,6,3277,'Wool Bandage'),
+(3,6,3278,'Heavy Wool Bandage'),
+(3,6,3365,'Opening'),
+(3,6,6233,'Closing'),
+(3,6,6246,'Closing'),
+(3,6,6247,'Opening'),
+(3,6,6477,'Opening'),
+(3,6,6478,'Opening'),
+(3,6,6603,'Attack'),
+(3,6,7266,'Duel'),
+(3,6,7267,'Grovel'),
+(3,6,7355,'Stuck'),
+(3,6,7928,'Silk Bandage'),
+(3,6,7929,'Heavy Silk Bandage'),
+(3,6,7934,'Anti-Venom'),
+(3,6,8386,'Attacking'),
+(3,6,8737,'Mail'),
+(3,6,9077,'Leather'),
+(3,6,9078,'Cloth'),
+(3,6,9125,'Generic'),
+(3,6,10840,'Mageweave Bandage'),
+(3,6,10841,'Heavy Mageweave Bandage'),
+(3,6,10846,'First Aid'),
+(3,6,18629,'Runecloth Bandage'),
+(3,6,18630,'Heavy Runecloth Bandage'),
+(3,6,20594,'Stoneform'),
+(3,6,20595,'Gun Specialization'),
+(3,6,20596,'Frost Resistance'),
+(3,6,21651,'Opening'),
+(3,6,21652,'Closing'),
+(3,6,22027,'Remove Insignia'),
+(3,6,22810,'Opening - No Text'),
+(3,6,33391,'Journeyman Riding'),
+(3,6,45462,'Plague Strike'),
+(3,6,45477,'Icy Touch'),
+(3,6,45902,'Blood Strike'),
+(3,6,45903,'Offensive State (DND)'),
+(3,6,45927,'Summon Friend'),
+(3,6,47541,'Death Coil'),
+(3,6,48266,'Blood Presence'),
+(3,6,49410,'Forceful Deflection'),
+(3,6,49576,'Death Grip'),
+(3,6,52665,'Sigil'),
+(3,6,59224,'Mace Specialization'),
+(3,6,59879,'Blood Plague'),
+(3,6,59921,'Frost Fever'),
+(3,6,61437,'Opening'),
+(3,6,61455,'Runic Focus'),
+(4,1,78,'Heroic Strike'),
+(4,1,81,'Dodge'),
+(4,1,107,'Block'),
+(4,1,198,'One-Handed Maces'),
+(4,1,201,'One-Handed Swords'),
+(4,1,203,'Unarmed'),
+(4,1,204,'Defense'),
+(4,1,522,'SPELLDEFENSE (DND)'),
+(4,1,668,'Language Common'),
+(4,1,671,'Language Darnassian'),
+(4,1,1180,'Daggers'),
+(4,1,1843,'Disarm'),
+(4,1,2382,'Generic'),
+(4,1,2457,'Battle Stance'),
+(4,1,2479,'Honorless Target'),
+(4,1,3050,'Detect'),
+(4,1,3365,'Opening'),
+(4,1,5301,'Defensive State (DND)'),
+(4,1,6233,'Closing'),
+(4,1,6246,'Closing'),
+(4,1,6247,'Opening'),
+(4,1,6477,'Opening'),
+(4,1,6478,'Opening'),
+(4,1,6603,'Attack'),
+(4,1,7266,'Duel'),
+(4,1,7267,'Grovel'),
+(4,1,7355,'Stuck'),
+(4,1,8386,'Attacking'),
+(4,1,8737,'Mail'),
+(4,1,9077,'Leather'),
+(4,1,9078,'Cloth'),
+(4,1,9116,'Shield'),
+(4,1,9125,'Generic'),
+(4,1,20582,'Quickness'),
+(4,1,20583,'Nature Resistance'),
+(4,1,20585,'Wisp Spirit'),
+(4,1,21651,'Opening'),
+(4,1,21652,'Closing'),
+(4,1,22027,'Remove Insignia'),
+(4,1,22810,'Opening - No Text'),
+(4,1,32215,'Victorious State'),
+(4,1,45927,'Summon Friend'),
+(4,1,58984,'Shadowmelt'),
+(4,1,61437,'Opening'),
+(4,3,75,'Auto Shot'),
+(4,3,81,'Dodge'),
+(4,3,203,'Unarmed'),
+(4,3,204,'Defense'),
+(4,3,264,'Bows'),
+(4,3,522,'SPELLDEFENSE (DND)'),
+(4,3,668,'Language Common'),
+(4,3,671,'Language Darnassian'),
+(4,3,1180,'Daggers'),
+(4,3,1843,'Disarm'),
+(4,3,2382,'Generic'),
+(4,3,2479,'Honorless Target'),
+(4,3,2973,'Raptor Strike'),
+(4,3,3050,'Detect'),
+(4,3,3365,'Opening'),
+(4,3,6233,'Closing'),
+(4,3,6246,'Closing'),
+(4,3,6247,'Opening'),
+(4,3,6477,'Opening'),
+(4,3,6478,'Opening'),
+(4,3,6603,'Attack'),
+(4,3,7266,'Duel'),
+(4,3,7267,'Grovel'),
+(4,3,7355,'Stuck'),
+(4,3,8386,'Attacking'),
+(4,3,9077,'Leather'),
+(4,3,9078,'Cloth'),
+(4,3,9125,'Generic'),
+(4,3,13358,'Defensive State (DND)'),
+(4,3,20582,'Quickness'),
+(4,3,20583,'Nature Resistance'),
+(4,3,20585,'Wisp Spirit'),
+(4,3,21651,'Opening'),
+(4,3,21652,'Closing'),
+(4,3,22027,'Remove Insignia'),
+(4,3,22810,'Opening - No Text'),
+(4,3,24949,'Defensive State 2 (DND)'),
+(4,3,34082,'Advantaged State (DND)'),
+(4,3,45927,'Summon Friend'),
+(4,3,58984,'Shadowmelt'),
+(4,3,61437,'Opening'),
+(4,4,81,'Dodge'),
+(4,4,203,'Unarmed'),
+(4,4,204,'Defense'),
+(4,4,522,'SPELLDEFENSE (DND)'),
+(4,4,668,'Language Common'),
+(4,4,671,'Language Darnassian'),
+(4,4,1180,'Daggers'),
+(4,4,1752,'Sinister Strike'),
+(4,4,1843,'Disarm'),
+(4,4,2098,'Eviscerate'),
+(4,4,2382,'Generic'),
+(4,4,2479,'Honorless Target'),
+(4,4,2567,'Thrown'),
+(4,4,2764,'Throw'),
+(4,4,3050,'Detect'),
+(4,4,3365,'Opening'),
+(4,4,6233,'Closing'),
+(4,4,6246,'Closing'),
+(4,4,6247,'Opening'),
+(4,4,6477,'Opening'),
+(4,4,6478,'Opening'),
+(4,4,6603,'Attack'),
+(4,4,7266,'Duel'),
+(4,4,7267,'Grovel'),
+(4,4,7355,'Stuck'),
+(4,4,8386,'Attacking'),
+(4,4,9077,'Leather'),
+(4,4,9078,'Cloth'),
+(4,4,9125,'Generic'),
+(4,4,16092,'Defensive State (DND)'),
+(4,4,20582,'Quickness'),
+(4,4,20583,'Nature Resistance'),
+(4,4,20585,'Wisp Spirit'),
+(4,4,21184,'Rogue Passive (DND)'),
+(4,4,21651,'Opening'),
+(4,4,21652,'Closing'),
+(4,4,22027,'Remove Insignia'),
+(4,4,22810,'Opening - No Text'),
+(4,4,45927,'Summon Friend'),
+(4,4,58984,'Shadowmelt'),
+(4,4,61437,'Opening'),
+(4,5,81,'Dodge'),
+(4,5,198,'One-Handed Maces'),
+(4,5,203,'Unarmed'),
+(4,5,204,'Defense'),
+(4,5,522,'SPELLDEFENSE (DND)'),
+(4,5,585,'Smite'),
+(4,5,668,'Language Common'),
+(4,5,671,'Language Darnassian'),
+(4,5,1843,'Disarm'),
+(4,5,2050,'Lesser Heal'),
+(4,5,2382,'Generic'),
+(4,5,2479,'Honorless Target'),
+(4,5,3050,'Detect'),
+(4,5,3365,'Opening'),
+(4,5,5009,'Wands'),
+(4,5,5019,'Shoot'),
+(4,5,6233,'Closing'),
+(4,5,6246,'Closing'),
+(4,5,6247,'Opening'),
+(4,5,6477,'Opening'),
+(4,5,6478,'Opening'),
+(4,5,6603,'Attack'),
+(4,5,7266,'Duel'),
+(4,5,7267,'Grovel'),
+(4,5,7355,'Stuck'),
+(4,5,8386,'Attacking'),
+(4,5,9078,'Cloth'),
+(4,5,9125,'Generic'),
+(4,5,20582,'Quickness'),
+(4,5,20583,'Nature Resistance'),
+(4,5,20585,'Wisp Spirit'),
+(4,5,21651,'Opening'),
+(4,5,21652,'Closing'),
+(4,5,22027,'Remove Insignia'),
+(4,5,22810,'Opening - No Text'),
+(4,5,45927,'Summon Friend'),
+(4,5,58984,'Shadowmelt'),
+(4,5,61437,'Opening'),
+(4,6,81,'Dodge'),
+(4,6,196,'One-Handed Axes'),
+(4,6,197,'Two-Handed Axes'),
+(4,6,200,'Polearms'),
+(4,6,201,'One-Handed Swords'),
+(4,6,202,'Two-Handed Swords'),
+(4,6,203,'Unarmed'),
+(4,6,204,'Defense'),
+(4,6,522,'SPELLDEFENSE (DND)'),
+(4,6,668,'Language Common'),
+(4,6,671,'Language Darnassian'),
+(4,6,674,'Dual Wield'),
+(4,6,750,'Plate Mail'),
+(4,6,1843,'Disarm'),
+(4,6,2382,'Generic'),
+(4,6,2479,'Honorless Target'),
+(4,6,3050,'Detect'),
+(4,6,3127,'Parry'),
+(4,6,3275,'Linen Bandage'),
+(4,6,3276,'Heavy Linen Bandage'),
+(4,6,3277,'Wool Bandage'),
+(4,6,3278,'Heavy Wool Bandage'),
+(4,6,3365,'Opening'),
+(4,6,6233,'Closing'),
+(4,6,6246,'Closing'),
+(4,6,6247,'Opening'),
+(4,6,6477,'Opening'),
+(4,6,6478,'Opening'),
+(4,6,6603,'Attack'),
+(4,6,7266,'Duel'),
+(4,6,7267,'Grovel'),
+(4,6,7355,'Stuck'),
+(4,6,7928,'Silk Bandage'),
+(4,6,7929,'Heavy Silk Bandage'),
+(4,6,7934,'Anti-Venom'),
+(4,6,8386,'Attacking'),
+(4,6,8737,'Mail'),
+(4,6,9077,'Leather'),
+(4,6,9078,'Cloth'),
+(4,6,9125,'Generic'),
+(4,6,10840,'Mageweave Bandage'),
+(4,6,10841,'Heavy Mageweave Bandage'),
+(4,6,10846,'First Aid'),
+(4,6,18629,'Runecloth Bandage'),
+(4,6,18630,'Heavy Runecloth Bandage'),
+(4,6,20582,'Quickness'),
+(4,6,20583,'Nature Resistance'),
+(4,6,20585,'Wisp Spirit'),
+(4,6,21651,'Opening'),
+(4,6,21652,'Closing'),
+(4,6,22027,'Remove Insignia'),
+(4,6,22810,'Opening - No Text'),
+(4,6,33391,'Journeyman Riding'),
+(4,6,45462,'Plague Strike'),
+(4,6,45477,'Icy Touch'),
+(4,6,45902,'Blood Strike'),
+(4,6,45903,'Offensive State (DND)'),
+(4,6,45927,'Summon Friend'),
+(4,6,47541,'Death Coil'),
+(4,6,48266,'Blood Presence'),
+(4,6,49410,'Forceful Deflection'),
+(4,6,49576,'Death Grip'),
+(4,6,52665,'Sigil'),
+(4,6,58984,'Shadowmeld'),
+(4,6,59879,'Blood Plague'),
+(4,6,59921,'Frost Fever'),
+(4,6,61437,'Opening'),
+(4,6,61455,'Runic Focus'),
+(4,11,81,'Dodge'),
+(4,11,203,'Unarmed'),
+(4,11,204,'Defense'),
+(4,11,227,'Staves'),
+(4,11,522,'SPELLDEFENSE (DND)'),
+(4,11,668,'Language Common'),
+(4,11,671,'Language Darnassian'),
+(4,11,1180,'Daggers'),
+(4,11,1843,'Disarm'),
+(4,11,2382,'Generic'),
+(4,11,2479,'Honorless Target'),
+(4,11,3050,'Detect'),
+(4,11,3365,'Opening'),
+(4,11,5176,'Wrath'),
+(4,11,5185,'Healing Touch'),
+(4,11,6233,'Closing'),
+(4,11,6246,'Closing'),
+(4,11,6247,'Opening'),
+(4,11,6477,'Opening'),
+(4,11,6478,'Opening'),
+(4,11,6603,'Attack'),
+(4,11,7266,'Duel'),
+(4,11,7267,'Grovel'),
+(4,11,7355,'Stuck'),
+(4,11,8386,'Attacking'),
+(4,11,9077,'Leather'),
+(4,11,9078,'Cloth'),
+(4,11,9125,'Generic'),
+(4,11,20582,'Quickness'),
+(4,11,20583,'Nature Resistance'),
+(4,11,20585,'Wisp Spirit'),
+(4,11,21651,'Opening'),
+(4,11,21652,'Closing'),
+(4,11,22027,'Remove Insignia'),
+(4,11,22810,'Opening - No Text'),
+(4,11,27764,'Fetish'),
+(4,11,45927,'Summon Friend'),
+(4,11,58984,'Shadowmelt'),
+(4,11,61437,'Opening'),
+(5,1,78,'Heroic Strike'),
+(5,1,81,'Dodge'),
+(5,1,107,'Block'),
+(5,1,201,'One-Handed Swords'),
+(5,1,202,'Two-Handed Swords'),
+(5,1,203,'Unarmed'),
+(5,1,204,'Defense'),
+(5,1,522,'SPELLDEFENSE (DND)'),
+(5,1,669,'Language Orcish'),
+(5,1,1180,'Daggers'),
+(5,1,1843,'Disarm'),
+(5,1,2382,'Generic'),
+(5,1,2457,'Battle Stance'),
+(5,1,2479,'Honorless Target'),
+(5,1,3050,'Detect'),
+(5,1,3365,'Opening'),
+(5,1,5227,'Underwater Breathing'),
+(5,1,5301,'Defensive State (DND)'),
+(5,1,6233,'Closing'),
+(5,1,6246,'Closing'),
+(5,1,6247,'Opening'),
+(5,1,6477,'Opening'),
+(5,1,6478,'Opening'),
+(5,1,6603,'Attack'),
+(5,1,7266,'Duel'),
+(5,1,7267,'Grovel'),
+(5,1,7355,'Stuck'),
+(5,1,7744,'Will of the Forsaken'),
+(5,1,8386,'Attacking'),
+(5,1,8737,'Mail'),
+(5,1,9077,'Leather'),
+(5,1,9078,'Cloth'),
+(5,1,9116,'Shield'),
+(5,1,9125,'Generic'),
+(5,1,17737,'Language Gutterspeak'),
+(5,1,20577,'Cannibalize'),
+(5,1,20579,'Shadow Resistance'),
+(5,1,21651,'Opening'),
+(5,1,21652,'Closing'),
+(5,1,22027,'Remove Insignia'),
+(5,1,22810,'Opening - No Text'),
+(5,1,32215,'Victorious State'),
+(5,1,45927,'Summon Friend'),
+(5,1,61437,'Opening'),
+(5,4,81,'Dodge'),
+(5,4,203,'Unarmed'),
+(5,4,204,'Defense'),
+(5,4,522,'SPELLDEFENSE (DND)'),
+(5,4,669,'Language Orcish'),
+(5,4,1180,'Daggers'),
+(5,4,1752,'Sinister Strike'),
+(5,4,1843,'Disarm'),
+(5,4,2098,'Eviscerate'),
+(5,4,2382,'Generic'),
+(5,4,2479,'Honorless Target'),
+(5,4,2567,'Thrown'),
+(5,4,2764,'Throw'),
+(5,4,3050,'Detect'),
+(5,4,3365,'Opening'),
+(5,4,5227,'Underwater Breathing'),
+(5,4,6233,'Closing'),
+(5,4,6246,'Closing'),
+(5,4,6247,'Opening'),
+(5,4,6477,'Opening'),
+(5,4,6478,'Opening'),
+(5,4,6603,'Attack'),
+(5,4,7266,'Duel'),
+(5,4,7267,'Grovel'),
+(5,4,7355,'Stuck'),
+(5,4,7744,'Will of the Forsaken'),
+(5,4,8386,'Attacking'),
+(5,4,9077,'Leather'),
+(5,4,9078,'Cloth'),
+(5,4,9125,'Generic'),
+(5,4,16092,'Defensive State (DND)'),
+(5,4,17737,'Language Gutterspeak'),
+(5,4,20577,'Cannibalize'),
+(5,4,20579,'Shadow Resistance'),
+(5,4,21184,'Rogue Passive (DND)'),
+(5,4,21651,'Opening'),
+(5,4,21652,'Closing'),
+(5,4,22027,'Remove Insignia'),
+(5,4,22810,'Opening - No Text'),
+(5,4,45927,'Summon Friend'),
+(5,4,61437,'Opening'),
+(5,5,81,'Dodge'),
+(5,5,198,'One-Handed Maces'),
+(5,5,203,'Unarmed'),
+(5,5,204,'Defense'),
+(5,5,522,'SPELLDEFENSE (DND)'),
+(5,5,585,'Smite'),
+(5,5,669,'Language Orcish'),
+(5,5,1843,'Disarm'),
+(5,5,2050,'Lesser Heal'),
+(5,5,2382,'Generic'),
+(5,5,2479,'Honorless Target'),
+(5,5,3050,'Detect'),
+(5,5,3365,'Opening'),
+(5,5,5009,'Wands'),
+(5,5,5019,'Shoot'),
+(5,5,5227,'Underwater Breathing'),
+(5,5,6233,'Closing'),
+(5,5,6246,'Closing'),
+(5,5,6247,'Opening'),
+(5,5,6477,'Opening'),
+(5,5,6478,'Opening'),
+(5,5,6603,'Attack'),
+(5,5,7266,'Duel'),
+(5,5,7267,'Grovel'),
+(5,5,7355,'Stuck'),
+(5,5,7744,'Will of the Forsaken'),
+(5,5,8386,'Attacking'),
+(5,5,9078,'Cloth'),
+(5,5,9125,'Generic'),
+(5,5,17737,'Language Gutterspeak'),
+(5,5,20577,'Cannibalize'),
+(5,5,20579,'Shadow Resistance'),
+(5,5,21651,'Opening'),
+(5,5,21652,'Closing'),
+(5,5,22027,'Remove Insignia'),
+(5,5,22810,'Opening - No Text'),
+(5,5,45927,'Summon Friend'),
+(5,5,61437,'Opening'),
+(5,6,81,'Dodge'),
+(5,6,196,'One-Handed Axes'),
+(5,6,197,'Two-Handed Axes'),
+(5,6,200,'Polearms'),
+(5,6,201,'One-Handed Swords'),
+(5,6,202,'Two-Handed Swords'),
+(5,6,203,'Unarmed'),
+(5,6,204,'Defense'),
+(5,6,522,'SPELLDEFENSE (DND)'),
+(5,6,669,'Language Orcish'),
+(5,6,674,'Dual Wield'),
+(5,6,750,'Plate Mail'),
+(5,6,1843,'Disarm'),
+(5,6,2382,'Generic'),
+(5,6,2479,'Honorless Target'),
+(5,6,3050,'Detect'),
+(5,6,3127,'Parry'),
+(5,6,3275,'Linen Bandage'),
+(5,6,3276,'Heavy Linen Bandage'),
+(5,6,3277,'Wool Bandage'),
+(5,6,3278,'Heavy Wool Bandage'),
+(5,6,3365,'Opening'),
+(5,6,5227,'Underwater Breathing'),
+(5,6,6233,'Closing'),
+(5,6,6246,'Closing'),
+(5,6,6247,'Opening'),
+(5,6,6477,'Opening'),
+(5,6,6478,'Opening'),
+(5,6,6603,'Attack'),
+(5,6,7266,'Duel'),
+(5,6,7267,'Grovel'),
+(5,6,7355,'Stuck'),
+(5,6,7744,'Will of the Forsaken'),
+(5,6,7928,'Silk Bandage'),
+(5,6,7929,'Heavy Silk Bandage'),
+(5,6,7934,'Anti-Venom'),
+(5,6,8386,'Attacking'),
+(5,6,8737,'Mail'),
+(5,6,9077,'Leather'),
+(5,6,9078,'Cloth'),
+(5,6,9125,'Generic'),
+(5,6,10840,'Mageweave Bandage'),
+(5,6,10841,'Heavy Mageweave Bandage'),
+(5,6,10846,'First Aid'),
+(5,6,17737,'Language Gutterspeak'),
+(5,6,18629,'Runecloth Bandage'),
+(5,6,18630,'Heavy Runecloth Bandage'),
+(5,6,20577,'Cannibalize'),
+(5,6,20579,'Shadow Resistance'),
+(5,6,21651,'Opening'),
+(5,6,21652,'Closing'),
+(5,6,22027,'Remove Insignia'),
+(5,6,22810,'Opening - No Text'),
+(5,6,33391,'Journeyman Riding'),
+(5,6,45462,'Plague Strike'),
+(5,6,45477,'Icy Touch'),
+(5,6,45902,'Blood Strike'),
+(5,6,45903,'Offensive State (DND)'),
+(5,6,45927,'Summon Friend'),
+(5,6,47541,'Death Coil'),
+(5,6,48266,'Blood Presence'),
+(5,6,49410,'Forceful Deflection'),
+(5,6,49576,'Death Grip'),
+(5,6,52665,'Sigil'),
+(5,6,59879,'Blood Plague'),
+(5,6,59921,'Frost Fever'),
+(5,6,61437,'Opening'),
+(5,6,61455,'Runic Focus'),
+(5,8,81,'Dodge'),
+(5,8,133,'Fireball'),
+(5,8,168,'Frost Armor'),
+(5,8,203,'Unarmed'),
+(5,8,204,'Defense'),
+(5,8,227,'Staves'),
+(5,8,522,'SPELLDEFENSE (DND)'),
+(5,8,669,'Language Orcish'),
+(5,8,1843,'Disarm'),
+(5,8,2382,'Generic'),
+(5,8,2479,'Honorless Target'),
+(5,8,3050,'Detect'),
+(5,8,3365,'Opening'),
+(5,8,5009,'Wands'),
+(5,8,5019,'Shoot'),
+(5,8,5227,'Underwater Breathing'),
+(5,8,6233,'Closing'),
+(5,8,6246,'Closing'),
+(5,8,6247,'Opening'),
+(5,8,6477,'Opening'),
+(5,8,6478,'Opening'),
+(5,8,6603,'Attack'),
+(5,8,7266,'Duel'),
+(5,8,7267,'Grovel'),
+(5,8,7355,'Stuck'),
+(5,8,7744,'Will of the Forsaken'),
+(5,8,8386,'Attacking'),
+(5,8,9078,'Cloth'),
+(5,8,9125,'Generic'),
+(5,8,17737,'Language Gutterspeak'),
+(5,8,20577,'Cannibalize'),
+(5,8,20579,'Shadow Resistance'),
+(5,8,21651,'Opening'),
+(5,8,21652,'Closing'),
+(5,8,22027,'Remove Insignia'),
+(5,8,22810,'Opening - No Text'),
+(5,8,45927,'Summon Friend'),
+(5,8,61437,'Opening'),
+(5,9,81,'Dodge'),
+(5,9,203,'Unarmed'),
+(5,9,204,'Defense'),
+(5,9,522,'SPELLDEFENSE (DND)'),
+(5,9,669,'Language Orcish'),
+(5,9,686,'Shadow Bolt'),
+(5,9,687,'Demon Skin'),
+(5,9,1180,'Daggers'),
+(5,9,1843,'Disarm'),
+(5,9,2382,'Generic'),
+(5,9,2479,'Honorless Target'),
+(5,9,3050,'Detect'),
+(5,9,3365,'Opening'),
+(5,9,5009,'Wands'),
+(5,9,5019,'Shoot'),
+(5,9,5227,'Underwater Breathing'),
+(5,9,6233,'Closing'),
+(5,9,6246,'Closing'),
+(5,9,6247,'Opening'),
+(5,9,6477,'Opening'),
+(5,9,6478,'Opening'),
+(5,9,6603,'Attack'),
+(5,9,7266,'Duel'),
+(5,9,7267,'Grovel'),
+(5,9,7355,'Stuck'),
+(5,9,7744,'Will of the Forsaken'),
+(5,9,8386,'Attacking'),
+(5,9,9078,'Cloth'),
+(5,9,9125,'Generic'),
+(5,9,17737,'Language Gutterspeak'),
+(5,9,20577,'Cannibalize'),
+(5,9,20579,'Shadow Resistance'),
+(5,9,21651,'Opening'),
+(5,9,21652,'Closing'),
+(5,9,22027,'Remove Insignia'),
+(5,9,22810,'Opening - No Text'),
+(5,9,45927,'Summon Friend'),
+(5,9,58284,'Chaos Bolt Passive'),
+(5,9,61437,'Opening'),
+(6,1,78,'Heroic Strike'),
+(6,1,81,'Dodge'),
+(6,1,107,'Block'),
+(6,1,196,'One-Handed Axes'),
+(6,1,198,'One-Handed Maces'),
+(6,1,199,'Two-Handed Maces'),
+(6,1,203,'Unarmed'),
+(6,1,204,'Defense'),
+(6,1,522,'SPELLDEFENSE (DND)'),
+(6,1,669,'Language Orcish'),
+(6,1,670,'Language Taurahe'),
+(6,1,1843,'Disarm'),
+(6,1,2382,'Generic'),
+(6,1,2457,'Battle Stance'),
+(6,1,2479,'Honorless Target'),
+(6,1,3050,'Detect'),
+(6,1,3365,'Opening'),
+(6,1,5301,'Defensive State (DND)'),
+(6,1,6233,'Closing'),
+(6,1,6246,'Closing'),
+(6,1,6247,'Opening'),
+(6,1,6477,'Opening'),
+(6,1,6478,'Opening'),
+(6,1,6603,'Attack'),
+(6,1,7266,'Duel'),
+(6,1,7267,'Grovel'),
+(6,1,7355,'Stuck'),
+(6,1,8386,'Attacking'),
+(6,1,8737,'Mail'),
+(6,1,9077,'Leather'),
+(6,1,9078,'Cloth'),
+(6,1,9116,'Shield'),
+(6,1,9125,'Generic'),
+(6,1,20549,'War Stomp'),
+(6,1,20550,'Endurance'),
+(6,1,20551,'Nature Resistance'),
+(6,1,20552,'Cultivation'),
+(6,1,21651,'Opening'),
+(6,1,21652,'Closing'),
+(6,1,22027,'Remove Insignia'),
+(6,1,22810,'Opening - No Text'),
+(6,1,32215,'Victorious State'),
+(6,1,45927,'Summon Friend'),
+(6,1,61437,'Opening'),
+(6,3,75,'Auto Shot'),
+(6,3,81,'Dodge'),
+(6,3,196,'One-Handed Axes'),
+(6,3,203,'Unarmed'),
+(6,3,204,'Defense'),
+(6,3,266,'Guns'),
+(6,3,522,'SPELLDEFENSE (DND)'),
+(6,3,669,'Language Orcish'),
+(6,3,670,'Language Taurahe'),
+(6,3,1843,'Disarm'),
+(6,3,2382,'Generic'),
+(6,3,2479,'Honorless Target'),
+(6,3,2973,'Raptor Strike'),
+(6,3,3050,'Detect'),
+(6,3,3365,'Opening'),
+(6,3,6233,'Closing'),
+(6,3,6246,'Closing'),
+(6,3,6247,'Opening'),
+(6,3,6477,'Opening'),
+(6,3,6478,'Opening'),
+(6,3,6603,'Attack'),
+(6,3,7266,'Duel'),
+(6,3,7267,'Grovel'),
+(6,3,7355,'Stuck'),
+(6,3,8386,'Attacking'),
+(6,3,9077,'Leather'),
+(6,3,9078,'Cloth'),
+(6,3,9125,'Generic'),
+(6,3,13358,'Defensive State (DND)'),
+(6,3,20549,'War Stomp'),
+(6,3,20550,'Endurance'),
+(6,3,20551,'Nature Resistance'),
+(6,3,20552,'Cultivation'),
+(6,3,21651,'Opening'),
+(6,3,21652,'Closing'),
+(6,3,22027,'Remove Insignia'),
+(6,3,22810,'Opening - No Text'),
+(6,3,24949,'Defensive State 2 (DND)'),
+(6,3,34082,'Advantaged State (DND)'),
+(6,3,45927,'Summon Friend'),
+(6,3,61437,'Opening'),
+(6,6,81,'Dodge'),
+(6,6,196,'One-Handed Axes'),
+(6,6,197,'Two-Handed Axes'),
+(6,6,200,'Polearms'),
+(6,6,201,'One-Handed Swords'),
+(6,6,202,'Two-Handed Swords'),
+(6,6,203,'Unarmed'),
+(6,6,204,'Defense'),
+(6,6,522,'SPELLDEFENSE (DND)'),
+(6,6,669,'Language Orcish'),
+(6,6,670,'Language Taurahe'),
+(6,6,674,'Dual Wield'),
+(6,6,750,'Plate Mail'),
+(6,6,1843,'Disarm'),
+(6,6,2382,'Generic'),
+(6,6,2479,'Honorless Target'),
+(6,6,3050,'Detect'),
+(6,6,3127,'Parry'),
+(6,6,3275,'Linen Bandage'),
+(6,6,3276,'Heavy Linen Bandage'),
+(6,6,3277,'Wool Bandage'),
+(6,6,3278,'Heavy Wool Bandage'),
+(6,6,3365,'Opening'),
+(6,6,6233,'Closing'),
+(6,6,6246,'Closing'),
+(6,6,6247,'Opening'),
+(6,6,6477,'Opening'),
+(6,6,6478,'Opening'),
+(6,6,6603,'Attack'),
+(6,6,7266,'Duel'),
+(6,6,7267,'Grovel'),
+(6,6,7355,'Stuck'),
+(6,6,7928,'Silk Bandage'),
+(6,6,7929,'Heavy Silk Bandage'),
+(6,6,7934,'Anti-Venom'),
+(6,6,8386,'Attacking'),
+(6,6,8737,'Mail'),
+(6,6,9077,'Leather'),
+(6,6,9078,'Cloth'),
+(6,6,9125,'Generic'),
+(6,6,10840,'Mageweave Bandage'),
+(6,6,10841,'Heavy Mageweave Bandage'),
+(6,6,10846,'First Aid'),
+(6,6,18629,'Runecloth Bandage'),
+(6,6,18630,'Heavy Runecloth Bandage'),
+(6,6,20549,'War Stomp'),
+(6,6,20550,'Endurance'),
+(6,6,20551,'Nature Resistance'),
+(6,6,20552,'Cultivation'),
+(6,6,21651,'Opening'),
+(6,6,21652,'Closing'),
+(6,6,22027,'Remove Insignia'),
+(6,6,22810,'Opening - No Text'),
+(6,6,33391,'Journeyman Riding'),
+(6,6,45462,'Plague Strike'),
+(6,6,45477,'Icy Touch'),
+(6,6,45902,'Blood Strike'),
+(6,6,45903,'Offensive State (DND)'),
+(6,6,45927,'Summon Friend'),
+(6,6,47541,'Death Coil'),
+(6,6,48266,'Blood Presence'),
+(6,6,49410,'Forceful Deflection'),
+(6,6,49576,'Death Grip'),
+(6,6,52665,'Sigil'),
+(6,6,59879,'Blood Plague'),
+(6,6,59921,'Frost Fever'),
+(6,6,61437,'Opening'),
+(6,6,61455,'Runic Focus'),
+(6,7,81,'Dodge'),
+(6,7,107,'Block'),
+(6,7,198,'One-Handed Maces'),
+(6,7,203,'Unarmed'),
+(6,7,204,'Defense'),
+(6,7,227,'Staves'),
+(6,7,331,'Healing Wave'),
+(6,7,403,'Lightning Bolt'),
+(6,7,522,'SPELLDEFENSE (DND)'),
+(6,7,669,'Language Orcish'),
+(6,7,670,'Language Taurahe'),
+(6,7,1843,'Disarm'),
+(6,7,2382,'Generic'),
+(6,7,2479,'Honorless Target'),
+(6,7,3050,'Detect'),
+(6,7,3365,'Opening'),
+(6,7,6233,'Closing'),
+(6,7,6246,'Closing'),
+(6,7,6247,'Opening'),
+(6,7,6477,'Opening'),
+(6,7,6478,'Opening'),
+(6,7,6603,'Attack'),
+(6,7,7266,'Duel'),
+(6,7,7267,'Grovel'),
+(6,7,7355,'Stuck'),
+(6,7,8386,'Attacking'),
+(6,7,9077,'Leather'),
+(6,7,9078,'Cloth'),
+(6,7,9116,'Shield'),
+(6,7,9125,'Generic'),
+(6,7,20549,'War Stomp'),
+(6,7,20550,'Endurance'),
+(6,7,20551,'Nature Resistance'),
+(6,7,20552,'Cultivation'),
+(6,7,21651,'Opening'),
+(6,7,21652,'Closing'),
+(6,7,22027,'Remove Insignia'),
+(6,7,22810,'Opening - No Text'),
+(6,7,27763,'Totem'),
+(6,7,45927,'Summon Friend'),
+(6,7,61437,'Opening'),
+(6,11,81,'Dodge'),
+(6,11,198,'One-Handed Maces'),
+(6,11,203,'Unarmed'),
+(6,11,204,'Defense'),
+(6,11,227,'Staves'),
+(6,11,522,'SPELLDEFENSE (DND)'),
+(6,11,669,'Language Orcish'),
+(6,11,670,'Language Taurahe'),
+(6,11,1843,'Disarm'),
+(6,11,2382,'Generic'),
+(6,11,2479,'Honorless Target'),
+(6,11,3050,'Detect'),
+(6,11,3365,'Opening'),
+(6,11,5176,'Wrath'),
+(6,11,5185,'Healing Touch'),
+(6,11,6233,'Closing'),
+(6,11,6246,'Closing'),
+(6,11,6247,'Opening'),
+(6,11,6477,'Opening'),
+(6,11,6478,'Opening'),
+(6,11,6603,'Attack'),
+(6,11,7266,'Duel'),
+(6,11,7267,'Grovel'),
+(6,11,7355,'Stuck'),
+(6,11,8386,'Attacking'),
+(6,11,9077,'Leather'),
+(6,11,9078,'Cloth'),
+(6,11,9125,'Generic'),
+(6,11,20549,'War Stomp'),
+(6,11,20550,'Endurance'),
+(6,11,20551,'Nature Resistance'),
+(6,11,20552,'Cultivation'),
+(6,11,21651,'Opening'),
+(6,11,21652,'Closing'),
+(6,11,22027,'Remove Insignia'),
+(6,11,22810,'Opening - No Text'),
+(6,11,27764,'Fetish'),
+(6,11,45927,'Summon Friend'),
+(6,11,61437,'Opening'),
+(7,1,78,'Heroic Strike'),
+(7,1,81,'Dodge'),
+(7,1,107,'Block'),
+(7,1,198,'One-Handed Maces'),
+(7,1,201,'One-Handed Swords'),
+(7,1,203,'Unarmed'),
+(7,1,204,'Defense'),
+(7,1,522,'SPELLDEFENSE (DND)'),
+(7,1,668,'Language Common'),
+(7,1,1180,'Daggers'),
+(7,1,1843,'Disarm'),
+(7,1,2382,'Generic'),
+(7,1,2457,'Battle Stance'),
+(7,1,2479,'Honorless Target'),
+(7,1,3050,'Detect'),
+(7,1,3365,'Opening'),
+(7,1,5301,'Defensive State (DND)'),
+(7,1,6233,'Closing'),
+(7,1,6246,'Closing'),
+(7,1,6247,'Opening'),
+(7,1,6477,'Opening'),
+(7,1,6478,'Opening'),
+(7,1,6603,'Attack'),
+(7,1,7266,'Duel'),
+(7,1,7267,'Grovel'),
+(7,1,7340,'Language Gnomish'),
+(7,1,7355,'Stuck'),
+(7,1,8386,'Attacking'),
+(7,1,8737,'Mail'),
+(7,1,9077,'Leather'),
+(7,1,9078,'Cloth'),
+(7,1,9116,'Shield'),
+(7,1,9125,'Generic'),
+(7,1,20589,'Escape Artist'),
+(7,1,20591,'Expansive Mind'),
+(7,1,20592,'Arcane Resistance'),
+(7,1,20593,'Engineering Specialization'),
+(7,1,21651,'Opening'),
+(7,1,21652,'Closing'),
+(7,1,22027,'Remove Insignia'),
+(7,1,22810,'Opening - No Text'),
+(7,1,32215,'Victorious State'),
+(7,1,45927,'Summon Friend'),
+(7,1,61437,'Opening'),
+(7,4,81,'Dodge'),
+(7,4,203,'Unarmed'),
+(7,4,204,'Defense'),
+(7,4,522,'SPELLDEFENSE (DND)'),
+(7,4,668,'Language Common'),
+(7,4,1180,'Daggers'),
+(7,4,1752,'Sinister Strike'),
+(7,4,1843,'Disarm'),
+(7,4,2098,'Eviscerate'),
+(7,4,2382,'Generic'),
+(7,4,2479,'Honorless Target'),
+(7,4,2567,'Thrown'),
+(7,4,2764,'Throw'),
+(7,4,3050,'Detect'),
+(7,4,3365,'Opening'),
+(7,4,6233,'Closing'),
+(7,4,6246,'Closing'),
+(7,4,6247,'Opening'),
+(7,4,6477,'Opening'),
+(7,4,6478,'Opening'),
+(7,4,6603,'Attack'),
+(7,4,7266,'Duel'),
+(7,4,7267,'Grovel'),
+(7,4,7340,'Language Gnomish'),
+(7,4,7355,'Stuck'),
+(7,4,8386,'Attacking'),
+(7,4,9077,'Leather'),
+(7,4,9078,'Cloth'),
+(7,4,9125,'Generic'),
+(7,4,16092,'Defensive State (DND)'),
+(7,4,20589,'Escape Artist'),
+(7,4,20591,'Expansive Mind'),
+(7,4,20592,'Arcane Resistance'),
+(7,4,20593,'Engineering Specialization'),
+(7,4,21184,'Rogue Passive (DND)'),
+(7,4,21651,'Opening'),
+(7,4,21652,'Closing'),
+(7,4,22027,'Remove Insignia'),
+(7,4,22810,'Opening - No Text'),
+(7,4,45927,'Summon Friend'),
+(7,4,61437,'Opening'),
+(7,6,81,'Dodge'),
+(7,6,196,'One-Handed Axes'),
+(7,6,197,'Two-Handed Axes'),
+(7,6,200,'Polearms'),
+(7,6,201,'One-Handed Swords'),
+(7,6,202,'Two-Handed Swords'),
+(7,6,203,'Unarmed'),
+(7,6,204,'Defense'),
+(7,6,522,'SPELLDEFENSE (DND)'),
+(7,6,668,'Language Common'),
+(7,6,674,'Dual Wield'),
+(7,6,750,'Plate Mail'),
+(7,6,1843,'Disarm'),
+(7,6,2382,'Generic'),
+(7,6,2479,'Honorless Target'),
+(7,6,3050,'Detect'),
+(7,6,3127,'Parry'),
+(7,6,3275,'Linen Bandage'),
+(7,6,3276,'Heavy Linen Bandage'),
+(7,6,3277,'Wool Bandage'),
+(7,6,3278,'Heavy Wool Bandage'),
+(7,6,3365,'Opening'),
+(7,6,6233,'Closing'),
+(7,6,6246,'Closing'),
+(7,6,6247,'Opening'),
+(7,6,6477,'Opening'),
+(7,6,6478,'Opening'),
+(7,6,6603,'Attack'),
+(7,6,7266,'Duel'),
+(7,6,7267,'Grovel'),
+(7,6,7340,'Language Gnomish'),
+(7,6,7355,'Stuck'),
+(7,6,7928,'Silk Bandage'),
+(7,6,7929,'Heavy Silk Bandage'),
+(7,6,7934,'Anti-Venom'),
+(7,6,8386,'Attacking'),
+(7,6,8737,'Mail'),
+(7,6,9077,'Leather'),
+(7,6,9078,'Cloth'),
+(7,6,9125,'Generic'),
+(7,6,10840,'Mageweave Bandage'),
+(7,6,10841,'Heavy Mageweave Bandage'),
+(7,6,10846,'First Aid'),
+(7,6,18629,'Runecloth Bandage'),
+(7,6,18630,'Heavy Runecloth Bandage'),
+(7,6,20589,'Escape Artist'),
+(7,6,20591,'Expansive Mind'),
+(7,6,20592,'Arcane Resistance'),
+(7,6,20593,'Engineering Specialization'),
+(7,6,21651,'Opening'),
+(7,6,21652,'Closing'),
+(7,6,22027,'Remove Insignia'),
+(7,6,22810,'Opening - No Text'),
+(7,6,33391,'Journeyman Riding'),
+(7,6,45462,'Plague Strike'),
+(7,6,45477,'Icy Touch'),
+(7,6,45902,'Blood Strike'),
+(7,6,45903,'Offensive State (DND)'),
+(7,6,45927,'Summon Friend'),
+(7,6,47541,'Death Coil'),
+(7,6,48266,'Blood Presence'),
+(7,6,49410,'Forceful Deflection'),
+(7,6,49576,'Death Grip'),
+(7,6,52665,'Sigil'),
+(7,6,59879,'Blood Plague'),
+(7,6,59921,'Frost Fever'),
+(7,6,61437,'Opening'),
+(7,6,61455,'Runic Focus'),
+(7,8,81,'Dodge'),
+(7,8,133,'Fireball'),
+(7,8,168,'Frost Armor'),
+(7,8,203,'Unarmed'),
+(7,8,204,'Defense'),
+(7,8,227,'Staves'),
+(7,8,522,'SPELLDEFENSE (DND)'),
+(7,8,668,'Language Common'),
+(7,8,1843,'Disarm'),
+(7,8,2382,'Generic'),
+(7,8,2479,'Honorless Target'),
+(7,8,3050,'Detect'),
+(7,8,3365,'Opening'),
+(7,8,5009,'Wands'),
+(7,8,5019,'Shoot'),
+(7,8,6233,'Closing'),
+(7,8,6246,'Closing'),
+(7,8,6247,'Opening'),
+(7,8,6477,'Opening'),
+(7,8,6478,'Opening'),
+(7,8,6603,'Attack'),
+(7,8,7266,'Duel'),
+(7,8,7267,'Grovel'),
+(7,8,7340,'Language Gnomish'),
+(7,8,7355,'Stuck'),
+(7,8,8386,'Attacking'),
+(7,8,9078,'Cloth'),
+(7,8,9125,'Generic'),
+(7,8,20589,'Escape Artist'),
+(7,8,20591,'Expansive Mind'),
+(7,8,20592,'Arcane Resistance'),
+(7,8,20593,'Engineering Specialization'),
+(7,8,21651,'Opening'),
+(7,8,21652,'Closing'),
+(7,8,22027,'Remove Insignia'),
+(7,8,22810,'Opening - No Text'),
+(7,8,45927,'Summon Friend'),
+(7,8,61437,'Opening'),
+(7,9,81,'Dodge'),
+(7,9,203,'Unarmed'),
+(7,9,204,'Defense'),
+(7,9,522,'SPELLDEFENSE (DND)'),
+(7,9,668,'Language Common'),
+(7,9,686,'Shadow Bolt'),
+(7,9,687,'Demon Skin'),
+(7,9,1180,'Daggers'),
+(7,9,1843,'Disarm'),
+(7,9,2382,'Generic'),
+(7,9,2479,'Honorless Target'),
+(7,9,3050,'Detect'),
+(7,9,3365,'Opening'),
+(7,9,5009,'Wands'),
+(7,9,5019,'Shoot'),
+(7,9,6233,'Closing'),
+(7,9,6246,'Closing'),
+(7,9,6247,'Opening'),
+(7,9,6477,'Opening'),
+(7,9,6478,'Opening'),
+(7,9,6603,'Attack'),
+(7,9,7266,'Duel'),
+(7,9,7267,'Grovel'),
+(7,9,7340,'Language Gnomish'),
+(7,9,7355,'Stuck'),
+(7,9,8386,'Attacking'),
+(7,9,9078,'Cloth'),
+(7,9,9125,'Generic'),
+(7,9,20589,'Escape Artist'),
+(7,9,20591,'Expansive Mind'),
+(7,9,20592,'Arcane Resistance'),
+(7,9,20593,'Engineering Specialization'),
+(7,9,21651,'Opening'),
+(7,9,21652,'Closing'),
+(7,9,22027,'Remove Insignia'),
+(7,9,22810,'Opening - No Text'),
+(7,9,45927,'Summon Friend'),
+(7,9,58284,'Chaos Bolt Passive'),
+(7,9,61437,'Opening'),
+(8,1,78,'Heroic Strike'),
+(8,1,81,'Dodge'),
+(8,1,107,'Block'),
+(8,1,196,'One-Handed Axes'),
+(8,1,203,'Unarmed'),
+(8,1,204,'Defense'),
+(8,1,522,'SPELLDEFENSE (DND)'),
+(8,1,669,'Language Orcish'),
+(8,1,1180,'Daggers'),
+(8,1,1843,'Disarm'),
+(8,1,2382,'Generic'),
+(8,1,2457,'Battle Stance'),
+(8,1,2479,'Honorless Target'),
+(8,1,2567,'Thrown'),
+(8,1,2764,'Throw'),
+(8,1,3050,'Detect'),
+(8,1,3365,'Opening'),
+(8,1,5301,'Defensive State (DND)'),
+(8,1,6233,'Closing'),
+(8,1,6246,'Closing'),
+(8,1,6247,'Opening'),
+(8,1,6477,'Opening'),
+(8,1,6478,'Opening'),
+(8,1,6603,'Attack'),
+(8,1,7266,'Duel'),
+(8,1,7267,'Grovel'),
+(8,1,7341,'Language Troll'),
+(8,1,7355,'Stuck'),
+(8,1,8386,'Attacking'),
+(8,1,8737,'Mail'),
+(8,1,9077,'Leather'),
+(8,1,9078,'Cloth'),
+(8,1,9116,'Shield'),
+(8,1,9125,'Generic'),
+(8,1,20555,'Regeneration'),
+(8,1,20557,'Beast Slaying'),
+(8,1,20558,'Throwing Specialization'),
+(8,1,21651,'Opening'),
+(8,1,21652,'Closing'),
+(8,1,22027,'Remove Insignia'),
+(8,1,22810,'Opening - No Text'),
+(8,1,26290,'Bow Specialization'),
+(8,1,26296,'Berserking'),
+(8,1,32215,'Victorious State'),
+(8,1,45927,'Summon Friend'),
+(8,1,58943,'Da Voodoo Shuffle'),
+(8,1,61437,'Opening'),
+(8,3,75,'Auto Shot'),
+(8,3,81,'Dodge'),
+(8,3,196,'One-Handed Axes'),
+(8,3,203,'Unarmed'),
+(8,3,204,'Defense'),
+(8,3,264,'Bows'),
+(8,3,522,'SPELLDEFENSE (DND)'),
+(8,3,669,'Language Orcish'),
+(8,3,1843,'Disarm'),
+(8,3,2382,'Generic'),
+(8,3,2479,'Honorless Target'),
+(8,3,2973,'Raptor Strike'),
+(8,3,3050,'Detect'),
+(8,3,3365,'Opening'),
+(8,3,6233,'Closing'),
+(8,3,6246,'Closing'),
+(8,3,6247,'Opening'),
+(8,3,6477,'Opening'),
+(8,3,6478,'Opening'),
+(8,3,6603,'Attack'),
+(8,3,7266,'Duel'),
+(8,3,7267,'Grovel'),
+(8,3,7341,'Language Troll'),
+(8,3,7355,'Stuck'),
+(8,3,8386,'Attacking'),
+(8,3,9077,'Leather'),
+(8,3,9078,'Cloth'),
+(8,3,9125,'Generic'),
+(8,3,13358,'Defensive State (DND)'),
+(8,3,20554,'Berserking'),
+(8,3,20555,'Regeneration'),
+(8,3,20557,'Beast Slaying'),
+(8,3,20558,'Throwing Specialization'),
+(8,3,21651,'Opening'),
+(8,3,21652,'Closing'),
+(8,3,22027,'Remove Insignia'),
+(8,3,22810,'Opening - No Text'),
+(8,3,24949,'Defensive State 2 (DND)'),
+(8,3,26290,'Bow Specialization'),
+(8,3,34082,'Advantaged State (DND)'),
+(8,3,45927,'Summon Friend'),
+(8,3,58943,'Da Voodoo Shuffle'),
+(8,3,61437,'Opening'),
+(8,4,81,'Dodge'),
+(8,4,203,'Unarmed'),
+(8,4,204,'Defense'),
+(8,4,522,'SPELLDEFENSE (DND)'),
+(8,4,669,'Language Orcish'),
+(8,4,1180,'Daggers'),
+(8,4,1752,'Sinister Strike'),
+(8,4,1843,'Disarm'),
+(8,4,2098,'Eviscerate'),
+(8,4,2382,'Generic'),
+(8,4,2479,'Honorless Target'),
+(8,4,2567,'Thrown'),
+(8,4,2764,'Throw'),
+(8,4,3050,'Detect'),
+(8,4,3365,'Opening'),
+(8,4,6233,'Closing'),
+(8,4,6246,'Closing'),
+(8,4,6247,'Opening'),
+(8,4,6477,'Opening'),
+(8,4,6478,'Opening'),
+(8,4,6603,'Attack'),
+(8,4,7266,'Duel'),
+(8,4,7267,'Grovel'),
+(8,4,7341,'Language Troll'),
+(8,4,7355,'Stuck'),
+(8,4,8386,'Attacking'),
+(8,4,9077,'Leather'),
+(8,4,9078,'Cloth'),
+(8,4,9125,'Generic'),
+(8,4,16092,'Defensive State (DND)'),
+(8,4,20555,'Regeneration'),
+(8,4,20557,'Beast Slaying'),
+(8,4,20558,'Throwing Specialization'),
+(8,4,21184,'Rogue Passive (DND)'),
+(8,4,21651,'Opening'),
+(8,4,21652,'Closing'),
+(8,4,22027,'Remove Insignia'),
+(8,4,22810,'Opening - No Text'),
+(8,4,26290,'Bow Specialization'),
+(8,4,26297,'Berserking'),
+(8,4,45927,'Summon Friend'),
+(8,4,58943,'Da Voodoo Shuffle'),
+(8,4,61437,'Opening'),
+(8,5,81,'Dodge'),
+(8,5,198,'One-Handed Maces'),
+(8,5,203,'Unarmed'),
+(8,5,204,'Defense'),
+(8,5,522,'SPELLDEFENSE (DND)'),
+(8,5,585,'Smite'),
+(8,5,669,'Language Orcish'),
+(8,5,1843,'Disarm'),
+(8,5,2050,'Lesser Heal'),
+(8,5,2382,'Generic'),
+(8,5,2479,'Honorless Target'),
+(8,5,3050,'Detect'),
+(8,5,3365,'Opening'),
+(8,5,5009,'Wands'),
+(8,5,5019,'Shoot'),
+(8,5,6233,'Closing'),
+(8,5,6246,'Closing'),
+(8,5,6247,'Opening'),
+(8,5,6477,'Opening'),
+(8,5,6478,'Opening'),
+(8,5,6603,'Attack'),
+(8,5,7266,'Duel'),
+(8,5,7267,'Grovel'),
+(8,5,7341,'Language Troll'),
+(8,5,7355,'Stuck'),
+(8,5,8386,'Attacking'),
+(8,5,9078,'Cloth'),
+(8,5,9125,'Generic'),
+(8,5,20554,'Berserking'),
+(8,5,20555,'Regeneration'),
+(8,5,20557,'Beast Slaying'),
+(8,5,20558,'Throwing Specialization'),
+(8,5,21651,'Opening'),
+(8,5,21652,'Closing'),
+(8,5,22027,'Remove Insignia'),
+(8,5,22810,'Opening - No Text'),
+(8,5,26290,'Bow Specialization'),
+(8,5,45927,'Summon Friend'),
+(8,5,58943,'Da Voodoo Shuffle'),
+(8,5,61437,'Opening'),
+(8,6,81,'Dodge'),
+(8,6,196,'One-Handed Axes'),
+(8,6,197,'Two-Handed Axes'),
+(8,6,200,'Polearms'),
+(8,6,201,'One-Handed Swords'),
+(8,6,202,'Two-Handed Swords'),
+(8,6,203,'Unarmed'),
+(8,6,204,'Defense'),
+(8,6,522,'SPELLDEFENSE (DND)'),
+(8,6,669,'Language Orcish'),
+(8,6,674,'Dual Wield'),
+(8,6,750,'Plate Mail'),
+(8,6,1843,'Disarm'),
+(8,6,2382,'Generic'),
+(8,6,2479,'Honorless Target'),
+(8,6,3050,'Detect'),
+(8,6,3127,'Parry'),
+(8,6,3275,'Linen Bandage'),
+(8,6,3276,'Heavy Linen Bandage'),
+(8,6,3277,'Wool Bandage'),
+(8,6,3278,'Heavy Wool Bandage'),
+(8,6,3365,'Opening'),
+(8,6,6233,'Closing'),
+(8,6,6246,'Closing'),
+(8,6,6247,'Opening'),
+(8,6,6477,'Opening'),
+(8,6,6478,'Opening'),
+(8,6,6603,'Attack'),
+(8,6,7266,'Duel'),
+(8,6,7267,'Grovel'),
+(8,6,7341,'Language Troll'),
+(8,6,7355,'Stuck'),
+(8,6,7928,'Silk Bandage'),
+(8,6,7929,'Heavy Silk Bandage'),
+(8,6,7934,'Anti-Venom'),
+(8,6,8386,'Attacking'),
+(8,6,8737,'Mail'),
+(8,6,9077,'Leather'),
+(8,6,9078,'Cloth'),
+(8,6,9125,'Generic'),
+(8,6,10840,'Mageweave Bandage'),
+(8,6,10841,'Heavy Mageweave Bandage'),
+(8,6,10846,'First Aid'),
+(8,6,18629,'Runecloth Bandage'),
+(8,6,18630,'Heavy Runecloth Bandage'),
+(8,6,20555,'Regeneration'),
+(8,6,20557,'Beast Slaying'),
+(8,6,20558,'Throwing Specialization'),
+(8,6,21651,'Opening'),
+(8,6,21652,'Closing'),
+(8,6,22027,'Remove Insignia'),
+(8,6,22810,'Opening - No Text'),
+(8,6,26290,'Bow Specialization'),
+(8,6,33391,'Journeyman Riding'),
+(8,6,45462,'Plague Strike'),
+(8,6,45477,'Icy Touch'),
+(8,6,45902,'Blood Strike'),
+(8,6,45903,'Offensive State (DND)'),
+(8,6,45927,'Summon Friend'),
+(8,6,47541,'Death Coil'),
+(8,6,48266,'Blood Presence'),
+(8,6,49410,'Forceful Deflection'),
+(8,6,49576,'Death Grip'),
+(8,6,50621,'Berserking'),
+(8,6,52665,'Sigil'),
+(8,6,58943,'Da Voodoo Shuffle'),
+(8,6,59879,'Blood Plague'),
+(8,6,59921,'Frost Fever'),
+(8,6,61437,'Opening'),
+(8,6,61455,'Runic Focus'),
+(8,7,81,'Dodge'),
+(8,7,107,'Block'),
+(8,7,198,'One-Handed Maces'),
+(8,7,203,'Unarmed'),
+(8,7,204,'Defense'),
+(8,7,227,'Staves'),
+(8,7,331,'Healing Wave'),
+(8,7,403,'Lightning Bolt'),
+(8,7,522,'SPELLDEFENSE (DND)'),
+(8,7,669,'Language Orcish'),
+(8,7,1843,'Disarm'),
+(8,7,2382,'Generic'),
+(8,7,2479,'Honorless Target'),
+(8,7,3050,'Detect'),
+(8,7,3365,'Opening'),
+(8,7,6233,'Closing'),
+(8,7,6246,'Closing'),
+(8,7,6247,'Opening'),
+(8,7,6477,'Opening'),
+(8,7,6478,'Opening'),
+(8,7,6603,'Attack'),
+(8,7,7266,'Duel'),
+(8,7,7267,'Grovel'),
+(8,7,7341,'Language Troll'),
+(8,7,7355,'Stuck'),
+(8,7,8386,'Attacking'),
+(8,7,9077,'Leather'),
+(8,7,9078,'Cloth'),
+(8,7,9116,'Shield'),
+(8,7,9125,'Generic'),
+(8,7,20554,'Berserking'),
+(8,7,20555,'Regeneration'),
+(8,7,20557,'Beast Slaying'),
+(8,7,20558,'Throwing Specialization'),
+(8,7,21651,'Opening'),
+(8,7,21652,'Closing'),
+(8,7,22027,'Remove Insignia'),
+(8,7,22810,'Opening - No Text'),
+(8,7,26290,'Bow Specialization'),
+(8,7,27763,'Totem'),
+(8,7,45927,'Summon Friend'),
+(8,7,58943,'Da Voodoo Shuffle'),
+(8,7,61437,'Opening'),
+(8,8,81,'Dodge'),
+(8,8,133,'Fireball'),
+(8,8,168,'Frost Armor'),
+(8,8,203,'Unarmed'),
+(8,8,204,'Defense'),
+(8,8,227,'Staves'),
+(8,8,522,'SPELLDEFENSE (DND)'),
+(8,8,669,'Language Orcish'),
+(8,8,1843,'Disarm'),
+(8,8,2382,'Generic'),
+(8,8,2479,'Honorless Target'),
+(8,8,3050,'Detect'),
+(8,8,3365,'Opening'),
+(8,8,5009,'Wands'),
+(8,8,5019,'Shoot'),
+(8,8,6233,'Closing'),
+(8,8,6246,'Closing'),
+(8,8,6247,'Opening'),
+(8,8,6477,'Opening'),
+(8,8,6478,'Opening'),
+(8,8,6603,'Attack'),
+(8,8,7266,'Duel'),
+(8,8,7267,'Grovel'),
+(8,8,7341,'Language Troll'),
+(8,8,7355,'Stuck'),
+(8,8,8386,'Attacking'),
+(8,8,9078,'Cloth'),
+(8,8,9125,'Generic'),
+(8,8,20554,'Berserking'),
+(8,8,20555,'Regeneration'),
+(8,8,20557,'Beast Slaying'),
+(8,8,20558,'Throwing Specialization'),
+(8,8,21651,'Opening'),
+(8,8,21652,'Closing'),
+(8,8,22027,'Remove Insignia'),
+(8,8,22810,'Opening - No Text'),
+(8,8,26290,'Bow Specialization'),
+(8,8,45927,'Summon Friend'),
+(8,8,58943,'Da Voodoo Shuffle'),
+(8,8,61437,'Opening'),
+(10,2,81,'Dodge'),
+(10,2,107,'Block'),
+(10,2,201,'One-Handed Swords'),
+(10,2,202,'Two-Handed Swords'),
+(10,2,203,'Unarmed'),
+(10,2,204,'Defense'),
+(10,2,522,'SPELLDEFENSE (DND)'),
+(10,2,635,'Holy Light'),
+(10,2,669,'Language Orcish'),
+(10,2,813,'Language Thalassian'),
+(10,2,822,'Magic Resistance'),
+(10,2,2382,'Generic'),
+(10,2,2479,'Honorless Target'),
+(10,2,3050,'Detect'),
+(10,2,3365,'Opening'),
+(10,2,6233,'Closing'),
+(10,2,6246,'Closing'),
+(10,2,6247,'Opening'),
+(10,2,6477,'Opening'),
+(10,2,6478,'Opening'),
+(10,2,6603,'Attack'),
+(10,2,7266,'Duel'),
+(10,2,7267,'Grovel'),
+(10,2,7355,'Stuck'),
+(10,2,8386,'Attacking'),
+(10,2,8737,'Mail'),
+(10,2,9077,'Leather'),
+(10,2,9078,'Cloth'),
+(10,2,9116,'Shield'),
+(10,2,9125,'Generic'),
+(10,2,21084,'Seal of Righteousness'),
+(10,2,21651,'Opening'),
+(10,2,21652,'Closing'),
+(10,2,22027,'Remove Insignia'),
+(10,2,22810,'Opening - No Text'),
+(10,2,27762,'Libram'),
+(10,2,28730,'Arcane Torrent'),
+(10,2,28734,'Mana Tap'),
+(10,2,28877,'Arcane Affinity'),
+(10,3,75,'Auto Shot'),
+(10,3,81,'Dodge'),
+(10,3,203,'Unarmed'),
+(10,3,204,'Defense'),
+(10,3,264,'Bows'),
+(10,3,522,'SPELLDEFENSE (DND)'),
+(10,3,669,'Language Orcish'),
+(10,3,813,'Language Thalassian'),
+(10,3,822,'Magic Resistance'),
+(10,3,1180,'Daggers'),
+(10,3,2382,'Generic'),
+(10,3,2479,'Honorless Target'),
+(10,3,2973,'Raptor Strike'),
+(10,3,3050,'Detect'),
+(10,3,3365,'Opening'),
+(10,3,6233,'Closing'),
+(10,3,6246,'Closing'),
+(10,3,6247,'Opening'),
+(10,3,6477,'Opening'),
+(10,3,6478,'Opening'),
+(10,3,6603,'Attack'),
+(10,3,7266,'Duel'),
+(10,3,7267,'Grovel'),
+(10,3,7355,'Stuck'),
+(10,3,8386,'Attacking'),
+(10,3,9077,'Leather'),
+(10,3,9078,'Cloth'),
+(10,3,9125,'Generic'),
+(10,3,13358,'Defensive State (DND)'),
+(10,3,21651,'Opening'),
+(10,3,21652,'Closing'),
+(10,3,22027,'Remove Insignia'),
+(10,3,22810,'Opening - No Text'),
+(10,3,24949,'Defensive State 2 (DND)'),
+(10,3,28730,'Arcane Torrent'),
+(10,3,28734,'Mana Tap'),
+(10,3,28877,'Arcane Affinity'),
+(10,3,34082,'Advantaged State (DND)'),
+(10,4,81,'Dodge'),
+(10,4,203,'Unarmed'),
+(10,4,204,'Defense'),
+(10,4,522,'SPELLDEFENSE (DND)'),
+(10,4,669,'Language Orcish'),
+(10,4,813,'Language Thalassian'),
+(10,4,822,'Magic Resistance'),
+(10,4,1180,'Daggers'),
+(10,4,1752,'Sinister Strike'),
+(10,4,2098,'Eviscerate'),
+(10,4,2382,'Generic'),
+(10,4,2479,'Honorless Target'),
+(10,4,2567,'Thrown'),
+(10,4,2764,'Throw'),
+(10,4,3050,'Detect'),
+(10,4,3365,'Opening'),
+(10,4,6233,'Closing'),
+(10,4,6246,'Closing'),
+(10,4,6247,'Opening'),
+(10,4,6477,'Opening'),
+(10,4,6478,'Opening'),
+(10,4,6603,'Attack'),
+(10,4,7266,'Duel'),
+(10,4,7267,'Grovel'),
+(10,4,7355,'Stuck'),
+(10,4,8386,'Attacking'),
+(10,4,9077,'Leather'),
+(10,4,9078,'Cloth'),
+(10,4,9125,'Generic'),
+(10,4,16092,'Defensive State (DND)'),
+(10,4,21184,'Rogue Passive (DND)'),
+(10,4,21651,'Opening'),
+(10,4,21652,'Closing'),
+(10,4,22027,'Remove Insignia'),
+(10,4,22810,'Opening - No Text'),
+(10,4,25046,'Arcane Torrent'),
+(10,4,28734,'Mana Tap'),
+(10,4,28877,'Arcane Affinity'),
+(10,5,81,'Dodge'),
+(10,5,198,'One-Handed Maces'),
+(10,5,203,'Unarmed'),
+(10,5,204,'Defense'),
+(10,5,522,'SPELLDEFENSE (DND)'),
+(10,5,585,'Smite'),
+(10,5,669,'Language Orcish'),
+(10,5,813,'Language Thalassian'),
+(10,5,822,'Magic Resistance'),
+(10,5,2050,'Lesser Heal'),
+(10,5,2382,'Generic'),
+(10,5,2479,'Honorless Target'),
+(10,5,3050,'Detect'),
+(10,5,3365,'Opening'),
+(10,5,5009,'Wands'),
+(10,5,5019,'Shoot'),
+(10,5,6233,'Closing'),
+(10,5,6246,'Closing'),
+(10,5,6247,'Opening'),
+(10,5,6477,'Opening'),
+(10,5,6478,'Opening'),
+(10,5,6603,'Attack'),
+(10,5,7266,'Duel'),
+(10,5,7267,'Grovel'),
+(10,5,7355,'Stuck'),
+(10,5,8386,'Attacking'),
+(10,5,9078,'Cloth'),
+(10,5,9125,'Generic'),
+(10,5,21651,'Opening'),
+(10,5,21652,'Closing'),
+(10,5,22027,'Remove Insignia'),
+(10,5,22810,'Opening - No Text'),
+(10,5,28730,'Arcane Torrent'),
+(10,5,28734,'Mana Tap'),
+(10,5,28877,'Arcane Affinity'),
+(10,6,81,'Dodge'),
+(10,6,196,'One-Handed Axes'),
+(10,6,197,'Two-Handed Axes'),
+(10,6,200,'Polearms'),
+(10,6,201,'One-Handed Swords'),
+(10,6,202,'Two-Handed Swords'),
+(10,6,203,'Unarmed'),
+(10,6,204,'Defense'),
+(10,6,522,'SPELLDEFENSE (DND)'),
+(10,6,669,'Language Orcish'),
+(10,6,674,'Dual Wield'),
+(10,6,750,'Plate Mail'),
+(10,6,813,'Language Thalassian'),
+(10,6,822,'Magic Resistance'),
+(10,6,1843,'Disarm'),
+(10,6,2382,'Generic'),
+(10,6,2479,'Honorless Target'),
+(10,6,3050,'Detect'),
+(10,6,3127,'Parry'),
+(10,6,3275,'Linen Bandage'),
+(10,6,3276,'Heavy Linen Bandage'),
+(10,6,3277,'Wool Bandage'),
+(10,6,3278,'Heavy Wool Bandage'),
+(10,6,3365,'Opening'),
+(10,6,6233,'Closing'),
+(10,6,6246,'Closing'),
+(10,6,6247,'Opening'),
+(10,6,6477,'Opening'),
+(10,6,6478,'Opening'),
+(10,6,6603,'Attack'),
+(10,6,7266,'Duel'),
+(10,6,7267,'Grovel'),
+(10,6,7355,'Stuck'),
+(10,6,7928,'Silk Bandage'),
+(10,6,7929,'Heavy Silk Bandage'),
+(10,6,7934,'Anti-Venom'),
+(10,6,8386,'Attacking'),
+(10,6,8737,'Mail'),
+(10,6,9077,'Leather'),
+(10,6,9078,'Cloth'),
+(10,6,9125,'Generic'),
+(10,6,10840,'Mageweave Bandage'),
+(10,6,10841,'Heavy Mageweave Bandage'),
+(10,6,10846,'First Aid'),
+(10,6,18629,'Runecloth Bandage'),
+(10,6,18630,'Heavy Runecloth Bandage'),
+(10,6,21651,'Opening'),
+(10,6,21652,'Closing'),
+(10,6,22027,'Remove Insignia'),
+(10,6,22810,'Opening - No Text'),
+(10,6,28877,'Arcane Affinity'),
+(10,6,33391,'Journeyman Riding'),
+(10,6,45462,'Plague Strike'),
+(10,6,45477,'Icy Touch'),
+(10,6,45902,'Blood Strike'),
+(10,6,45903,'Offensive State (DND)'),
+(10,6,45927,'Summon Friend'),
+(10,6,47541,'Death Coil'),
+(10,6,48266,'Blood Presence'),
+(10,6,49410,'Forceful Deflection'),
+(10,6,49576,'Death Grip'),
+(10,6,50613,'Arcane Torrent'),
+(10,6,52665,'Sigil'),
+(10,6,59879,'Blood Plague'),
+(10,6,59921,'Frost Fever'),
+(10,6,61437,'Opening'),
+(10,6,61455,'Runic Focus'),
+(10,8,81,'Dodge'),
+(10,8,133,'Fireball'),
+(10,8,168,'Frost Armor'),
+(10,8,203,'Unarmed'),
+(10,8,204,'Defense'),
+(10,8,227,'Staves'),
+(10,8,522,'SPELLDEFENSE (DND)'),
+(10,8,669,'Language Orcish'),
+(10,8,813,'Language Thalassian'),
+(10,8,822,'Magic Resistance'),
+(10,8,2382,'Generic'),
+(10,8,2479,'Honorless Target'),
+(10,8,3050,'Detect'),
+(10,8,3365,'Opening'),
+(10,8,5009,'Wands'),
+(10,8,5019,'Shoot'),
+(10,8,6233,'Closing'),
+(10,8,6246,'Closing'),
+(10,8,6247,'Opening'),
+(10,8,6477,'Opening'),
+(10,8,6478,'Opening'),
+(10,8,6603,'Attack'),
+(10,8,7266,'Duel'),
+(10,8,7267,'Grovel'),
+(10,8,7355,'Stuck'),
+(10,8,8386,'Attacking'),
+(10,8,9078,'Cloth'),
+(10,8,9125,'Generic'),
+(10,8,21651,'Opening'),
+(10,8,21652,'Closing'),
+(10,8,22027,'Remove Insignia'),
+(10,8,22810,'Opening - No Text'),
+(10,8,28730,'Arcane Torrent'),
+(10,8,28734,'Mana Tap'),
+(10,8,28877,'Arcane Affinity'),
+(10,9,81,'Dodge'),
+(10,9,203,'Unarmed'),
+(10,9,204,'Defense'),
+(10,9,522,'SPELLDEFENSE (DND)'),
+(10,9,669,'Language Orcish'),
+(10,9,686,'Shadow Bolt'),
+(10,9,687,'Demon Skin'),
+(10,9,813,'Language Thalassian'),
+(10,9,822,'Magic Resistance'),
+(10,9,1180,'Daggers'),
+(10,9,2382,'Generic'),
+(10,9,2479,'Honorless Target'),
+(10,9,3050,'Detect'),
+(10,9,3365,'Opening'),
+(10,9,5009,'Wands'),
+(10,9,5019,'Shoot'),
+(10,9,6233,'Closing'),
+(10,9,6246,'Closing'),
+(10,9,6247,'Opening'),
+(10,9,6477,'Opening'),
+(10,9,6478,'Opening'),
+(10,9,6603,'Attack'),
+(10,9,7266,'Duel'),
+(10,9,7267,'Grovel'),
+(10,9,7355,'Stuck'),
+(10,9,8386,'Attacking'),
+(10,9,9078,'Cloth'),
+(10,9,9125,'Generic'),
+(10,9,21651,'Opening'),
+(10,9,21652,'Closing'),
+(10,9,22027,'Remove Insignia'),
+(10,9,22810,'Opening - No Text'),
+(10,9,28730,'Arcane Torrent'),
+(10,9,28734,'Mana Tap'),
+(10,9,28877,'Arcane Affinity'),
+(10,9,58284,'Chaos Bolt Passive'),
+(11,1,78,'Heroic Strike'),
+(11,1,81,'Dodge'),
+(11,1,107,'Block'),
+(11,1,198,'One-Handed Maces'),
+(11,1,201,'One-Handed Swords'),
+(11,1,202,'Two-Handed Swords'),
+(11,1,203,'Unarmed'),
+(11,1,204,'Defense'),
+(11,1,522,'SPELLDEFENSE (DND)'),
+(11,1,668,'Language Common'),
+(11,1,1843,'Disarm'),
+(11,1,2382,'Generic'),
+(11,1,2457,'Battle Stance'),
+(11,1,2479,'Honorless Target'),
+(11,1,3050,'Detect'),
+(11,1,3365,'Opening'),
+(11,1,5301,'Defensive State (DND)'),
+(11,1,6233,'Closing'),
+(11,1,6246,'Closing'),
+(11,1,6247,'Opening'),
+(11,1,6477,'Opening'),
+(11,1,6478,'Opening'),
+(11,1,6562,'Heroic Presence'),
+(11,1,6603,'Attack'),
+(11,1,7266,'Duel'),
+(11,1,7267,'Grovel'),
+(11,1,7355,'Stuck'),
+(11,1,8386,'Attacking'),
+(11,1,8737,'Mail'),
+(11,1,9077,'Leather'),
+(11,1,9078,'Cloth'),
+(11,1,9116,'Shield'),
+(11,1,9125,'Generic'),
+(11,1,21651,'Opening'),
+(11,1,21652,'Closing'),
+(11,1,22027,'Remove Insignia'),
+(11,1,22810,'Opening - No Text'),
+(11,1,28875,'Gemcutting'),
+(11,1,28880,'Gift of the Naaru'),
+(11,1,29932,'Language Draenei'),
+(11,1,32215,'Victorious State'),
+(11,1,45927,'Summon Friend'),
+(11,1,59221,'Shadow Resistance'),
+(11,1,61437,'Opening'),
+(11,2,81,'Dodge'),
+(11,2,107,'Block'),
+(11,2,198,'One-Handed Maces'),
+(11,2,199,'Two-Handed Maces'),
+(11,2,203,'Unarmed'),
+(11,2,204,'Defense'),
+(11,2,522,'SPELLDEFENSE (DND)'),
+(11,2,635,'Holy Light'),
+(11,2,668,'Language Common'),
+(11,2,1843,'Disarm'),
+(11,2,2382,'Generic'),
+(11,2,2479,'Honorless Target'),
+(11,2,3050,'Detect'),
+(11,2,3365,'Opening'),
+(11,2,6233,'Closing'),
+(11,2,6246,'Closing'),
+(11,2,6247,'Opening'),
+(11,2,6477,'Opening'),
+(11,2,6478,'Opening'),
+(11,2,6562,'Heroic Presence'),
+(11,2,6603,'Attack'),
+(11,2,7266,'Duel'),
+(11,2,7267,'Grovel'),
+(11,2,7355,'Stuck'),
+(11,2,8386,'Attacking'),
+(11,2,8737,'Mail'),
+(11,2,9077,'Leather'),
+(11,2,9078,'Cloth'),
+(11,2,9116,'Shield'),
+(11,2,9125,'Generic'),
+(11,2,21084,'Seal of Righteousness'),
+(11,2,21651,'Opening'),
+(11,2,21652,'Closing'),
+(11,2,22027,'Remove Insignia'),
+(11,2,22810,'Opening - No Text'),
+(11,2,27762,'Libram'),
+(11,2,28875,'Gemcutting'),
+(11,2,29932,'Language Draenei'),
+(11,2,45927,'Summon Friend'),
+(11,2,59221,'Shadow Resistance'),
+(11,2,59542,'Gift of the Naaru'),
+(11,2,61437,'Opening'),
+(11,3,75,'Auto Shot'),
+(11,3,81,'Dodge'),
+(11,3,201,'One-Handed Swords'),
+(11,3,203,'Unarmed'),
+(11,3,204,'Defense'),
+(11,3,522,'SPELLDEFENSE (DND)'),
+(11,3,668,'Language Common'),
+(11,3,1843,'Disarm'),
+(11,3,2382,'Generic'),
+(11,3,2479,'Honorless Target'),
+(11,3,2973,'Raptor Strike'),
+(11,3,3050,'Detect'),
+(11,3,3365,'Opening'),
+(11,3,5011,'Crossbows'),
+(11,3,6233,'Closing'),
+(11,3,6246,'Closing'),
+(11,3,6247,'Opening'),
+(11,3,6477,'Opening'),
+(11,3,6478,'Opening'),
+(11,3,6562,'Heroic Presence'),
+(11,3,6603,'Attack'),
+(11,3,7266,'Duel'),
+(11,3,7267,'Grovel'),
+(11,3,7355,'Stuck'),
+(11,3,8386,'Attacking'),
+(11,3,9077,'Leather'),
+(11,3,9078,'Cloth'),
+(11,3,9125,'Generic'),
+(11,3,13358,'Defensive State (DND)'),
+(11,3,21651,'Opening'),
+(11,3,21652,'Closing'),
+(11,3,22027,'Remove Insignia'),
+(11,3,22810,'Opening - No Text'),
+(11,3,24949,'Defensive State 2 (DND)'),
+(11,3,28875,'Gemcutting'),
+(11,3,29932,'Language Draenei'),
+(11,3,34082,'Advantaged State (DND)'),
+(11,3,45927,'Summon Friend'),
+(11,3,59221,'Shadow Resistance'),
+(11,3,59543,'Gift of the Naaru'),
+(11,3,61437,'Opening'),
+(11,5,81,'Dodge'),
+(11,5,198,'One-Handed Maces'),
+(11,5,203,'Unarmed'),
+(11,5,204,'Defense'),
+(11,5,522,'SPELLDEFENSE (DND)'),
+(11,5,585,'Smite'),
+(11,5,668,'Language Common'),
+(11,5,1843,'Disarm'),
+(11,5,2050,'Lesser Heal'),
+(11,5,2382,'Generic'),
+(11,5,2479,'Honorless Target'),
+(11,5,3050,'Detect'),
+(11,5,3365,'Opening'),
+(11,5,5009,'Wands'),
+(11,5,5019,'Shoot'),
+(11,5,6233,'Closing'),
+(11,5,6246,'Closing'),
+(11,5,6247,'Opening'),
+(11,5,6477,'Opening'),
+(11,5,6478,'Opening'),
+(11,5,6603,'Attack'),
+(11,5,7266,'Duel'),
+(11,5,7267,'Grovel'),
+(11,5,7355,'Stuck'),
+(11,5,8386,'Attacking'),
+(11,5,9078,'Cloth'),
+(11,5,9125,'Generic'),
+(11,5,21651,'Opening'),
+(11,5,21652,'Closing'),
+(11,5,22027,'Remove Insignia'),
+(11,5,22810,'Opening - No Text'),
+(11,5,28875,'Gemcutting'),
+(11,5,28878,'Inspiring Presence'),
+(11,5,29932,'Language Draenei'),
+(11,5,45927,'Summon Friend'),
+(11,5,59221,'Shadow Resistance'),
+(11,5,59544,'Gift of the Naaru'),
+(11,5,61437,'Opening'),
+(11,6,81,'Dodge'),
+(11,6,196,'One-Handed Axes'),
+(11,6,197,'Two-Handed Axes'),
+(11,6,200,'Polearms'),
+(11,6,201,'One-Handed Swords'),
+(11,6,202,'Two-Handed Swords'),
+(11,6,203,'Unarmed'),
+(11,6,204,'Defense'),
+(11,6,522,'SPELLDEFENSE (DND)'),
+(11,6,668,'Language Common'),
+(11,6,674,'Dual Wield'),
+(11,6,750,'Plate Mail'),
+(11,6,1843,'Disarm'),
+(11,6,2382,'Generic'),
+(11,6,2479,'Honorless Target'),
+(11,6,3050,'Detect'),
+(11,6,3127,'Parry'),
+(11,6,3275,'Linen Bandage'),
+(11,6,3276,'Heavy Linen Bandage'),
+(11,6,3277,'Wool Bandage'),
+(11,6,3278,'Heavy Wool Bandage'),
+(11,6,3365,'Opening'),
+(11,6,6233,'Closing'),
+(11,6,6246,'Closing'),
+(11,6,6247,'Opening'),
+(11,6,6477,'Opening'),
+(11,6,6478,'Opening'),
+(11,6,6562,'Heroic Presence'),
+(11,6,6603,'Attack'),
+(11,6,7266,'Duel'),
+(11,6,7267,'Grovel'),
+(11,6,7355,'Stuck'),
+(11,6,7928,'Silk Bandage'),
+(11,6,7929,'Heavy Silk Bandage'),
+(11,6,7934,'Anti-Venom'),
+(11,6,8386,'Attacking'),
+(11,6,8737,'Mail'),
+(11,6,9077,'Leather'),
+(11,6,9078,'Cloth'),
+(11,6,9125,'Generic'),
+(11,6,10840,'Mageweave Bandage'),
+(11,6,10841,'Heavy Mageweave Bandage'),
+(11,6,10846,'First Aid'),
+(11,6,18629,'Runecloth Bandage'),
+(11,6,18630,'Heavy Runecloth Bandage'),
+(11,6,21651,'Opening'),
+(11,6,21652,'Closing'),
+(11,6,22027,'Remove Insignia'),
+(11,6,22810,'Opening - No Text'),
+(11,6,28875,'Gemcutting'),
+(11,6,29932,'Language Draenei'),
+(11,6,33391,'Journeyman Riding'),
+(11,6,45462,'Plague Strike'),
+(11,6,45477,'Icy Touch'),
+(11,6,45902,'Blood Strike'),
+(11,6,45903,'Offensive State (DND)'),
+(11,6,45927,'Summon Friend'),
+(11,6,47541,'Death Coil'),
+(11,6,48266,'Blood Presence'),
+(11,6,49410,'Forceful Deflection'),
+(11,6,49576,'Death Grip'),
+(11,6,52665,'Sigil'),
+(11,6,59221,'Shadow Resistance'),
+(11,6,59539,'Shadow Resistance'),
+(11,6,59545,'Gift of the Naaru'),
+(11,6,59879,'Blood Plague'),
+(11,6,59921,'Frost Fever'),
+(11,6,61437,'Opening'),
+(11,6,61455,'Runic Focus'),
+(11,7,81,'Dodge'),
+(11,7,107,'Block'),
+(11,7,198,'One-Handed Maces'),
+(11,7,203,'Unarmed'),
+(11,7,204,'Defense'),
+(11,7,227,'Staves'),
+(11,7,331,'Healing Wave'),
+(11,7,403,'Lightning Bolt'),
+(11,7,522,'SPELLDEFENSE (DND)'),
+(11,7,668,'Language Common'),
+(11,7,1843,'Disarm'),
+(11,7,2382,'Generic'),
+(11,7,2479,'Honorless Target'),
+(11,7,3050,'Detect'),
+(11,7,3365,'Opening'),
+(11,7,6233,'Closing'),
+(11,7,6246,'Closing'),
+(11,7,6247,'Opening'),
+(11,7,6477,'Opening'),
+(11,7,6478,'Opening'),
+(11,7,6603,'Attack'),
+(11,7,7266,'Duel'),
+(11,7,7267,'Grovel'),
+(11,7,7355,'Stuck'),
+(11,7,8386,'Attacking'),
+(11,7,9077,'Leather'),
+(11,7,9078,'Cloth'),
+(11,7,9116,'Shield'),
+(11,7,9125,'Generic'),
+(11,7,21651,'Opening'),
+(11,7,21652,'Closing'),
+(11,7,22027,'Remove Insignia'),
+(11,7,22810,'Opening - No Text'),
+(11,7,27763,'Totem'),
+(11,7,28875,'Gemcutting'),
+(11,7,28878,'Inspiring Presence'),
+(11,7,29932,'Language Draenei'),
+(11,7,45927,'Summon Friend'),
+(11,7,59221,'Shadow Resistance'),
+(11,7,59547,'Gift of the Naaru'),
+(11,7,61437,'Opening'),
+(11,8,81,'Dodge'),
+(11,8,133,'Fireball'),
+(11,8,168,'Frost Armor'),
+(11,8,203,'Unarmed'),
+(11,8,204,'Defense'),
+(11,8,227,'Staves'),
+(11,8,522,'SPELLDEFENSE (DND)'),
+(11,8,668,'Language Common'),
+(11,8,1843,'Disarm'),
+(11,8,2382,'Generic'),
+(11,8,2479,'Honorless Target'),
+(11,8,3050,'Detect'),
+(11,8,3365,'Opening'),
+(11,8,5009,'Wands'),
+(11,8,5019,'Shoot'),
+(11,8,6233,'Closing'),
+(11,8,6246,'Closing'),
+(11,8,6247,'Opening'),
+(11,8,6477,'Opening'),
+(11,8,6478,'Opening'),
+(11,8,6603,'Attack'),
+(11,8,7266,'Duel'),
+(11,8,7267,'Grovel'),
+(11,8,7355,'Stuck'),
+(11,8,8386,'Attacking'),
+(11,8,9078,'Cloth'),
+(11,8,9125,'Generic'),
+(11,8,21651,'Opening'),
+(11,8,21652,'Closing'),
+(11,8,22027,'Remove Insignia'),
+(11,8,22810,'Opening - No Text'),
+(11,8,28875,'Gemcutting'),
+(11,8,28878,'Inspiring Presence'),
+(11,8,29932,'Language Draenei'),
+(11,8,45927,'Summon Friend'),
+(11,8,59221,'Shadow Resistance'),
+(11,8,59548,'Gift of the Naaru'),
+(11,8,61437,'Opening');
+/*!40000 ALTER TABLE `playercreateinfo_spell` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `points_of_interest`
+--
+
+DROP TABLE IF EXISTS `points_of_interest`;
+CREATE TABLE `points_of_interest` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `icon` mediumint(8) unsigned NOT NULL default '0',
+ `flags` mediumint(8) unsigned NOT NULL default '0',
+ `data` mediumint(8) unsigned NOT NULL default '0',
+ `icon_name` text NOT NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `points_of_interest`
+--
+
+LOCK TABLES `points_of_interest` WRITE;
+/*!40000 ALTER TABLE `points_of_interest` DISABLE KEYS */;
+/*!40000 ALTER TABLE `points_of_interest` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
+--
+-- Table structure for table `pool_creature`
+--
+
+DROP TABLE IF EXISTS `pool_creature`;
+CREATE TABLE `pool_creature` (
+ `guid` int(10) unsigned NOT NULL default '0',
+ `pool_entry` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float unsigned NOT NULL default '0',
+ PRIMARY KEY (`pool_entry`,`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+
+--
+-- Dumping data for table `pool_creature`
+--
+
+LOCK TABLES `pool_creature` WRITE;
+/*!40000 ALTER TABLE `pool_creature` DISABLE KEYS */;
+/*!40000 ALTER TABLE `pool_creature` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pool_gameobject`
+--
+
+DROP TABLE IF EXISTS `pool_gameobject`;
+CREATE TABLE `pool_gameobject` (
+ `guid` int(10) unsigned NOT NULL default '0',
+ `pool_entry` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`,`pool_entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `pool_gameobject`
+--
+
+LOCK TABLES `pool_gameobject` WRITE;
+/*!40000 ALTER TABLE `pool_gameobject` DISABLE KEYS */;
+/*!40000 ALTER TABLE `pool_gameobject` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pool_pool`
+--
+
+DROP TABLE IF EXISTS `pool_pool`;
+CREATE TABLE `pool_pool` (
+ `pool_id` mediumint(8) unsigned NOT NULL default '0',
+ `mother_pool` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float NOT NULL default '0',
+ PRIMARY KEY (`pool_id`,`mother_pool`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `pool_pool`
+--
+
+LOCK TABLES `pool_pool` WRITE;
+/*!40000 ALTER TABLE `pool_pool` DISABLE KEYS */;
+/*!40000 ALTER TABLE `pool_pool` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pool_template`
+--
+
+DROP TABLE IF EXISTS `pool_template`;
+CREATE TABLE `pool_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Pool entry',
+ `max_limit` int(10) unsigned NOT NULL default '0' COMMENT 'Max number of objects (0) is no limit',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `pool_template`
+--
+
+LOCK TABLES `pool_template` WRITE;
+/*!40000 ALTER TABLE `pool_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `pool_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event_pool`
+--
+
+DROP TABLE IF EXISTS `game_event_pool`;
+CREATE TABLE `game_event_pool` (
+ `pool_entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Id of the pool',
+ `event` smallint(6) NOT NULL default '0' COMMENT 'Put negatives values to remove during event',
+ PRIMARY KEY (`pool_entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_pool`
+--
+
+LOCK TABLES `game_event_pool` WRITE;
+/*!40000 ALTER TABLE `game_event_pool` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_pool` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `prospecting_loot_template`
+--
+
+DROP TABLE IF EXISTS `prospecting_loot_template`;
+CREATE TABLE `prospecting_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `prospecting_loot_template`
+--
+
+LOCK TABLES `prospecting_loot_template` WRITE;
+/*!40000 ALTER TABLE `prospecting_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `prospecting_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `quest_end_scripts`
+--
+
+DROP TABLE IF EXISTS `quest_end_scripts`;
+CREATE TABLE `quest_end_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `quest_end_scripts`
+--
+
+LOCK TABLES `quest_end_scripts` WRITE;
+/*!40000 ALTER TABLE `quest_end_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `quest_end_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `quest_start_scripts`
+--
+
+DROP TABLE IF EXISTS `quest_start_scripts`;
+CREATE TABLE `quest_start_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `quest_start_scripts`
+--
+
+LOCK TABLES `quest_start_scripts` WRITE;
+/*!40000 ALTER TABLE `quest_start_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `quest_start_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `quest_mail_loot_template`
+--
+
+DROP TABLE IF EXISTS `quest_mail_loot_template`;
+CREATE TABLE `quest_mail_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `quest_mail_loot_template`
+--
+
+LOCK TABLES `quest_mail_loot_template` WRITE;
+/*!40000 ALTER TABLE `quest_mail_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `quest_mail_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `quest_template`
+--
+
+DROP TABLE IF EXISTS `quest_template`;
+CREATE TABLE `quest_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `Method` tinyint(3) unsigned NOT NULL default '2',
+ `ZoneOrSort` smallint(6) NOT NULL default '0',
+ `SkillOrClass` smallint(6) NOT NULL default '0',
+ `MinLevel` tinyint(3) unsigned NOT NULL default '0',
+ `QuestLevel` tinyint(3) unsigned NOT NULL default '0',
+ `Type` smallint(5) unsigned NOT NULL default '0',
+ `RequiredRaces` smallint(5) unsigned NOT NULL default '0',
+ `RequiredSkillValue` smallint(5) unsigned NOT NULL default '0',
+ `RepObjectiveFaction` smallint(5) unsigned NOT NULL default '0',
+ `RepObjectiveValue` mediumint(9) NOT NULL default '0',
+ `RequiredMinRepFaction` smallint(5) unsigned NOT NULL default '0',
+ `RequiredMinRepValue` mediumint(9) NOT NULL default '0',
+ `RequiredMaxRepFaction` smallint(5) unsigned NOT NULL default '0',
+ `RequiredMaxRepValue` mediumint(9) NOT NULL default '0',
+ `SuggestedPlayers` tinyint(3) unsigned NOT NULL default '0',
+ `LimitTime` int(10) unsigned NOT NULL default '0',
+ `QuestFlags` smallint(5) unsigned NOT NULL default '0',
+ `SpecialFlags` tinyint(3) unsigned NOT NULL default '0',
+ `CharTitleId` tinyint(3) unsigned NOT NULL default '0',
+ `PlayersSlain` tinyint(3) unsigned NOT NULL default '0',
+ `BonusTalents` tinyint(3) unsigned NOT NULL default '0',
+ `PrevQuestId` mediumint(9) NOT NULL default '0',
+ `NextQuestId` mediumint(9) NOT NULL default '0',
+ `ExclusiveGroup` mediumint(9) NOT NULL default '0',
+ `NextQuestInChain` mediumint(8) unsigned NOT NULL default '0',
+ `SrcItemId` mediumint(8) unsigned NOT NULL default '0',
+ `SrcItemCount` tinyint(3) unsigned NOT NULL default '0',
+ `SrcSpell` mediumint(8) unsigned NOT NULL default '0',
+ `Title` text,
+ `Details` text,
+ `Objectives` text,
+ `OfferRewardText` text,
+ `RequestItemsText` text,
+ `EndText` text,
+ `ObjectiveText1` text,
+ `ObjectiveText2` text,
+ `ObjectiveText3` text,
+ `ObjectiveText4` text,
+ `ReqItemId1` mediumint(8) unsigned NOT NULL default '0',
+ `ReqItemId2` mediumint(8) unsigned NOT NULL default '0',
+ `ReqItemId3` mediumint(8) unsigned NOT NULL default '0',
+ `ReqItemId4` mediumint(8) unsigned NOT NULL default '0',
+ `ReqItemCount1` smallint(5) unsigned NOT NULL default '0',
+ `ReqItemCount2` smallint(5) unsigned NOT NULL default '0',
+ `ReqItemCount3` smallint(5) unsigned NOT NULL default '0',
+ `ReqItemCount4` smallint(5) unsigned NOT NULL default '0',
+ `ReqSourceId1` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSourceId2` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSourceId3` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSourceId4` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSourceCount1` smallint(5) unsigned NOT NULL default '0',
+ `ReqSourceCount2` smallint(5) unsigned NOT NULL default '0',
+ `ReqSourceCount3` smallint(5) unsigned NOT NULL default '0',
+ `ReqSourceCount4` smallint(5) unsigned NOT NULL default '0',
+ `ReqSourceRef1` tinyint(3) unsigned NOT NULL default '0',
+ `ReqSourceRef2` tinyint(3) unsigned NOT NULL default '0',
+ `ReqSourceRef3` tinyint(3) unsigned NOT NULL default '0',
+ `ReqSourceRef4` tinyint(3) unsigned NOT NULL default '0',
+ `ReqCreatureOrGOId1` mediumint(9) NOT NULL default '0',
+ `ReqCreatureOrGOId2` mediumint(9) NOT NULL default '0',
+ `ReqCreatureOrGOId3` mediumint(9) NOT NULL default '0',
+ `ReqCreatureOrGOId4` mediumint(9) NOT NULL default '0',
+ `ReqCreatureOrGOCount1` smallint(5) unsigned NOT NULL default '0',
+ `ReqCreatureOrGOCount2` smallint(5) unsigned NOT NULL default '0',
+ `ReqCreatureOrGOCount3` smallint(5) unsigned NOT NULL default '0',
+ `ReqCreatureOrGOCount4` smallint(5) unsigned NOT NULL default '0',
+ `ReqSpellCast1` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSpellCast2` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSpellCast3` mediumint(8) unsigned NOT NULL default '0',
+ `ReqSpellCast4` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemId1` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemId2` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemId3` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemId4` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemId5` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemId6` mediumint(8) unsigned NOT NULL default '0',
+ `RewChoiceItemCount1` smallint(5) unsigned NOT NULL default '0',
+ `RewChoiceItemCount2` smallint(5) unsigned NOT NULL default '0',
+ `RewChoiceItemCount3` smallint(5) unsigned NOT NULL default '0',
+ `RewChoiceItemCount4` smallint(5) unsigned NOT NULL default '0',
+ `RewChoiceItemCount5` smallint(5) unsigned NOT NULL default '0',
+ `RewChoiceItemCount6` smallint(5) unsigned NOT NULL default '0',
+ `RewItemId1` mediumint(8) unsigned NOT NULL default '0',
+ `RewItemId2` mediumint(8) unsigned NOT NULL default '0',
+ `RewItemId3` mediumint(8) unsigned NOT NULL default '0',
+ `RewItemId4` mediumint(8) unsigned NOT NULL default '0',
+ `RewItemCount1` smallint(5) unsigned NOT NULL default '0',
+ `RewItemCount2` smallint(5) unsigned NOT NULL default '0',
+ `RewItemCount3` smallint(5) unsigned NOT NULL default '0',
+ `RewItemCount4` smallint(5) unsigned NOT NULL default '0',
+ `RewRepFaction1` smallint(5) unsigned NOT NULL default '0' COMMENT 'faction id from Faction.dbc in this case',
+ `RewRepFaction2` smallint(5) unsigned NOT NULL default '0' COMMENT 'faction id from Faction.dbc in this case',
+ `RewRepFaction3` smallint(5) unsigned NOT NULL default '0' COMMENT 'faction id from Faction.dbc in this case',
+ `RewRepFaction4` smallint(5) unsigned NOT NULL default '0' COMMENT 'faction id from Faction.dbc in this case',
+ `RewRepFaction5` smallint(5) unsigned NOT NULL default '0' COMMENT 'faction id from Faction.dbc in this case',
+ `RewRepValue1` mediumint(9) NOT NULL default '0',
+ `RewRepValue2` mediumint(9) NOT NULL default '0',
+ `RewRepValue3` mediumint(9) NOT NULL default '0',
+ `RewRepValue4` mediumint(9) NOT NULL default '0',
+ `RewRepValue5` mediumint(9) NOT NULL default '0',
+ `RewHonorableKills` int unsigned NOT NULL default '0',
+ `RewOrReqMoney` int(11) NOT NULL default '0',
+ `RewMoneyMaxLevel` int(10) unsigned NOT NULL default '0',
+ `RewSpell` mediumint(8) unsigned NOT NULL default '0',
+ `RewSpellCast` mediumint(8) unsigned NOT NULL default '0',
+ `RewMailTemplateId` mediumint(8) unsigned NOT NULL default '0',
+ `RewMailDelaySecs` int(11) unsigned NOT NULL default '0',
+ `PointMapId` smallint(5) unsigned NOT NULL default '0',
+ `PointX` float NOT NULL default '0',
+ `PointY` float NOT NULL default '0',
+ `PointOpt` mediumint(8) unsigned NOT NULL default '0',
+ `DetailsEmote1` smallint(5) unsigned NOT NULL default '0',
+ `DetailsEmote2` smallint(5) unsigned NOT NULL default '0',
+ `DetailsEmote3` smallint(5) unsigned NOT NULL default '0',
+ `DetailsEmote4` smallint(5) unsigned NOT NULL default '0',
+ `IncompleteEmote` smallint(5) unsigned NOT NULL default '0',
+ `CompleteEmote` smallint(5) unsigned NOT NULL default '0',
+ `OfferRewardEmote1` smallint(5) unsigned NOT NULL default '0',
+ `OfferRewardEmote2` smallint(5) unsigned NOT NULL default '0',
+ `OfferRewardEmote3` smallint(5) unsigned NOT NULL default '0',
+ `OfferRewardEmote4` smallint(5) unsigned NOT NULL default '0',
+ `StartScript` mediumint(8) unsigned NOT NULL default '0',
+ `CompleteScript` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Quest System';
+
+--
+-- Dumping data for table `quest_template`
+--
+
+LOCK TABLES `quest_template` WRITE;
+/*!40000 ALTER TABLE `quest_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `quest_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `reference_loot_template`
+--
+
+DROP TABLE IF EXISTS `reference_loot_template`;
+CREATE TABLE `reference_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `reference_loot_template`
+--
+
+LOCK TABLES `reference_loot_template` WRITE;
+/*!40000 ALTER TABLE `reference_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `reference_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `reserved_name`
+--
+
+DROP TABLE IF EXISTS `reserved_name`;
+CREATE TABLE `reserved_name` (
+ `name` varchar(12) NOT NULL default '',
+ PRIMARY KEY (`name`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player Reserved Names';
+
+--
+-- Dumping data for table `reserved_name`
+--
+
+LOCK TABLES `reserved_name` WRITE;
+/*!40000 ALTER TABLE `reserved_name` DISABLE KEYS */;
+/*!40000 ALTER TABLE `reserved_name` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `skill_discovery_template`
+--
+
+DROP TABLE IF EXISTS `skill_discovery_template`;
+CREATE TABLE `skill_discovery_template` (
+ `spellId` mediumint(8) unsigned NOT NULL default '0' COMMENT 'SpellId of the discoverable spell',
+ `reqSpell` mediumint(8) unsigned NOT NULL default '0' COMMENT 'spell requirement',
+ `reqSkillValue` smallint(5) unsigned NOT NULL default '0' COMMENT 'skill points requirement',
+ `chance` float NOT NULL default '0' COMMENT 'chance to discover',
+ PRIMARY KEY (`spellId`,`reqSpell`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Skill Discovery System';
+
+--
+-- Dumping data for table `skill_discovery_template`
+--
+
+LOCK TABLES `skill_discovery_template` WRITE;
+/*!40000 ALTER TABLE `skill_discovery_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `skill_discovery_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `skill_extra_item_template`
+--
+
+DROP TABLE IF EXISTS `skill_extra_item_template`;
+CREATE TABLE `skill_extra_item_template` (
+ `spellId` mediumint(8) unsigned NOT NULL default '0' COMMENT 'SpellId of the item creation spell',
+ `requiredSpecialization` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Specialization spell id',
+ `additionalCreateChance` float NOT NULL default '0' COMMENT 'chance to create add',
+ `additionalMaxNum` tinyint(3) unsigned NOT NULL default '0' COMMENT 'max num of adds',
+ PRIMARY KEY (`spellId`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Skill Specialization System';
+
+--
+-- Dumping data for table `skill_extra_item_template`
+--
+
+LOCK TABLES `skill_extra_item_template` WRITE;
+/*!40000 ALTER TABLE `skill_extra_item_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `skill_extra_item_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `skill_fishing_base_level`
+--
+
+DROP TABLE IF EXISTS `skill_fishing_base_level`;
+CREATE TABLE `skill_fishing_base_level` (
+ `entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Area identifier',
+ `skill` smallint(6) NOT NULL default '0' COMMENT 'Base skill level requirement',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Fishing system';
+
+--
+-- Dumping data for table `skill_fishing_base_level`
+--
+
+LOCK TABLES `skill_fishing_base_level` WRITE;
+/*!40000 ALTER TABLE `skill_fishing_base_level` DISABLE KEYS */;
+/*!40000 ALTER TABLE `skill_fishing_base_level` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `skinning_loot_template`
+--
+
+DROP TABLE IF EXISTS `skinning_loot_template`;
+CREATE TABLE `skinning_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `skinning_loot_template`
+--
+
+LOCK TABLES `skinning_loot_template` WRITE;
+/*!40000 ALTER TABLE `skinning_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `skinning_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_affect`
+--
+
+DROP TABLE IF EXISTS `spell_affect`;
+CREATE TABLE `spell_affect` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `effectId` tinyint(3) unsigned NOT NULL default '0',
+ `SpellClassMask0` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask1` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask2` int(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`effectId`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `spell_affect`
+--
+
+LOCK TABLES `spell_affect` WRITE;
+/*!40000 ALTER TABLE `spell_affect` DISABLE KEYS */;
+/*!40000 ALTER TABLE `spell_affect` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_chain`
+--
+
+DROP TABLE IF EXISTS `spell_chain`;
+CREATE TABLE `spell_chain` (
+ `spell_id` mediumint(9) NOT NULL default '0',
+ `prev_spell` mediumint(9) NOT NULL default '0',
+ `first_spell` mediumint(9) NOT NULL default '0',
+ `rank` tinyint(4) NOT NULL default '0',
+ `req_spell` mediumint(9) NOT NULL default '0',
+ PRIMARY KEY (`spell_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Spell Additinal Data';
+
+--
+-- Dumping data for table `spell_chain`
+--
+
+LOCK TABLES `spell_chain` WRITE;
+/*!40000 ALTER TABLE `spell_chain` DISABLE KEYS */;
+INSERT INTO spell_chain VALUES
+/*------------------
+--(6) Frost
+------------------*/
+/*Blizzard*/
+(10,0,10,1,0),
+(6141,10,10,2,0),
+(8427,6141,10,3,0),
+(10185,8427,10,4,0),
+(10186,10185,10,5,0),
+(10187,10186,10,6,0),
+(27085,10187,10,7,0),
+(42939,27085,10,8,0),
+(42940,42939,10,9,0),
+/*ConeofCold*/
+(120,0,120,1,0),
+(8492,120,120,2,0),
+(10159,8492,120,3,0),
+(10160,10159,120,4,0),
+(10161,10160,120,5,0),
+(27087,10161,120,6,0),
+(42930,27087,120,7,0),
+(42931,42930,120,8,0),
+/*FrostArmor*/
+(168,0,168,1,0),
+(7300,168,168,2,0),
+(7301,7300,168,3,0),
+/*FrostNova*/
+(122,0,122,1,0),
+(865,122,122,2,0),
+(6131,865,122,3,0),
+(10230,6131,122,4,0),
+(27088,10230,122,5,0),
+(42917,27088,122,6,0),
+/*FrostWard*/
+(6143,0,6143,1,0),
+(8461,6143,6143,2,0),
+(8462,8461,6143,3,0),
+(10177,8462,6143,4,0),
+(28609,10177,6143,5,0),
+(32796,28609,6143,6,0),
+(43012,32796,6143,7,0),
+/*Frostbolt*/
+(116,0,116,1,0),
+(205,116,116,2,0),
+(837,205,116,3,0),
+(7322,837,116,4,0),
+(8406,7322,116,5,0),
+(8407,8406,116,6,0),
+(8408,8407,116,7,0),
+(10179,8408,116,8,0),
+(10180,10179,116,9,0),
+(10181,10180,116,10,0),
+(25304,10181,116,11,0),
+(27071,25304,116,12,0),
+(27072,27071,116,13,0),
+(38697,27072,116,14,0),
+(42841,38697,116,15,0),
+(42842,42841,116,16,0),
+/*IceArmor*/
+(7302,0,7302,1,0),
+(7320,7302,7302,2,0),
+(10219,7320,7302,3,0),
+(10220,10219,7302,4,0),
+(27124,10220,7302,5,0),
+(43008,27124,7302,6,0),
+/*IceBarrier*/
+(11426,0,11426,1,0),
+(13031,11426,11426,2,0),
+(13032,13031,11426,3,0),
+(13033,13032,11426,4,0),
+(27134,13033,11426,5,0),
+(33405,27134,11426,6,0),
+(43038,33405,11426,7,0),
+(43039,43038,11426,8,0),
+/*IceLance*/
+(30455,0,30455,1,0),
+(42913,30455,30455,2,0),
+(42914,42913,30455,3,0),
+/*------------------
+--(8)Fire
+------------------*/
+/*BlastWave*/
+(11113,0,11113,1,0),
+(13018,11113,11113,2,0),
+(13019,13018,11113,3,0),
+(13020,13019,11113,4,0),
+(13021,13020,11113,5,0),
+(27133,13021,11113,6,0),
+(33933,27133,11113,7,0),
+(42944,33933,11113,8,0),
+(42945,42944,11113,9,0),
+/*Dragon'sBreath*/
+(31661,0,31661,1,0),
+(33041,31661,31661,2,0),
+(33042,33041,31661,3,0),
+(33043,33042,31661,4,0),
+(42949,33043,31661,5,0),
+(42950,42949,31661,6,0),
+/*FireBlast*/
+(2136,0,2136,1,0),
+(2137,2136,2136,2,0),
+(2138,2137,2136,3,0),
+(8412,2138,2136,4,0),
+(8413,8412,2136,5,0),
+(10197,8413,2136,6,0),
+(10199,10197,2136,7,0),
+(27078,10199,2136,8,0),
+(27079,27078,2136,9,0),
+(42872,27079,2136,10,0),
+(42873,42872,2136,11,0),
+/*FireWard*/
+(543,0,543,1,0),
+(8457,543,543,2,0),
+(8458,8457,543,3,0),
+(10223,8458,543,4,0),
+(10225,10223,543,5,0),
+(27128,10225,543,6,0),
+(43010,27128,543,7,0),
+/*Fireball*/
+(133,0,133,1,0),
+(143,133,133,2,0),
+(145,143,133,3,0),
+(3140,145,133,4,0),
+(8400,3140,133,5,0),
+(8401,8400,133,6,0),
+(8402,8401,133,7,0),
+(10148,8402,133,8,0),
+(10149,10148,133,9,0),
+(10150,10149,133,10,0),
+(10151,10150,133,11,0),
+(25306,10151,133,12,0),
+(27070,25306,133,13,0),
+(38692,27070,133,14,0),
+(42832,38692,133,15,0),
+(42833,42832,133,16,0),
+/*Flamestrike*/
+(2120,0,2120,1,0),
+(2121,2120,2120,2,0),
+(8422,2121,2120,3,0),
+(8423,8422,2120,4,0),
+(10215,8423,2120,5,0),
+(10216,10215,2120,6,0),
+(27086,10216,2120,7,0),
+(42925,27086,2120,8,0),
+(42926,42925,2120,9,0),
+/*FrostfireBolt*/
+(44614,0,44614,1,0),
+(47610,44614,44614,2,0),
+/*LivingBomb*/
+(44457,0,44457,1,0),
+(55359,44457,44457,2,0),
+(55360,55359,44457,3,0),
+/*MoltenArmor*/
+(30482,0,30482,1,0),
+(43045,30482,30482,2,0),
+(43046,43045,30482,3,0),
+/*Pyroblast*/
+(11366,0,11366,1,0),
+(12505,11366,11366,2,0),
+(12522,12505,11366,3,0),
+(12523,12522,11366,4,0),
+(12524,12523,11366,5,0),
+(12525,12524,11366,6,0),
+(12526,12525,11366,7,0),
+(18809,12526,11366,8,0),
+(27132,18809,11366,9,0),
+(33938,27132,11366,10,0),
+(42890,33938,11366,11,0),
+(42891,42890,11366,12,0),
+/*Scorch*/
+(2948,0,2948,1,0),
+(8444,2948,2948,2,0),
+(8445,8444,2948,3,0),
+(8446,8445,2948,4,0),
+(10205,8446,2948,5,0),
+(10206,10205,2948,6,0),
+(10207,10206,2948,7,0),
+(27073,10207,2948,8,0),
+(27074,27073,2948,9,0),
+(42858,27074,2948,10,0),
+(42859,42858,2948,11,0),
+/*------------------
+--(26)Arms
+------------------*/
+/*Charge*/
+(100,0,100,1,0),
+(6178,100,100,2,0),
+(11578,6178,100,3,0),
+/*HeroicStrike*/
+(78,0,78,1,0),
+(284,78,78,2,0),
+(285,284,78,3,0),
+(1608,285,78,4,0),
+(11564,1608,78,5,0),
+(11565,11564,78,6,0),
+(11566,11565,78,7,0),
+(11567,11566,78,8,0),
+(25286,11567,78,9,0),
+(29707,25286,78,10,0),
+(30324,29707,78,11,0),
+(47449,30324,78,12,0),
+(47450,47449,78,13,0),
+/*MortalStrike*/
+(12294,0,12294,1,0),
+(21551,12294,12294,2,0),
+(21552,21551,12294,3,0),
+(21553,21552,12294,4,0),
+(25248,21553,12294,5,0),
+(30330,25248,12294,6,0),
+(47485,30330,12294,7,0),
+(47486,47485,12294,8,0),
+/*Rend*/
+(772,0,772,1,0),
+(6546,772,772,2,0),
+(6547,6546,772,3,0),
+(6548,6547,772,4,0),
+(11572,6548,772,5,0),
+(11573,11572,772,6,0),
+(11574,11573,772,7,0),
+(25208,11574,772,8,0),
+(46845,25208,772,9,0),
+(47465,46845,772,10,0),
+/*ThunderClap*/
+(6343,0,6343,1,0),
+(8198,6343,6343,2,0),
+(8204,8198,6343,3,0),
+(8205,8204,6343,4,0),
+(11580,8205,6343,5,0),
+(11581,11580,6343,6,0),
+(25264,11581,6343,7,0),
+(47501,25264,6343,8,0),
+(47502,47501,6343,9,0),
+/*------------------
+-- (38) Combat (Rogue)
+------------------*/
+/*Backstab*/
+(53,0,53,1,0),
+(2589,53,53,2,0),
+(2590,2589,53,3,0),
+(2591,2590,53,4,0),
+(8721,2591,53,5,0),
+(11279,8721,53,6,0),
+(11280,11279,53,7,0),
+(11281,11280,53,8,0),
+(25300,11281,53,9,0),
+(26863,25300,53,10,0),
+(48656,26863,53,11,0),
+(48657,48656,53,12,0),
+/*Evasion*/
+(5277,0,5277,1,0),
+(26669,5277,5277,2,0),
+/*Feint*/
+(1966,0,1966,1,0),
+(6768,1966,1966,2,0),
+(8637,6768,1966,3,0),
+(11303,8637,1966,4,0),
+(25302,11303,1966,5,0),
+(27448,25302,1966,6,0),
+(48658,27448,1966,7,0),
+(48659,48658,1966,8,0),
+/*Sinister Strike*/
+(1752,0,1752,1,0),
+(1757,1752,1752,2,0),
+(1758,1757,1752,3,0),
+(1759,1758,1752,4,0),
+(1760,1759,1752,5,0),
+(8621,1760,1752,6,0),
+(11293,8621,1752,7,0),
+(11294,11293,1752,8,0),
+(26861,11294,1752,9,0),
+(26862,26861,1752,10,0),
+(48637,26862,1752,11,0),
+(48638,48637,1752,12,0),
+/*Sprint*/
+(2983,0,2983,1,0),
+(8696,2983,2983,2,0),
+(11305,8696,2983,3,0),
+/*------------------
+--(39)Subtlety
+------------------*/
+/*Hemorrhage*/
+(16511,0,16511,1,0),
+(17347,16511,16511,2,0),
+(17348,17347,16511,3,0),
+(26864,17348,16511,4,0),
+(48660,26864,16511,5,0),
+/*Sap*/
+(6770,0,6770,1,0),
+(2070,6770,6770,2,0),
+(11297,2070,6770,3,0),
+(51724,11297,6770,4,0),
+/*Stealth*/
+(1784,0,1784,1,0),
+(1785,1784,1784,2,0),
+(1786,1785,1784,3,0),
+(1787,1786,1784,4,0),
+/*Vanish*/
+(1856,0,1856,1,0),
+(1857,1856,1856,2,0),
+(26889,1857,1856,3,0),
+/*------------------
+-- (50) Beast Mastery
+------------------*/
+/*Aspect of the Hawk*/
+(13165,0,13165,1,0),
+(14318,13165,13165,2,0),
+(14319,14318,13165,3,0),
+(14320,14319,13165,4,0),
+(14321,14320,13165,5,0),
+(14322,14321,13165,6,0),
+(25296,14322,13165,7,0),
+(27044,25296,13165,8,0),
+/*Aspect of the Wild*/
+(20043,0,20043,1,0),
+(20190,20043,20043,2,0),
+(27045,20190,20043,3,0),
+(49071,27045,20043,4,0),
+/*MendPet*/
+(136,0,136,1,0),
+(3111,136,136,2,0),
+(3661,3111,136,3,0),
+(3662,3661,136,4,0),
+(13542,3662,136,5,0),
+(13543,13542,136,6,0),
+(13544,13543,136,7,0),
+(27046,13544,136,8,0),
+(48989,27046,136,9,0),
+(48990,48989,136,10,0),
+/*ScareBeast*/
+(1513,0,1513,1,0),
+(14326,1513,1513,2,0),
+(14327,14326,1513,3,0),
+/*------------------
+--(51)Survival
+------------------*/
+/*Counterattack*/
+(19306,0,19306,1,0),
+(20909,19306,19306,2,0),
+(20910,20909,19306,3,0),
+(27067,20910,19306,4,0),
+(48998,27067,19306,5,0),
+(48999,48998,19306,6,0),
+/*ExplosiveShot*/
+(53301,0,53301,1,0),
+(60051,53301,53301,2,0),
+(60052,60051,53301,3,0),
+(60053,60052,53301,4,0),
+/*ExplosiveTrap*/
+(13813,0,13813,1,0),
+(14316,13813,13813,2,0),
+(14317,14316,13813,3,0),
+(27025,14317,13813,4,0),
+(49066,27025,13813,5,0),
+(49067,49066,13813,6,0),
+/*FreezingTrap*/
+(1499,0,1499,1,0),
+(14310,1499,1499,2,0),
+(14311,14310,1499,3,0),
+/*ImmolationTrap*/
+(13795,0,13795,1,0),
+(14302,13795,13795,2,0),
+(14303,14302,13795,3,0),
+(14304,14303,13795,4,0),
+(14305,14304,13795,5,0),
+(27023,14305,13795,6,0),
+(49055,27023,13795,7,0),
+(49056,49055,13795,8,0),
+/*MongooseBite*/
+(1495,0,1495,1,0),
+(14269,1495,1495,2,0),
+(14270,14269,1495,3,0),
+(14271,14270,1495,4,0),
+(36916,14271,1495,5,0),
+(53339,36916,1495,6,0),
+/*RaptorStrike*/
+(2973,0,2973,1,0),
+(14260,2973,2973,2,0),
+(14261,14260,2973,3,0),
+(14262,14261,2973,4,0),
+(14263,14262,2973,5,0),
+(14264,14263,2973,6,0),
+(14265,14264,2973,7,0),
+(14266,14265,2973,8,0),
+(27014,14266,2973,9,0),
+(48995,27014,2973,10,0),
+(48996,48995,2973,11,0),
+/*WyvernSting*/
+(19386,0,19386,1,0),
+(24132,19386,19386,2,0),
+(24133,24132,19386,3,0),
+(27068,24133,19386,4,0),
+(49011,27068,19386,5,0),
+(49012,49011,19386,6,0),
+/*------------------
+-- (56) Holy (Priest)
+------------------*/
+/*Binding Heal*/
+(32546,0,32546,1,0),
+(48119,32546,32546,2,0),
+(48120,48119,32546,3,0),
+/*Circle of Healing*/
+(34861,0,34861,1,0),
+(34863,34861,34861,2,0),
+(34864,34863,34861,3,0),
+(34865,34864,34861,4,0),
+(34866,34865,34861,5,0),
+(48088,34866,34861,6,0),
+(48089,48088,34861,7,0),
+/*DesperatePrayer*/
+(19236,0,19236,1,0),
+(19238,19236,19236,2,0),
+(19240,19238,19236,3,0),
+(19241,19240,19236,4,0),
+(19242,19241,19236,5,0),
+(19243,19242,19236,6,0),
+(25437,19243,19236,7,0),
+(48172,25437,19236,8,0),
+(48173,48172,19236,9,0),
+/*FlashHeal*/
+(2061,0,2061,1,0),
+(9472,2061,2061,2,0),
+(9473,9472,2061,3,0),
+(9474,9473,2061,4,0),
+(10915,9474,2061,5,0),
+(10916,10915,2061,6,0),
+(10917,10916,2061,7,0),
+(25233,10917,2061,8,0),
+(25235,25233,2061,9,0),
+(48070,25235,2061,10,0),
+(48071,48070,2061,11,0),
+/*GreaterHeal*/
+(2060,0,2060,1,0),
+(10963,2060,2060,2,0),
+(10964,10963,2060,3,0),
+(10965,10964,2060,4,0),
+(25314,10965,2060,5,0),
+(25210,25314,2060,6,0),
+(25213,25210,2060,7,0),
+(48062,25213,2060,8,0),
+(48063,48062,2060,9,0),
+/*Heal*/
+(2054,0,2054,1,0),
+(2055,2054,2054,2,0),
+(6063,2055,2054,3,0),
+(6064,6063,2054,4,0),
+/*Holy Fire*/
+(14914,0,14914,1,0),
+(15262,14914,14914,2,0),
+(15263,15262,14914,3,0),
+(15264,15263,14914,4,0),
+(15265,15264,14914,5,0),
+(15266,15265,14914,6,0),
+(15267,15266,14914,7,0),
+(15261,15267,14914,8,0),
+(25384,15261,14914,9,0),
+(48134,25384,14914,10,0),
+(48135,48134,14914,11,0),
+/*Holy Nova*/
+(15237,0,15237,1,0),
+(15430,15237,15237,2,0),
+(15431,15430,15237,3,0),
+(27799,15431,15237,4,0),
+(27800,27799,15237,5,0),
+(27801,27800,15237,6,0),
+(25331,27801,15237,7,0),
+(48077,25331,15237,8,0),
+(48078,48077,15237,9,0),
+/*LesserHeal*/
+(2050,0,2050,1,0),
+(2052,2050,2050,2,0),
+(2053,2052,2050,3,0),
+/*Lightwell*/
+(724,0,724,1,0),
+(27870,724,724,2,0),
+(27871,27870,724,3,0),
+(28275,27871,724,4,0),
+(48086,28275,724,5,0),
+(48087,48086,724,6,0),
+/*Prayer of Healing*/
+(596,0,596,1,0),
+(996,596,596,2,0),
+(10960,996,596,3,0),
+(10961,10960,596,4,0),
+(25316,10961,596,5,0),
+(25308,25316,596,6,0),
+(48072,25308,596,7,0),
+/*Prayer of Mending*/
+(33076,0,33076,1,0),
+(48112,33076,33076,2,0),
+(48113,48112,33076,3,0),
+/*Renew*/
+(139,0,139,1,0),
+(6074,139,139,2,0),
+(6075,6074,139,3,0),
+(6076,6075,139,4,0),
+(6077,6076,139,5,0),
+(6078,6077,139,6,0),
+(10927,6078,139,7,0),
+(10928,10927,139,8,0),
+(10929,10928,139,9,0),
+(25315,10929,139,10,0),
+(25221,25315,139,11,0),
+(25222,25221,139,12,0),
+(48067,25222,139,13,0),
+(48068,48067,139,14,0),
+/*Resurrection*/
+(2006,0,2006,1,0),
+(2010,2006,2006,2,0),
+(10880,2010,2006,3,0),
+(10881,10880,2006,4,0),
+(20770,10881,2006,5,0),
+(25435,20770,2006,6,0),
+(48171,25435,2006,7,0),
+/*Smite*/
+(585,0,585,1,0),
+(591,585,585,2,0),
+(598,591,585,3,0),
+(984,598,585,4,0),
+(1004,984,585,5,0),
+(6060,1004,585,6,0),
+(10933,6060,585,7,0),
+(10934,10933,585,8,0),
+(25363,10934,585,9,0),
+(25364,25363,585,10,0),
+(48122,25364,585,11,0),
+(48123,48122,585,12,0),
+/*------------------
+-- (78) Shadow Magic
+------------------*/
+/*Devouring Plague*/
+(2944,0,2944,1,0),
+(19276,2944,2944,2,0),
+(19277,19276,2944,3,0),
+(19278,19277,2944,4,0),
+(19279,19278,2944,5,0),
+(19280,19279,2944,6,0),
+(25467,19280,2944,7,0),
+(48299,25467,2944,8,0),
+(48300,48299,2944,9,0),
+/*Mind Blast*/
+(8092,0,8092,1,0),
+(8102,8092,8092,2,0),
+(8103,8102,8092,3,0),
+(8104,8103,8092,4,0),
+(8105,8104,8092,5,0),
+(8106,8105,8092,6,0),
+(10945,8106,8092,7,0),
+(10946,10945,8092,8,0),
+(10947,10946,8092,9,0),
+(25372,10947,8092,10,0),
+(25375,25372,8092,11,0),
+(48126,25375,8092,12,0),
+(48127,48126,8092,13,0),
+/*MindFlay*/
+(15407,0,15407,1,0),
+(17311,15407,15407,2,0),
+(17312,17311,15407,3,0),
+(17313,17312,15407,4,0),
+(17314,17313,15407,5,0),
+(18807,17314,15407,6,0),
+(25387,18807,15407,7,0),
+(48155,25387,15407,8,0),
+(48156,48155,15407,9,0),
+/*MindSear*/
+(48045,0,48045,1,0),
+(53023,48045,48045,2,0),
+/*MindVision*/
+(2096,0,2096,1,0),
+(10909,2096,2096,2,0),
+/*Prayer of Shadow Protection*/
+(27683,0,27683,1,0),
+(39374,27683,27683,2,0),
+(48170,39374,27683,3,0),
+/*PsychicScream*/
+(8122,0,8122,1,0),
+(8124,8122,8122,2,0),
+(10888,8124,8122,3,0),
+(10890,10888,8122,4,0),
+/*Shadow Protection*/
+(976,0,976,1,0),
+(10957,976,976,2,0),
+(10958,10957,976,3,0),
+(25433,10958,976,4,0),
+(48169,25433,976,5,0),
+/*ShadowWord:Death*/
+(32379,0,32379,1,0),
+(32996,32379,32379,2,0),
+(48157,32996,32379,3,0),
+(48158,48157,32379,4,0),
+/*ShadowWord:Pain*/
+(589,0,589,1,0),
+(594,589,589,2,0),
+(970,594,589,3,0),
+(992,970,589,4,0),
+(2767,992,589,5,0),
+(10892,2767,589,6,0),
+(10893,10892,589,7,0),
+(10894,10893,589,8,0),
+(25367,10894,589,9,0),
+(25368,25367,589,10,0),
+(48124,25368,589,11,0),
+(48125,48124,589,12,0),
+/*Vampiric Touch*/
+(34914,0,34914,1,0),
+(34916,34914,34914,2,0),
+(34917,34916,34914,3,0),
+(48159,34917,34914,4,0),
+(48160,48159,34914,5,0),
+/*------------------
+-- (129) First Aid
+------------------*/
+/*First Aid*/
+(3273,0,3273,1,0),
+(3274,3273,3273,2,0),
+(7924,3274,3273,3,0),
+(10846,7924,3273,4,0),
+(27028,10846,3273,5,0),
+(45542,27028,3273,6,0),
+/*------------------
+-- (134) Feral Combat (Druid)
+------------------*/
+/*Bash*/
+(5211,0,5211,1,0),
+(6798,5211,5211,2,0),
+(8983,6798,5211,3,0),
+/*Bear Form*/
+(5487,0,5487,1,0),
+(9634,5487,5487,2,0),
+/*Claw*/
+(1082,0,1082,1,0),
+(3029,1082,1082,2,0),
+(5201,3029,1082,3,0),
+(9849,5201,1082,4,0),
+(9850,9849,1082,5,0),
+(27000,9850,1082,6,0),
+(48569,27000,1082,7,0),
+(48570,48569,1082,8,0),
+/*Cower*/
+(8998,0,8998,1,0),
+(9000,8998,8998,2,0),
+(9892,9000,8998,3,0),
+(31709,9892,8998,4,0),
+(27004,31709,8998,5,0),
+(48575,27004,8998,6,0),
+/*Dash*/
+(1850,0,1850,1,0),
+(9821,1850,1850,2,0),
+(33357,9821,1850,3,0),
+/*Demoralizing Roar*/
+(99,0,99,1,0),
+(1735,99,99,2,0),
+(9490,1735,99,3,0),
+(9747,9490,99,4,0),
+(9898,9747,99,5,0),
+(26998,9898,99,6,0),
+(48559,26998,99,7,0),
+(48560,48559,99,8,0),
+/*Faerie Fire (Feral)*/
+(16857,0,16857,1,0),
+(17390,16857,16857,2,0),
+(17391,17390,16857,3,0),
+(17392,17391,16857,4,0),
+(27011,17392,16857,5,0),
+(48475,27011,16857,6,0),
+/*Ferocious Bite*/
+(22568,0,22568,1,0),
+(22827,22568,22568,2,0),
+(22828,22827,22568,3,0),
+(22829,22828,22568,4,0),
+(31018,22829,22568,5,0),
+(24248,31018,22568,6,0),
+(48576,24248,22568,7,0),
+(48577,48576,22568,8,0),
+/*Flight Form*/
+(33943,0,33943,1,0),
+(40120,33943,33943,2,0),
+/*Lacerate*/
+(33745,0,33745,1,0),
+(48567,33745,33745,2,0),
+(48568,48567,33745,3,0),
+/*Maim*/
+(22570,0,22570,1,0),
+(49802,22570,22570,2,0),
+/*Mangle-Bear*/
+(33878,0,33878,1,0),
+(33986,33878,33878,2,0),
+(33987,33986,33878,3,0),
+(48563,33987,33878,4,0),
+(48564,48563,33878,5,0),
+/*Mangle-Cat*/
+(33876,0,33876,1,0),
+(33982,33876,33876,2,0),
+(33983,33982,33876,3,0),
+(48565,33983,33876,4,0),
+(48566,48565,33876,5,0),
+/*Maul*/
+(6807,0,6807,1,0),
+(6808,6807,6807,2,0),
+(6809,6808,6807,3,0),
+(8972,6809,6807,4,0),
+(9745,8972,6807,5,0),
+(9880,9745,6807,6,0),
+(9881,9880,6807,7,0),
+(26996,9881,6807,8,0),
+(48479,26996,6807,9,0),
+(48480,48479,6807,10,0),
+/*Pounce*/
+(9005,0,9005,1,0),
+(9823,9005,9005,2,0),
+(9827,9823,9005,3,0),
+(27006,9827,9005,4,0),
+(49803,27006,9005,5,0),
+/*Prowl*/
+(5215,0,5215,1,0),
+(6783,5215,5215,2,0),
+(9913,6783,5215,3,0),
+/*Rake*/
+(1822,0,1822,1,0),
+(1823,1822,1822,2,0),
+(1824,1823,1822,3,0),
+(9904,1824,1822,4,0),
+(27003,9904,1822,5,0),
+(48573,27003,1822,6,0),
+(48574,48573,1822,7,0),
+/*Ravage*/
+(6785,0,6785,1,0),
+(6787,6785,6785,2,0),
+(9866,6787,6785,3,0),
+(9867,9866,6785,4,0),
+(27005,9867,6785,5,0),
+(48578,27005,6785,6,0),
+(48579,48578,6785,7,0),
+/*Rip*/
+(1079,0,1079,1,0),
+(9492,1079,1079,2,0),
+(9493,9492,1079,3,0),
+(9752,9493,1079,4,0),
+(9894,9752,1079,5,0),
+(9896,9894,1079,6,0),
+(27008,9896,1079,7,0),
+(49799,27008,1079,8,0),
+(49800,49799,1079,9,0),
+/*Shred*/
+(5221,0,5221,1,0),
+(6800,5221,5221,2,0),
+(8992,6800,5221,3,0),
+(9829,8992,5221,4,0),
+(9830,9829,5221,5,0),
+(27001,9830,5221,6,0),
+(27002,27001,5221,7,0),
+(48571,27002,5221,8,0),
+(48572,48571,5221,9,0),
+/*Swipe*/
+(779,0,779,1,0),
+(780,779,779,2,0),
+(769,780,779,3,0),
+(9754,769,779,4,0),
+(9908,9754,779,5,0),
+(26997,9908,779,6,0),
+(48561,26997,779,7,0),
+(48562,48561,779,8,0),
+/*Tiger's Fury*/
+(5217,0,5217,1,0),
+(6793,5217,5217,2,0),
+(9845,6793,5217,3,0),
+(9846,9845,5217,4,0),
+(50212,9846,5217,5,0),
+(50213,50212,5217,6,0),
+/*------------------
+--(163)Marksmanship
+------------------*/
+/*AimedShot*/
+(19434,0,19434,1,0),
+(20900,19434,19434,2,0),
+(20901,20900,19434,3,0),
+(20902,20901,19434,4,0),
+(20903,20902,19434,5,0),
+(20904,20903,19434,6,0),
+(27065,20904,19434,7,0),
+(49049,27065,19434,8,0),
+(49050,49049,19434,9,0),
+/*ArcaneShot*/
+(3044,0,3044,1,0),
+(14281,3044,3044,2,0),
+(14282,14281,3044,3,0),
+(14283,14282,3044,4,0),
+(14284,14283,3044,5,0),
+(14285,14284,3044,6,0),
+(14286,14285,3044,7,0),
+(14287,14286,3044,8,0),
+(27019,14287,3044,9,0),
+(49044,27019,3044,10,0),
+(49045,49044,3044,11,0),
+/*Hunter'sMark*/
+(1130,0,1130,1,0),
+(14323,1130,1130,2,0),
+(14324,14323,1130,3,0),
+(14325,14324,1130,4,0),
+(53338,14325,1130,5,0),
+/*KillShot*/
+(53351,0,53351,1,0),
+(61005,53351,53351,2,0),
+(61006,61005,53351,3,0),
+/*Multi-Shot*/
+(2643,0,2643,1,0),
+(14288,2643,2643,2,0),
+(14289,14288,2643,3,0),
+(14290,14289,2643,4,0),
+(25294,14290,2643,5,0),
+(27021,25294,2643,6,0),
+(49047,27021,2643,7,0),
+(49048,49047,2643,8,0),
+/*SerpentSting*/
+(1978,0,1978,1,0),
+(13549,1978,1978,2,0),
+(13550,13549,1978,3,0),
+(13551,13550,1978,4,0),
+(13552,13551,1978,5,0),
+(13553,13552,1978,6,0),
+(13554,13553,1978,7,0),
+(13555,13554,1978,8,0),
+(25295,13555,1978,9,0),
+(27016,25295,1978,10,0),
+(49000,27016,1978,11,0),
+(49001,49000,1978,12,0),
+/*SteadyShot*/
+(56641,0,56641,1,0),
+(34120,56641,56641,2,0),
+(49051,34120,56641,3,0),
+(49052,49051,56641,4,0),
+/*Volley*/
+(1510,0,1510,1,0),
+(14294,1510,1510,2,0),
+(14295,14294,1510,3,0),
+(27022,14295,1510,4,0),
+(58431,27022,1510,5,0),
+(58434,58431,1510,6,0),
+/*------------------
+-- (164) Blacksmithing
+------------------*/
+/*Blacksmithing*/
+(2018,0,2018,1,0),
+(3100,2018,2018,2,0),
+(3538,3100,2018,3,0),
+(9785,3538,2018,4,0),
+(9787,9785,2018,5,0),
+(9788,9785,2018,5,0),
+(29844,9785,2018,5,0),
+(17039,9787,2018,6,0),
+(17040,9787,2018,6,0),
+(17041,9787,2018,6,0),
+(51300,29844,2018,6,0),
+/*------------------
+-- (165) Leatherworking
+------------------*/
+/*Leatherworking*/
+(2108,0,2108,1,0),
+(3104,2108,2108,2,0),
+(3811,3104,2108,3,0),
+(10662,3811,2108,4,0),
+(10656,10662,2108,5,0),
+(10658,10662,2108,5,0),
+(10660,10662,2108,5,0),
+(32549,10662,2108,5,0),
+(51302,32549,2108,6,0),
+/*------------------
+-- (171) Alchemy
+------------------*/
+/* Alchemy */
+(2259,0,2259,1,0),
+(3101,2259,2259,2,0),
+(3464,3101,2259,3,0),
+(11611,3464,2259,4,0),
+(28596,11611,2259,5,0),
+(28672,11611,2259,5,0),
+(28675,11611,2259,5,0),
+(28677,11611,2259,5,0),
+(51304,28596,2259,6,0),
+/*------------------
+-- (182) Herbalizm
+------------------*/
+/*Herb Gathering*/
+(2366,0,2366,1,0),
+(2368,2366,2366,2,0),
+(3570,2368,2366,3,0),
+(11993,3570,2366,4,0),
+(28695,11993,2366,5,0),
+(50300,28695,2366,6,0),
+/*Lifeblood*/
+(55428,0,55428,1,0),
+(55480,55428,55428,2,0),
+(55500,55480,55428,3,0),
+(55501,55500,55428,4,0),
+(55502,55501,55428,5,0),
+(55503,55502,55428,6,0),
+/*------------------
+-- (184) Retribution (Paladin)
+------------------*/
+/*Blessingof Might*/
+(19740,0,19740,1,0),
+(19834,19740,19740,2,0),
+(19835,19834,19740,3,0),
+(19836,19835,19740,4,0),
+(19837,19836,19740,5,0),
+(19838,19837,19740,6,0),
+(25291,19838,19740,7,0),
+(27140,25291,19740,8,0),
+(48931,27140,19740,9,0),
+(48932,48931,19740,10,0),
+/*Greater Blessing of Might*/
+(25782,0,25782,1,19838),
+(25916,25782,25782,2,25291),
+(27141,25916,25782,3,27140),
+(48933,27141,25782,4,48931),
+(48934,48933,25782,5,48932),
+/*Hammer of Wrath*/
+(24275,0,24275,1,0),
+(24274,24275,24275,2,0),
+(24239,24274,24275,3,0),
+(27180,24239,24275,4,0),
+(48805,27180,24275,5,0),
+(48806,48805,24275,6,0),
+/*Retribution Aura*/
+(7294,0,7294,1,0),
+(10298,7294,7294,2,0),
+(10299,10298,7294,3,0),
+(10300,10299,7294,4,0),
+(10301,10300,7294,5,0),
+(27150,10301,7294,6,0),
+(54043,27150,7294,7,0),
+/*------------------
+-- (185) Cooking
+------------------*/
+/*Cooking*/
+(2550,0,2550,1,0),
+(3102,2550,2550,2,0),
+(3413,3102,2550,3,0),
+(18260,3413,2550,4,0),
+(33359,18260,2550,5,0),
+(51296,33359,2550,6,0),
+/*------------------
+-- (186) Mining
+------------------*/
+/*Mining*/
+(2575,0,2575,1,0),
+(2576,2575,2575,2,0),
+(3564,2576,2575,3,0),
+(10248,3564,2575,4,0),
+(29354,10248,2575,5,0),
+(50310,29354,2575,6,0),
+/*Toughness*/
+(53120,0,53120,1,0),
+(53121,53120,53120,2,0),
+(53122,53121,53120,3,0),
+(53123,53122,53120,4,0),
+(53124,53123,53120,5,0),
+(53040,53124,53120,6,0),
+/*------------------
+-- (188) Pet - Imp
+------------------*/
+/*Blood Pact*/
+(6307,0,6307,1,0),
+(7804,6307,6307,2,0),
+(7805,7804,6307,3,0),
+(11766,7805,6307,4,0),
+(11767,11766,6307,5,0),
+(27268,11767,6307,6,0),
+(47982,27268,6307,7,0),
+/*FireShield*/
+(2947,0,2947,1,0),
+(8316,2947,2947,2,0),
+(8317,8316,2947,3,0),
+(11770,8317,2947,4,0),
+(11771,11770,2947,5,0),
+(27269,11771,2947,6,0),
+(47983,27269,2947,7,0),
+/*Firebolt*/
+(3110,0,3110,1,0),
+(7799,3110,3110,2,0),
+(7800,7799,3110,3,0),
+(7801,7800,3110,4,0),
+(7802,7801,3110,5,0),
+(11762,7802,3110,6,0),
+(11763,11762,3110,7,0),
+(27267,11763,3110,8,0),
+(47964,27267,3110,9,0),
+/*------------------
+--(189)Pet-Felhunter
+------------------*/
+/*DevourMagic*/
+(19505,0,19505,1,0),
+(19731,19505,19505,2,0),
+(19734,19731,19505,3,0),
+(19736,19734,19505,4,0),
+(27276,19736,19505,5,0),
+(27277,27276,19505,6,0),
+(48011,27277,19505,7,0),
+/*ShadowBite*/
+(54049,0,54049,1,0),
+(54050,54049,54049,2,0),
+(54051,54050,54049,3,0),
+(54052,54051,54049,4,0),
+(54053,54052,54049,5,0),
+/*SpellLock*/
+(19244,0,19244,1,0),
+(19647,19244,19244,2,0),
+/*------------------
+-- (197) Tailoring
+------------------*/
+/*Tailoring*/
+(3908,0,3908,1,0),
+(3909,3908,3908,2,0),
+(3910,3909,3908,3,0),
+(12180,3910,3908,4,0),
+(26790,12180,3908,5,0),
+(26797,12180,3908,5,0),
+(26798,12180,3908,5,0),
+(26801,12180,3908,5,0),
+(51309,26790,3908,6,0),
+/*------------------
+--(203)Pet-Spider
+--(208)Pet-Wolf
+--(212)Pet-Crocolisk
+--(251)Pet-Turtle
+--(653)Pet-Bat
+--(766)Pet-WarpStalker
+--(767)Pet-Ravager
+------------------*/
+/*Bite*/
+(17253,0,17253,1,0),
+(17255,17253,17253,2,0),
+(17256,17255,17253,3,0),
+(17257,17256,17253,4,0),
+(17258,17257,17253,5,0),
+(17259,17258,17253,6,0),
+(17260,17259,17253,7,0),
+(17261,17260,17253,8,0),
+(27050,17261,17253,9,0),
+(52473,27050,17253,10,0),
+(52474,52473,17253,11,0),
+/*------------------
+-- (202) Engineering
+------------------*/
+/*Engineering*/
+(4036,0,4036,1,0),
+(4037,4036,4036,2,0),
+(4038,4037,4036,3,0),
+(12656,4038,4036,4,0),
+(20219,12656,4036,5,0),
+(20222,12656,4036,5,0),
+(30350,12656,4036,5,0),
+(51306,30350,4036,6,0),
+/*------------------
+-- (204) Pet - Voidwalker
+------------------*/
+/*Consume Shadows*/
+(17767,0,17767,1,0),
+(17850,17767,17767,2,0),
+(17851,17850,17767,3,0),
+(17852,17851,17767,4,0),
+(17853,17852,17767,5,0),
+(17854,17853,17767,6,0),
+(27272,17854,17767,7,0),
+(47987,27272,17767,8,0),
+(47988,47987,17767,9,0),
+/*Sacrifice*/
+(7812,0,7812,1,0),
+(19438,7812,7812,2,0),
+(19440,19438,7812,3,0),
+(19441,19440,7812,4,0),
+(19442,19441,7812,5,0),
+(19443,19442,7812,6,0),
+(27273,19443,7812,7,0),
+(47985,27273,7812,8,0),
+(47986,47985,7812,9,0),
+/*Suffering*/
+(17735,0,17735,1,0),
+(17750,17735,17735,2,0),
+(17751,17750,17735,3,0),
+(17752,17751,17735,4,0),
+(27271,17752,17735,5,0),
+(33701,27271,17735,6,0),
+(47989,33701,17735,7,0),
+(47990,47989,17735,8,0),
+/*Torment*/
+(3716,0,3716,1,0),
+(7809,3716,3716,2,0),
+(7810,7809,3716,3,0),
+(7811,7810,3716,4,0),
+(11774,7811,3716,5,0),
+(11775,11774,3716,6,0),
+(27270,11775,3716,7,0),
+(47984,27270,3716,8,0),
+/*------------------
+--(205)Pet-Succubus
+------------------*/
+/*LashofPain*/
+(7814,0,7814,1,0),
+(7815,7814,7814,2,0),
+(7816,7815,7814,3,0),
+(11778,7816,7814,4,0),
+(11779,11778,7814,5,0),
+(11780,11779,7814,6,0),
+(27274,11780,7814,7,0),
+(47991,27274,7814,8,0),
+(47992,47991,7814,9,0),
+/*SoothingKiss*/
+(6360,0,6360,1,0),
+(7813,6360,6360,2,0),
+(11784,7813,6360,3,0),
+(11785,11784,6360,4,0),
+(27275,11785,6360,5,0),
+/*------------------
+-- (209) Pet - Cat
+------------------*/
+/*Prowl*/
+(24450,0,24450,1,0),
+(24452,24450,24450,2,0),
+(24453,24452,24450,3,0),
+/*Rake*/
+(59881,0,59881,1,0),
+(59882,59881,59881,2,0),
+(59883,59882,59881,3,0),
+(59884,59883,59881,4,0),
+(59885,59884,59881,5,0),
+(59886,59885,59881,6,0),
+/*------------------
+--(210)Pet-Bear
+------------------*/
+/*Swipe*/
+(50256,0,50256,1,0),
+(53526,50256,50256,2,0),
+(53528,53526,50256,3,0),
+(53529,53528,50256,4,0),
+(53532,53529,50256,5,0),
+(53533,53532,50256,6,0),
+/*------------------
+--(211)Pet-Boar
+------------------*/
+/*Gore*/
+(35290,0,35290,1,0),
+(35291,35290,35290,2,0),
+(35292,35291,35290,3,0),
+(35293,35292,35290,4,0),
+(35294,35293,35290,5,0),
+(35295,35294,35290,6,0),
+/*------------------
+--(213)Pet-CarrionBird
+------------------*/
+/*DemoralizingScreech*/
+(24423,0,24423,1,0),
+(24577,24423,24423,2,0),
+(24578,24577,24423,3,0),
+(24579,24578,24423,4,0),
+(27051,24579,24423,5,0),
+(55487,27051,24423,6,0),
+/*------------------
+--(215)Pet-Gorilla
+--(786)Pet-ExoticRhino
+--(775)Pet-Moth
+------------------*/
+/*Smack*/
+(49966,0,49966,1,0),
+(49967,49966,49966,2,0),
+(49968,49967,49966,3,0),
+(49969,49968,49966,4,0),
+(49970,49969,49966,5,0),
+(49971,49970,49966,6,0),
+(49972,49971,49966,7,0),
+(49973,49972,49966,8,0),
+(49974,49973,49966,9,0),
+(52475,49974,49966,10,0),
+(52476,52475,49966,11,0),
+/*Thunderstomp*/
+(26090,0,26090,1,0),
+(26187,26090,26090,2,0),
+(26188,26187,26090,3,0),
+(27063,26188,26090,4,0),
+(55572,27063,26090,5,0),
+(55573,55572,26090,6,0),
+/*------------------
+--(217)Pet-Raptor
+------------------*/
+/*SavageRend*/
+(50498,0,50498,1,0),
+(53578,50498,50498,2,0),
+(53579,53578,50498,3,0),
+(53580,53579,50498,4,0),
+(53581,53580,50498,5,0),
+(53582,53581,50498,6,0),
+/*------------------
+--(214)Pet-Crab
+--(218)Pet-Tallstrider
+--(783)Pet-ExoticSilithid
+------------------*/
+/*Claw*/
+(16827,0,16827,1,0),
+(16828,16827,16827,2,0),
+(16829,16828,16827,3,0),
+(16830,16829,16827,4,0),
+(16831,16830,16827,5,0),
+(16832,16831,16827,6,0),
+(3010,16832,16827,7,0),
+(3009,3010,16827,8,0),
+(27049,3009,16827,9,0),
+(52471,27049,16827,10,0),
+(52472,52471,16827,11,0),
+/*------------------
+--(236)Pet-Scorpid
+------------------*/
+/*ScorpidPoison*/
+(24640,0,24640,1,0),
+(24583,24640,24640,2,0),
+(24586,24583,24640,3,0),
+(24587,24586,24640,4,0),
+(27060,24587,24640,5,0),
+(55728,27060,24640,6,0),
+/*------------------
+--(237)Arcane
+------------------*/
+/*AmplifyMagic*/
+(1008,0,1008,1,0),
+(8455,1008,1008,2,0),
+(10169,8455,1008,3,0),
+(10170,10169,1008,4,0),
+(27130,10170,1008,5,0),
+(33946,27130,1008,6,0),
+(43017,33946,1008,7,0),
+/*ArcaneBarrage*/
+(44425,0,44425,1,0),
+(44780,44425,44425,2,0),
+(44781,44780,44425,3,0),
+/*ArcaneBlast*/
+(30451,0,30451,1,0),
+(42894,30451,30451,2,0),
+(42896,42894,30451,3,0),
+(42897,42896,30451,4,0),
+/*ArcaneBrilliance*/
+(23028,0,23028,1,0),
+(27127,23028,23028,2,0),
+(43002,27127,23028,3,0),
+/*ArcaneExplosion*/
+(1449,0,1449,1,0),
+(8437,1449,1449,2,0),
+(8438,8437,1449,3,0),
+(8439,8438,1449,4,0),
+(10201,8439,1449,5,0),
+(10202,10201,1449,6,0),
+(27080,10202,1449,7,0),
+(27082,27080,1449,8,0),
+(42920,27082,1449,9,0),
+(42921,42920,1449,10,0),
+/*ArcaneIntellect*/
+(1459,0,1459,1,0),
+(1460,1459,1459,2,0),
+(1461,1460,1459,3,0),
+(10156,1461,1459,4,0),
+(10157,10156,1459,5,0),
+(27126,10157,1459,6,0),
+(42995,27126,1459,7,0),
+/*ArcaneMissiles*/
+(5143,0,5143,1,0),
+(5144,5143,5143,2,0),
+(5145,5144,5143,3,0),
+(8416,5145,5143,4,0),
+(8417,8416,5143,5,0),
+(10211,8417,5143,6,0),
+(10212,10211,5143,7,0),
+(25345,10212,5143,8,0),
+(27075,25345,5143,9,0),
+(38699,27075,5143,10,0),
+(38704,38699,5143,11,0),
+(42843,38704,5143,12,0),
+(42846,42843,5143,13,0),
+/*ConjureFood*/
+(587,0,587,1,0),
+(597,587,587,2,0),
+(990,597,587,3,0),
+(6129,990,587,4,0),
+(10144,6129,587,5,0),
+(10145,10144,587,6,0),
+(28612,10145,587,7,0),
+(33717,28612,587,8,0),
+/*ConjureManaGem*/
+(759,0,759,1,0),
+(3552,759,759,2,0),
+(10053,3552,759,3,0),
+(10054,10053,759,4,0),
+(27101,10054,759,5,0),
+(42985,27101,759,6,0),
+/*ConjureRefreshment*/
+(42955,0,42955,1,0),
+(42956,42955,42955,2,0),
+/*ConjureWater*/
+(5504,0,5504,1,0),
+(5505,5504,5504,2,0),
+(5506,5505,5504,3,0),
+(6127,5506,5504,4,0),
+(10138,6127,5504,5,0),
+(10139,10138,5504,6,0),
+(10140,10139,5504,7,0),
+(37420,10140,5504,8,0),
+(27090,37420,5504,9,0),
+/*DampenMagic*/
+(604,0,604,1,0),
+(8450,604,604,2,0),
+(8451,8450,604,3,0),
+(10173,8451,604,4,0),
+(10174,10173,604,5,0),
+(33944,10174,604,6,0),
+(43015,33944,604,7,0),
+/*MageArmor*/
+(6117,0,6117,1,0),
+(22782,6117,6117,2,0),
+(22783,22782,6117,3,0),
+(27125,22783,6117,4,0),
+(43023,27125,6117,5,0),
+(43024,43023,6117,6,0),
+/*ManaShield*/
+(1463,0,1463,1,0),
+(8494,1463,1463,2,0),
+(8495,8494,1463,3,0),
+(10191,8495,1463,4,0),
+(10192,10191,1463,5,0),
+(10193,10192,1463,6,0),
+(27131,10193,1463,7,0),
+(43019,27131,1463,8,0),
+(43020,43019,1463,9,0),
+/*Polymorph*/
+(118,0,118,1,0),
+(12824,118,118,2,0),
+(12825,12824,118,3,0),
+(12826,12825,118,4,0),
+/*RitualofRefreshment*/
+(43987,0,43987,1,0),
+(58659,43987,43987,2,0),
+/*------------------
+--(253)Assassination
+------------------*/
+/*Ambush*/
+(8676,0,8676,1,0),
+(8724,8676,8676,2,0),
+(8725,8724,8676,3,0),
+(11267,8725,8676,4,0),
+(11268,11267,8676,5,0),
+(11269,11268,8676,6,0),
+(27441,11269,8676,7,0),
+(48689,27441,8676,8,0),
+(48690,48689,8676,9,0),
+(48691,48690,8676,10,0),
+/*DeadlyThrow*/
+(26679,0,26679,1,0),
+(48673,26679,26679,2,0),
+(48674,48673,26679,3,0),
+/*Envenom*/
+(32645,0,32645,1,0),
+(32684,32645,32645,2,0),
+(57992,32684,32645,3,0),
+(57993,57992,32645,4,0),
+/*Eviscerate*/
+(2098,0,2098,1,0),
+(6760,2098,2098,2,0),
+(6761,6760,2098,3,0),
+(6762,6761,2098,4,0),
+(8623,6762,2098,5,0),
+(8624,8623,2098,6,0),
+(11299,8624,2098,7,0),
+(11300,11299,2098,8,0),
+(31016,11300,2098,9,0),
+(26865,31016,2098,10,0),
+(48667,26865,2098,11,0),
+(48668,48667,2098,12,0),
+/*ExposeArmor*/
+(8647,0,8647,1,0),
+(8649,8647,8647,2,0),
+(8650,8649,8647,3,0),
+(11197,8650,8647,4,0),
+(11198,11197,8647,5,0),
+(26866,11198,8647,6,0),
+(48669,26866,8647,7,0),
+/*Garrote*/
+(703,0,703,1,0),
+(8631,703,703,2,0),
+(8632,8631,703,3,0),
+(8633,8632,703,4,0),
+(11289,8633,703,5,0),
+(11290,11289,703,6,0),
+(26839,11290,703,7,0),
+(26884,26839,703,8,0),
+(48675,26884,703,9,0),
+(48676,48675,703,10,0),
+/*KidneyShot*/
+(408,0,408,1,0),
+(8643,408,408,2,0),
+/*Mutilate*/
+(1329,0,1329,1,0),
+(34411,1329,1329,2,0),
+(34412,34411,1329,3,0),
+(34413,34412,1329,4,0),
+(48663,34413,1329,5,0),
+(48666,48663,1329,6,0),
+/*Rupture*/
+(1943,0,1943,1,0),
+(8639,1943,1943,2,0),
+(8640,8639,1943,3,0),
+(11273,8640,1943,4,0),
+(11274,11273,1943,5,0),
+(11275,11274,1943,6,0),
+(26867,11275,1943,7,0),
+(48671,26867,1943,8,0),
+(48672,48671,1943,9,0),
+/*SliceandDice*/
+(5171,0,5171,1,0),
+(6774,5171,5171,2,0),
+/*------------------
+--(256)Fury
+------------------*/
+/*BattleShout*/
+(6673,0,6673,1,0),
+(5242,6673,6673,2,0),
+(6192,5242,6673,3,0),
+(11549,6192,6673,4,0),
+(11550,11549,6673,5,0),
+(11551,11550,6673,6,0),
+(25289,11551,6673,7,0),
+(2048,25289,6673,8,0),
+(47436,2048,6673,9,0),
+/*Cleave*/
+(845,0,845,1,0),
+(7369,845,845,2,0),
+(11608,7369,845,3,0),
+(11609,11608,845,4,0),
+(20569,11609,845,5,0),
+(25231,20569,845,6,0),
+(47519,25231,845,7,0),
+(47520,47519,845,8,0),
+/*CommandingShout*/
+(469,0,469,1,0),
+(47439,469,469,2,0),
+(47440,47439,469,3,0),
+/*DemoralizingShout*/
+(1160,0,1160,1,0),
+(6190,1160,1160,2,0),
+(11554,6190,1160,3,0),
+(11555,11554,1160,4,0),
+(11556,11555,1160,5,0),
+(25202,11556,1160,6,0),
+(25203,25202,1160,7,0),
+(47437,25203,1160,8,0),
+/*Execute*/
+(5308,0,5308,1,0),
+(20658,5308,5308,2,0),
+(20660,20658,5308,3,0),
+(20661,20660,5308,4,0),
+(20662,20661,5308,5,0),
+(25234,20662,5308,6,0),
+(25236,25234,5308,7,0),
+(47470,25236,5308,8,0),
+(47471,47470,5308,9,0),
+/*Slam*/
+(1464,0,1464,1,0),
+(8820,1464,1464,2,0),
+(11604,8820,1464,3,0),
+(11605,11604,1464,4,0),
+(25241,11605,1464,5,0),
+(25242,25241,1464,6,0),
+(47474,25242,1464,7,0),
+(47475,47474,1464,8,0),
+/*------------------
+--(257) Protection (Warrior)
+------------------*/
+/*Devastate*/
+(20243,0,20243,1,0),
+(30016,20243,20243,2,0),
+(30022,30016,20243,3,0),
+(47497,30022,20243,4,0),
+(47498,47497,20243,5,0),
+/*Revenge*/
+(6572,0,6572,1,0),
+(6574,6572,6572,2,0),
+(7379,6574,6572,3,0),
+(11600,7379,6572,4,0),
+(11601,11600,6572,5,0),
+(25288,11601,6572,6,0),
+(25269,25288,6572,7,0),
+(30357,25269,6572,8,0),
+(57823,30357,6572,9,0),
+/*ShieldSlam*/
+(23922,0,23922,1,0),
+(23923,23922,23922,2,0),
+(23924,23923,23922,3,0),
+(23925,23924,23922,4,0),
+(25258,23925,23922,5,0),
+(30356,25258,23922,6,0),
+(47487,30356,23922,7,0),
+(47488,47487,23922,8,0),
+/*SunderArmor*/
+(7386,0,7386,1,0),
+(7405,7386,7386,2,0),
+(8380,7405,7386,3,0),
+(11596,8380,7386,4,0),
+(11597,11596,7386,5,0),
+(25225,11597,7386,6,0),
+(47467,25225,7386,7,0),
+/*------------------
+-- (267) Protection (Paladin)
+------------------*/
+/*Avenger'sShield*/
+(31935,0,31935,1,0),
+(32699,31935,31935,2,0),
+(32700,32699,31935,3,0),
+(48826,32700,31935,4,0),
+(48827,48826,31935,5,0),
+/*Devotion Aura*/
+(465,0,465,1,0),
+(10290,465,465,2,0),
+(643,10290,465,3,0),
+(10291,643,465,4,0),
+(1032,10291,465,5,0),
+(10292,1032,465,6,0),
+(10293,10292,465,7,0),
+(27149,10293,465,8,0),
+(48941,27149,465,9,0),
+(48942,48941,465,10,0),
+/*Fire Resistance Aura*/
+(19891,0,19891,1,0),
+(19899,19891,19891,2,0),
+(19900,19899,19891,3,0),
+(27153,19900,19891,4,0),
+(48947,27153,19891,5,0),
+/*Frost Resistance Aura*/
+(19888,0,19888,1,0),
+(19897,19888,19888,2,0),
+(19898,19897,19888,3,0),
+(27152,19898,19888,4,0),
+(48945,27152,19888,5,0),
+/*Greater Blessing of Kings*/
+(20217,0,20217,1,0),
+(25898,20217,20217,2,0),
+/*Greater Blessing of Sanctuary*/
+(20911,0,20911,1,0),
+(25899,20911,20911,2,0),
+/*HammerofJustice*/
+(853,0,853,1,0),
+(5588,853,853,2,0),
+(5589,5588,853,3,0),
+(10308,5589,853,4,0),
+/*HandofProtection*/
+(1022,0,1022,1,0),
+(5599,1022,1022,2,0),
+(10278,5599,1022,3,0),
+/*Holy Shield*/
+(20925,0,20925,1,0),
+(20927,20925,20925,2,0),
+(20928,20927,20925,3,0),
+(27179,20928,20925,4,0),
+(48951,27179,20925,5,0),
+(48952,48951,20925,6,0),
+/*Shadow Resistance Aura*/
+(19876,0,19876,1,0),
+(19895,19876,19876,2,0),
+(19896,19895,19876,3,0),
+(27151,19896,19876,4,0),
+(48943,27151,19876,5,0),
+/*Shield of Righteousness*/
+(53600,0,53600,1,0),
+(61411,53600,53600,2,0),
+/*Spiritual Attunement*/
+(31785,0,31785,1,0),
+(33776,31785,31785,2,0),
+/*------------------
+--(270)Pet-GenericHunter
+------------------*/
+/*Cower*/
+(1742,0,1742,1,0),
+(1753,1742,1742,2,0),
+(1754,1753,1742,3,0),
+(1755,1754,1742,4,0),
+(1756,1755,1742,5,0),
+(16697,1756,1742,6,0),
+(27048,16697,1742,7,0),
+/*GreatResistance*/
+(53427,0,53427,1,0),
+(53429,53427,53427,2,0),
+(53430,53429,53427,3,0),
+/*Growl*/
+(2649,0,2649,1,0),
+(14916,2649,2649,2,0),
+(14917,14916,2649,3,0),
+(14918,14917,2649,4,0),
+(14919,14918,2649,5,0),
+(14920,14919,2649,6,0),
+(14921,14920,2649,7,0),
+(27047,14921,2649,8,0),
+(61676,27047,2649,9,0),
+/*------------------
+-- (333) Enchanting
+------------------*/
+/*Enchanting*/
+(7411,0,7411,1,0),
+(7412,7411,7411,2,0),
+(7413,7412,7411,3,0),
+(13920,7413,7411,4,0),
+(28029,13920,7411,5,0),
+(51313,28029,7411,6,0),
+/*------------------
+--(354)Demonology
+------------------*/
+/*Banish*/
+(710,0,710,1,0),
+(18647,710,710,2,0),
+/*CreateFirestone*/
+(6366,0,6366,1,0),
+(17951,6366,6366,2,0),
+(17952,17951,6366,3,0),
+(17953,17952,6366,4,0),
+(27250,17953,6366,5,0),
+(60219,27250,6366,6,0),
+(60220,60219,6366,7,0),
+/*CreateHealthstone*/
+(6201,0,6201,1,0),
+(6202,6201,6201,2,0),
+(5699,6202,6201,3,0),
+(11729,5699,6201,4,0),
+(11730,11729,6201,5,0),
+(27230,11730,6201,6,0),
+(47871,27230,6201,7,0),
+(47878,47871,6201,8,0),
+/*CreateSoulstone*/
+(693,0,693,1,0),
+(20752,693,693,2,0),
+(20755,20752,693,3,0),
+(20756,20755,693,4,0),
+(20757,20756,693,5,0),
+(27238,20757,693,6,0),
+(47884,27238,693,7,0),
+/*CreateSpellstone*/
+(2362,0,2362,1,0),
+(17727,2362,2362,2,0),
+(17728,17727,2362,3,0),
+(28172,17728,2362,4,0),
+(47886,28172,2362,5,0),
+(47888,47886,2362,6,0),
+/*DemonArmor*/
+(706,0,706,1,0),
+(1086,706,706,2,0),
+(11733,1086,706,3,0),
+(11734,11733,706,4,0),
+(11735,11734,706,5,0),
+(27260,11735,706,6,0),
+(47793,27260,706,7,0),
+(47889,47793,706,8,0),
+/*DemonSkin*/
+(687,0,687,1,0),
+(696,687,687,2,0),
+/*EnslaveDemon*/
+(1098,0,1098,1,0),
+(11725,1098,1098,2,0),
+(11726,11725,1098,3,0),
+(61191,11726,1098,4,0),
+/*FelArmor*/
+(28176,0,28176,1,0),
+(28189,28176,28176,2,0),
+(47892,28189,28176,3,0),
+(47893,47892,28176,4,0),
+/*HealthFunnel*/
+(755,0,755,1,0),
+(3698,755,755,2,0),
+(3699,3698,755,3,0),
+(3700,3699,755,4,0),
+(11693,3700,755,5,0),
+(11694,11693,755,6,0),
+(11695,11694,755,7,0),
+(27259,11695,755,8,0),
+(47856,27259,755,9,0),
+/*RitualofSouls*/
+(29893,0,29893,1,0),
+(58887,29893,29893,2,0),
+/*ShadowWard*/
+(6229,0,6229,1,0),
+(11739,6229,6229,2,0),
+(11740,11739,6229,3,0),
+(28610,11740,6229,4,0),
+(47890,28610,6229,5,0),
+(47891,47890,6229,6,0),
+/*------------------
+--(355)Affliction
+------------------*/
+/*Corruption*/
+(172,0,172,1,0),
+(6222,172,172,2,0),
+(6223,6222,172,3,0),
+(7648,6223,172,4,0),
+(11671,7648,172,5,0),
+(11672,11671,172,6,0),
+(25311,11672,172,7,0),
+(27216,25311,172,8,0),
+(47812,27216,172,9,0),
+(47813,47812,172,10,0),
+/*Curse of Agony*/
+(980,0,980,1,0),
+(1014,980,980,2,0),
+(6217,1014,980,3,0),
+(11711,6217,980,4,0),
+(11712,11711,980,5,0),
+(11713,11712,980,6,0),
+(27218,11713,980,7,0),
+(47863,27218,980,8,0),
+(47864,47863,980,9,0),
+/*Curse of Doom*/
+(603,0,603,1,0),
+(30910,603,603,2,0),
+(47867,30910,603,3,0),
+/*Curse of Recklessness*/
+(704,0,704,1,0),
+(7658,704,704,2,0),
+(7659,7658,704,3,0),
+(11717,7659,704,4,0),
+(27226,11717,704,5,0),
+(57595,27226,704,6,0),
+/*Curse of the Elements*/
+(1490,0,1490,1,0),
+(11721,1490,1490,2,0),
+(11722,11721,1490,3,0),
+(27228,11722,1490,4,0),
+(47865,27228,1490,5,0),
+/*Curse of Tongues*/
+(1714,0,1714,1,0),
+(11719,1714,1714,2,0),
+/*Curse of Weakness*/
+(702,0,702,1,0),
+(1108,702,702,2,0),
+(6205,1108,702,3,0),
+(7646,6205,702,4,0),
+(11707,7646,702,5,0),
+(11708,11707,702,6,0),
+(27224,11708,702,7,0),
+(30909,27224,702,8,0),
+(50511,30909,702,9,0),
+/*Dark Pact*/
+(18220,0, 18220,1,0),
+(18937,18220,18220,2,0),
+(18938,18937,18220,3,0),
+(27265,18938,18220,4,0),
+(59092,27265,18220,5,0),
+/*Death Coil*/
+(6789,0,6789,1,0),
+(17925,6789,6789,2,0),
+(17926,17925,6789,3,0),
+(27223,17926,6789,4,0),
+(47859,27223,6789,5,0),
+(47860,47859,6789,6,0),
+/*Drain Life*/
+(689,0,689,1,0),
+(699,689,689,2,0),
+(709,699,689,3,0),
+(7651,709,689,4,0),
+(11699,7651,689,5,0),
+(11700,11699,689,6,0),
+(27219,11700,689,7,0),
+(27220,27219,689,8,0),
+(47857,27220,689,9,0),
+/*DrainSoul*/
+(1120,0,1120,1,0),
+(8288,1120,1120,2,0),
+(8289,8288,1120,3,0),
+(11675,8289,1120,4,0),
+(27217,11675,1120,5,0),
+(47855,27217,1120,6,0),
+/*Fear*/
+(5782,0,5782,1,0),
+(6213,5782,5782,2,0),
+(6215,6213,5782,3,0),
+/*Haunt*/
+(48181,0,48181,1,0),
+(59161,48181,48181,2,0),
+(59163,59161,48181,3,0),
+(59164,59163,48181,4,0),
+/*HowlofTerror*/
+(5484,0,5484,1,0),
+(17928,5484,5484,2,0),
+/*SeedofCorruption*/
+(27243,0,27243,1,0),
+(47835,27243,27243,2,0),
+(47836,47835,27243,3,0),
+/*SiphonLife*/
+(18265,0,18265,1,0),
+(18879,18265,18265,2,0),
+(18880,18879,18265,3,0),
+(18881,18880,18265,4,0),
+(27264,18881,18265,5,0),
+(30911,27264,18265,6,0),
+(47861,30911,18265,7,0),
+(47862,47861,18265,8,0),
+/*UnstableAffliction*/
+(30108,0,30108,1,0),
+(30404,30108,30108,2,0),
+(30405,30404,30108,3,0),
+(47841,30405,30108,4,0),
+(47843,47841,30108,5,0),
+/*------------------
+-- (356) Fishing
+------------------*/
+/*Fishing*/
+(7620,0,7620,1,0),
+(7731,7620,7620,2,0),
+(7732,7731,7620,3,0),
+(18248,7732,7620,4,0),
+(33095,18248,7620,5,0),
+(51294,33095,7620,6,0),
+/*------------------
+--(373) Enhancement
+------------------*/
+/*Fire Resistance Totem*/
+(8184,0,8184,1,0),
+(10537,8184,8184,2,0),
+(10538,10537,8184,3,0),
+(25563,10538,8184,4,0),
+(58737,25563,8184,5,0),
+(58739,58737,8184,6,0),
+/*Flametongue Totem*/
+(8227,0,8227,1,0),
+(8249,8227,8227,2,0),
+(10526,8249,8227,3,0),
+(16387,10526,8227,4,0),
+(25557,16387,8227,5,0),
+(58649,25557,8227,6,0),
+(58652,58649,8227,7,0),
+(58656,58652,8227,8,0),
+/*Flametongue Weapon*/
+(8024,0,8024,1,0),
+(8027,8024,8024,2,0),
+(8030,8027,8024,3,0),
+(16339,8030,8024,4,0),
+(16341,16339,8024,5,0),
+(16342,16341,8024,6,0),
+(25489,16342,8024,7,0),
+(58785,25489,8024,8,0),
+(58789,58785,8024,9,0),
+(58790,58789,8024,10,0),
+/*Frost Resistance Totem*/
+(8181,0,8181,1,0),
+(10478,8181,8181,2,0),
+(10479,10478,8181,3,0),
+(25560,10479,8181,4,0),
+(58741,25560,8181,5,0),
+(58745,58741,8181,6,0),
+/*Frostbrand Weapon*/
+(8033,0,8033,1,0),
+(8038,8033,8033,2,0),
+(10456,8038,8033,3,0),
+(16355,10456,8033,4,0),
+(16356,16355,8033,5,0),
+(25500,16356,8033,6,0),
+(58794,25500,8033,7,0),
+(58795,58794,8033,8,0),
+(58796,58795,8033,9,0),
+/*Life Tap*/
+(1454,0,1454,1,0),
+(1455,1454,1454,2,0),
+(1456,1455,1454,3,0),
+(11687,1456,1454,4,0),
+(11688,11687,1454,5,0),
+(11689,11688,1454,6,0),
+(27222,11689,1454,7,0),
+(57946,27222,1454,8,0),
+/*Lightning Shield*/
+(324,0,324,1,0),
+(325,324,324,2,0),
+(905,325,324,3,0),
+(945,905,324,4,0),
+(8134,945,324,5,0),
+(10431,8134,324,6,0),
+(10432,10431,324,7,0),
+(25469,10432,324,8,0),
+(25472,25469,324,9,0),
+(49280,25472,324,10,0),
+(49281,49280,324,11,0),
+/*Nature Resistance Totem*/
+(10595,0,10595,1,0),
+(10600,10595,10595,2,0),
+(10601,10600,10595,3,0),
+(25574,10601,10595,4,0),
+(58746,25574,10595,5,0),
+(58749,58746,10595,6,0),
+/*Rockbiter Weapon*/
+(8017,0,8017,1,0),
+(8018,8017,8017,2,0),
+(8019,8018,8017,3,0),
+(10399,8019,8017,4,0),
+/*Stoneskin Totem*/
+(8071,0,8071,1,0),
+(8154,8071,8071,2,0),
+(8155,8154,8071,3,0),
+(10406,8155,8071,4,0),
+(10407,10406,8071,5,0),
+(10408,10407,8071,6,0),
+(25508,10408,8071,7,0),
+(25509,25508,8071,8,0),
+(58751,25509,8071,9,0),
+(58753,58751,8071,10,0),
+/*Strength of Earth Totem*/
+(8075,0,8075,1,0),
+(8160,8075,8075,2,0),
+(8161,8160,8075,3,0),
+(10442,8161,8075,4,0),
+(25361,10442,8075,5,0),
+(25528,25361,8075,6,0),
+(57622,25528,8075,7,0),
+(58643,57622,8075,8,0),
+/*WindfuryWeapon*/
+(8232,0,8232,1,0),
+(8235,8232,8232,2,0),
+(10486,8235,8232,3,0),
+(16362,10486,8232,4,0),
+(25505,16362,8232,5,0),
+(58801,25505,8232,6,0),
+(58803,58801,8232,7,0),
+(58804,58803,8232,8,0),
+/*------------------
+-- (374) Restoration (Shaman)
+------------------*/
+/*AncestralSpirit*/
+(2008,0,2008,1,0),
+(20609,2008,2008,2,0),
+(20610,20609,2008,3,0),
+(20776,20610,2008,4,0),
+(20777,20776,2008,5,0),
+(25590,20777,2008,6,0),
+(49277,25590,2008,7,0),
+/*ChainHeal*/
+(1064,0,1064,1,0),
+(10622,1064,1064,2,0),
+(10623,10622,1064,3,0),
+(25422,10623,1064,4,0),
+(25423,25422,1064,5,0),
+(55458,25423,1064,6,0),
+(55459,55458,1064,7,0),
+/*EarthShield*/
+(974,0,974,1,0),
+(32593,974,974,2,0),
+(32594,32593,974,3,0),
+(49283,32594,974,4,0),
+(49284,49283,974,5,0),
+/*EarthlivingWeapon*/
+(51730,0,51730,1,0),
+(51988,51730,51730,2,0),
+(51991,51988,51730,3,0),
+(51992,51991,51730,4,0),
+(51993,51992,51730,5,0),
+(51994,51993,51730,6,0),
+/*HealingStreamTotem*/
+(5394,0,5394,1,0),
+(6375,5394,5394,2,0),
+(6377,6375,5394,3,0),
+(10462,6377,5394,4,0),
+(10463,10462,5394,5,0),
+(25567,10463,5394,6,0),
+(58755,25567,5394,7,0),
+(58756,58755,5394,8,0),
+(58757,58756,5394,9,0),
+/*HealingWave*/
+(331,0,331,1,0),
+(332,331,331,2,0),
+(547,332,331,3,0),
+(913,547,331,4,0),
+(939,913,331,5,0),
+(959,939,331,6,0),
+(8005,959,331,7,0),
+(10395,8005,331,8,0),
+(10396,10395,331,9,0),
+(25357,10396,331,10,0),
+(25391,25357,331,11,0),
+(25396,25391,331,12,0),
+(49272,25396,331,13,0),
+(49273,49272,331,14,0),
+/*LesserHealingWave*/
+(8004,0,8004,1,0),
+(8008,8004,8004,2,0),
+(8010,8008,8004,3,0),
+(10466,8010,8004,4,0),
+(10467,10466,8004,5,0),
+(10468,10467,8004,6,0),
+(25420,10468,8004,7,0),
+(49275,25420,8004,8,0),
+(49276,49275,8004,9,0),
+/*Mana Spring Totem*/
+(5675,0,5675,1,0),
+(10495,5675,5675,2,0),
+(10496,10495,5675,3,0),
+(10497,10496,5675,4,0),
+(25570,10497,5675,5,0),
+(58771,25570,5675,6,0),
+(58773,58771,5675,7,0),
+(58774,58773,5675,8,0),
+/*Riptide*/
+(61295,0,61295,1,0),
+(61299,61295,61295,2,0),
+(61300,61299,61295,3,0),
+(61301,61300,61295,4,0),
+/*Water Shield*/
+(52127,0,52127,1,0),
+(52129,52127,52127,2,0),
+(52131,52129,52127,3,0),
+(52134,52131,52127,4,0),
+(52136,52134,52127,5,0),
+(52138,52136,52127,6,0),
+(24398,52138,52127,7,0),
+(33736,24398,52127,8,0),
+(57960,33736,52127,9,0),
+/*------------------
+-- (375) Elemental Combat
+------------------*/
+/*Chain Lightning*/
+(421,0,421,1,0),
+(930,421,421,2,0),
+(2860,930,421,3,0),
+(10605,2860,421,4,0),
+(25439,10605,421,5,0),
+(25442,25439,421,6,0),
+(49270,25442,421,7,0),
+(49271,49270,421,8,0),
+/*Earth Shock*/
+(8042,0,8042,1,0),
+(8044,8042,8042,2,0),
+(8045,8044,8042,3,0),
+(8046,8045,8042,4,0),
+(10412,8046,8042,5,0),
+(10413,10412,8042,6,0),
+(10414,10413,8042,7,0),
+(25454,10414,8042,8,0),
+(49230,25454,8042,9,0),
+(49231,49230,8042,10,0),
+/*Fire Nova Totem*/
+(1535,0,1535,1,0),
+(8498,1535,1535,2,0),
+(8499,8498,1535,3,0),
+(11314,8499,1535,4,0),
+(11315,11314,1535,5,0),
+(25546,11315,1535,6,0),
+(25547,25546,1535,7,0),
+(61649,25547,1535,8,0),
+(61657,61649,1535,9,0),
+/*Flame Shock*/
+(8050,0,8050,1,0),
+(8052,8050,8050,2,0),
+(8053,8052,8050,3,0),
+(10447,8053,8050,4,0),
+(10448,10447,8050,5,0),
+(29228,10448,8050,6,0),
+(25457,29228,8050,7,0),
+(49232,25457,8050,8,0),
+(49233,49232,8050,9,0),
+/*Frost Shock*/
+(8056,0,8056,1,0),
+(8058,8056,8056,2,0),
+(10472,8058,8056,3,0),
+(10473,10472,8056,4,0),
+(25464,10473,8056,5,0),
+(49235,25464,8056,6,0),
+(49236,49235,8056,7,0),
+/*Lava Burst*/
+(51505,0,51505,1,0),
+(60043,51505,51505,2,0),
+/*Lightning Bolt*/
+(403,0,403,1,0),
+(529,403,403,2,0),
+(548,529,403,3,0),
+(915,548,403,4,0),
+(943,915,403,5,0),
+(6041,943,403,6,0),
+(10391,6041,403,7,0),
+(10392,10391,403,8,0),
+(15207,10392,403,9,0),
+(15208,15207,403,10,0),
+(25448,15208,403,11,0),
+(25449,25448,403,12,0),
+(49237,25449,403,13,0),
+(49238,49237,403,14,0),
+/*Magma Totem*/
+(8190,0,8190,1,0),
+(10585,8190,8190,2,0),
+(10586,10585,8190,3,0),
+(10587,10586,8190,4,0),
+(25552,10587,8190,5,0),
+(58731,25552,8190,6,0),
+(58734,58731,8190,7,0),
+/*Purge*/
+(370,0,370,1,0),
+(8012,370,370,2,0),
+/*Searing Totem*/
+(3599,0,3599,1,0),
+(6363,3599,3599,2,0),
+(6364,6363,3599,3,0),
+(6365,6364,3599,4,0),
+(10437,6365,3599,5,0),
+(10438,10437,3599,6,0),
+(25533,10438,3599,7,0),
+(58699,25533,3599,8,0),
+(58703,58699,3599,9,0),
+(58704,58703,3599,10,0),
+/*Stoneclaw Totem*/
+(5730,0,5730,1,0),
+(6390,5730,5730,2,0),
+(6391,6390,5730,3,0),
+(6392,6391,5730,4,0),
+(10427,6392,5730,5,0),
+(10428,10427,5730,6,0),
+(25525,10428,5730,7,0),
+(58580,25525,5730,8,0),
+(58581,58580,5730,9,0),
+(58582,58581,5730,10,0),
+/*Totemof Wrath*/
+(30706,0,30706,1,0),
+(57720,30706,30706,2,0),
+(57721,57720,30706,3,0),
+(57722,57721,30706,4,0),
+/*Thunderstorm*/
+(51490,0,51490,1,0),
+(59156,51490,51490,2,0),
+(59158,59156,51490,3,0),
+(59159,59158,51490,4,0),
+/*------------------
+-- (393) Skinning
+------------------*/
+/*Skinning*/
+(8613,0,8613,1,0),
+(8617,8613,8613,2,0),
+(8618,8617,8613,3,0),
+(10768,8618,8613,4,0),
+(32678,10768,8613,5,0),
+(50305,32678,8613,6,0),
+/*Master of Anatomy*/
+(53125,0,53125,1,0),
+(53662,53125,53125,2,0),
+(53663,53662,53125,3,0),
+(53664,53663,53125,4,0),
+(53665,53664,53125,5,0),
+(53666,53665,53125,6,0),
+/*------------------
+--(573)Restoration
+------------------*/
+/*GiftoftheWild*/
+(21849,0,21849,1,0),
+(21850,21849,21849,2,0),
+(26991,21850,21849,3,0),
+(48470,26991,21849,4,0),
+/*HealingTouch*/
+(5185,0,5185,1,0),
+(5186,5185,5185,2,0),
+(5187,5186,5185,3,0),
+(5188,5187,5185,4,0),
+(5189,5188,5185,5,0),
+(6778,5189,5185,6,0),
+(8903,6778,5185,7,0),
+(9758,8903,5185,8,0),
+(9888,9758,5185,9,0),
+(9889,9888,5185,10,0),
+(25297,9889,5185,11,0),
+(26978,25297,5185,12,0),
+(26979,26978,5185,13,0),
+(48377,26979,5185,14,0),
+(48378,48377,5185,15,0),
+/*Lifebloom*/
+(33763,0,33763,1,0),
+(48450,33763,33763,2,0),
+(48451,48450,33763,3,0),
+/*MarkoftheWild*/
+(1126,0,1126,1,0),
+(5232,1126,1126,2,0),
+(6756,5232,1126,3,0),
+(5234,6756,1126,4,0),
+(8907,5234,1126,5,0),
+(9884,8907,1126,6,0),
+(9885,9884,1126,7,0),
+(26990,9885,1126,8,0),
+(48469,26990,1126,9,0),
+/*Nourish*/
+(50464,0,50464,1,0),
+/*Rebirth*/
+(20484,0,20484,1,0),
+(20739,20484,20484,2,0),
+(20742,20739,20484,3,0),
+(20747,20742,20484,4,0),
+(20748,20747,20484,5,0),
+(26994,20748,20484,6,0),
+(48477,26994,20484,7,0),
+/*Regrowth*/
+(8936,0,8936,1,0),
+(8938,8936,8936,2,0),
+(8939,8938,8936,3,0),
+(8940,8939,8936,4,0),
+(8941,8940,8936,5,0),
+(9750,8941,8936,6,0),
+(9856,9750,8936,7,0),
+(9857,9856,8936,8,0),
+(9858,9857,8936,9,0),
+(26980,9858,8936,10,0),
+(48442,26980,8936,11,0),
+(48443,48442,8936,12,0),
+/*Rejuvenation*/
+(774,0,774,1,0),
+(1058,774,774,2,0),
+(1430,1058,774,3,0),
+(2090,1430,774,4,0),
+(2091,2090,774,5,0),
+(3627,2091,774,6,0),
+(8910,3627,774,7,0),
+(9839,8910,774,8,0),
+(9840,9839,774,9,0),
+(9841,9840,774,10,0),
+(25299,9841,774,11,0),
+(26981,25299,774,12,0),
+(26982,26981,774,13,0),
+(48440,26982,774,14,0),
+(48441,48440,774,15,0),
+/*Revive*/
+(50769,0,50769,1,0),
+(50768,50769,50769,2,0),
+(50767,50768,50769,3,0),
+(50766,50767,50769,4,0),
+(50765,50766,50769,5,0),
+(50764,50765,50769,6,0),
+(50763,50764,50769,7,0),
+/*Tranquility*/
+(740,0,740,1,0),
+(8918,740,740,2,0),
+(9862,8918,740,3,0),
+(9863,9862,740,4,0),
+(26983,9863,740,5,0),
+(48446,26983,740,6,0),
+(48447,48446,740,7,0),
+/*WildGrowth*/
+(48438,0,48438,1,0),
+(53248,48438,48438,2,0),
+(53249,53248,48438,3,0),
+(53251,53249,48438,4,0),
+/*------------------
+--(574)Balance
+------------------*/
+/*EntanglingRoots*/
+(339,0,339,1,0),
+(1062,339,339,2,0),
+(5195,1062,339,3,0),
+(5196,5195,339,4,0),
+(9852,5196,339,5,0),
+(9853,9852,339,6,0),
+(26989,9853,339,7,0),
+(53308,26989,339,8,0),
+/*Nature'sGrasp*/
+(16689,0,16689,1,339),
+(16810,16689,16689,2,1062),
+(16811,16810,16689,3,5195),
+(16812,16811,16689,4,5196),
+(16813,16812,16689,5,9852),
+(17329,16813,16689,6,9853),
+(27009,17329,16689,7,26989),
+(53312,27009,16689,8,53308),
+/*FaerieFire*/
+(770,0,770,1,0),
+(778,770,770,2,0),
+(9749,778,770,3,0),
+(9907,9749,770,4,0),
+(26993,9907,770,5,0),
+(48476,26993,770,6,0),
+/*Hibernate*/
+(2637,0,2637,1,0),
+(18657,2637,2637,2,0),
+(18658,18657,2637,3,0),
+/*Hurricane*/
+(16914,0,16914,1,0),
+(17401,16914,16914,2,0),
+(17402,17401,16914,3,0),
+(27012,17402,16914,4,0),
+(48467,27012,16914,5,0),
+/*InsectSwarm*/
+(5570,0,5570,1,0),
+(24974,5570,5570,2,0),
+(24975,24974,5570,3,0),
+(24976,24975,5570,4,0),
+(24977,24976,5570,5,0),
+(27013,24977,5570,6,0),
+(48468,27013,5570,7,0),
+/*Moonfire*/
+(8921,0,8921,1,0),
+(8924,8921,8921,2,0),
+(8925,8924,8921,3,0),
+(8926,8925,8921,4,0),
+(8927,8926,8921,5,0),
+(8928,8927,8921,6,0),
+(8929,8928,8921,7,0),
+(9833,8929,8921,8,0),
+(9834,9833,8921,9,0),
+(9835,9834,8921,10,0),
+(26987,9835,8921,11,0),
+(26988,26987,8921,12,0),
+(48462,26988,8921,13,0),
+(48463,48462,8921,14,0),
+/*SootheAnimal*/
+(2908,0,2908,1,0),
+(8955,2908,2908,2,0),
+(9901,8955,2908,3,0),
+(26995,9901,2908,4,0),
+/*Starfall*/
+(48505,0,48505,1,0),
+(53199,48505,48505,2,0),
+(53200,53199,48505,3,0),
+(53201,53200,48505,4,0),
+/*Starfire*/
+(2912,0,2912,1,0),
+(8949,2912,2912,2,0),
+(8950,8949,2912,3,0),
+(8951,8950,2912,4,0),
+(9875,8951,2912,5,0),
+(9876,9875,2912,6,0),
+(25298,9876,2912,7,0),
+(26986,25298,2912,8,0),
+(48464,26986,2912,9,0),
+(48465,48464,2912,10,0),
+/*Thorns*/
+(467,0,467,1,0),
+(782,467,467,2,0),
+(1075,782,467,3,0),
+(8914,1075,467,4,0),
+(9756,8914,467,5,0),
+(9910,9756,467,6,0),
+(26992,9910,467,7,0),
+(53307,26992,467,8,0),
+/*Typhoon*/
+(50516,0,50516,1,0),
+(53223,50516,50516,2,0),
+(53225,53223,50516,3,0),
+(53226,53225,50516,4,0),
+(61384,53226,50516,5,0),
+/*Wrath*/
+(5176,0,5176,1,0),
+(5177,5176,5176,2,0),
+(5178,5177,5176,3,0),
+(5179,5178,5176,4,0),
+(5180,5179,5176,5,0),
+(6780,5180,5176,6,0),
+(8905,6780,5176,7,0),
+(9912,8905,5176,8,0),
+(26984,9912,5176,9,0),
+(26985,26984,5176,10,0),
+(48459,26985,5176,11,0),
+(48461,48459,5176,12,0),
+/*------------------
+--(593)Destruction
+------------------*/
+/*ChaosBolt*/
+(50796,0,50796,1,0),
+(59170,50796,50796,2,0),
+(59171,59170,50796,3,0),
+(59172,59171,50796,4,0),
+/*Conflagrate*/
+(17962,0,17962,1,0),
+(18930,17962,17962,2,0),
+(18931,18930,17962,3,0),
+(18932,18931,17962,4,0),
+(27266,18932,17962,5,0),
+(30912,27266,17962,6,0),
+(47828,30912,17962,7,0),
+(47829,47828,17962,8,0),
+/*Hellfire*/
+(1949,0,1949,1,0),
+(11683,1949,1949,2,0),
+(11684,11683,1949,3,0),
+(27213,11684,1949,4,0),
+(47823,27213,1949,5,0),
+/*Immolate*/
+(348,0,348,1,0),
+(707,348,348,2,0),
+(1094,707,348,3,0),
+(2941,1094,348,4,0),
+(11665,2941,348,5,0),
+(11667,11665,348,6,0),
+(11668,11667,348,7,0),
+(25309,11668,348,8,0),
+(27215,25309,348,9,0),
+(47810,27215,348,10,0),
+(47811,47810,348,11,0),
+/*Incinerate*/
+(29722,0,29722,1,0),
+(32231,29722,29722,2,0),
+(47837,32231,29722,3,0),
+(47838,47837,29722,4,0),
+/*RainofFire*/
+(5740,0,5740,1,0),
+(6219,5740,5740,2,0),
+(11677,6219,5740,3,0),
+(11678,11677,5740,4,0),
+(27212,11678,5740,5,0),
+(47819,27212,5740,6,0),
+(47820,47819,5740,7,0),
+/*SearingPain*/
+(5676,0,5676,1,0),
+(17919,5676,5676,2,0),
+(17920,17919,5676,3,0),
+(17921,17920,5676,4,0),
+(17922,17921,5676,5,0),
+(17923,17922,5676,6,0),
+(27210,17923,5676,7,0),
+(30459,27210,5676,8,0),
+(47814,30459,5676,9,0),
+(47815,47814,5676,10,0),
+/*ShadowBolt*/
+(686,0,686,1,0),
+(695,686,686,2,0),
+(705,695,686,3,0),
+(1088,705,686,4,0),
+(1106,1088,686,5,0),
+(7641,1106,686,6,0),
+(11659,7641,686,7,0),
+(11660,11659,686,8,0),
+(11661,11660,686,9,0),
+(25307,11661,686,10,0),
+(27209,25307,686,11,0),
+(47808,27209,686,12,0),
+(47809,47808,686,13,0),
+/*Shadowburn*/
+(17877,0,17877,1,0),
+(18867,17877,17877,2,0),
+(18868,18867,17877,3,0),
+(18869,18868,17877,4,0),
+(18870,18869,17877,5,0),
+(18871,18870,17877,6,0),
+(27263,18871,17877,7,0),
+(30546,27263,17877,8,0),
+(47826,30546,17877,9,0),
+(47827,47826,17877,10,0),
+/*Shadowflame*/
+(47897,0,47897,1,0),
+(61290,47897,47897,2,0),
+/*Shadowfury*/
+(30283,0,30283,1,0),
+(30413,30283,30283,2,0),
+(30414,30413,30283,3,0),
+(47846,30414,30283,4,0),
+(47847,47846,30283,5,0),
+/*SoulFire*/
+(6353,0,6353,1,0),
+(17924,6353,6353,2,0),
+(27211,17924,6353,3,0),
+(30545,27211,6353,4,0),
+(47824,30545,6353,5,0),
+(47825,47824,6353,6,0),
+/*------------------
+--(594) Holy (Paladin)
+------------------*/
+/*Blessing of Wisdom*/
+(19742,0,19742,1,0),
+(19850,19742,19742,2,0),
+(19852,19850,19742,3,0),
+(19853,19852,19742,4,0),
+(19854,19853,19742,5,0),
+(25290,19854,19742,6,0),
+(27142,25290,19742,7,0),
+(48935,27142,19742,8,0),
+(48936,48935,19742,9,0),
+/*Consecration*/
+(26573,0,26573,1,0),
+(20116,26573,26573,2,0),
+(20922,20116,26573,3,0),
+(20923,20922,26573,4,0),
+(20924,20923,26573,5,0),
+(27173,20924,26573,6,0),
+(48818,27173,26573,7,0),
+(48819,48818,26573,8,0),
+/*Exorcism*/
+(879,0,879,1,0),
+(5614,879,879,2,0),
+(5615,5614,879,3,0),
+(10312,5615,879,4,0),
+(10313,10312,879,5,0),
+(10314,10313,879,6,0),
+(27138,10314,879,7,0),
+(48800,27138,879,8,0),
+(48801,48800,879,9,0),
+/*Flash of Light*/
+(19750,0,19750,1,0),
+(19939,19750,19750,2,0),
+(19940,19939,19750,3,0),
+(19941,19940,19750,4,0),
+(19942,19941,19750,5,0),
+(19943,19942,19750,6,0),
+(27137,19943,19750,7,0),
+(48784,27137,19750,8,0),
+(48785,48784,19750,9,0),
+/*Greater Blessing of Wisdom*/
+(25894,0,25894,1,19854),
+(25918,25894,25894,2,25290),
+(27143,25918,25894,3,27142),
+(48937,27143,25894,4,48935),
+(48938,48937,25894,5,48936),
+/*Holy Light*/
+(635,0,635,1,0),
+(639,635,635,2,0),
+(647,639,635,3,0),
+(1026,647,635,4,0),
+(1042,1026,635,5,0),
+(3472,1042,635,6,0),
+(10328,3472,635,7,0),
+(10329,10328,635,8,0),
+(25292,10329,635,9,0),
+(27135,25292,635,10,0),
+(27136,27135,635,11,0),
+(48781,27136,635,12,0),
+(48782,48781,635,13,0),
+/*HolyShock*/
+(20473,0,20473,1,0),
+(20929,20473,20473,2,0),
+(20930,20929,20473,3,0),
+(27174,20930,20473,4,0),
+(33072,27174,20473,5,0),
+(48824,33072,20473,6,0),
+(48825,48824,20473,7,0),
+/*HolyWrath*/
+(2812,0,2812,1,0),
+(10318,2812,2812,2,0),
+(27139,10318,2812,3,0),
+(48816,27139,2812,4,0),
+(48817,48816,2812,5,0),
+/*Lay on Hands*/
+(633,0,633,1,0),
+(2800,633,633,2,0),
+(10310,2800,633,3,0),
+(27154,10310,633,4,0),
+(48788,27154,633,5,0),
+/*Redemption*/
+(7328,0,7328,1,0),
+(10322,7328,7328,2,0),
+(10324,10322,7328,3,0),
+(20772,10324,7328,4,0),
+(20773,20772,7328,5,0),
+(48949,20773,7328,6,0),
+(48950,48949,7328,7,0),
+/*------------------
+--(613)Discipline
+------------------*/
+/*DispelMagic*/
+(527,0,527,1,0),
+(988,527,527,2,0),
+/*DivineSpirit*/
+(14752,0,14752,1,0),
+(14818,14752,14752,2,0),
+(14819,14818,14752,3,0),
+(27841,14819,14752,4,0),
+(25312,27841,14752,5,0),
+(48073,25312,14752,6,0),
+/*InnerFire*/
+(588,0,588,1,0),
+(7128,588,588,2,0),
+(602,7128,588,3,0),
+(1006,602,588,4,0),
+(10951,1006,588,5,0),
+(10952,10951,588,6,0),
+(25431,10952,588,7,0),
+(48040,25431,588,8,0),
+(48168,48040,588,9,0),
+/*Penance*/
+(47540,0,47540,1,0),
+(53005,47540,47540,2,0),
+(53006,53005,47540,3,0),
+(53007,53006,47540,4,0),
+/*PowerWord:Fortitude*/
+(1243,0,1243,1,0),
+(1244,1243,1243,2,0),
+(1245,1244,1243,3,0),
+(2791,1245,1243,4,0),
+(10937,2791,1243,5,0),
+(10938,10937,1243,6,0),
+(25389,10938,1243,7,0),
+(48161,25389,1243,8,0),
+/*PowerWord:Shield*/
+(17,0,17,1,0),
+(592,17,17,2,0),
+(600,592,17,3,0),
+(3747,600,17,4,0),
+(6065,3747,17,5,0),
+(6066,6065,17,6,0),
+(10898,6066,17,7,0),
+(10899,10898,17,8,0),
+(10900,10899,17,9,0),
+(10901,10900,17,10,0),
+(25217,10901,17,11,0),
+(25218,25217,17,12,0),
+(48065,25218,17,13,0),
+(48066,48065,17,14,0),
+/*PrayerofFortitude*/
+(21562,0,21562,1,0),
+(21564,21562,21562,2,0),
+(25392,21564,21562,3,0),
+(48162,25392,21562,4,0),
+/*Prayer of Spirit*/
+(27681,0,27681,1,14752),
+(32999,27681,27681,2,0),
+(48074,32999,27681,3,0),
+/*ShackleUndead*/
+(9484,0,9484,1,0),
+(9485,9484,9484,2,0),
+(10955,9485,9484,3,0),
+/*------------------
+--(654)Pet-Hyena
+------------------*/
+/*TendonRip*/
+(50271,0,50271,1,0),
+(53571,50271,50271,2,0),
+(53572,53571,50271,3,0),
+(53573,53572,50271,4,0),
+(53574,53573,50271,5,0),
+(53575,53574,50271,6,0),
+/*------------------
+--(655)Pet-BirdofPrey
+------------------*/
+/*Snatch*/
+(50541,0,50541,1,0),
+(53537,50541,50541,2,0),
+(53538,53537,50541,3,0),
+(53540,53538,50541,4,0),
+(53542,53540,50541,5,0),
+(53543,53542,50541,6,0),
+/*------------------
+--(656)Pet-WindSerpent
+------------------*/
+/*LightningBreath*/
+(24844,0,24844,1,0),
+(25008,24844,24844,2,0),
+(25009,25008,24844,3,0),
+(25010,25009,24844,4,0),
+(25011,25010,24844,5,0),
+(25012,25011,24844,6,0),
+/*------------------
+-- (755) Jewelcrafting
+------------------*/
+/*Jewelcrafting*/
+(25229,0,25229,1,0),
+(25230,25229,25229,2,0),
+(28894,25230,25229,3,0),
+(28895,28894,25229,4,0),
+(28897,28895,25229,5,0),
+(51311,28897,25229,6,0),
+/*------------------
+--(761)Pet-Felguard
+------------------*/
+/*Anguish*/
+(33698,0,33698,1,0),
+(33699,33698,33698,2,0),
+(33700,33699,33698,3,0),
+(47993,33700,33698,4,0),
+/*Cleave*/
+(30213,0,30213,1,0),
+(30219,30213,30213,2,0),
+(30223,30219,30213,3,0),
+(47994,30223,30213,4,0),
+/*Intercept*/
+(30151,0,30151,1,0),
+(30194,30151,30151,2,0),
+(30198,30194,30151,3,0),
+(47996,30198,30151,4,0),
+/*------------------
+-- (762) Riding
+------------------*/
+/*Riding*/
+(33388,0,33388,1,0),
+(33391,33388,33388,2,0),
+(34090,33391,33388,3,0),
+(34091,34090,33388,4,0),
+/*------------------
+--(763)Pet-Dragonhawk
+------------------*/
+/*FireBreath*/
+(34889,0,34889,1,0),
+(35323,34889,34889,2,0),
+(55482,35323,34889,3,0),
+(55483,55482,34889,4,0),
+(55484,55483,34889,5,0),
+(55485,55484,34889,6,0),
+/*------------------
+--(764)Pet-NetherRay
+--(765)Pet-Sporebat
+------------------*/
+/*SporeCloud*/
+(50274,0,50274,1,0),
+(53593,50274,50274,2,0),
+(53594,53593,50274,3,0),
+(53596,53594,50274,4,0),
+(53597,53596,50274,5,0),
+(53598,53597,50274,6,0),
+/*------------------
+--(768)Pet-Serpent
+------------------*/
+/*PoisonSpit*/
+(35387,0,35387,1,0),
+(35389,35387,35387,2,0),
+(35392,35389,35387,3,0),
+(55555,35392,35387,4,0),
+(55556,55555,35387,5,0),
+(55557,55556,35387,6,0),
+/*------------------
+--(770)Blood
+------------------*/
+/*BloodBoil*/
+(48721,0,48721,1,0),
+(49939,48721,48721,2,0),
+(49940,49939,48721,3,0),
+(49941,49940,48721,4,0),
+/*BloodStrike*/
+(45902,0,45902,1,0),
+(49926,45902,45902,2,0),
+(49927,49926,45902,3,0),
+(49928,49927,45902,4,0),
+(49929,49928,45902,5,0),
+(49930,49929,45902,6,0),
+/*HeartStrike*/
+(55050,0,55050,1,0),
+(55258,55050,55050,2,0),
+(55259,55258,55050,3,0),
+(55260,55259,55050,4,0),
+(55261,55260,55050,5,0),
+(55262,55261,55050,6,0),
+/*ImprovedRuneTap*/
+(48985,0,48985,1,0),
+(49488,48985,48985,2,0),
+(49489,49488,48985,3,0),
+/*Pestilence*/
+(50842,0,50842,1,0),
+(51426,50842,50842,2,0),
+(51427,51426,50842,3,0),
+(51428,51427,50842,4,0),
+(51429,51428,50842,5,0),
+/*Strangulate*/
+(47476,0,47476,1,0),
+(49913,47476,47476,2,0),
+(49914,49913,47476,3,0),
+(49915,49914,47476,4,0),
+(49916,49915,47476,5,0),
+/*Vendetta*/
+(49015,0,49015,1,0),
+(50154,49015,49015,2,0),
+(55136,50154,49015,3,0),
+/*------------------
+--(771)Frost
+------------------*/
+/*FrostStrike*/
+(49143,0,49143,1,0),
+(51416,49143,49143,2,0),
+(51417,51416,49143,3,0),
+(51418,51417,49143,4,0),
+(51419,51418,49143,5,0),
+(55268,51419,49143,6,0),
+/*HornofWinter*/
+(57330,0,57330,1,0),
+(57623,57330,57330,2,0),
+/*HowlingBlast*/
+(49184,0,49184,1,0),
+(51408,49184,49184,2,0),
+(51409,51408,49184,3,0),
+(51410,51409,49184,4,0),
+(51411,51410,49184,5,0),
+/*IcyTalons*/
+(50880,0,50880,1,0),
+(50884,50880,50880,2,0),
+(50885,50884,50880,3,0),
+(50886,50885,50880,4,0),
+(50887,50886,50880,5,0),
+/*IcyTouch*/
+(45477,0,45477,1,0),
+(49896,45477,45477,2,0),
+(49903,49896,45477,3,0),
+(49904,49903,45477,4,0),
+(49909,49904,45477,5,0),
+/*ImprovedIcyTouch*/
+(49175,0,49175,1,0),
+(50031,49175,49175,2,0),
+(51456,50031,49175,3,0),
+/*Obliterate*/
+(49020,0,49020,1,0),
+(51423,49020,49020,2,0),
+(51424,51423,49020,3,0),
+(51425,51424,49020,4,0),
+/*------------------
+--(772)Unholy
+------------------*/
+/*CorpseExplosion*/
+(49158,0,49158,1,0),
+(51325,49158,49158,2,0),
+(51326,51325,49158,3,0),
+(51327,51326,49158,4,0),
+(51328,51327,49158,5,0),
+/*DeathandDecay*/
+(43265,0,43265,1,0),
+(49936,43265,43265,2,0),
+(49937,49936,43265,3,0),
+(49938,49937,43265,4,0),
+/*DeathCoil*/
+(47541,0,47541,1,0),
+(49892,47541,47541,2,0),
+(49893,49892,47541,3,0),
+(49894,49893,47541,4,0),
+(49895,49894,47541,5,0),
+/*DeathStrike*/
+(49998,0,49998,1,0),
+(49999,49998,49998,2,0),
+(45463,49999,49998,3,0),
+(49923,45463,49998,4,0),
+(49924,49923,49998,5,0),
+/*MagicSuppression*/
+(49224,0,49224,1,0),
+(49610,49224,49224,2,0),
+(49611,49610,49224,3,0),
+(49612,49611,49224,4,0),
+(49614,49612,49224,5,0),
+/*Outbreak*/
+(49013,0,49013,1,0),
+(55236,49013,49013,2,0),
+(55237,55236,49013,3,0),
+/*PlagueStrike*/
+(45462,0,45462,1,0),
+(49917,45462,45462,2,0),
+(49918,49917,45462,3,0),
+(49919,49918,45462,4,0),
+(49920,49919,45462,5,0),
+(49921,49920,45462,6,0),
+/*ScourgeStrike*/
+(55090,0,55090,1,0),
+(55265,55090,55090,2,0),
+(55270,55265,55090,3,0),
+(55271,55270,55090,4,0),
+/*UnholyBlight*/
+(49194,0,49194,1,0),
+(51376,49194,49194,2,0),
+(51378,51376,49194,3,0),
+(51379,51378,49194,4,0),
+/*------------------
+-- (773) Inscription
+------------------*/
+/*Inscription*/
+(45357,0,45357,1,0),
+(45358,45357,45357,2,0),
+(45359,45358,45357,3,0),
+(45360,45359,45357,4,0),
+(45361,45360,45357,5,0),
+(45363,45361,45357,6,0),
+/*------------------
+--(780)Pet-ExoticChimaera
+------------------*/
+/*FroststormBreath*/
+(54644,0,54644,1,0),
+(55488,54644,54644,2,0),
+(55489,55488,54644,3,0),
+(55490,55489,54644,4,0),
+(55491,55490,54644,5,0),
+(55492,55491,54644,6,0),
+/*------------------
+--(781)Pet-ExoticDevlisaur
+------------------*/
+/*MonstrousBite*/
+(54680,0,54680,1,0),
+(55495,54680,54680,2,0),
+(55496,55495,54680,3,0),
+(55497,55496,54680,4,0),
+(55498,55497,54680,5,0),
+(55499,55498,54680,6,0),
+/*------------------
+--(784)Pet-ExoticWorm
+------------------*/
+/*AcidSpit*/
+(55749,0,55749,1,0),
+(55750,55749,55749,2,0),
+(55751,55750,55749,3,0),
+(55752,55751,55749,4,0),
+(55753,55752,55749,5,0),
+(55754,55753,55749,6,0),
+/*------------------
+--(785)Pet-Wasp
+------------------*/
+/*Sting*/
+(56626,0,56626,1,0),
+(56627,56626,56626,2,0),
+(56628,56627,56626,3,0),
+(56629,56628,56626,4,0),
+(56630,56629,56626,5,0),
+(56631,56630,56626,6,0),
+/*------------------
+--(787)Pet-ExoticCoreHound
+------------------*/
+/*LavaBreath*/
+(58604,0,58604,1,0),
+(58607,58604,58604,2,0),
+(58608,58607,58604,3,0),
+(58609,58608,58604,4,0),
+(58610,58609,58604,5,0),
+(58611,58610,58604,6,0),
+/*------------------
+--(788)Pet-ExoticSpiritBeast
+------------------*/
+/*SpiritStrike*/
+(61193,0,61193,1,0),
+(61194,61193,61193,2,0),
+(61195,61194,61193,3,0),
+(61196,61195,61193,4,0),
+(61197,61196,61193,5,0),
+(61198,61197,61193,6,0),
+
+/*Tranquility*/
+(44203, 0,44203,1,0),
+(44205,44203,44203,2,0),
+(44206,44205,44203,3,0),
+(44207,44206,44203,4,0),
+(44208,44207,44203,5,0),
+(48444,44208,44203,6,0),
+(48445,48444,44203,7,0),
+/*Hurricane*/
+(42231, 0,42231,1,0),
+(42232,42231,42231,2,0),
+(42233,42232,42231,3,0),
+(42230,42233,42231,4,0),
+(48466,42230,42231,5,0);
+/*!40000 ALTER TABLE `spell_chain` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_elixir`
+--
+
+DROP TABLE IF EXISTS `spell_elixir`;
+CREATE TABLE `spell_elixir` (
+ `entry` int(11) unsigned NOT NULL default '0' COMMENT 'SpellId of potion',
+ `mask` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Mask 0x1 battle 0x2 guardian 0x3 flask 0x7 unstable flasks 0xB shattrath flasks',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Spell System';
+
+--
+-- Dumping data for table `spell_elixir`
+--
+
+LOCK TABLES `spell_elixir` WRITE;
+/*!40000 ALTER TABLE `spell_elixir` DISABLE KEYS */;
+INSERT INTO `spell_elixir` VALUES
+( 673,0x2),
+( 2367,0x1),
+( 2374,0x1),
+( 2378,0x2),
+( 2380,0x2),
+( 3160,0x1),
+( 3164,0x1),
+( 3166,0x2),
+( 3219,0x2),
+( 3220,0x2),
+( 3222,0x2),
+( 3223,0x2),
+( 3593,0x2),
+( 7844,0x1),
+( 8212,0x1),
+(10667,0x1),
+(10668,0x2),
+(10669,0x1),
+(10692,0x2),
+(10693,0x2),
+(11319,0x2),
+(11328,0x1),
+(11334,0x1),
+(11348,0x2),
+(11349,0x2),
+(11364,0x2),
+(11371,0x2),
+(11390,0x1),
+(11396,0x2),
+(11405,0x1),
+(11406,0x1),
+(11474,0x1),
+(15231,0x2),
+(15233,0x2),
+(16321,0x2),
+(16322,0x1),
+(16323,0x1),
+(16325,0x2),
+(16326,0x2),
+(16327,0x2),
+(16329,0x1),
+(17038,0x1),
+(17535,0x2),
+(17537,0x1),
+(17538,0x1),
+(17539,0x1),
+(17624,0x3),
+(17626,0x3),
+(17627,0x3),
+(17629,0x3),
+(17628,0x3),
+(21920,0x1),
+(24361,0x2),
+(24363,0x2),
+(24382,0x2),
+(24383,0x2),
+(24417,0x2),
+(26276,0x1),
+(27652,0x2),
+(27653,0x2),
+(28486,0x1),
+(28488,0x1),
+(28490,0x1),
+(28491,0x1),
+(28493,0x1),
+(28497,0x1),
+(28501,0x1),
+(28502,0x2),
+(28503,0x1),
+(28509,0x2),
+(28514,0x2),
+(28518,0x3),
+(28519,0x3),
+(28520,0x3),
+(28521,0x3),
+(28540,0x3),
+(29348,0x2),
+(33720,0x1),
+(33721,0x1),
+(33726,0x1),
+(38954,0x1),
+(39625,0x2),
+(39626,0x2),
+(39627,0x2),
+(39628,0x2),
+(40567,0x7),
+(40568,0x7),
+(40572,0x7),
+(40573,0x7),
+(40575,0x7),
+(40576,0x7),
+(41608,0xB),
+(41609,0xB),
+(41610,0xB),
+(41611,0xB),
+(42735,0x3),
+(45373,0x1),
+(46837,0xB),
+(46839,0xB);
+/*!40000 ALTER TABLE `spell_elixir` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_learn_spell`
+--
+
+DROP TABLE IF EXISTS `spell_learn_spell`;
+CREATE TABLE `spell_learn_spell` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `SpellID` smallint(5) unsigned NOT NULL default '0',
+ `Active` tinyint(3) unsigned NOT NULL default '1',
+ PRIMARY KEY (`entry`,`SpellID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
+
+--
+-- Dumping data for table `spell_learn_spell`
+--
+
+LOCK TABLES `spell_learn_spell` WRITE;
+/*!40000 ALTER TABLE `spell_learn_spell` DISABLE KEYS */;
+INSERT INTO `spell_learn_spell` VALUES
+(71,7376,0),
+(768,3025,0),
+(783,5419,0),
+(1066,5421,0),
+(2457,21156,0),
+(2458,7381,0),
+(5487,1178,0),
+(5487,21178,0),
+(5784,33388,1),
+(9634,9635,0),
+(9634,21178,0),
+(13819,33388,1),
+(17002,24867,0),
+(23161,33391,1),
+(23214,33391,1),
+(24858,24905,0),
+(24866,24864,0),
+(33872,47179,0),
+(33873,47180,0),
+(33891,5420,0),
+(33891,34123,0),
+(33943,33948,0),
+(33943,34090,1),
+(33943,34764,0),
+(34767,33391,1),
+(34769,33388,1),
+(40123,40121,0),
+(40123,40122,0),
+(53428,53341,1),
+(53428,53343,1),
+(58984,21009,1);
+
+
+/*!40000 ALTER TABLE `spell_learn_spell` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_loot_template`
+--
+
+DROP TABLE IF EXISTS `spell_loot_template`;
+CREATE TABLE `spell_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `spell_loot_template`
+--
+
+LOCK TABLES `spell_loot_template` WRITE;
+/*!40000 ALTER TABLE `spell_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `spell_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_pet_auras`
+--
+
+DROP TABLE IF EXISTS `spell_pet_auras`;
+CREATE TABLE `spell_pet_auras` (
+ `spell` mediumint(8) unsigned NOT NULL COMMENT 'dummy spell id',
+ `pet` mediumint(8) unsigned NOT NULL default '0' COMMENT 'pet id; 0 = all',
+ `aura` mediumint(8) unsigned NOT NULL COMMENT 'pet aura id',
+ PRIMARY KEY (`spell`,`pet`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+--
+-- Dumping data for table `spell_pet_auras`
+--
+
+LOCK TABLES `spell_pet_auras` WRITE;
+/*!40000 ALTER TABLE `spell_pet_auras` DISABLE KEYS */;
+INSERT INTO `spell_pet_auras` VALUES
+(19028, 0, 25228),
+(19578, 0, 19579),
+(20895, 0, 24529),
+(28757, 0, 28758),
+(35029, 0, 35060),
+(35030, 0, 35061),
+(35691, 0, 35696),
+(35692, 0, 35696),
+(35693, 0, 35696),
+(23785, 416, 23759),
+(23822, 416, 23826),
+(23823, 416, 23827),
+(23824, 416, 23828),
+(23825, 416, 23829),
+(23785, 417, 23762),
+(23822, 417, 23837),
+(23823, 417, 23838),
+(23824, 417, 23839),
+(23825, 417, 23840),
+(23785, 1860, 23760),
+(23822, 1860, 23841),
+(23823, 1860, 23842),
+(23824, 1860, 23843),
+(23825, 1860, 23844),
+(23785, 1863, 23761),
+(23822, 1863, 23833),
+(23823, 1863, 23834),
+(23824, 1863, 23835),
+(23825, 1863, 23836),
+(23785, 17252, 35702),
+(23822, 17252, 35703),
+(23823, 17252, 35704),
+(23824, 17252, 35705),
+(23825, 17252, 35706);
+
+/*!40000 ALTER TABLE `spell_pet_auras` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_proc_event`
+--
+
+DROP TABLE IF EXISTS `spell_proc_event`;
+CREATE TABLE `spell_proc_event` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `SchoolMask` tinyint(4) NOT NULL default '0',
+ `SpellFamilyName` smallint(5) unsigned NOT NULL default '0',
+ `SpellFamilyMask0` int(10) unsigned NOT NULL default '0',
+ `SpellFamilyMask1` int(10) unsigned NOT NULL default '0',
+ `SpellFamilyMask2` int(10) unsigned NOT NULL default '0',
+ `procFlags` int(10) unsigned NOT NULL default '0',
+ `procEx` int(10) unsigned NOT NULL default '0',
+ `ppmRate` float NOT NULL default '0',
+ `CustomChance` float NOT NULL default '0',
+ `Cooldown` int(10) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `spell_proc_event`
+--
+
+LOCK TABLES `spell_proc_event` WRITE;
+/*!40000 ALTER TABLE `spell_proc_event` DISABLE KEYS */;
+INSERT INTO `spell_proc_event` VALUES
+( 324, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+( 325, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+( 905, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+( 945, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+( 974, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+( 1463, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+( 3232, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+( 5952, 0x00000000, 8, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+( 6346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0.000000, 0.000000, 0),
+( 7383, 0x00000001, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0.000000, 0.000000, 0),
+( 7434, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+( 8134, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+( 8178, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+( 8494, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+( 8495, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+( 9452, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+( 9782, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+( 9784, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+( 9799, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(10191, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(10192, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(10193, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(10431, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(10432, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(11095, 0x00000000, 3, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(11119, 0x00000004, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(11120, 0x00000004, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(11129, 0x00000000, 3, 0x00C00017, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(11180, 0x00000010, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(11185, 0x00000000, 3, 0x00000080, 0x00000000, 0x00000000, 0x00050000, 0x00000000, 0.000000, 0.000000, 0),
+(11255, 0x00000000, 3, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12169, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(12281, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
+(12289, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12298, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(12311, 0x00000000, 4, 0x00000800, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12317, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12319, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12322, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(12487, 0x00000000, 3, 0x00000080, 0x00000000, 0x00000000, 0x00050000, 0x00000000, 0.000000, 0.000000, 0),
+(12488, 0x00000000, 3, 0x00000080, 0x00000000, 0x00000000, 0x00050000, 0x00000000, 0.000000, 0.000000, 0),
+(12598, 0x00000000, 3, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12668, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12724, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(12725, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(12726, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(12727, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(12797, 0x00000000, 4, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12799, 0x00000000, 4, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12812, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
+(12813, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
+(12814, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
+(12815, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
+(12834, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12846, 0x00000004, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12847, 0x00000004, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12848, 0x00000004, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12849, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12867, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12872, 0x00000000, 3, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12873, 0x00000000, 3, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12958, 0x00000000, 4, 0x00000800, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(12966, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(12967, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(12968, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(12969, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(12970, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(12971, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12972, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12973, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12974, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(12999, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4.000000, 0.000000, 0),
+(13000, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0),
+(13001, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 8.000000, 0.000000, 0),
+(13002, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 10.000000, 0.000000, 0),
+(13045, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(13046, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(13047, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(13048, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(13163, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
+(13165, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(13754, 0x00000000, 8, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(13867, 0x00000000, 8, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(13983, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000018, 0.000000, 0.000000, 0),
+(14070, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000018, 0.000000, 0.000000, 0),
+(14071, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000018, 0.000000, 0.000000, 0),
+(14156, 0x00000000, 8, 0x003E0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14160, 0x00000000, 8, 0x003E0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14161, 0x00000000, 8, 0x003E0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14186, 0x00000000, 8, 0x40800508, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14190, 0x00000000, 8, 0x40800508, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14193, 0x00000000, 8, 0x40800508, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14194, 0x00000000, 8, 0x40800508, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14195, 0x00000000, 8, 0x40800508, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14318, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14319, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14320, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14321, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14322, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(14531, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14774, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(14892, 0x00000000, 6, 0x10001E00, 0x00010004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(15088, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(15128, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15268, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15277, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0),
+(15286, 0x00000020, 6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15323, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15324, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15325, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15326, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(15337, 0x00000000, 6, 0x00002000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(15338, 0x00000000, 6, 0x00002000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(15346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0),
+(15362, 0x00000000, 6, 0x10001E00, 0x00010004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(15363, 0x00000000, 6, 0x10001E00, 0x00010004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(15600, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.000000, 0.000000, 0),
+(16164, 0x00000000, 11, 0x901000C3, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16176, 0x00000000, 11, 0x000001C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16180, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16196, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16198, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16235, 0x00000000, 11, 0x000001C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16240, 0x00000000, 11, 0x000001C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16256, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16257, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(16277, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(16278, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(16279, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(16280, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(16281, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16282, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16283, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16284, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16487, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16489, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16492, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16550, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16620, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(16624, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(16850, 0x00000000, 7, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(16864, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(16880, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16923, 0x00000000, 7, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(16924, 0x00000000, 7, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(16952, 0x00000000, 7, 0x00039000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16954, 0x00000000, 7, 0x00039000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16958, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(16961, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(17106, 0x00000000, 7, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17107, 0x00000000, 7, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17108, 0x00000000, 7, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17364, 0x00000008, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17495, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(17793, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(17794, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0.000000, 0.000000, 0),
+(17796, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(17797, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17798, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17799, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17800, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(17801, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(17802, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(17803, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(18073, 0x00000000, 5, 0x00000060, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(18094, 0x00000000, 5, 0x0000000A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(18095, 0x00000000, 5, 0x0000000A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(18096, 0x00000000, 5, 0x00000060, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(18119, 0x00000000, 5, 0x000003E5, 0x000010C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(18120, 0x00000000, 5, 0x000003E5, 0x000010C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(18820, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(19184, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(19228, 0x00000000, 0, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(19232, 0x00000000, 9, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(19233, 0x00000000, 9, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(19387, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(19388, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(19572, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
+(19573, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
+(20049, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20056, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20057, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20128, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(20131, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(20132, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(20164, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 5.000000, 0.000000, 0),
+(20165, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 20.000000, 0.000000, 0),
+(20166, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 20.000000, 0.000000, 0),
+(20182, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(20210, 0x00000000, 10, 0xC0000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20212, 0x00000000, 10, 0xC0000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20213, 0x00000000, 10, 0xC0000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20214, 0x00000000, 10, 0xC0000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20215, 0x00000000, 10, 0xC0000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20234, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(20235, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(20375, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 0),
+(20500, 0x00000000, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(20501, 0x00000000, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(20705, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(20911, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(20925, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(20927, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(20928, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(21185, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(21882, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(21890, 0x00000000, 4, 0x2A764EEF, 0x0000036C, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(22007, 0x00000000, 3, 0x00200021, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(22618, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(22648, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(23547, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
+(23548, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(23551, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(23552, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(23572, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(23578, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(23581, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(23602, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(23686, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(23688, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(23689, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 4.000000, 0.000000, 0),
+(23695, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(23721, 0x00000000, 9, 0x00000800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(23920, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(24353, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(24389, 0x00000000, 3, 0x00C00017, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(24398, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(24658, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00014110, 0x00000000, 0.000000, 0.000000, 0),
+(24905, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 15.000000, 0.000000, 0),
+(24932, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 6),
+(25050, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(25296, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(25469, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(25472, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(25669, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.000000, 0.000000, 0),
+(25899, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(25988, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(26016, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(26107, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000064, 0.000000, 0.000000, 0),
+(26119, 0x00000000, 10, 0x90100003, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(26128, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0.000000, 0.000000, 0),
+(26135, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(26480, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(26605, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(27044, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(27131, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(27179, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(27419, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(27498, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(27521, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(27656, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(27774, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(27787, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(27811, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(27815, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(27816, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(28592, 0x00000010, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(28593, 0x00000010, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(28716, 0x00000000, 7, 0x00000010, 0x00000000, 0x00000000, 0x00048000, 0x00000000, 0.000000, 0.000000, 0),
+(28719, 0x00000000, 7, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(28744, 0x00000000, 7, 0x00000040, 0x00000000, 0x00000000, 0x00044000, 0x00000000, 0.000000, 0.000000, 0),
+(28752, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(28789, 0x00000000, 10, 0xC0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(28802, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(28809, 0x00000000, 6, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(28812, 0x00000000, 8, 0x02000006, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(28816, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(28823, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(28847, 0x00000000, 7, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(28849, 0x00000000, 11, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(29074, 0x00000014, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(29075, 0x00000014, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(29076, 0x00000014, 3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(29150, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29179, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(29180, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(29385, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 0),
+(29441, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0.000000, 0.000000, 1),
+(29444, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0.000000, 0.000000, 1),
+(29455, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(29501, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29593, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(29594, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(29624, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29625, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29626, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29632, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29633, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29634, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29635, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29636, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29637, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(29801, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(29834, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(29838, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(29977, 0x00000000, 3, 0x00C00017, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30003, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(30160, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30293, 0x00000000, 5, 0x00000381, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30295, 0x00000000, 5, 0x00000381, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30296, 0x00000000, 5, 0x00000381, 0x000000C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30299, 0x00000024, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30301, 0x00000024, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30302, 0x00000024, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30675, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30678, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30679, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30680, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30681, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30701, 0x0000001C, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30705, 0x0000001C, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(30802, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30803, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30804, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30805, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30806, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30807, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30808, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30809, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30810, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30811, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(30823, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 10.500000, 0.000000, 0),
+(30881, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
+(30883, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
+(30884, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
+(30885, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
+(30886, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
+(30937, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31124, 0x00000000, 8, 0x2000000E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31126, 0x00000000, 8, 0x2000000E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31244, 0x00000000, 8, 0x003E0000, 0x00000009, 0x00000000, 0x00000000, 0x00000004, 0.000000, 0.000000, 0),
+(31245, 0x00000000, 8, 0x003E0000, 0x00000009, 0x00000000, 0x00000000, 0x00000004, 0.000000, 0.000000, 0),
+(31394, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31569, 0x00000000, 3, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31570, 0x00000000, 3, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31785, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00008800, 0x00000000, 0.000000, 0.000000, 0),
+(31794, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(31801, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 20.000000, 0.000000, 0),
+(31833, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31835, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31836, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31871, 0x00000000, 10, 0x00000010, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
+(31872, 0x00000000, 10, 0x00000010, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
+(31876, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31877, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31878, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(31904, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(32385, 0x00000000, 5, 0x00000402, 0x00000011, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(32387, 0x00000000, 5, 0x00000402, 0x00000011, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(32392, 0x00000000, 5, 0x00000402, 0x00000011, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(32393, 0x00000000, 5, 0x00000402, 0x00000011, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(32394, 0x00000000, 5, 0x00000402, 0x00000011, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(32409, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(32587, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(32593, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(32594, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(32642, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(32734, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(32748, 0x00000000, 8, 0x00000000, 0x00000001, 0x00000000, 0x00000140, 0x00000000, 0.000000, 0.000000, 0),
+(32776, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(32777, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(32837, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 45),
+(32844, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 0),
+(32885, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33076, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0),
+(33089, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(33127, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 0),
+(33142, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33145, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33146, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33150, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33151, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33154, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33191, 0x00000000, 6, 0x00808000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(33192, 0x00000000, 6, 0x00808000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(33193, 0x00000000, 6, 0x00808000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(33299, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(33510, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 5.000000, 0.000000, 0),
+(33648, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33719, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(33736, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(33746, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(33757, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(33759, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(33776, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00008800, 0x00000000, 0.000000, 0.000000, 0),
+(33881, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33882, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33883, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(33953, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 45),
+(34080, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0.000000, 0.000000, 0),
+(34138, 0x00000000, 11, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(34139, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(34258, 0x00000000, 10, 0x00000400, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(34262, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(34320, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34355, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(34497, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34498, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34499, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34500, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34502, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34503, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34584, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(34586, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.500000, 0.000000, 0),
+(34598, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(34749, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008, 0.000000, 0.000000, 0),
+(34753, 0x00000000, 6, 0x00001800, 0x00000004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34774, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.500000, 0.000000, 20),
+(34783, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(34827, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(34859, 0x00000000, 6, 0x00001800, 0x00000004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34860, 0x00000000, 6, 0x00001800, 0x00000004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34914, 0x00000000, 6, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(34916, 0x00000000, 6, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(34917, 0x00000000, 6, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(34935, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 8),
+(34938, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 8),
+(34939, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 8),
+(34950, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(34954, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(35077, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
+(35080, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.000000, 0.000000, 60),
+(35083, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
+(35086, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
+(35100, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00010140, 0x00000000, 0.000000, 0.000000, 0),
+(35102, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(35103, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(35121, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(36096, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(36111, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(36541, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37165, 0x00000000, 8, 0x00200400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37168, 0x00000000, 8, 0x003E0000, 0x00000009, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37170, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.000000, 0.000000, 0),
+(37173, 0x00000000, 8, 0x2CBC0598, 0x00000106, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(37189, 0x00000000, 10, 0xC0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 60),
+(37193, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(37195, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37197, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 45),
+(37213, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(37214, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(37227, 0x00000000, 11, 0x000001C0, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 60),
+(37237, 0x00000000, 11, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(37247, 0x00000008, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 45),
+(37377, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(37379, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37384, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37443, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(37514, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
+(37516, 0x00000000, 4, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37519, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000030, 0.000000, 0.000000, 0),
+(37523, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(37528, 0x00000000, 4, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37536, 0x00000000, 4, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37568, 0x00000000, 6, 0x00000800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37594, 0x00000000, 6, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37600, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(37601, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(37603, 0x00000000, 6, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(37655, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
+(37657, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 3),
+(38026, 0x00000001, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0.000000, 0.000000, 0),
+(38031, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(38290, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.600000, 0.000000, 0),
+(38326, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(38327, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(38334, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
+(38347, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(38350, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(38394, 0x00000000, 5, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(38857, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(39027, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(39372, 0x00000030, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(39437, 0x00000004, 5, 0x00001364, 0x000000C0, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(39442, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0.000000, 0.000000, 0),
+(39443, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(39530, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(39958, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.700000, 0.000000, 40),
+(40407, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0),
+(40438, 0x00000000, 6, 0x00008040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40442, 0x00000000, 7, 0x00000014, 0x00000440, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40444, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(40458, 0x00000000, 4, 0x02000000, 0x00000601, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40463, 0x00000000, 11, 0x00000081, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40470, 0x00000000, 10, 0xC0800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40475, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 3.000000, 0.000000, 0),
+(40478, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40482, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(40485, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(40899, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(41034, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(41260, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(41262, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(41381, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0.000000, 0.000000, 0),
+(41393, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
+(41434, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.000000, 0.000000, 45),
+(41469, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 0),
+(41635, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0),
+(41989, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.500000, 0.000000, 0),
+(42083, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45),
+(42135, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 90),
+(42136, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 90),
+(42368, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(42370, 0x00000000, 11, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(42770, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(43019, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(43020, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(43338, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(43443, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(43726, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43728, 0x00000000, 11, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43737, 0x00000000, 7, 0x00000000, 0x00000440, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(43739, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43741, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43745, 0x00000000, 10, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43748, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43750, 0x00000000, 11, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(43819, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(44394, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(44395, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(44396, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0.000000, 0.000000, 0),
+(44401, 0x00000000, 3, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000FFF, 0.000000, 0.000000, 0),
+(44404, 0x00000000, 3, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44442, 0x00000000, 3, 0x00800000, 0x00000040, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 1),
+(44443, 0x00000000, 3, 0x00800000, 0x00000040, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 1),
+(44445, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44446, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44448, 0x00000000, 3, 0x00000013, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44449, 0x00000000, 3, 0x20E21277, 0x00019048, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(44469, 0x00000000, 3, 0x20E21277, 0x00019048, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(44470, 0x00000000, 3, 0x20E21277, 0x00019048, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(44471, 0x00000000, 3, 0x20E21277, 0x00019048, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(44472, 0x00000000, 3, 0x20E21277, 0x00019048, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(44546, 0x00000000, 3, 0x020002A0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44548, 0x00000000, 3, 0x020002A0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44549, 0x00000000, 3, 0x020002A0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(44835, 0x00000000, 7, 0x00000000, 0x00000080, 0x00000000, 0x00000010, 0x00000000, 0.000000, 0.000000, 0),
+(45054, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 15),
+(45057, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(45234, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(45243, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(45244, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(45354, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(45481, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(45482, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(45483, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(45484, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 45),
+(46025, 0x00000020, 6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(46092, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(46098, 0x00000000, 11, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(46569, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(46662, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 20),
+(46832, 0x00000000, 7, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(46854, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46855, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46867, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46913, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46914, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46915, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46916, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(46951, 0x00000000, 4, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(46952, 0x00000000, 0, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(46953, 0x00000000, 0, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47195, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(47196, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(47197, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(47201, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(47202, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47203, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47204, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47205, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47232, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(47234, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(47235, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(47245, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47246, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47247, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47258, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(47259, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(47260, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(47263, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 20),
+(47264, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 20),
+(47265, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 20),
+(47509, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(47511, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(47515, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(47516, 0x00000000, 6, 0x00001800, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47517, 0x00000000, 6, 0x00001800, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47535, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47536, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47537, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47538, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47539, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47549, 0x00000000, 6, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47551, 0x00000000, 6, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47552, 0x00000000, 6, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47555, 0x00000000, 6, 0x00001800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47556, 0x00000000, 6, 0x00001800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47557, 0x00000000, 6, 0x00001800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47572, 0x00000000, 6, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(47580, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(47581, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(47582, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(48110, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0),
+(48111, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0),
+(48112, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0),
+(48113, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0.000000, 0.000000, 0),
+(48159, 0x00000000, 6, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48160, 0x00000000, 6, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48483, 0x00000000, 7, 0x00008800, 0x00000440, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48484, 0x00000000, 7, 0x00008800, 0x00000440, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48485, 0x00000000, 7, 0x00008800, 0x00000440, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48496, 0x00000000, 7, 0x00000060, 0x02000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(48499, 0x00000000, 7, 0x00000060, 0x02000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(48500, 0x00000000, 7, 0x00000060, 0x02000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(48506, 0x00000000, 7, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48510, 0x00000000, 7, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48511, 0x00000000, 7, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48516, 0x00000000, 7, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 30),
+(48521, 0x00000000, 7, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 30),
+(48525, 0x00000000, 7, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 30),
+(48833, 0x00000000, 7, 0x00000000, 0x00000440, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48835, 0x00000000, 10, 0x00000000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48837, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(48951, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(48952, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(48988, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(49018, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49137, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49188, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49208, 0x00000000, 15, 0x00440000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49222, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(49280, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(49281, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(49283, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(49284, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(49503, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(49504, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(49529, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49530, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49531, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49532, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(49622, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
+(49657, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(50781, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51123, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51127, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51128, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51129, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51130, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(51349, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(51352, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(51359, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
+(51466, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51470, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51474, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(51478, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(51479, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(51556, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51557, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51558, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51562, 0x00000000, 11, 0x00000100, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51563, 0x00000000, 11, 0x00000100, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51564, 0x00000000, 11, 0x00000100, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51565, 0x00000000, 11, 0x00000100, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51566, 0x00000000, 11, 0x00000100, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51625, 0x00000000, 8, 0x1000A000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51626, 0x00000000, 8, 0x1000A000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51627, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(51628, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(51629, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
+(51634, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51635, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51636, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51664, 0x00000000, 8, 0x00020000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51665, 0x00000000, 8, 0x00020000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51667, 0x00000000, 8, 0x00020000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51668, 0x00000000, 8, 0x00020000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51669, 0x00000000, 8, 0x00020000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51672, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 1),
+(51674, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 1),
+(51679, 0x00000000, 8, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(51692, 0x00000000, 8, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51696, 0x00000000, 8, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(51698, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 1),
+(51700, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 1),
+(51701, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 1),
+(51940, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 20.000000, 0),
+(51989, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 20.000000, 0),
+(52004, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 20.000000, 0),
+(52005, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 20.000000, 0),
+(52007, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 20.000000, 0),
+(52008, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 20.000000, 0),
+(52020, 0x00000000, 7, 0x00008000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(52127, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(52129, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(52131, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(52134, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(52136, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(52138, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(52420, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
+(52423, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
+(52795, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(52797, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(52798, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(52799, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(52800, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(52898, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53137, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53138, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53215, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53216, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53217, 0x00000000, 9, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53221, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53222, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53224, 0x00000000, 9, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53228, 0x00000000, 9, 0x00000020, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53232, 0x00000000, 9, 0x00000020, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53256, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53259, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53260, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53290, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53291, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53292, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53293, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53294, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53380, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53381, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53382, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53383, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53384, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53486, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53488, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53501, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53502, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53503, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53551, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53552, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53553, 0x00000000, 10, 0x00001000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53569, 0x00000000, 10, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53576, 0x00000000, 10, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(53601, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 6),
+(53671, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(53673, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54149, 0x00000000, 10, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(54151, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54154, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54155, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54278, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(54486, 0x00000000, 0, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54488, 0x00000000, 0, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54489, 0x00000000, 0, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54490, 0x00000000, 0, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54738, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(54747, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(54749, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(54754, 0x00000000, 7, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54841, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(54936, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54937, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(54939, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55440, 0x00000000, 11, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55620, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55623, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55666, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55667, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55668, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55669, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55670, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55677, 0x00000000, 6, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55680, 0x00000000, 6, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(55689, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(56218, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56333, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56336, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56337, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56342, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56343, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56344, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56364, 0x00000000, 3, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56451, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(56611, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(56612, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(56613, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(56614, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(56636, 0x00000000, 4, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56637, 0x00000000, 4, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56638, 0x00000000, 4, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56821, 0x00000000, 8, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(56822, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56834, 0x00000000, 15, 0x00440000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(56835, 0x00000000, 15, 0x00440000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(57878, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
+(57880, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
+(57881, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
+(57960, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3),
+(58357, 0x00000000, 4, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(58364, 0x00000000, 4, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58372, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58386, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
+(58435, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58436, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58437, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58616, 0x00000000, 15, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58620, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58626, 0x00000000, 15, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58631, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58642, 0x00000000, 15, 0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58644, 0x00000000, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58647, 0x00000000, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58676, 0x00000000, 15, 0x00000000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58677, 0x00000000, 15, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(58872, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(58874, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
+(58901, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(59057, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(59176, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(59327, 0x00000000, 15, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(59725, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
+(60132, 0x00000000, 15, 0x00000000, 0x08020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60170, 0x00000000, 5, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60172, 0x00000000, 5, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
+(60493, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
+(60503, 0x00000000, 4, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60537, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
+(60564, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60571, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60572, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60573, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60574, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60575, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60617, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
+(60710, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60717, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60719, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60722, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60724, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60726, 0x00000000, 7, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60770, 0x00000000, 11, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60818, 0x00000000, 10, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(60826, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(61188, 0x00000000, 5, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(61257, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000202A8, 0x00010000, 0.000000, 0.000000, 0),
+(61324, 0x00000000, 10, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
+(61846, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0),
+(61847, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0);
+/*!40000 ALTER TABLE `spell_proc_event` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for spell_bonus_data
+--
+DROP TABLE IF EXISTS `spell_bonus_data`;
+CREATE TABLE `spell_bonus_data` (
+ `entry` smallint(5) unsigned NOT NULL,
+ `direct_bonus` float NOT NULL default '0',
+ `dot_bonus` float NOT NULL default '0',
+ `ap_bonus` float NOT NULL default '0',
+ `comments` varchar(255) default NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+LOCK TABLES `spell_bonus_data` WRITE;
+/*!40000 ALTER TABLE `spell_bonus_data` DISABLE KEYS */;
+INSERT INTO `spell_bonus_data` VALUES
+('5185', '1.6104', '0', '0', 'Druid - Healing Touch'),
+('33763', '0', '0.09518', '0', 'Druid - Lifebloom'),
+('774', '0', '0.37604', '0', 'Druid - Rejuvenation'),
+('8936', '0.539', '0.188', '0', 'Druid - Regrowth'),
+('18562', '0', '0', '0', 'Druid - Swiftmend'),
+('44203', '0.538', '0', '0', 'Druid - Tranquility Triggered'),
+('48438', '0', '0.11505', '0', 'Druid - Wild Growth'),
+('50464', '0.6611', '0', '0', 'Druid - Nourish'),
+('339', '0', '0.1', '0', 'Druid - Entangling Roots'),
+('42231', '0.12898', '0', '0', 'Druid - Hurricane Triggered'),
+('5570', '0', '0.127', '0', 'Druid - Insect Swarm'),
+('8921', '0.1515', '0.13', '0', 'Druid - Moonfire'),
+('2912', '1', '0', '0', 'Druid - Starfire'),
+('5176', '0.5714', '0', '0', 'Druid - Wrath'),
+('30451', '0.7143', '0', '0', 'Mage - Arcane Blast'),
+('1449', '0.2128', '0', '0', 'Mage - Arcane Explosion'),
+('7268', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 1'),
+('7269', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 2'),
+('7270', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 3'),
+('8419', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 4'),
+('8418', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 5'),
+('10273', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 6'),
+('10274', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 7'),
+('25346', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 8'),
+('27076', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 9'),
+('38700', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 10'),
+('38703', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 11'),
+('42844', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 12'),
+('42845', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 13'),
+('1463', '0.8053', '0', '0', 'Mage - Mana Shield'),
+('44425', '0.8571', '0', '0', 'Mage - Arcane Barrage'),
+('11113', '0.1357', '0', '0', 'Mage - Blast Wave Rank'),
+('31661', '0.1357', '0', '0', 'Mage - Dragons Breath'),
+('2136', '0.4286', '0', '0', 'Mage - Fire Blast'),
+('133', '1', '0', '0', 'Mage - Fire Ball'),
+('2120', '0.2357', '0.122', '0', 'Mage - Flamestrike'),
+('11366', '1.15', '0.05', '0', 'Mage - Pyroblast'),
+('2948', '0.4286', '0', '0', 'Mage - Scorch'),
+('44614', '0.8571', '0', '0', 'Mage - Frostfire Bolt'),
+('44457', '0.4', '0.2', '0', 'Mage - Living Bomb'),
+('42208', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 1'),
+('42209', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 2'),
+('42210', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 3'),
+('42211', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 4'),
+('42212', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 5'),
+('42213', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 6'),
+('42198', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 7'),
+('42937', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 8'),
+('42938', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 9'),
+('120', '0.1357', '0', '0', 'Mage - Cone of Cold'),
+('122', '0.193', '0', '0', 'Mage - Frost Nova'),
+('116', '0.8143', '0', '0', 'Mage - Frost Bolt'),
+('11426', '0.8053', '0', '0', 'Mage - Ice Barrier'),
+('30455', '0.1429', '0', '0', 'Mage - Ice Lance'),
+('34913','0', '0', '0', 'Mage - Molten Armor Triggered Rank 1'),
+('43043','0', '0', '0', 'Mage - Molten Armor Triggered Rank 2'),
+('43044','0', '0', '0', 'Mage - Molten Armor Triggered Rank 3'),
+('19750','0.4286', '0', '0', 'Paladin - Flash of Light'),
+('635', '0.7143', '0', '0', 'Paladin - Holy Light'),
+('25912', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 1'),
+('25911', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 2'),
+('25902', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 3'),
+('27176', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 4'),
+('33073', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 5'),
+('48822', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 6'),
+('48823', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 7'),
+('25914', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 1'),
+('25913', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 2'),
+('25903', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 3'),
+('27175', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 4'),
+('33074', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 5'),
+('48820', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 6'),
+('48821', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 7'),
+('31935', '0.07', '0', '0.07', 'Paladin - Avengers Shiled'),
+('26573', '0', '0.04', '0.04', 'Paladin - Consecration'),
+('879', '0.15', '0', '0.15', 'Paladin - Exorcism'),
+('24275', '0.15', '0', '0.15', 'Paladin - Hammer of Wrath'),
+('20925', '0.09', '0', '0.056', 'Paladin - Holy Shield'),
+('2812', '0.07', '0', '0.07', 'Paladin - Holy Wrath'),
+('31893', '0.25', '0', '0.16', 'Paladin - Seal of Blood Enemy Proc'),
+('32221', '0.25', '0', '0.16', 'Paladin - Seal of Blood Self Proc'),
+('20424', '0.25', '0', '0.16', 'Paladin - Seal of Command Proc'),
+('379', '0', '0', '0', 'Shaman - Earth Shield Triggered'),
+('20167', '0.25', '0', '0.16', 'Paladin - Seal of Light Proc'),
+('53719', '0.25', '0', '0.16', 'Paladin - Seal of The Martyr Enemy Proc'),
+('53718', '0.25', '0', '0.16', 'Paladin - Seal of The Martyr Self Proc'),
+('25742', '0.07', '0', '0.039', 'Paladin - Seal of Righteousness Dummy Proc'),
+('53595', '0', '0', '0','Paladin - Hammer of the Righteous'),
+('31803', '0', '0.013', '0.15', 'Paladin - Holy Vengeance'),
+('52042', '0.045', '0', '0', 'Shaman - Healing Stream Totem Triggered Heal'),
+('32546', '0.8068', '0', '0', 'Priest - Binding Heal'),
+('34861', '0.402', '0', '0', 'Priest - Circle of Healing'),
+('19236', '0.8068', '0', '0', 'Priest - Desperate Prayer'),
+('2061', '0.8068', '0', '0', 'Priest - Flash Heal'),
+('2060', '1.6135', '0', '0', 'Priest - Greater Heal'),
+('23455', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 1'),
+('23458', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 2'),
+('23459', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 3'),
+('27803', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 4'),
+('27804', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 5'),
+('27805', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 6'),
+('25329', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 7'),
+('17', '0.8068', '0', '0', 'Priest - Power Word: Shield'),
+('596', '0.8086', '0', '0', 'Priest - Prayer of Healing'),
+('33110', '0.8068', '0', '0', 'Priest - Prayer of Mending Heal Proc'),
+('139', '0', '0.376', '0', 'Priest - Renew'),
+('2944', '0.1849', '0', '0', 'Priest - Devouring Plague'),
+('14914', '0.5711', '0.024', '0', 'Priest - Holy Fire'),
+('15237', '0.1606', '0', '0', 'Priest - Holy Nova Damage'),
+('8129', '0', '0', '0', 'Priest - Mana Burn'),
+('8092', '0.4296', '0', '0', 'Priest - Mind Blast'),
+('15407', '0.257', '0', '0', 'Priest - Mind Flay'),
+('49821', '0.14286', '0', '0', 'Priest - Mind Sear Trigger Rank 1'),
+('53022', '0.14286', '0', '0', 'Priest - Mind Sear Trigger Rank 2'),
+('34433', '0.65', '0', '0', 'Priest - Shadowfiend'),
+('32379', '0.4296', '0', '0', 'Priest - Shadow Word: Death'),
+('589', '0', '0.1829', '0', 'Priest - Shadow Word: Pain'),
+('585', '0.714', '0', '0', 'Priest - Smite'),
+('34914', '0', '0.4', '0', 'Priest - Vampiric Touch'),
+('974', '0.4762', '0', '0', 'Shaman - Earth Shield'),
+('1064', '1.34', '0', '0', 'Shaman - Chain Heal'),
+('331', '1.6106', '0', '0', 'Shaman - Healing Wave'),
+('8004', '0.8082', '0', '0', 'Shaman - Lesser Healing Wave'),
+('61295', '0.4', '0.18', '0', 'Shaman - Riptide'),
+('421', '0.57', '0', '0', 'Shaman - Chain Lightning'),
+('8042', '0.3858', '0', '0', 'Shaman - Earth Shock'),
+('8443', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 1'),
+('8504', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 2'),
+('8505', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 3'),
+('11310', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 4'),
+('11311', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 5'),
+('25538', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 6'),
+('25539', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 7'),
+('61651', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 8'),
+('61660', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 9'),
+('8050', '0.2142', '0.1', '0', 'Shaman - Flame Shock'),
+('8026', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 1'),
+('8028', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 2'),
+('8029', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 3'),
+('10445', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 4'),
+('16343', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 5'),
+('16344', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 6'),
+('25488', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 7'),
+('58786', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 8'),
+('58787', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 9'),
+('58788', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 10'),
+('8056', '0.3858', '0', '0', 'Shaman - Frost Shock'),
+('8034', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 1'),
+('8037', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 2'),
+('10458', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 3'),
+('16352', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 4'),
+('16353', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 5'),
+('25501', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 6'),
+('58797', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 7'),
+('58798', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 8'),
+('58799', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 9'),
+('51505', '0.5714', '0', '0', 'Shaman - Lava Burst'),
+('403', '0.7143', '0', '0', 'Shaman - Lightning Bolt'),
+('26364', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 1'),
+('26365', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 2'),
+('26366', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 3'),
+('26367', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 4'),
+('26369', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 5'),
+('26370', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 6'),
+('26363', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 7'),
+('26371', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 8'),
+('26372', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 9'),
+('49278', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 10'),
+('49279', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 11'),
+('8188', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 1'),
+('10582', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 2'),
+('10583', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 3'),
+('10584', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 4'),
+('25551', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 5'),
+('58733', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 6'),
+('58736', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 7'),
+('3606', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 1'),
+('6350', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 2'),
+('6351', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 3'),
+('6352', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 4'),
+('10435', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 5'),
+('10436', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 6'),
+('25530', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 7'),
+('58700', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 8'),
+('58701', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 9'),
+('58702', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 10'),
+('980', '0', '0.1', '0', 'Warlock - Curse of Agony'),
+('603', '0', '2', '0', 'Warlock - Curse of Doom'),
+('172', '0', '0.3', '0', 'Warlock - Corruption'),
+('348', '0.2', '0.2', '0', 'Warlock - Immolate'),
+('27243', '0.22', '0.25', '0', 'Warlock - Seed of Corruption'),
+('18265', '0', '0.1', '0', 'Warlock - Siphon Life'),
+('30108', '0', '0.24', '0', 'Warlock - Unstable Affliction'),
+('31117', '1.8', '0', '0', 'Warlock - Unstable Affliction Dispell'),
+('17962', '0.4286', '0', '0', 'Warlock - Conflagrate'),
+('6789', '0.22', '0', '0', 'Warlock - Death Coil'),
+('28176', '0', '0', '0', 'Warlock - Fel Armor'),
+('48181', '0.4729', '0', '0', 'Warlock - Haunt'),
+('29722', '0.7143', '0', '0', 'Warlock - Incinerate'),
+('5676', '0.4286', '0', '0', 'Warlock - Searing Pain'),
+('686', '0.8571', '0', '0', 'Warlock - Shadow Bolt'),
+('17877', '0.4286', '0', '0', 'Warlock - Shadowburn'),
+('30283', '0.195', '0', '0', 'Warlock - Shadowfury'),
+('6353', '1.15', '0', '0', 'Warlock - Soul Fire'),
+('689', '0', '0.1428', '0', 'Warlock - Drain Life'),
+('5138', '0', '0', '0', 'Warlock - Drain Mana'),
+('1120', '0', '0.4286', '0', 'Warlock - Drain Soul'),
+('755', '0', '0.4485', '0', 'Warlock - Health Funnel'),
+('1949', '0', '0.0946', '0', 'Warlock - Hellfire'),
+('5857', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 1'),
+('11681', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 2'),
+('11682', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 3'),
+('27214', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 4'),
+('47822', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 5'),
+('42223', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 1'),
+('42224', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 2'),
+('42225', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 3'),
+('42226', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 4'),
+('42218', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 5'),
+('47817', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 6'),
+('47818', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 7'),
+('18220', '0.96', '0', '0', 'Warlock - Dark Pact Rank 1'),
+('18937', '0.96', '0', '0', 'Warlock - Dark Pact Rank 2'),
+('18938', '0.96', '0', '0', 'Warlock - Dark Pact Rank 3'),
+('27265', '0.96', '0', '0', 'Warlock - Dark Pact Rank 4'),
+('59092', '0.96', '0', '0', 'Warlock - Dark Pact Rank 5'),
+('6229', '0.3', '0', '0', 'Warlock - Shadow Ward');
+/*!40000 ALTER TABLE `spell_bonus_data` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_script_target`
+--
+
+DROP TABLE IF EXISTS `spell_script_target`;
+CREATE TABLE `spell_script_target` (
+ `entry` mediumint(8) unsigned NOT NULL,
+ `type` tinyint(3) unsigned NOT NULL default '0',
+ `targetEntry` mediumint(8) unsigned NOT NULL default '0',
+ UNIQUE KEY `entry_type_target` (`entry`,`type`,`targetEntry`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Spell System';
+
+--
+-- Dumping data for table `spell_script_target`
+--
+
+LOCK TABLES `spell_script_target` WRITE;
+/*!40000 ALTER TABLE `spell_script_target` DISABLE KEYS */;
+/*!40000 ALTER TABLE `spell_script_target` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_scripts`
+--
+
+DROP TABLE IF EXISTS `spell_scripts`;
+CREATE TABLE `spell_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `spell_scripts`
+--
+
+LOCK TABLES `spell_scripts` WRITE;
+/*!40000 ALTER TABLE `spell_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `spell_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_target_position`
+--
+
+DROP TABLE IF EXISTS `spell_target_position`;
+CREATE TABLE `spell_target_position` (
+ `id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Identifier',
+ `target_map` smallint(5) unsigned NOT NULL default '0',
+ `target_position_x` float NOT NULL default '0',
+ `target_position_y` float NOT NULL default '0',
+ `target_position_z` float NOT NULL default '0',
+ `target_orientation` float NOT NULL default '0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Spell System';
+
+--
+-- Dumping data for table `spell_target_position`
+--
+
+LOCK TABLES `spell_target_position` WRITE;
+/*!40000 ALTER TABLE `spell_target_position` DISABLE KEYS */;
+/*!40000 ALTER TABLE `spell_target_position` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `spell_threat`
+--
+
+DROP TABLE IF EXISTS `spell_threat`;
+CREATE TABLE `spell_threat` (
+ `entry` mediumint(8) unsigned NOT NULL,
+ `Threat` smallint(6) NOT NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
+
+--
+-- Dumping data for table `spell_threat`
+--
+
+LOCK TABLES `spell_threat` WRITE;
+/*!40000 ALTER TABLE `spell_threat` DISABLE KEYS */;
+INSERT INTO `spell_threat` VALUES
+(78,20),
+(284,39),
+(285,59),
+(770,108),
+(778,108),
+(1608,78),
+(1672,180),
+(1715,61),
+(2139,300),
+(6343,17),
+(6572,155),
+(6574,195),
+(6809,89),
+(7372,101),
+(7373,141),
+(7379,235),
+(7386,100),
+(7405,140),
+(8198,40),
+(8204,64),
+(8205,96),
+(8380,180),
+(8972,118),
+(9745,148),
+(9749,108),
+(9880,178),
+(9881,207),
+(9907,108),
+(11556,43),
+(11564,98),
+(11565,118),
+(11566,137),
+(11567,145),
+(11580,143),
+(11581,180),
+(11596,220),
+(11597,261),
+(11600,275),
+(11601,315),
+(11775,395),
+(14274,200),
+(14921,415),
+(15629,300),
+(15630,400),
+(15631,500),
+(15632,600),
+(16857,108),
+(17735,200),
+(17750,300),
+(17751,450),
+(17752,600),
+(17390,108),
+(17391,108),
+(17392,108),
+(20569,100),
+(20736,100),
+(20925,20),
+(20927,30),
+(20928,40),
+(23922,160),
+(23923,190),
+(23924,220),
+(23925,250),
+(24394,580),
+(24583,5),
+(25225,300),
+(25231,130),
+(25258,286),
+(25264,215),
+(25269,400),
+(25286,175),
+(25288,355),
+(25289,60),
+(26993,127),
+(26996,176),
+(27011,127),
+(27179,54),
+(29704,230),
+(29707,196),
+(30324,220),
+(30356,323),
+(30357,483),
+(33745,285),
+(33878,129),
+(33986,180),
+(33987,232);
+/*!40000 ALTER TABLE `spell_threat` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `transports`
+--
+
+DROP TABLE IF EXISTS `transports`;
+CREATE TABLE `transports` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `name` text,
+ `period` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Transports';
+
+--
+-- Dumping data for table `transports`
+--
+
+LOCK TABLES `transports` WRITE;
+/*!40000 ALTER TABLE `transports` DISABLE KEYS */;
+/*!40000 ALTER TABLE `transports` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `uptime`
+--
+
+DROP TABLE IF EXISTS `uptime`;
+CREATE TABLE `uptime` (
+ `starttime` bigint(20) unsigned NOT NULL default '0',
+ `startstring` varchar(64) NOT NULL default '',
+ `uptime` bigint(20) unsigned NOT NULL default '0',
+ `maxplayers` smallint(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`starttime`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Uptime system';
+
+--
+-- Dumping data for table `uptime`
+--
+
+LOCK TABLES `uptime` WRITE;
+/*!40000 ALTER TABLE `uptime` DISABLE KEYS */;
+/*!40000 ALTER TABLE `uptime` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2008-03-30 15:34:54
diff --git a/sql/realmd.sql b/sql/realmd.sql
index 3e0b3774145..2e2be75ef47 100644
--- a/sql/realmd.sql
+++ b/sql/realmd.sql
@@ -2,7 +2,7 @@
--
-- Host: localhost Database: realmd
-- ------------------------------------------------------
--- Server version 5.0.34-log
+-- Server version 5.0.45-Debian_1ubuntu3.1-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -22,13 +22,13 @@
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` bigint(20) unsigned NOT NULL auto_increment COMMENT 'Identifier',
- `username` varchar(32) NOT NULL,
+ `username` varchar(32) NOT NULL default '',
`sha_pass_hash` varchar(40) NOT NULL default '',
`gmlevel` tinyint(3) unsigned NOT NULL default '0',
`sessionkey` longtext,
`v` longtext,
`s` longtext,
- `email` varchar(320) NOT NULL default '',
+ `email` text,
`joindate` timestamp NOT NULL default CURRENT_TIMESTAMP,
`last_ip` varchar(30) NOT NULL default '127.0.0.1',
`failed_logins` int(11) unsigned NOT NULL default '0',
@@ -41,7 +41,7 @@ CREATE TABLE `account` (
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
KEY `idx_gmlevel` (`gmlevel`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Account System';
+) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='Account System';
--
-- Dumping data for table `account`
@@ -49,6 +49,11 @@ CREATE TABLE `account` (
LOCK TABLES `account` WRITE;
/*!40000 ALTER TABLE `account` DISABLE KEYS */;
+/*INSERT INTO `account` VALUES
+(1,'ADMINISTRATOR','a34b29541b87b7e4823683ce6c7bf6ae68beaaac',3,'','0','0','','2006-04-25 10:18:56','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0),
+(2,'GAMEMASTER','7841e21831d7c6bc0b57fbe7151eb82bd65ea1f9',2,'','0','0','','2006-04-25 10:18:56','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0),
+(3,'MODERATOR','a7f5fbff0b4eec2d6b6e78e38e8312e64d700008',1,'','0','0','','2006-04-25 10:19:35','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0),
+(4,'PLAYER','3ce8a96d17c5ae88a30681024e86279f1a38c041',0,'','0','0','','2006-04-25 10:19:35','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0);*/
/*!40000 ALTER TABLE `account` ENABLE KEYS */;
UNLOCK TABLES;
@@ -83,11 +88,11 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `ip_banned`;
CREATE TABLE `ip_banned` (
`ip` varchar(32) NOT NULL default '127.0.0.1',
- `bandate` int(11) NOT NULL,
- `unbandate` int(11) NOT NULL,
+ `bandate` bigint(40) NOT NULL,
+ `unbandate` bigint(40) NOT NULL,
`bannedby` varchar(50) NOT NULL default '[Console]',
- `banreason` varchar(50) NOT NULL default 'no reason',
- PRIMARY KEY (`ip`)
+ `banreason` varchar(255) NOT NULL default 'no reason',
+ PRIMARY KEY (`ip`,`bandate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Banned IPs';
--
@@ -137,7 +142,7 @@ CREATE TABLE `realmlist` (
`population` float unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System';
+) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System';
--
-- Dumping data for table `realmlist`
@@ -145,6 +150,8 @@ CREATE TABLE `realmlist` (
LOCK TABLES `realmlist` WRITE;
/*!40000 ALTER TABLE `realmlist` DISABLE KEYS */;
+INSERT INTO `realmlist` VALUES
+(1,'Trinity','127.0.0.1',8085,1,0,1,0,0);
/*!40000 ALTER TABLE `realmlist` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -157,5 +164,5 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2008-10-14 13:28:11
+-- Dump completed on 2008-01-10 11:37:06
diff --git a/sql/tools/Makefile.am b/sql/tools/Makefile.am
index 301aafceedb..c15007f86ed 100644
--- a/sql/tools/Makefile.am
+++ b/sql/tools/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/sql/trinityscript_script_texts.sql b/sql/trinityscript_script_texts.sql
index b2d0e8c1471..556d330685b 100644
--- a/sql/trinityscript_script_texts.sql
+++ b/sql/trinityscript_script_texts.sql
@@ -26,20 +26,318 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1000104,'%s coming in fast! Prepare to fight!',0,0,7,'defias traitor SAY_AGGRO_1'),
(-1000105,'Help!',0,0,7,'defias traitor SAY_AGGRO_2');
+-- 722_world_scripts.sql
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1000140,'Let\'s go.',0,0,1,'lilatha SAY_START'),
+(-1000141,'$N, let\'s use the antechamber to the right.',0,0,1,'lilatha SAY_PROGRESS1'),
+(-1000142,'I can see the light at the end of the tunnel!',0,0,1,'lilatha SAY_PROGRESS2'),
+(-1000143,'There\'s Farstrider Enclave now, $C. Not far to go... Look out! Troll ambush!!',0,0,1,'lilatha SAY_PROGRESS3'),
+(-1000144,'Thank you for saving my life and bringing me back to safety, $N',0,0,1,'lilatha SAY_END1'),
+(-1000145,'Captain Helios, I\'ve been rescued from the Amani Catacombs. Reporting for duty, sir!',0,0,1,'lilatha SAY_END2'),
+(-1000146,'Liatha, get someone to look at those injuries. Thank you for bringing her back safely.',0,0,1,'lilatha CAPTAIN_ANSWER');
+
+-- 773_world_scripts.sql
+INSERT INTO script_texts (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `comment`) VALUES
+(-1000147, 'Lets go $N. I am ready to start to Whitereach Post.', NULL, NULL, 'Gehen wir $N.Ich bin bereit,mich zum Weissgipfelposten aufzumachen.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL),
+(-1000148, 'This seems to me trusted. If we move to the east, we are probably... Aah! Wyvern attack !', NULL, NULL, 'Das kommt mir vertraut vor.Wenn wir nach Osten ziehen,können wir wahrscheinlich...Aah!Flügeldrachen im Angriff!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL),
+(-1000149, 'Thanks so much... From here I find the way back to the Whitereach Post. Speak with Motega Firemane, maybe you can persuade him to send me home.', NULL, NULL, 'Tausend Dank...Von hier aus finde ich den Rückweg zum Weissgipfelposten.Sprecht unbedingt mit Motega Feuermähne,vielleicht könnt ihr ihn überreden,mich nach Hause zu schicken.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL);
+
+-- 765_world_scripts.sql
+INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc2`, `type`, `language`, `comment`) VALUES
+(-1000150, 'Greetings, $N. I will guide you through the cavern. Please try and keep up.', 'Salutations, $N. Je vais vous guider a` travers cette grotte. Veuillez me suivre.', 4, 0, 'WHISPER_CUSTODIAN_1'),
+(-1000151, 'We do not know if the Caverns of Time have always been accessible to mortals. Truly, it is impossible to tell as the Timeless One is in perpetual motion, changing our timeways as he sees fit. What you see now may very well not exist tomorrow. You may wake up and have no memory of this place.', 'Nous ne savons pas si les Grottes du Temps ont toujours été accessibles aux mortels. Vraiment, c\'est impossible a` dire étant donné que l\'Intemporel est en mouvement perpétuel, changeant nos spirales temporelles comme bon lui semble. Ce que vous voyez aujourd\'hui peut tre`s bien ne plus exister demain. Vous pourriez vous réveiller sans aucun souvenir de cet endroit.', 4, 0, 'WHISPER_CUSTODIAN_2'),
+(-1000152, 'It is strange, I know... Most mortals cannot actually comprehend what they see here, as often, what they see is not anchored within their own perception of reality.', 'C\'est étrange, je sais... La plupart des mortels ne peuvent pas réellement comprendre ce qu\ils voient ici, comme souvent, ce qu\'ils voient n\'est pas ancré dans leur propre perception de la réalité.', 4, 0, 'WHISPER_CUSTODIAN_3'),
+(-1000153, 'Follow me, please.', 'Veuillez me suivre.', 4, 0, 'WHISPER_CUSTODIAN_4'),
+(-1000154, 'There are only two truths to be found here: First, that time is chaotic, always in flux, and completely malleable and second, perception does not dictate reality.', 'Il n\'y a que deux vérités qui peuvent e^tre trouvées ici : premie`rement, ce temps est chaotique, toujours en mouvement, et comple`tement malléable, et ensuite, la perception ne détermine pas la réalité.', 4, 0, 'WHISPER_CUSTODIAN_5'),
+(-1000155, 'As custodians of time, we watch over and care for Nozdormu\'s realm. The master is away at the moment, which means that attempts are being made to dramatically alter time. The master never meddles in the affairs of mortals but instead corrects the alterations made to time by others. He is reactionary in this regard.', 'En tant que protecteurs du temps, nous observons et veillons sur le royaume de Nozdormu. Le maître est absent en ce moment, ce qui signifie que des tentatives sont faites pour altérer fortement le temps. Le maître ne se me^le jamais des affaires des mortels mais il corrige les altérations faites au temps par d\'autres. Il est réactionnaire a` cet égard.', 4, 0, 'WHISPER_CUSTODIAN_6'),
+(-1000156, 'For normal maintenance of time, the Keepers of Time are sufficient caretakers. We are able to deal with most ordinary disturbances. I speak of little things, such as rogue mages changing something in the past to elevate their status or wealth in the present.', 'Pour le maintien normal du temps, les Gardiens du temps suffisent a` la tâche. Nous sommes capables de gérer les perturbations les plus ordinaires. Je parle de petites choses, comme des mages voleurs qui changent quelque chose dans le passé pour élever leur statut ou leur richesse dans le présent.', 4, 0, 'WHISPER_CUSTODIAN_7'),
+(-1000157, 'These tunnels that you see are called timeways. They are infinite in number. The ones that currently exist in your reality are what the master has deemed as \'trouble spots.\' These trouble spots may differ completely in theme but they always share a cause. That is, their existence is a result of the same temporal disturbance. Remember that should you venture inside one...', 'Ces tunnels que vous voyez sont appelés Voies Temporelles. Leur nombre est infini. Ceux qui existent actuellement dans votre réalité sont ceux que le maître a considérés comme \'points sensibles\'. Ces points sensibles peuvent différer comple`tement de part leur the`me, mais partagent toujours une cause. C\'est-a`-dire, leur existence est le résultat des me^mes perturbations temporelles. Rappelez-vous en si vous osez vous aventurer dans l\'un d\'eux...', 4, 0, 'WHISPER_CUSTODIAN_8'),
+(-1000158, 'This timeway is in great disarray! We have agents inside right now attempting to restore order. What information I have indicates that Thrall\'s freedom is in jeopardy. A malevolent organization known as the Infinite Dragonflight is trying to prevent his escape. I fear without outside assistance, all will be lost.', 'Cette voie temporelle est en grand désarroi ! Nous avons actuellement des agents a` l\intérieur qui tentent de restaurer l\'ordre. Les informations que j\'ai indiquent que la liberté de Thrall est en péril. Une organisation malveillante connue sous le nom de Vol du Dragon Infini essaye d\'empe^cher son évasion. J\'ai peur que sans assistance extérieure, tout soit perdu.', 4, 0, 'WHISPER_CUSTODIAN_9'),
+(-1000159, 'We have very little information on this timeway. Sa\'at has been dispatched and is currently inside. The data we have gathered from his correspondence is that the Infinite Dragonflight are once again attempting to alter time. Could it be that the opening of the Dark Portal is being targeted for sabotage? Let us hope not...', 'Nous avons tre`s peu d\'informations sur cette voie. Sa\'at a été envoyé et est actuellement sur place. Les données que nous avons recueillies de sa correspondance est que le Vol du Dragon Infini tente une fois de plus d\'altérer le temps. Se pourrait-il que l\'ouverture de la Porte des Téne`bres soit la cible d\'un sabotage. Espérons que non...', 4, 0, 'WHISPER_CUSTODIAN_10'),
+(-1000160, 'This timeway is currently collapsing. What that may hold for the past, present and future is currently unknown...', 'Cette voie est en train de s\'effondrer. Ce qu\'elle peut avoir contenu dans le passé, le présent et le futur nous est actuellement inconnu...', 4, 0, 'WHISPER_CUSTODIAN_11'),
+(-1000161, 'The timeways are currently ranked in order from least catastrophic to most catastrophic. Note that they are all classified as catastrophic, meaning that any single one of these timeways collapsing would mean that your world would end. We only classify them in such a way so that the heroes and adventurers that are sent here know which timeway best suits their abilities.', 'Les voies sont pour le moment classées de la moins catastrophique a` la plus catastrophique, ce qui veut dire que la moindre de celles-ci qui s\'effondre signifierait la fin de votre monde. Nous les classons seulement de cette façon pour que les héros et aventuriers qui y sont envoyés sachent quelle voie est la plus adaptée a` leurs compétences.', 4, 0, 'WHISPER_CUSTODIAN_12'),
+(-1000162, 'All we know of this timeway is that it leads to Mount Hyjal. The Infinite Dragonflight have gone to great lengths to prevent our involvement. We know next to nothing, mortal. Soridormi is currently attempting to break through the timeway\'s defenses but has thus far been unsuccessful. You might be our only hope of breaking through and resolving the conflict.', 'Tout ce que nous savons sur cette voie temporelle est qu\'elle me`ne au Mont Hyjal. Le Vol du Dragon Infini s\'est donné beaucoup de peine pour empe^cher notre participation. Soridormi est actuellement en train de tenter de briser les défenses de cette voie, mais ses efforts ont été vain jusqu\'ici. Vous pourriez e^tre notre seul espoir de les briser et de résoudre le conflit.', 4, 0, 'WHISPER_CUSTODIAN_13'),
+(-1000163, 'Our time is at an end $N. I would wish you luck, if such a thing existed.', 'Notre entretien touche a` sa fin, $N. Je vous souhaite bonne chance, si tant est qu\'une telle chose a jamais existé.', 4, 0, 'WHISPER_CUSTODIAN_14');
+
+-- 817_world_scripts.sql
+INSERT INTO script_texts (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `emote`, `comment`) VALUES
+(-1000200, 'A-Me good.Good A-me.Follow...A-ME follow.Home.A-ME go home.', NULL, NULL, 'A-ME gut.Gut A-Me.Folgen...Heim.A-ME geht heim.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1000201, 'Bad Un´Goro Stomper.Stomper evil.', NULL, NULL, 'Böser Stampfer von Un´Goro. Stampfer von Un´Goro böse.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1000202, 'Good..good,A-ME. Home. Search way.', NULL, NULL, 'Gut...gut.A-ME.A-ME gut.Heim.Heim suchen.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1000203, 'A-Me home.A-ME go home!Tar Lord dont disturb A-ME.', NULL, NULL, 'A-ME daheim.A-ME geht heim!Teerfürst A-ME nicht aufhalten.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1000204, 'Tar Lord A-ME no hurt.A-ME good.', NULL, NULL, 'Teerfürst A-ME nicht wehtun.A-ME gut.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1000205, 'A-ME at home!A-ME good!Good A-ME.At home.Home.Home', NULL, NULL, 'A-ME daheim!A-ME gut!Gute A-ME.Daheim.Daheim.Daheim', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL);
+
+-- 945_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+(-1000206, 'Come, $N. Lord Stormrage awaits.', 0, 1, 'OVERLORD_SAY_1'),
+(-1000207, 'Lord Illidan will be here shortly.', 0, 1, 'OVERLORD_SAY_2'),
+(-1000208, 'Lord Illidan, this is the Dragonmaw that I, and others, have told you about. He will lead us to victory!', 0, 1, 'OVERLORD_SAY_3'),
+(-1000209, 'But... My lord, I do not understand. $N... He is the orc that has...', 0, 1, 'OVERLORD_SAY_4'),
+(-1000210, 'It will be done, my lord.', 0, 1, 'OVERLORD_SAY_5'),
+(-1000211, 'So you thought to make a fool of Mor\'ghor, eh? Before you are delivered to Lord Illidan, you will feel pain that you could not know to exist. I will take pleasure in exacting my own vengeance.', 0, 25, 'OVERLORD_SAY_6'),
+(-1000212, 'Warriors of Dragonmaw, gather \'round! One among you has attained the rank of highlord! Bow your heads in reverence! Show your respect and allegiance to Highlord $N!', 1, 22, 'OVERLORD_YELL_1'),
+(-1000213, 'All hail Lord Illidan!', 1, 66, 'OVERLORD_YELL_2'),
+(-1000214, 'What is the meaning of this, Mor\'ghor?', 0, 1, 'LORD_ILLIDAN_SAY_1'),
+(-1000215, 'SILENCE!', 0, 22, 'LORD_ILLIDAN_SAY_2'),
+(-1000216, 'Blathering idiot. You incomprehensibly incompetent buffoon...', 0, 1, 'LORD_ILLIDAN_SAY_3'),
+(-1000217, 'THIS is your hero?', 0, 6, 'LORD_ILLIDAN_SAY_4'),
+(-1000218, 'You have been deceived, imbecile.', 0, 1, 'LORD_ILLIDAN_SAY_5'),
+(-1000219, 'This... whole... operation... HAS BEEN COMPROMISED!', 0, 22, 'LORD_ILLIDAN_SAY_6'),
+(-1000220, 'I expect to see this insect\'s carcass in pieces in my lair within the hour. Fail and you will suffer a fate so much worse than death.', 0, 1, 'LORD_ILLIDAN_SAY_7'),
+(-1000221, 'You will not harm the boy, Mor\'ghor! Quickly, $N, climb on my back!', 0, 22, 'YARZILL_THE_MERC_SAY');
+
+DELETE FROM script_texts WHERE entry='-1000222';
+INSERT INTO script_texts (entry, content_default, type, language, emote, comment) VALUES
+(-1000222, 'Thank you, mortal.', 0, 11, 1, 'SAY_JUST_EATEN');
+
+DELETE FROM script_texts WHERE entry BETWEEN -1000234 and -1000223;
+INSERT INTO script_texts (entry, content_default, emote, comment) VALUES
+(-1000223, 'I sense the tortured spirits, $N. They are this way, come quickly!', 1, 'SAY_START'),
+(-1000224, 'Watch out!', 0, 'SAY_AGGRO1'),
+(-1000225, 'Naga attackers! Defend yourself!', 0, 'SAY_AGGRO2'),
+(-1000226, 'Kill them all!', 0, 'ASSASSIN_SAY_AGGRO1'),
+(-1000227, 'You will never essscape Coilssskarrr...', 0, 'ASSASSIN_SAY_AGGRO2'),
+(-1000228, 'Grant me protection $N, i must break trough their foul magic!', 0, 'SAY_PROGRESS1'),
+(-1000229, 'The naga of Coilskar are exceptionally cruel to their prisoners. It is a miracle that I survived inside that watery prison for as long as I did. Earthmother be praised.', 0, 'SAY_PROGRESS2'),
+(-1000230, 'Now we must find the exit.', 0, 'SAY_PROGRESS3'),
+(-1000231, 'Lady Vashj must answer for these atrocities. She must be brought to justice!', 0, 'SAY_PROGRESS4'),
+(-1000232, 'The tumultuous nature of the great waterways of Azeroth and Draenor are a direct result of tormented water spirits.', 0, 'SAY_PROGRESS5'),
+(-1000233, 'It shouldn\'t be much further, $N. The exit is just up ahead.', 0, 'SAY_PROGRESS6'),
+(-1000234, 'Thank you, $N. Please return to my brethren at the Altar of Damnation, near the Hand of Gul\'dan, and tell them that Wilda is safe. May the Earthmother watch over you...', 0, 'SAY_END');
+
+-- 947_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+(-1000235, 'Ok, $N. Follow me to the cave where I\'ll attempt to harness the power of the rune stone into these goggles.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_1'),
+(-1000236, 'I discovered this cave on our first day here. I believe the energy in the stone can be used to our advantage.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_2'),
+(-1000237, 'I\'ll begin drawing energy from the stone. Your job, $N, is to defend me. This place is cursed... trust me.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_3'),
+(-1000238, 'begins tinkering with the goggles before the stone.', 2, 0, 'phizzlethorpe - EMOTE_PROGRESS_4'),
+(-1000239, 'Help!!! Get these things off me so I can get my work done!', 0, 0, 'SAY_AGGRO'),
+(-1000240, 'Almost done! Just a little longer!', 0, 1, 'phizzlethorpe - SAY_PROGRESS_5'),
+(-1000241, 'I\'ve done it! I have harnessed the power of the stone into the goggles! Let\'s get out of here!', 0, 1, 'phizzlethorpe - SAY_PROGRESS_6'),
+(-1000242, 'Phew! Glad to be back from that creepy cave.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_7'),
+(-1000243, 'hands one glowing goggles over to Doctor Draxlegauge.', 2, 0, 'phizzlethorpe - EMOTE_PROGRESS_8'),
+(-1000244, 'Doctor Draxlegauge will give you further instructions, $N. Many thanks for your help!', 0, 1, 'phizzlethorpe - SAY_PROGRESS_9');
+
+-- 948_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000245, 'You, there! Hand over that moonstone and nobody gets hurt!', 1, 'SAY_RIZZLE_START'),
+(-1000246, 'Just chill!', 4, 'SAY_RIZZLE_GRENADE'),
+(-1000247, 'All right, you win! I surrender! Just don\'t hurt me!', 1, 'SAY_RIZZLE_FINAL');
+
+-- 950_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+(-1000248, 'The last thing I remember is the ship falling and us getting into the pods. I\'ll go see how I can help. Thank you!', 0, 0, 'draenei survivor - HEAL1'),
+(-1000249, '$C, Where am I? Who are you? Oh no! What happened to the ship?.', 0, 0, 'draenei survivor - HEAL2'),
+(-1000250, '$C You saved me! I owe you a debt that I can never repay. I\'ll go see if I can help the others.', 0, 0, 'draenei survivor - HEAL3'),
+(-1000251, 'Ugh... what is this place? Is that all that\'s left of the ship over there?', 0, 0, 'draenei survivor - HEAL4'),
+(-1000252, 'Oh, the pain...', 0, 0, 'draenei survivor - HELP1'),
+(-1000253, 'Everything hurts, Please make it stop...', 0, 0, 'draenei survivor - HELP2'),
+(-1000254, 'Ughhh... I hurt. Can you help me?', 0, 0, 'draenei survivor - HELP3'),
+(-1000255, 'I don\'t know if I can make it, please help me...', 0, 0, 'draenei survivor - HELP4'),
+
+(-1000256, 'Yes Master, all goes along as planned.', 0, 1, 'overgrind - SAY_TEXT'),
+(-1000257, 'puts the shell to his ear.', 2, 0, 'overgrind - SAY_EMOTE'),
+(-1000258, 'Now I cut you!', 1, 0, 'overgrind - YELL_ATTACK'),
+
+(-1000259, 'What\'s the big idea, Spark?', 0, 0, 'geezle - GEEZLE_SAY_1'),
+(-1000260, 'What\'s the big idea? You nearly blew my cover, idiot! I told you to put the compass and navigation maps somewhere safe - not out in the open for any fool to discover.', 0, 0, 'geezle - SPARK_SAY_2'),
+(-1000261, 'The Master has gone to great lengths to secure information about the whereabouts of the Exodar. You could have blown the entire operation, including the cover of our spy on the inside.', 0, 0, 'geezle - SPARK_SAY_3'),
+(-1000262, 'Relax, Spark! I have it all under control. We\'ll strip mine the Exodar right out from under \'em - making both you and I very, very rich in the process.', 0, 0, 'geezle - GEEZLE_SAY_4'),
+(-1000263, 'Relax? Do you know what Kael\'thas does to those that fail him, Geezle? Eternal suffering and pain... Do NOT screw this up, fool.', 0, 0, 'geezle - SPARK_SAY_5'),
+(-1000264, 'Our Bloodmyst scouts have located our contact. The fool, Velen, will soon leave himself open and defenseless -- long enough for us to strike! Now get out of my sight before I vaporize you...', 0, 0, 'geezle - SPARK_SAY_6'),
+(-1000265, 'Yes, sir. It won\'t happen again...', 0, 0, 'geezle - GEEZLE_SAY_7'),
+(-1000266, 'picks up the naga flag.', 2, 0, 'geezle - EMOTE_SPARK');
+
+-- 951_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000267, 'Ready when you are, warrior.', 1, 'flathead - SAY_BIG_WILL_READY'),
+(-1000268, 'The Affray has begun, get ready to fight!', 1, 'flathead - SAY_TWIGGY_FLATHEAD_BEGIN'),
+(-1000269, 'You! Enter the fray!', 1, 'flathead - SAY_TWIGGY_FLATHEAD_FRAY'),
+(-1000270, 'Challenger is down!', 1, 'flathead - SAY_TWIGGY_FLATHEAD_DOWN'),
+(-1000271, 'The Affray is over.', 1, 'flathead - SAY_TWIGGY_FLATHEAD_OVER'),
+
+(-1000272, 'Alright, alright I think I can figure out how to operate this thing...', 0, 'shredder - SAY_PROGRESS_1'),
+(-1000273, 'Arrrgh! This isn\'t right!', 0, 'shredder - SAY_PROGRESS_2'),
+(-1000274, 'Okay, I think I\'ve got it, now. Follow me, $N!', 0, 'shredder - SAY_PROGRESS_3'),
+(-1000275, 'There\'s the stolen shredder! Stop it or Lugwizzle will have our hides!', 1, 'shredder - SAY_MERCENARY_4'),
+(-1000276, 'Looks like we\'re out of woods, eh? Wonder what this does...', 0, 'shredder - SAY_PROGRESS_5'),
+(-1000277, 'Come on, don\'t break down on me now!', 0, 'shredder - SAY_PROGRESS_6'),
+(-1000278, 'That was a close one! Well, let\'s get going, it\'s still a ways to Ratchet!', 0, 'shredder - SAY_PROGRESS_7'),
+(-1000279, 'Hmm... I don\'t think this blinking red light is a good thing...', 0, 'shredder - SAY_PROGRESS_8');
+
+-- 952_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, language, comment) VALUES
+(-1000280, 'Thank you, dear Paladin, you just saved my life.', 0, 7, 'faulk - SAY_HEAL'),
+
+(-1000281, 'Very well. Let\'s see what you have to show me, $N.', 0, 0, 'anvilvard - SAY_PR_1'),
+(-1000282, 'What manner of trick is this, $R? If you seek to ambush me, I warn you I will not go down quietly!', 0, 0, 'anvilvard - SAY_PR_2'),
+(-1000283, 'releases the last of its energies into the nerarby runestone, succesfully reactivating it.', 2, 0, 'crystal - EMOTE'),
+
+(-1000284, 'Deployment sucessful. Trespassers will be neutralized.', 0, 0, 'sentry - SAY_CONVERTED_1'),
+(-1000285, 'Objective acquired. Initiating security routines.', 0, 0, 'sentry - SAY_CONVERTED_1');
+
+-- 953_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+(-1000286, 'A shadowy, sinister presence has invader the Emerald Dream. Its power is poised to spill over into our world, $N. We must oppose it! That\'s why I cannot accompany you in person.', 0, 0, 'clintar_spirit'),
+(-1000287, 'The Emerald Dream will never be yours!', 0, 0, 'clintar_spirit'),
+(-1000288, 'Begone from this place!', 0, 0, 'clintar_spirit'),
+(-1000289, 'That\'s the first relic, but there are still two more. Follow me, $N.', 0, 0, 'clintar_spirit'),
+(-1000290, 'I\'ve recovered the second relic. Take a moment to rest, and then we\'ll continue to the last reliquary.', 0, 0, 'clintar_spirit'),
+(-1000291, 'We have all three of the relics, but my energy is rapidly fading. We must make our way back to Dreamwarden Lurosa! He will let you know what to do next.', 0, 0, 'clintar_spirit'),
+(-1000292, 'Lurosa, I am entrusting the Relics of Aviana to $N, who will take them to Morthis Whisperwing. I must return completely to the Emerald Dream now. Do not let $N fail!', 0, 0, 'clintar_spirit');
+
+-- 954_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000293, 'In Nagrand, food hunt ogre!', 0, 'LUMP_SAY0'),
+(-1000294, 'You taste good with maybe a little salt and pepper.', 0, 'LUMP_SAY1'),
+(-1000295, 'OK, OK! Lump give up!', 0, 'LUMP_DEFEAT'),
+
+(-1000296, 'Warning! Emergency shutdown process initiated by $N. Shutdown will complete in two minutes.', 2, 'npc_manaforge_control_console - EMOTE_START'),
+(-1000297, 'Emergency shutdown will complete in one minute.', 2, 'npc_manaforge_control_console - EMOTE_60'),
+(-1000298, 'Emergency shutdown will complete in thirty seconds.', 2, 'npc_manaforge_control_console - EMOTE_30'),
+(-1000299, 'Emergency shutdown will complete in ten seconds.', 2, 'npc_manaforge_control_console - EMOTE_10'),
+(-1000300, 'Emergency shutdown complete.', 2, 'npc_manaforge_control_console - EMOTE_COMPLETE'),
+(-1000301, 'Emergency shutdown aborted.', 2, 'npc_manaforge_control_console - EMOTE_ABORT'),
+
+(-1000302, 'Saeed is currently engaged or awaiting orders to engage. You may check directly east of me and see if Saeed is ready for you. If he is not present then he is off fighting another battle. I recommend that you wait for him to return before attacking Dimensius.', 4, 'npc_professor_dabiri - WHISPER_DABIRI'),
+
+(-1000303, 'is very weak', 2, 'mob_phase_hunter - EMOTE_WEAK'),
+
+(-1000304, 'Bessy, is that you?', 0, 'npc_bessy- SAY_THADELL_1'),
+(-1000305, 'Thank you for bringing back my Bessy, $N. I couldn\'t live without her!', 0, 'npc_bessy- SAY_THADELL_2');
+
+-- 955_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000306, 'Follow me, stranger. This won\'t take long.', 0, 'npc_kservant - SAY1'),
+(-1000307, 'Shattrath was once the draenei capital of this world. Its name means \"dwelling of light.\"', 4, 'npc_kservant - WHISP1'),
+(-1000308, 'When the Burning Legion turned the orcs against the draenei, the fiercest battle was fought here. The draenei fought tooth and nail, but in the end the city fell.', 4, 'npc_kservant - WHISP2'),
+(-1000309, 'The city was left in ruins and darkness... until the Sha\'tar arrived.', 4, 'npc_kservant - WHISP3'),
+(-1000310, 'Let us go into the Lower City. I will warn you that as one of the only safe havens in Outland, Shattrath has attracted droves of refugees from all wars, current and past.', 4, 'npc_kservant - WHISP4'),
+(-1000311, 'The Sha\'tar, or \"born from light\" are the naaru that came to Outland to fight the demons of the Burning Legion.', 4, 'npc_kservant - WHISP5'),
+(-1000312, 'They were drawn to the ruins of Shattrath City where a small remnant of the draenei priesthood conducted its rites inside a ruined temple on this very spot.', 4, 'npc_kservant - WHISP6'),
+(-1000313, 'The priesthood, known as the Aldor, quickly regained its strength as word spread that the naaru had returned and reconstruction soon began. The ruined temple is now used as an infirmary for injured refugees.', 4, 'npc_kservant - WHISP7'),
+(-1000314, 'It wouldn\'t be long, however, before the city came under attack once again. This time, the attack came from Illidan\'s armies. A large regiment of blood elves had been sent by Illidan\'s ally, Kael\'thas Sunstrider, to lay waste to the city.', 4, 'npc_kservant - WHISP8'),
+(-1000315, 'As the regiment of blood elves crossed this very bridge, the Aldor\'s exarchs and vindicators lined up to defend the Terrace of Light. But then the unexpected happened.', 4, 'npc_kservant - WHISP9'),
+(-1000316, 'The blood elves laid down their weapons in front of the city\'s defenders; their leader, a blood elf elder known as Voren\'thal, stormed into the Terrace of Light and demanded to speak to A\'dal.', 4, 'npc_kservant - WHISP10'),
+(-1000317, 'As the naaru approached him, Voren\'thal kneeled before him and uttered the following words: \"I\'ve seen you in a vision, naaru. My race\'s only hope for survival lies with you. My followers and I are here to serve you.\"', 4, 'npc_kservant - WHISP11'),
+(-1000318, 'The defection of Voren\'thal and his followers was the largest loss ever incurred by Kael\'s forces. And these weren\'t just any blood elves. Many of the best and brightest amongst Kael\'s scholars and magisters had been swayed by Voren\'thal\'s influence.', 4, 'npc_kservant - WHISP12'),
+(-1000319, 'The naaru accepted the defectors, who would become known as the Scryers; their dwelling lies in the platform above. Only those initiated with the Scryers are allowed there.', 4, 'npc_kservant - WHISP13'),
+(-1000320, 'The Aldor are followers of the Light and forgiveness and redemption are values they understand. However, they found hard to forget the deeds of the blood elves while under Kael\'s command.', 4, 'npc_kservant - WHISP14'),
+(-1000321, 'Many of the priesthood had been slain by the same magisters who now vowed to serve the naaru. They were not happy to share the city with their former enemies.', 4, 'npc_kservant - WHISP15'),
+(-1000322, 'The Aldor\'s most holy temple and its surrounding dwellings lie on the terrace above. As a holy site, only the initiated are welcome inside.', 4, 'npc_kservant - WHISP16'),
+(-1000323, 'The attacks against Shattrath continued, but the city did not fall, as you can see. On the contrary, the naaru known as Xi\'ri led a successful incursion into Shadowmoon Valley - Illidan\'s doorstep.', 4, 'npc_kservant - WHISP17'),
+(-1000324, 'There he continues to wage war on Illidan with the assistance of the Aldor and the Scryers. The two factions have not given up on their old feuds, though.', 4, 'npc_kservant - WHISP18'),
+(-1000325, 'Such is their animosity that they vie for the honor of being sent to assist the naaru there. Each day, that decision is made here by A\'dal. The armies gather here to receive A\'dal\'s blessing before heading to Shadowmoon.', 4, 'npc_kservant - WHISP19'),
+(-1000326, 'Khadgar should be ready to see you again. Just remember that to serve the Sha\'tar you will most likely have to ally with the Aldor or the Scryers. And seeking the favor of one group will cause the others\' dislike.', 4, 'npc_kservant - WHISP20'),
+(-1000327, 'Good luck stranger, and welcome to Shattrath City.', 4, 'npc_kservant - WHISP21'),
+(-1000328, 'Time to teach you a lesson in manners, little boy!', 0, ''),
+(-1000329, 'Now I\'m gonna give you to the count of \'3\' to get out of here before I sick the dogs on you.', 0, ''),
+(-1000330, '1...', 0, ''),
+(-1000331, '2...', 0, ''),
+(-1000332, 'Time to meet your maker!', 0, ''),
+(-1000333, 'Alright, we give up! Don\'t hurt us!', 0, '');
+
+DELETE FROM script_texts WHERE entry=-1000334;
+INSERT INTO script_texts (entry, content_default, type, language, comment) VALUES
+(-1000334, 'Thank you, dear Paladin, you just saved my life.', 0, 10, 'stillblade - SAY_HEAL');
+
+DELETE FROM script_texts WHERE entry BETWEEN -1000349 and -1000335;
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000335, 'Let\'s get to the others, and keep an eye open for those wolves cutside...', 0, 'npc_deathstalker_erland
+- SAY_QUESTACCEPT'),
+(-1000336, 'Be careful, $N. Those wolves like to hide among the trees.', 0, 'npc_deathstalker_erland - SAY_START'),
+(-1000337, 'A $C attacks!', 0, 'npc_deathstalker_erland - SAY_AGGRO_1'),
+(-1000338, 'Beware! I am under attack!', 0, 'npc_deathstalker_erland - SAY_AGGRO_2'),
+(-1000339, 'We\'re almost there!', 0, 'npc_deathstalker_erland - SAY_LAST'),
+(-1000340, 'We made it! Thanks, $N. I couldn\'t have gotten without you.', 0, 'npc_deathstalker_erland - SAY_THANKS'),
+(-1000341, 'It\'s good to see you again, Erland. What is your report?', 0, 'npc_deathstalker_erland - SAY_RANE'),
+(-1000342, 'Masses of wolves are to the east, and whoever lived at Malden\'s Orchard is gone.', 0, 'npc_deathstalker_erland - SAY_ANSWER'),
+(-1000343, 'If I am excused, then I\'d like to check on Quinn...', 0, 'npc_deathstalker_erland - SAY_MOVE_QUINN'),
+(-1000344, 'Hello, Quinn. How are you faring?', 0, 'npc_deathstalker_erland - SAY_GREETINGS'),
+(-1000345, 'I\'ve been better. Ivar the Foul got the better of me...', 0, 'npc_deathstalker_erland - SAY_QUINN'),
+(-1000346, 'Try to take better care of yourself, Quinn. You were lucky this time.', 0, 'npc_deathstalker_erland - SAY_ON_BYE'),
+(-1000347, 'Let\'s go before they find out I\'m free!', 0, 'npc_kaya_flathoof - SAY_START'),
+(-1000348, 'Look out! We\'re under attack!', 0, 'npc_kaya_flathoof - SAY_AMBUSH'),
+(-1000349, 'Thank you for helping me. I know my way back from here.', 0, 'npc_kaya_flathoof - SAY_END');
+
+-- 956_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000350, 'Who dares awaken Aquementas?', 1, 'mob_aquementas - AGGRO_YELL_AQUE'),
+(-1000351, 'I give up! Please don\'t kill me!', 0, 'mob_unkor_the_ruthless - SAY_SUBMIT'),
+(-1000352, 'I choose the third option: KILLING YOU!', 0, 'npc_floon - SAY_FLOON_ATTACK'),
+(-1000353, 'Ok let\'s get out of here!', 0, 'npc_isla_starmane - SAY_PROGRESS_1'),
+(-1000354, 'You sure you\'re ready? Take a moment.', 0, 'npc_isla_starmane - SAY_PROGRESS_2'),
+(-1000355, 'Alright, let\'s do this!', 0, 'npc_isla_starmane - SAY_PROGRESS_3'),
+(-1000356, 'Ok, I think I can make it on my own from here. Thank you so much for breaking me out of there!', 0, 'npc_isla_starmane - SAY_PROGRESS_4'),
+(-1000357, 'Belore...', 0, 'npc_lady_sylvanas_windrunner - SAY_LAMENT_END'),
+(-1000358, 'kneels down and pick up the amulet.', 2, 'npc_lady_sylvanas_windrunner - EMOTE_LAMENT_END'),
+(-1000359, 'You have my blessing', 0, 'npcs_ashyen_and_keleth - GOSSIP_REWARD_BLESS'),
+(-1000360, 'Is the way clear? Let\'s get out while we can, $N.', 0, 'npc_kayra_longmane - SAY_PROGRESS_1'),
+(-1000361, 'Looks like we won\'t get away so easy. Get ready!', 0, 'npc_kayra_longmane - SAY_PROGRESS_2'),
+(-1000362, 'Let\'s keep moving. We\'re not safe here!', 0, 'npc_kayra_longmane - SAY_PROGRESS_3'),
+(-1000363, 'Look out, $N! Enemies ahead!', 0, 'npc_kayra_longmane - SAY_PROGRESS_4'),
+(-1000364, 'We\'re almost to the refuge! Let\'s go.', 0, 'npc_kayra_longmane - SAY_PROGRESS_5'),
+(-1000365, 'I can see my fellow druids from here. Thank you, $N. I\'m sure Ysiel will reward you for your actions!', 0, 'npc_kayra_longmane - SAY_PROGRESS_6');
+
+-- 963_world_scripts.sql
+INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+(-1000366, 'So you have defeated the Crimson Sigil. You now seek to challenge my rule? Not even Arthas could defeat me, yet you dare to even harbor such thoughts? Then I say to you, come! Come $N! The Black Temple awaits...', 1, 'Quest: Battle of the crimson watch - END_TEXT'),
+
+(-1000367, 'At your command, my liege...', 0, 'TorlothAnim - First'),
+(-1000368, 'Destroy them, Torloth. Let lose their blood like a river upon this hallowed ground.', 0, 'Quest: Battle of the crimson watch TorlothAnim - Second'),
+(-1000369, 'As you desire, Lord Illidan.', 0, 'Quest: Battle of the crimson watch TorlothAnim - Third'),
+(-1000370, 'Yes, Lord Illidan, I would sacrifice to you this magnificent physique. On this day you will fall - another victim of Torloth...', 0, 'Quest: Battle of the crimson watch TorlothAnim - Fourth'),
+
+(-1000371, 'What manner of fool dares stand before Illidan Stormrage? Soldiers, destroy these insects!', 1, 'Quest: Battle of the crimson watch WavesInfo - First'),
+(-1000372, 'You are no challenge for the Crimson Sigil. Mind breakers, end this nonsense.', 1, 'Quest: Battle of the crimson watch WavesInfo - Second'),
+(-1000373, 'Run while you still can. The highlords come soon...', 1, 'Quest: Battle of the crimson watch WavesInfo - Third'),
+(-1000374, 'Torloth your master calls!', 1, 'Quest: Battle of the crimson watch WavesInfo - Fourth');
+
-- -1 033 000 SHADOWFANG KEEP
INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
(-1033000,'Thanks for freeing me, I\'ll open this door for you, then I will get out of here.',0,0,0,'shadowfang_prisoner SAY_FREE');
-- -1 034 000 STOCKADES
-
-- -1 036 000 DEADMINES
+-- -1 574 000 UTGARDE KEEP
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1574000, 'Your blood is mine!',13221,1,0,'keleseth SAY_AGGRO'),
+(-1574001, 'Darkness waits',13223,1,0, 'keleseth SAY_KILL'),
+(-1574002, 'I join... the night.',13225,1,0, 'keleseth SAY_DEATH'),
+(-1574003, 'Not so fast.',13222,1,0, 'keleseth SAY_FROST_TOMB'),
+(-1574004, 'Aranal, lidel! Their fate shall be yours!',13224,1,0, 'keleseth SAY_SKELETONS');
+
-- -1 043 000 WAILING CAVERNS
-- -1 047 000 RAZORFEN KRAUL
+INSERT INTO script_texts (entry, content_default, sound, type, language, comment) VALUES
+(-1047000, 'Phew! Finally,out here. However, it will not become easy. Detain your eyes after annoyance.', 0, 0, 0, 'Willix'),
+(-1047001, 'There on top resides Charlga Razorflank. The damned old Crone.', 0, 0, 0, 'Willix'),
+(-1047002, 'Help! Get this Raging Agam\'ar from me!', 0, 0, 0, 'Willix'),
+(-1047003, 'In this ditch there are Blueleaf Tuber! As if the gold waited only to be dug out, I say it you!', 0, 0, 0, 'Willix'),
+(-1047004, 'Danger is behind every corner.', 0, 0, 0, 'Willix'),
+(-1047005, 'I do not understand how these disgusting animals can live at such a place.... puh as this stinks!', 0, 0, 0, 'Willix'),
+(-1047006, 'I think, I see a way how we come out of this damned thorn tangle.', 0, 0, 0, 'Willix'),
+(-1047007, 'I am glad that we are out again from this damned ditch. However, up here it is not much better!', 0, 0, 0, 'Willix'),
+(-1047008, 'Finally! I am glad that I come, finally out here.', 0, 0, 0, 'Willix'),
+(-1047009, 'I will rather rest a moment and come again to breath, before I return to Ratchet.', 0, 0, 0, 'Willix'),
+(-1047010, 'Many thanks for your help.', 0, 0, 0, 'Willix');
-- -1 048 000 BLACKFATHOM DEEPS
+-- -1 060 000 863_world_scripts.sql
+INSERT INTO script_texts
+(`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `emote`, `comment`)
+VALUES
+(-1060000, 'Emergency power activated! Initializing ambulatory motor! CLUCK!', NULL, NULL, 'Notfallenergie aktiviert! Ambulatorenantrieb wird gestartet! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1060001, 'Physical threat detected! Evasive action! CLUCK!', NULL, NULL, 'Körperliche Bedrohung entdeckt! Ausweichmanöver! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1060002, 'Threat analyzed! Activating combat plan beta! CLUCK!', NULL, NULL, 'Bedrohung analysiert! Gefechtsplan Beta wird aktiviert! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1060003, 'CLUCK! Sensors detect spatial anomaly -- danger imminent! CLUCK', NULL, NULL, 'GLUCK! Sensoren haben räumliche Anomalie entdeckt - Gefahr im Verzug! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1060004, 'No one challenges the wastevander nomads -- not even robotic chickens! ATTACK!', NULL, NULL, 'Niemand fordert die Wüsenläufernomaden heraus - auch keine Robothühner! ANGRIFF!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
+(-1060005, 'Cloaking systems online! CLUCK! Engaging cloak for transport to Booty Bay!', NULL, NULL, 'Tarnsysteme online! GLUCK! Tarnung für Transport nach Beutebucht wird aktiviert.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL);
+
-- -1 070 000 ULDAMAN
-- -1 090 000 GNOMEREGAN
@@ -49,12 +347,22 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
-- -1 129 000 RAZORFEN DOWNS
-- -1 189 000 SCARLET MONASTERY
+INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `comment`) VALUES
+(-1189001, 'It is over, your search is done! Let fate choose now, the righteous one',0,0,0,0,0,0,0,0,11961,1,0,'Headless Horseman SAY_ENTRANCE'),
+(-1189002, 'Here\'s my body, fit and pure! Now, your blackened souls I\'ll cure!',0,0,0,0,0,0,0,0,12567,1,0,'Headless Horseman SAY_REJOINED'),
+(-1189003, 'Over here, you idiot!',0,0,0,0,0,0,0,0,12569,1,0,'Headless Horseman SAY_LOST_HEAD'),
+(-1189004, 'Harken, cur! Tis you I spurn! Now, $N, feel the burn!',0,0,0,0,0,0,0,0,12573,1,0,'Headless Horseman SAY_CONFLAGRATION'),
+(-1189005, 'Soldiers arise, stand and fight! Bring victory at last to this fallen knight!',0,0,0,0,0,0,0,0,11963,1,0,'Headless Horseman SAY_SPROUTING_PUMPKINS'),
+(-1189006, 'Your body lies beaten, battered and broken. Let my curse be your own, fate has spoken',0,0,0,0,0,0,0,0,11962,0,0,'Headless Horseman SAY_PLAYER_DEATH'),
+(-1189007, 'This end have I reached before. What new adventure lies in store?',0,0,0,0,0,0,0,0,11964,0,0,'Headless Horseman SAY_DEATH');
-- -1 209 000 ZUL'FARRAK
-- -1 229 000 BLACKROCK SPIRE
-- -1 230 000 BLACKROCK DEPTHS
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1230000,'Ah, hits the spot!',0,0,0,'rocknot SAY_GOT_BEER');
-- -1 249 000 ONYXIA'S LAIR
INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
@@ -87,6 +395,19 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1269016,'No one can stop us! No one!',10404,1,0,'aeonus SAY_SLAY2'),
(-1269017,'It is only a matter...of time.',10405,1,0,'aeonus SAY_DEATH');
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1269018,'goes into a frenzy!',0,2,0,'aeonus EMOTE_FRENZY'),
+(-1269019,'Stop! Do not go further, mortals. You are ill-prepared to face the forces of the Infinite Dragonflight. Come, let me help you.',0,0,0,'saat SAY_SAAT_WELCOME'),
+(-1269020,'The time has come! Gul\'dan, order your warlocks to double their efforts! Moments from now the gateway will open, and your Horde will be released upon this ripe, unsuspecting world!',10435,1,0,'medivh SAY_ENTER'),
+(-1269021,'What is this? Champions, coming to my aid? I sense the hand of the dark one in this. Truly this sacred event bears his blessing?',10436,1,0,'medivh SAY_INTRO'),
+(-1269022,'Champions, my shield grows weak!',10437,1,0,'medivh SAY_WEAK75'),
+(-1269023,'My powers must be concentrated on the portal! I do not have time to hold the shield!',10438,1,0,'medivh SAY_WEAK50'),
+(-1269024,'The shield is nearly gone! All that I have worked for is in danger!',10439,1,0,'medivh SAY_WEAK25'),
+(-1269025,'No... damn this feeble mortal coil...',10441,1,0,'medivh SAY_DEATH'),
+(-1269026,'I am grateful for your aid, champions. Now, Gul\'dan\'s Horde will sweep across this world, like a locust swarm, and all my designs, all my carefully laid plans will at last fall into place.',10440,1,0,'medivh SAY_WIN'),
+(-1269027,'Orcs of the Horde! This portalis the gateway to your new destiny! Azeroth lies before you, ripe for the taking!',0,1,0,'medivh SAY_ORCS_ENTER'),
+(-1269028,'Gul\'dan speaks the truth! We should return at once to tell our brothers of the news! Retreat back trought the portal!',0,1,0,'medivh SAY_ORCS_ANSWER');
+
-- -1 289 000 SCHOLOMANCE
-- -1 309 000 ZUL'GURUB
@@ -371,7 +692,126 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1532102,'I refuse to concede defeat. I am a prince of the Eredar! I am...',9221,1,0,'malchezaar SAY_DEATH');
-- -1 533 000 NAXXRAMAS
-
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533000,'Ahh... welcome to my parlor.',8788,1,0,'anubrekhan SAY_GREET'),
+(-1533001,'Just a little taste...',8785,1,0,'anubrekhan SAY_AGGRO1'),
+(-1533002,'There is no way out.',8786,1,0,'anubrekhan SAY_AGGRO2'),
+(-1533003,'Yes, Run! It makes the blood pump faster!',8787,1,0,'anubrekhan SAY_AGGRO3'),
+(-1533004,'I hear little hearts beating. Yesss... beating faster now. Soon the beating will stop.',8790,1,0,'anubrekhan SAY_TAUNT1'),
+(-1533005,'Where to go? What to do? So many choices that all end in pain, end in death.',8791,1,0,'anubrekhan SAY_TAUNT2'),
+(-1533006,'Which one shall I eat first? So difficult to choose... the all smell so delicious.',8792,1,0,'anubrekhan SAY_TAUNT3'),
+(-1533007,'Closer now... tasty morsels. I\'ve been too long without food. Without blood to drink.',8793,1,0,'anubrekhan SAY_TAUNT4'),
+(-1533008,'Shh... it will all be over soon.',8789,1,0,'anubrekhan SAY_SLAY'),
+(-1533009,'Your old lives, your mortal desires, mean nothing. You are acolytes of the master now, and you will serve the cause without question! The greatest glory is to die in the master\'s service!',8799,1,0,'faerlina SAY_GREET'),
+(-1533010,'Slay them in the master\'s name!',8794,1,0,'faerlina SAY_AGGRO1'),
+(-1533011,'You cannot hide from me!',8795,1,0,'faerlina SAY_AGGRO2'),
+(-1533012,'Kneel before me, worm!',8796,1,0,'faerlina SAY_AGGRO3'),
+(-1533013,'Run while you still can!',8797,1,0,'faerlina SAY_AGGRO4'),
+(-1533014,'You have failed!',8800,1,0,'faerlina SAY_SLAY1'),
+(-1533015,'Pathetic wretch!',8801,1,0,'faerlina SAY_SLAY2'),
+(-1533016,'The master... will avenge me!',8798,1,0,'faerlina SAY_DEATH'),
+(-1533017,'Patchwerk want to play!',8909,1,0,'patchwerk SAY_AGGRO1'),
+(-1533018,'Kel\'Thuzad make Patchwerk his Avatar of War!',8910,1,0,'patchwerk SAY_AGGRO2'),
+(-1533019,'No more play?',8912,1,0,'patchwerk SAY_SLAY'),
+(-1533020,'What happened to... Patch...',8911,1,0,'patchwerk SAY_DEATH'),
+(-1533021,'goes into a berserker rage!',0,2,0,'patchwerk EMOTE_BERSERK'),
+(-1533022,'becomes enraged!',0,2,0,'patchwerk EMOTE_ENRAGE'),
+(-1533023,'Stalagg crush you!',8864,1,0,'stalagg SAY_STAL_AGGRO'),
+(-1533024,'Stalagg kill!',8866,1,0,'stalagg SAY_STAL_SLAY'),
+(-1533025,'Master save me...',8865,1,0,'stalagg SAY_STAL_DEATH'),
+(-1533026,'Feed you to master!',8802,1,0,'feugen SAY_FEUG_AGGRO'),
+(-1533027,'Feugen make master happy!',8804,1,0,'feugen SAY_FEUG_SLAY'),
+(-1533028,'No... more... Feugen...',8803,1,0,'feugen SAY_FEUG_DEATH'),
+(-1533029,'You are too late... I... must... OBEY!',8872,1,0,'thaddius SAY_GREET'),
+(-1533030,'KILL!',8867,1,0,'thaddius SAY_AGGRO1'),
+(-1533031,'EAT YOUR BONES!',8868,1,0,'thaddius SAY_AGGRO2'),
+(-1533032,'BREAK YOU!',8869,1,0,'thaddius SAY_AGGRO3'),
+(-1533033,'You die now!',8877,1,0,'thaddius SAY_SLAY'),
+(-1533034,'Now YOU feel pain!',8871,1,0,'thaddius SAY_ELECT'),
+(-1533035,'Thank... you...',8870,1,0,'thaddius SAY_DEATH'),
+(-1533036,'Pleeease!',8873,1,0,'thaddius SAY_SCREAM1'),
+(-1533037,'Stop, make it stop!',8874,1,0,'thaddius SAY_SCREAM2'),
+(-1533038,'Help me! Save me!',8875,1,0,'thaddius SAY_SCREAM3'),
+(-1533039,'Please, nooo!',8876,1,0,'thaddius SAY_SCREAM4');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533074 AND -1533040;
+ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533040,'Foolishly you have sought your own demise. Brazenly you have disregarded powers beyond your understanding. You have fought hard to invade the realm of the harvester. Now there is only one way out - to walk the lonely path of the damned.',8807,1,0,'gothik SAY_SPEECH'),
+(-1533041,'Death is the only escape.',8806,1,0,'gothik SAY_KILL'),
+(-1533042,'I... am... undone!',8805,1,0,'gothik SAY_DEATH'),
+(-1533043,'I have waited long enough! Now, you face the harvester of souls!',8808,1,0,'gothik SAY_TELEPORT'),
+(-1533044,'Defend youself!',8892,1,0,'blaumeux SAY_BLAU_AGGRO'),
+(-1533045,'Come, Zeliek, do not drive them out. Not before we\'ve had our fun.',8896,1,0,'blaumeux SAY_BLAU_TAUNT1'),
+(-1533046,'I do hope they stay alive long enough for me to... introduce myself.',8897,1,0,'blaumeux SAY_BLAU_TAUNT2'),
+(-1533047,'The first kill goes to me! Anyone care to wager?',8898,1,0,'blaumeux SAY_BLAU_TAUNT3'),
+(-1533048,'Your life is mine!',8895,1,0,'blaumeux SAY_BLAU_SPECIAL'),
+(-1533049,'Who\'s next?',8894,1,0,'blaumeux SAY_BLAU_SLAY'),
+(-1533050,'Tou... che!',8893,1,0,'blaumeux SAY_BLAU_DEATH'),
+(-1533051,'Come out and fight, ye wee ninny!',8899,1,0,'korthazz SAY_KORT_AGGRO'),
+(-1533052,'To arms, ye roustabouts! We\'ve got company!',8903,1,0,'korthazz SAY_KORT_TAUNT1'),
+(-1533053,'I heard about enough of yer sniveling. Shut yer fly trap \'afore I shut it for ye!',8904,1,0,'korthazz SAY_KORT_TAUNT2'),
+(-1533054,'I\'m gonna enjoy killin\' these slack-jawed daffodils!',8905,1,0,'korthazz SAY_KORT_TAUNT3'),
+(-1533055,'I like my meat extra crispy!',8901,1,0,'korthazz SAY_KORT_SPECIAl'),
+(-1533056,'Next time, bring more friends!',8902,1,0,'korthazz SAY_KORT_SLAY'),
+(-1533057,'What a bloody waste this is!',8900,1,0,'korthazz SAY_KORT_DEATH'),
+(-1533058,'Flee, before it\'s too late!',8913,1,0,'zeliek SAY_ZELI_AGGRO'),
+(-1533059,'Invaders, cease this foolish venture at once! Turn away while you still can!',8917,1,0,'zeliek SAY_ZELI_TAUNT1'),
+(-1533060,'Perhaps they will come to their senses, and run away as fast as they can!',8918,1,0,'zeliek SAY_ZELI_TAUNT2'),
+(-1533061,'Do not continue! Turn back while there\'s still time!',8919,1,0,'zeliek SAY_ZELI_TAUNT3'),
+(-1533062,'I- I have no choice but to obey!',8916,1,0,'zeliek SAY_ZELI_SPECIAL'),
+(-1533063,'Forgive me!',8915,1,0,'zeliek SAY_ZELI_SLAY'),
+(-1533064,'It is... as it should be.',8914,1,0,'zeliek SAY_ZELI_DEATH'),
+(-1533065,'You seek death?',14571,1,0,'rivendare_naxx SAY_RIVE_AGGRO1'),
+(-1533066,'None shall pass!',14572,1,0,'rivendare_naxx SAY_RIVE_AGGRO2'),
+(-1533067,'Be still!',14573,1,0,'rivendare_naxx SAY_RIVE_AGGRO3'),
+(-1533068,'You will find no peace in death.',14574,1,0,'rivendare_naxx SAY_RIVE_SLAY1'),
+(-1533069,'The master\'s will is done.',14575,1,0,'rivendare_naxx SAY_RIVE_SLAY2'),
+(-1533070,'Bow to the might of the scourge!',14576,1,0,'rivendare_naxx SAY_RIVE_SPECIAL'),
+(-1533071,'Enough prattling. Let them come! We shall grind their bones to dust.',14577,1,0,'rivendare_naxx SAY_RIVE_TAUNT1'),
+(-1533072,'Conserve your anger! Harness your rage! You will all have outlets for your frustration soon enough.',14578,1,0,'rivendare_naxx SAY_RIVE_TAUNT2'),
+(-1533073,'Life is meaningless. It is in death that we are truly tested.',14579,1,0,'rivendare_naxx SAY_RIVE_TAUNT3'),
+(-1533074,'Death... will not stop me...',14580,1,0,'rivendare_naxx SAY_RIVE_DEATH');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533108 AND -1533075;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533075,'Glory to the master!',8845,1,0,'noth SAY_AGGRO1'),
+(-1533076,'Your life is forfeit!',8846,1,0,'noth SAY_AGGRO2'),
+(-1533077,'Die, trespasser!',8847,1,0,'noth SAY_AGGRO3'),
+(-1533078,'Rise, my soldiers! Rise and fight once more!',8851,1,0,'noth SAY_SUMMON'),
+(-1533079,'My task is done!',8849,1,0,'noth SAY_SLAY1'),
+(-1533080,'Breathe no more!',8850,1,0,'noth SAY_SLAY2'),
+(-1533081,'I will serve the master... in... death!',8848,1,0,'noth SAY_DEATH'),
+(-1533082,'takes in a deep breath...',0,2,0,'sapphiron EMOTE_BREATH'),
+(-1533083,'enrages!',0,2,0,'sapphiron EMOTE_ENRAGE'),
+(-1533084,'Our preparations continue as planned, master.',14467,1,0,'kelthuzad SAY_SAPP_DIALOG1'),
+(-1533085,'It is good that you serve me so faithfully. Soon, all will serve the Lich King and in the end, you shall be rewarded...so long as you do not falter.',8881,1,0,'kelthuzad SAY_SAPP_DIALOG2_LICH'),
+(-1533086,'I see no complications... Wait... What is this?',14468,1,0,'kelthuzad SAY_SAPP_DIALOG3'),
+(-1533087,'Your security measures have failed! See to this interruption immediately!',8882,1,0,'kelthuzad SAY_SAPP_DIALOG4_LICH'),
+(-1533088,'Yes, master!',14469,1,0,'kelthuzad SAY_SAPP_DIALOG5'),
+(-1533089,'No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...',14484,1,0,'kelthuzad SAY_CAT_DIED'),
+(-1533090,'Who dares violate the sanctity of my domain? Be warned, all who trespass here are doomed.',14463,1,0,'kelthuzad SAY_TAUNT1'),
+(-1533091,'Fools, you think yourselves triumphant? You have only taken one step closer to the abyss! ',14464,1,0,'kelthuzad SAY_TAUNT2'),
+(-1533092,'I grow tired of these games. Proceed, and I will banish your souls to oblivion!',14465,1,0,'kelthuzad SAY_TAUNT3'),
+(-1533093,'You have no idea what horrors lie ahead. You have seen nothing! The frozen heart of Naxxramas awaits you!',14466,1,0,'kelthuzad SAY_TAUNT4'),
+(-1533094,'Pray for mercy!',14475,1,0,'kelthuzad SAY_AGGRO1'),
+(-1533095,'Scream your dying breath!',14476,1,0,'kelthuzad SAY_AGGRO2'),
+(-1533096,'The end is upon you!',14477,1,0,'kelthuzad SAY_AGGRO3'),
+(-1533097,'The dark void awaits you!',14478,1,0,'kelthuzad SAY_SLAY1'),
+(-1533098,'<Kel\'Thuzad cackles maniacally!>',14479,1,0,'kelthuzad SAY_SLAY2'),
+(-1533099,'AAAAGHHH!... Do not rejoice... your victory is a hollow one... for I shall return with powers beyond your imagining!',14480,1,0,'kelthuzad SAY_DEATH'),
+(-1533100,'Your soul, is bound to me now!',14472,1,0,'kelthuzad SAY_CHAIN1'),
+(-1533101,'There will be no escape!',14473,1,0,'kelthuzad SAY_CHAIN2'),
+(-1533102,'I will freeze the blood in your veins!',14474,1,0,'kelthuzad SAY_FROST_BLAST'),
+(-1533103,'Master! I require aid! ',14470,1,0,'kelthuzad SAY_REQUEST_AID'),
+(-1533104,'Very well... warriors of the frozen wastes, rise up! I command you to fight, kill, and die for your master. Let none survive...',0,1,0,'kelthuzad SAY_ANSWER_REQUEST'),
+(-1533105,'Minions, servants, soldiers of the cold dark, obey the call of Kel\'Thuzad!',14471,1,0,'kelthuzad SAY_SUMMON_MINIONS'),
+(-1533106,'Your petty magics are no challenge to the might of the Scourge! ',14481,1,0,'kelthuzad SAY_SPECIAL1_MANA_DET'),
+(-1533107,'Enough! I grow tired of these distractions! ',14483,1,0,'kelthuzad SAY_SPECIAL3_MANA_DET'),
+(-1533108,'Fools, you have spread your powers too thin. Be free, my minions!',14482,1,0,'kelthuzad SAY_SPECIAL2_DISPELL');
+
+UPDATE `script_texts` SET `sound`=8902 WHERE `entry`=-1533055;
+UPDATE `script_texts` SET `sound`=8901 WHERE `entry`=-1533056;
+
-- -1 534 000 THE BATTLE OF MT. HYJAL
-- -1 540 000 SHATTERED HALLS
@@ -461,6 +901,17 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1543015,'It is... not over.',10284,1,0,'omor SAY_DIE'),
(-1543016,'I am victorious!',10283,1,0,'omor SAY_WIPE');
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+('-1543017','You have faced many challenges, pity they were all in vain. Soon your people will kneel to my lord!',10292,1,0,'vazruden SAY_INTRO'),
+('-1543018','Is there no one left to test me?',10293,1,0,'vazruden SAY_WIPE'),
+('-1543019','Your time is running out!',10294,1,0,'vazruden SAY_AGGRO_1'),
+('-1543020','You are nothing, I answer a higher call!',10295,1,0,'vazruden SAY_AGGRO_2'),
+('-1543021','The Dark Lord laughs at you!',10296,1,0,'vazruden SAY_AGGRO_3'),
+('-1543022','It is over. Finished!',10297,1,0,'vazruden SAY_KILL_1'),
+('-1543023','Your days are done!',10298,1,0,'vazruden SAY_KILL_2'),
+('-1543024','My lord will be the end you all...',10299,1,0,'vazruden SAY_DIE'),
+('-1543025','descends from the sky',0,3,0,'vazruden EMOTE');
+
-- -1 544 000 MAGTHERIDON'S LAIR
INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
(-1544000,'Wretched, meddling insects. Release me and perhaps i will grant you a merciful death!',10247,1,0,'magtheridon SAY_TAUNT1'),
@@ -1083,6 +1534,14 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1585028,'Do not... get too comfortable.',12420,1,0,'kaelthas MT SAY_RECAST_GRAVITY'),
(-1585029,'My demise accomplishes nothing! The Master will have you! You will drown in your own blood! This world shall burn! Aaaghh!',12421,1,0,'kaelthas MT SAY_DEATH');
+-- -1 645 000 377_word_scripts.sql
+INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `comment`) VALUES
+(-1645006,'Let the trial begin, Bloodwrath, attack!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE'),
+(-1645007,'Champion Lightrend, make me proud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE'),
+(-1645008,'Show this upstart how a real Blood Knight fights, Swiftblade!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE'),
+(-1645009,'Show $N the meaning of pain, Sunstriker!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE');
+
+
--
-- Below just for beautiful view in table, run at own desire
--
diff --git a/sql/updates/1026_mangos_7113_01_characters_character_achievement_progress.sql b/sql/updates/1026_mangos_7113_01_characters_character_achievement_progress.sql
new file mode 100644
index 00000000000..6f125a6a2e6
--- /dev/null
+++ b/sql/updates/1026_mangos_7113_01_characters_character_achievement_progress.sql
@@ -0,0 +1,3 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7100_01_characters_character_spell required_7113_01_characters_character_achievement_progress bit;*/
+
+DELETE FROM character_achievement_progress WHERE counter=0; \ No newline at end of file
diff --git a/sql/updates/1028_mangos_7141_01_world_instance_template.sql b/sql/updates/1028_mangos_7141_01_world_instance_template.sql
new file mode 100644
index 00000000000..f86b9517a98
--- /dev/null
+++ b/sql/updates/1028_mangos_7141_01_world_instance_template.sql
@@ -0,0 +1,12 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7133_02_mangos_spell_loot_template required_7141_01_mangos_instance_template bit;*/
+
+ALTER TABLE instance_template ADD maxPlayersHeroic tinyint(3) unsigned NOT NULL default '0' AFTER maxPlayers;
+
+UPDATE instance_template SET maxPlayersHeroic = maxPlayers;
+
+DELETE FROM instance_template WHERE map IN (533,615,616,624);
+INSERT INTO instance_template VALUES
+(533,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
+(615,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
+(616,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
+(624,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''); \ No newline at end of file
diff --git a/sql/updates/1028_mangos_7147_01_world_creature_template.sql b/sql/updates/1028_mangos_7147_01_world_creature_template.sql
new file mode 100644
index 00000000000..385ec769156
--- /dev/null
+++ b/sql/updates/1028_mangos_7147_01_world_creature_template.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7141_01_mangos_instance_template required_7147_01_mangos_creature_template bit;*/
+
+UPDATE creature_template
+ SET family = 0 WHERE entry = 1; \ No newline at end of file
diff --git a/sql/updates/1028_mangos_7150_01_world_playercreateinfo_spell.sql b/sql/updates/1028_mangos_7150_01_world_playercreateinfo_spell.sql
new file mode 100644
index 00000000000..6d4a5993e58
--- /dev/null
+++ b/sql/updates/1028_mangos_7150_01_world_playercreateinfo_spell.sql
@@ -0,0 +1,10 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7149_01_mangos_spell_proc_event required_7150_01_mangos_playercreateinfo_spell bit;*/
+
+DELETE FROM `playercreateinfo_spell` WHERE Spell = 58284;
+
+INSERT INTO `playercreateinfo_spell` VALUES
+(1,9,58284,'Chaos Bolt Passive'),
+(2,9,58284,'Chaos Bolt Passive'),
+(5,9,58284,'Chaos Bolt Passive'),
+(7,9,58284,'Chaos Bolt Passive'),
+(10,9,58284,'Chaos Bolt Passive'); \ No newline at end of file
diff --git a/sql/updates/1073_world_scripts.sql b/sql/updates/1073_world_scripts.sql
deleted file mode 100644
index 038f5f79466..00000000000
--- a/sql/updates/1073_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname = 'npc_plains_vision' where entry = 2983;
-
diff --git a/sql/updates/1074_world_scripts.sql b/sql/updates/1074_world_scripts.sql
deleted file mode 100644
index 4ed882ffea5..00000000000
--- a/sql/updates/1074_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname = 'npc_plucky' where entry in (6626);
-
diff --git a/sql/updates/1084_mangos_7168_01_world_command.sql b/sql/updates/1084_mangos_7168_01_world_command.sql
new file mode 100644
index 00000000000..b9df9bca12d
--- /dev/null
+++ b/sql/updates/1084_mangos_7168_01_world_command.sql
@@ -0,0 +1,6 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7156_01_mangos_spell_proc_event required_7168_01_mangos_command bit;*/
+
+DELETE FROM `command` WHERE `name` IN ('learn','unlearn');
+INSERT INTO `command` VALUES
+('learn',3,'Syntax: .learn #spell [all]\r\n\r\nSelected character learn a spell of id #spell. If \'all\' provided then all ranks learned.'),
+('unlearn',3,'Syntax: .unlearn #spell [all]\r\n\r\nUnlearn for selected player a spell #spell. If \'all\' provided then all ranks unlearned.'); \ No newline at end of file
diff --git a/sql/updates/1094_mangos_7193_01_world_trinity_string.sql b/sql/updates/1094_mangos_7193_01_world_trinity_string.sql
new file mode 100644
index 00000000000..44a390d20f6
--- /dev/null
+++ b/sql/updates/1094_mangos_7193_01_world_trinity_string.sql
@@ -0,0 +1,3 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7175_01_mangos_spell_proc_event required_7193_01_mangos_mangos_string bit;*/
+
+UPDATE mangos_string SET content_default = 'Unit Flags: %u.\nDynamic Flags: %u.\nFaction Template: %u.' WHERE entry = 542; \ No newline at end of file
diff --git a/sql/updates/1108_mangos_7196_02_world_spell_bonus_data.sql b/sql/updates/1108_mangos_7196_02_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..8f6fdbd1463
--- /dev/null
+++ b/sql/updates/1108_mangos_7196_02_world_spell_bonus_data.sql
@@ -0,0 +1,233 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7196_01_mangos_spell_chain required_7196_02_mangos_spell_bonus_data bit;*/
+
+-- ----------------------------
+-- Table structure for spell_bonus_data
+-- ----------------------------
+DROP TABLE IF EXISTS `spell_bonus_data`;
+CREATE TABLE `spell_bonus_data` (
+ `entry` smallint(5) unsigned NOT NULL,
+ `direct_bonus` float NOT NULL default '0',
+ `dot_bonus` float NOT NULL default '0',
+ `ap_bonus` float NOT NULL default '0',
+ `comments` varchar(255) default NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+INSERT INTO `spell_bonus_data` VALUES
+('5185', '1.6104', '0', '0', 'Druid - Healing Touch'),
+('33763', '0', '0.09518', '0', 'Druid - Lifebloom'),
+('774', '0', '0.37604', '0', 'Druid - Rejuvenation'),
+('8936', '0.539', '0.188', '0', 'Druid - Regrowth'),
+('18562', '0', '0', '0', 'Druid - Swiftmend'),
+('44203', '0.538', '0', '0', 'Druid - Tranquility Triggered'),
+('48438', '0', '0.11505', '0', 'Druid - Wild Growth'),
+('50464', '0.6611', '0', '0', 'Druid - Nourish'),
+('339', '0', '0.1', '0', 'Druid - Entangling Roots'),
+('42231', '0.12898', '0', '0', 'Druid - Hurricane Triggered'),
+('5570', '0', '0.127', '0', 'Druid - Insect Swarm'),
+('8921', '0.1515', '0.13', '0', 'Druid - Moonfire'),
+('2912', '1', '0', '0', 'Druid - Starfire'),
+('5176', '0.5714', '0', '0', 'Druid - Wrath'),
+('30451', '0.7143', '0', '0', 'Mage - Arcane Blast'),
+('1449', '0.2128', '0', '0', 'Mage - Arcane Explosion'),
+('7268', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 1'),
+('7269', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 2'),
+('7270', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 3'),
+('8419', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 4'),
+('8418', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 5'),
+('10273', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 6'),
+('10274', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 7'),
+('25346', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 8'),
+('27076', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 9'),
+('38700', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 10'),
+('38703', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 11'),
+('42844', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 12'),
+('42845', '0.2857', '0', '0', 'Mage - Arcane Missiles Triggered Spell Rank 13'),
+('1463', '0.8053', '0', '0', 'Mage - Mana Shield'),
+('44425', '0.8571', '0', '0', 'Mage - Arcane Barrage'),
+('11113', '0.1357', '0', '0', 'Mage - Blast Wave Rank'),
+('31661', '0.1357', '0', '0', 'Mage - Dragons Breath'),
+('2136', '0.4286', '0', '0', 'Mage - Fire Blast'),
+('133', '1', '0', '0', 'Mage - Fire Ball'),
+('2120', '0.2357', '0.122', '0', 'Mage - Flamestrike'),
+('11366', '1.15', '0.05', '0', 'Mage - Pyroblast'),
+('2948', '0.4286', '0', '0', 'Mage - Scorch'),
+('44614', '0.8571', '0', '0', 'Frostfire Bolt'),
+('44457', '0.4', '0.2', '0', 'Mage - Living Bomb'),
+('42208', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 1'),
+('42209', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 2'),
+('42210', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 3'),
+('42211', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 4'),
+('42212', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 5'),
+('42213', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 6'),
+('42198', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 7'),
+('42937', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 8'),
+('42938', '0.0952', '0', '0', 'Mage - Blizzard Triggered Spell Rank 9'),
+('120', '0.1357', '0', '0', 'Mage - Cone of Cold'),
+('122', '0.193', '0', '0', 'Mage - Frost Nova'),
+('116', '0.8143', '0', '0', 'Mage - Frost Bolt'),
+('11426', '0.8053', '0', '0', 'Mage - Ice Barrier'),
+('30455', '0.1429', '0', '0', 'Mage - Ice Lance'),
+('19750', '0.4286', '0', '0', 'Paladin - Flash of Light'),
+('635', '0.7143', '0', '0', 'Paladin - Holy Light'),
+('25912', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 1'),
+('25911', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 2'),
+('25902', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 3'),
+('27176', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 4'),
+('33073', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 5'),
+('48822', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 6'),
+('48823', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Hurt Rank 7'),
+('25914', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 1'),
+('25913', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 2'),
+('25903', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 3'),
+('27175', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 4'),
+('33074', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 5'),
+('48820', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 6'),
+('48821', '0.4286', '0', '0', 'Paladin - Holy Shock Triggered Heal Rank 7'),
+('31935', '0.07', '0', '0.07', 'Paladin - Avengers Shiled'),
+('26573', '0', '0.04', '0.04', 'Paladin - Consecration'),
+('879', '0.15', '0', '0.15', 'Paladin - Exorcism'),
+('24275', '0.15', '0', '0.15', 'Paladin - Hammer of Wrath'),
+('20925', '0.09', '0', '0.056', 'Paladin - Holy Shield'),
+('2812', '0.07', '0', '0.07', 'Paladin - Holy Wrath'),
+('31893', '0.25', '0', '0.16', 'Paladin - Seal of Blood Enemy Proc'),
+('32221', '0.25', '0', '0.16', 'Paladin - Seal of Blood Self Proc'),
+('20424', '0.25', '0', '0.16', 'Paladin - Seal of Command Proc'),
+('379', '0', '0', '0', 'Shaman - Earth Shield Triggered'),
+('20167', '0.25', '0', '0.16', 'Paladin - Seal of Light Proc'),
+('53719', '0.25', '0', '0.16', 'Paladin - Seal of The Martyr Enemy Proc'),
+('53718', '0.25', '0', '0.16', 'Paladin - Seal of The Martyr Self Proc'),
+('25742', '0.07', '0', '0.039', 'Paladin - Seal of Righteousness Dummy Proc'),
+('31803', '0', '0.013', '0.15', 'Paladin - Holy Vengeance'),
+('52042', '0.045', '0', '0', 'Shaman - Healing Stream Totem Triggered Heal'),
+('32546', '0.8068', '0', '0', 'Priest - Binding Heal'),
+('34861', '0.402', '0', '0', 'Priest - Circle of Healing'),
+('19236', '0.8068', '0', '0', 'Priest - Desperate Prayer'),
+('2061', '0.8068', '0', '0', 'Priest - Flash Heal'),
+('2060', '1.6135', '0', '0', 'Priest - Greater Heal'),
+('23455', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 1'),
+('23458', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 2'),
+('23459', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 3'),
+('27803', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 4'),
+('27804', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 5'),
+('27805', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 6'),
+('25329', '0.3035', '0', '0', 'Priest - Holy Nova Heal Rank 7'),
+('17', '0.8068', '0', '0', 'Priest - Power Word: Shield'),
+('596', '0.8086', '0', '0', 'Priest - Prayer of Healing'),
+('33110', '0.8068', '0', '0', 'Priest - Prayer of Mending Heal Proc'),
+('139', '1.88', '0', '0', 'Priest - Renew'),
+('2944', '0.1849', '0', '0', 'Priest - Devouring Plague'),
+('14914', '0.5711', '0.024', '0', 'Priest - Holy Fire'),
+('15237', '0.1606', '0', '0', 'Priest - Holy Nova Damage'),
+('8129', '0', '0', '0', 'Priest - Mana Burn'),
+('8092', '0.4296', '0', '0', 'Priest - Mind Blast'),
+('15407', '0.257', '0', '0', 'Priest - Mind Flay'),
+('49821', '0.7143', '0', '0', 'Priest - Mind Sear Trigger Rank 1'),
+('53022', '0.7143', '0', '0', 'Priest - Mind Sear Trigger Rank 2'),
+('34433', '0.65', '0', '0', 'Priest - Shadowfiend'),
+('32379', '0.4296', '0', '0', 'Priest - Shadow Word: Death'),
+('589', '0', '0.1829', '0', 'Priest - Shadow Word: Pain'),
+('585', '0.714', '0', '0', 'Priest - Smite'),
+('34914', '0', '0.4', '0', 'Priest - Vampiric Touch'),
+('974', '0.4762', '0', '0', 'Shaman - Earth Shield'),
+('1064', '1.34', '0', '0', 'Shaman - Chain Heal'),
+('331', '1.6106', '0', '0', 'Shaman - Healing Wave'),
+('8004', '0.8082', '0', '0', 'Shaman - Lesser Healing Wave'),
+('61295', '0.4', '0.18', '0', 'Shaman - Riptide'),
+('421', '0.57', '0', '0', 'Shaman - Chain Lightning'),
+('8042', '0.3858', '0', '0', 'Shaman - Earth Shock'),
+('8443', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 1'),
+('8504', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 2'),
+('8505', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 3'),
+('11310', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 4'),
+('11311', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 5'),
+('25538', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 6'),
+('25539', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 7'),
+('61651', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 8'),
+('61660', '0.2142', '0', '0', 'Shaman - Fire Nova Totem Casted by Totem Rank 9'),
+('8050', '0.2142', '0.1', '0', 'Shaman - Flame Shock'),
+('8026', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 1'),
+('8028', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 2'),
+('8029', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 3'),
+('10445', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 4'),
+('16343', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 5'),
+('16344', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 6'),
+('25488', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 7'),
+('58786', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 8'),
+('58787', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 9'),
+('58788', '0.1', '0', '0', 'Shaman - Flametongue Weapon Proc Rank 10'),
+('8056', '0.3858', '0', '0', 'Shaman - Frost Shock'),
+('8034', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 1'),
+('8037', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 2'),
+('10458', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 3'),
+('16352', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 4'),
+('16353', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 5'),
+('25501', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 6'),
+('58797', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 7'),
+('58798', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 8'),
+('58799', '0.1', '0', '0', 'Shaman - Frostbrand Attack Rank 9'),
+('51505', '0.5714', '0', '0', 'Shaman - Lava Burst'),
+('403', '0.7143', '0', '0', 'Shaman - Lightning Bolt'),
+('26364', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 1'),
+('26365', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 2'),
+('26366', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 3'),
+('26367', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 4'),
+('26369', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 5'),
+('26370', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 6'),
+('26363', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 7'),
+('26371', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 8'),
+('26372', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 9'),
+('49278', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 10'),
+('49279', '0.33', '0', '0', 'Shaman - Lightning Shield Proc Rank 11'),
+('8188', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 1'),
+('10582', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 2'),
+('10583', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 3'),
+('10584', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 4'),
+('25551', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 5'),
+('58733', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 6'),
+('58736', '0.1', '0', '0', 'Shaman - Magma Totam Passive Rank 7'),
+('3606', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 1'),
+('6350', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 2'),
+('6351', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 3'),
+('6352', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 4'),
+('10435', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 5'),
+('10436', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 6'),
+('25530', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 7'),
+('58700', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 8'),
+('58701', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 9'),
+('58702', '0.1667', '0', '0', 'Shaman - Searing Totem Attack Rank 10'),
+('980', '0', '0.1', '0', 'Warlock - Curse of Agony'),
+('603', '0', '2', '0', 'Warlock - Curse of Doom'),
+('172', '0', '0.3', '0', 'Warlock - Corruption'),
+('348', '0.2', '0.2', '0', 'Warlock - Immolate'),
+('27243', '0.22', '0.25', '0', 'Warlock - Seed of Corruption'),
+('18265', '0', '1', '0', 'Warlock - Siphon Life'),
+('30108', '0', '0.24', '0', 'Warlock - Unstable Affliction'),
+('17962', '0.4286', '0', '0', 'Warlock - Conflagrate'),
+('6789', '0.22', '0', '0', 'Warlock - Death Coil'),
+('48181', '0.4729', '0', '0', 'Warlock - Haunt'),
+('29722', '0.7143', '0', '0', 'Warlock - Incinerate'),
+('5676', '0.4286', '0', '0', 'Warlock - Searing Pain'),
+('686', '0.8571', '0', '0', 'Warlock - Shadow Bolt'),
+('17877', '0.4286', '0', '0', 'Warlock - Shadowburn'),
+('30283', '0.195', '0', '0', 'Warlock - Shadowfury'),
+('6353', '1.15', '0', '0', 'Warlock - Soul Fire'),
+('689', '0', '0.1428', '0', 'Warlock - Drain Life'),
+('5138', '0', '0', '0', 'Warlock - Drain Mana'),
+('1120', '0', '0.4286', '0', 'Warlock - Drain Soul'),
+('755', '0', '0.4485', '0', 'Warlock - Health Funnel'),
+('1949', '0', '0.0946', '0', 'Warlock - Hellfire'),
+('5857', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 1'),
+('11681', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 2'),
+('11682', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 3'),
+('27214', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 4'),
+('47822', '0.1428', '0', '0', 'Warlock - Hellfire Effect on Enemy Rank 5'),
+('42223', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 1'),
+('42224', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 2'),
+('42225', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 3'),
+('42226', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 4'),
+('42218', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 5'),
+('47817', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 6'),
+('47818', '0.952', '0', '0', 'Warlock - Rain of Fire Triggered Rank 7'),
+('18220', '0.96', '0', '0', 'Warlock - Dark Pact'),
+('6229', '0.3', '0', '0', 'Warlock - Shadow Ward'); \ No newline at end of file
diff --git a/sql/updates/1108_mangos_7198_01_characters_characters.sql b/sql/updates/1108_mangos_7198_01_characters_characters.sql
new file mode 100644
index 00000000000..104a31359df
--- /dev/null
+++ b/sql/updates/1108_mangos_7198_01_characters_characters.sql
@@ -0,0 +1,27 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7113_01_characters_character_achievement_progress required_7198_01_characters_characters bit;*/
+
+UPDATE `characters`.`item_instance` AS `t1`
+INNER JOIN `world`.`item_template` AS `t2` ON
+`t2`.`entry` = SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',4),' ',-1)
+SET `t1`.`data` = CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',16),' ',-16), ' ',
+ IF (`t2`.`spellcharges_1` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',17),' ',-1) = 0, IF(`t2`.`spellcharges_1` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',17),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_2` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',18),' ',-1) = 0, IF(`t2`.`spellcharges_2` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',18),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_3` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',19),' ',-1) = 0, IF(`t2`.`spellcharges_3` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',19),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_4` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',20),' ',-1) = 0, IF(`t2`.`spellcharges_4` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',20),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_5` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',21),' ',-1) = 0, IF(`t2`.`spellcharges_5` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',21),' ',-1))), ' ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(`data`,' ',64),' ',-64+21),' ')
+WHERE (`t2`.`spellid_1` = 55884) AND (SUBSTRING_INDEX(data,' ',64) = data AND SUBSTRING_INDEX(data,' ',64-1) <> data);
+
+UPDATE `characters`.`item_instance` AS `t1`
+INNER JOIN `world`.`item_template` AS `t2` ON
+`t2`.`entry` = SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',4),' ',-1)
+SET `t1`.`data` = CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',16),' ',-16), ' ',
+ IF (`t2`.`spellcharges_1` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',17),' ',-1) = 0, IF(`t2`.`spellcharges_1` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',17),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_2` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',18),' ',-1) = 0, IF(`t2`.`spellcharges_2` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',18),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_3` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',19),' ',-1) = 0, IF(`t2`.`spellcharges_3` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',19),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_4` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',20),' ',-1) = 0, IF(`t2`.`spellcharges_4` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',20),' ',-1))), ' ',
+ IF (`t2`.`spellcharges_5` = 0, 0, IF (SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',21),' ',-1) = 0, IF(`t2`.`spellcharges_5` < 0, 4294967295, 1), SUBSTRING_INDEX(SUBSTRING_INDEX(`t1`.`data`,' ',21),' ',-1))), ' ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(`data`,' ',138),' ',-138+21),' ')
+WHERE (`t2`.`spellid_1` = 55884) AND (SUBSTRING_INDEX(data,' ',138) = data AND SUBSTRING_INDEX(data,' ',138-1) <> data); \ No newline at end of file
diff --git a/sql/updates/1108_mangos_7199_01_world_spell_bonus_data.sql b/sql/updates/1108_mangos_7199_01_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..89bad64d3e1
--- /dev/null
+++ b/sql/updates/1108_mangos_7199_01_world_spell_bonus_data.sql
@@ -0,0 +1,11 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7196_02_mangos_spell_bonus_data required_7199_01_mangos_spell_bonus_data bit;*/
+
+DELETE FROM `spell_bonus_data` WHERE `entry` IN (44614, 139, 49821, 53022, 18265, 31117, 28176);
+INSERT INTO `spell_bonus_data` VALUES
+('44614', '0.8571', '0', '0', 'Mage - Frostfire Bolt'),
+('139', '0', '0.376', '0', 'Priest - Renew'),
+('49821', '0.14286', '0', '0', 'Priest - Mind Sear Trigger Rank 1'),
+('53022', '0.14286', '0', '0', 'Priest - Mind Sear Trigger Rank 2'),
+('18265', '0', '0.1', '0', 'Warlock - Siphon Life'),
+('31117', '1.8', '0', '0', 'Warlock - Unstable Affliction Dispell'),
+('28176', '0', '0', '0', 'Warlock - Fel Armor'); \ No newline at end of file
diff --git a/sql/updates/1135_mangos_7207_01_world_creature.sql b/sql/updates/1135_mangos_7207_01_world_creature.sql
new file mode 100644
index 00000000000..7566ba87076
--- /dev/null
+++ b/sql/updates/1135_mangos_7207_01_world_creature.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7205_01_mangos_spell_chain required_7207_01_mangos_creature bit;*/
+
+ALTER TABLE creature
+ ADD COLUMN `phaseMask` smallint(5) unsigned NOT NULL default '1' AFTER `spawnMask`; \ No newline at end of file
diff --git a/sql/updates/1135_mangos_7207_02_world_gameobject.sql b/sql/updates/1135_mangos_7207_02_world_gameobject.sql
new file mode 100644
index 00000000000..aef9f853f54
--- /dev/null
+++ b/sql/updates/1135_mangos_7207_02_world_gameobject.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7207_01_mangos_creature required_7207_02_mangos_gameobject bit;*/
+
+ALTER TABLE gameobject
+ ADD COLUMN `phaseMask` smallint(5) unsigned NOT NULL default '1' AFTER `spawnMask`; \ No newline at end of file
diff --git a/sql/updates/1135_mangos_7207_03_characters_corpse.sql b/sql/updates/1135_mangos_7207_03_characters_corpse.sql
new file mode 100644
index 00000000000..b1fa98e2706
--- /dev/null
+++ b/sql/updates/1135_mangos_7207_03_characters_corpse.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7198_01_characters_characters required_7207_03_characters_corpse bit;*/
+
+ALTER TABLE corpse
+ ADD COLUMN `phaseMask` smallint(5) unsigned NOT NULL default '1' AFTER `map`; \ No newline at end of file
diff --git a/sql/updates/1140_mangos_7209_01_world_spell_bonus_data.sql b/sql/updates/1140_mangos_7209_01_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..d4863c51494
--- /dev/null
+++ b/sql/updates/1140_mangos_7209_01_world_spell_bonus_data.sql
@@ -0,0 +1,5 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7207_02_mangos_gameobject required_7209_01_mangos_spell_bonus_data bit;*/
+
+DELETE FROM `spell_bonus_data` WHERE `entry` IN (53595);
+INSERT INTO `spell_bonus_data` VALUES
+('53595', '0', '0', '0','Paladin - Hammer of the Righteous'); \ No newline at end of file
diff --git a/sql/updates/1185_mangos_7214_01_world_command.sql b/sql/updates/1185_mangos_7214_01_world_command.sql
new file mode 100644
index 00000000000..841d538fa43
--- /dev/null
+++ b/sql/updates/1185_mangos_7214_01_world_command.sql
@@ -0,0 +1,8 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7209_01_mangos_spell_bonus_data required_7214_01_mangos_command bit;*/
+
+DELETE FROM `command` WHERE `name` IN ('gps','modify phase','npc phase','gobject phase');
+INSERT INTO `command` VALUES
+('gps',1,'Syntax: .gps [$name|$shift-link]\r\n\r\nDisplay the position information for a selected character or creature (also if player name $name provided then for named player, or if creature/gameobject shift-link provided then pointed creature/gameobject if it loaded). Position information includes X, Y, Z, and orientation, map Id and zone Id'),
+('modify phase',3,'Syntax: .modify phase #phasemask\r\n\r\nSelected character phasemask changed to #phasemask with related world vision update. Change active until in game phase changed, or GM-mode enable/disable, or re-login. Character pts pasemask update to same value.'),
+('npc phase',3,'Syntax: .npc phase #phasemask\r\n\r\nSelected unit or pet phasemask changed to #phasemask with related world vision update for players. In creature case state saved to DB and persistent. In pet case change active until in game phase changed for owner, owner re-login, or GM-mode enable/disable..'),
+('gobject phase',3,'Syntax: .gobject phase #guid #phasemask\r\n\r\nGameobject with DB guid #guid phasemask changed to #phasemask with related world vision update for players. Gameobject state saved to DB and persistent.'); \ No newline at end of file
diff --git a/sql/updates/1185_mangos_7214_02_world_trinity_string.sql b/sql/updates/1185_mangos_7214_02_world_trinity_string.sql
new file mode 100644
index 00000000000..90c39d42baa
--- /dev/null
+++ b/sql/updates/1185_mangos_7214_02_world_trinity_string.sql
@@ -0,0 +1,5 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7214_01_mangos_command required_7214_02_mangos_mangos_string bit;*/
+
+DELETE FROM `mangos_string` WHERE entry = 101;
+INSERT INTO `mangos_string` VALUES
+(101,'Map: %u (%s) Zone: %u (%s) Area: %u (%s) Phase: %u\nX: %f Y: %f Z: %f Orientation: %f\ngrid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); \ No newline at end of file
diff --git a/sql/updates/1185_mangos_7214_03_world_spell_proc_event.sql b/sql/updates/1185_mangos_7214_03_world_spell_proc_event.sql
new file mode 100644
index 00000000000..e93dcdc04a1
--- /dev/null
+++ b/sql/updates/1185_mangos_7214_03_world_spell_proc_event.sql
@@ -0,0 +1,865 @@
+DROP TABLE IF EXISTS `spell_proc_event`;
+CREATE TABLE IF NOT EXISTS `spell_proc_event` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `SchoolMask` tinyint(4) NOT NULL default '0',
+ `SpellFamilyName` smallint(5) unsigned NOT NULL default '0',
+ `SpellFamilyMask0` int(10) unsigned NOT NULL default '0',
+ `SpellFamilyMask1` int(10) unsigned NOT NULL default '0',
+ `SpellFamilyMask2` int(10) unsigned NOT NULL default '0',
+ `procFlags` int(10) unsigned NOT NULL default '0',
+ `procEx` int(10) unsigned NOT NULL default '0',
+ `ppmRate` float NOT NULL default '0',
+ `CustomChance` float NOT NULL default '0',
+ `Cooldown` int(10) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
+(324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(1463, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(3232, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(5952, 0, 8, 1, 1, 0, 0, 0, 0, 0, 0),
+(6346, 0, 0, 0, 0, 0, 0, 256, 0, 0, 0),
+(7383, 1, 0, 0, 0, 0, 0, 256, 0, 0, 0),
+(7434, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(8134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(8178, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(8494, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(8495, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(9452, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(9782, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(9784, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(9799, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(10191, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(10192, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(10193, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(10431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(10432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(11095, 0, 3, 16, 0, 0, 0, 0, 0, 0, 0),
+(11119, 4, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(11120, 4, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(11129, 0, 3, 12582935, 64, 0, 0, 0, 0, 0, 0),
+(11180, 16, 3, 0, 0, 0, 0, 0, 0, 0, 0),
+(11185, 0, 3, 128, 0, 0, 327680, 0, 0, 0, 0),
+(11255, 0, 3, 16384, 0, 0, 0, 0, 0, 0, 0),
+(12169, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(12281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6),
+(12289, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0),
+(12298, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(12311, 0, 4, 2048, 1, 0, 0, 0, 0, 0, 0),
+(12317, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12319, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12322, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(12487, 0, 3, 128, 0, 0, 327680, 0, 0, 0, 0),
+(12488, 0, 3, 128, 0, 0, 327680, 0, 0, 0, 0),
+(12598, 0, 3, 16384, 0, 0, 0, 0, 0, 0, 0),
+(12668, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0),
+(12724, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(12725, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(12726, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(12727, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(12797, 0, 4, 1024, 0, 0, 0, 0, 0, 0, 0),
+(12799, 0, 4, 1024, 0, 0, 0, 0, 0, 0, 0),
+(12812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6),
+(12813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6),
+(12814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6),
+(12815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6),
+(12834, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12846, 4, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(12847, 4, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(12848, 4, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(12849, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12867, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12872, 0, 3, 16, 0, 0, 0, 0, 0, 0, 0),
+(12873, 0, 3, 16, 0, 0, 0, 0, 0, 0, 0),
+(12958, 0, 4, 2048, 1, 0, 0, 0, 0, 0, 0),
+(12966, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(12967, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(12968, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(12969, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(12970, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(12971, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12972, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12973, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12974, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(12999, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0),
+(13000, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0),
+(13001, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0),
+(13002, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0),
+(13045, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(13046, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(13047, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(13048, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(13163, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0),
+(13165, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(13754, 0, 8, 16, 0, 0, 0, 0, 0, 0, 0),
+(13867, 0, 8, 16, 0, 0, 0, 0, 0, 0, 0),
+(13983, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0),
+(14070, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0),
+(14071, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0),
+(14156, 0, 8, 4063232, 0, 0, 0, 0, 0, 0, 0),
+(14160, 0, 8, 4063232, 0, 0, 0, 0, 0, 0, 0),
+(14161, 0, 8, 4063232, 0, 0, 0, 0, 0, 0, 0),
+(14186, 0, 8, 1082131720, 2, 0, 0, 2, 0, 0, 0),
+(14190, 0, 8, 1082131720, 2, 0, 0, 2, 0, 0, 0),
+(14193, 0, 8, 1082131720, 2, 0, 0, 2, 0, 0, 0),
+(14194, 0, 8, 1082131720, 2, 0, 0, 2, 0, 0, 0),
+(14195, 0, 8, 1082131720, 2, 0, 0, 2, 0, 0, 0),
+(14318, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(14319, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(14320, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(14321, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(14322, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(14531, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(14774, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(14892, 0, 6, 268443136, 65540, 0, 0, 2, 0, 0, 0),
+(15088, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(15128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(15268, 32, 6, 101187584, 2, 0, 0, 0, 0, 0, 0),
+(15277, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0),
+(15286, 32, 6, 0, 0, 0, 0, 0, 0, 0, 0),
+(15323, 32, 6, 101187584, 2, 0, 0, 0, 0, 0, 0),
+(15324, 32, 6, 101187584, 2, 0, 0, 0, 0, 0, 0),
+(15325, 32, 6, 101187584, 2, 0, 0, 0, 0, 0, 0),
+(15326, 32, 6, 101187584, 2, 0, 0, 0, 0, 0, 0),
+(15337, 0, 6, 8192, 2, 0, 0, 2, 0, 0, 0),
+(15338, 0, 6, 8192, 2, 0, 0, 2, 0, 0, 0),
+(15346, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0),
+(15362, 0, 6, 268443136, 65540, 0, 0, 2, 0, 0, 0),
+(15363, 0, 6, 268443136, 65540, 0, 0, 2, 0, 0, 0),
+(15600, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
+(16164, 0, 11, 2416967875, 0, 0, 0, 2, 0, 0, 0),
+(16176, 0, 11, 448, 0, 0, 0, 2, 0, 0, 0),
+(16180, 0, 11, 192, 0, 0, 0, 2, 0, 0, 0),
+(16196, 0, 11, 192, 0, 0, 0, 2, 0, 0, 0),
+(16198, 0, 11, 192, 0, 0, 0, 2, 0, 0, 0),
+(16235, 0, 11, 448, 0, 0, 0, 2, 0, 0, 0),
+(16240, 0, 11, 448, 0, 0, 0, 2, 0, 0, 0),
+(16256, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16257, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(16277, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(16278, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(16279, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(16280, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(16281, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16282, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16283, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16284, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16487, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16489, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16492, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16550, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30),
+(16624, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(16850, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0),
+(16864, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(16880, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16923, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0),
+(16924, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0),
+(16952, 0, 7, 233472, 1024, 0, 0, 2, 0, 0, 0),
+(16954, 0, 7, 233472, 1024, 0, 0, 2, 0, 0, 0),
+(16958, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(16961, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(17106, 0, 7, 524288, 0, 0, 0, 0, 0, 0, 0),
+(17107, 0, 7, 524288, 0, 0, 0, 0, 0, 0, 0),
+(17108, 0, 7, 524288, 0, 0, 0, 0, 0, 0, 0),
+(17364, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(17495, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(17793, 0, 5, 1, 0, 0, 0, 2, 0, 0, 0),
+(17794, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0),
+(17796, 0, 5, 1, 0, 0, 0, 2, 0, 0, 0),
+(17797, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(17798, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(17799, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(17800, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(17801, 0, 5, 1, 0, 0, 0, 2, 0, 0, 0),
+(17802, 0, 5, 1, 0, 0, 0, 2, 0, 0, 0),
+(17803, 0, 5, 1, 0, 0, 0, 2, 0, 0, 0),
+(18073, 0, 5, 96, 128, 0, 0, 0, 0, 0, 0),
+(18094, 0, 5, 10, 0, 0, 0, 0, 0, 0, 0),
+(18095, 0, 5, 10, 0, 0, 0, 0, 0, 0, 0),
+(18096, 0, 5, 96, 128, 0, 0, 0, 0, 0, 0),
+(18119, 0, 5, 997, 4288, 0, 0, 0, 0, 0, 0),
+(18120, 0, 5, 997, 4288, 0, 0, 0, 0, 0, 0),
+(18820, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(19184, 0, 9, 20, 8192, 0, 0, 0, 0, 0, 0),
+(19228, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0),
+(19232, 0, 9, 64, 0, 0, 0, 0, 0, 0, 0),
+(19233, 0, 9, 64, 0, 0, 0, 0, 0, 0, 0),
+(19387, 0, 9, 20, 8192, 0, 0, 0, 0, 0, 0),
+(19388, 0, 9, 20, 8192, 0, 0, 0, 0, 0, 0),
+(19572, 0, 9, 8388608, 0, 0, 16384, 0, 0, 0, 0),
+(19573, 0, 9, 8388608, 0, 0, 16384, 0, 0, 0, 0),
+(20049, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(20056, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(20057, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(20128, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(20131, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(20132, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(20164, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0),
+(20165, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0),
+(20166, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0),
+(20182, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(20210, 0, 10, 3221225472, 65536, 0, 0, 2, 0, 0, 0),
+(20212, 0, 10, 3221225472, 65536, 0, 0, 2, 0, 0, 0),
+(20213, 0, 10, 3221225472, 65536, 0, 0, 2, 0, 0, 0),
+(20214, 0, 10, 3221225472, 65536, 0, 0, 2, 0, 0, 0),
+(20215, 0, 10, 3221225472, 65536, 0, 0, 2, 0, 0, 0),
+(20234, 0, 10, 32768, 0, 0, 0, 0, 0, 0, 0),
+(20235, 0, 10, 32768, 0, 0, 0, 0, 0, 0, 0),
+(20375, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0),
+(20500, 0, 4, 268435456, 0, 0, 0, 0, 0, 0, 0),
+(20501, 0, 4, 268435456, 0, 0, 0, 0, 0, 0, 0),
+(20705, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(20911, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(20925, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(20927, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(20928, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(21185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(21882, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(21890, 0, 4, 712396527, 876, 0, 0, 0, 0, 0, 0),
+(22007, 0, 3, 2097185, 0, 0, 0, 65536, 0, 0, 0),
+(22618, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(22648, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(23547, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0),
+(23548, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(23551, 0, 11, 192, 0, 0, 0, 0, 0, 0, 0),
+(23552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(23572, 0, 11, 192, 0, 0, 0, 0, 0, 0, 0),
+(23578, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(23581, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(23602, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(23686, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(23688, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(23689, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0),
+(23695, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0),
+(23721, 0, 9, 2048, 0, 0, 0, 0, 0, 0, 0),
+(23920, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(24353, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(24389, 0, 3, 12582935, 64, 0, 0, 0, 0, 0, 0),
+(24398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(24658, 0, 0, 0, 0, 0, 82192, 0, 0, 0, 0),
+(24905, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0),
+(24932, 0, 0, 0, 0, 0, 0, 2, 0, 0, 6),
+(25050, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(25296, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(25469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(25472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(25669, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
+(25899, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(25988, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(26016, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(26107, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0),
+(26119, 0, 10, 2416967683, 0, 0, 0, 65536, 0, 0, 0),
+(26128, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0),
+(26135, 0, 10, 8388608, 0, 0, 0, 65536, 0, 0, 0),
+(26480, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(26605, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(27044, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(27131, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(27179, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(27419, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(27498, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(27521, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(27656, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(27774, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(27787, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(27811, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(27815, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(27816, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(28592, 16, 3, 0, 0, 0, 0, 0, 0, 0, 0),
+(28593, 16, 3, 0, 0, 0, 0, 0, 0, 0, 0),
+(28716, 0, 7, 16, 0, 0, 294912, 0, 0, 0, 0),
+(28719, 0, 7, 32, 0, 0, 0, 2, 0, 0, 0),
+(28744, 0, 7, 64, 0, 0, 278528, 0, 0, 0, 0),
+(28752, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(28789, 0, 10, 3221225472, 0, 0, 0, 0, 0, 0, 0),
+(28802, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(28809, 0, 6, 4096, 0, 0, 0, 2, 0, 0, 0),
+(28812, 0, 8, 33554438, 0, 0, 0, 2, 0, 0, 0),
+(28816, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(28823, 0, 11, 192, 0, 0, 0, 0, 0, 0, 0),
+(28847, 0, 7, 32, 0, 0, 0, 0, 0, 0, 0),
+(28849, 0, 11, 128, 0, 0, 0, 0, 0, 0, 0),
+(29074, 20, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(29075, 20, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(29076, 20, 3, 0, 0, 0, 0, 2, 0, 0, 0),
+(29150, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29179, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(29180, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(29385, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0),
+(29441, 0, 0, 0, 0, 0, 0, 8, 0, 0, 1),
+(29444, 0, 0, 0, 0, 0, 0, 8, 0, 0, 1),
+(29455, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(29501, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29593, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(29594, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(29624, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29625, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29626, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29632, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29633, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29634, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29635, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29636, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29637, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(29801, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(29834, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(29838, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(29977, 0, 3, 12582935, 64, 0, 0, 0, 0, 0, 0),
+(30003, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(30160, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30293, 0, 5, 897, 192, 0, 0, 0, 0, 0, 0),
+(30295, 0, 5, 897, 192, 0, 0, 0, 0, 0, 0),
+(30296, 0, 5, 897, 192, 0, 0, 0, 0, 0, 0),
+(30299, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(30301, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(30302, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(30675, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0),
+(30678, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0),
+(30679, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0),
+(30680, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0),
+(30681, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0),
+(30701, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(30705, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(30802, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30803, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30804, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30805, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30806, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30807, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30808, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30809, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30810, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30811, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(30823, 0, 0, 0, 0, 0, 0, 0, 10.5, 0, 0),
+(30881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5),
+(30883, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5),
+(30884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5),
+(30885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5),
+(30886, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5),
+(30937, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(31124, 0, 8, 536870926, 0, 0, 0, 0, 0, 0, 0),
+(31126, 0, 8, 536870926, 0, 0, 0, 0, 0, 0, 0),
+(31244, 0, 8, 4063232, 9, 0, 0, 4, 0, 0, 0),
+(31245, 0, 8, 4063232, 9, 0, 0, 4, 0, 0, 0),
+(31394, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(31569, 0, 3, 65536, 0, 0, 0, 0, 0, 0, 0),
+(31570, 0, 3, 65536, 0, 0, 0, 0, 0, 0, 0),
+(31785, 0, 0, 0, 0, 0, 34816, 0, 0, 0, 0),
+(31794, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(31801, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0),
+(31833, 0, 10, 2147483648, 0, 0, 0, 0, 0, 0, 0),
+(31835, 0, 10, 2147483648, 0, 0, 0, 0, 0, 0, 0),
+(31836, 0, 10, 2147483648, 0, 0, 0, 0, 0, 0, 0),
+(31871, 0, 10, 16, 0, 0, 16384, 0, 0, 0, 0),
+(31872, 0, 10, 16, 0, 0, 16384, 0, 0, 0, 0),
+(31876, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(31877, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(31878, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(31904, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(32385, 0, 5, 1026, 17, 0, 0, 0, 0, 0, 0),
+(32387, 0, 5, 1026, 17, 0, 0, 0, 0, 0, 0),
+(32392, 0, 5, 1026, 17, 0, 0, 0, 0, 0, 0),
+(32393, 0, 5, 1026, 17, 0, 0, 0, 0, 0, 0),
+(32394, 0, 5, 1026, 17, 0, 0, 0, 0, 0, 0),
+(32409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(32587, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(32593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(32594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(32642, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(32734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(32748, 0, 8, 0, 1, 0, 320, 0, 0, 0, 0),
+(32776, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(32777, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(32837, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 45),
+(32844, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0),
+(32885, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33076, 0, 0, 0, 0, 0, 656040, 0, 0, 0, 0),
+(33089, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(33127, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0),
+(33142, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33145, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33146, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33150, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33151, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33154, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33191, 0, 6, 8421376, 1024, 0, 0, 0, 0, 0, 0),
+(33192, 0, 6, 8421376, 1024, 0, 0, 0, 0, 0, 0),
+(33193, 0, 6, 8421376, 1024, 0, 0, 0, 0, 0, 0),
+(33299, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(33510, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0),
+(33648, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33719, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(33736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(33746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(33757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(33759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(33776, 0, 0, 0, 0, 0, 34816, 0, 0, 0, 0),
+(33881, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33882, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33883, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(33953, 0, 0, 0, 0, 0, 16384, 0, 0, 0, 45),
+(34080, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0),
+(34138, 0, 11, 128, 0, 0, 0, 0, 0, 0, 0),
+(34139, 0, 10, 1073741824, 0, 0, 0, 0, 0, 0, 0),
+(34258, 0, 10, 1024, 8, 0, 0, 0, 0, 0, 0),
+(34262, 0, 10, 8388608, 0, 0, 0, 65536, 0, 0, 0),
+(34320, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(34497, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34498, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34499, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34500, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34502, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34503, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30),
+(34586, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0),
+(34598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(34749, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0),
+(34753, 0, 6, 6144, 4, 0, 0, 2, 0, 0, 0),
+(34774, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 20),
+(34783, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(34827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(34859, 0, 6, 6144, 4, 0, 0, 2, 0, 0, 0),
+(34860, 0, 6, 6144, 4, 0, 0, 2, 0, 0, 0),
+(34914, 0, 6, 8192, 0, 0, 0, 0, 0, 0, 0),
+(34916, 0, 6, 8192, 0, 0, 0, 0, 0, 0, 0),
+(34917, 0, 6, 8192, 0, 0, 0, 0, 0, 0, 0),
+(34935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8),
+(34938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8),
+(34939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8),
+(34950, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(34954, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(35077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60),
+(35080, 0, 0, 0, 0, 0, 0, 0, 1, 0, 60),
+(35083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60),
+(35086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60),
+(35100, 0, 9, 12289, 0, 0, 65856, 0, 0, 0, 0),
+(35102, 0, 9, 12289, 0, 0, 0, 0, 0, 0, 0),
+(35103, 0, 9, 12289, 0, 0, 0, 0, 0, 0, 0),
+(35121, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(36096, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(36111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(36541, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(37165, 0, 8, 2098176, 0, 0, 0, 0, 0, 0, 0),
+(37168, 0, 8, 4063232, 9, 0, 0, 0, 0, 0, 0),
+(37170, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
+(37173, 0, 8, 750519704, 262, 0, 0, 0, 0, 0, 30),
+(37189, 0, 10, 3221225472, 0, 0, 0, 2, 0, 0, 60),
+(37193, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(37195, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(37197, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 45),
+(37213, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(37214, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(37227, 0, 11, 448, 0, 0, 0, 2, 0, 0, 60),
+(37237, 0, 11, 1, 0, 0, 0, 2, 0, 0, 0),
+(37247, 8, 0, 0, 0, 0, 0, 65536, 0, 0, 45),
+(37377, 32, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(37379, 32, 5, 0, 0, 0, 0, 0, 0, 0, 0),
+(37384, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0),
+(37443, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(37514, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0),
+(37516, 0, 4, 1024, 0, 0, 0, 0, 0, 0, 0),
+(37519, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0),
+(37523, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(37528, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0),
+(37536, 0, 4, 65536, 0, 0, 0, 0, 0, 0, 0),
+(37568, 0, 6, 2048, 0, 0, 0, 0, 0, 0, 0),
+(37594, 0, 6, 4096, 0, 0, 0, 0, 0, 0, 0),
+(37600, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(37601, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(37603, 0, 6, 32768, 0, 0, 0, 0, 0, 0, 0),
+(37655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60),
+(37657, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3),
+(38026, 1, 0, 0, 0, 0, 0, 256, 0, 0, 0),
+(38031, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(38290, 0, 0, 0, 0, 0, 0, 0, 1.6, 0, 0),
+(38326, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(38327, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(38334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60),
+(38347, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(38350, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(38394, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0),
+(38857, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(39027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(39372, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(39437, 4, 5, 4964, 192, 0, 0, 65536, 0, 0, 0),
+(39442, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
+(39443, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(39530, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(39958, 0, 0, 0, 0, 0, 0, 0, 0.7, 0, 40),
+(40407, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0),
+(40438, 0, 6, 32832, 0, 0, 0, 0, 0, 0, 0),
+(40442, 0, 7, 20, 1088, 0, 0, 0, 0, 0, 0),
+(40444, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(40458, 0, 4, 33554432, 1537, 0, 0, 0, 0, 0, 0),
+(40463, 0, 11, 129, 16, 0, 0, 0, 0, 0, 0),
+(40470, 0, 10, 3229614080, 0, 0, 0, 0, 0, 0, 0),
+(40475, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0),
+(40478, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0),
+(40482, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(40485, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0),
+(40899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(41034, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(41260, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(41262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(41381, 0, 0, 0, 0, 0, 0, 256, 0, 0, 0),
+(41393, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0),
+(41434, 0, 0, 0, 0, 0, 0, 0, 2, 0, 45),
+(41469, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0),
+(41635, 0, 0, 0, 0, 0, 656040, 0, 0, 0, 0),
+(41989, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0),
+(42083, 0, 0, 0, 0, 0, 0, 2, 0, 0, 45),
+(42135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90),
+(42136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90),
+(42368, 0, 10, 1073741824, 0, 0, 0, 0, 0, 0, 0),
+(42370, 0, 11, 64, 0, 0, 0, 0, 0, 0, 0),
+(42770, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(43019, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(43020, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(43338, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(43443, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(43726, 0, 10, 1073741824, 0, 0, 0, 0, 0, 0, 0),
+(43728, 0, 11, 128, 0, 0, 0, 0, 0, 0, 0),
+(43737, 0, 7, 0, 1088, 0, 0, 0, 0, 0, 10),
+(43739, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(43741, 0, 10, 2147483648, 0, 0, 0, 0, 0, 0, 0),
+(43745, 0, 10, 0, 512, 0, 0, 0, 0, 0, 0),
+(43748, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(43750, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0),
+(43819, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(44394, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(44395, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(44396, 0, 0, 0, 0, 0, 0, 1024, 0, 0, 0),
+(44401, 0, 3, 2097152, 0, 0, 0, 4095, 0, 0, 0),
+(44404, 0, 3, 536870945, 36864, 0, 0, 0, 0, 0, 0),
+(44442, 0, 3, 8388608, 64, 0, 0, 65536, 0, 0, 1),
+(44443, 0, 3, 8388608, 64, 0, 0, 65536, 0, 0, 1),
+(44445, 0, 3, 19, 4096, 0, 0, 0, 0, 0, 0),
+(44446, 0, 3, 19, 4096, 0, 0, 0, 0, 0, 0),
+(44448, 0, 3, 19, 4096, 0, 0, 0, 0, 0, 0),
+(44449, 0, 3, 551686775, 102472, 0, 0, 2, 0, 0, 0),
+(44469, 0, 3, 551686775, 102472, 0, 0, 2, 0, 0, 0),
+(44470, 0, 3, 551686775, 102472, 0, 0, 2, 0, 0, 0),
+(44471, 0, 3, 551686775, 102472, 0, 0, 2, 0, 0, 0),
+(44472, 0, 3, 551686775, 102472, 0, 0, 2, 0, 0, 0),
+(44546, 0, 3, 33555104, 0, 0, 0, 0, 0, 0, 0),
+(44548, 0, 3, 33555104, 0, 0, 0, 0, 0, 0, 0),
+(44549, 0, 3, 33555104, 0, 0, 0, 0, 0, 0, 0),
+(44835, 0, 7, 0, 128, 0, 16, 0, 0, 0, 0),
+(45054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15),
+(45057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30),
+(45234, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(45243, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(45244, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(45354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(45481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(45482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(45483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(45484, 0, 0, 0, 0, 0, 16384, 0, 0, 0, 45),
+(46025, 32, 6, 0, 0, 0, 0, 0, 0, 0, 0),
+(46092, 0, 10, 1073741824, 0, 0, 0, 0, 0, 0, 0),
+(46098, 0, 11, 128, 0, 0, 0, 0, 0, 0, 0),
+(46569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(46662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20),
+(46832, 0, 7, 1, 0, 0, 0, 65536, 0, 0, 0),
+(46854, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(46855, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(46867, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(46913, 0, 4, 0, 1024, 0, 0, 2, 0, 0, 0),
+(46914, 0, 4, 0, 1024, 0, 0, 2, 0, 0, 0),
+(46915, 0, 4, 0, 1024, 0, 0, 2, 0, 0, 0),
+(46916, 0, 4, 0, 1024, 0, 0, 2, 0, 0, 0),
+(46951, 0, 4, 1024, 64, 0, 0, 0, 0, 0, 0),
+(46952, 0, 0, 1024, 64, 0, 0, 0, 0, 0, 0),
+(46953, 0, 0, 1024, 64, 0, 0, 0, 0, 0, 0),
+(47195, 0, 5, 2, 0, 0, 0, 0, 0, 0, 30),
+(47196, 0, 5, 2, 0, 0, 0, 0, 0, 0, 30),
+(47197, 0, 5, 2, 0, 0, 0, 0, 0, 0, 30),
+(47201, 0, 5, 8, 262144, 0, 0, 65536, 0, 0, 0),
+(47202, 0, 5, 8, 262144, 0, 0, 0, 0, 0, 0),
+(47203, 0, 5, 8, 262144, 0, 0, 0, 0, 0, 0),
+(47204, 0, 5, 8, 262144, 0, 0, 0, 0, 0, 0),
+(47205, 0, 5, 8, 262144, 0, 0, 0, 0, 0, 0),
+(47232, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(47234, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(47235, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(47245, 32, 5, 0, 0, 0, 0, 0, 0, 0, 0),
+(47246, 32, 5, 0, 0, 0, 0, 0, 0, 0, 0),
+(47247, 32, 5, 0, 0, 0, 0, 0, 0, 0, 0),
+(47258, 0, 5, 0, 8388608, 0, 0, 65536, 0, 0, 0),
+(47259, 0, 5, 0, 8388608, 0, 0, 65536, 0, 0, 0),
+(47260, 0, 5, 0, 8388608, 0, 0, 65536, 0, 0, 0),
+(47263, 32, 5, 0, 0, 0, 0, 2, 0, 0, 20),
+(47264, 32, 5, 0, 0, 0, 0, 2, 0, 0, 20),
+(47265, 32, 5, 0, 0, 0, 0, 2, 0, 0, 20),
+(47509, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(47511, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(47515, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(47516, 0, 6, 6144, 65536, 0, 0, 0, 0, 0, 0),
+(47517, 0, 6, 6144, 65536, 0, 0, 0, 0, 0, 0),
+(47535, 0, 6, 6144, 8388608, 0, 0, 0, 0, 0, 0),
+(47536, 0, 6, 6144, 8388608, 0, 0, 0, 0, 0, 0),
+(47537, 0, 6, 6144, 8388608, 0, 0, 0, 0, 0, 0),
+(47538, 0, 6, 6144, 8388608, 0, 0, 0, 0, 0, 0),
+(47539, 0, 6, 6144, 8388608, 0, 0, 0, 0, 0, 0),
+(47549, 0, 6, 0, 131072, 0, 0, 0, 0, 0, 0),
+(47551, 0, 6, 0, 131072, 0, 0, 0, 0, 0, 0),
+(47552, 0, 6, 0, 131072, 0, 0, 0, 0, 0, 0),
+(47555, 0, 6, 6144, 0, 0, 0, 0, 0, 0, 0),
+(47556, 0, 6, 6144, 0, 0, 0, 0, 0, 0, 0),
+(47557, 0, 6, 6144, 0, 0, 0, 0, 0, 0, 0),
+(47572, 0, 6, 65536, 0, 0, 0, 0, 0, 0, 0),
+(47580, 0, 6, 0, 0, 64, 0, 65536, 0, 0, 0),
+(47581, 0, 6, 0, 0, 64, 0, 65536, 0, 0, 0),
+(47582, 0, 6, 0, 0, 64, 0, 65536, 0, 0, 0),
+(48110, 0, 0, 0, 0, 0, 656040, 0, 0, 0, 0),
+(48111, 0, 0, 0, 0, 0, 656040, 0, 0, 0, 0),
+(48112, 0, 0, 0, 0, 0, 656040, 0, 0, 0, 0),
+(48113, 0, 0, 0, 0, 0, 656040, 0, 0, 0, 0),
+(48159, 0, 6, 8192, 0, 0, 0, 0, 0, 0, 0),
+(48160, 0, 6, 8192, 0, 0, 0, 0, 0, 0, 0),
+(48483, 0, 7, 34816, 1088, 0, 0, 0, 0, 0, 0),
+(48484, 0, 7, 34816, 1088, 0, 0, 0, 0, 0, 0),
+(48485, 0, 7, 34816, 1088, 0, 0, 0, 0, 0, 0),
+(48496, 0, 7, 96, 33554434, 0, 0, 2, 0, 0, 0),
+(48499, 0, 7, 96, 33554434, 0, 0, 2, 0, 0, 0),
+(48500, 0, 7, 96, 33554434, 0, 0, 2, 0, 0, 0),
+(48506, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0),
+(48510, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0),
+(48511, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0),
+(48516, 0, 7, 5, 0, 0, 0, 2, 0, 0, 30),
+(48521, 0, 7, 5, 0, 0, 0, 2, 0, 0, 30),
+(48525, 0, 7, 5, 0, 0, 0, 2, 0, 0, 30),
+(48833, 0, 7, 0, 1088, 0, 0, 0, 0, 0, 0),
+(48835, 0, 10, 0, 8, 0, 0, 0, 0, 0, 0),
+(48837, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(48951, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(48952, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(48988, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(49018, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(49137, 0, 15, 0, 16384, 0, 0, 0, 0, 0, 0),
+(49188, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0),
+(49208, 0, 15, 4456448, 0, 0, 0, 0, 0, 0, 0),
+(49222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(49280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(49281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(49283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(49284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(49503, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(49504, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(49529, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(49530, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(49531, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(49532, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(49622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60),
+(49657, 0, 15, 0, 16384, 0, 0, 0, 0, 0, 0),
+(50781, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51123, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51127, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51128, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51129, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51130, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(51349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(51352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(51359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10),
+(51466, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51470, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51474, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(51478, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(51479, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(51556, 0, 11, 192, 0, 16, 0, 2, 0, 0, 0),
+(51557, 0, 11, 192, 0, 16, 0, 2, 0, 0, 0),
+(51558, 0, 11, 192, 0, 16, 0, 2, 0, 0, 0),
+(51562, 0, 11, 256, 0, 16, 0, 0, 0, 0, 0),
+(51563, 0, 11, 256, 0, 16, 0, 0, 0, 0, 0),
+(51564, 0, 11, 256, 0, 16, 0, 0, 0, 0, 0),
+(51565, 0, 11, 256, 0, 16, 0, 0, 0, 0, 0),
+(51566, 0, 11, 256, 0, 16, 0, 0, 0, 0, 0),
+(51625, 0, 8, 268476416, 0, 0, 0, 0, 0, 0, 0),
+(51626, 0, 8, 268476416, 0, 0, 0, 0, 0, 0, 0),
+(51627, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(51628, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(51629, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0),
+(51634, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51635, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51636, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(51664, 0, 8, 131072, 8, 0, 0, 0, 0, 0, 0),
+(51665, 0, 8, 131072, 8, 0, 0, 0, 0, 0, 0),
+(51667, 0, 8, 131072, 8, 0, 0, 0, 0, 0, 0),
+(51668, 0, 8, 131072, 8, 0, 0, 0, 0, 0, 0),
+(51669, 0, 8, 131072, 8, 0, 0, 0, 0, 0, 0),
+(51672, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1),
+(51674, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1),
+(51679, 0, 8, 1, 1, 0, 0, 0, 0, 0, 0),
+(51692, 0, 8, 512, 0, 0, 0, 2, 0, 0, 0),
+(51696, 0, 8, 512, 0, 0, 0, 2, 0, 0, 0),
+(51698, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1),
+(51700, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1),
+(51701, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1),
+(51940, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0),
+(51989, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0),
+(52004, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0),
+(52005, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0),
+(52007, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0),
+(52008, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0),
+(52020, 0, 7, 32768, 1048576, 0, 0, 0, 0, 0, 0),
+(52127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(52129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(52131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(52134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(52136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(52138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(52420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30),
+(52423, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0),
+(52795, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0),
+(52797, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0),
+(52798, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0),
+(52799, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0),
+(52800, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0),
+(52898, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(53137, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(53138, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(53215, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(53216, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(53217, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0),
+(53221, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0),
+(53222, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0),
+(53224, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0),
+(53228, 0, 9, 32, 16777216, 0, 0, 0, 0, 0, 0),
+(53232, 0, 9, 32, 16777216, 0, 0, 0, 0, 0, 0),
+(53256, 0, 9, 2048, 8388609, 0, 0, 2, 0, 0, 0),
+(53259, 0, 9, 2048, 8388609, 0, 0, 2, 0, 0, 0),
+(53260, 0, 9, 2048, 8388609, 0, 0, 2, 0, 0, 0),
+(53290, 0, 9, 2048, 2147483647, 0, 0, 2, 0, 0, 0),
+(53291, 0, 9, 2048, 2147483647, 0, 0, 2, 0, 0, 0),
+(53292, 0, 9, 2048, 2147483647, 0, 0, 2, 0, 0, 0),
+(53293, 0, 9, 2048, 2147483647, 0, 0, 2, 0, 0, 0),
+(53294, 0, 9, 2048, 2147483647, 0, 0, 2, 0, 0, 0),
+(53380, 0, 10, 8388608, 131072, 0, 0, 2, 0, 0, 0),
+(53381, 0, 10, 8388608, 131072, 0, 0, 2, 0, 0, 0),
+(53382, 0, 10, 8388608, 131072, 0, 0, 2, 0, 0, 0),
+(53383, 0, 10, 8388608, 131072, 0, 0, 2, 0, 0, 0),
+(53384, 0, 10, 8388608, 131072, 0, 0, 2, 0, 0, 0),
+(53486, 0, 10, 8388608, 163840, 0, 0, 2, 0, 0, 0),
+(53488, 0, 10, 8388608, 163840, 0, 0, 2, 0, 0, 0),
+(53501, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(53502, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(53503, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(53551, 0, 10, 4096, 0, 0, 0, 0, 0, 0, 0),
+(53552, 0, 10, 4096, 0, 0, 0, 0, 0, 0, 0),
+(53553, 0, 10, 4096, 0, 0, 0, 0, 0, 0, 0),
+(53569, 0, 10, 2097152, 0, 0, 0, 2, 0, 0, 0),
+(53576, 0, 10, 2097152, 0, 0, 0, 2, 0, 0, 0),
+(53601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6),
+(53671, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(53673, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(54149, 0, 10, 2097152, 0, 0, 0, 2, 0, 0, 0),
+(54151, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(54154, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(54155, 0, 10, 8388608, 0, 0, 0, 0, 0, 0, 0),
+(54278, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(54486, 0, 0, 536870945, 36864, 0, 0, 0, 0, 0, 0),
+(54488, 0, 0, 536870945, 36864, 0, 0, 0, 0, 0, 0),
+(54489, 0, 0, 536870945, 36864, 0, 0, 0, 0, 0, 0),
+(54490, 0, 0, 536870945, 36864, 0, 0, 0, 0, 0, 0),
+(54738, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(54747, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(54749, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0),
+(54754, 0, 7, 16, 0, 0, 0, 0, 0, 0, 0),
+(54841, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(54936, 0, 10, 1073741824, 0, 0, 0, 0, 0, 0, 0),
+(54937, 0, 10, 2147483648, 0, 0, 0, 0, 0, 0, 0),
+(54939, 0, 10, 32768, 0, 0, 0, 0, 0, 0, 0),
+(55440, 0, 11, 64, 0, 0, 0, 0, 0, 0, 0),
+(55620, 0, 15, 1, 134217728, 0, 0, 0, 0, 0, 0),
+(55623, 0, 15, 1, 134217728, 0, 0, 0, 0, 0, 0),
+(55666, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0),
+(55667, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0),
+(55668, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0),
+(55669, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0),
+(55670, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0),
+(55677, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0),
+(55680, 0, 6, 512, 0, 0, 0, 0, 0, 0, 0),
+(55689, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(56218, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0),
+(56333, 0, 9, 4, 0, 512, 0, 0, 0, 0, 0),
+(56336, 0, 9, 4, 0, 512, 0, 0, 0, 0, 0),
+(56337, 0, 9, 4, 0, 512, 0, 0, 0, 0, 0),
+(56342, 0, 9, 16384, 0, 0, 0, 0, 0, 0, 0),
+(56343, 0, 9, 16384, 0, 0, 0, 0, 0, 0, 0),
+(56344, 0, 9, 16384, 0, 0, 0, 0, 0, 0, 0),
+(56364, 0, 3, 0, 16777216, 0, 0, 0, 0, 0, 0),
+(56451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(56611, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(56612, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(56613, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(56614, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(56636, 0, 4, 32, 0, 0, 0, 0, 0, 0, 0),
+(56637, 0, 4, 32, 0, 0, 0, 0, 0, 0, 0),
+(56638, 0, 4, 32, 0, 0, 0, 0, 0, 0, 0),
+(56821, 0, 8, 2, 0, 0, 0, 2, 0, 0, 0),
+(56822, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0),
+(56834, 0, 15, 4456448, 0, 0, 0, 0, 0, 0, 0),
+(56835, 0, 15, 4456448, 0, 0, 0, 0, 0, 0, 0),
+(57878, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0),
+(57880, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0),
+(57881, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0),
+(57960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3),
+(58357, 0, 4, 64, 0, 0, 0, 2, 0, 0, 0),
+(58364, 0, 4, 1024, 0, 0, 0, 0, 0, 0, 0),
+(58372, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0),
+(58386, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0),
+(58435, 0, 5, 2, 256, 0, 0, 0, 0, 0, 0),
+(58436, 0, 5, 2, 256, 0, 0, 0, 0, 0, 0),
+(58437, 0, 5, 2, 256, 0, 0, 0, 0, 0, 0),
+(58616, 0, 15, 262144, 0, 0, 0, 0, 0, 0, 0),
+(58620, 0, 15, 0, 16384, 0, 0, 0, 0, 0, 0),
+(58626, 0, 15, 33554432, 0, 0, 0, 0, 0, 0, 0),
+(58631, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0),
+(58642, 0, 15, 0, 134217728, 0, 0, 0, 0, 0, 0),
+(58644, 0, 15, 0, 4, 0, 0, 0, 0, 0, 0),
+(58647, 0, 15, 0, 4, 0, 0, 0, 0, 0, 0),
+(58676, 0, 15, 0, 8, 0, 0, 0, 0, 0, 0),
+(58677, 0, 15, 8192, 0, 0, 0, 0, 0, 0, 0),
+(58872, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(58874, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0),
+(58901, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(59057, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0),
+(59176, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(59327, 0, 15, 134217728, 0, 0, 0, 0, 0, 0, 0),
+(59725, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0),
+(60132, 0, 15, 0, 134348800, 0, 0, 0, 0, 0, 0),
+(60170, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0),
+(60172, 0, 5, 262144, 0, 0, 0, 65536, 0, 0, 0),
+(60200, 0, 15, 4096, 0, 0, 0, 65536, 0, 0, 0),
+(60493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45),
+(60503, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0),
+(60537, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0),
+(60564, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(60571, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(60572, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(60573, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(60574, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(60575, 0, 11, 2416967680, 0, 0, 0, 0, 0, 0, 0),
+(60617, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0),
+(60710, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(60717, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(60719, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(60722, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(60724, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(60726, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0),
+(60770, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0),
+(60818, 0, 10, 0, 512, 0, 0, 0, 0, 0, 0),
+(60826, 0, 15, 20971520, 0, 0, 0, 0, 0, 0, 0),
+(61188, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0),
+(61257, 0, 0, 0, 0, 0, 131752, 65536, 0, 0, 0),
+(61324, 0, 10, 0, 131072, 0, 0, 0, 0, 0, 0),
+(61846, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0),
+(61847, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0);
diff --git a/sql/updates/1206_world_scripts.sql b/sql/updates/1206_world_scripts.sql
new file mode 100644
index 00000000000..b35e054f57c
--- /dev/null
+++ b/sql/updates/1206_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `gameobject_template` SET `ScriptName`='go_legion_obelisk' WHERE `entry` IN (185193,185195,185196,185197,185198); \ No newline at end of file
diff --git a/sql/updates/1207_world_scripts.sql b/sql/updates/1207_world_scripts.sql
new file mode 100644
index 00000000000..070a4af8597
--- /dev/null
+++ b/sql/updates/1207_world_scripts.sql
@@ -0,0 +1,2 @@
+UPDATE `creature_template` SET `ScriptName`='npc_surristrasz' WHERE `entry`=24795;
+UPDATE `creature_template` SET `ScriptName`='npc_tiare' WHERE `entry`=30051; \ No newline at end of file
diff --git a/sql/updates/1237_mangos_7230_01_world_spell_bonus_data.sql b/sql/updates/1237_mangos_7230_01_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..4b12bf6c546
--- /dev/null
+++ b/sql/updates/1237_mangos_7230_01_world_spell_bonus_data.sql
@@ -0,0 +1,9 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7230_01_mangos_spell_chain required_7230_02_mangos_spell_bonus_data bit;*/
+
+DELETE FROM `spell_bonus_data` WHERE `entry` IN (18220,18937,18938,27265,59092);
+INSERT INTO `spell_bonus_data` VALUES
+('18220', '0.96', '0', '0', 'Warlock - Dark Pact Rank 1'),
+('18937', '0.96', '0', '0', 'Warlock - Dark Pact Rank 2'),
+('18938', '0.96', '0', '0', 'Warlock - Dark Pact Rank 3'),
+('27265', '0.96', '0', '0', 'Warlock - Dark Pact Rank 4'),
+('59092', '0.96', '0', '0', 'Warlock - Dark Pact Rank 5'); \ No newline at end of file
diff --git a/sql/updates/1248_mangos_7235_01_world_command.sql b/sql/updates/1248_mangos_7235_01_world_command.sql
new file mode 100644
index 00000000000..0a28f49fc6e
--- /dev/null
+++ b/sql/updates/1248_mangos_7235_01_world_command.sql
@@ -0,0 +1,5 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7230_02_mangos_spell_bonus_data required_7235_01_mangos_command bit;*/
+
+DELETE FROM `command` WHERE `name` = 'reset achievements';
+INSERT INTO `command` VALUES
+('reset achievements',3,'Syntax: .reset achievements [$playername]\r\n\r\nReset achievements data for selected or named (online or offline) character. Achievements for persistance progress data like completed quests/etc re-filled at reset. Achievements for events like kills/casts/etc will lost.'); \ No newline at end of file
diff --git a/sql/updates/1288_mangos_7242_01_world_spell_bonus_data.sql b/sql/updates/1288_mangos_7242_01_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..62ea0ef7771
--- /dev/null
+++ b/sql/updates/1288_mangos_7242_01_world_spell_bonus_data.sql
@@ -0,0 +1,7 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7235_01_mangos_command required_7242_01_mangos_spell_bonus_data bit;*/
+
+DELETE FROM spell_bonus_data WHERE entry IN (34913, 43043, 43044);
+INSERT INTO spell_bonus_data VALUES
+ (34913, 0, 0, 0, 'Mage - Molten Armor Triggered Rank 1'),
+ (43043, 0, 0, 0, 'Mage - Molten Armor Triggered Rank 2'),
+ (43044, 0, 0, 0, 'Mage - Molten Armor Triggered Rank 3'); \ No newline at end of file
diff --git a/sql/updates/1293_mangos_7249_01_world_spell_proc_event.sql b/sql/updates/1293_mangos_7249_01_world_spell_proc_event.sql
new file mode 100644
index 00000000000..80ec0871971
--- /dev/null
+++ b/sql/updates/1293_mangos_7249_01_world_spell_proc_event.sql
@@ -0,0 +1,3 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7242_01_mangos_spell_bonus_data required_7249_01_mangos_spell_proc_event bit;*/
+
+DELETE FROM `spell_proc_event` WHERE `entry`='60200';
diff --git a/sql/updates/1296_mangos_7252_01_world_command.sql b/sql/updates/1296_mangos_7252_01_world_command.sql
new file mode 100644
index 00000000000..ffbdda8cfc0
--- /dev/null
+++ b/sql/updates/1296_mangos_7252_01_world_command.sql
@@ -0,0 +1,6 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7251_01_mangos_spell_chain required_7252_01_mangos_command bit;*/
+
+DELETE FROM `command` WHERE `name` IN ('debug arena','debug bg');
+INSERT INTO `command` VALUES
+('debug arena',3,'Syntax: .debug arena\r\n\r\nToggle debug mode for arenas. In debug mode GM can start arena with single player.'),
+('debug bg',3,'Syntax: .debug bg\r\n\r\nToggle debug mode for battlegrounds. In debug mode GM can start battleground with single player.'); \ No newline at end of file
diff --git a/sql/updates/1296_mangos_7252_02_world_trinity_string.sql b/sql/updates/1296_mangos_7252_02_world_trinity_string.sql
new file mode 100644
index 00000000000..021508502b9
--- /dev/null
+++ b/sql/updates/1296_mangos_7252_02_world_trinity_string.sql
@@ -0,0 +1,14 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7252_01_mangos_command required_7252_02_mangos_mangos_string bit;*/
+
+DELETE FROM `trinity_string` WHERE entry IN (737,738,739,740,741,742,743,744,745,746);
+INSERT INTO `trinity_string` VALUES
+(737,'Arenas are set to 1v1 for debugging. So, don\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(738,'Arenas are set to normal playercount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(739,'Battlegrounds are set to 1v0 for debugging.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(740,'Battlegrounds are set to normal playercount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(741,'Flushing Arena points based on team ratings, this may take a few minutes. Please stand by...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(742,'Distributing arena points to players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(743,'Finished setting arena points for online players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(744,'Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(745,'Modification done.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); \ No newline at end of file
diff --git a/sql/updates/1299_mangos_7255_01_characters_characters.sql b/sql/updates/1299_mangos_7255_01_characters_characters.sql
new file mode 100644
index 00000000000..236339bd5a3
--- /dev/null
+++ b/sql/updates/1299_mangos_7255_01_characters_characters.sql
@@ -0,0 +1,10 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7251_02_characters_character_spell required_7255_01_characters_characters bit;*/
+
+ALTER TABLE `characters`
+ ADD COLUMN `bgid` int(10) unsigned NOT NULL default '0' AFTER `latency`,
+ ADD COLUMN `bgteam` int(10) unsigned NOT NULL default '0' AFTER `bgid`,
+ ADD COLUMN `bgmap` int(10) unsigned NOT NULL default '0' AFTER `bgteam`,
+ ADD COLUMN `bgx` float NOT NULL default '0' AFTER `bgmap`,
+ ADD COLUMN `bgy` float NOT NULL default '0' AFTER `bgx`,
+ ADD COLUMN `bgz` float NOT NULL default '0' AFTER `bgy`,
+ ADD COLUMN `bgo` float NOT NULL default '0' AFTER `bgz`; \ No newline at end of file
diff --git a/sql/updates/1307_world.sql b/sql/updates/1307_world.sql
new file mode 100644
index 00000000000..ec7c218c0a1
--- /dev/null
+++ b/sql/updates/1307_world.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_stormwind_harbor_taxi' WHERE `entry`=29154; \ No newline at end of file
diff --git a/sql/updates/1312_world.sql b/sql/updates/1312_world.sql
new file mode 100644
index 00000000000..01a27d0fa48
--- /dev/null
+++ b/sql/updates/1312_world.sql
@@ -0,0 +1,16 @@
+UPDATE `creature_template` SET `scriptname` = 'boss_keleseth' WHERE `entry` = '23953';
+UPDATE `creature_template` SET `scriptname` = 'mob_frost_tomb' WHERE `entry` = '23965';
+UPDATE `instance_template` SET `script`='instance_utgarde_keep' WHERE `map`= '574';
+
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1574000, 'Your blood is mine!',13221,1,0,'keleseth SAY_AGGRO'),
+(-1574001, 'Darkness waits',13223,1,0, 'keleseth SAY_KILL'),
+(-1574002, 'I join... the night.',13225,1,0, 'keleseth SAY_DEATH'),
+(-1574003, 'Not so fast.',13222,1,0, 'keleseth SAY_FROST_TOMB'),
+(-1574004, 'Aranal, lidel! Their fate shall be yours!',13224,1,0, 'keleseth SAY_SKELETONS');
+
+-- DB Data for testing
+-- REPLACE INTO `creature_template` (`entry`, `heroic_entry`, `modelid_A`, `modelid_A2`, `modelid_H`, `modelid_H2`, `name`, `subname`, `IconName`, `minlevel`, `maxlevel`, `minhealth`, `maxhealth`, `minmana`, `maxmana`, `armor`, `faction_A`, `faction_H`, `npcflag`, `speed`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `baseattacktime`, `rangeattacktime`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `class`, `race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `RacialLeader`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`) VALUES
+-- (23953, 0, 25338, 0, 25338, 0, 'Prince Keleseth', NULL, NULL, 70, 80, 192200, 417056, 0, 0, 6700, 16, 16, 2, 1, 1, 0, 445, 1200, 0, 58, 2000, 2200, 0, 0, 0, 0, 0, 0, 0, 1, 2, 100, 6, 76, 23953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '0', 0, 3, 3, 0, 0, 0, 0, 'boss_keleseth'),
+-- (23965, 0, 25865, 0, 25865, 0, 'Frost Tomb', NULL, NULL, 70, 80, 7345, 10465, 0, 0, 6700, 16, 16, 0, 1, 1, 0, 445, 1200, 0, 58, 2000, 2200, 0, 0, 0, 0, 0, 0, 0, 1, 2, 100, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '0', 0, 3, 3, 0, 0, 0, 0, 'mob_frost_tomb'),
+-- (23970, 0, 27651, 0, 27651, 0, 'Vrykul Skeleton', NULL, NULL, 70, 80, 7345, 10465, 0, 0, 6700, 16, 16, 0, 1, 1, 0, 445, 1200, 0, 58, 2000, 2200, 0, 0, 0, 0, 0, 0, 0, 1, 2, 100, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '0', 0, 3, 3, 0, 716, 0, 0, '0'); \ No newline at end of file
diff --git a/sql/updates/1327_world.sql b/sql/updates/1327_world.sql
new file mode 100644
index 00000000000..e7925102863
--- /dev/null
+++ b/sql/updates/1327_world.sql
@@ -0,0 +1,4 @@
+ALTER TABLE `creature_template` ADD COLUMN `spell5` mediumint(8) unsigned NOT NULL default '0' AFTER `spell4`;
+ALTER TABLE `creature_template` ADD COLUMN `spell6` mediumint(8) unsigned NOT NULL default '0' AFTER `spell5`;
+ALTER TABLE `creature_template` ADD COLUMN `spell7` mediumint(8) unsigned NOT NULL default '0' AFTER `spell6`;
+ALTER TABLE `creature_template` ADD COLUMN `spell8` mediumint(8) unsigned NOT NULL default '0' AFTER `spell7`; \ No newline at end of file
diff --git a/sql/updates/1351_world.sql b/sql/updates/1351_world.sql
new file mode 100644
index 00000000000..a3b797f8a4f
--- /dev/null
+++ b/sql/updates/1351_world.sql
@@ -0,0 +1,784 @@
+DROP TABLE IF EXISTS `trinity_string`;
+CREATE TABLE IF NOT EXISTS `trinity_string` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `content_default` text NOT NULL,
+ `content_loc1` text,
+ `content_loc2` text,
+ `content_loc3` text,
+ `content_loc4` text,
+ `content_loc5` text,
+ `content_loc6` text,
+ `content_loc7` text,
+ `content_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `mangos_string`
+--
+
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(1, 'You should select a character or a creature.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(2, 'You should select a creature.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(3, '|cffff0000[System Message]: %s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(4, '|cffff0000[Event Message]: %s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5, 'There is no help for that command', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(6, 'There is no such command', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(7, 'There is no such subcommand', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(8, 'Command %s have subcommands:%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(9, 'Commands available to you:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10, 'Incorrect syntax.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(11, 'Your account level is: %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(12, 'Online players: %u (max: %u) Queued players: %u (max: %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(13, 'Server uptime: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(14, 'Player saved.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(15, 'All players saved.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(16, 'There are the following active GMs on this server:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(17, 'There are no GMs currently logged in on this server.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(18, 'Cannot do that while flying.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(19, 'Cannot do that in Battlegrounds.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(20, 'Target is flying you can''t do that.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(21, '%s is flying command failed.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(22, 'You are not mounted so you can''t dismount.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(23, 'Cannot do that while fighting.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(24, 'You used it recently.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(25, 'Password not changed (unknown error)!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(26, 'The password was changed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(27, 'The new passwords do not match or the old password is wrong', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(28, 'Your account is now locked.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(29, 'Your account is now unlocked.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(30, ', rank ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(31, ' [known]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(32, ' [learn]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(33, ' [passive]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(34, ' [talent]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(35, ' [active]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(36, ' [complete]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(37, ' (offline)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(38, 'on', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(39, 'off', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(40, 'You are: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(41, 'visible', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(42, 'invisible', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(43, 'done', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(44, 'You', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(45, ' <unknown> ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(46, '<error>', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(47, '<non-existing character>', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(48, 'UNKNOWN', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(49, 'You must be at least level %u to enter.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(50, 'You must be at least level %u and have item %s to enter.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(51, 'Hello! Ready for some training?', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(52, 'Invaid item count (%u) for item %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(53, 'Mail can''t have more %u item stacks', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(54, 'The new passwords do not match', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(55, 'Your password can''t be longer than 16 characters (client limit), password not changed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(56, 'Current Message of the day: \r\n%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(57, 'Using World DB: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(58, 'Using script library: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(100, 'Global notify: ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(101, 'Map: %u (%s) Zone: %u (%s) Area: %u (%s)\nX: %f Y: %f Z: %f Orientation: %f\ngrid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(102, '%s is already being teleported.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(103, 'You can summon a player to your instance only if he is in your party with you as leader.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(104, 'You cannot go to the player''s instance because you are in a party now.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(105, 'You can go to the player''s instance while not being in his party only if your GM mode is on.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(106, 'You can not go to player %s from instance to instance.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(107, 'You can not summon player %s from instance to instance.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(108, 'You are summoning %s%s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(109, 'You are being summoned by %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(110, 'You are teleporting %s%s to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(111, 'You are being teleported by %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(112, 'Player (%s) does not exist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(113, 'Appearing at %s''s location.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(114, '%s is appearing to your location.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(115, 'Incorrect values.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(116, 'No character selected.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(117, '%s is not in a group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(118, 'You changed HP of %s to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(119, '%s changed your HP to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(120, 'You changed MANA of %s to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(121, '%s changed your MANA to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(122, 'You changed ENERGY of %s to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(123, '%s changed your ENERGY to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(124, 'Current energy: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(125, 'You changed rage of %s to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(126, '%s changed your rage to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(127, 'You changed level of %s to %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(128, 'GUID %i, faction is %i, flags is %i, npcflag is %i, DY flag is %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(129, 'Wrong faction: %u (not found in factiontemplate.dbc).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(130, 'You changed GUID=%i ''s Faction to %i, flags to %i, npcflag to %i, dyflag to %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(131, 'You changed the spellflatid=%i, val= %i, mark =%i to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(132, '%s changed your spellflatid=%i, val= %i, mark =%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(133, '%s has access to all taxi nodes now (until logout).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(134, '%s has no more access to all taxi nodes now (only visited accessible).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(135, '%s has given you access to all taxi nodes (until logout).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(136, '%s has removed access to all taxi nodes (only visited still accessible).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(137, 'You set all speeds to %2.2f from normal of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(138, '%s set all your speeds to %2.2f from normal.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(139, 'You set the speed to %2.2f from normal of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(140, '%s set your speed to %2.2f from normal.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(141, 'You set the swim speed to %2.2f from normal of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(142, '%s set your swim speed to %2.2f from normal.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(143, 'You set the backwards run speed to %2.2f from normal of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(144, '%s set your backwards run speed to %2.2f from normal.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(145, 'You set the fly speed to %2.2f from normal of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(146, '%s set your fly speed to %2.2f from normal.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(147, 'You set the size %2.2f of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(148, '%s set your size to %2.2f.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(149, 'There is no such mount.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(150, 'You give a mount to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(151, '%s gave you a mount.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(152, 'USER1: %i, ADD: %i, DIF: %i\n', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(153, 'You take all copper of %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(154, '%s took you all of your copper.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(155, 'You take %i copper from %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(156, '%s took %i copper from you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(157, 'You give %i copper to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(158, '%s gave you %i copper.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(159, 'You hear sound %u.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(160, 'USER2: %i, ADD: %i, RESULT: %i\n', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(161, 'Removed bit %i in field %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(162, 'Set bit %i in field %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(163, 'Teleport location table is empty!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(164, 'Teleport location not found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(165, 'Requires search parameter.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(166, 'There are no teleport locations matching your request.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(168, 'Locations found are:\n%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(169, 'Mail sent to %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(170, 'You try to hear sound %u but it doesn''t exist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(172, 'server console command', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(173, 'You changed runic power of %s to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(174, '%s changed your runic power to %i/%i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(200, 'No selection.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(201, 'Object GUID is: lowpart %u highpart %X', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(202, 'The name was too long by %i characters.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(203, 'Error, name can only contain characters A-Z and a-z.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(204, 'The subname was too long by %i characters.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(205, 'Not yet implemented', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(206, 'Item ''%i'' ''%s'' added to list with maxcount ''%i'' and incrtime ''%i'' and extendedcost ''%i''', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(207, 'Item ''%i'' not found in database.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(208, 'Item ''%i'' ''%s'' deleted from vendor list', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(209, 'Item ''%i'' not found in vendor list.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(210, 'Item ''%i'' already in vendor list.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(211, 'Spells of %s reset.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(212, 'Spells of %s will reset at next login.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(213, 'Talents of %s reset.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(214, 'Talents of %s will reset at next login.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(215, 'Your spells have been reset.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(216, 'Your talents have been reset.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(217, 'Unknown case ''%s'' for .resetall command. Type full correct case name.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(218, 'Spells will reset for all players at login. Strongly recommend re-login!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(219, 'Talents will reset for all players at login. Strongly recommend re-login!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(220, 'Creature (GUID: %u) No waypoint found.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(221, 'Creature (GUID: %u) Last waypoint not found.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(222, 'Creature (GUID: %u) No waypoint found - used ''wpguid''. Now trying to find it by its position...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(223, 'Creature (GUID: %u) No waypoints found - This is a MaNGOS db problem (single float).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(224, 'Selected creature is ignored - provided GUID is used', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(225, 'Creature (GUID: %u) not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(226, 'You must select a visual waypoint.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(227, 'No visual waypoints found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(228, 'Could not create visual waypoint with creatureID: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(229, 'All visual waypoints removed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(230, 'Could not create waypoint-creature with ID: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(231, 'No GUID provided.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(232, 'No waypoint number provided.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(233, 'Argument required for ''%s''.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(234, 'Waypoint %i added to GUID: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(235, 'Waypoint %d added.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(236, 'Waypoint changed.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(237, 'Waypoint %s modified.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(238, 'WP export successfull.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(239, 'No waypoints found inside the database.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(240, 'File imported.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(241, 'Waypoint removed.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(242, 'Warning: Could not delete WP from the world with ID: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(243, 'This happens if the waypoint is too far away from your char.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(244, 'The WP is deleted from the database, but not from the world here.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(245, 'They will disappear after a server restart.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(246, 'Waypoint %d: Info for creature: %s, GUID: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(247, 'Waittime: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(248, 'Model %d: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(249, 'Emote: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(250, 'Spell: %d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(251, 'Text%d (ID: %i): %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(252, 'AIScript: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(253, 'Forced rename for player %s will be requested at next login.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(254, 'Forced rename for player %s (GUID #%u) will be requested at next login.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(255, 'Waypoint-Creature (GUID: %u) Not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(256, 'Could not find NPC...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(257, 'Creature movement type set to ''%s'', waypoints removed (if any).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(258, 'Creature movement type set to ''%s'', waypoints were not removed.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(259, 'Incorrect value, use on or off', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(260, 'Value saved.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(261, 'Value saved, you may need to rejoin or clean your client cache.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(262, 'Areatrigger ID %u not found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(263, 'Target map or coordinates is invalid (X: %f Y: %f MapId: %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(264, 'Zone coordinates is invalid (X: %f Y: %f AreaId: %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(265, 'Zone %u (%s) is part of instanceable map %u (%s)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(266, 'Nothing found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(267, 'Object not found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(268, 'Creature not found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(269, 'Warning: Mob found more than once - you will be teleported to the first one found in DB.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(270, 'Creature Removed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(271, 'Creature moved.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(272, 'Creature (GUID:%u) must be on the same map as player!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(273, 'Game Object (GUID: %u) not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(274, 'Game Object (GUID: %u) has references in not found creature %u GO list, can''t be deleted.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(275, 'Game Object (GUID: %u) removed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(276, 'Game Object (GUID: %u) turned', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(277, 'Game Object (GUID: %u) moved', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(278, 'You must select a vendor', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(279, 'You must send id for item', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(280, 'Vendor has too many items (max 128)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(281, 'You can''t kick self, logout instead', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(282, 'Player %s kicked.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(283, 'Player %s not found.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(284, 'Accepting Whisper: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(285, 'Accepting Whisper: ON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(286, 'Accepting Whisper: OFF', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(287, 'Creature (GUID: %u) not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(288, 'Tickets count: %i show new tickets: %s\n', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(289, 'New ticket from %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(290, 'Ticket of %s (Last updated: %s):\n%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(291, 'New ticket show: ON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(292, 'New ticket show: OFF', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(293, 'Ticket %i doesn''t exist', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(294, 'All tickets deleted.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(295, 'Character %s ticket deleted.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(296, 'Ticket deleted.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(297, 'Spawn distance changed to: %f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(298, 'Spawn time changed to: %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(299, 'The honor of %s was set to %u!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(300, 'Your chat has been disabled for %u minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(301, 'You have disabled %s''s chat for %u minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(302, 'Player''s chat is already enabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(303, 'Your chat has been enabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(304, 'You have enabled %s''s chat.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(305, 'Faction %s (%u) reputation of %s was set to %5d!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(306, 'The arena points of %s was set to %u!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(307, 'No faction found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(308, 'Faction %i unknown!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(309, 'Invalid parameter %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(310, 'delta must be between 0 and %d (inclusive)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(311, '%d - |cffffffff|Hfaction:%d|h[%s]|h|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(312, ' [visible]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(313, ' [at war]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(314, ' [peace forced]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(315, ' [hidden]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(316, ' [invisible forced]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(317, ' [inactive]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(318, 'Hated', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(319, 'Hostile', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(320, 'Unfriendly', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(321, 'Neutral', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(322, 'Friendly', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(323, 'Honored', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(324, 'Revered', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(325, 'Exalted', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(326, 'Faction %s (%u) can''not have reputation.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(327, ' [no reputation]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(328, 'Characters at account %s (Id: %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(329, ' %s (GUID %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(330, 'No players found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(331, 'Extended item cost %u not exist', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(332, 'GM mode is ON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(333, 'GM mode is OFF', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(334, 'GM Chat Badge is ON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(335, 'GM Chat Badge is OFF', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(336, 'You repair all %s''s items.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(337, 'All your items repaired by %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(338, 'You set waterwalk mode %s for %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(339, 'Your waterwalk mode %s by %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(340, '%s is now following you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(341, '%s is not following you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(342, '%s is now not following you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(343, 'Creature (Entry: %u) cannot be tamed.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(344, 'You already have pet.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(345, 'Forced customize for player %s will be requested at next login.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(346, 'Forced customize for player %s (GUID #%u) will be requested at next login.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(400, '|cffff0000[System Message]:|rScripts reloaded', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(401, 'You change security level of account %s to %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(402, '%s changed your security level to %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(403, 'You have low security level for this.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(404, 'Creature movement disabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(405, 'Creature movement enabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(406, 'Weather can''t be changed for this zone.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(407, 'Weather system disabled at server.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(408, '%s is banned for %s. Reason: %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(409, '%s is banned permanently for %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(410, '%s %s not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(411, '%s unbanned.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(412, 'There was an error removing the ban on %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(413, 'Account not exist: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(414, 'There is no such character.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(415, 'There is no such IP in banlist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(416, 'Account %s has never been banned', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(417, 'Ban history for account %s:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(418, 'Ban Date: %s Bantime: %s Still active: %s Reason: %s Set by: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(419, 'Inf.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(420, 'Never', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(421, 'Yes', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(422, 'No', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(423, 'IP: %s\nBan Date: %s\nUnban Date: %s\nRemaining: %s\nReason: %s\nSet by: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(424, 'There is no matching IPban.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(425, 'There is no matching account.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(426, 'There is no banned account owning a character matching this part.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(427, 'The following IPs match your pattern:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(428, 'The following accounts match your query:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(429, 'You learned many spells/skills.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(430, 'You learned all spells for class.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(431, 'You learned all talents for class.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(432, 'You learned all languages.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(433, 'You learned all craft skills and recipes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(434, 'Could not find ''%s''', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(435, 'Invalid item id: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(436, 'No items found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(437, 'Invalid gameobject id: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(438, 'Found items %u: %u ( inventory %u mail %u auction %u guild %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(439, 'Found gameobjects %u: %u ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(440, 'Invalid creature id: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(441, 'Found creatures %u: %u ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(442, 'No area found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(443, 'No item sets found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(444, 'No skills found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(445, 'No spells found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(446, 'No quests found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(447, 'No creatures found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(448, 'No gameobjects found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(449, 'Graveyard #%u doesn''t exist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(450, 'Graveyard #%u already linked to zone #%u (current).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(451, 'Graveyard #%u linked to zone #%u (current).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(452, 'Graveyard #%u can''t be linked to subzone or not existed zone #%u (internal error).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(454, 'No faction in Graveyard with id= #%u , fix your DB', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(455, 'invalid team, please fix database', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(456, 'any', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(457, 'alliance', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(458, 'horde', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(459, 'Graveyard #%u (faction: %s) is nearest from linked to zone #%u.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(460, 'Zone #%u doesn''t have linked graveyards.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(461, 'Zone #%u doesn''t have linked graveyards for faction: %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(462, 'Teleport location already exists!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(463, 'Teleport location added.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(464, 'Teleport location NOT added: database error.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(465, 'Teleport location deleted.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(467, 'Target unit has %d auras:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(468, 'id: %d eff: %d type: %d duration: %d maxduration: %d name: %s%s%s caster: %s %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(469, 'Target unit has %d auras of type %d:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(470, 'id: %d eff: %d name: %s%s%s caster: %s %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(471, 'Quest %u not found.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(472, 'Quest %u started from item. For correct work, please, add item to inventory and start quest in normal way: .additem %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(473, 'Quest removed.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(474, ' [rewarded]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(475, ' [complete]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(476, ' [active]', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(477, '%s''s Fly Mode %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(478, 'Opcode %u sent to %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(479, 'Character loaded successfully!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(480, 'Failed to load the character!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(481, 'Character dumped successfully!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(482, 'Character dump failed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(483, 'Spell %u broken and not allowed to cast or learn!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(484, 'Skill %u (%s) for player %s set to %u and current maximum set to %u (without permanent (talent) bonuses).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(485, 'Player %s must have skill %u (%s) before using this command.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(486, 'Invalid skill id (%u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(487, 'You learned default GM spells/skills.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(488, 'You already know that spell.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(489, 'Target(%s) already know that spell.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(490, '%s doesn''t know that spell.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(491, 'You already forgot that spell.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(492, 'All spell cooldowns removed for %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(493, 'Spell %u cooldown removed for %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(494, 'Command : Additem, itemId = %i, amount = %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(495, 'Command : Additemset, itemsetId = %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(496, 'Removed itemID = %i, amount = %i from %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(497, 'Cannot create item ''%i'' (amount: %i)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(498, 'You need to provide a guild name!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(499, 'Player not found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(500, 'Player already has a guild!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(501, 'Guild not created! (already exists?)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(502, 'No items from itemset ''%u'' found.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(503, 'The distance is: (3D) %f (2D) %f yards.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(504, 'Item ''%i'' ''%s'' Item Slot %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(505, 'Item ''%i'' doesn''t exist.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(506, 'Item ''%i'' ''%s'' Added to Slot %i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(507, 'Item save failed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(508, '%d - owner: %s (guid: %u account: %u ) %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(509, '%d - sender: %s (guid: %u account: %u ) receiver: %s (guid: %u account: %u ) %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(510, '%d - owner: %s (guid: %u account: %u ) %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(511, 'Wrong link type!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(512, '%d - |cffffffff|Hitem:%d:0:0:0:0:0:0:0|h[%s]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(513, '%d - |cffffffff|Hquest:%d|h[%s]|h|r %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(514, '%d - |cffffffff|Hcreature_entry:%d|h[%s]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(515, '%d - |cffffffff|Hcreature:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(516, '%d - |cffffffff|Hgameobject_entry:%d|h[%s]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(517, '%d - |cffffffff|Hgameobject:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(518, '%d - |cffffffff|Hitemset:%d|h[%s %s]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(519, '|cffffffff|Htele:%s|h[%s]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(520, '%d - |cffffffff|Hspell:%d|h[%s]|h|r ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(521, '%d - |cffffffff|Hskill:%d|h[%s %s]|h|r %s %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(522, 'Game Object (GUID: %u) not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(523, '>> Game Object %s (GUID: %u) at %f %f %f. Orientation %f.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(524, 'Selected object:\n|cffffffff|Hitemset:%d|h[%s]|h|r\nGUID: %u ID: %u\nX: %f Y: %f Z: %f MapId: %u\nOrientation: %f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(525, '>> Add Game Object ''%i'' (%s) (GUID: %i) added at ''%f %f %f''.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(526, '%s (lowguid: %u) movement generators stack:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(527, ' Idle', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(528, ' Random', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(529, ' Waypoint', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(530, ' Animal random', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(531, ' Confused', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(532, ' Targeted to player %s (lowguid %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(533, ' Targeted to creature %s (lowguid %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(534, ' Targeted to <NULL>', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(535, ' Home movement to (X:%f Y:%f Z:%f)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(536, ' Home movement used for player?!?', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(537, ' Taxi flight', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(538, ' Unknown movement generator (%u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(539, 'Player selected NPC\nGUID: %u.\nFaction: %u.\nnpcFlags: %u.\nEntry: %u.\nDisplayID: %u (Native: %u).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(540, 'Level: %u.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(541, 'Health (base): %u. (max): %u. (current): %u.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(542, 'Field Flags: %u.\nDynamic Flags: %u.\nFaction Template: %u.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(543, 'Loot: %u Pickpocket: %u Skinning: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(544, 'Position: %f %f %f.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(545, '*** Is a vendor!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(546, '*** Is a trainer!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(547, 'InstanceID: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(548, 'Player%s %s (guid: %u) Account: %s (id: %u) GMLevel: %u Last IP: %s Last login: %s Latency: %ums', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(549, 'Played time: %s Level: %u Money: %ug%us%uc', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(550, 'Command .pinfo doesn''t support ''rep'' option for offline players.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(551, '%s has explored all zones now.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(552, '%s has no more explored zones.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(553, '%s has explored all zones for you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(554, '%s has hidden all zones from you.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(555, 'Hover enabled', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(556, 'Hover disabled', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(557, 'You have been leveled up (%i)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(558, 'You have been leveled down (%i)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(559, 'Your level progress has been reset.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(560, 'The area has been set as explored.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(561, 'The area has been set as not explored.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(562, 'GUID=%i ''s updateIndex: %i, value: %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(563, 'You change GUID=%i ''s UpdateIndex: %i value to %i.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(564, 'The value index %u is too big to %u(count: %u).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(565, 'Set %u uint32 Value:[OPCODE]:%u [VALUE]:%u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(566, 'You Set %u Field:%u to uint32 Value: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(567, 'Set %u float Value:[OPCODE]:%u [VALUE]:%f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(568, 'You Set %u Field:%i to float Value: %f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(569, 'Get %u uint32 Value:[OPCODE]:%u [VALUE]:%u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(570, 'The uint32 value of %u in %u is: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(571, 'Get %u float Value:[OPCODE]:%u [VALUE]:%f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(572, 'The float of %u value in %u is: %f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(573, '.Set32Bit:[OPCODE]:%u [VALUE]:%u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(574, 'You set Bit of Field:%u to Value: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(575, '.Mod32Value:[OPCODE]:%u [VALUE]:%i', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(576, 'You modified the value of Field:%u to Value: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(577, 'You are now invisible.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(578, 'You are now visible.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(579, 'Selected player or creature not have victim.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(580, 'Player %s learned all default spells for race/class and completed quests rewarded spells.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(581, 'Found near gameobjects (distance %f): %u ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(582, 'SpawnTime: Full:%s Remain:%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(583, '%d - |cffffffff|Hgameevent:%d|h[%s]|h|r%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(584, 'No event found!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(585, 'Event not exist!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(586, 'Event %u: %s%s\nStart: %s End: %s Occurence: %s Length: %s\nNext state change: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(587, 'Event %u already active!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(588, 'Event %u not active!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(589, ' Point movement to (X:%f Y:%f Z:%f)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(590, ' Fear movement', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(591, ' Distract movement', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(592, 'You have learned all spells in craft: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(593, 'Currently Banned Accounts:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(594, '| Account | BanDate | UnbanDate | Banned By | Ban Reason |', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(595, 'Currently Banned IPs:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(596, '| IP | BanDate | UnbanDate | Banned By | Ban Reason |', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(597, 'Current gamemasters:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(598, '| Account | GM |', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(599, 'No gamemasters.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(600, 'The Alliance wins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(601, 'The Horde wins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(602, 'The battle for Warsong Gulch begins in 1 minute.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(603, 'The battle for Warsong Gulch begins in 30 seconds. Prepare yourselves!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(604, 'Let the battle for Warsong Gulch begin!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(605, '$n captured the Horde flag!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(606, '$n captured the Alliance flag!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(607, 'The Horde flag was dropped by $n!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(608, 'The Alliance Flag was dropped by $n!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(609, 'The Alliance Flag was returned to its base by $n!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(610, 'The Horde flag was returned to its base by $n!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(611, 'The Horde flag was picked up by $n!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(612, 'The Alliance Flag was picked up by $n!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(613, 'The flags are now placed at their bases.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(614, 'The Alliance flag has been respawned!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(615, 'The Horde flag has been respawned!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(636, 'The Battle for Eye of the Storm begins in 1 minute.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(637, 'The Battle for Eye of the Storm begins in 30 seconds.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(638, 'The Battle for Eye of the Storm has begun!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(650, 'Alliance', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(651, 'Horde', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(652, 'stables', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(653, 'blacksmith', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(654, 'farm', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(655, 'lumber mill', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(656, 'mine', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(657, 'The %s has taken the %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(658, '$n has defended the %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(659, '$n has assaulted the %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(660, '$n claims the %s! If left unchallenged, the %s will control it in 1 minute!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(661, 'The Battle for Arathi Basin begins in 1 minute.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(662, 'The Battle for Arathi Basin begins in 30 seconds. Prepare yourselves!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(663, 'The Battle for Arathi Basin has begun!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(664, 'The Alliance has gathered $1776W resources, and is near victory!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(665, 'The Horde has gathered $1777W resources, and is near victory!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(666, 'After your recent battle in %s our best attempts to award you a Mark of Honor failed. Enclosed you will find the Mark of Honor we were not able to deliver to you at the time. Thanks for fighting in %s!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(667, 'The Alliance has taken control of the Mage Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(668, 'The Horde has taken control of the Mage Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(669, 'The Alliance has taken control of the Draenei Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(670, 'The Horde has taken control of the Draenei Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(671, 'The Alliance has taken control of the Blood Elf Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(672, 'The Horde has taken control of the Blood Elf Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(673, 'The Alliance has taken control of the Fel Reaver Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(674, 'The Horde has taken control of the Fel Reaver Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(675, 'The Alliance has lost control of the Mage Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(676, 'The Horde has lost control of the Mage Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(677, 'The Alliance has lost control of the Draenei Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(678, 'The Horde has lost control of the Draenei Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(679, 'The Alliance has lost control of the Blood Elf Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(680, 'The Horde has lost control of the Blood Elf Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(681, 'The Alliance has lost control of the Fel Reaver Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(682, 'The Horde has lost control of the Fel Reaver Ruins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(683, '$N has taken the flag!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(684, 'The Alliance has captured the flag!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(685, 'The Horde has captured the flag!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(686, 'The Flag has been dropped!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(687, 'The flag has been reset', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(700, 'You must be level %u to form an arena team', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(701, 'One minute until the Arena battle begins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(702, 'Thirty seconds until the Arena battle begins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(703, 'Fifteen seconds until the Arena battle begins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(704, 'The Arena battle has begun!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(705, 'You must wait %s before speaking again.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(706, 'This item(s) have problems with equipping/storing in inventory.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(707, '%s wishes to not be disturbed and cannot receive whisper messages: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(708, '%s is Away from Keyboard: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(709, 'Do not Disturb', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(710, 'Away from Keyboard', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(711, 'Queue status for %s (Lvl: %u to %u)\nQueued alliances: %u (Need at least %u more)\nQueued hordes: %u (Need at least %u more)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(712, '|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(713, 'You must be level %u to join an arena team!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(715, 'You don''t meet Battleground level requirements', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(717, '|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(718, '|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u : %u|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(719, '|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u : %u|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(720, 'Your group is too large for this battleground. Please regroup to join.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(721, 'Your group is too large for this arena. Please regroup to join.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(722, 'Your group has members not in your arena team. Please regroup to join.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(723, 'Your group does not have enough players to join this match.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(724, 'The Gold Team wins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(725, 'The Green Team wins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(726, 'There aren''t enough players in this battleground. It will end soon unless some more players join to balance the fight.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(727, 'Your group has an offline member. Please remove him before joining.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(728, 'Your group has players from the opposing faction. You can''t join the battleground as a group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(729, 'Your group has players from different battleground brakets. You can''t join as group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(730, 'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(731, 'Someone in your party is Deserter. You can''t join as group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(732, 'Someone in your party is already in three battleground queues. You cannot join as group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(733, 'You cannot teleport to a battleground or arena map.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(734, 'You cannot summon players to a battleground or arena map.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(735, 'You must be in GM mode to teleport to a player in a battleground.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(736, 'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(737, 'Arenas are set to 1v1 for debugging. So, don''t join as group.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(738, 'Arenas are set to normal playercount.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(739, 'Battlegrounds are set to 1v0 for debugging.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(740, 'Battlegrounds are set to normal playercount.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(741, 'Flushing Arena points based on team ratings, this may take a few minutes. Please stand by...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(742, 'Distributing arena points to players...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(743, 'Finished setting arena points for online players.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(744, 'Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(745, 'Modification done.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(746, 'Done flushing Arena points.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(785, 'Arena testing turned %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(786, '|cffff0000[Automatic]:|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(787, '|cffffff00[|c1f40af20Announce by|r |cffff0000%s|cffffff00]:|r %s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(800, 'Invalid name', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(801, 'You do not have enough gold', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(802, 'You do not have enough free slots', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(803, 'Your partner does not have enough free bag slots', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(804, 'You do not have permission to perform that function', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(805, 'Unknown language', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(806, 'You don''t know that language', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(807, 'Please provide character name', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(808, 'Player %s not found or offline', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(809, 'Account for character %s not found', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1000, 'Exiting daemon...', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1001, 'Account deleted: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1002, 'Account %s NOT deleted (probably sql file format was updated)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1003, 'Account %s NOT deleted (unknown error)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1004, 'Account created: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1005, 'Account name can''t be longer than 16 characters (client limit), account not created!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1006, 'Account with this name already exist!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1007, 'Account %s NOT created (probably sql file format was updated)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1008, 'Account %s NOT created (unknown error)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1009, 'Player %s (Guid: %u) Account %s (Id: %u) deleted.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1010, '| Account | Character | IP | GM | TBC |', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1011, '|<Error> | %20s |<Error> |<Er>|<Err>|', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1100, 'Account %s (Id: %u) have up to %u expansion allowed now.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1101, 'Message of the day changed to:\r\n%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1102, 'Message sent to %s: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1103, '%d - %s %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1104, '%d - %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1105, '%d - %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1106, '%d - %s %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1107, '%d - %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1108, '%d - %s %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1109, '%d - %s %s %s %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1110, '%d - %s X:%f Y:%f Z:%f MapId:%d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1111, '%d - %s X:%f Y:%f Z:%f MapId:%d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1112, 'Failed to open file: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1113, 'Account %s (%u) have max amount allowed characters (client limit)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1114, 'Dump file have broken data!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1115, 'Invalid character name!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1116, 'Invalid character guid!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1117, 'Character guid %u in use!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1118, '%d - guild: %s (guid: %u) %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1119, 'You must use male or female as gender.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1120, 'You change gender of %s to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1121, 'Your gender changed to %s by %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(1122, '(%u/%u +perm %u +temp %u)', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+
+(1200,'Alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1201,'Horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1202,'%s was destroyed by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1203,'The %s is under attack! If left unchecked, the %s will destroy it!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1204,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1205,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1206,'The %s was taken by the %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1207,'The %s is under attack! If left unchecked, the %s will capture it!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1208,'The %s has taken the %s! Its supplies will now be used for reinforcements!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1209,'Irondeep Mine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1210,'Coldtooth Mine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1211,'Stormpike Aid Station',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1212,'Dun Baldar South Bunker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1213,'Dun Baldar North Bunker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1214,'Stormpike Graveyard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1215,'Icewing Bunker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1216,'Stonehearth Graveyard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1217,'Stonehearth Bunker',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1218,'Snowfall Graveyard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1219,'Iceblood Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1220,'Iceblood Graveyard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1221,'Tower Point',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1222,'Frostwolf Graveyard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1223,'East Frostwolf Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1224,'West Frostwolf Tower',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1225,'Frostwolf Relief Hut',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1226,'The Battle for Alterac Valley begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1227,'The Battle for Alterac Valley begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1228,'The Battle for Alterac Valley has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1229,'The Alliance Team is running out of reinforcements!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1230,'The Horde Team is running out of reinforcements!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1231,'The Frostwolf General is Dead!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1232,'The Stormpike General is Dead!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(2000, '|cff00ff00New ticket from|r|cffff00ff %s.|r |cff00ff00Ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2001, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00edited his/her ticket:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2002, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00abandoned ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2003, '|cff00ff00Closed by|r:|cff00ccff %s|r ', '', '', '', '', '', '', '', ''),
+(2004, '|cff00ff00Deleted by|r:|cff00ccff %s|r ', '', '', '', '', '', '', '', ''),
+(2005, 'Ticket not found.', '', '', '', '', '', '', '', ''),
+(2006, 'Please close ticket before deleting it permanently.', '', '', '', '', '', '', '', ''),
+(2007, 'Ticket %d is already assigned.', '', '', '', '', '', '', '', ''),
+(2008, '%u Tickets succesfully reloaded from the database.', '', '', '', '', '', '', '', ''),
+(2009, 'Showing list of open tickets.', '', '', '', '', '', '', '', ''),
+(2010, 'Showing list of open tickets whose creator is online.', '', '', '', '', '', '', '', ''),
+(2011, 'Showing list of closed tickets.', '', '', '', '', '', '', '', ''),
+(2012, 'Invalid name specified. Name should be that of an online Gamemaster.', '', '', '', '', '', '', '', ''),
+(2013, 'This ticket is already assigned to yourself. To unassign use .ticket unassign %d and then reassign.', '', '', '', '', '', '', '', ''),
+(2014, 'Ticket %d is not assigned, you cannot unassign it.', '', '', '', '', '', '', '', ''),
+(2015, 'You cannot unassign tickets from staffmembers with a higher security level than yourself.', '', '', '', '', '', '', '', ''),
+(2016, 'Cannot close ticket %d, it is assigned to another GM.', '', '', '', '', '', '', '', ''),
+(2017, '|cff00ff00Ticket|r:|cff00ccff %d.|r ', '', '', '', '', '', '', '', ''),
+(2018, '|cff00ff00Created by|r:|cff00ccff %s|r ', '', '', '', '', '', '', '', ''),
+(2019, '|cff00ff00Last change|r:|cff00ccff %s ago|r ', '', '', '', '', '', '', '', ''),
+(2020, '|cff00ff00Assigned to|r:|cff00ccff %s|r ', '', '', '', '', '', '', '', ''),
+(2021, '|cff00ff00Unassigned by|r:|cff00ccff %s|r ', '', '', '', '', '', '', '', ''),
+(2022, '\n|cff00ff00Message|r: \"%s\"|r ', '', '', '', '', '', '', '', ''),
+(2023, '\n|cff00ff00Comment|r: \"%s\"|r ', '', '', '', '', '', '', '', ''),
+(2024, '\n|cff00ccff%s|r |cff00ff00Added comment|r: \"%s\"|r ', '', '', '', '', '', '', '', ''),
+
+(5000, 'You froze player %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5001, 'It might be amusing but no... you cant freeze yourself!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5002, 'Invalid input check the name of target.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5003, 'You unfroze player %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5004, 'There are no frozen players.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5005, 'Following players are frozen on the server:', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5006, '- %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(5009, 'Sound %u Played to server', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+
+(6613, '|cfff00000[GM Announcement]: %s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(6614, 'Notification to GM''s - ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(6615, '|cffffff00[|c1f40af20GM Announce by|r |cffff0000%s|cffffff00]:|r %s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+
+(10001, 'The Horde has taken The Overlook!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10002, 'The Alliance has taken The Overlook!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10003, 'The Horde has taken The Stadium!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10004, 'The Alliance has taken The Stadium!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10005, 'The Horde has taken Broken Hill!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10006, 'The Alliance has taken Broken Hill!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10007, 'The Horde lost The Overlook!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10008, 'The Alliance lost The Overlook!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10009, 'The Horde lost The Stadium!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10010, 'The Alliance lost The Stadium!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10011, 'The Horde lost Broken Hill!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10012, 'The Alliance lost Broken Hill!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10013, 'The Horde has taken the West Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10014, 'The Alliance has taken the West Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10015, 'The Horde has taken the East Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10016, 'The Alliance has taken the East Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10017, 'The Horde has captured the Twin Spire Graveyard!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10018, 'The Alliance has captured the Twin Spire Graveyard!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10019, 'The Horde lost the West Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10020, 'The Alliance lost the West Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10021, 'The Horde lost the East Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10022, 'The Alliance lost the East Beacon!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10023, 'The Horde lost the Twin Spire Graveyard!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10024, 'The Alliance lost the Twin Spire Graveyard!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10025, 'The Horde has captured Halaa!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10026, 'The Alliance has captured Halaa!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10027, 'The Horde lost Halaa!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10028, 'The Alliance lost Halaa!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10029, 'The Horde has taken a Spirit Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10030, 'The Alliance has taken a Spirit Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10031, 'The Horde lost a Spirit Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10032, 'The Alliance lost a Spirit Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10033, 'The Horde has taken the Northpass Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10034, 'The Alliance has taken the Northpass Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10035, 'The Horde has taken the Eastwall Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10036, 'The Alliance has taken the Eastwall Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10037, 'The Horde has taken the Crown Guard Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10038, 'The Alliance has taken the Crown Guard Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10039, 'The Horde has taken the Plaguewood Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10040, 'The Alliance has taken the Plaguewood Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10041, 'The Horde lost the Northpass Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10042, 'The Alliance lost the Northpass Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10043, 'The Horde lost the Eastwall Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10044, 'The Alliance lost the Eastwall Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10045, 'The Horde lost the Crown Guard Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10046, 'The Alliance lost the Crown Guard Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10047, 'The Horde lost the Plaguewood Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10048, 'The Alliance lost the Plaguewood Tower!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10049, 'The Horde has collected 200 silithyst!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10050, 'The Alliance has collected 200 silithyst!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10051, 'Take me to Northpass Tower.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10052, 'Take me to Eastwall Tower.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10053, 'Take me to Crown Guard Tower.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10054, 'Give me the flag, I''ll take it to the central beacon for the glory of the Alliance!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10055, 'Give me the flag, I''ll take it to the central beacon for the glory of the Horde!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10056, 'You must be a member of the Horde to enter the Hall of Legends.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
+(10057, 'You must be a member of the Alliance to enter the Champion''s Hall.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); \ No newline at end of file
diff --git a/sql/updates/1396_mangos_7267_01_characters_auctionhouse.sql b/sql/updates/1396_mangos_7267_01_characters_auctionhouse.sql
new file mode 100644
index 00000000000..7f9e9758946
--- /dev/null
+++ b/sql/updates/1396_mangos_7267_01_characters_auctionhouse.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7255_01_characters_characters required_7267_01_characters_auctionhouse bit;*/
+
+ALTER TABLE auctionhouse
+ DROP COLUMN location; \ No newline at end of file
diff --git a/sql/updates/1414_world_scripts.sql b/sql/updates/1414_world_scripts.sql
new file mode 100644
index 00000000000..3ee9245bc51
--- /dev/null
+++ b/sql/updates/1414_world_scripts.sql
@@ -0,0 +1,121 @@
+-- r847_scriptdev2_script_texts.sql
+UPDATE `script_texts` SET emote=15 WHERE `entry`=-1000123;
+UPDATE `script_texts` SET emote=1 WHERE `entry`=-1560028;
+UPDATE `script_texts` SET emote=1 WHERE `entry`=-1560031;
+UPDATE `script_texts` SET emote=5 WHERE `entry`=-1560032;
+UPDATE `script_texts` SET emote=16 WHERE `entry`=-1000119;
+UPDATE `script_texts` SET emote=254 WHERE `entry`=-1249002;
+UPDATE `script_texts` SET emote=293 WHERE `entry`=-1249003;
+UPDATE `script_texts` SET emote=1 WHERE `entry`=-1033000;
+
+-- r848_scriptdev2_script_texts.sql
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1540047 AND -1540042;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1540042,'Ours is the true Horde! The only Horde!',10323,1,0,0,'kargath SAY_AGGRO1'),
+(-1540043,'I\'ll carve the meat from your bones!',10324,1,0,0,'kargath SAY_AGGRO2'),
+(-1540044,'I am called Bladefist for a reason, as you will see!',10325,1,0,0,'kargath SAY_AGGRO3'),
+(-1540045,'For the real Horde!',10326,1,0,0,'kargath SAY_SLAY1'),
+(-1540046,'I am the only Warchief!',10327,1,0,0,'kargath SAY_SLAY2'),
+(-1540047,'The true Horde... will.. prevail...',10328,1,0,0,'kargath SAY_DEATH');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533118 AND -1533109;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1533109,'You are mine now!',8825,1,0,0,'heigan SAY_AGGRO1'),
+(-1533110,'I see you!',8826,1,0,0,'heigan SAY_AGGRO2'),
+(-1533111,'You...are next!',8827,1,0,0,'heigan SAY_AGGRO3'),
+(-1533112,'Close your eyes... sleep!',8829,1,0,0,'heigan SAY_SLAY'),
+(-1533113,'The races of the world will perish. It is only a matter of time.',8830,1,0,0,'heigan SAY_TAUNT1'),
+(-1533114,'I see endless suffering, I see torment, I see rage. I see... everything!',8831,1,0,0,'heigan SAY_TAUNT2'),
+(-1533115,'Soon... the world will tremble!',8832,1,0,0,'heigan SAY_TAUNT3'),
+(-1533116,'The end is upon you.',8833,1,0,0,'heigan SAY_TAUNT4'),
+(-1533117,'Hungry worms will feast on your rotten flesh!',8834,1,0,0,'heigan SAY_TAUNT5'),
+(-1533118,'Noo... o...',8828,1,0,0,'heigan SAY_DEATH');
+
+-- r849_scriptdev2_script_texts.sql
+DELETE FROM `script_texts` WHERE `entry`=-1070000;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1070000,'None may steal the secrets of the makers!',5851,1,0,0,'ironaya SAY_AGGRO');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1129004 AND -1129000;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1129000,'You\'ll never leave this place... alive.',5825,1,0,0,'amnennar SAY_AGGRO'),
+(-1129001,'To me, my servants!',5828,1,0,0,'amnennar SAY_SUMMON60'),
+(-1129002,'Come, spirits, attend your master!',5829,1,0,0,'amnennar SAY_SUMMON30'),
+(-1129003,'I am the hand of the Lich King!',5827,1,0,0,'amnennar SAY_HP'),
+(-1129004,'Too...easy!',5826,1,0,0,'amnennar SAY_KILL');
+
+DELETE FROM `script_texts` WHERE `entry` IN (-1230002,-1230001);
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1230001,'Come to aid the Throne!',0,1,0,0,'dagran SAY_AGGRO'),
+(-1230002,'Hail to the king, baby!',0,1,0,0,'dagran SAY_SLAY');
+
+-- r852_scriptdev2_script_texts.sql
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1189021 AND -1189011;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1189011,'Tell me... tell me everything!',5847,1,0,0,'vishas SAY_AGGRO'),
+(-1189012,'Naughty secrets!',5849,1,0,0,'vishas SAY_HEALTH1'),
+(-1189013,'I\'ll rip the secrets from your flesh!',5850,1,0,0,'vishas SAY_HEALTH2'),
+(-1189014,'Purged by pain!',5848,1,0,0,'vishas SAY_KILL'),
+(-1189015,'The monster got what he deserved.',0,0,1,0,'vishas SAY_TRIGGER_VORREL'),
+(-1189016,'We hunger for vengeance.',5844,1,0,0,'thalnos SAY_AGGRO'),
+(-1189017,'No rest, for the angry dead.',5846,1,0,0,'thalnos SAY_HEALTH'),
+(-1189018,'More... More souls.',5845,1,0,0,'thalnos SAY_KILL'),
+(-1189019,'You will not defile these mysteries!',5842,1,0,0,'doan SAY_AGGRO'),
+(-1189020,'Burn in righteous fire!',5843,1,0,0,'doan SAY_SPECIALAE'),
+(-1189021,'Release the hounds!',5841,1,0,0,'loksey SAY_AGGRO');
+
+-- r854_scriptdev2_script_texts.sql
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1070006 AND -1070001;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1070001,'Taste blade, mongrel!',0,0,0,0,'SAY_GUARD_SIL_AGGRO1'),
+(-1070002,'Please tell me that you didn\'t just do what I think you just did. Please tell me that I\'m not going to have to hurt you...',0,0,0,0,'SAY_GUARD_SIL_AGGRO2'),
+(-1070003,'As if we don\'t have enough problems, you go and create more!',0,0,0,0,'SAY_GUARD_SIL_AGGRO3'),
+(-1070004,'looks up at you quizzically. Maybe you should inspect it?',0,2,0,0,'cluck EMOTE_A_HELLO'),
+(-1070005,'looks at you unexpectadly.',0,2,0,0,'cluck EMOTE_H_HELLO'),
+(-1070006,'starts pecking at the feed.',0,2,0,0,'cluck EMOTE_CLUCK_TEXT2');
+
+-- r855_scriptdev2_script_texts.sql
+DELETE FROM `script_texts` WHERE `entry` IN (-1000004,-1000001);
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1000001,'goes into a killing frenzy!',0,2,0,0,'EMOTE_GENERIC_FRENZY_KILL'),
+(-1000004,'goes into a berserker rage!',0,2,0,0,'EMOTE_GENERIC_BERSERK');
+
+DELETE FROM `script_texts` WHERE `entry` = -1000005;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1000005,'Greetings citizen',0,0,7,0,'general_marcus SAY_GREETING');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1329003 AND -1329000;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1329000,'Thanks to Egan',0,0,0,0,'freed_soul SAY_ZAPPED0'),
+(-1329001,'Rivendare must die',0,0,0,0,'freed_soul SAY_ZAPPED1'),
+(-1329002,'Who you gonna call?',0,0,0,0,'freed_soul SAY_ZAPPED2'),
+(-1329003,'Don\'t cross those beams!',0,0,0,0,'freed_soul SAY_ZAPPED3');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1999925 AND -1999900;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
+(-1999900,'Let the games begin.',8280,1,0,0,'example_creature SAY_AGGRO'),
+(-1999901,'I see endless suffering. I see torment. I see rage. I see everything.',8831,1,0,0,'example_creature SAY_RANDOM_0'),
+(-1999902,'Muahahahaha',8818,1,0,0,'example_creature SAY_RANDOM_1'),
+(-1999903,'These mortal infedels my lord, they have invaded your sanctum and seek to steal your secrets.',8041,1,0,0,'example_creature SAY_RANDOM_2'),
+(-1999904,'You are already dead.',8581,1,0,0,'example_creature SAY_RANDOM_3'),
+(-1999905,'Where to go? What to do? So many choices that all end in pain, end in death.',8791,1,0,0,'example_creature SAY_RANDOM_4'),
+(-1999906,'$N, I sentance you to death!',8588,1,0,0,'example_creature SAY_BESERK'),
+(-1999907,'The suffering has just begun!',0,1,0,0,'example_creature SAY_PHASE'),
+(-1999908,'I always thought I was a good dancer.',0,0,0,0,'example_creature SAY_DANCE'),
+(-1999909,'Move out Soldier!',0,0,0,0,'example_creature SAY_SALUTE'),
+(-1999910,'Help $N! I\'m under attack!',0,0,0,0,'example_escort SAY_AGGRO1'),
+(-1999911,'Die scum!',0,0,0,0,'example_escort SAY_AGGRO2'),
+(-1999912,'Hmm a nice day for a walk alright',0,0,0,0,'example_escort SAY_WP_1'),
+(-1999913,'Wild Felboar attack!',0,0,0,0,'example_escort SAY_WP_2'),
+(-1999914,'Time for me to go! See ya around $N!',0,0,0,3,'example_escort SAY_WP_3'),
+(-1999915,'Bye Bye!',0,0,0,3,'example_escort SAY_WP_4'),
+(-1999916,'How dare you leave me like that! I hate you! =*(',0,3,0,0,'example_escort SAY_DEATH_1'),
+(-1999917,'...no...how could you let me die $N',0,0,0,0,'example_escort SAY_DEATH_2'),
+(-1999918,'ugh...',0,0,0,0,'example_escort SAY_DEATH_3'),
+(-1999919,'Taste death!',0,0,0,0,'example_escort SAY_SPELL'),
+(-1999920,'Fireworks!',0,0,0,0,'example_escort SAY_RAND_1'),
+(-1999921,'Hmm, I think I could use a buff.',0,0,0,0,'example_escort SAY_RAND_2'),
+(-1999922,'Normal select, guess you\'re not interested.',0,0,0,0,'example_gossip_codebox SAY_NOT_INTERESTED'),
+(-1999923,'Wrong!',0,0,0,0,'example_gossip_codebox SAY_WRONG'),
+(-1999924,'You\'re right, you are allowed to see my inner secrets.',0,0,0,0,'example_gossip_codebox SAY_CORRECT'),
+(-1999925,'Hi!',0,0,0,0,'example_areatrigger SAY_HI'); \ No newline at end of file
diff --git a/sql/updates/1423_mangos_7290_01_world_command.sql b/sql/updates/1423_mangos_7290_01_world_command.sql
new file mode 100644
index 00000000000..ededbe1f468
--- /dev/null
+++ b/sql/updates/1423_mangos_7290_01_world_command.sql
@@ -0,0 +1,5 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7252_02_mangos_mangos_string required_7290_01_mangos_command bit;*/
+
+DELETE FROM `command` WHERE `name` = 'npc setdeathstate';
+INSERT INTO `command` VALUES
+('npc setdeathstate',2,'Syntax: .npc setdeathstate on/off\r\n\r\nSet default death state (dead/alive) for npc at spawn.'); \ No newline at end of file
diff --git a/sql/updates/1426_mangos_7292_01_world_points_of_interest.sql b/sql/updates/1426_mangos_7292_01_world_points_of_interest.sql
new file mode 100644
index 00000000000..be997458488
--- /dev/null
+++ b/sql/updates/1426_mangos_7292_01_world_points_of_interest.sql
@@ -0,0 +1,13 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7290_01_mangos_command required_7292_01_mangos_points_of_interest bit;*/
+
+DROP TABLE IF EXISTS `points_of_interest`;
+CREATE TABLE `points_of_interest` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `icon` mediumint(8) unsigned NOT NULL default '0',
+ `flags` mediumint(8) unsigned NOT NULL default '0',
+ `data` mediumint(8) unsigned NOT NULL default '0',
+ `icon_name` text NOT NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/sql/updates/1426_mangos_7292_02_world_locales_points_of_interest.sql b/sql/updates/1426_mangos_7292_02_world_locales_points_of_interest.sql
new file mode 100644
index 00000000000..135fe1ce4d2
--- /dev/null
+++ b/sql/updates/1426_mangos_7292_02_world_locales_points_of_interest.sql
@@ -0,0 +1,15 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7292_01_mangos_points_of_interest required_7292_02_mangos_locales_points_of_interest bit;*/
+
+DROP TABLE IF EXISTS `locales_points_of_interest`;
+CREATE TABLE `locales_points_of_interest` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `icon_name_loc1` text,
+ `icon_name_loc2` text,
+ `icon_name_loc3` text,
+ `icon_name_loc4` text,
+ `icon_name_loc5` text,
+ `icon_name_loc6` text,
+ `icon_name_loc7` text,
+ `icon_name_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/sql/updates/1463_mangos_7303_01_world_pools.sql b/sql/updates/1463_mangos_7303_01_world_pools.sql
new file mode 100644
index 00000000000..39e45679dff
--- /dev/null
+++ b/sql/updates/1463_mangos_7303_01_world_pools.sql
@@ -0,0 +1,39 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7292_02_mangos_locales_points_of_interest required_7303_01_mangos_pools bit;*/
+
+DROP TABLE IF EXISTS `pool_creature`;
+CREATE TABLE `pool_creature` (
+ `guid` int(10) unsigned NOT NULL default '0',
+ `pool_entry` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float unsigned NOT NULL default '0',
+ PRIMARY KEY (`pool_entry`,`guid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `pool_gameobject`;
+CREATE TABLE `pool_gameobject` (
+ `guid` int(10) unsigned NOT NULL default '0',
+ `pool_entry` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`,`pool_entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `pool_pool`;
+CREATE TABLE `pool_pool` (
+ `pool_id` mediumint(8) unsigned NOT NULL default '0',
+ `mother_pool` mediumint(8) unsigned NOT NULL default '0',
+ `chance` float NOT NULL default '0',
+ PRIMARY KEY (`pool_id`,`mother_pool`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `pool_template`;
+CREATE TABLE `pool_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Pool entry',
+ `max_limit` int(10) unsigned NOT NULL default '0' COMMENT 'Max number of objects (0) is no limit',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE IF EXISTS `game_event_pool`;
+CREATE TABLE `game_event_pool` (
+ `pool_entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Id of the pool',
+ `event` smallint(6) NOT NULL default '0' COMMENT 'Put negatives values to remove during event',
+ PRIMARY KEY (`pool_entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/sql/updates/1470_world_scripts.sql b/sql/updates/1470_world_scripts.sql
new file mode 100644
index 00000000000..f0f4277fe95
--- /dev/null
+++ b/sql/updates/1470_world_scripts.sql
@@ -0,0 +1,4 @@
+-- Remove script for quest 8346. Note support for this quest will be added in next ACID release(25)
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry` IN (15273,15274,15294,15298,15367);
+UPDATE `creature_template` SET `ScriptName`='mob_broggok_poisoncloud' WHERE `entry`=17662;
+-- UPDATE `creature_template` SET `ScriptName`='npc_draenei_survivor' WHERE `entry`=16483; \ No newline at end of file
diff --git a/sql/updates/1484_mangos_7307_01_characters_arena_team_member.sql b/sql/updates/1484_mangos_7307_01_characters_arena_team_member.sql
new file mode 100644
index 00000000000..b58027b06e5
--- /dev/null
+++ b/sql/updates/1484_mangos_7307_01_characters_arena_team_member.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7267_01_characters_auctionhouse required_7307_01_characters_arena_team_member bit;*/
+
+ALTER TABLE arena_team_member
+ ADD PRIMARY KEY (arenateamid,guid); \ No newline at end of file
diff --git a/sql/updates/1495_mangos_7312_01_world_trinity_string.sql b/sql/updates/1495_mangos_7312_01_world_trinity_string.sql
new file mode 100644
index 00000000000..5c6deb5c270
--- /dev/null
+++ b/sql/updates/1495_mangos_7312_01_world_trinity_string.sql
@@ -0,0 +1,5 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7303_01_mangos_pools required_7312_01_mangos_mangos_string bit;*/
+
+DELETE FROM `trinity_string` WHERE entry = 810;
+INSERT INTO `trinity_string` VALUES
+(810,'|Hplayer:$N|h[$N]|h has earned the achievement $a!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
diff --git a/sql/updates/1497_mangos_7314_01_characters_guild_rank.sql b/sql/updates/1497_mangos_7314_01_characters_guild_rank.sql
new file mode 100644
index 00000000000..80aa49c21c4
--- /dev/null
+++ b/sql/updates/1497_mangos_7314_01_characters_guild_rank.sql
@@ -0,0 +1,3 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7307_01_characters_arena_team_member required_7314_01_characters_guild_rank bit;*/
+
+UPDATE guild_rank SET rights = rights & ~0x00020000; \ No newline at end of file
diff --git a/sql/updates/1525_world_scripts.sql b/sql/updates/1525_world_scripts.sql
new file mode 100644
index 00000000000..3eb373009da
--- /dev/null
+++ b/sql/updates/1525_world_scripts.sql
@@ -0,0 +1,2 @@
+-- Script for Yrykul Skeleton - Prince Keleseth Event
+UPDATE `creature_template` SET `ScriptName`='mob_vrykul_skeleton' WHERE `entry`=23970; \ No newline at end of file
diff --git a/sql/updates/1531_mangos_7324_01_characters_character_spell.sql b/sql/updates/1531_mangos_7324_01_characters_character_spell.sql
new file mode 100644
index 00000000000..10c4317b457
--- /dev/null
+++ b/sql/updates/1531_mangos_7324_01_characters_character_spell.sql
@@ -0,0 +1,13 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7314_01_characters_guild_rank required_7324_01_characters_character_spell bit;*/
+
+/* remove some deleted spells or ranks from characters */
+/* Mana Tap no longer Blood Elf Racial */
+DELETE FROM `character_spell` WHERE `spell` = '28734';
+/* Hamstring is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_spell` WHERE `spell` IN ('7373', '7372', '25212');
+/* Intercept is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_spell` WHERE `spell` IN ('20616', '20617', '25272', '25275');
+/* Overpower is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_spell` WHERE `spell` IN ('7887', '11584', '11585');
+/* Shield Bash is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_spell` WHERE `spell` IN ('1671', '1672', '29704'); \ No newline at end of file
diff --git a/sql/updates/1531_mangos_7324_02_characters_character_aura.sql b/sql/updates/1531_mangos_7324_02_characters_character_aura.sql
new file mode 100644
index 00000000000..fd7e405f966
--- /dev/null
+++ b/sql/updates/1531_mangos_7324_02_characters_character_aura.sql
@@ -0,0 +1,13 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7324_01_characters_character_spell required_7324_02_characters_character_aura bit;*/
+
+/* remove some deleted spells or ranks from characters auras */
+/* Mana Tap no longer Blood Elf Racial */
+DELETE FROM `character_aura` WHERE `spell` = '28734';
+/* Hamstring is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_aura` WHERE `spell` IN ('7373', '7372', '25212');
+/* Intercept is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_aura` WHERE `spell` IN ('20616', '20617', '25272', '25275');
+/* Overpower is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_aura` WHERE `spell` IN ('7887', '11584', '11585');
+/* Shield Bash is only one rank now, need to delete these zzOLDRank spells */
+DELETE FROM `character_aura` WHERE `spell` IN ('1671', '1672', '29704'); \ No newline at end of file
diff --git a/sql/updates/1555_mangos_7331_01_world_command.sql b/sql/updates/1555_mangos_7331_01_world_command.sql
new file mode 100644
index 00000000000..b85942b71a9
--- /dev/null
+++ b/sql/updates/1555_mangos_7331_01_world_command.sql
@@ -0,0 +1,65 @@
+/*ALTER TABLE db_version CHANGE COLUMN required_7312_01_mangos_mangos_string required_7331_01_mangos_command bit;*/
+
+DELETE FROM `command` WHERE `name` = 'account set addon';
+DELETE FROM `command` WHERE `name` = 'ban account';
+DELETE FROM `command` WHERE `name` = 'ban character';
+DELETE FROM `command` WHERE `name` = 'ban ip';
+DELETE FROM `command` WHERE `name` = 'baninfo account';
+DELETE FROM `command` WHERE `name` = 'baninfo character';
+DELETE FROM `command` WHERE `name` = 'baninfo ip';
+DELETE FROM `command` WHERE `name` = 'banlist account';
+DELETE FROM `command` WHERE `name` = 'banlist character';
+DELETE FROM `command` WHERE `name` = 'banlist ip';
+DELETE FROM `command` WHERE `name` = 'gm fly';
+/* next command deleted even in case it has been already corrected (trailing space) */
+DELETE FROM `command` WHERE `name` = 'gobject near ';
+DELETE FROM `command` WHERE `name` = 'gobject near';
+
+DELETE FROM `command` WHERE `name` = 'lookup player account';
+DELETE FROM `command` WHERE `name` = 'lookup player ip';
+DELETE FROM `command` WHERE `name` = 'lookup player email';
+DELETE FROM `command` WHERE `name` = 'modify money';
+DELETE FROM `command` WHERE `name` = 'modify mount';
+DELETE FROM `command` WHERE `name` = 'modify speed';
+DELETE FROM `command` WHERE `name` = 'modify titles';
+DELETE FROM `command` WHERE `name` = 'pdump write';
+DELETE FROM `command` WHERE `name` = 'pdump load';
+DELETE FROM `command` WHERE `name` = 'reset honor';
+DELETE FROM `command` WHERE `name` = 'reset level';
+DELETE FROM `command` WHERE `name` = 'reset spells';
+DELETE FROM `command` WHERE `name` = 'reset stats';
+DELETE FROM `command` WHERE `name` = 'reset talents';
+DELETE FROM `command` WHERE `name` = 'unban account';
+DELETE FROM `command` WHERE `name` = 'unban character';
+DELETE FROM `command` WHERE `name` = 'unban ip';
+
+INSERT INTO `command` VALUES
+('account set addon',3,'Syntax: .account set addon [$account] #addon\r\n\r\nSet user (possible targeted) expansion addon level allowed. Addon values: 0 - normal, 1 - tbc, 2 - wotlk.'),
+('ban account',3,'Syntax: .ban account $Name $bantime $reason\r\nBan account kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban character',3,'Syntax: .ban character $Name $bantime $reason\r\nBan account and kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban ip',3,'Syntax: .ban ip $Ip $bantime $reason\r\nBan IP.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('baninfo account',3,'Syntax: .baninfo account\r\nWatch full information about a specific ban.'),
+('baninfo character',3,'Syntax: .baninfo character\r\nWatch full information about a specific ban.'),
+('baninfo ip',3,'Syntax: .baninfo ip\r\nWatch full information about a specific ban.'),
+('banlist account',3,'Syntax: .banlist account [$Name]\r\nSearches the banlist for a account name pattern or show full list account bans.'),
+('banlist character',3,'Syntax: .banlist character $Name\r\nSearches the banlist for a character name pattern. Pattern required.'),
+('banlist ip',3,'Syntax: .banlist ip [$Ip]\r\nSearches the banlist for a IP pattern or show full list of IP bans.'),
+('gm fly',3,'Syntax: .gm fly [on/off]\r\nEnable/disable gm fly mode.'),
+('gobject near',3,'Syntax: .gobject near [#distance]\r\n\r\nOutput gameobjects at distance #distance from player. Output gameobject guids and coordinates sorted by distance from character. If #distance not provided use 10 as default value.'),
+('lookup player account',2,'Syntax: .lookup player account $account ($limit) \r\n\r\n Searchs players, which account username is $account with optional parametr $limit of results.'),
+('lookup player ip',2,'Syntax: .lookup player ip $ip ($limit) \r\n\r\n Searchs players, which account ast_ip is $ip with optional parametr $limit of results.'),
+('lookup player email',2,'Syntax: .lookup player email $email ($limit) \r\n\r\n Searchs players, which account email is $email with optional parametr $limit of results.'),
+('modify money',1,'Syntax: .modify money #money\r\n.money #money\r\n\r\nAdd or remove money to the selected player. If no player is selected, modify your money.\r\n\r\n #gold can be negative to remove money.'),
+('modify mount',1,'Syntax: .modify mount #id #speed\r\nDisplay selected player as mounted at #id creature and set speed to #speed value.'),
+('modify speed',1,'Syntax: .modify speed #rate\r\n.speed #rate\r\n\r\nModify the running speed of the selected player to \"normal base run speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify titles',1,'Syntax: .modify titles #mask\r\n\r\nAllows user to use all titles from #mask.\r\n\r\n #mask=0 disables the title-choose-field'),
+('pdump write',3,'Syntax: .pdump write $filename $playerNameOrGUID\r\nWrite character dump with name/guid $playerNameOrGUID to file $filename.'),
+('pdump load',3,'Syntax: .pdump load $filename $account [$newname] [$newguid]\r\nLoad character dump from dump file into character list of $account with saved or $newname, with saved (or first free) or $newguid guid.'),
+('reset honor',3,'Syntax: .reset honor [Playername]\r\n Reset all honor data for targeted character.'),
+('reset level',3,'Syntax: .reset level [Playername]\r\n Reset level to 1 including reset stats and talents. Equipped items with greater level requirement can be lost.'),
+('reset spells',3,'Syntax: .reset spells [Playername]\r\n Removes all non-original spells from spellbook.\r\n. Playername can be name of offline character.'),
+('reset stats',3,'Syntax: .reset stats [Playername]\r\n Resets(recalculate) all stats of the targeted player to their original VALUESat current level.'),
+('reset talents',3,'Syntax: .reset talents [Playername]\r\n Removes all talents of the targeted player. Playername can be name of offline character.'),
+('unban account',3,'Syntax: .unban account $Name\r\nUnban accounts for account name pattern.'),
+('unban character',3,'Syntax: .unban character $Name\r\nUnban accounts for character name pattern.'),
+('unban ip',3,'Syntax : .unban ip $Ip\r\nUnban accounts for IP pattern.'); \ No newline at end of file
diff --git a/sql/updates/1558_world_spell_linked_spell.sql b/sql/updates/1558_world_spell_linked_spell.sql
new file mode 100644
index 00000000000..667d1c998cc
--- /dev/null
+++ b/sql/updates/1558_world_spell_linked_spell.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = '44869' AND `spell_effect` = '-45018';
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = '46019' AND `spell_effect` = '-45018';
+INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES
+(44869, -45018, 1, 'Remove Arcane Buffet'),
+(46019, -45018, 1, 'Remove Arcane Buffet'); \ No newline at end of file
diff --git a/sql/updates/1559_world.sql b/sql/updates/1559_world.sql
new file mode 100644
index 00000000000..4421d36e95c
--- /dev/null
+++ b/sql/updates/1559_world.sql
@@ -0,0 +1,11 @@
+INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES
+(48077, 48075, 0, 'Holy Nova (rank8)'),
+(48078, 48076, 0, 'Holy Nova (rank9)'),
+(47585, 60069, 0, 'Dispersion (transform/regen)');
+
+DELETE FROM `spell_proc_event` WHERE `entry` IN (47549);
+INSERT INTO `spell_proc_event` VALUES (47549, 0x00, 6, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0);
+DELETE FROM `spell_proc_event` WHERE `entry` IN (47551);
+INSERT INTO `spell_proc_event` VALUES (47551, 0x00, 6, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0);
+DELETE FROM `spell_proc_event` WHERE `entry` IN (47552);
+INSERT INTO `spell_proc_event` VALUES (47552, 0x00, 6, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); \ No newline at end of file
diff --git a/sql/updates/1570_world.sql b/sql/updates/1570_world.sql
new file mode 100644
index 00000000000..4c84b54194e
--- /dev/null
+++ b/sql/updates/1570_world.sql
@@ -0,0 +1,3 @@
+-- Bloodsurge
+DELETE FROM `spell_proc_event` WHERE `entry` IN (46915);
+INSERT INTO `spell_proc_event` VALUES (46915, 0x00, 6, 0x00000040, 0x00000404, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0); \ No newline at end of file
diff --git a/sql/updates/1018_world.sql b/sql/updates/2.4.3_updates/1018_world.sql
index 89a13686d8a..d231eb168b9 100644
--- a/sql/updates/1018_world.sql
+++ b/sql/updates/2.4.3_updates/1018_world.sql
@@ -4,4 +4,3 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm
(41292, 42017, 2, 'Aura of Suffering'),
(44007, -43657, 2, 'Storm Eye Safe Zone Immune'),
(44867, -46019, 2, 'Spectral Exhaustion - Teleport: Spectral Realm');
-
diff --git a/sql/updates/1026_world.sql b/sql/updates/2.4.3_updates/1026_world.sql
index 1ed2e34316a..ae189469b41 100644
--- a/sql/updates/1026_world.sql
+++ b/sql/updates/2.4.3_updates/1026_world.sql
@@ -3,4 +3,3 @@ INSERT INTO `spell_linked_spell`(`spell_trigger`,`spell_effect`,`type`,`comment`
('-33711','33686','0','Murmur\'s Shockwave (Normal)'),
('-38794','33686','0','Murmur\'s Shockwave (Heroic)'),
('33686','31705','0','Murmur\'s Shockwave Jump');
-
diff --git a/sql/updates/1028_world_scripts.sql b/sql/updates/2.4.3_updates/1028_world_scripts.sql
index 21891693f29..9c821c7b093 100644
--- a/sql/updates/1028_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/1028_world_scripts.sql
@@ -1,2 +1 @@
UPDATE `creature_template` SET `ScriptName`='boss_the_black_stalker' WHERE `entry`='17882';
-
diff --git a/sql/updates/102_world.sql b/sql/updates/2.4.3_updates/102_world.sql
index b3818da5b9f..6cbf3d1a6b4 100644
--- a/sql/updates/102_world.sql
+++ b/sql/updates/2.4.3_updates/102_world.sql
@@ -1,3 +1,2 @@
ALTER TABLE `quest_template`
ADD `RewHonorableKills` mediumint(9) unsigned NOT NULL default '0' AFTER `RewRepValue5`;
-
diff --git a/sql/updates/1069_world_scripts.sql b/sql/updates/2.4.3_updates/1069_world_scripts.sql
index 1f3b7a728e9..0fafabf63f1 100644
--- a/sql/updates/1069_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/1069_world_scripts.sql
@@ -9,5 +9,4 @@ INSERT INTO `spell_script_target` (`entry`,`type`,`targetEntry`) VALUES
('32314', '2', '17138'),
('32314', '2', '18037'),
('32314', '2', '18064'),
-('32314', '2', '18065');
-
+('32314', '2', '18065'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/1073_world_scripts.sql b/sql/updates/2.4.3_updates/1073_world_scripts.sql
new file mode 100644
index 00000000000..5b75c1efad5
--- /dev/null
+++ b/sql/updates/2.4.3_updates/1073_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_plains_vision' WHERE `entry`='2983'; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/1074_world_scripts.sql b/sql/updates/2.4.3_updates/1074_world_scripts.sql
new file mode 100644
index 00000000000..2863a1fb6aa
--- /dev/null
+++ b/sql/updates/2.4.3_updates/1074_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName` = 'npc_plucky' WHERE `entry` = '6626'; \ No newline at end of file
diff --git a/sql/updates/112_world_scripts.sql b/sql/updates/2.4.3_updates/112_world_scripts.sql
index f812c6f3c68..e48ed250741 100644
--- a/sql/updates/112_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/112_world_scripts.sql
@@ -1,3 +1,2 @@
UPDATE `item_template` SET `ScriptName`='item_arcane_charges' WHERE `entry`='34475';
-UPDATE gameobject_template SET faction = 14 WHERE entry = 185134;
-
+UPDATE gameobject_template SET faction = 14 WHERE entry = 185134; \ No newline at end of file
diff --git a/sql/updates/116_world.sql b/sql/updates/2.4.3_updates/116_world.sql
index 9923f7f4540..7627dfb4aa3 100644
--- a/sql/updates/116_world.sql
+++ b/sql/updates/2.4.3_updates/116_world.sql
@@ -5,5 +5,4 @@ INSERT INTO `spell_script_target` VALUES ('41455', '1', '22951');
INSERT INTO `spell_script_target` VALUES ('41455', '1', '22952');
INSERT INTO `spell_script_target` VALUES ('42471', '1', '23817');
INSERT INTO `spell_script_target` VALUES ('43734', '1', '23817');
-INSERT INTO `spell_script_target` VALUES ('42631', '1', '23920');
-
+INSERT INTO `spell_script_target` VALUES ('42631', '1', '23920'); \ No newline at end of file
diff --git a/sql/updates/117_world_scripts.sql b/sql/updates/2.4.3_updates/117_world_scripts.sql
index 669810b4685..794258ba710 100644
--- a/sql/updates/117_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/117_world_scripts.sql
@@ -62,4 +62,3 @@ UPDATE eventai_scripts SET action3_param3=(`action3_param3`) *-1 WHERE action3_t
UPDATE eventai_texts SET entry=(`entry`) *-1 WHERE entry>0;
ALTER TABLE script_texts MODIFY COLUMN `sound` mediumint(8) unsigned NOT NULL default '0';
-
diff --git a/sql/updates/11_characters.sql b/sql/updates/2.4.3_updates/11_characters.sql
index 489ee028dbc..a9a002270fb 100644
--- a/sql/updates/11_characters.sql
+++ b/sql/updates/2.4.3_updates/11_characters.sql
@@ -2,5 +2,4 @@ ALTER TABLE `arena_team_member` ADD COLUMN `points_to_add` int(10) UNSIGNED NOT
DROP TABLE IF EXISTS `saved_variables`;
CREATE TABLE `saved_variables` (
`NextArenaPointDistributionTime` timestamp NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves';
-
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves'; \ No newline at end of file
diff --git a/sql/updates/120_world.sql b/sql/updates/2.4.3_updates/120_world.sql
index f2ff5138745..3f3b231e830 100644
--- a/sql/updates/120_world.sql
+++ b/sql/updates/2.4.3_updates/120_world.sql
@@ -159,5 +159,4 @@ INSERT INTO command VALUES
('server exit',4,'Syntax: .server exit\r\n\r\nTerminate Trinity NOW.'),
('server motd',0,'Syntax: .server motd\r\n\r\nShow server Message of the day.'),
('server set loglevel',4,'Syntax: .server set loglevel #level\r\n\r\nSet server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).'),
-('server set motd',3,'Syntax: .server set motd $MOTD\r\n\r\nSet server Message of the day.');
-
+('server set motd',3,'Syntax: .server set motd $MOTD\r\n\r\nSet server Message of the day.'); \ No newline at end of file
diff --git a/sql/updates/123_world_scripts.sql b/sql/updates/2.4.3_updates/123_world_scripts.sql
index 7281193a208..b5f9305e30e 100644
--- a/sql/updates/123_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/123_world_scripts.sql
@@ -213,4 +213,3 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
--
-- ALTER TABLE `script_texts` ORDER BY `entry` desc;
-
diff --git a/sql/updates/125_world_scripts.sql b/sql/updates/2.4.3_updates/125_world_scripts.sql
index 5d28ec325b5..9994c0e7af7 100644
--- a/sql/updates/125_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/125_world_scripts.sql
@@ -2,5 +2,4 @@ update creature_template set speed='0.01', scriptname='mob_toxic_sporebat' WHERE
update creature_template SET scriptname='npc_overlord_morghor' WHERE entry=23139;
update creature_template SET scriptname='npc_lord_illidan_stormrage' WHERE entry=22083;
update creature_template SET scriptname='npc_yarzill_the_merc' WHERE entry=23141;
-update quest_template SET StartScript=0 WHERE entry=11108;
-
+update quest_template SET StartScript=0 WHERE entry=11108; \ No newline at end of file
diff --git a/sql/updates/133_world_scripts.sql b/sql/updates/2.4.3_updates/133_world_scripts.sql
index cd082ee2ad9..057f7c44e81 100644
--- a/sql/updates/133_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/133_world_scripts.sql
@@ -77,5 +77,4 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1560019,'Thrall will remain a slave. Taretha will die. You have failed.',10426,1,0,'epoch SAY_SLAY2'),
(-1560020,'Not so fast!',10423,1,0,'epoch SAY_BREATH1'),
(-1560021,'Struggle as much as you like!',10424,1,0,'epoch SAY_BREATH2'),
-(-1560022,'No!...The master... will not... be pleased.',10427,1,0,'epoch SAY_DEATH');
-
+(-1560022,'No!...The master... will not... be pleased.',10427,1,0,'epoch SAY_DEATH'); \ No newline at end of file
diff --git a/sql/updates/140_world.sql b/sql/updates/2.4.3_updates/140_world.sql
index a743fa69fee..6a7389602b6 100644
--- a/sql/updates/140_world.sql
+++ b/sql/updates/2.4.3_updates/140_world.sql
@@ -18,5 +18,4 @@ INSERT INTO trinity_string VALUES
(341,'%s is not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(342,'%s is now not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(810,'You must be in a raid group to enter the instance %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(811,'You cannot enter %s while in a ghost mode!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-
+(811,'You cannot enter %s while in a ghost mode!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); \ No newline at end of file
diff --git a/sql/updates/145_world_scripts.sql b/sql/updates/2.4.3_updates/145_world_scripts.sql
index 1d9341dd6a4..5ec3702b171 100644
--- a/sql/updates/145_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/145_world_scripts.sql
@@ -24,5 +24,4 @@ UPDATE `gameobject_template` SET `ScriptName` = 'go_kael_orb' WHERE `entry` = 18
UPDATE `gameobject_template` SET `ScriptName` = 'go_movie_orb' WHERE `entry` = 187578;
update creature_template SET spell1=6474 WHERE entry=22487;
-update creature_template SET spell1=3600 WHERE entry=22486;
-
+update creature_template SET spell1=3600 WHERE entry=22486; \ No newline at end of file
diff --git a/sql/updates/146_world.sql b/sql/updates/2.4.3_updates/146_world.sql
index bc419f47181..31999cd97e4 100644
--- a/sql/updates/146_world.sql
+++ b/sql/updates/2.4.3_updates/146_world.sql
@@ -90,5 +90,4 @@ VALUES
INSERT INTO spell_linked_spell
(`spell_trigger`, `spell_effect`, `type`, `comment`)
VALUES
- (45246, 45348, 1, 'Apply Flame Touched');
-
+ (45246, 45348, 1, 'Apply Flame Touched'); \ No newline at end of file
diff --git a/sql/updates/147_world.sql b/sql/updates/2.4.3_updates/147_world.sql
index a6dca5be3db..c6e75d41070 100644
--- a/sql/updates/147_world.sql
+++ b/sql/updates/2.4.3_updates/147_world.sql
@@ -1,4 +1,3 @@
-- Magtheridon Earthquake
DELETE FROM spell_script_target WHERE `entry` IN (30657);
-INSERT INTO spell_script_target VALUES ('30657', '1', '24136');
-
+INSERT INTO spell_script_target VALUES ('30657', '1', '24136'); \ No newline at end of file
diff --git a/sql/updates/152_world.sql b/sql/updates/2.4.3_updates/152_world.sql
index 52d02a13258..3b3d09c56d3 100644
--- a/sql/updates/152_world.sql
+++ b/sql/updates/2.4.3_updates/152_world.sql
@@ -5,5 +5,4 @@ insert into `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm
insert into `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) values('27799','27803','0','Holy Nova (rank4)');
insert into `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) values('27800','27804','0','Holy Nova (rank5)');
insert into `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) values('27801','27805','0','Holy Nova (rank6)');
-insert into `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) values('25331','25329','0','Holy Nova (rank7)');
-
+insert into `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) values('25331','25329','0','Holy Nova (rank7)'); \ No newline at end of file
diff --git a/sql/updates/153_world.sql b/sql/updates/2.4.3_updates/153_world.sql
index 5b135c844d6..dbff1592850 100644
--- a/sql/updates/153_world.sql
+++ b/sql/updates/2.4.3_updates/153_world.sql
@@ -1,2 +1 @@
-update creature_template set flags_extra = 128 where entry = 12999;
-
+update creature_template set flags_extra = 128 where entry = 12999; \ No newline at end of file
diff --git a/sql/updates/171_world.sql b/sql/updates/2.4.3_updates/171_world.sql
index f7c9105eb38..fdcd98f4d6e 100644
--- a/sql/updates/171_world.sql
+++ b/sql/updates/2.4.3_updates/171_world.sql
@@ -14,5 +14,4 @@ INSERT INTO `command` (name,security,help) VALUES
('pet tp',2,'Syntax: .pet tp #\r\n\r\nChange pet\'s amount of training points.'),
('modify gender',2,'Syntax: .modify gender\r\n\r\n.modify gender #male/female - Turns selected player into a male or female'),
('gobject activate',2,'Syntax: .gobject activate #guid\r\n\r\nActivates an object like a door or a button.'),
-('playall',2,'Syntax: .playall #soundid\r\n\r\nPlayer a sound to whole server.');
-
+('playall',2,'Syntax: .playall #soundid\r\n\r\nPlayer a sound to whole server.'); \ No newline at end of file
diff --git a/sql/updates/172_world_scripts.sql b/sql/updates/2.4.3_updates/172_world_scripts.sql
index 82de4e3eb2a..358afe538ed 100644
--- a/sql/updates/172_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/172_world_scripts.sql
@@ -776,4 +776,3 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1000103,'You can go tell Stoutmantle this is where the Defias Gang is holed up, $N.',0,0,7,'defias traitor SAY_END'),
(-1000104,'%s coming in fast! Prepare to fight!',0,0,7,'defias traitor SAY_AGGRO_1'),
(-1000105,'Help!',0,0,7,'defias traitor SAY_AGGRO_2');
-
diff --git a/sql/updates/175_world_scripts.sql b/sql/updates/2.4.3_updates/175_world_scripts.sql
index dc46a67737f..d30601c4c9c 100644
--- a/sql/updates/175_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/175_world_scripts.sql
@@ -1,2 +1 @@
-UPDATE `creature_template` SET `ScriptName`='npc_defias_traitor' WHERE `entry`='467';
-
+UPDATE `creature_template` SET `ScriptName`='npc_defias_traitor' WHERE `entry`='467'; \ No newline at end of file
diff --git a/sql/updates/176_world.sql b/sql/updates/2.4.3_updates/176_world.sql
index 2cb80bd25a2..12df2a083ca 100644
--- a/sql/updates/176_world.sql
+++ b/sql/updates/2.4.3_updates/176_world.sql
@@ -30,4 +30,3 @@ CREATE TABLE `locales_npc_option` (
ALTER TABLE `creature_template`
CHANGE COLUMN `flags` `unit_flags` int(10) unsigned NOT NULL default '0',
CHANGE COLUMN `flag1` `type_flags` int(10) unsigned NOT NULL default '0';
-
diff --git a/sql/updates/182_world.sql b/sql/updates/2.4.3_updates/182_world.sql
index 70c200b5144..450b5394720 100644
--- a/sql/updates/182_world.sql
+++ b/sql/updates/2.4.3_updates/182_world.sql
@@ -2,4 +2,3 @@ DELETE FROM `command` WHERE name IN ('possess', 'unpossess');
INSERT INTO `command` (name,security,help) VALUES
('possess',3,'Syntax: .possess\r\n\r\nPossesses indefinitely the selected creature.'),
('unpossess',3,'Syntax: .unpossess\r\n\r\nIf you are possessed, unpossesses yourself; otherwise unpossesses current possessed target.');
-
diff --git a/sql/updates/212_world_scripts.sql b/sql/updates/2.4.3_updates/212_world_scripts.sql
index b1c6a4cad0e..1427efde6e3 100644
--- a/sql/updates/212_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/212_world_scripts.sql
@@ -2,5 +2,4 @@ UPDATE `creature_template` SET `ScriptName`='npc_clintar_dreamwalker' WHERE `ent
UPDATE `creature_template` SET `ScriptName`='npc_clintar_spirit' WHERE `entry` = 22916;
UPDATE `creature_template` SET `ScriptName`='mob_sparrowhawk' WHERE `entry`=22979;
UPDATE `creature_template` SET `ScriptName`='mob_rizzle_sprysprocket' WHERE `entry`=23002;
-UPDATE `creature_template` SET `ScriptName`='mob_depth_charge' WHERE `entry`=23025;
-
+UPDATE `creature_template` SET `ScriptName`='mob_depth_charge' WHERE `entry`=23025; \ No newline at end of file
diff --git a/sql/updates/220_characters.sql b/sql/updates/2.4.3_updates/220_characters.sql
index 5075f2e3b54..1d9e3f50a33 100644
--- a/sql/updates/220_characters.sql
+++ b/sql/updates/2.4.3_updates/220_characters.sql
@@ -1,3 +1,2 @@
ALTER TABLE `characters`
- ADD `latency` int(11) unsigned NOT NULL default '0' AFTER `taxi_path`;
-
+ ADD `latency` int(11) unsigned NOT NULL default '0' AFTER `taxi_path`; \ No newline at end of file
diff --git a/sql/updates/230_world.sql b/sql/updates/2.4.3_updates/230_world.sql
index edb46971753..3f3565e7800 100644
--- a/sql/updates/230_world.sql
+++ b/sql/updates/2.4.3_updates/230_world.sql
@@ -1,3 +1,2 @@
UPDATE `spell_proc_event` SET `procFlags` = '8396800' WHERE `entry` =14774;
UPDATE `spell_proc_event` SET `procFlags` = '8396800' WHERE `entry` =14531;
-
diff --git a/sql/updates/230_world_blacktemple.sql b/sql/updates/2.4.3_updates/230_world_blacktemple.sql
index 20823b188f6..74345a7c51f 100644
--- a/sql/updates/230_world_blacktemple.sql
+++ b/sql/updates/2.4.3_updates/230_world_blacktemple.sql
@@ -22,5 +22,4 @@ update creature_template set scriptname = 'mob_blade_of_azzinoth' where entry =
-- parasitic shadowfiend
update creature_template set scriptname = 'mob_parasitic_shadowfiend' where entry = 23498;
-- Maiev
-update creature_template set minlevel = 73, maxlevel = 73, minhealth = 500000, maxhealth = 500000, mindmg = 3000, maxdmg = 4000 where entry = 23197;
-
+update creature_template set minlevel = 73, maxlevel = 73, minhealth = 500000, maxhealth = 500000, mindmg = 3000, maxdmg = 4000 where entry = 23197; \ No newline at end of file
diff --git a/sql/updates/230_world_scripts.sql b/sql/updates/2.4.3_updates/230_world_scripts.sql
index a188fd28580..34d3ee5707f 100644
--- a/sql/updates/230_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/230_world_scripts.sql
@@ -1,2 +1 @@
-update gameobject_template set scriptname = 'go_gilded_brazier' where entry = 181956;
-
+update gameobject_template set scriptname = 'go_gilded_brazier' where entry = 181956; \ No newline at end of file
diff --git a/sql/updates/230_world_serpent_shrine.sql b/sql/updates/2.4.3_updates/230_world_serpent_shrine.sql
index c957af10acc..0e16bd6de2b 100644
--- a/sql/updates/230_world_serpent_shrine.sql
+++ b/sql/updates/2.4.3_updates/230_world_serpent_shrine.sql
@@ -11,4 +11,3 @@ UPDATE creature_model_info SET bounding_radius = '13', combat_reach = '20' WHERE
UPDATE creature_template SET InhabitType = '3', ScriptName = 'boss_the_lurker_below' WHERE entry = '21217';
UPDATE creature_template SET ScriptName = 'mob_coilfang_ambusher' WHERE entry = '21865';
UPDATE creature_template SET ScriptName = 'mob_coilfang_guardian' WHERE entry = '21873';
-
diff --git a/sql/updates/231_world_scripts.sql b/sql/updates/2.4.3_updates/231_world_scripts.sql
index 35d58244e43..b07f7b47fef 100644
--- a/sql/updates/231_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/231_world_scripts.sql
@@ -1,4 +1,3 @@
UPDATE `creature_template` SET `ScriptName`='boss_pathaleon_the_calculator' WHERE `entry`=19220;
UPDATE `creature_template` SET `ScriptName`='mob_nether_wraith' WHERE `entry`=21062;
-UPDATE `instance_template` SET `script`='instance_mechanar' WHERE `map`=554;
-
+UPDATE `instance_template` SET `script`='instance_mechanar' WHERE `map`=554; \ No newline at end of file
diff --git a/sql/updates/233_world.sql b/sql/updates/2.4.3_updates/233_world.sql
index 8d29b83a4fa..e77d057cae4 100644
--- a/sql/updates/233_world.sql
+++ b/sql/updates/2.4.3_updates/233_world.sql
@@ -1,2 +1 @@
UPDATE `spell_proc_event` SET `SchoolMask` = '1' WHERE `entry` = '41434';
-
diff --git a/sql/updates/2.4.3_updates/238_world.sql b/sql/updates/2.4.3_updates/238_world.sql
new file mode 100644
index 00000000000..c1180ca0abd
--- /dev/null
+++ b/sql/updates/2.4.3_updates/238_world.sql
@@ -0,0 +1 @@
+DELETE FROM trinity_string WHERE entry IN (453); \ No newline at end of file
diff --git a/sql/updates/240_world.sql b/sql/updates/2.4.3_updates/240_world.sql
index 44e7c518e83..9a91607fed0 100644
--- a/sql/updates/240_world.sql
+++ b/sql/updates/2.4.3_updates/240_world.sql
@@ -2,5 +2,4 @@ delete from `command` where `name` IN ('senditems','sendmail');
insert into `command` (`name`, `security`, `help`) values
('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'),
('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".');
-
-
+ \ No newline at end of file
diff --git a/sql/updates/241_world.sql b/sql/updates/2.4.3_updates/241_world.sql
index 4aa3ae99b94..2bc028b3eba 100644
--- a/sql/updates/241_world.sql
+++ b/sql/updates/2.4.3_updates/241_world.sql
@@ -2,4 +2,3 @@ DELETE FROM `command` WHERE name IN ('bindsight', 'unbindsight');
INSERT INTO `command` (name,security,help) VALUES
('bindsight',3,'Syntax: .bindsight\r\n\r\nBinds vision to the selected unit indefinitely. Cannot be used while currently possessing a target.'),
('unbindsight',3,'Syntax: .unbindsight\r\n\r\nRemoves bound vision. Cannot be used while currently possessing a target.');
-
diff --git a/sql/updates/247_world.sql b/sql/updates/2.4.3_updates/247_world.sql
index 95a087d1a20..a47e9733bcf 100644
--- a/sql/updates/247_world.sql
+++ b/sql/updates/2.4.3_updates/247_world.sql
@@ -26,5 +26,4 @@ INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `commen
DELETE FROM spell_target_position WHERE `id` IN (46019, 46020);
INSERT INTO spell_target_position () VALUES (46019, 580, 1704.34, 928.17, -74.558, 0);
-INSERT INTO spell_target_position () VALUES (46020, 580, 1704.34, 928.17, 53.079, 0);
-
+INSERT INTO spell_target_position () VALUES (46020, 580, 1704.34, 928.17, 53.079, 0); \ No newline at end of file
diff --git a/sql/updates/262_characters.sql b/sql/updates/2.4.3_updates/262_characters.sql
index 093078d148d..b3caa9704f0 100644
--- a/sql/updates/262_characters.sql
+++ b/sql/updates/2.4.3_updates/262_characters.sql
@@ -3,4 +3,3 @@ ALTER TABLE `guild_bank_tab`
ALTER TABLE `character_aura` ADD `stackcount` INT NOT NULL DEFAULT '1' AFTER `effect_index` ;
ALTER TABLE `pet_aura` ADD `stackcount` INT NOT NULL DEFAULT '1' AFTER `effect_index`;
-
diff --git a/sql/updates/262_realmd.sql b/sql/updates/2.4.3_updates/262_realmd.sql
index 28dc64111c1..1953f19fe28 100644
--- a/sql/updates/262_realmd.sql
+++ b/sql/updates/2.4.3_updates/262_realmd.sql
@@ -1,3 +1,2 @@
ALTER TABLE `account`
CHANGE COLUMN `email` `email` text;
-
diff --git a/sql/updates/262_world.sql b/sql/updates/2.4.3_updates/262_world.sql
index cd90a3df696..6c97d9798d5 100644
--- a/sql/updates/262_world.sql
+++ b/sql/updates/2.4.3_updates/262_world.sql
@@ -98,5 +98,4 @@ ALTER TABLE creature_movement
ADD COLUMN textid2 int(11) NOT NULL default '0' AFTER textid1,
ADD COLUMN textid3 int(11) NOT NULL default '0' AFTER textid2,
ADD COLUMN textid4 int(11) NOT NULL default '0' AFTER textid3,
- ADD COLUMN textid5 int(11) NOT NULL default '0' AFTER textid4;
-
+ ADD COLUMN textid5 int(11) NOT NULL default '0' AFTER textid4; \ No newline at end of file
diff --git a/sql/updates/273_world_scripts.sql b/sql/updates/2.4.3_updates/273_world_scripts.sql
index 800f181f882..2979197c734 100644
--- a/sql/updates/273_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/273_world_scripts.sql
@@ -1,4 +1,3 @@
UPDATE `creature_template` SET `ScriptName`='npc_wounded_blood_elf' WHERE `entry`='16993';
UPDATE `creature_template` SET `ScriptName` = 'mob_phase_hunter' WHERE `entry` = '18879';
-
diff --git a/sql/updates/285_world.sql b/sql/updates/2.4.3_updates/285_world.sql
index ab9c26ebccb..74825f4b75a 100644
--- a/sql/updates/285_world.sql
+++ b/sql/updates/2.4.3_updates/285_world.sql
@@ -37,4 +37,3 @@ INSERT INTO `trinity_string` VALUES
(749,'The Stormpike General is Dead!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
;
-
diff --git a/sql/updates/287_world_scripts.sql b/sql/updates/2.4.3_updates/287_world_scripts.sql
index f761f897e9d..4a0c5031188 100644
--- a/sql/updates/287_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/287_world_scripts.sql
@@ -1,4 +1,3 @@
UPDATE `creature_template` SET `ScriptName` = 'npc_steam_tonk' WHERE `entry` = '19405';
UPDATE `creature_template` SET `ScriptName` = 'npc_tonk_mine' WHERE `entry` = '15368';
-
diff --git a/sql/updates/329_world.sql b/sql/updates/2.4.3_updates/329_world.sql
index 42dd8012cb2..33f61416fb1 100644
--- a/sql/updates/329_world.sql
+++ b/sql/updates/2.4.3_updates/329_world.sql
@@ -583,4 +583,3 @@ INSERT INTO `spell_proc_event` VALUES ('28744', '0', '7', '64', '278528', '0', '
INSERT INTO `spell_proc_event` VALUES ('12488', '0', '3', '128', '327680', '0', '0', '0', '0');
INSERT INTO `spell_proc_event` VALUES ('19573', '0', '9', '8388608', '16384', '0', '0', '0', '0');
INSERT INTO `spell_proc_event` VALUES ('33757', '0', '0', '0', '0', '0', '0', '0', '3');
-
diff --git a/sql/updates/332_world.sql b/sql/updates/2.4.3_updates/332_world.sql
index c1864d6c03a..912173fcbbf 100644
--- a/sql/updates/332_world.sql
+++ b/sql/updates/2.4.3_updates/332_world.sql
@@ -1,4 +1,3 @@
DELETE FROM `spell_script_target` WHERE `entry` in (30659);
INSERT INTO `spell_script_target` VALUES (30659, 1, 17281);
-
diff --git a/sql/updates/333_world.sql b/sql/updates/2.4.3_updates/333_world.sql
index 77c2b476700..9bd405e3589 100644
--- a/sql/updates/333_world.sql
+++ b/sql/updates/2.4.3_updates/333_world.sql
@@ -9,4 +9,3 @@ INSERT INTO `spell_proc_event` VALUES ('10608', '0', '0', '0', '0', '0', '0', '0
INSERT INTO `spell_proc_event` VALUES ('10610', '0', '0', '0', '0', '0', '0', '0', '3');
INSERT INTO `spell_proc_event` VALUES ('25583', '0', '0', '0', '0', '0', '0', '0', '3');
INSERT INTO `spell_proc_event` VALUES ('25584', '0', '0', '0', '0', '0', '0', '0', '3');
-
diff --git a/sql/updates/334_world.sql b/sql/updates/2.4.3_updates/334_world.sql
index e7e1c4b328f..6cd6cb7714a 100644
--- a/sql/updates/334_world.sql
+++ b/sql/updates/2.4.3_updates/334_world.sql
@@ -17,5 +17,4 @@ INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_
(784,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(785,'Arena testing turned %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(786,'|cffff0000[Automatic]:|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(787,'|cffffff00[|c1f40af20Announce by|r |cffff0000%s|cffffff00]:|r %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-
+(787,'|cffffff00[|c1f40af20Announce by|r |cffff0000%s|cffffff00]:|r %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/341_world.sql b/sql/updates/2.4.3_updates/341_world.sql
new file mode 100644
index 00000000000..7d1eb4a0c8d
--- /dev/null
+++ b/sql/updates/2.4.3_updates/341_world.sql
@@ -0,0 +1 @@
+TRUNCATE TABLE playercreateinfo_item; \ No newline at end of file
diff --git a/sql/updates/356_world.sql b/sql/updates/2.4.3_updates/356_world.sql
index b7fc8258b7e..9db8a85d7cd 100644
--- a/sql/updates/356_world.sql
+++ b/sql/updates/2.4.3_updates/356_world.sql
@@ -1,3 +1,2 @@
DELETE FROM `spell_elixir` WHERE `entry` = 45373;
INSERT INTO `spell_elixir` VALUES (45373,0x1);
-
diff --git a/sql/updates/373_world_scripts.sql b/sql/updates/2.4.3_updates/373_world_scripts.sql
index 92623b3ec1b..db27ebe2441 100644
--- a/sql/updates/373_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/373_world_scripts.sql
@@ -1,4 +1,3 @@
UPDATE `creature_template` SET `ScriptName`='boss_warchief_kargath_bladefist' WHERE `entry`=16808;
UPDATE `instance_template` SET `script`='instance_deadmines' WHERE `map`=36;
UPDATE `item_template` SET `ScriptName`='item_defias_gunpowder' WHERE `entry`=5397;
-
diff --git a/sql/updates/377_world_scripts.sql b/sql/updates/2.4.3_updates/377_world_scripts.sql
index c7d5bf98e52..fe93962ef3a 100644
--- a/sql/updates/377_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/377_world_scripts.sql
@@ -8,4 +8,3 @@ INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc1`, `content
(-1645007,'Champion Lightrend, make me proud!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE'),
(-1645008,'Show this upstart how a real Blood Knight fights, Swiftblade!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE'),
(-1645009,'Show $N the meaning of pain, Sunstriker!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,0,'master_kelerun_bloodmourn YELL_PHASE');
-
diff --git a/sql/updates/389_world.sql b/sql/updates/2.4.3_updates/389_world.sql
index 9e199c37726..89094143f64 100644
--- a/sql/updates/389_world.sql
+++ b/sql/updates/2.4.3_updates/389_world.sql
@@ -7,4 +7,3 @@ INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `commen
-- INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-49011, 49009, 0, 'Wyvern Sting');
-- Rank 6 (not available till wotlk)
-- INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-49012, 49010, 0, 'Wyvern Sting');
-
diff --git a/sql/updates/400_world.sql b/sql/updates/2.4.3_updates/400_world.sql
index 25a1d1a74e7..a2f7d1e6cea 100644
--- a/sql/updates/400_world.sql
+++ b/sql/updates/2.4.3_updates/400_world.sql
@@ -8,4 +8,3 @@ INSERT INTO `spell_script_target` VALUES (5628, 1, 2013);
INSERT INTO `spell_script_target` VALUES (5628, 1, 2014);
INSERT INTO `spell_script_target` VALUES (45109, 1, 25084);
INSERT INTO `spell_script_target` VALUES (45149, 0, 300154);
-
diff --git a/sql/updates/410_characters.sql b/sql/updates/2.4.3_updates/410_characters.sql
index 96bf01135d4..483b991e19e 100644
--- a/sql/updates/410_characters.sql
+++ b/sql/updates/2.4.3_updates/410_characters.sql
@@ -1,3 +1,2 @@
ALTER TABLE `guild_member` DROP INDEX `guid_key` ,
ADD UNIQUE `guid_key` ( `guid` );
-
diff --git a/sql/updates/426_world_scripts.sql b/sql/updates/2.4.3_updates/426_world_scripts.sql
index d7cec0efd7d..fde6ee6dbf2 100644
--- a/sql/updates/426_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/426_world_scripts.sql
@@ -11,4 +11,3 @@ UPDATE `creature_template` SET `ScriptName`='mob_archaedas_minions' WHERE `entry
-- Stone keepers
UPDATE `creature_template` SET `ScriptName`='mob_stonekeepers' WHERE `entry`=4857;
-
diff --git a/sql/updates/427_world_scripts.sql b/sql/updates/2.4.3_updates/427_world_scripts.sql
index abcff54ade6..b6fe5fb7acb 100644
--- a/sql/updates/427_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/427_world_scripts.sql
@@ -55,4 +55,3 @@ REPLACE INTO `script_texts` VALUES
(-1189006, 'Your body lies beaten, battered and broken. Let my curse be your own, fate has spoken',0,0,0,0,0,0,0,0,11962,0,0,'Headless Horseman SAY_PLAYER_DEATH'),
(-1189007, 'This end have I reached before. What new adventure lies in store?',0,0,0,0,0,0,0,0,11964,0,0,'Headless Horseman SAY_DEATH');
-
diff --git a/sql/updates/444_world.sql b/sql/updates/2.4.3_updates/444_world.sql
index b5d588c39fa..004cf626f88 100644
--- a/sql/updates/444_world.sql
+++ b/sql/updates/2.4.3_updates/444_world.sql
@@ -34,4 +34,3 @@ ALTER TABLE `creature_addon`
ADD `path_id` int(11) unsigned NOT NULL default '0' AFTER `guid`;
ALTER TABLE `creature_template_addon`
ADD `path_id` int(11) unsigned NOT NULL default '0' AFTER `entry`;
-
diff --git a/sql/updates/452_world.sql b/sql/updates/2.4.3_updates/452_world.sql
index dbc7589e46f..3b549278fc7 100644
--- a/sql/updates/452_world.sql
+++ b/sql/updates/2.4.3_updates/452_world.sql
@@ -7,4 +7,3 @@ DELETE FROM `spell_chain` WHERE `spell_id` = 26991;
INSERT INTO `spell_chain` (spell_id,prev_spell,first_spell,rank,req_spell) VALUES (21849,0,1126,1,0);
INSERT INTO `spell_chain` (spell_id,prev_spell,first_spell,rank,req_spell) VALUES (21850,21849,1126,2,0);
INSERT INTO `spell_chain` (spell_id,prev_spell,first_spell,rank,req_spell) VALUES (26991,21850,1126,3,0);
-
diff --git a/sql/updates/455_world.sql b/sql/updates/2.4.3_updates/455_world.sql
index 5dec728d539..a5a23c5f5d6 100644
--- a/sql/updates/455_world.sql
+++ b/sql/updates/2.4.3_updates/455_world.sql
@@ -12,4 +12,3 @@ INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `commen
INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (43658, 43655, 0, 'Electrical Arc Visual');
INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (43658, 43656, 0, 'Electrical Arc Visual');
INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (43658, 43659, 0, 'Electrical Arc Visual');
-
diff --git a/sql/updates/45_characters.sql b/sql/updates/2.4.3_updates/45_characters.sql
index 99ef0dd5c9d..9f370ba909c 100644
--- a/sql/updates/45_characters.sql
+++ b/sql/updates/2.4.3_updates/45_characters.sql
@@ -11,4 +11,3 @@ CREATE TABLE `game_event_condition_save` (
`done` float default '0',
PRIMARY KEY (`event_id`,`condition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
diff --git a/sql/updates/471_world.sql b/sql/updates/2.4.3_updates/471_world.sql
index c21757e2910..2db368326e8 100644
--- a/sql/updates/471_world.sql
+++ b/sql/updates/2.4.3_updates/471_world.sql
@@ -1,3 +1,2 @@
UPDATE `gameobject_template` SET `faction`=1375 WHERE `entry` IN (184203, 184204, 184205);
UPDATE `gameobject_template` SET `Scriptname`='go_bridge_console' WHERE entry=184568;
-
diff --git a/sql/updates/480_world_scripts.sql b/sql/updates/2.4.3_updates/480_world_scripts.sql
index 7eeaeb61fbf..203196a0f16 100644
--- a/sql/updates/480_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/480_world_scripts.sql
@@ -1,3 +1,2 @@
UPDATE `creature_template` SET `ScriptName`='npc_winter_reveler' WHERE `entry`=15760;
UPDATE `creature_template` SET `ScriptName`='npc_brewfest_reveler' WHERE `entry`=24484;
-
diff --git a/sql/updates/488_world_scripts.sql b/sql/updates/2.4.3_updates/488_world_scripts.sql
index 8aab8c464ed..41b264fb217 100644
--- a/sql/updates/488_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/488_world_scripts.sql
@@ -733,4 +733,3 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1000125, 'You! Enter the fray!', 0, 0, 0, 'twiggy SAY_TWIGGY_FRAY'),
(-1000126, 'Challenger is down!', 0, 0, 0, 'twiggy SAY_TWIGGY_DOWN'),
(-1000127, 'The Affray is over.', 0, 0, 0, 'twiggy SAY_TWIGGY_OVER');
-
diff --git a/sql/updates/502_world_scripts.sql b/sql/updates/2.4.3_updates/502_world_scripts.sql
index 6f0cc47bf63..458d8bb24ed 100644
--- a/sql/updates/502_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/502_world_scripts.sql
@@ -4,4 +4,3 @@ UPDATE `creature_template` SET `ScriptName` = 'mob_coilfang_ambusher' WHERE `ent
UPDATE `creature_template` SET `ScriptName` = 'mob_coilfang_guardian' WHERE `entry` = '21873';
UPDATE `creature_model_info` SET `bounding_radius` = '13', `combat_reach` = '20' WHERE `modelid` = '20216';
-
diff --git a/sql/updates/505_world.sql b/sql/updates/2.4.3_updates/505_world.sql
index 26812d4d3fb..fe3b3c850aa 100644
--- a/sql/updates/505_world.sql
+++ b/sql/updates/2.4.3_updates/505_world.sql
@@ -7,4 +7,3 @@ CREATE TABLE `creature_formations` (
`angle` float unsigned NOT NULL,
`groupAI` int(11) unsigned NOT NULL,
PRIMARY KEY (`follower`));
-
diff --git a/sql/updates/506_world.sql b/sql/updates/2.4.3_updates/506_world.sql
index 634aa33735f..069690c4da8 100644
--- a/sql/updates/506_world.sql
+++ b/sql/updates/2.4.3_updates/506_world.sql
@@ -81,4 +81,3 @@ INSERT INTO spell_chain (spell_id,prev_spell,first_spell,rank,req_spell) VALUES
INSERT INTO spell_chain (spell_id,prev_spell,first_spell,rank,req_spell) VALUES (31896,20184,20184,2,0);
ALTER TABLE spell_chain DROP COLUMN prev_spell;
-
diff --git a/sql/updates/513_world_scripts.sql b/sql/updates/2.4.3_updates/513_world_scripts.sql
index 8714057904f..21a57ea3316 100644
--- a/sql/updates/513_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/513_world_scripts.sql
@@ -17,4 +17,3 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1269026,'I am grateful for your aid, champions. Now, Gul\'dan\'s Horde will sweep across this world, like a locust swarm, and all my designs, all my carefully laid plans will at last fall into place.',10440,1,0,'medivh SAY_WIN'),
(-1269027,'Orcs of the Horde! This portalis the gateway to your new destiny! Azeroth lies before you, ripe for the taking!',0,1,0,'medivh SAY_ORCS_ENTER'),
(-1269028,'Gul\'dan speaks the truth! We should return at once to tell our brothers of the news! Retreat back trought the portal!',0,1,0,'medivh SAY_ORCS_ANSWER');
-
diff --git a/sql/updates/519_world.sql b/sql/updates/2.4.3_updates/519_world.sql
index deddf74b42e..2423f94ec1c 100644
--- a/sql/updates/519_world.sql
+++ b/sql/updates/2.4.3_updates/519_world.sql
@@ -1,3 +1,2 @@
ALTER TABLE `creature_formations` CHANGE `leader` `leaderGUID` int(11) unsigned NOT NULL default '0';
ALTER TABLE `creature_formations` CHANGE `follower` `memberGUID` int(11) unsigned NOT NULL default '0';
-
diff --git a/sql/updates/537_world.sql b/sql/updates/2.4.3_updates/537_world.sql
index 7929f4dbc52..2401a5aeadd 100644
--- a/sql/updates/537_world.sql
+++ b/sql/updates/2.4.3_updates/537_world.sql
@@ -1,3 +1,2 @@
-- Removing the now unused creature_movement table
DROP TABLE IF EXISTS `creature_movement`;
-
diff --git a/sql/updates/541_characters.sql b/sql/updates/2.4.3_updates/541_characters.sql
index cddfb33519c..2651c069e05 100644
--- a/sql/updates/541_characters.sql
+++ b/sql/updates/2.4.3_updates/541_characters.sql
@@ -6,4 +6,3 @@ CREATE TABLE `saved_variables` (
ALTER TABLE `arena_team_member` DROP COLUMN `points_to_add`;
ALTER TABLE `arena_team_member` ADD COLUMN `personal_rating` int(10) UNSIGNED NOT NULL DEFAULT '0';
ALTER TABLE `characters` ADD COLUMN `arena_pending_points` int(10) UNSIGNED NOT NULL default '0' AFTER `taxi_path`;
-
diff --git a/sql/updates/541_world.sql b/sql/updates/2.4.3_updates/541_world.sql
index 676f9138bac..7d8e1fc8e1b 100644
--- a/sql/updates/541_world.sql
+++ b/sql/updates/2.4.3_updates/541_world.sql
@@ -23,5 +23,4 @@ INSERT INTO trinity_string (entry, content_default) VALUES
(1137, 'You must be in GM mode to teleport to a player in a battleground.'),
(1138, 'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.');
-DELETE FROM trinity_string WHERE entry = 714 OR entry = 716;
-
+DELETE FROM trinity_string WHERE entry = 714 OR entry = 716; \ No newline at end of file
diff --git a/sql/updates/542_characters.sql b/sql/updates/2.4.3_updates/542_characters.sql
index 9af0975e07f..4cc3bebea80 100644
--- a/sql/updates/542_characters.sql
+++ b/sql/updates/2.4.3_updates/542_characters.sql
@@ -72,4 +72,3 @@ SET
WHERE
`a`.`arenateamid` = `b`.`atid` AND
`a`.`guid` = `b`.`b_guid`;
-
diff --git a/sql/updates/54_world.sql b/sql/updates/2.4.3_updates/54_world.sql
index 761149b53af..2d5e984d9e7 100644
--- a/sql/updates/54_world.sql
+++ b/sql/updates/2.4.3_updates/54_world.sql
@@ -3,4 +3,3 @@ CREATE TABLE `game_event_battleground_holiday` (
`bgflag` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`event`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
diff --git a/sql/updates/551_world.sql b/sql/updates/2.4.3_updates/551_world.sql
index c064a8e990c..5a01d596ab4 100644
--- a/sql/updates/551_world.sql
+++ b/sql/updates/2.4.3_updates/551_world.sql
@@ -19,5 +19,4 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1000134, 'We\'ve had too many setbacks along the way: Hellfire Citadel, Fallen Sky Ridge, Firewing Point... Prince Kael\'thas will tolerate no further delays. I will tolerate nothing other than complete success!', 0, 0, 0, 'dawnforge PATHALEON_CULATOR_IMAGE_2_1'),
(-1000135, 'I am returning to Tempest Keep. See to it that I do not have reason to return!', 0, 0, 0, 'dawnforge PATHALEON_CULATOR_IMAGE_2_2' ),
(-1000136, 'Yes, my lord.', 0, 0, 0, 'dawnforge COMMANDER_DAWNFORGE_4 SAY_ARCANIST_ARDONIS_2'),
-(-1000137, 'See to it, Ardonis!', 0, 0, 0, 'dawnforge COMMANDER_DAWNFORGE_5');
-
+(-1000137, 'See to it, Ardonis!', 0, 0, 0, 'dawnforge COMMANDER_DAWNFORGE_5'); \ No newline at end of file
diff --git a/sql/updates/566_world.sql b/sql/updates/2.4.3_updates/566_world.sql
index 6ff3126aac0..6c176e1ad89 100644
--- a/sql/updates/566_world.sql
+++ b/sql/updates/2.4.3_updates/566_world.sql
@@ -22,4 +22,3 @@ INSERT INTO spell_script_target VALUES
(39011,1,20885),
(40106,1,22883),
(40105,1,22883);
-
diff --git a/sql/updates/571_world.sql b/sql/updates/2.4.3_updates/571_world.sql
index 2bd76e45769..115c210306b 100644
--- a/sql/updates/571_world.sql
+++ b/sql/updates/2.4.3_updates/571_world.sql
@@ -3,4 +3,3 @@ ALTER TABLE spell_chain DROP COLUMN rank;
ALTER TABLE spell_chain RENAME TO spell_required;
DELETE FROM spell_required WHERE req_spell=0;
-
diff --git a/sql/updates/572_world.sql b/sql/updates/2.4.3_updates/572_world.sql
index 033548f0367..33ce446b012 100644
--- a/sql/updates/572_world.sql
+++ b/sql/updates/2.4.3_updates/572_world.sql
@@ -5,4 +5,3 @@ DELETE FROM `script_texts` WHERE `entry` IN (-1000138,-1000139);
INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
(-1000138, 'Avruu\'s magic... it still controls me. You must fight me, mortal. It\'s the only way to break the spell!', 0, 0, 0, 'aeranas SAY_SUMMON'),
(-1000139, 'Avruu\'s magic is broken! I\'m free once again!', 0, 0, 0, 'aeranas SAY_FREE');
-
diff --git a/sql/updates/575_world_scripts.sql b/sql/updates/2.4.3_updates/575_world_scripts.sql
index b084d2eac8b..85a75215f0e 100644
--- a/sql/updates/575_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/575_world_scripts.sql
@@ -1,2 +1 @@
UPDATE `item_template` SET `ScriptName` = "item_only_for_flight" WHERE `entry` IN (34475, 34489, 24538);
-
diff --git a/sql/updates/57_world_scripts.sql b/sql/updates/2.4.3_updates/57_world_scripts.sql
index b87c607a14c..2f76ae8c94f 100644
--- a/sql/updates/57_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/57_world_scripts.sql
@@ -36,5 +36,4 @@ INSERT INTO `spell_proc_event` VALUES ('43983', '0', '0', '0', '0', '0', '16384'
DELETE FROM `spell_script_target` WHERE `entry` = 42577;
INSERT INTO `spell_script_target` VALUES ('42577', '1', '24136');
-UPDATE `creature_template` SET `ScriptName` = 'npc_zulaman_hostage' WHERE `entry` IN (23790, 23999, 24024, 24001);
-
+UPDATE `creature_template` SET `ScriptName` = 'npc_zulaman_hostage' WHERE `entry` IN (23790, 23999, 24024, 24001); \ No newline at end of file
diff --git a/sql/updates/583_world_scripts.sql b/sql/updates/2.4.3_updates/583_world_scripts.sql
index 3ef0a2399af..45f8d80a244 100644
--- a/sql/updates/583_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/583_world_scripts.sql
@@ -1,2 +1 @@
-UPDATE creature_template SET Scriptname='npc_ranger_lilatha' WHERE entry=16295;
-
+UPDATE creature_template SET Scriptname='npc_ranger_lilatha' WHERE entry=16295; \ No newline at end of file
diff --git a/sql/updates/586_world_scripts.sql b/sql/updates/2.4.3_updates/586_world_scripts.sql
index d4102fdfef6..a86cec4951b 100644
--- a/sql/updates/586_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/586_world_scripts.sql
@@ -1,3 +1,2 @@
UPDATE `gameobject_template` SET `ScriptName` = 'go_mausoleum_trigger' WHERE `entry` = 104593;
-UPDATE `gameobject_template` SET `ScriptName` = 'go_mausoleum_door' WHERE `entry` = 176594;
-
+UPDATE `gameobject_template` SET `ScriptName` = 'go_mausoleum_door' WHERE `entry` = 176594; \ No newline at end of file
diff --git a/sql/updates/588_world.sql b/sql/updates/2.4.3_updates/588_world.sql
index 346101bdc0a..e85a034f344 100644
--- a/sql/updates/588_world.sql
+++ b/sql/updates/2.4.3_updates/588_world.sql
@@ -4,5 +4,4 @@ INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES ('6614','Notific
INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES ('6615','|cffffff00[|c1f40af20GM Announce by|r |cffff0000%s|cffffff00]:|r %s|r');
INSERT INTO `command` (`name`,`security`,`help`) VALUES ('gmnotify', 2, 'Syntax: .gmnotify $notification\r\nDisplays a notification on the screen of all online GM\'s.');
INSERT INTO `command` (`name`,`security`,`help`) VALUES ('gmnameannounce', 2, 'Syntax: .gmnameannounce $announcement.\r\nSend an announcement to all online GM\'s, displaying the name of the sender.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('gmannounce', 4, 'Syntax: .gmannounce $announcement\r\nSend an announcement to online Gamemasters.');
-
+INSERT INTO `command` (`name`,`security`,`help`) VALUES ('gmannounce', 4, 'Syntax: .gmannounce $announcement\r\nSend an announcement to online Gamemasters.'); \ No newline at end of file
diff --git a/sql/updates/608_world.sql b/sql/updates/2.4.3_updates/608_world.sql
index 6cb9665f394..5c052ecd078 100644
--- a/sql/updates/608_world.sql
+++ b/sql/updates/2.4.3_updates/608_world.sql
@@ -164,4 +164,3 @@ INSERT INTO `spell_script_target` VALUES
(46896,0,181605),
(47104,1,26401),
(49058,1,24968); -- Rocket Bot Attack
-
diff --git a/sql/updates/615_world.sql b/sql/updates/2.4.3_updates/615_world.sql
index 99ccb0cdaa3..28512e8511e 100644
--- a/sql/updates/615_world.sql
+++ b/sql/updates/2.4.3_updates/615_world.sql
@@ -5,4 +5,3 @@ DELETE FROM spell_linked_spell WHERE `spell_trigger` IN (-49011, -49012);
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (43468, 43648);
INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (43648, 44007, 1, 'Storm Eye Safe Zone');
-
diff --git a/sql/updates/636_world_scripts.sql b/sql/updates/2.4.3_updates/636_world_scripts.sql
index e8a0fec45b1..5527d639fb2 100644
--- a/sql/updates/636_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/636_world_scripts.sql
@@ -6,5 +6,4 @@ insert into event_scripts values
-- remove every Image from Medivh (should not be spawned by db)
delete from creature where id = 17651;
-- add script
-update creature_template set scriptname = 'npc_image_of_medivh' where entry = 17651;
-
+update creature_template set scriptname = 'npc_image_of_medivh' where entry = 17651; \ No newline at end of file
diff --git a/sql/updates/640_world.sql b/sql/updates/2.4.3_updates/640_world.sql
index b32ee6819bb..20253029d5b 100644
--- a/sql/updates/640_world.sql
+++ b/sql/updates/2.4.3_updates/640_world.sql
@@ -3,4 +3,3 @@ INSERT INTO `spell_script_target` VALUES
(33655,0,183350),
(33633,0,183351),
(44374,1,24722);
-
diff --git a/sql/updates/645_world_scripts.sql b/sql/updates/2.4.3_updates/645_world_scripts.sql
index 834efb390bc..f480a97e204 100644
--- a/sql/updates/645_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/645_world_scripts.sql
@@ -2,5 +2,4 @@ delete from creature where id=17318;
update creature_template set scriptname='npc_geezle' where entry=17318;
delete from event_scripts where id=10675;
insert into event_scripts () VALUES (10675, 0, 10, 17318, 120000, 0, -5134.3, -11250.3, 5.29568, 6.23554),
-(10675, 72, 7, 9531, 0, 0, 0, 0, 0, 0);
-
+(10675, 72, 7, 9531, 0, 0, 0, 0, 0, 0); \ No newline at end of file
diff --git a/sql/updates/667_world_scripts.sql b/sql/updates/2.4.3_updates/667_world_scripts.sql
index 4b2930cd74f..1da0cea44e1 100644
--- a/sql/updates/667_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/667_world_scripts.sql
@@ -1,2 +1 @@
-update creature_template set scriptname='npc_professor_dabiri' where entry=20907;
-
+update creature_template set scriptname='npc_professor_dabiri' where entry=20907; \ No newline at end of file
diff --git a/sql/updates/66_world_scripts.sql b/sql/updates/2.4.3_updates/66_world_scripts.sql
index fcdf65e4620..dfce2afedcc 100644
--- a/sql/updates/66_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/66_world_scripts.sql
@@ -15,5 +15,4 @@ INSERT INTO `spell_script_target` VALUES ('45388', '1', '25038');
INSERT INTO `spell_script_target` VALUES ('45389', '1', '25265');
INSERT INTO `spell_script_target` VALUES ('44885', '1', '25160');
INSERT INTO `spell_script_target` VALUES ('46350', '1', '25160');
-INSERT INTO `spell_script_target` VALUES ('45714', '1', '25038');
-
+INSERT INTO `spell_script_target` VALUES ('45714', '1', '25038'); \ No newline at end of file
diff --git a/sql/updates/676_world.sql b/sql/updates/2.4.3_updates/676_world.sql
index b023e01f0a6..2b9135c04bd 100644
--- a/sql/updates/676_world.sql
+++ b/sql/updates/2.4.3_updates/676_world.sql
@@ -1,3 +1,2 @@
UPDATE `trinity_string` SET `content_default`='Player |cffff0000%s|r kicked by |cffff0000%s|r. Reason: |cffff0000%s|r.' WHERE (`entry`='282');
-UPDATE `command` SET `help`='Syntax: .kick [$charactername] [$reason]\r\n\r\nKick the given character name from the world with or without reason. If no character name is provided then the selected player (except for yourself) will be kicked. If no reason is provided, default is \"No Reason\".' WHERE (`name`='kick');
-
+UPDATE `command` SET `help`='Syntax: .kick [$charactername] [$reason]\r\n\r\nKick the given character name from the world with or without reason. If no character name is provided then the selected player (except for yourself) will be kicked. If no reason is provided, default is \"No Reason\".' WHERE (`name`='kick'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/679_world_scripts.sql b/sql/updates/2.4.3_updates/679_world_scripts.sql
new file mode 100644
index 00000000000..408eb77b046
--- /dev/null
+++ b/sql/updates/2.4.3_updates/679_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_deathstalker_erland' WHERE `entry`=1978; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/683_world_scripts.sql b/sql/updates/2.4.3_updates/683_world_scripts.sql
new file mode 100644
index 00000000000..13f18008438
--- /dev/null
+++ b/sql/updates/2.4.3_updates/683_world_scripts.sql
@@ -0,0 +1,2 @@
+UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `entry`=665;
+UPDATE `creature_template` SET `ScriptName`='npc_professor_phizzlethorpe' WHERE `entry`=2768; \ No newline at end of file
diff --git a/sql/updates/686_world_scripts.sql b/sql/updates/2.4.3_updates/686_world_scripts.sql
index f2b17d21173..e67accb70bf 100644
--- a/sql/updates/686_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/686_world_scripts.sql
@@ -1,7 +1,7 @@
UPDATE `creature_template` SET `Scriptname`='npc_willix' WHERE entry=4508;
-DELETE FROM script_texts WHERE entry BETWEEN -1047000 and -1047010;
-INSERT INTO script_texts (entry, content_default, sound, type, language, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1047010 and -1047000;
+INSERT INTO `script_texts` (entry, content_default, sound, type, language, comment) VALUES
(-1047000, 'Phew! Finally,out here. However, it will not become easy. Detain your eyes after annoyance.', 0, 0, 0, 'Willix'),
(-1047001, 'There on top resides Charlga Razorflank. The damned old Crone.', 0, 0, 0, 'Willix'),
(-1047002, 'Help! Get this Raging Agam\'ar from me!', 0, 0, 0, 'Willix'),
@@ -12,5 +12,4 @@ INSERT INTO script_texts (entry, content_default, sound, type, language, comment
(-1047007, 'I am glad that we are out again from this damned ditch. However, up here it is not much better!', 0, 0, 0, 'Willix'),
(-1047008, 'Finally! I am glad that I come, finally out here.', 0, 0, 0, 'Willix'),
(-1047009, 'I will rather rest a moment and come again to breath, before I return to Ratchet.', 0, 0, 0, 'Willix'),
-(-1047010, 'Many thanks for your help.', 0, 0, 0, 'Willix');
-
+(-1047010, 'Many thanks for your help.', 0, 0, 0, 'Willix'); \ No newline at end of file
diff --git a/sql/updates/68_world.sql b/sql/updates/2.4.3_updates/68_world.sql
index 40678a4a5b0..650f4ea3ca0 100644
--- a/sql/updates/68_world.sql
+++ b/sql/updates/2.4.3_updates/68_world.sql
@@ -13,5 +13,4 @@ INSERT INTO trinity_string VALUES
DELETE FROM `command` WHERE `name` = 'freeze' or `name` = 'unfreeze' or name = 'listfreeze';
INSERT INTO `command` (`name`,`security`,`help`) VALUES ('freeze','2','Syntax: .freeze (#player)\r\n\"Freezes\" #player and disables his chat. When using this without #name it will freeze your target.');
INSERT INTO `command` (`name`,`security`,`help`) VALUES ('unfreeze','2','Syntax: .unfreeze (#player)\r\n\"Unfreezes\" #player and enables his chat again. When using this without #name it will unfreeze your target.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('listfreeze','1','Syntax: .listfreeze\r\n\r\nSearch and output all frozen players.');
-
+INSERT INTO `command` (`name`,`security`,`help`) VALUES ('listfreeze','1','Syntax: .listfreeze\r\n\r\nSearch and output all frozen players.'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/691_world_scripts.sql b/sql/updates/2.4.3_updates/691_world_scripts.sql
new file mode 100644
index 00000000000..922f4b24fab
--- /dev/null
+++ b/sql/updates/2.4.3_updates/691_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_earthmender_wilda' WHERE `entry`=21027; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/692_world.sql b/sql/updates/2.4.3_updates/692_world.sql
new file mode 100644
index 00000000000..2149baa9488
--- /dev/null
+++ b/sql/updates/2.4.3_updates/692_world.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_proc_event` WHERE `entry` IN ('38164','14144','14148');
+INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
+('38164','0','0','0','0','1','0','0','60'),
+('14144','0','0','0','2','0','0','0','0'),
+('14148','0','0','0','2','0','0','0','0'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/708_world_scripts.sql b/sql/updates/2.4.3_updates/708_world_scripts.sql
new file mode 100644
index 00000000000..5d0d9a9a916
--- /dev/null
+++ b/sql/updates/2.4.3_updates/708_world_scripts.sql
@@ -0,0 +1,2 @@
+UPDATE `creature_template` SET `ScriptName`='boss_shirrak_the_dead_watcher' WHERE `entry`=18371;
+UPDATE `creature_template` SET `ScriptName`='mob_focus_fire' WHERE `entry`=18374; \ No newline at end of file
diff --git a/sql/updates/70_world_scripts.sql b/sql/updates/2.4.3_updates/70_world_scripts.sql
index 893edc00a5f..1bbf737c59c 100644
--- a/sql/updates/70_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/70_world_scripts.sql
@@ -24,5 +24,4 @@ UPDATE `creature_template` SET
`ScriptName` = 'npc_kservant' WHERE `entry` = '19685';
DELETE FROM `quest_start_scripts` WHERE `id`='10211';
-UPDATE `quest_template` SET `StartScript`='0' WHERE entry=10211;
-
+UPDATE `quest_template` SET `StartScript`='0' WHERE entry=10211; \ No newline at end of file
diff --git a/sql/updates/722_world_script_texts.sql b/sql/updates/2.4.3_updates/722_world_script_texts.sql
index 49788912023..8be4cd9a86f 100644
--- a/sql/updates/722_world_script_texts.sql
+++ b/sql/updates/2.4.3_updates/722_world_script_texts.sql
@@ -6,5 +6,4 @@ INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,
(-1000143,'There\'s Farstrider Enclave now, $C. Not far to go... Look out! Troll ambush!!',0,0,1,'lilatha SAY_PROGRESS3'),
(-1000144,'Thank you for saving my life and bringing me back to safety, $N',0,0,1,'lilatha SAY_END1'),
(-1000145,'Captain Helios, I\'ve been rescued from the Amani Catacombs. Reporting for duty, sir!',0,0,1,'lilatha SAY_END2'),
-(-1000146,'Liatha, get someone to look at those injuries. Thank you for bringing her back safely.',0,0,1,'lilatha CAPTAIN_ANSWER');
-
+(-1000146,'Liatha, get someone to look at those injuries. Thank you for bringing her back safely.',0,0,1,'lilatha CAPTAIN_ANSWER'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/724_world.sql b/sql/updates/2.4.3_updates/724_world.sql
new file mode 100644
index 00000000000..6c57f8b4a22
--- /dev/null
+++ b/sql/updates/2.4.3_updates/724_world.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `custom_texts` ADD COLUMN `emote` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL AFTER `language`;
+ALTER TABLE `eventai_texts` ADD COLUMN `emote` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL AFTER `language`;
+ALTER TABLE `script_texts` ADD COLUMN `emote` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL AFTER `language`; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/725_characters.sql b/sql/updates/2.4.3_updates/725_characters.sql
new file mode 100644
index 00000000000..675c6721602
--- /dev/null
+++ b/sql/updates/2.4.3_updates/725_characters.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `character_ticket` RENAME TO `gm_tickets`;
+ALTER TABLE `gm_tickets` CHANGE `guid` `playerGuid` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `gm_tickets` CHANGE `ticket_id` `guid` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `gm_tickets` CHANGE `ticket_text` `message` text(0) NOT NULL;
+ALTER TABLE `gm_tickets` CHANGE `ticket_lastchange` `timestamp` int(10) NOT NULL default '0'; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/725_world.sql b/sql/updates/2.4.3_updates/725_world.sql
new file mode 100644
index 00000000000..38eeead03cb
--- /dev/null
+++ b/sql/updates/2.4.3_updates/725_world.sql
@@ -0,0 +1,31 @@
+DELETE FROM `trinity_string` WHERE `entry` IN (290,296,289);
+DELETE FROM `trinity_string` WHERE `entry` BETWEEN 2000 AND 2016;
+INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(2000, '|cff00ff00New ticket from|r|cffff00ff %s.|r |cff00ff00Ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2001, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00edited his/her ticket:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2002, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00abandoned ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2003, '|cffff00ff %s|r |cff00ff00closed ticket|r |cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
+(2004, 'Ticket %d permanently deleted by %s.', '', '', '', '', '', '', '', ''),
+(2005, 'Ticket not found.', '', '', '', '', '', '', '', ''),
+(2007, 'Please close ticket before deleting it permanently.', '', '', '', '', '', '', '', ''),
+(2008, 'Ticket %d is already assigned to GM %s.', '', '', '', '', '', '', '', ''),
+(2009, '%u Tickets succesfully reloaded from the database.', '', '', '', '', '', '', '', ''),
+(2010, 'Showing list of open tickets.', '', '', '', '', '', '', '', ''),
+(2011, 'Showing list of open tickets whose creator is online.', '', '', '', '', '', '', '', ''),
+(2012, 'Invalid name specified. Name should be that of an online Gamemaster.', '', '', '', '', '', '', '', ''),
+(2013, 'This ticket is already assigned to yourself. To unassign use .ticket unassign %d and then reassign.', '', '', '', '', '', '', '', ''),
+(2014, 'Ticket %d is not assigned, you cannot unassign it.', '', '', '', '', '', '', '', ''),
+(2015, 'You cannot unassign tickets from staffmembers with a higher security level than yourself.', '', '', '', '', '', '', '', ''),
+(2016, 'Cannot close ticket %d, it is assigned to another GM.', '', '', '', '', '', '', '', '');
+DELETE FROM `command` WHERE (`name` LIKE '%ticket%');
+INSERT INTO `command` (`name`,`security`,`help`) VALUES
+('ticket list','1','Displays a list of open GM tickets.'),
+('ticket onlinelist','1','Displays a list of open GM tickets whose owner is online.'),
+('ticket viewname','1','Usage: .ticket viewname $creatorname. \r\nReturns details about specified ticket. Ticket must be open and not deleted.'),
+('ticket viewid','1','Usage: .ticket viewid $ticketid.\r\nReturns details about specified ticket. Ticket must be open and not deleted.'),
+('ticket close','2','Usage: .ticket close $ticketid.\r\nCloses the specified ticket. Does not delete permanently.'),
+('ticket delete','3','Usage: .ticket delete $ticketid.\r\nDeletes the specified ticket permanently. Ticket must be closed first.'),
+('ticket assign','3','Usage: .ticket assign $ticketid $gmname.\r\nAssigns the specified ticket to the specified Game Master.'),
+('ticket unassign','3','Usage: .ticket unassign $ticketid.\r\nUnassigns the specified ticket from the current assigned Game Master.'),
+('ticket comment','2','Usage: .ticket comment $ticketid $comment.\r\nAllows the adding or modifying of a comment to the specified ticket.'),
+('reload tickets','4','Usage: .reload tickets.\r\nReloads GM Tickets from the database and re-caches them into memory.');
diff --git a/sql/updates/2.4.3_updates/728_world_scripts.sql b/sql/updates/2.4.3_updates/728_world_scripts.sql
new file mode 100644
index 00000000000..8ada5080463
--- /dev/null
+++ b/sql/updates/2.4.3_updates/728_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_apprentice_mirveda' WHERE `entry`=15402; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/733_characters.sql b/sql/updates/2.4.3_updates/733_characters.sql
new file mode 100644
index 00000000000..21c3d27e782
--- /dev/null
+++ b/sql/updates/2.4.3_updates/733_characters.sql
@@ -0,0 +1 @@
+ALTER TABLE `gm_tickets` ADD `name` varchar(15) NOT NULL AFTER `playerGuid`; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/739_characters.sql b/sql/updates/2.4.3_updates/739_characters.sql
new file mode 100644
index 00000000000..8a4e9197494
--- /dev/null
+++ b/sql/updates/2.4.3_updates/739_characters.sql
@@ -0,0 +1 @@
+ALTER TABLE `gm_tickets` ADD `comment` text(0) NOT NULL; \ No newline at end of file
diff --git a/sql/updates/741_characters.sql b/sql/updates/2.4.3_updates/741_characters.sql
index b7862c4f261..4ce094e3e5f 100644
--- a/sql/updates/741_characters.sql
+++ b/sql/updates/2.4.3_updates/741_characters.sql
@@ -1,4 +1,3 @@
ALTER TABLE `gm_tickets` ADD `closed` tinyint(1) NOT NULL default '0' AFTER `timestamp`;
ALTER TABLE `gm_tickets` ADD `assignedto` int(10) NOT NULL default '0' AFTER `timestamp`;
-
diff --git a/sql/updates/741_world.sql b/sql/updates/2.4.3_updates/741_world.sql
index da59a6d3633..a93d4e2bd01 100644
--- a/sql/updates/741_world.sql
+++ b/sql/updates/2.4.3_updates/741_world.sql
@@ -8,4 +8,3 @@ REPLACE INTO `command` (`name`,`security`,`help`) VALUES ('ticket assign','3','U
REPLACE INTO `command` (`name`,`security`,`help`) VALUES ('ticket unassign','3','Usage: .ticket unassign $ticketid.\r\nUnassigns the specified ticket from the current assigned Game Master.');
REPLACE INTO `command` (`name`,`security`,`help`) VALUES ('ticket comment','2','Usage: .ticket comment $ticketid $comment.\r\nAllows the adding or modifying of a comment to the specified ticket.');
REPLACE INTO `command` (`name`,`security`,`help`) VALUES ('reload tickets','4','Usage: .reload tickets.\r\nReloads GM Tickets from the database and re-caches them into memory.');
-
diff --git a/sql/updates/747_world.sql b/sql/updates/2.4.3_updates/747_world.sql
index 561f0adf91d..0fd9c3552e4 100644
--- a/sql/updates/747_world.sql
+++ b/sql/updates/2.4.3_updates/747_world.sql
@@ -1,2 +1 @@
-UPDATE `trinity_string` SET `content_default`='Ticket %d is already assigned.' WHERE (`entry`='2008');
-
+UPDATE `trinity_string` SET `content_default`='Ticket %d is already assigned.' WHERE `entry`=2008; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/748_world_scripts.sql b/sql/updates/2.4.3_updates/748_world_scripts.sql
new file mode 100644
index 00000000000..2c1f692056d
--- /dev/null
+++ b/sql/updates/2.4.3_updates/748_world_scripts.sql
@@ -0,0 +1,3 @@
+UPDATE `creature_template` SET `ScriptName`='npc_infused_crystal' WHERE `entry`=16364;
+UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry`=16364;
+DELETE FROM `creature` WHERE `id`=17086; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/758_world_scripts.sql b/sql/updates/2.4.3_updates/758_world_scripts.sql
new file mode 100644
index 00000000000..3e8ca0f38b9
--- /dev/null
+++ b/sql/updates/2.4.3_updates/758_world_scripts.sql
@@ -0,0 +1,6 @@
+DELETE FROM `creature_template_addon` WHERE `entry`=17225;
+UPDATE `creature_template` SET `ScriptName`='boss_nightbane' WHERE `entry`=17225;
+UPDATE `creature_template` SET `unit_flags`=0 WHERE `entry`=17225;
+DELETE FROM `event_scripts` WHERE `id`=10951;
+INSERT INTO `event_scripts` VALUES
+(10951,0,10,17651,180000,0,-11159,-1907.22,91.48,0); \ No newline at end of file
diff --git a/sql/updates/762_world.sql b/sql/updates/2.4.3_updates/762_world.sql
index 7aaacedc464..6e69f078743 100644
--- a/sql/updates/762_world.sql
+++ b/sql/updates/2.4.3_updates/762_world.sql
@@ -2,6 +2,5 @@ DROP TABLE IF EXISTS `transport_events`;
CREATE TABLE `transport_events` (
`entry` int(11) unsigned NOT NULL default '0',
`waypoint_id` int(11) unsigned NOT NULL default '0',
- `event_id` int(11) unsigned NOT NULL default '0'
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
+ `event_id` int(11) unsigned NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/764_world_scripts.sql b/sql/updates/2.4.3_updates/764_world_scripts.sql
new file mode 100644
index 00000000000..2a8e7b23b12
--- /dev/null
+++ b/sql/updates/2.4.3_updates/764_world_scripts.sql
@@ -0,0 +1,123 @@
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=16062;
+UPDATE `creature_template` SET `ScriptName`='boss_rivendare_naxx' WHERE `entry`=30549;
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533039 AND -1533000;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533000,'Ahh... welcome to my parlor.',8788,1,0,'anubrekhan SAY_GREET'),
+(-1533001,'Just a little taste...',8785,1,0,'anubrekhan SAY_AGGRO1'),
+(-1533002,'There is no way out.',8786,1,0,'anubrekhan SAY_AGGRO2'),
+(-1533003,'Yes, Run! It makes the blood pump faster!',8787,1,0,'anubrekhan SAY_AGGRO3'),
+(-1533004,'I hear little hearts beating. Yesss... beating faster now. Soon the beating will stop.',8790,1,0,'anubrekhan SAY_TAUNT1'),
+(-1533005,'Where to go? What to do? So many choices that all end in pain, end in death.',8791,1,0,'anubrekhan SAY_TAUNT2'),
+(-1533006,'Which one shall I eat first? So difficult to choose... the all smell so delicious.',8792,1,0,'anubrekhan SAY_TAUNT3'),
+(-1533007,'Closer now... tasty morsels. I\'ve been too long without food. Without blood to drink.',8793,1,0,'anubrekhan SAY_TAUNT4'),
+(-1533008,'Shh... it will all be over soon.',8789,1,0,'anubrekhan SAY_SLAY'),
+(-1533009,'Your old lives, your mortal desires, mean nothing. You are acolytes of the master now, and you will serve the cause without question! The greatest glory is to die in the master\'s service!',8799,1,0,'faerlina SAY_GREET'),
+(-1533010,'Slay them in the master\'s name!',8794,1,0,'faerlina SAY_AGGRO1'),
+(-1533011,'You cannot hide from me!',8795,1,0,'faerlina SAY_AGGRO2'),
+(-1533012,'Kneel before me, worm!',8796,1,0,'faerlina SAY_AGGRO3'),
+(-1533013,'Run while you still can!',8797,1,0,'faerlina SAY_AGGRO4'),
+(-1533014,'You have failed!',8800,1,0,'faerlina SAY_SLAY1'),
+(-1533015,'Pathetic wretch!',8801,1,0,'faerlina SAY_SLAY2'),
+(-1533016,'The master... will avenge me!',8798,1,0,'faerlina SAY_DEATH'),
+(-1533017,'Patchwerk want to play!',8909,1,0,'patchwerk SAY_AGGRO1'),
+(-1533018,'Kel\'Thuzad make Patchwerk his Avatar of War!',8910,1,0,'patchwerk SAY_AGGRO2'),
+(-1533019,'No more play?',8912,1,0,'patchwerk SAY_SLAY'),
+(-1533020,'What happened to... Patch...',8911,1,0,'patchwerk SAY_DEATH'),
+(-1533021,'goes into a berserker rage!',0,2,0,'patchwerk EMOTE_BERSERK'),
+(-1533022,'becomes enraged!',0,2,0,'patchwerk EMOTE_ENRAGE'),
+(-1533023,'Stalagg crush you!',8864,1,0,'stalagg SAY_STAL_AGGRO'),
+(-1533024,'Stalagg kill!',8866,1,0,'stalagg SAY_STAL_SLAY'),
+(-1533025,'Master save me...',8865,1,0,'stalagg SAY_STAL_DEATH'),
+(-1533026,'Feed you to master!',8802,1,0,'feugen SAY_FEUG_AGGRO'),
+(-1533027,'Feugen make master happy!',8804,1,0,'feugen SAY_FEUG_SLAY'),
+(-1533028,'No... more... Feugen...',8803,1,0,'feugen SAY_FEUG_DEATH'),
+(-1533029,'You are too late... I... must... OBEY!',8872,1,0,'thaddius SAY_GREET'),
+(-1533030,'KILL!',8867,1,0,'thaddius SAY_AGGRO1'),
+(-1533031,'EAT YOUR BONES!',8868,1,0,'thaddius SAY_AGGRO2'),
+(-1533032,'BREAK YOU!',8869,1,0,'thaddius SAY_AGGRO3'),
+(-1533033,'You die now!',8877,1,0,'thaddius SAY_SLAY'),
+(-1533034,'Now YOU feel pain!',8871,1,0,'thaddius SAY_ELECT'),
+(-1533035,'Thank... you...',8870,1,0,'thaddius SAY_DEATH'),
+(-1533036,'Pleeease!',8873,1,0,'thaddius SAY_SCREAM1'),
+(-1533037,'Stop, make it stop!',8874,1,0,'thaddius SAY_SCREAM2'),
+(-1533038,'Help me! Save me!',8875,1,0,'thaddius SAY_SCREAM3'),
+(-1533039,'Please, nooo!',8876,1,0,'thaddius SAY_SCREAM4');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533074 AND -1533040;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533040,'Foolishly you have sought your own demise. Brazenly you have disregarded powers beyond your understanding. You have fought hard to invade the realm of the harvester. Now there is only one way out - to walk the lonely path of the damned.',8807,1,0,'gothik SAY_SPEECH'),
+(-1533041,'Death is the only escape.',8806,1,0,'gothik SAY_KILL'),
+(-1533042,'I... am... undone!',8805,1,0,'gothik SAY_DEATH'),
+(-1533043,'I have waited long enough! Now, you face the harvester of souls!',8808,1,0,'gothik SAY_TELEPORT'),
+(-1533044,'Defend youself!',8892,1,0,'blaumeux SAY_BLAU_AGGRO'),
+(-1533045,'Come, Zeliek, do not drive them out. Not before we\'ve had our fun.',8896,1,0,'blaumeux SAY_BLAU_TAUNT1'),
+(-1533046,'I do hope they stay alive long enough for me to... introduce myself.',8897,1,0,'blaumeux SAY_BLAU_TAUNT2'),
+(-1533047,'The first kill goes to me! Anyone care to wager?',8898,1,0,'blaumeux SAY_BLAU_TAUNT3'),
+(-1533048,'Your life is mine!',8895,1,0,'blaumeux SAY_BLAU_SPECIAL'),
+(-1533049,'Who\'s next?',8894,1,0,'blaumeux SAY_BLAU_SLAY'),
+(-1533050,'Tou... che!',8893,1,0,'blaumeux SAY_BLAU_DEATH'),
+(-1533051,'Come out and fight, ye wee ninny!',8899,1,0,'korthazz SAY_KORT_AGGRO'),
+(-1533052,'To arms, ye roustabouts! We\'ve got company!',8903,1,0,'korthazz SAY_KORT_TAUNT1'),
+(-1533053,'I heard about enough of yer sniveling. Shut yer fly trap \'afore I shut it for ye!',8904,1,0,'korthazz SAY_KORT_TAUNT2'),
+(-1533054,'I\'m gonna enjoy killin\' these slack-jawed daffodils!',8905,1,0,'korthazz SAY_KORT_TAUNT3'),
+(-1533055,'I like my meat extra crispy!',8901,1,0,'korthazz SAY_KORT_SPECIAl'),
+(-1533056,'Next time, bring more friends!',8902,1,0,'korthazz SAY_KORT_SLAY'),
+(-1533057,'What a bloody waste this is!',8900,1,0,'korthazz SAY_KORT_DEATH'),
+(-1533058,'Flee, before it\'s too late!',8913,1,0,'zeliek SAY_ZELI_AGGRO'),
+(-1533059,'Invaders, cease this foolish venture at once! Turn away while you still can!',8917,1,0,'zeliek SAY_ZELI_TAUNT1'),
+(-1533060,'Perhaps they will come to their senses, and run away as fast as they can!',8918,1,0,'zeliek SAY_ZELI_TAUNT2'),
+(-1533061,'Do not continue! Turn back while there\'s still time!',8919,1,0,'zeliek SAY_ZELI_TAUNT3'),
+(-1533062,'I- I have no choice but to obey!',8916,1,0,'zeliek SAY_ZELI_SPECIAL'),
+(-1533063,'Forgive me!',8915,1,0,'zeliek SAY_ZELI_SLAY'),
+(-1533064,'It is... as it should be.',8914,1,0,'zeliek SAY_ZELI_DEATH'),
+(-1533065,'You seek death?',14571,1,0,'rivendare_naxx SAY_RIVE_AGGRO1'),
+(-1533066,'None shall pass!',14572,1,0,'rivendare_naxx SAY_RIVE_AGGRO2'),
+(-1533067,'Be still!',14573,1,0,'rivendare_naxx SAY_RIVE_AGGRO3'),
+(-1533068,'You will find no peace in death.',14574,1,0,'rivendare_naxx SAY_RIVE_SLAY1'),
+(-1533069,'The master\'s will is done.',14575,1,0,'rivendare_naxx SAY_RIVE_SLAY2'),
+(-1533070,'Bow to the might of the scourge!',14576,1,0,'rivendare_naxx SAY_RIVE_SPECIAL'),
+(-1533071,'Enough prattling. Let them come! We shall grind their bones to dust.',14577,1,0,'rivendare_naxx SAY_RIVE_TAUNT1'),
+(-1533072,'Conserve your anger! Harness your rage! You will all have outlets for your frustration soon enough.',14578,1,0,'rivendare_naxx SAY_RIVE_TAUNT2'),
+(-1533073,'Life is meaningless. It is in death that we are truly tested.',14579,1,0,'rivendare_naxx SAY_RIVE_TAUNT3'),
+(-1533074,'Death... will not stop me...',14580,1,0,'rivendare_naxx SAY_RIVE_DEATH');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533108 AND -1533075;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533075,'Glory to the master!',8845,1,0,'noth SAY_AGGRO1'),
+(-1533076,'Your life is forfeit!',8846,1,0,'noth SAY_AGGRO2'),
+(-1533077,'Die, trespasser!',8847,1,0,'noth SAY_AGGRO3'),
+(-1533078,'Rise, my soldiers! Rise and fight once more!',8851,1,0,'noth SAY_SUMMON'),
+(-1533079,'My task is done!',8849,1,0,'noth SAY_SLAY1'),
+(-1533080,'Breathe no more!',8850,1,0,'noth SAY_SLAY2'),
+(-1533081,'I will serve the master... in... death!',8848,1,0,'noth SAY_DEATH'),
+(-1533082,'takes in a deep breath...',0,2,0,'sapphiron EMOTE_BREATH'),
+(-1533083,'enrages!',0,2,0,'sapphiron EMOTE_ENRAGE'),
+(-1533084,'Our preparations continue as planned, master.',14467,1,0,'kelthuzad SAY_SAPP_DIALOG1'),
+(-1533085,'It is good that you serve me so faithfully. Soon, all will serve the Lich King and in the end, you shall be rewarded...so long as you do not falter.',8881,1,0,'kelthuzad SAY_SAPP_DIALOG2_LICH'),
+(-1533086,'I see no complications... Wait... What is this?',14468,1,0,'kelthuzad SAY_SAPP_DIALOG3'),
+(-1533087,'Your security measures have failed! See to this interruption immediately!',8882,1,0,'kelthuzad SAY_SAPP_DIALOG4_LICH'),
+(-1533088,'Yes, master!',14469,1,0,'kelthuzad SAY_SAPP_DIALOG5'),
+(-1533089,'No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...',14484,1,0,'kelthuzad SAY_CAT_DIED'),
+(-1533090,'Who dares violate the sanctity of my domain? Be warned, all who trespass here are doomed.',14463,1,0,'kelthuzad SAY_TAUNT1'),
+(-1533091,'Fools, you think yourselves triumphant? You have only taken one step closer to the abyss! ',14464,1,0,'kelthuzad SAY_TAUNT2'),
+(-1533092,'I grow tired of these games. Proceed, and I will banish your souls to oblivion!',14465,1,0,'kelthuzad SAY_TAUNT3'),
+(-1533093,'You have no idea what horrors lie ahead. You have seen nothing! The frozen heart of Naxxramas awaits you!',14466,1,0,'kelthuzad SAY_TAUNT4'),
+(-1533094,'Pray for mercy!',14475,1,0,'kelthuzad SAY_AGGRO1'),
+(-1533095,'Scream your dying breath!',14476,1,0,'kelthuzad SAY_AGGRO2'),
+(-1533096,'The end is upon you!',14477,1,0,'kelthuzad SAY_AGGRO3'),
+(-1533097,'The dark void awaits you!',14478,1,0,'kelthuzad SAY_SLAY1'),
+(-1533098,'<Kel\'Thuzad cackles maniacally!>',14479,1,0,'kelthuzad SAY_SLAY2'),
+(-1533099,'AAAAGHHH!... Do not rejoice... your victory is a hollow one... for I shall return with powers beyond your imagining!',14480,1,0,'kelthuzad SAY_DEATH'),
+(-1533100,'Your soul, is bound to me now!',14472,1,0,'kelthuzad SAY_CHAIN1'),
+(-1533101,'There will be no escape!',14473,1,0,'kelthuzad SAY_CHAIN2'),
+(-1533102,'I will freeze the blood in your veins!',14474,1,0,'kelthuzad SAY_FROST_BLAST'),
+(-1533103,'Master! I require aid! ',14470,1,0,'kelthuzad SAY_REQUEST_AID'),
+(-1533104,'Very well... warriors of the frozen wastes, rise up! I command you to fight, kill, and die for your master. Let none survive...',0,1,0,'kelthuzad SAY_ANSWER_REQUEST'),
+(-1533105,'Minions, servants, soldiers of the cold dark, obey the call of Kel\'Thuzad!',14471,1,0,'kelthuzad SAY_SUMMON_MINIONS'),
+(-1533106,'Your petty magics are no challenge to the might of the Scourge! ',14481,1,0,'kelthuzad SAY_SPECIAL1_MANA_DET'),
+(-1533107,'Enough! I grow tired of these distractions! ',14483,1,0,'kelthuzad SAY_SPECIAL3_MANA_DET'),
+(-1533108,'Fools, you have spread your powers too thin. Be free, my minions!',14482,1,0,'kelthuzad SAY_SPECIAL2_DISPELL');
+
+UPDATE `script_texts` SET `sound`=8902 WHERE `entry`=-1533055;
+UPDATE `script_texts` SET `sound`=8901 WHERE `entry`=-1533056; \ No newline at end of file
diff --git a/sql/updates/765_world_scripts.sql b/sql/updates/2.4.3_updates/765_world_scripts.sql
index 2cd56fa71a2..54f84c90157 100644
--- a/sql/updates/765_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/765_world_scripts.sql
@@ -1,7 +1,7 @@
-UPDATE `creature_template` SET `flags_extra` = 0 WHERE `entry` = 20129;
+UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry`=20129;
-- Insert English and French dialogs in database
-DELETE FROM `script_texts` WHERE entry BETWEEN -1000150 and -1000163;
+DELETE FROM `script_texts` WHERE entry BETWEEN -1000163 and -1000150;
INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc2`, `type`, `language`, `comment`) VALUES
(-1000150, 'Greetings, $N. I will guide you through the cavern. Please try and keep up.', 'Salutations, $N. Je vais vous guider à travers cette grotte. Veuillez me suivre.', 4, 0, 'WHISPER_CUSTODIAN_1'),
(-1000151, 'We do not know if the Caverns of Time have always been accessible to mortals. Truly, it is impossible to tell as the Timeless One is in perpetual motion, changing our timeways as he sees fit. What you see now may very well not exist tomorrow. You may wake up and have no memory of this place.', 'Nous ne savons pas si les Grottes du Temps ont toujours été accessibles aux mortels. Vraiment, c\'est impossible à dire étant donné que l\'Intemporel est en mouvement perpétuel, changeant nos spirales temporelles comme bon lui semble. Ce que vous voyez aujourd\'hui peut très bien ne plus exister demain. Vous pourriez vous réveiller sans aucun souvenir de cet endroit.', 4, 0, 'WHISPER_CUSTODIAN_2'),
@@ -16,5 +16,4 @@ INSERT INTO `script_texts` (`entry`, `content_default`, `content_loc2`, `type`,
(-1000160, 'This timeway is currently collapsing. What that may hold for the past, present and future is currently unknown...', 'Cette voie est en train de s\'effondrer. Ce qu\'elle peut avoir contenu dans le passé, le présent et le futur nous est actuellement inconnu...', 4, 0, 'WHISPER_CUSTODIAN_11'),
(-1000161, 'The timeways are currently ranked in order from least catastrophic to most catastrophic. Note that they are all classified as catastrophic, meaning that any single one of these timeways collapsing would mean that your world would end. We only classify them in such a way so that the heroes and adventurers that are sent here know which timeway best suits their abilities.', 'Les voies sont pour le moment classées de la moins catastrophique à la plus catastrophique, ce qui veut dire que la moindre de celles-ci qui s\'effondre signifierait la fin de votre monde. Nous les classons seulement de cette façon pour que les héros et aventuriers qui y sont envoyés sachent quelle voie est la plus adaptée à leurs compétences.', 4, 0, 'WHISPER_CUSTODIAN_12'),
(-1000162, 'All we know of this timeway is that it leads to Mount Hyjal. The Infinite Dragonflight have gone to great lengths to prevent our involvement. We know next to nothing, mortal. Soridormi is currently attempting to break through the timeway\'s defenses but has thus far been unsuccessful. You might be our only hope of breaking through and resolving the conflict.', 'Tout ce que nous savons sur cette voie temporelle est qu\'elle mène au Mont Hyjal. Le Vol du Dragon Infini s\'est donné beaucoup de peine pour empêcher notre participation. Soridormi est actuellement en train de tenter de briser les défenses de cette voie, mais ses efforts ont été vain jusqu\'ici. Vous pourriez être notre seul espoir de les briser et de résoudre le conflit.', 4, 0, 'WHISPER_CUSTODIAN_13'),
-(-1000163, 'Our time is at an end $N. I would wish you luck, if such a thing existed.', 'Notre entretien touche à sa fin, $N. Je vous souhaite bonne chance, si tant est qu\'une telle chose a jamais existé.', 4, 0, 'WHISPER_CUSTODIAN_14');
-
+(-1000163, 'Our time is at an end $N. I would wish you luck, if such a thing existed.', 'Notre entretien touche à sa fin, $N. Je vous souhaite bonne chance, si tant est qu\'une telle chose a jamais existé.', 4, 0, 'WHISPER_CUSTODIAN_14'); \ No newline at end of file
diff --git a/sql/updates/773_world_scripts.sql b/sql/updates/2.4.3_updates/773_world_scripts.sql
index 962905c0f65..adfb24e945c 100644
--- a/sql/updates/773_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/773_world_scripts.sql
@@ -1,10 +1,9 @@
-Update quest_template set SpecialFlags=2 where entry=4770;
-UPDATE `creature_template` SET `ScriptName` = 'npc_swiftmountain' WHERE `entry` = 10427;
+UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `entry`=4770;
+UPDATE `creature_template` SET `ScriptName`='npc_swiftmountain' WHERE `entry`=10427;
DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000149 AND -1000147;
-INSERT INTO script_texts
+INSERT INTO `script_texts`
(`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `comment`)
VALUES
(-1000147, 'Lets go $N. I am ready to start to Whitereach Post.', NULL, NULL, 'Gehen wir $N.Ich bin bereit,mich zum Weissgipfelposten aufzumachen.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL),
(-1000148, 'This seems to me trusted. If we move to the east, we are probably... Aah! Wyvern attack !', NULL, NULL, 'Das kommt mir vertraut vor.Wenn wir nach Osten ziehen,können wir wahrscheinlich...Aah!Flügeldrachen im Angriff!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL),
- (-1000149, 'Thanks so much... From here I find the way back to the Whitereach Post. Speak with Motega Firemane, maybe you can persuade him to send me home.', NULL, NULL, 'Tausend Dank...Von hier aus finde ich den Rückweg zum Weissgipfelposten.Sprecht unbedingt mit Motega Feuermähne,vielleicht könnt ihr ihn überreden,mich nach Hause zu schicken.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL);
-
+ (-1000149, 'Thanks so much... From here I find the way back to the Whitereach Post. Speak with Motega Firemane, maybe you can persuade him to send me home.', NULL, NULL, 'Tausend Dank...Von hier aus finde ich den Rückweg zum Weissgipfelposten.Sprecht unbedingt mit Motega Feuermähne,vielleicht könnt ihr ihn überreden,mich nach Hause zu schicken.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL); \ No newline at end of file
diff --git a/sql/updates/780_characters.sql b/sql/updates/2.4.3_updates/780_characters.sql
index 40c4d3cdce4..cbcb193c276 100644
--- a/sql/updates/780_characters.sql
+++ b/sql/updates/2.4.3_updates/780_characters.sql
@@ -1,3 +1,2 @@
ALTER TABLE `gm_tickets` CHANGE `guid` `guid` int(10) NOT NULL AUTO_INCREMENT;
-ALTER TABLE `gm_tickets` CHANGE `closed` `closed` int(10) NOT NULL;
-
+ALTER TABLE `gm_tickets` CHANGE `closed` `closed` int(10) NOT NULL; \ No newline at end of file
diff --git a/sql/updates/783_world.sql b/sql/updates/2.4.3_updates/783_world.sql
index f78f35e2951..7076956dd24 100644
--- a/sql/updates/783_world.sql
+++ b/sql/updates/2.4.3_updates/783_world.sql
@@ -1,5 +1,4 @@
-DELETE FROM trinity_string where entry IN (10056, 10057);
-INSERT INTO trinity_string (entry, content_default) VALUES
+DELETE FROM `trinity_string` WHERE `entry` IN (10056, 10057);
+INSERT INTO `trinity_string` (entry, content_default) VALUES
(10056, 'You must be a member of the Horde to enter the Hall of Legends.'),
-(10057, 'You must be a member of the Alliance to enter the Champion\'s Hall.');
-
+(10057, 'You must be a member of the Alliance to enter the Champion\'s Hall.'); \ No newline at end of file
diff --git a/sql/updates/785_world.sql b/sql/updates/2.4.3_updates/785_world.sql
index b4c11653a25..64ffa36957c 100644
--- a/sql/updates/785_world.sql
+++ b/sql/updates/2.4.3_updates/785_world.sql
@@ -1,5 +1,4 @@
-delete from command where name in ('gobject addtemp', 'npc addtemp');
-insert into command (name, security, help) values
+DELETE FROM `command` WHERE `name` IN ('gobject addtemp', 'npc addtemp');
+INSERT INTO `command` (name, security, help) VALUES
('gobject addtemp','2','Adds a temporary gameobject that is not saved to DB.'),
('npc addtemp','2','Adds temporary NPC, not saved to database.');
-
diff --git a/sql/updates/2.4.3_updates/789_world.sql b/sql/updates/2.4.3_updates/789_world.sql
new file mode 100644
index 00000000000..475e16538d1
--- /dev/null
+++ b/sql/updates/2.4.3_updates/789_world.sql
@@ -0,0 +1 @@
+ALTER TABLE `eventai_texts` DROP COLUMN `emote`; \ No newline at end of file
diff --git a/sql/updates/78_world.sql b/sql/updates/2.4.3_updates/78_world.sql
index 4a9cbd3846d..faa02e0e2a6 100644
--- a/sql/updates/78_world.sql
+++ b/sql/updates/2.4.3_updates/78_world.sql
@@ -21,4 +21,3 @@ INSERT INTO spell_proc_event (entry, SchoolMask, Category, SkillID, SpellFamilyN
(34598,0,0,0,0,0x0000000000000000,0x00020000,0,45),
(36488,0,0,0,0,0x0000000000000000,0x08000000,0,0),
(34584,0,0,0,0,0x0000000000000000,0x00004000,0,30);
-
diff --git a/sql/updates/79_characters.sql b/sql/updates/2.4.3_updates/79_characters.sql
index c7b76549e74..15b99f2f4b0 100644
--- a/sql/updates/79_characters.sql
+++ b/sql/updates/2.4.3_updates/79_characters.sql
@@ -1,3 +1,2 @@
ALTER TABLE characters
- CHANGE COLUMN gmstate extra_flags int(11) unsigned NOT NULL default '0';
-
+ CHANGE COLUMN gmstate extra_flags int(11) unsigned NOT NULL default '0'; \ No newline at end of file
diff --git a/sql/updates/79_world.sql b/sql/updates/2.4.3_updates/79_world.sql
index 1b5be949cf2..7b08a825311 100644
--- a/sql/updates/79_world.sql
+++ b/sql/updates/2.4.3_updates/79_world.sql
@@ -1,4 +1,3 @@
DELETE FROM spell_proc_event where entry = 42083;
INSERT INTO spell_proc_event (entry, SchoolMask, Category, SkillID, SpellFamilyName, SpellFamilyMask, procFlags, ppmRate, cooldown) VALUES
-(42083,0,0,0,0,0x0000000000000000,0x00401000,0,45);
-
+(42083,0,0,0,0,0x0000000000000000,0x00401000,0,45); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/807_world_scripts.sql b/sql/updates/2.4.3_updates/807_world_scripts.sql
new file mode 100644
index 00000000000..ee2cbee4fee
--- /dev/null
+++ b/sql/updates/2.4.3_updates/807_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_isla_starmane' WHERE `entry`=18760; \ No newline at end of file
diff --git a/sql/updates/817_world_scripts.sql b/sql/updates/2.4.3_updates/817_world_scripts.sql
index 071fb2989ff..8cf97f7145a 100644
--- a/sql/updates/817_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/817_world_scripts.sql
@@ -1,5 +1,7 @@
+UPDATE `creature_template` SET `ScriptName`='npc_ame' WHERE `entry`=9623;
+
DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000205 AND -1000200;
-INSERT INTO script_texts
+INSERT INTO `script_texts`
(`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `emote`, `comment`)
VALUES
(-1000200, 'A-Me good.Good A-me.Follow...A-ME follow.Home.A-ME go home.', NULL, NULL, 'A-ME gut.Gut A-Me.Folgen...Heim.A-ME geht heim.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
@@ -8,7 +10,4 @@ VALUES
(-1000203, 'A-Me home.A-ME go home!Tar Lord dont disturb A-ME.', NULL, NULL, 'A-ME daheim.A-ME geht heim!Teerfürst A-ME nicht aufhalten.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
(-1000204, 'Tar Lord A-ME no hurt.A-ME good.', NULL, NULL, 'Teerfürst A-ME nicht wehtun.A-ME gut.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
(-1000205, 'A-ME at home!A-ME good!Good A-ME.At home.Home.Home', NULL, NULL, 'A-ME daheim!A-ME gut!Gute A-ME.Daheim.Daheim.Daheim', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL);
-UPDATE `quest_template` SET `QuestFlags` = 2, `SpecialFlags` = 2 WHERE `entry` = 4245;
-
-UPDATE `creature_template` SET `ScriptName` = 'npc_ame' WHERE `entry` = 9623;
-
+UPDATE `quest_template` SET `QuestFlags` = 2, `SpecialFlags` = 2 WHERE `entry` = 4245; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/822_world_scripts.sql b/sql/updates/2.4.3_updates/822_world_scripts.sql
new file mode 100644
index 00000000000..942971f8d71
--- /dev/null
+++ b/sql/updates/2.4.3_updates/822_world_scripts.sql
@@ -0,0 +1,3 @@
+UPDATE `creature_template` SET `ScriptName`='npc_kayra_longmane' WHERE `entry`=17969;
+DELETE FROM `creature_template_addon` WHERE `entry`=17969;
+UPDATE `quest_template` SET specialflags=2 WHERE `entry`=9752; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/826_world_scripts.sql b/sql/updates/2.4.3_updates/826_world_scripts.sql
new file mode 100644
index 00000000000..487971d092c
--- /dev/null
+++ b/sql/updates/2.4.3_updates/826_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_ruul_snowhoof' WHERE `entry`=12818; \ No newline at end of file
diff --git a/sql/updates/82_world_scripts.sql b/sql/updates/2.4.3_updates/82_world_scripts.sql
index 276a3385ed6..acdfdd06a6f 100644
--- a/sql/updates/82_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/82_world_scripts.sql
@@ -1,2 +1 @@
-UPDATE `creature_template` SET `ScriptName` = 'npc_twiggy_flathead' WHERE `entry` =6248;
-
+UPDATE `creature_template` SET `ScriptName` = 'npc_twiggy_flathead' WHERE `entry` =6248; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/833_world_scripts.sql b/sql/updates/2.4.3_updates/833_world_scripts.sql
new file mode 100644
index 00000000000..12ed9ecced5
--- /dev/null
+++ b/sql/updates/2.4.3_updates/833_world_scripts.sql
@@ -0,0 +1,2 @@
+UPDATE `creature_template` SET `ScriptName`='npc_dirty_larry', `unit_flags`=0, `flags_extra`=0 WHERE `entry`=19720;
+UPDATE `creature_template` SET `unit_flags`=0, `flags_extra`=0 WHERE `entry` IN (19726, 19725); \ No newline at end of file
diff --git a/sql/updates/834_world_scripts.sql b/sql/updates/2.4.3_updates/834_world_scripts.sql
index 0b34f8be52f..14b3d74340e 100644
--- a/sql/updates/834_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/834_world_scripts.sql
@@ -1,2 +1 @@
-UPDATE `creature_template` SET `ScriptName`='npc_ishanah' WHERE `entry`=18538;
-
+UPDATE `creature_template` SET `ScriptName`='npc_ishanah' WHERE `entry`=18538; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/837_world_scripts.sql b/sql/updates/2.4.3_updates/837_world_scripts.sql
new file mode 100644
index 00000000000..5fc2abfc4df
--- /dev/null
+++ b/sql/updates/2.4.3_updates/837_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_khadgar' WHERE `entry`=18166; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/838_world_scripts.sql b/sql/updates/2.4.3_updates/838_world_scripts.sql
new file mode 100644
index 00000000000..6b93a03afa0
--- /dev/null
+++ b/sql/updates/2.4.3_updates/838_world_scripts.sql
@@ -0,0 +1,4 @@
+UPDATE `creature_template` SET `ScriptName`='npc_kyle_frenzied' WHERE `entry`='23616';
+DELETE FROM `spell_script_target` WHERE `entry`=42222;
+INSERT INTO `spell_script_target` VALUES
+('42222','1','23616'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/839_world_scripts.sql b/sql/updates/2.4.3_updates/839_world_scripts.sql
new file mode 100644
index 00000000000..7b4ef66ba92
--- /dev/null
+++ b/sql/updates/2.4.3_updates/839_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_wizzlecrank_shredder' WHERE `entry`=3439; \ No newline at end of file
diff --git a/sql/updates/83_realmd.sql b/sql/updates/2.4.3_updates/83_realmd.sql
index 5c47beaabc8..e3c74350735 100644
--- a/sql/updates/83_realmd.sql
+++ b/sql/updates/2.4.3_updates/83_realmd.sql
@@ -1,3 +1,2 @@
ALTER TABLE account
- CHANGE COLUMN tbc expansion tinyint(3) unsigned NOT NULL default '0';
-
+ CHANGE COLUMN tbc expansion tinyint(3) unsigned NOT NULL default '0'; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/840_world_scripts.sql b/sql/updates/2.4.3_updates/840_world_scripts.sql
new file mode 100644
index 00000000000..cfa3d492b9a
--- /dev/null
+++ b/sql/updates/2.4.3_updates/840_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `spell1`=0, `flags_extra`=0, `ScriptName`='npc_volcano' WHERE `entry`=23085; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/841_world_scripts.sql b/sql/updates/2.4.3_updates/841_world_scripts.sql
new file mode 100644
index 00000000000..86d73ba2019
--- /dev/null
+++ b/sql/updates/2.4.3_updates/841_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_greengill_slave' WHERE `entry`=25084; \ No newline at end of file
diff --git a/sql/updates/842_world.sql b/sql/updates/2.4.3_updates/842_world.sql
index 9f40ed71751..cf017877b5e 100644
--- a/sql/updates/842_world.sql
+++ b/sql/updates/2.4.3_updates/842_world.sql
@@ -2,5 +2,4 @@ ALTER TABLE `areatrigger_teleport`
ADD `heroic_required_quest_done` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0 AFTER `heroic_key2`,
ADD `heroic_required_failed_quest_text` TEXT NULL DEFAULT NULL AFTER `heroic_required_quest_done`;
-UPDATE `areatrigger_teleport` SET `heroic_required_quest_done` = 11492, `heroic_required_failed_quest_text` = 'Heroic Difficulty requires completion of the "Hard to Kill" quest.' WHERE `id` = 4887;
-
+UPDATE `areatrigger_teleport` SET `heroic_required_quest_done`=11492, `heroic_required_failed_quest_text`='Heroic Difficulty requires completion of the "Hard to Kill" quest.' WHERE `id`=4887; \ No newline at end of file
diff --git a/sql/updates/84_world.sql b/sql/updates/2.4.3_updates/84_world.sql
index 2dd20fd44bf..100185c0acd 100644
--- a/sql/updates/84_world.sql
+++ b/sql/updates/2.4.3_updates/84_world.sql
@@ -1,4 +1,3 @@
DELETE FROM command WHERE name = 'reload all_locales';
INSERT INTO `command` VALUES
('reload all_locales',3,'Syntax: .reload all_locales\r\n\r\nReload all `locales_*` tables with reload support added and that can be _safe_ reloaded.');
-
diff --git a/sql/updates/2.4.3_updates/850_world_scripts.sql b/sql/updates/2.4.3_updates/850_world_scripts.sql
new file mode 100644
index 00000000000..3027947cf14
--- /dev/null
+++ b/sql/updates/2.4.3_updates/850_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_bessy' WHERE `entry`=20415; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/852_world_scripts.sql b/sql/updates/2.4.3_updates/852_world_scripts.sql
new file mode 100644
index 00000000000..001b43c8820
--- /dev/null
+++ b/sql/updates/2.4.3_updates/852_world_scripts.sql
@@ -0,0 +1,2 @@
+UPDATE `creature_template` SET `ScriptName`='mob_nestlewood_owlkin' WHERE `entry`=16518;
+UPDATE `item_template` SET `ScriptName`='item_inoculating_crystal' WHERE `entry`=22962; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/857_world_scripts.sql b/sql/updates/2.4.3_updates/857_world_scripts.sql
new file mode 100644
index 00000000000..acd712aecb9
--- /dev/null
+++ b/sql/updates/2.4.3_updates/857_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_kaya_flathoof' WHERE `entry`=11856; \ No newline at end of file
diff --git a/sql/updates/863_world_scripts.sql b/sql/updates/2.4.3_updates/863_world_scripts.sql
index 1c760bd5bb8..a7a214b8956 100644
--- a/sql/updates/863_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/863_world_scripts.sql
@@ -1,5 +1,7 @@
+UPDATE `creature_template` SET `ScriptName`='npc_OOX17' WHERE `entry`=7784;
+
DELETE FROM `script_texts` WHERE `entry` BETWEEN -1060005 AND -1060000;
-INSERT INTO script_texts
+INSERT INTO `script_texts`
(`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`, `sound`, `type`, `language`, `emote`, `comment`)
VALUES
(-1060000, 'Emergency power activated! Initializing ambulatory motor! CLUCK!', NULL, NULL, 'Notfallenergie aktiviert! Ambulatorenantrieb wird gestartet! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
@@ -7,7 +9,4 @@ VALUES
(-1060002, 'Threat analyzed! Activating combat plan beta! CLUCK!', NULL, NULL, 'Bedrohung analysiert! Gefechtsplan Beta wird aktiviert! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
(-1060003, 'CLUCK! Sensors detect spatial anomaly -- danger imminent! CLUCK', NULL, NULL, 'GLUCK! Sensoren haben räumliche Anomalie entdeckt - Gefahr im Verzug! GLUCK!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
(-1060004, 'No one challenges the wastevander nomads -- not even robotic chickens! ATTACK!', NULL, NULL, 'Niemand fordert die Wüsenläufernomaden heraus - auch keine Robothühner! ANGRIFF!', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL),
- (-1060005, 'Cloaking systems online! CLUCK! Engaging cloak for transport to Booty Bay!', NULL, NULL, 'Tarnsysteme online! GLUCK! Tarnung für Transport nach Beutebucht wird aktiviert.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL);
-
-UPDATE `creature_template` SET `ScriptName` = 'npc_OOX17' WHERE `entry` = 7784;
-
+ (-1060005, 'Cloaking systems online! CLUCK! Engaging cloak for transport to Booty Bay!', NULL, NULL, 'Tarnsysteme online! GLUCK! Tarnung für Transport nach Beutebucht wird aktiviert.', NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL); \ No newline at end of file
diff --git a/sql/updates/86_world_scripts.sql b/sql/updates/2.4.3_updates/86_world_scripts.sql
index d3c17926ac7..8f3c6ac6265 100644
--- a/sql/updates/86_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/86_world_scripts.sql
@@ -3,5 +3,4 @@ update `creature_template` set `ScriptName`='mob_ember_of_alar' where `entry`='1
update `creature_template` set `ScriptName`='mob_flame_patch_alar' where `entry`='20602';
update gameobject_template set scriptname = "go_manticron_cube" where entry = 181713;
-update creature_template set scriptname = "mob_abyssal" where entry = 17454;
-
+update creature_template set scriptname = "mob_abyssal" where entry = 17454; \ No newline at end of file
diff --git a/sql/updates/871_world.sql b/sql/updates/2.4.3_updates/871_world.sql
index 0f4fa4245e7..114cd3101b7 100644
--- a/sql/updates/871_world.sql
+++ b/sql/updates/2.4.3_updates/871_world.sql
@@ -1,6 +1,6 @@
DELETE FROM `trinity_string` WHERE `entry` BETWEEN '288' AND '295';
DELETE FROM `trinity_string` WHERE `entry` BETWEEN '2000' AND '2029';
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
(2000, '|cff00ff00New ticket from|r|cffff00ff %s.|r |cff00ff00Ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
(2001, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00edited his/her ticket:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
(2002, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00abandoned ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', ''),
@@ -28,5 +28,4 @@ INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content
(2024, '\n|cff00ccff%s|r |cff00ff00Added comment|r: \"%s\"|r ', '', '', '', '', '', '', '', '');
DELETE FROM `command` WHERE (`name` LIKE '%ticket closedlist%');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket closedlist','1','Displays a list of closed GM tickets.');
-
+INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket closedlist','1','Displays a list of closed GM tickets.'); \ No newline at end of file
diff --git a/sql/updates/884_world.sql b/sql/updates/2.4.3_updates/884_world.sql
index cbcf89192bb..7d4588a711e 100644
--- a/sql/updates/884_world.sql
+++ b/sql/updates/2.4.3_updates/884_world.sql
@@ -1,5 +1,4 @@
-delete from command where name in ('gobject tempadd','npc tempadd');
-insert into command (name, security, help) values
+DELETE FROM `command` WHERE `name` IN ('gobject addtemp','npc addtemp');
+INSERT INTO `command` (name, security, help) VALUES
('gobject addtemp','2','Adds a temporary gameobject that is not saved to DB.'),
-('npc addtemp','2','Adds temporary NPC, not saved to database.');
-
+('npc addtemp','2','Adds temporary NPC, not saved to database.'); \ No newline at end of file
diff --git a/sql/updates/905_world_scripts.sql b/sql/updates/2.4.3_updates/905_world_scripts.sql
index aa52204e643..3e59e1f0e52 100644
--- a/sql/updates/905_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/905_world_scripts.sql
@@ -7,5 +7,4 @@ INSERT INTO `areatrigger_scripts` VALUES (1526,'at_ring_of_law');
DELETE FROM `script_texts` WHERE `entry`=-1230000;
INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
-(-1230000,'Ah, hits the spot!',0,0,0,'rocknot SAY_GOT_BEER');
-
+(-1230000,'Ah, hits the spot!',0,0,0,'rocknot SAY_GOT_BEER'); \ No newline at end of file
diff --git a/sql/updates/90_world.sql b/sql/updates/2.4.3_updates/90_world.sql
index 529de4f712e..52ca028b6ac 100644
--- a/sql/updates/90_world.sql
+++ b/sql/updates/2.4.3_updates/90_world.sql
@@ -5,4 +5,3 @@ CREATE TABLE `spell_disabled` (
`comment` varchar(64) NOT NULL default '',
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Disabled Spell System';
-
diff --git a/sql/updates/917_world.sql b/sql/updates/2.4.3_updates/917_world.sql
index 556276fa012..7c989ce7ca4 100644
--- a/sql/updates/917_world.sql
+++ b/sql/updates/2.4.3_updates/917_world.sql
@@ -3,7 +3,6 @@ CREATE TABLE `version` (
`db_version` varchar(120) default NULL COMMENT 'Version of world DB.',
`script_version` varchar(120) default NULL COMMENT 'Version of scripts DB.'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Version Notes';
-INSERT INTO version (core_version, db_version, script_version) VALUES ("",(SELECT version FROM db_version),(SELECT version FROM script_db_version));
-DROP TABLE IF EXISTS db_version;
-DROP TABLE IF EXISTS script_db_version;
-
+INSERT INTO `version` (core_version, db_version, script_version) VALUES ("",(SELECT version FROM db_version),(SELECT version FROM script_db_version));
+DROP TABLE IF EXISTS `db_version`;
+DROP TABLE IF EXISTS `script_db_version`; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/919_world.sql b/sql/updates/2.4.3_updates/919_world.sql
new file mode 100644
index 00000000000..4d4a6308576
--- /dev/null
+++ b/sql/updates/2.4.3_updates/919_world.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `version`
+ ADD `core_revision` BIGINT UNSIGNED AFTER `core_version`; \ No newline at end of file
diff --git a/sql/updates/927_characters.sql b/sql/updates/2.4.3_updates/927_characters.sql
index c3a0df39b8d..6cbcf21e7bd 100644
--- a/sql/updates/927_characters.sql
+++ b/sql/updates/2.4.3_updates/927_characters.sql
@@ -1,2 +1 @@
-ALTER TABLE `gm_tickets` CHANGE `closed` `closed` int(10) NOT NULL default '0';
-
+ALTER TABLE `gm_tickets` CHANGE `closed` `closed` int(10) NOT NULL default '0'; \ No newline at end of file
diff --git a/sql/updates/930_characters.sql b/sql/updates/2.4.3_updates/930_characters.sql
index 303bda03235..cc215786bb1 100644
--- a/sql/updates/930_characters.sql
+++ b/sql/updates/2.4.3_updates/930_characters.sql
@@ -50,8 +50,7 @@ CREATE TABLE IF NOT EXISTS `auctionhousebot` (
--
-- Data for table `auctionhousebot`
--
-insert into `auctionhousebot` (`auctionhouse`,`name`,`minitems`,`maxitems`,`mintime`,`maxtime`,`percentwhitetradegoods`,`percentgreentradegoods`,`percentbluetradegoods`,`percentpurpletradegoods`,`percentwhiteitems`,`percentgreenitems`,`percentblueitems`,`percentpurpleitems`,`minpricewhite`,`maxpricewhite`,`minpricegreen`,`maxpricegreen`,`minpriceblue`,`maxpriceblue`,`minpricepurple`,`maxpricepurple`,`minbidpricewhite`,`maxbidpricewhite`,`minbidpricegreen`,`maxbidpricegreen`,`minbidpriceblue`,`maxbidpriceblue`,`minbidpricepurple`,`maxbidpricepurple`,`maxstackwhite`,`maxstackgreen`,`maxstackblue`,`maxstackpurple`,`buyerpricegrey`,`buyerpricewhite`,`buyerpricegreen`,`buyerpriceblue`,`buyerpricepurple`,`buyerbiddinginterval`,`buyerbidsperinterval`) values
+INSERT IGNORE INTO `auctionhousebot` (`auctionhouse`,`name`,`minitems`,`maxitems`,`mintime`,`maxtime`,`percentwhitetradegoods`,`percentgreentradegoods`,`percentbluetradegoods`,`percentpurpletradegoods`,`percentwhiteitems`,`percentgreenitems`,`percentblueitems`,`percentpurpleitems`,`minpricewhite`,`maxpricewhite`,`minpricegreen`,`maxpricegreen`,`minpriceblue`,`maxpriceblue`,`minpricepurple`,`maxpricepurple`,`minbidpricewhite`,`maxbidpricewhite`,`minbidpricegreen`,`maxbidpricegreen`,`minbidpriceblue`,`maxbidpriceblue`,`minbidpricepurple`,`maxbidpricepurple`,`maxstackwhite`,`maxstackgreen`,`maxstackblue`,`maxstackpurple`,`buyerpricegrey`,`buyerpricewhite`,`buyerpricegreen`,`buyerpriceblue`,`buyerpricepurple`,`buyerbiddinginterval`,`buyerbidsperinterval`) values
(2,'Alliance',0,0,8,24,27,12,10,1,10,30,8,2,150,250,800,1400,1250,1750,2250,4550,70,100,80,100,75,100,80,100,0,3,2,1,1,1,5,12,15,1,1),
(6,'Horde',0,0,8,24,27,12,10,1,10,30,8,2,150,250,800,1400,1250,1750,2250,4550,70,100,80,100,75,100,80,100,0,3,2,1,1,1,5,12,15,1,1),
-(7,'Neutral',0,0,8,24,27,12,10,1,10,30,8,2,150,250,800,1400,1250,1750,2250,4550,70,100,80,100,75,100,80,100,0,3,2,1,1,1,5,12,15,1,1);
-
+(7,'Neutral',0,0,8,24,27,12,10,1,10,30,8,2,150,250,800,1400,1250,1750,2250,4550,70,100,80,100,75,100,80,100,0,3,2,1,1,1,5,12,15,1,1); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/933_world_scripts.sql b/sql/updates/2.4.3_updates/933_world_scripts.sql
new file mode 100644
index 00000000000..1a3e9d96f56
--- /dev/null
+++ b/sql/updates/2.4.3_updates/933_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_snake_trap_serpents' WHERE `entry` IN (19921, 19833); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/935_world_scripts.sql b/sql/updates/2.4.3_updates/935_world_scripts.sql
new file mode 100644
index 00000000000..934d3a7de23
--- /dev/null
+++ b/sql/updates/2.4.3_updates/935_world_scripts.sql
@@ -0,0 +1,6 @@
+DELETE FROM `creature` WHERE `id`='17653';
+
+UPDATE `gameobject_template` SET `flags`='4' WHERE `entry` IN ('181766','181823');
+UPDATE `gameobject` SET `SpawnMask`='3',`state`='1' WHERE `id` IN ('181766','181823');
+
+UPDATE `instance_template` SET `script`='instance_blood_furnace' WHERE `map`=542; \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/940_world_scripts.sql b/sql/updates/2.4.3_updates/940_world_scripts.sql
new file mode 100644
index 00000000000..c7f378c6360
--- /dev/null
+++ b/sql/updates/2.4.3_updates/940_world_scripts.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `custom_texts` CHANGE COLUMN `emote` `emote` smallint(5) unsigned NOT NULL DEFAULT '0';
+ALTER TABLE `script_texts` CHANGE COLUMN `emote` `emote` smallint(5) unsigned NOT NULL DEFAULT '0'; \ No newline at end of file
diff --git a/sql/updates/945_world_scripts.sql b/sql/updates/2.4.3_updates/945_world_scripts.sql
index 0831d5c0e6f..a96e7cc1a68 100644
--- a/sql/updates/945_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/945_world_scripts.sql
@@ -1,8 +1,8 @@
-update creature_template set scriptname='' where entry=22083;
-update creature_template set scriptname='npc_overlord_morghor' where entry=23139;
-update creature_template set scriptname='' where entry=23141;
-DELETE FROM script_texts WHERE entry BETWEEN -1000221 and -1000206;
-INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=22083;
+UPDATE `creature_template` SET `ScriptName`='npc_overlord_morghor' WHERE `entry`=23139;
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=23141;
+DELETE FROM `script_texts` WHERE entry BETWEEN -1000221 and -1000206;
+INSERT INTO `script_texts` (entry, content_default, type, emote, comment) VALUES
(-1000206, 'Come, $N. Lord Stormrage awaits.', 0, 1, 'OVERLORD_SAY_1'),
(-1000207, 'Lord Illidan will be here shortly.', 0, 1, 'OVERLORD_SAY_2'),
(-1000208, 'Lord Illidan, this is the Dragonmaw that I, and others, have told you about. He will lead us to victory!', 0, 1, 'OVERLORD_SAY_3'),
@@ -20,12 +20,12 @@ INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
(-1000220, 'I expect to see this insect\'s carcass in pieces in my lair within the hour. Fail and you will suffer a fate so much worse than death.', 0, 1, 'LORD_ILLIDAN_SAY_7'),
(-1000221, 'You will not harm the boy, Mor\'ghor! Quickly, $N, climb on my back!', 0, 22, 'YARZILL_THE_MERC_SAY');
-DELETE FROM script_texts WHERE entry='-1000222';
-INSERT INTO script_texts (entry, content_default, type, language, emote, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry`='-1000222';
+INSERT INTO `script_texts` (entry, content_default, type, language, emote, comment) VALUES
(-1000222, 'Thank you, mortal.', 0, 11, 1, 'SAY_JUST_EATEN');
-DELETE FROM script_texts WHERE entry BETWEEN -1000234 and -1000223;
-INSERT INTO script_texts (entry, content_default, emote, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000234 and -1000223;
+INSERT INTO `script_texts` (entry, content_default, emote, comment) VALUES
(-1000223, 'I sense the tortured spirits, $N. They are this way, come quickly!', 1, 'SAY_START'),
(-1000224, 'Watch out!', 0, 'SAY_AGGRO1'),
(-1000225, 'Naga attackers! Defend yourself!', 0, 'SAY_AGGRO2'),
@@ -37,6 +37,4 @@ INSERT INTO script_texts (entry, content_default, emote, comment) VALUES
(-1000231, 'Lady Vashj must answer for these atrocities. She must be brought to justice!', 0, 'SAY_PROGRESS4'),
(-1000232, 'The tumultuous nature of the great waterways of Azeroth and Draenor are a direct result of tormented water spirits.', 0, 'SAY_PROGRESS5'),
(-1000233, 'It shouldn\'t be much further, $N. The exit is just up ahead.', 0, 'SAY_PROGRESS6'),
-(-1000234, 'Thank you, $N. Please return to my brethren at the Altar of Damnation, near the Hand of Gul\'dan, and tell them that Wilda is safe. May the Earthmother watch over you...', 0, 'SAY_END');
-
-
+(-1000234, 'Thank you, $N. Please return to my brethren at the Altar of Damnation, near the Hand of Gul\'dan, and tell them that Wilda is safe. May the Earthmother watch over you...', 0, 'SAY_END'); \ No newline at end of file
diff --git a/sql/updates/947_world_scripts.sql b/sql/updates/2.4.3_updates/947_world_scripts.sql
index 9e81f39a8c3..a62e3a24455 100644
--- a/sql/updates/947_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/947_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000244 and -1000235;
-INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000244 and -1000235;
+INSERT INTO `script_texts` (entry, content_default, type, emote, comment) VALUES
(-1000235, 'Ok, $N. Follow me to the cave where I\'ll attempt to harness the power of the rune stone into these goggles.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_1'),
(-1000236, 'I discovered this cave on our first day here. I believe the energy in the stone can be used to our advantage.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_2'),
(-1000237, 'I\'ll begin drawing energy from the stone. Your job, $N, is to defend me. This place is cursed... trust me.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_3'),
@@ -9,5 +9,4 @@ INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
(-1000241, 'I\'ve done it! I have harnessed the power of the stone into the goggles! Let\'s get out of here!', 0, 1, 'phizzlethorpe - SAY_PROGRESS_6'),
(-1000242, 'Phew! Glad to be back from that creepy cave.', 0, 1, 'phizzlethorpe - SAY_PROGRESS_7'),
(-1000243, 'hands one glowing goggles over to Doctor Draxlegauge.', 2, 0, 'phizzlethorpe - EMOTE_PROGRESS_8'),
-(-1000244, 'Doctor Draxlegauge will give you further instructions, $N. Many thanks for your help!', 0, 1, 'phizzlethorpe - SAY_PROGRESS_9');
-
+(-1000244, 'Doctor Draxlegauge will give you further instructions, $N. Many thanks for your help!', 0, 1, 'phizzlethorpe - SAY_PROGRESS_9'); \ No newline at end of file
diff --git a/sql/updates/948_world_scripts.sql b/sql/updates/2.4.3_updates/948_world_scripts.sql
index 9270e5d994a..4828323f7e6 100644
--- a/sql/updates/948_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/948_world_scripts.sql
@@ -1,6 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000247 and -1000245;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000247 and -1000245;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000245, 'You, there! Hand over that moonstone and nobody gets hurt!', 1, 'SAY_RIZZLE_START'),
(-1000246, 'Just chill!', 4, 'SAY_RIZZLE_GRENADE'),
-(-1000247, 'All right, you win! I surrender! Just don\'t hurt me!', 1, 'SAY_RIZZLE_FINAL');
-
+(-1000247, 'All right, you win! I surrender! Just don\'t hurt me!', 1, 'SAY_RIZZLE_FINAL'); \ No newline at end of file
diff --git a/sql/updates/950_world_scripts.sql b/sql/updates/2.4.3_updates/950_world_scripts.sql
index c1058f4b9ee..df7fda62a4d 100644
--- a/sql/updates/950_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/950_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000266 and -1000248;
-INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000266 and -1000248;
+INSERT INTO `script_texts` (entry, content_default, type, emote, comment) VALUES
(-1000248, 'The last thing I remember is the ship falling and us getting into the pods. I\'ll go see how I can help. Thank you!', 0, 0, 'draenei survivor - HEAL1'),
(-1000249, '$C, Where am I? Who are you? Oh no! What happened to the ship?.', 0, 0, 'draenei survivor - HEAL2'),
(-1000250, '$C You saved me! I owe you a debt that I can never repay. I\'ll go see if I can help the others.', 0, 0, 'draenei survivor - HEAL3'),
@@ -20,5 +20,4 @@ INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
(-1000263, 'Relax? Do you know what Kael\'thas does to those that fail him, Geezle? Eternal suffering and pain... Do NOT screw this up, fool.', 0, 0, 'geezle - SPARK_SAY_5'),
(-1000264, 'Our Bloodmyst scouts have located our contact. The fool, Velen, will soon leave himself open and defenseless -- long enough for us to strike! Now get out of my sight before I vaporize you...', 0, 0, 'geezle - SPARK_SAY_6'),
(-1000265, 'Yes, sir. It won\'t happen again...', 0, 0, 'geezle - GEEZLE_SAY_7'),
-(-1000266, 'picks up the naga flag.', 2, 0, 'geezle - EMOTE_SPARK');
-
+(-1000266, 'picks up the naga flag.', 2, 0, 'geezle - EMOTE_SPARK'); \ No newline at end of file
diff --git a/sql/updates/951_world_scripts.sql b/sql/updates/2.4.3_updates/951_world_scripts.sql
index 93f877bdb55..c0d7a80d58c 100644
--- a/sql/updates/951_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/951_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000279 and -1000267;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000279 and -1000267;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000267, 'Ready when you are, warrior.', 1, 'flathead - SAY_BIG_WILL_READY'),
(-1000268, 'The Affray has begun, get ready to fight!', 1, 'flathead - SAY_TWIGGY_FLATHEAD_BEGIN'),
(-1000269, 'You! Enter the fray!', 1, 'flathead - SAY_TWIGGY_FLATHEAD_FRAY'),
@@ -13,5 +13,4 @@ INSERT INTO script_texts (entry, content_default, type, comment) VALUES
(-1000276, 'Looks like we\'re out of woods, eh? Wonder what this does...', 0, 'shredder - SAY_PROGRESS_5'),
(-1000277, 'Come on, don\'t break down on me now!', 0, 'shredder - SAY_PROGRESS_6'),
(-1000278, 'That was a close one! Well, let\'s get going, it\'s still a ways to Ratchet!', 0, 'shredder - SAY_PROGRESS_7'),
-(-1000279, 'Hmm... I don\'t think this blinking red light is a good thing...', 0, 'shredder - SAY_PROGRESS_8');
-
+(-1000279, 'Hmm... I don\'t think this blinking red light is a good thing...', 0, 'shredder - SAY_PROGRESS_8'); \ No newline at end of file
diff --git a/sql/updates/952_world_scripts.sql b/sql/updates/2.4.3_updates/952_world_scripts.sql
index 25a19a6972f..b252050d981 100644
--- a/sql/updates/952_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/952_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts where entry BETWEEN -1000285 and -1000280;
-INSERT INTO script_texts (entry, content_default, type, language, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000285 and -1000280;
+INSERT INTO `script_texts` (entry, content_default, type, language, comment) VALUES
(-1000280, 'Thank you, dear Paladin, you just saved my life.', 0, 7, 'faulk - SAY_HEAL'),
(-1000281, 'Very well. Let\'s see what you have to show me, $N.', 0, 0, 'anvilvard - SAY_PR_1'),
@@ -7,5 +7,4 @@ INSERT INTO script_texts (entry, content_default, type, language, comment) VALUE
(-1000283, 'releases the last of its energies into the nerarby runestone, succesfully reactivating it.', 2, 0, 'crystal - EMOTE'),
(-1000284, 'Deployment sucessful. Trespassers will be neutralized.', 0, 0, 'sentry - SAY_CONVERTED_1'),
-(-1000285, 'Objective acquired. Initiating security routines.', 0, 0, 'sentry - SAY_CONVERTED_1');
-
+(-1000285, 'Objective acquired. Initiating security routines.', 0, 0, 'sentry - SAY_CONVERTED_1'); \ No newline at end of file
diff --git a/sql/updates/953_world_scripts.sql b/sql/updates/2.4.3_updates/953_world_scripts.sql
index b90eb732658..3f0f46fd8e3 100644
--- a/sql/updates/953_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/953_world_scripts.sql
@@ -1,10 +1,9 @@
-DELETE FROM script_texts where entry BETWEEN -1000292 and -1000286;
-INSERT INTO script_texts (entry, content_default, type, emote, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000292 and -1000286;
+INSERT INTO `script_texts` (entry, content_default, type, emote, comment) VALUES
(-1000286, 'A shadowy, sinister presence has invader the Emerald Dream. Its power is poised to spill over into our world, $N. We must oppose it! That\'s why I cannot accompany you in person.', 0, 0, 'clintar_spirit'),
(-1000287, 'The Emerald Dream will never be yours!', 0, 0, 'clintar_spirit'),
(-1000288, 'Begone from this place!', 0, 0, 'clintar_spirit'),
(-1000289, 'That\'s the first relic, but there are still two more. Follow me, $N.', 0, 0, 'clintar_spirit'),
(-1000290, 'I\'ve recovered the second relic. Take a moment to rest, and then we\'ll continue to the last reliquary.', 0, 0, 'clintar_spirit'),
(-1000291, 'We have all three of the relics, but my energy is rapidly fading. We must make our way back to Dreamwarden Lurosa! He will let you know what to do next.', 0, 0, 'clintar_spirit'),
-(-1000292, 'Lurosa, I am entrusting the Relics of Aviana to $N, who will take them to Morthis Whisperwing. I must return completely to the Emerald Dream now. Do not let $N fail!', 0, 0, 'clintar_spirit');
-
+(-1000292, 'Lurosa, I am entrusting the Relics of Aviana to $N, who will take them to Morthis Whisperwing. I must return completely to the Emerald Dream now. Do not let $N fail!', 0, 0, 'clintar_spirit'); \ No newline at end of file
diff --git a/sql/updates/954_world_scripts.sql b/sql/updates/2.4.3_updates/954_world_scripts.sql
index 11c52b109ad..70a5a377dbd 100644
--- a/sql/updates/954_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/954_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000305 and -1000293;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000305 and -1000293;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000293, 'In Nagrand, food hunt ogre!', 0, 'LUMP_SAY0'),
(-1000294, 'You taste good with maybe a little salt and pepper.', 0, 'LUMP_SAY1'),
(-1000295, 'OK, OK! Lump give up!', 0, 'LUMP_DEFEAT'),
@@ -16,5 +16,4 @@ INSERT INTO script_texts (entry, content_default, type, comment) VALUES
(-1000303, 'is very weak', 2, 'mob_phase_hunter - EMOTE_WEAK'),
(-1000304, 'Bessy, is that you?', 0, 'npc_bessy- SAY_THADELL_1'),
-(-1000305, 'Thank you for bringing back my Bessy, $N. I couldn\'t live without her!', 0, 'npc_bessy- SAY_THADELL_2');
-
+(-1000305, 'Thank you for bringing back my Bessy, $N. I couldn\'t live without her!', 0, 'npc_bessy- SAY_THADELL_2'); \ No newline at end of file
diff --git a/sql/updates/955_world_scripts.sql b/sql/updates/2.4.3_updates/955_world_scripts.sql
index 1afcd46cb07..5978a4786ad 100644
--- a/sql/updates/955_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/955_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000333 and -1000306;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000333 and -1000306;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000306, 'Follow me, stranger. This won\'t take long.', 0, 'npc_kservant - SAY1'),
(-1000307, 'Shattrath was once the draenei capital of this world. Its name means \"dwelling of light.\"', 4, 'npc_kservant - WHISP1'),
(-1000308, 'When the Burning Legion turned the orcs against the draenei, the fiercest battle was fought here. The draenei fought tooth and nail, but in the end the city fell.', 4, 'npc_kservant - WHISP2'),
@@ -31,12 +31,12 @@ INSERT INTO script_texts (entry, content_default, type, comment) VALUES
(-1000332, 'Time to meet your maker!', 0, ''),
(-1000333, 'Alright, we give up! Don\'t hurt us!', 0, '');
-DELETE FROM script_texts WHERE entry=-1000334;
-INSERT INTO script_texts (entry, content_default, type, language, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry`=-1000334;
+INSERT INTO `script_texts` (entry, content_default, type, language, comment) VALUES
(-1000334, 'Thank you, dear Paladin, you just saved my life.', 0, 10, 'stillblade - SAY_HEAL');
-DELETE FROM script_texts WHERE entry BETWEEN -1000349 and -1000335;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000349 and -1000335;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000335, 'Let\'s get to the others, and keep an eye open for those wolves cutside...', 0, 'npc_deathstalker_erland
- SAY_QUESTACCEPT'),
(-1000336, 'Be careful, $N. Those wolves like to hide among the trees.', 0, 'npc_deathstalker_erland - SAY_START'),
@@ -56,5 +56,4 @@ SAY_ON_BYE'),
(-1000347, 'Let\'s go before they find out I\'m free!', 0, 'npc_kaya_flathoof - SAY_START'),
(-1000348, 'Look out! We\'re under attack!', 0, 'npc_kaya_flathoof - SAY_AMBUSH'),
-(-1000349, 'Thank you for helping me. I know my way back from here.', 0, 'npc_kaya_flathoof - SAY_END');
-
+(-1000349, 'Thank you for helping me. I know my way back from here.', 0, 'npc_kaya_flathoof - SAY_END'); \ No newline at end of file
diff --git a/sql/updates/956_world_scripts.sql b/sql/updates/2.4.3_updates/956_world_scripts.sql
index 1e9b5b6d2d5..8ac06a7ab97 100644
--- a/sql/updates/956_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/956_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000365 and -1000350;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000365 and -1000350;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000350, 'Who dares awaken Aquementas?', 1, 'mob_aquementas - AGGRO_YELL_AQUE'),
(-1000351, 'I give up! Please don\'t kill me!', 0, 'mob_unkor_the_ruthless - SAY_SUBMIT'),
@@ -9,9 +9,7 @@ INSERT INTO script_texts (entry, content_default, type, comment) VALUES
(-1000353, 'Ok let\'s get out of here!', 0, 'npc_isla_starmane - SAY_PROGRESS_1'),
(-1000354, 'You sure you\'re ready? Take a moment.', 0, 'npc_isla_starmane - SAY_PROGRESS_2'),
(-1000355, 'Alright, let\'s do this!', 0, 'npc_isla_starmane - SAY_PROGRESS_3'),
-(-1000356, 'Ok, I think I can make it on my own from here. Thank you so much for breaking me out of there!', 0,
-
-'npc_isla_starmane - SAY_PROGRESS_4'),
+(-1000356, 'Ok, I think I can make it on my own from here. Thank you so much for breaking me out of there!', 0, 'npc_isla_starmane - SAY_PROGRESS_4'),
(-1000357, 'Belore...', 0, 'npc_lady_sylvanas_windrunner - SAY_LAMENT_END'),
(-1000358, 'kneels down and pick up the amulet.', 2, 'npc_lady_sylvanas_windrunner - EMOTE_LAMENT_END'),
@@ -23,5 +21,4 @@ INSERT INTO script_texts (entry, content_default, type, comment) VALUES
(-1000362, 'Let\'s keep moving. We\'re not safe here!', 0, 'npc_kayra_longmane - SAY_PROGRESS_3'),
(-1000363, 'Look out, $N! Enemies ahead!', 0, 'npc_kayra_longmane - SAY_PROGRESS_4'),
(-1000364, 'We\'re almost to the refuge! Let\'s go.', 0, 'npc_kayra_longmane - SAY_PROGRESS_5'),
-(-1000365, 'I can see my fellow druids from here. Thank you, $N. I\'m sure Ysiel will reward you for your actions!', 0, 'npc_kayra_longmane - SAY_PROGRESS_6');
-
+(-1000365, 'I can see my fellow druids from here. Thank you, $N. I\'m sure Ysiel will reward you for your actions!', 0, 'npc_kayra_longmane - SAY_PROGRESS_6'); \ No newline at end of file
diff --git a/sql/updates/957_world_scripts.sql b/sql/updates/2.4.3_updates/957_world_scripts.sql
index 9ebc7b73b66..368bd1f5573 100644
--- a/sql/updates/957_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/957_world_scripts.sql
@@ -33,5 +33,4 @@ INSERT INTO `waypoint_data`(`id`,`point`,`position_x`,`position_y`,`position_z`)
('2081','4','-1430','1705','112'),
('2081','5','-1393.5','1705.5','112'),
('2081','6','-1369.8','1724.5','112'),
-('2081','7','-1377','1760','112');
-
+('2081','7','-1377','1760','112'); \ No newline at end of file
diff --git a/sql/updates/963_world_scripts.sql b/sql/updates/2.4.3_updates/963_world_scripts.sql
index ab46bba981c..9083b243064 100644
--- a/sql/updates/963_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/963_world_scripts.sql
@@ -1,13 +1,13 @@
-UPDATE creature_template set ScriptName='mob_illidari_spawn' WHERE entry IN (22075,22074,19797);
+UPDATE `creature_template` SET `ScriptName`='mob_illidari_spawn' WHERE `entry` IN (22075,22074,19797);
UPDATE `creature_template` SET `ScriptName`='mob_torloth_the_magnificent' WHERE `entry`='22076';
-UPDATE creature_template SET ScriptName='npc_lord_illidan_stormrage' WHERE entry=22083;
-delete from creature where id=22083;
-INSERT INTO creature (id, map, spawnMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, DeathState, MovementType)
+UPDATE `creature_template` SET `ScriptName`='npc_lord_illidan_stormrage' WHERE `entry`=22083;
+DELETE FROM `creature` WHERE `id`=22083;
+INSERT INTO `creature` (id, map, spawnMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, DeathState, MovementType)
VALUES (22083, 530, 1, 0, 0, -4635.75, 1386.32, 137.34, 5.72398, 25,0, 0, 9955, 6774, 0, 0);
-update gameobject_template set scriptname='go_crystal_prison' where entry=185126;
+UPDATE `gameobject_template` SET `ScriptName`='go_crystal_prison' WHERE `entry`=185126;
-DELETE FROM script_texts WHERE entry BETWEEN -1000374 and -1000366;
-INSERT INTO script_texts (entry, content_default, type, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000374 and -1000366;
+INSERT INTO `script_texts` (entry, content_default, type, comment) VALUES
(-1000366, 'So you have defeated the Crimson Sigil. You now seek to challenge my rule? Not even Arthas could defeat me, yet you dare to even harbor such thoughts? Then I say to you, come! Come $N! The Black Temple awaits...', 1, 'Quest: Battle of the crimson watch - END_TEXT'),
(-1000367, 'At your command, my liege...', 0, 'TorlothAnim - First'),
@@ -18,5 +18,4 @@ INSERT INTO script_texts (entry, content_default, type, comment) VALUES
(-1000371, 'What manner of fool dares stand before Illidan Stormrage? Soldiers, destroy these insects!', 1, 'Quest: Battle of the crimson watch WavesInfo - First'),
(-1000372, 'You are no challenge for the Crimson Sigil. Mind breakers, end this nonsense.', 1, 'Quest: Battle of the crimson watch WavesInfo - Second'),
(-1000373, 'Run while you still can. The highlords come soon...', 1, 'Quest: Battle of the crimson watch WavesInfo - Third'),
-(-1000374, 'Torloth your master calls!', 1, 'Quest: Battle of the crimson watch WavesInfo - Fourth');
-
+(-1000374, 'Torloth your master calls!', 1, 'Quest: Battle of the crimson watch WavesInfo - Fourth'); \ No newline at end of file
diff --git a/sql/updates/965_world_scripts.sql b/sql/updates/2.4.3_updates/965_world_scripts.sql
index 51ea41b94e5..e3160223d5a 100644
--- a/sql/updates/965_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/965_world_scripts.sql
@@ -14,5 +14,4 @@ REPLACE INTO `spell_script_target` VALUES
(21934,1,21934),
(43144,1,23817),
(12613,1,5843),
-(9095,1,1200);
-
+(9095,1,1200); \ No newline at end of file
diff --git a/sql/updates/966_world_scripts.sql b/sql/updates/2.4.3_updates/966_world_scripts.sql
index 78ecaa6eb73..f49411890f4 100644
--- a/sql/updates/966_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/966_world_scripts.sql
@@ -1,5 +1,5 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000395 AND -1000375;
-INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000395 AND -1000375;
+INSERT INTO `script_texts` (entry,content_default,sound,type,language,emote,comment) VALUES
(-1000375 ,'I remember well the sting of defeat at the conclusion of the Third War. I have waited far too long for my revenge. Now the shadow of the Legion falls over this world. It is only a matter of time until all of your failed creation... is undone.',11332,1,0,0,'kazzak SAY_INTRO'),
(-1000376,'The Legion will conquer all!',11333,1,0,0,'kazzak SAY_AGGRO1'),
(-1000377,'All mortals will perish!',11334,1,0,0,'kazzak SAY_AGGRO2'),
@@ -21,5 +21,4 @@ INSERT INTO script_texts (entry,content_default,sound,type,language,emote,commen
(-1000392,'Threat level zero.',11349,1,0,0,'doomwalker SAY_SLAY_1'),
(-1000393,'Directive accomplished.',11350,1,0,0,'doomwalker SAY_SLAY_2'),
(-1000394,'Target exterminated.',11351,1,0,0,'doomwalker SAY_SLAY_3'),
-(-1000395,'System failure in five, f-o-u-r...',11352,1,0,0,'doomwalker SAY_DEATH');
-
+(-1000395,'System failure in five, f-o-u-r...',11352,1,0,0,'doomwalker SAY_DEATH'); \ No newline at end of file
diff --git a/sql/updates/970_world_scripts.sql b/sql/updates/2.4.3_updates/970_world_scripts.sql
index 6105fc5ccbe..5a9223cfc78 100644
--- a/sql/updates/970_world_scripts.sql
+++ b/sql/updates/2.4.3_updates/970_world_scripts.sql
@@ -1,10 +1,8 @@
-DELETE FROM script_texts WHERE entry BETWEEN -1000401 AND -1000396;
-INSERT INTO script_texts (entry, content_default, type, language, comment) VALUES
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1000401 AND -1000396;
+INSERT INTO `script_texts` (entry, content_default, type, language, comment) VALUES
(-1000396, 'Muahahahaha! You fool! You\'ve released me from my banishment in the interstices between space and time!', 0, 0, 'mobs_nether_drake - SAY_NIHIL_1'),
(-1000397, 'All of Draenor shall quick beneath my feet! I will destroy this world and reshape it in my image!', 0, 0, 'mobs_nether_drake - SAY_NIHIL_2'),
(-1000398, 'Where shall I begin? I cannot bother myself with a worm such as yourself. There is a world to be conquered!', 0, 0, 'mobs_nether_Drake - SAY_NIHIL_3'),
(-1000399, 'No doubt the fools that banished me are long dead. I shall take wing survey my demense. Pray to whatever gods you hold dear that we do not meet again.', 0, 0, 'mobs_nether_drake - SAY_NIHIL_4'),
(-1000400, 'NOOOOooooooo!', 1, 0, 'mobs_nether_drake - SAY_NIHIL_INTERRUPT'),
-
-(-1000401, 'Good $N, you are under the spell\'s influence. I must analyze it quickly, then we can talk.', 0, 7, 'npc_daranelle - SAY_DARANELLE');
-
+(-1000401, 'Good $N, you are under the spell\'s influence. I must analyze it quickly, then we can talk.', 0, 7, 'npc_daranelle - SAY_DARANELLE'); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/973_world_scripts.sql b/sql/updates/2.4.3_updates/973_world_scripts.sql
new file mode 100644
index 00000000000..ea997f917ff
--- /dev/null
+++ b/sql/updates/2.4.3_updates/973_world_scripts.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `ScriptName`='npc_enraged_spirit' WHERE `entry` IN (21050, 21061, 21060, 21059); \ No newline at end of file
diff --git a/sql/updates/2.4.3_updates/CMakeLists.txt b/sql/updates/2.4.3_updates/CMakeLists.txt
new file mode 100644
index 00000000000..85f240ead8c
--- /dev/null
+++ b/sql/updates/2.4.3_updates/CMakeLists.txt
@@ -0,0 +1,171 @@
+INSTALL(FILES
+11_characters.sql
+45_characters.sql
+54_world.sql
+57_world_scripts.sql
+66_world_scripts.sql
+68_world.sql
+70_world_scripts.sql
+78_world.sql
+79_characters.sql
+79_world.sql
+82_world_scripts.sql
+83_realmd.sql
+84_world.sql
+86_world_scripts.sql
+90_world.sql
+102_world.sql
+112_world_scripts.sql
+116_world.sql
+117_world_scripts.sql
+120_world.sql
+123_world_scripts.sql
+125_world_scripts.sql
+133_world_scripts.sql
+140_world.sql
+145_world_scripts.sql
+146_world.sql
+147_world.sql
+152_world.sql
+153_world.sql
+171_world.sql
+172_world_scripts.sql
+175_world_scripts.sql
+176_world.sql
+182_world.sql
+212_world_scripts.sql
+220_characters.sql
+230_world_blacktemple.sql
+230_world_scripts.sql
+230_world_serpent_shrine.sql
+230_world.sql
+231_world_scripts.sql
+233_world.sql
+238_world.sql
+240_world.sql
+241_world.sql
+247_world.sql
+262_characters.sql
+262_realmd.sql
+262_world.sql
+273_world_scripts.sql
+285_world.sql
+287_world_scripts.sql
+329_world.sql
+332_world.sql
+333_world.sql
+334_world.sql
+341_world.sql
+356_world.sql
+373_world_scripts.sql
+377_world_scripts.sql
+389_world.sql
+400_world.sql
+410_characters.sql
+426_world_scripts.sql
+427_world_scripts.sql
+444_world.sql
+452_world.sql
+455_world.sql
+471_world.sql
+480_world_scripts.sql
+488_world_scripts.sql
+502_world_scripts.sql
+505_world.sql
+506_world.sql
+513_world_scripts.sql
+519_world.sql
+537_world.sql
+541_characters.sql
+541_world.sql
+542_characters.sql
+551_world.sql
+566_world.sql
+571_world.sql
+572_world.sql
+575_world_scripts.sql
+583_world_scripts.sql
+586_world_scripts.sql
+588_world.sql
+608_world.sql
+615_world.sql
+636_world_scripts.sql
+640_world.sql
+645_world_scripts.sql
+667_world_scripts.sql
+676_world.sql
+679_world_scripts.sql
+683_world_scripts.sql
+686_world_scripts.sql
+691_world_scripts.sql
+692_world.sql
+708_world_scripts.sql
+722_world_script_texts.sql
+724_world.sql
+725_characters.sql
+725_world.sql
+728_world_scripts.sql
+733_characters.sql
+739_characters.sql
+741_characters.sql
+741_world.sql
+747_world.sql
+748_world_scripts.sql
+758_world_scripts.sql
+762_world.sql
+764_world_scripts.sql
+765_world_scripts.sql
+773_world_scripts.sql
+780_characters.sql
+783_world.sql
+785_world.sql
+789_world.sql
+807_world_scripts.sql
+817_world_scripts.sql
+822_world_scripts.sql
+826_world_scripts.sql
+833_world_scripts.sql
+834_world_scripts.sql
+837_world_scripts.sql
+838_world_scripts.sql
+839_world_scripts.sql
+840_world_scripts.sql
+841_world_scripts.sql
+842_world.sql
+850_world_scripts.sql
+852_world_scripts.sql
+857_world_scripts.sql
+863_world_scripts.sql
+871_world.sql
+884_world.sql
+905_world_scripts.sql
+917_world.sql
+919_world.sql
+927_characters.sql
+930_characters.sql
+933_world_scripts.sql
+935_world_scripts.sql
+940_world_scripts.sql
+945_world_scripts.sql
+947_world_scripts.sql
+948_world_scripts.sql
+950_world_scripts.sql
+951_world_scripts.sql
+952_world_scripts.sql
+953_world_scripts.sql
+954_world_scripts.sql
+955_world_scripts.sql
+956_world_scripts.sql
+957_world_scripts.sql
+963_world_scripts.sql
+965_world_scripts.sql
+966_world_scripts.sql
+970_world_scripts.sql
+973_world_scripts.sql
+1018_world.sql
+1026_world.sql
+1028_world_scripts.sql
+1069_world_scripts.sql
+1073_world_scripts.sql
+1074_world_scripts.sql
+DESTINATION share/trinity/sql/updates/2.4.3_updates)
diff --git a/sql/updates/238_world.sql b/sql/updates/238_world.sql
deleted file mode 100644
index 1b70eeaf0ac..00000000000
--- a/sql/updates/238_world.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-DELETE FROM trinity_string WHERE entry IN (453);
-
diff --git a/sql/updates/341_world.sql b/sql/updates/341_world.sql
deleted file mode 100644
index ba02fe06468..00000000000
--- a/sql/updates/341_world.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-TRUNCATE TABLE playercreateinfo_item;
-
diff --git a/sql/updates/679_world_scripts.sql b/sql/updates/679_world_scripts.sql
deleted file mode 100644
index 0d725f85003..00000000000
--- a/sql/updates/679_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_deathstalker_erland' where entry=1978;
-
diff --git a/sql/updates/683_world_scripts.sql b/sql/updates/683_world_scripts.sql
deleted file mode 100644
index 50ca23c380e..00000000000
--- a/sql/updates/683_world_scripts.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-update quest_template set specialflags=2 where entry=665;
-update creature_template set scriptname='npc_professor_phizzlethorpe' where entry=2768;
-
diff --git a/sql/updates/691_world_scripts.sql b/sql/updates/691_world_scripts.sql
deleted file mode 100644
index 47037e5e091..00000000000
--- a/sql/updates/691_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_earthmender_wilda' where entry=21027;
-
diff --git a/sql/updates/692_world.sql b/sql/updates/692_world.sql
deleted file mode 100644
index 5879d754ff7..00000000000
--- a/sql/updates/692_world.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-DELETE FROM `spell_proc_event` WHERE `entry` IN ('14144','14148');
-INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
-('14144','0','0','0','2','0','0','0','0'),
-('14148','0','0','0','2','0','0','0','0');
-DELETE FROM `spell_proc_event` WHERE entry = 38164;
-INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES
- (38164,0,0,0,0,1,0,0,60);
-
diff --git a/sql/updates/708_world_scripts.sql b/sql/updates/708_world_scripts.sql
deleted file mode 100644
index c218f610b31..00000000000
--- a/sql/updates/708_world_scripts.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-UPDATE `creature_template` SET `ScriptName` = 'boss_shirrak_the_dead_watcher' WHERE `entry` = '18371';
-UPDATE `creature_template` SET `ScriptName` = 'mob_focus_fire', `unit_flags` = '33554434' WHERE `entry` = '18374';
-
diff --git a/sql/updates/724_world.sql b/sql/updates/724_world.sql
deleted file mode 100644
index c3850bc114d..00000000000
--- a/sql/updates/724_world.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-ALTER TABLE custom_texts ADD COLUMN emote tinyint(3) UNSIGNED DEFAULT '0' NOT NULL AFTER language;
-ALTER TABLE eventai_texts ADD COLUMN emote tinyint(3) UNSIGNED DEFAULT '0' NOT NULL AFTER language;
-ALTER TABLE script_texts ADD COLUMN emote tinyint(3) UNSIGNED DEFAULT '0' NOT NULL AFTER language;
-
diff --git a/sql/updates/725_characters.sql b/sql/updates/725_characters.sql
deleted file mode 100644
index 193868e906a..00000000000
--- a/sql/updates/725_characters.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-ALTER TABLE `character_ticket` RENAME TO `gm_tickets`;
-ALTER TABLE gm_tickets CHANGE `guid` `playerGuid` int(11) unsigned NOT NULL default '0';
-ALTER TABLE gm_tickets CHANGE `ticket_id` `guid` int(11) unsigned NOT NULL default '0';
-ALTER TABLE gm_tickets CHANGE `ticket_text` `message` text(0) NOT NULL;
-ALTER TABLE gm_tickets CHANGE `ticket_lastchange` `timestamp` int(10) NOT NULL default '0';
-
diff --git a/sql/updates/725_world.sql b/sql/updates/725_world.sql
deleted file mode 100644
index 3141da90872..00000000000
--- a/sql/updates/725_world.sql
+++ /dev/null
@@ -1,31 +0,0 @@
-DELETE FROM `trinity_string` WHERE (`entry`='290');
-DELETE FROM `trinity_string` WHERE (`entry`='296');
-DELETE FROM `trinity_string` WHERE (`entry`='289');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2000, '|cff00ff00New ticket from|r|cffff00ff %s.|r |cff00ff00Ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2001, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00edited his/her ticket:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2002, '|cff00ff00Character|r|cffff00ff %s |r|cff00ff00abandoned ticket entry:|r|cffff00ff %d.|r', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2003, '|cffff00ff %s|r |cff00ff00closed ticket|r |cffff00ff %d.|r', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2004, 'Ticket %d permanently deleted by %s.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2005, 'Ticket not found.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2007, 'Please close ticket before deleting it permanently.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2008, 'Ticket %d is already assigned to GM %s.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2009, '%u Tickets succesfully reloaded from the database.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2010, 'Showing list of open tickets.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2011, 'Showing list of open tickets whose creator is online.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2012, 'Invalid name specified. Name should be that of an online Gamemaster.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2013, 'This ticket is already assigned to yourself. To unassign use .ticket unassign %d and then reassign.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2014, 'Ticket %d is not assigned, you cannot unassign it.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2015, 'You cannot unassign tickets from staffmembers with a higher security level than yourself.', '', '', '', '', '', '', '', '');
-INSERT INTO trinity_string (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2016, 'Cannot close ticket %d, it is assigned to another GM.', '', '', '', '', '', '', '', '');
-DELETE FROM `command` WHERE (`name` LIKE '%ticket%');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket list','1','Displays a list of open GM tickets.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket onlinelist','1','Displays a list of open GM tickets whose owner is online.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket viewname','1','Usage: .ticket viewname $creatorname. \r\nReturns details about specified ticket. Ticket must be open and not deleted.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket viewid','1','Usage: .ticket viewid $ticketid.\r\nReturns details about specified ticket. Ticket must be open and not deleted.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket close','2','Usage: .ticket close $ticketid.\r\nCloses the specified ticket. Does not delete permanently.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket delete','3','Usage: .ticket delete $ticketid.\r\nDeletes the specified ticket permanently. Ticket must be closed first.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket assign','3','Usage: .ticket assign $ticketid $gmname.\r\nAssigns the specified ticket to the specified Game Master.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket unassign','3','Usage: .ticket unassign $ticketid.\r\nUnassigns the specified ticket from the current assigned Game Master.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.ticket comment','2','Usage: .ticket comment $ticketid $comment.\r\nAllows the adding or modifying of a comment to the specified ticket.');
-INSERT INTO `command` (`name`,`security`,`help`) VALUES ('.reload tickets','4','Usage: .reload tickets.\r\nReloads GM Tickets from the database and re-caches them into memory.');
-
diff --git a/sql/updates/728_world_scripts.sql b/sql/updates/728_world_scripts.sql
deleted file mode 100644
index 027af8ede16..00000000000
--- a/sql/updates/728_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_apprentice_mirveda' where entry=15402;
-
diff --git a/sql/updates/7332_01_mangos_command.sql b/sql/updates/7332_01_mangos_command.sql
new file mode 100644
index 00000000000..65248d19c61
--- /dev/null
+++ b/sql/updates/7332_01_mangos_command.sql
@@ -0,0 +1,6 @@
+ALTER TABLE db_version CHANGE COLUMN required_7331_01_mangos_command required_7332_01_mangos_command bit;
+
+DELETE FROM `command` WHERE `name` = 'distance';
+
+INSERT INTO `command` VALUES
+('distance',3,'Syntax: .distance [$name/$link]\r\n\r\nDisplay the distance from your character to the selected creature/player, or player with name $name, or player/creature/gameobject pointed to shift-link with guid.');
diff --git a/sql/updates/733_characters.sql b/sql/updates/733_characters.sql
deleted file mode 100644
index d966b131d5f..00000000000
--- a/sql/updates/733_characters.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE gm_tickets ADD `name` varchar(15) NOT NULL AFTER `playerGuid`;
-
diff --git a/sql/updates/739_characters.sql b/sql/updates/739_characters.sql
deleted file mode 100644
index 96c5c597a84..00000000000
--- a/sql/updates/739_characters.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE gm_tickets ADD `comment` text(0) NOT NULL;
-
diff --git a/sql/updates/748_world_scripts.sql b/sql/updates/748_world_scripts.sql
deleted file mode 100644
index a9e079ec9e9..00000000000
--- a/sql/updates/748_world_scripts.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-update creature_template set scriptname='npc_infused_crystal', flags_extra=0 where entry=16364;
-delete from creature where id=17086;
-
diff --git a/sql/updates/758_world_scripts.sql b/sql/updates/758_world_scripts.sql
deleted file mode 100644
index cbb2a783264..00000000000
--- a/sql/updates/758_world_scripts.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-delete from creature_template_addon where entry = 17225;
-update creature_template set scriptname = 'boss_nightbane', unit_flags=0 where entry = 17225;
-delete from event_scripts where id = 10951;
-insert into event_scripts values
-(10951,0,10,17651,180000,0,-11159,-1907.22,91.48,0);
-
diff --git a/sql/updates/764_world_scripts.sql b/sql/updates/764_world_scripts.sql
deleted file mode 100644
index fb1d3a924c8..00000000000
--- a/sql/updates/764_world_scripts.sql
+++ /dev/null
@@ -1,124 +0,0 @@
-DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533039 AND -1533000;
-INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
-(-1533000,'Ahh... welcome to my parlor.',8788,1,0,'anubrekhan SAY_GREET'),
- (-1533001,'Just a little taste...',8785,1,0,'anubrekhan SAY_AGGRO1'),
- (-1533002,'There is no way out.',8786,1,0,'anubrekhan SAY_AGGRO2'),
- (-1533003,'Yes, Run! It makes the blood pump faster!',8787,1,0,'anubrekhan SAY_AGGRO3'),
- (-1533004,'I hear little hearts beating. Yesss... beating faster now. Soon the beating will stop.',8790,1,0,'anubrekhan SAY_TAUNT1'),
- (-1533005,'Where to go? What to do? So many choices that all end in pain, end in death.',8791,1,0,'anubrekhan SAY_TAUNT2'),
- (-1533006,'Which one shall I eat first? So difficult to choose... the all smell so delicious.',8792,1,0,'anubrekhan SAY_TAUNT3'),
- (-1533007,'Closer now... tasty morsels. I\'ve been too long without food. Without blood to drink.',8793,1,0,'anubrekhan SAY_TAUNT4'),
- (-1533008,'Shh... it will all be over soon.',8789,1,0,'anubrekhan SAY_SLAY'),
- (-1533009,'Your old lives, your mortal desires, mean nothing. You are acolytes of the master now, and you will serve the cause without question! The greatest glory is to die in the master\'s service!',8799,1,0,'faerlina SAY_GREET'),
- (-1533010,'Slay them in the master\'s name!',8794,1,0,'faerlina SAY_AGGRO1'),
- (-1533011,'You cannot hide from me!',8795,1,0,'faerlina SAY_AGGRO2'),
- (-1533012,'Kneel before me, worm!',8796,1,0,'faerlina SAY_AGGRO3'),
- (-1533013,'Run while you still can!',8797,1,0,'faerlina SAY_AGGRO4'),
- (-1533014,'You have failed!',8800,1,0,'faerlina SAY_SLAY1'),
- (-1533015,'Pathetic wretch!',8801,1,0,'faerlina SAY_SLAY2'),
- (-1533016,'The master... will avenge me!',8798,1,0,'faerlina SAY_DEATH'),
- (-1533017,'Patchwerk want to play!',8909,1,0,'patchwerk SAY_AGGRO1'),
- (-1533018,'Kel\'Thuzad make Patchwerk his Avatar of War!',8910,1,0,'patchwerk SAY_AGGRO2'),
- (-1533019,'No more play?',8912,1,0,'patchwerk SAY_SLAY'),
- (-1533020,'What happened to... Patch...',8911,1,0,'patchwerk SAY_DEATH'),
- (-1533021,'goes into a berserker rage!',0,2,0,'patchwerk EMOTE_BERSERK'),
- (-1533022,'becomes enraged!',0,2,0,'patchwerk EMOTE_ENRAGE'),
- (-1533023,'Stalagg crush you!',8864,1,0,'stalagg SAY_STAL_AGGRO'),
- (-1533024,'Stalagg kill!',8866,1,0,'stalagg SAY_STAL_SLAY'),
- (-1533025,'Master save me...',8865,1,0,'stalagg SAY_STAL_DEATH'),
- (-1533026,'Feed you to master!',8802,1,0,'feugen SAY_FEUG_AGGRO'),
- (-1533027,'Feugen make master happy!',8804,1,0,'feugen SAY_FEUG_SLAY'),
- (-1533028,'No... more... Feugen...',8803,1,0,'feugen SAY_FEUG_DEATH'),
- (-1533029,'You are too late... I... must... OBEY!',8872,1,0,'thaddius SAY_GREET'),
- (-1533030,'KILL!',8867,1,0,'thaddius SAY_AGGRO1'),
- (-1533031,'EAT YOUR BONES!',8868,1,0,'thaddius SAY_AGGRO2'),
- (-1533032,'BREAK YOU!',8869,1,0,'thaddius SAY_AGGRO3'),
- (-1533033,'You die now!',8877,1,0,'thaddius SAY_SLAY'),
- (-1533034,'Now YOU feel pain!',8871,1,0,'thaddius SAY_ELECT'),
- (-1533035,'Thank... you...',8870,1,0,'thaddius SAY_DEATH'),
- (-1533036,'Pleeease!',8873,1,0,'thaddius SAY_SCREAM1'),
- (-1533037,'Stop, make it stop!',8874,1,0,'thaddius SAY_SCREAM2'),
- (-1533038,'Help me! Save me!',8875,1,0,'thaddius SAY_SCREAM3'),
- (-1533039,'Please, nooo!',8876,1,0,'thaddius SAY_SCREAM4');
-
-DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533074 AND -1533040;
- INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
- (-1533040,'Foolishly you have sought your own demise. Brazenly you have disregarded powers beyond your understanding. You have fought hard to invade the realm of the harvester. Now there is only one way out - to walk the lonely path of the damned.',8807,1,0,'gothik SAY_SPEECH'),
- (-1533041,'Death is the only escape.',8806,1,0,'gothik SAY_KILL'),
- (-1533042,'I... am... undone!',8805,1,0,'gothik SAY_DEATH'),
- (-1533043,'I have waited long enough! Now, you face the harvester of souls!',8808,1,0,'gothik SAY_TELEPORT'),
- (-1533044,'Defend youself!',8892,1,0,'blaumeux SAY_BLAU_AGGRO'),
- (-1533045,'Come, Zeliek, do not drive them out. Not before we\'ve had our fun.',8896,1,0,'blaumeux SAY_BLAU_TAUNT1'),
- (-1533046,'I do hope they stay alive long enough for me to... introduce myself.',8897,1,0,'blaumeux SAY_BLAU_TAUNT2'),
- (-1533047,'The first kill goes to me! Anyone care to wager?',8898,1,0,'blaumeux SAY_BLAU_TAUNT3'),
- (-1533048,'Your life is mine!',8895,1,0,'blaumeux SAY_BLAU_SPECIAL'),
- (-1533049,'Who\'s next?',8894,1,0,'blaumeux SAY_BLAU_SLAY'),
- (-1533050,'Tou... che!',8893,1,0,'blaumeux SAY_BLAU_DEATH'),
- (-1533051,'Come out and fight, ye wee ninny!',8899,1,0,'korthazz SAY_KORT_AGGRO'),
- (-1533052,'To arms, ye roustabouts! We\'ve got company!',8903,1,0,'korthazz SAY_KORT_TAUNT1'),
- (-1533053,'I heard about enough of yer sniveling. Shut yer fly trap \'afore I shut it for ye!',8904,1,0,'korthazz SAY_KORT_TAUNT2'),
- (-1533054,'I\'m gonna enjoy killin\' these slack-jawed daffodils!',8905,1,0,'korthazz SAY_KORT_TAUNT3'),
- (-1533055,'I like my meat extra crispy!',8901,1,0,'korthazz SAY_KORT_SPECIAl'),
- (-1533056,'Next time, bring more friends!',8902,1,0,'korthazz SAY_KORT_SLAY'),
- (-1533057,'What a bloody waste this is!',8900,1,0,'korthazz SAY_KORT_DEATH'),
- (-1533058,'Flee, before it\'s too late!',8913,1,0,'zeliek SAY_ZELI_AGGRO'),
- (-1533059,'Invaders, cease this foolish venture at once! Turn away while you still can!',8917,1,0,'zeliek SAY_ZELI_TAUNT1'),
- (-1533060,'Perhaps they will come to their senses, and run away as fast as they can!',8918,1,0,'zeliek SAY_ZELI_TAUNT2'),
- (-1533061,'Do not continue! Turn back while there\'s still time!',8919,1,0,'zeliek SAY_ZELI_TAUNT3'),
- (-1533062,'I- I have no choice but to obey!',8916,1,0,'zeliek SAY_ZELI_SPECIAL'),
- (-1533063,'Forgive me!',8915,1,0,'zeliek SAY_ZELI_SLAY'),
- (-1533064,'It is... as it should be.',8914,1,0,'zeliek SAY_ZELI_DEATH'),
- (-1533065,'You seek death?',14571,1,0,'rivendare_naxx SAY_RIVE_AGGRO1'),
- (-1533066,'None shall pass!',14572,1,0,'rivendare_naxx SAY_RIVE_AGGRO2'),
- (-1533067,'Be still!',14573,1,0,'rivendare_naxx SAY_RIVE_AGGRO3'),
- (-1533068,'You will find no peace in death.',14574,1,0,'rivendare_naxx SAY_RIVE_SLAY1'),
- (-1533069,'The master\'s will is done.',14575,1,0,'rivendare_naxx SAY_RIVE_SLAY2'),
- (-1533070,'Bow to the might of the scourge!',14576,1,0,'rivendare_naxx SAY_RIVE_SPECIAL'),
- (-1533071,'Enough prattling. Let them come! We shall grind their bones to dust.',14577,1,0,'rivendare_naxx SAY_RIVE_TAUNT1'),
- (-1533072,'Conserve your anger! Harness your rage! You will all have outlets for your frustration soon enough.',14578,1,0,'rivendare_naxx SAY_RIVE_TAUNT2'),
- (-1533073,'Life is meaningless. It is in death that we are truly tested.',14579,1,0,'rivendare_naxx SAY_RIVE_TAUNT3'),
- (-1533074,'Death... will not stop me...',14580,1,0,'rivendare_naxx SAY_RIVE_DEATH');
-
-UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=16062;
-UPDATE `creature_template` SET `ScriptName`='boss_rivendare_naxx' WHERE `entry`=30549;
-
-DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533108 AND -1533075;
- INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
- (-1533075,'Glory to the master!',8845,1,0,'noth SAY_AGGRO1'),
- (-1533076,'Your life is forfeit!',8846,1,0,'noth SAY_AGGRO2'),
- (-1533077,'Die, trespasser!',8847,1,0,'noth SAY_AGGRO3'),
- (-1533078,'Rise, my soldiers! Rise and fight once more!',8851,1,0,'noth SAY_SUMMON'),
- (-1533079,'My task is done!',8849,1,0,'noth SAY_SLAY1'),
- (-1533080,'Breathe no more!',8850,1,0,'noth SAY_SLAY2'),
- (-1533081,'I will serve the master... in... death!',8848,1,0,'noth SAY_DEATH'),
- (-1533082,'takes in a deep breath...',0,2,0,'sapphiron EMOTE_BREATH'),
- (-1533083,'enrages!',0,2,0,'sapphiron EMOTE_ENRAGE'),
- (-1533084,'Our preparations continue as planned, master.',14467,1,0,'kelthuzad SAY_SAPP_DIALOG1'),
- (-1533085,'It is good that you serve me so faithfully. Soon, all will serve the Lich King and in the end, you shall be rewarded...so long as you do not falter.',8881,1,0,'kelthuzad SAY_SAPP_DIALOG2_LICH'),
- (-1533086,'I see no complications... Wait... What is this?',14468,1,0,'kelthuzad SAY_SAPP_DIALOG3'),
- (-1533087,'Your security measures have failed! See to this interruption immediately!',8882,1,0,'kelthuzad SAY_SAPP_DIALOG4_LICH'),
- (-1533088,'Yes, master!',14469,1,0,'kelthuzad SAY_SAPP_DIALOG5'),
- (-1533089,'No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...',14484,1,0,'kelthuzad SAY_CAT_DIED'),
- (-1533090,'Who dares violate the sanctity of my domain? Be warned, all who trespass here are doomed.',14463,1,0,'kelthuzad SAY_TAUNT1'),
- (-1533091,'Fools, you think yourselves triumphant? You have only taken one step closer to the abyss! ',14464,1,0,'kelthuzad SAY_TAUNT2'),
- (-1533092,'I grow tired of these games. Proceed, and I will banish your souls to oblivion!',14465,1,0,'kelthuzad SAY_TAUNT3'),
- (-1533093,'You have no idea what horrors lie ahead. You have seen nothing! The frozen heart of Naxxramas awaits you!',14466,1,0,'kelthuzad SAY_TAUNT4'),
- (-1533094,'Pray for mercy!',14475,1,0,'kelthuzad SAY_AGGRO1'),
- (-1533095,'Scream your dying breath!',14476,1,0,'kelthuzad SAY_AGGRO2'),
- (-1533096,'The end is upon you!',14477,1,0,'kelthuzad SAY_AGGRO3'),
- (-1533097,'The dark void awaits you!',14478,1,0,'kelthuzad SAY_SLAY1'),
- (-1533098,'<Kel\'Thuzad cackles maniacally!>',14479,1,0,'kelthuzad SAY_SLAY2'),
- (-1533099,'AAAAGHHH!... Do not rejoice... your victory is a hollow one... for I shall return with powers beyond your imagining!',14480,1,0,'kelthuzad SAY_DEATH'),
- (-1533100,'Your soul, is bound to me now!',14472,1,0,'kelthuzad SAY_CHAIN1'),
- (-1533101,'There will be no escape!',14473,1,0,'kelthuzad SAY_CHAIN2'),
- (-1533102,'I will freeze the blood in your veins!',14474,1,0,'kelthuzad SAY_FROST_BLAST'),
- (-1533103,'Master! I require aid! ',14470,1,0,'kelthuzad SAY_REQUEST_AID'),
- (-1533104,'Very well... warriors of the frozen wastes, rise up! I command you to fight, kill, and die for your master. Let none survive...',0,1,0,'kelthuzad SAY_ANSWER_REQUEST'),
- (-1533105,'Minions, servants, soldiers of the cold dark, obey the call of Kel\'Thuzad!',14471,1,0,'kelthuzad SAY_SUMMON_MINIONS'),
- (-1533106,'Your petty magics are no challenge to the might of the Scourge! ',14481,1,0,'kelthuzad SAY_SPECIAL1_MANA_DET'),
- (-1533107,'Enough! I grow tired of these distractions! ',14483,1,0,'kelthuzad SAY_SPECIAL3_MANA_DET'),
- (-1533108,'Fools, you have spread your powers too thin. Be free, my minions!',14482,1,0,'kelthuzad SAY_SPECIAL2_DISPELL');
-
- UPDATE `script_texts` SET `sound`=8902 WHERE `entry`=-1533055;
- UPDATE `script_texts` SET `sound`=8901 WHERE `entry`=-1533056;
-
diff --git a/sql/updates/789_world.sql b/sql/updates/789_world.sql
deleted file mode 100644
index 43e6bdc42d2..00000000000
--- a/sql/updates/789_world.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE eventai_texts DROP COLUMN emote;
-
diff --git a/sql/updates/805_world_scripts.sql b/sql/updates/805_world_scripts.sql
new file mode 100644
index 00000000000..743984d3ad0
--- /dev/null
+++ b/sql/updates/805_world_scripts.sql
@@ -0,0 +1,123 @@
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533039 AND -1533000;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533000,'Ahh... welcome to my parlor.',8788,1,0,'anubrekhan SAY_GREET'),
+(-1533001,'Just a little taste...',8785,1,0,'anubrekhan SAY_AGGRO1'),
+(-1533002,'There is no way out.',8786,1,0,'anubrekhan SAY_AGGRO2'),
+(-1533003,'Yes, Run! It makes the blood pump faster!',8787,1,0,'anubrekhan SAY_AGGRO3'),
+(-1533004,'I hear little hearts beating. Yesss... beating faster now. Soon the beating will stop.',8790,1,0,'anubrekhan SAY_TAUNT1'),
+(-1533005,'Where to go? What to do? So many choices that all end in pain, end in death.',8791,1,0,'anubrekhan SAY_TAUNT2'),
+(-1533006,'Which one shall I eat first? So difficult to choose... the all smell so delicious.',8792,1,0,'anubrekhan SAY_TAUNT3'),
+(-1533007,'Closer now... tasty morsels. I\'ve been too long without food. Without blood to drink.',8793,1,0,'anubrekhan SAY_TAUNT4'),
+(-1533008,'Shh... it will all be over soon.',8789,1,0,'anubrekhan SAY_SLAY'),
+(-1533009,'Your old lives, your mortal desires, mean nothing. You are acolytes of the master now, and you will serve the cause without question! The greatest glory is to die in the master\'s service!',8799,1,0,'faerlina SAY_GREET'),
+(-1533010,'Slay them in the master\'s name!',8794,1,0,'faerlina SAY_AGGRO1'),
+(-1533011,'You cannot hide from me!',8795,1,0,'faerlina SAY_AGGRO2'),
+(-1533012,'Kneel before me, worm!',8796,1,0,'faerlina SAY_AGGRO3'),
+(-1533013,'Run while you still can!',8797,1,0,'faerlina SAY_AGGRO4'),
+(-1533014,'You have failed!',8800,1,0,'faerlina SAY_SLAY1'),
+(-1533015,'Pathetic wretch!',8801,1,0,'faerlina SAY_SLAY2'),
+(-1533016,'The master... will avenge me!',8798,1,0,'faerlina SAY_DEATH'),
+(-1533017,'Patchwerk want to play!',8909,1,0,'patchwerk SAY_AGGRO1'),
+(-1533018,'Kel\'Thuzad make Patchwerk his Avatar of War!',8910,1,0,'patchwerk SAY_AGGRO2'),
+(-1533019,'No more play?',8912,1,0,'patchwerk SAY_SLAY'),
+(-1533020,'What happened to... Patch...',8911,1,0,'patchwerk SAY_DEATH'),
+(-1533021,'goes into a berserker rage!',0,2,0,'patchwerk EMOTE_BERSERK'),
+(-1533022,'becomes enraged!',0,2,0,'patchwerk EMOTE_ENRAGE'),
+(-1533023,'Stalagg crush you!',8864,1,0,'stalagg SAY_STAL_AGGRO'),
+(-1533024,'Stalagg kill!',8866,1,0,'stalagg SAY_STAL_SLAY'),
+(-1533025,'Master save me...',8865,1,0,'stalagg SAY_STAL_DEATH'),
+(-1533026,'Feed you to master!',8802,1,0,'feugen SAY_FEUG_AGGRO'),
+(-1533027,'Feugen make master happy!',8804,1,0,'feugen SAY_FEUG_SLAY'),
+(-1533028,'No... more... Feugen...',8803,1,0,'feugen SAY_FEUG_DEATH'),
+(-1533029,'You are too late... I... must... OBEY!',8872,1,0,'thaddius SAY_GREET'),
+(-1533030,'KILL!',8867,1,0,'thaddius SAY_AGGRO1'),
+(-1533031,'EAT YOUR BONES!',8868,1,0,'thaddius SAY_AGGRO2'),
+(-1533032,'BREAK YOU!',8869,1,0,'thaddius SAY_AGGRO3'),
+(-1533033,'You die now!',8877,1,0,'thaddius SAY_SLAY'),
+(-1533034,'Now YOU feel pain!',8871,1,0,'thaddius SAY_ELECT'),
+(-1533035,'Thank... you...',8870,1,0,'thaddius SAY_DEATH'),
+(-1533036,'Pleeease!',8873,1,0,'thaddius SAY_SCREAM1'),
+(-1533037,'Stop, make it stop!',8874,1,0,'thaddius SAY_SCREAM2'),
+(-1533038,'Help me! Save me!',8875,1,0,'thaddius SAY_SCREAM3'),
+(-1533039,'Please, nooo!',8876,1,0,'thaddius SAY_SCREAM4');
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533074 AND -1533040;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533040,'Foolishly you have sought your own demise. Brazenly you have disregarded powers beyond your understanding. You have fought hard to invade the realm of the harvester. Now there is only one way out - to walk the lonely path of the damned.',8807,1,0,'gothik SAY_SPEECH'),
+(-1533041,'Death is the only escape.',8806,1,0,'gothik SAY_KILL'),
+(-1533042,'I... am... undone!',8805,1,0,'gothik SAY_DEATH'),
+(-1533043,'I have waited long enough! Now, you face the harvester of souls!',8808,1,0,'gothik SAY_TELEPORT'),
+(-1533044,'Defend youself!',8892,1,0,'blaumeux SAY_BLAU_AGGRO'),
+(-1533045,'Come, Zeliek, do not drive them out. Not before we\'ve had our fun.',8896,1,0,'blaumeux SAY_BLAU_TAUNT1'),
+(-1533046,'I do hope they stay alive long enough for me to... introduce myself.',8897,1,0,'blaumeux SAY_BLAU_TAUNT2'),
+(-1533047,'The first kill goes to me! Anyone care to wager?',8898,1,0,'blaumeux SAY_BLAU_TAUNT3'),
+(-1533048,'Your life is mine!',8895,1,0,'blaumeux SAY_BLAU_SPECIAL'),
+(-1533049,'Who\'s next?',8894,1,0,'blaumeux SAY_BLAU_SLAY'),
+(-1533050,'Tou... che!',8893,1,0,'blaumeux SAY_BLAU_DEATH'),
+(-1533051,'Come out and fight, ye wee ninny!',8899,1,0,'korthazz SAY_KORT_AGGRO'),
+(-1533052,'To arms, ye roustabouts! We\'ve got company!',8903,1,0,'korthazz SAY_KORT_TAUNT1'),
+(-1533053,'I heard about enough of yer sniveling. Shut yer fly trap \'afore I shut it for ye!',8904,1,0,'korthazz SAY_KORT_TAUNT2'),
+(-1533054,'I\'m gonna enjoy killin\' these slack-jawed daffodils!',8905,1,0,'korthazz SAY_KORT_TAUNT3'),
+(-1533055,'I like my meat extra crispy!',8901,1,0,'korthazz SAY_KORT_SPECIAl'),
+(-1533056,'Next time, bring more friends!',8902,1,0,'korthazz SAY_KORT_SLAY'),
+(-1533057,'What a bloody waste this is!',8900,1,0,'korthazz SAY_KORT_DEATH'),
+(-1533058,'Flee, before it\'s too late!',8913,1,0,'zeliek SAY_ZELI_AGGRO'),
+(-1533059,'Invaders, cease this foolish venture at once! Turn away while you still can!',8917,1,0,'zeliek SAY_ZELI_TAUNT1'),
+(-1533060,'Perhaps they will come to their senses, and run away as fast as they can!',8918,1,0,'zeliek SAY_ZELI_TAUNT2'),
+(-1533061,'Do not continue! Turn back while there\'s still time!',8919,1,0,'zeliek SAY_ZELI_TAUNT3'),
+(-1533062,'I- I have no choice but to obey!',8916,1,0,'zeliek SAY_ZELI_SPECIAL'),
+(-1533063,'Forgive me!',8915,1,0,'zeliek SAY_ZELI_SLAY'),
+(-1533064,'It is... as it should be.',8914,1,0,'zeliek SAY_ZELI_DEATH'),
+(-1533065,'You seek death?',14571,1,0,'rivendare_naxx SAY_RIVE_AGGRO1'),
+(-1533066,'None shall pass!',14572,1,0,'rivendare_naxx SAY_RIVE_AGGRO2'),
+(-1533067,'Be still!',14573,1,0,'rivendare_naxx SAY_RIVE_AGGRO3'),
+(-1533068,'You will find no peace in death.',14574,1,0,'rivendare_naxx SAY_RIVE_SLAY1'),
+(-1533069,'The master\'s will is done.',14575,1,0,'rivendare_naxx SAY_RIVE_SLAY2'),
+(-1533070,'Bow to the might of the scourge!',14576,1,0,'rivendare_naxx SAY_RIVE_SPECIAL'),
+(-1533071,'Enough prattling. Let them come! We shall grind their bones to dust.',14577,1,0,'rivendare_naxx SAY_RIVE_TAUNT1'),
+(-1533072,'Conserve your anger! Harness your rage! You will all have outlets for your frustration soon enough.',14578,1,0,'rivendare_naxx SAY_RIVE_TAUNT2'),
+(-1533073,'Life is meaningless. It is in death that we are truly tested.',14579,1,0,'rivendare_naxx SAY_RIVE_TAUNT3'),
+(-1533074,'Death... will not stop me...',14580,1,0,'rivendare_naxx SAY_RIVE_DEATH');
+
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=16062;
+UPDATE `creature_template` SET `ScriptName`='boss_rivendare_naxx' WHERE `entry`=30549;
+
+DELETE FROM `script_texts` WHERE `entry` BETWEEN -1533108 AND -1533075;
+INSERT INTO `script_texts` (`entry`,`content_default`,`sound`,`type`,`language`,`comment`) VALUES
+(-1533075,'Glory to the master!',8845,1,0,'noth SAY_AGGRO1'),
+(-1533076,'Your life is forfeit!',8846,1,0,'noth SAY_AGGRO2'),
+(-1533077,'Die, trespasser!',8847,1,0,'noth SAY_AGGRO3'),
+(-1533078,'Rise, my soldiers! Rise and fight once more!',8851,1,0,'noth SAY_SUMMON'),
+(-1533079,'My task is done!',8849,1,0,'noth SAY_SLAY1'),
+(-1533080,'Breathe no more!',8850,1,0,'noth SAY_SLAY2'),
+(-1533081,'I will serve the master... in... death!',8848,1,0,'noth SAY_DEATH'),
+(-1533082,'takes in a deep breath...',0,2,0,'sapphiron EMOTE_BREATH'),
+(-1533083,'enrages!',0,2,0,'sapphiron EMOTE_ENRAGE'),
+(-1533084,'Our preparations continue as planned, master.',14467,1,0,'kelthuzad SAY_SAPP_DIALOG1'),
+(-1533085,'It is good that you serve me so faithfully. Soon, all will serve the Lich King and in the end, you shall be rewarded...so long as you do not falter.',8881,1,0,'kelthuzad SAY_SAPP_DIALOG2_LICH'),
+(-1533086,'I see no complications... Wait... What is this?',14468,1,0,'kelthuzad SAY_SAPP_DIALOG3'),
+(-1533087,'Your security measures have failed! See to this interruption immediately!',8882,1,0,'kelthuzad SAY_SAPP_DIALOG4_LICH'),
+(-1533088,'Yes, master!',14469,1,0,'kelthuzad SAY_SAPP_DIALOG5'),
+(-1533089,'No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...',14484,1,0,'kelthuzad SAY_CAT_DIED'),
+(-1533090,'Who dares violate the sanctity of my domain? Be warned, all who trespass here are doomed.',14463,1,0,'kelthuzad SAY_TAUNT1'),
+(-1533091,'Fools, you think yourselves triumphant? You have only taken one step closer to the abyss! ',14464,1,0,'kelthuzad SAY_TAUNT2'),
+(-1533092,'I grow tired of these games. Proceed, and I will banish your souls to oblivion!',14465,1,0,'kelthuzad SAY_TAUNT3'),
+(-1533093,'You have no idea what horrors lie ahead. You have seen nothing! The frozen heart of Naxxramas awaits you!',14466,1,0,'kelthuzad SAY_TAUNT4'),
+(-1533094,'Pray for mercy!',14475,1,0,'kelthuzad SAY_AGGRO1'),
+(-1533095,'Scream your dying breath!',14476,1,0,'kelthuzad SAY_AGGRO2'),
+(-1533096,'The end is upon you!',14477,1,0,'kelthuzad SAY_AGGRO3'),
+(-1533097,'The dark void awaits you!',14478,1,0,'kelthuzad SAY_SLAY1'),
+(-1533098,'<Kel\'Thuzad cackles maniacally!>',14479,1,0,'kelthuzad SAY_SLAY2'),
+(-1533099,'AAAAGHHH!... Do not rejoice... your victory is a hollow one... for I shall return with powers beyond your imagining!',14480,1,0,'kelthuzad SAY_DEATH'),
+(-1533100,'Your soul, is bound to me now!',14472,1,0,'kelthuzad SAY_CHAIN1'),
+(-1533101,'There will be no escape!',14473,1,0,'kelthuzad SAY_CHAIN2'),
+(-1533102,'I will freeze the blood in your veins!',14474,1,0,'kelthuzad SAY_FROST_BLAST'),
+(-1533103,'Master! I require aid! ',14470,1,0,'kelthuzad SAY_REQUEST_AID'),
+(-1533104,'Very well... warriors of the frozen wastes, rise up! I command you to fight, kill, and die for your master. Let none survive...',0,1,0,'kelthuzad SAY_ANSWER_REQUEST'),
+(-1533105,'Minions, servants, soldiers of the cold dark, obey the call of Kel\'Thuzad!',14471,1,0,'kelthuzad SAY_SUMMON_MINIONS'),
+(-1533106,'Your petty magics are no challenge to the might of the Scourge! ',14481,1,0,'kelthuzad SAY_SPECIAL1_MANA_DET'),
+(-1533107,'Enough! I grow tired of these distractions! ',14483,1,0,'kelthuzad SAY_SPECIAL3_MANA_DET'),
+(-1533108,'Fools, you have spread your powers too thin. Be free, my minions!',14482,1,0,'kelthuzad SAY_SPECIAL2_DISPELL');
+
+UPDATE `script_texts` SET `sound`=8902 WHERE `entry`=-1533055;
+UPDATE `script_texts` SET `sound`=8901 WHERE `entry`=-1533056; \ No newline at end of file
diff --git a/sql/updates/807_world_scripts.sql b/sql/updates/807_world_scripts.sql
deleted file mode 100644
index ee512619ee1..00000000000
--- a/sql/updates/807_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_isla_starmane' where entry=18760;
-
diff --git a/sql/updates/822_world_scripts.sql b/sql/updates/822_world_scripts.sql
deleted file mode 100644
index 117971d18a7..00000000000
--- a/sql/updates/822_world_scripts.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-update creature_template set scriptname='npc_kayra_longmane' where entry=17969;
-delete from creature_template_addon where entry=17969;
-update quest_template set specialflags=2 where entry=9752;
-
diff --git a/sql/updates/826_world_scripts.sql b/sql/updates/826_world_scripts.sql
deleted file mode 100644
index 7dc2cf77afa..00000000000
--- a/sql/updates/826_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-UPDATE `creature_template` SET `ScriptName` = 'npc_ruul_snowhoof' WHERE `entry` = 12818;
-
diff --git a/sql/updates/833_world_scripts.sql b/sql/updates/833_world_scripts.sql
deleted file mode 100644
index b8aed954f43..00000000000
--- a/sql/updates/833_world_scripts.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-update creature_template set scriptname='npc_dirty_larry', unit_flags=0, flags_extra=0 where entry=19720;
-update creature_template set unit_flags=0, flags_extra=0 where entry in (19726, 19725);
-
diff --git a/sql/updates/837_world_scripts.sql b/sql/updates/837_world_scripts.sql
deleted file mode 100644
index 810bd3510e0..00000000000
--- a/sql/updates/837_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_khadgar' where entry=18166;
-
diff --git a/sql/updates/838_world_scripts.sql b/sql/updates/838_world_scripts.sql
deleted file mode 100644
index 1ff400dc8c5..00000000000
--- a/sql/updates/838_world_scripts.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-delete from spell_script_target where entry=42222;
-insert into `spell_script_target` values
-('42222','1','23616');
-update `creature_template` set `scriptname`='npc_kyle_frenzied' where `entry`='23616';
-
diff --git a/sql/updates/839_world_scripts.sql b/sql/updates/839_world_scripts.sql
deleted file mode 100644
index 448cd44ca1e..00000000000
--- a/sql/updates/839_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_wizzlecrank_shredder' where entry=3439;
-
diff --git a/sql/updates/840_world_scripts.sql b/sql/updates/840_world_scripts.sql
deleted file mode 100644
index 8a334a578e1..00000000000
--- a/sql/updates/840_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-UPDATE `creature_template` SET `spell1` = 0, `flags_extra` = 0, `ScriptName` = 'npc_volcano' WHERE `entry` = 23085;
-
diff --git a/sql/updates/841_world_scripts.sql b/sql/updates/841_world_scripts.sql
deleted file mode 100644
index dac0cbd9857..00000000000
--- a/sql/updates/841_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_greengill_slave' where entry=25084;
-
diff --git a/sql/updates/850_world_scripts.sql b/sql/updates/850_world_scripts.sql
deleted file mode 100644
index e830d53f933..00000000000
--- a/sql/updates/850_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-UPDATE creature_template SET ScriptName = 'npc_bessy' WHERE entry = 20415;
-
diff --git a/sql/updates/852_world_scripts.sql b/sql/updates/852_world_scripts.sql
deleted file mode 100644
index 3fcdfc1f3c9..00000000000
--- a/sql/updates/852_world_scripts.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-update creature_template set scriptname='mob_nestlewood_owlkin' where entry=16518;
-update item_template set scriptname='item_inoculating_crystal' where entry=22962;
-
diff --git a/sql/updates/857_world_scripts.sql b/sql/updates/857_world_scripts.sql
deleted file mode 100644
index 78452693d44..00000000000
--- a/sql/updates/857_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_kaya_flathoof' where entry=11856;
-
diff --git a/sql/updates/875_mangos_7047_01_characters_character_spell.sql b/sql/updates/875_mangos_7047_01_characters_character_spell.sql
new file mode 100644
index 00000000000..b74900cfdba
--- /dev/null
+++ b/sql/updates/875_mangos_7047_01_characters_character_spell.sql
@@ -0,0 +1,10 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_6976_02_characters_character_db_version required_7047_01_characters_character_spell bit;*/
+
+DELETE FROM `character_spell` WHERE `spell` IN ('28880', 59542, 59543, 59544, 59545, 59547, 59548);
+INSERT INTO character_spell SELECT characters.guid as guid, 28880, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 1;
+INSERT INTO character_spell SELECT characters.guid as guid, 59542, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 2;
+INSERT INTO character_spell SELECT characters.guid as guid, 59543, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 3;
+INSERT INTO character_spell SELECT characters.guid as guid, 59544, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 5;
+INSERT INTO character_spell SELECT characters.guid as guid, 59545, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 6;
+INSERT INTO character_spell SELECT characters.guid as guid, 59547, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 7;
+INSERT INTO character_spell SELECT characters.guid as guid, 59548, 1, 0 FROM `characters` WHERE characters.race=11 AND characters.class = 8; \ No newline at end of file
diff --git a/sql/updates/875_mangos_7059_01_characters_pet_spell.sql b/sql/updates/875_mangos_7059_01_characters_pet_spell.sql
new file mode 100644
index 00000000000..11f1063ebc3
--- /dev/null
+++ b/sql/updates/875_mangos_7059_01_characters_pet_spell.sql
@@ -0,0 +1,4 @@
+/*ALTER TABLE character_db_version CHANGE COLUMN required_7059_01_characters_character_spell required_7059_02_characters_pet_spell bit;*/
+
+ALTER TABLE pet_spell
+ DROP slot; \ No newline at end of file
diff --git a/sql/updates/919_world.sql b/sql/updates/919_world.sql
deleted file mode 100644
index 5febe1ebdfc..00000000000
--- a/sql/updates/919_world.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE version
- ADD `core_revision` BIGINT UNSIGNED AFTER `core_version`;
-
diff --git a/sql/updates/933_world_scripts.sql b/sql/updates/933_world_scripts.sql
deleted file mode 100644
index 0918e8f1e9e..00000000000
--- a/sql/updates/933_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname='npc_snake_trap_serpents' where entry in (19921, 19833);
-
diff --git a/sql/updates/935_world_scripts.sql b/sql/updates/935_world_scripts.sql
deleted file mode 100644
index 5027cafa234..00000000000
--- a/sql/updates/935_world_scripts.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-DELETE FROM `creature` WHERE `id` = '17653';
-
-UPDATE `gameobject_template` SET `flags` = '4' WHERE `entry` IN ('181766','181823');
-UPDATE `gameobject` SET `SpawnMask` = '3',`state` = '1' WHERE `id` IN ('181766','181823');
-
-UPDATE `instance_template` SET `script` = 'instance_blood_furnace' WHERE `map` = '542';
-
diff --git a/sql/updates/940_world_scripts.sql b/sql/updates/940_world_scripts.sql
deleted file mode 100644
index a7f78170c35..00000000000
--- a/sql/updates/940_world_scripts.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE custom_texts CHANGE COLUMN emote emote smallint(5) unsigned NOT NULL DEFAULT '0';
-ALTER TABLE script_texts CHANGE COLUMN emote emote smallint(5) unsigned NOT NULL DEFAULT '0';
-
diff --git a/sql/updates/973_world_scripts.sql b/sql/updates/973_world_scripts.sql
deleted file mode 100644
index 35261fc7b02..00000000000
--- a/sql/updates/973_world_scripts.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-update creature_template set scriptname = 'npc_enraged_spirit' where entry in (21050, 21061, 21060, 21059);
-
diff --git a/sql/updates/CMakeLists.txt b/sql/updates/CMakeLists.txt
index 28d1f895e68..2b6de8c5c4e 100644
--- a/sql/updates/CMakeLists.txt
+++ b/sql/updates/CMakeLists.txt
@@ -1,171 +1,53 @@
+add_subdirectory(2.4.3_updates)
+
INSTALL(FILES
-11_characters.sql
-45_characters.sql
-54_world.sql
-57_world_scripts.sql
-66_world_scripts.sql
-68_world.sql
-70_world_scripts.sql
-78_world.sql
-79_characters.sql
-79_world.sql
-82_world_scripts.sql
-83_realmd.sql
-84_world.sql
-86_world_scripts.sql
-90_world.sql
-102_world.sql
-112_world_scripts.sql
-116_world.sql
-117_world_scripts.sql
-120_world.sql
-123_world_scripts.sql
-125_world_scripts.sql
-133_world_scripts.sql
-140_world.sql
-145_world_scripts.sql
-146_world.sql
-147_world.sql
-152_world.sql
-153_world.sql
-171_world.sql
-172_world_scripts.sql
-175_world_scripts.sql
-176_world.sql
-182_world.sql
-212_world_scripts.sql
-220_characters.sql
-230_world_blacktemple.sql
-230_world_scripts.sql
-230_world_serpent_shrine.sql
-230_world.sql
-231_world_scripts.sql
-233_world.sql
-238_world.sql
-240_world.sql
-241_world.sql
-247_world.sql
-262_characters.sql
-262_realmd.sql
-262_world.sql
-273_world_scripts.sql
-285_world.sql
-287_world_scripts.sql
-329_world.sql
-332_world.sql
-333_world.sql
-334_world.sql
-341_world.sql
-356_world.sql
-373_world_scripts.sql
-377_world_scripts.sql
-389_world.sql
-400_world.sql
-410_characters.sql
-426_world_scripts.sql
-427_world_scripts.sql
-444_world.sql
-452_world.sql
-455_world.sql
-471_world.sql
-480_world_scripts.sql
-488_world_scripts.sql
-502_world_scripts.sql
-505_world.sql
-506_world.sql
-513_world_scripts.sql
-519_world.sql
-537_world.sql
-541_characters.sql
-541_world.sql
-542_characters.sql
-551_world.sql
-566_world.sql
-571_world.sql
-572_world.sql
-575_world_scripts.sql
-583_world_scripts.sql
-586_world_scripts.sql
-588_world.sql
-608_world.sql
-615_world.sql
-636_world_scripts.sql
-640_world.sql
-645_world_scripts.sql
-667_world_scripts.sql
-676_world.sql
-679_world_scripts.sql
-683_world_scripts.sql
-686_world_scripts.sql
-691_world_scripts.sql
-692_world.sql
-708_world_scripts.sql
-722_world_script_texts.sql
-724_world.sql
-725_characters.sql
-725_world.sql
-728_world_scripts.sql
-733_characters.sql
-739_characters.sql
-741_characters.sql
-741_world.sql
-747_world.sql
-748_world_scripts.sql
-758_world_scripts.sql
-762_world.sql
-764_world_scripts.sql
-765_world_scripts.sql
-773_world_scripts.sql
-780_characters.sql
-783_world.sql
-785_world.sql
-789_world.sql
-807_world_scripts.sql
-817_world_scripts.sql
-822_world_scripts.sql
-826_world_scripts.sql
-833_world_scripts.sql
-834_world_scripts.sql
-837_world_scripts.sql
-838_world_scripts.sql
-839_world_scripts.sql
-840_world_scripts.sql
-841_world_scripts.sql
-842_world.sql
-850_world_scripts.sql
-852_world_scripts.sql
-857_world_scripts.sql
-863_world_scripts.sql
-871_world.sql
-884_world.sql
-905_world_scripts.sql
-917_world.sql
-919_world.sql
-927_characters.sql
-930_characters.sql
-933_world_scripts.sql
-935_world_scripts.sql
-940_world_scripts.sql
-945_world_scripts.sql
-947_world_scripts.sql
-948_world_scripts.sql
-950_world_scripts.sql
-951_world_scripts.sql
-952_world_scripts.sql
-953_world_scripts.sql
-954_world_scripts.sql
-955_world_scripts.sql
-956_world_scripts.sql
-957_world_scripts.sql
-963_world_scripts.sql
-965_world_scripts.sql
-966_world_scripts.sql
-970_world_scripts.sql
-973_world_scripts.sql
-1018_world.sql
-1026_world.sql
-1028_world_scripts.sql
-1069_world_scripts.sql
-1073_world_scripts.sql
-1074_world_scripts.sql
-DESTINATION share/trinity/sql/updates)
+805_world_scripts.sql
+875_mangos_7047_01_characters_character_spell.sql
+875_mangos_7059_01_characters_pet_spell.sql
+1026_mangos_7113_01_characters_character_achievement_progress.sql
+1028_mangos_7141_01_world_instance_template.sql
+1028_mangos_7147_01_world_creature_template.sql
+1028_mangos_7150_01_world_playercreateinfo_spell.sql
+1084_mangos_7168_01_world_command.sql
+1094_mangos_7193_01_world_trinity_string.sql
+1108_mangos_7196_02_world_spell_bonus_data.sql
+1108_mangos_7198_01_characters_characters.sql
+1108_mangos_7199_01_world_spell_bonus_data.sql
+1135_mangos_7207_01_world_creature.sql
+1135_mangos_7207_02_world_gameobject.sql
+1135_mangos_7207_03_characters_corpse.sql
+1140_mangos_7209_01_world_spell_bonus_data.sql
+1185_mangos_7214_01_world_command.sql
+1185_mangos_7214_02_world_trinity_string.sql
+1185_mangos_7214_03_world_spell_proc_event.sql
+1206_world_scripts.sql
+1207_world_scripts.sql
+1237_mangos_7230_01_world_spell_bonus_data.sql
+1248_mangos_7235_01_world_command.sql
+1288_mangos_7242_01_world_spell_bonus_data.sql
+1293_mangos_7249_01_world_spell_proc_event.sql
+1296_mangos_7252_01_world_command.sql
+1296_mangos_7252_02_world_trinity_string.sql
+1299_mangos_7255_01_characters_characters.sql
+1307_world.sql
+1312_world.sql
+1327_world.sql
+1351_world.sql
+1396_mangos_7267_01_characters_auctionhouse.sql
+1414_world_scripts.sql
+1423_mangos_7290_01_world_command.sql
+1426_mangos_7292_01_world_points_of_interest.sql
+1426_mangos_7292_02_world_locales_points_of_interest.sql
+1463_mangos_7303_01_world_pools.sql
+1470_world_scripts.sql
+1484_mangos_7307_01_characters_arena_team_member.sql
+1495_mangos_7312_01_world_trinity_string.sql
+1497_mangos_7314_01_characters_guild_rank.sql
+1525_world_scripts.sql
+1531_mangos_7324_01_characters_character_spell.sql
+1531_mangos_7324_02_characters_character_aura.sql
+1555_mangos_7331_01_world_command.sql
+1558_world_spell_linked_spell.sql
+1559_world.sql
+1570_world.sql
+DESTINATION share/trinity/sql/updates) \ No newline at end of file
diff --git a/sql/world.sql b/sql/world.sql
index af7d9785ca8..d19bb481dc9 100644
--- a/sql/world.sql
+++ b/sql/world.sql
@@ -2,7 +2,7 @@
--
-- Host: localhost Database: world
-- ------------------------------------------------------
--- Server version 5.0.34-log
+-- Server version 5.0.56-nt
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -41,10 +41,10 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `areatrigger_scripts`;
CREATE TABLE `areatrigger_scripts` (
- `entry` mediumint(8) NOT NULL,
- `ScriptName` char(64) NOT NULL,
- PRIMARY KEY (`entry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ `entry` MEDIUMINT( 8 ) NOT NULL ,
+ `ScriptName` CHAR( 64 ) NOT NULL ,
+ PRIMARY KEY ( `entry` )
+) ENGINE = MYISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `areatrigger_scripts`
@@ -95,8 +95,7 @@ CREATE TABLE `areatrigger_teleport` (
`target_position_y` float NOT NULL default '0',
`target_position_z` float NOT NULL default '0',
`target_orientation` float NOT NULL default '0',
- PRIMARY KEY (`id`),
- FULLTEXT KEY `name` (`name`)
+ PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Trigger System';
--
@@ -132,6 +131,15 @@ CREATE TABLE `battleground_template` (
LOCK TABLES `battleground_template` WRITE;
/*!40000 ALTER TABLE `battleground_template` DISABLE KEYS */;
+INSERT INTO `battleground_template` VALUES
+(1,0,0,0,0,611,2.72532,610,2.27452),
+(2,0,0,0,0,769,3.14159,770,3.14159),
+(4,0,2,10,70,929,0,936,3.14159),
+(3,0,0,0,0,890,3.40156,889,0.263892),
+(5,0,2,10,70,939,0,940,3.14159),
+(6,0,2,10,70,0,0,0,0),
+(7,0,0,0,0,1103,3.40156,1104,0.263892),
+(8,0,2,10,70,1258,0,1259,3.14159);
/*!40000 ALTER TABLE `battleground_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -173,6 +181,251 @@ CREATE TABLE `command` (
LOCK TABLES `command` WRITE;
/*!40000 ALTER TABLE `command` DISABLE KEYS */;
+INSERT INTO `command` VALUES
+('account',0,'Syntax: .account\r\n\r\nDisplay the access level of your account.'),
+('account create',4,'Syntax: .account create $account $password\r\n\r\nCreate account and set password to it.'),
+('account delete',4,'Syntax: .account delete $account\r\n\r\nDelete account with all characters.'),
+('account onlinelist',4,'Syntax: .account onlinelist\r\n\r\nShow list of online accounts.'),
+('account set addon',3,'Syntax: .account set addon [$account] #addon\r\n\r\nSet user (posible targeted) expansion addon level allowed. Addon values: 0 - normal, 1 - tbc, 2 - wotlk.'),
+('account set gmlevel',4,'Syntax: .account set gmlevel [$account] #level\r\n\r\nSet the security level for targeted player (can''t be used at self) or for account $name to a level of #level.\r\n\r\n#level may range from 0 to 3.'),
+('account set password',4,'Syntax: .account set password $account $password $password\r\n\r\nSet password for account.'),
+('additem',3,'Syntax: .additem #itemid/[#itemname]/#shift-click-item-link #itemcount\r\n\r\nAdds the specified number of items of id #itemid (or exact (!) name $itemname in brackets, or link created by shift-click at item in inventory or recipe) to your or selected character inventory. If #itemcount is omitted, only one item will be added.\r\n.'),
+('additemset',3,'Syntax: .additemset #itemsetid\r\n\r\nAdd items from itemset of id #itemsetid to your or selected character inventory. Will add by one example each item from itemset.'),
+('addmove',2,'Syntax: .addmove #creature_guid [#waittime]\r\n\r\nAdd your current location as a waypoint for creature with guid #creature_guid. And optional add wait time.'),
+('announce',1,'Syntax: .announce $MessageToBroadcast\r\n\r\nSend a global message to all players online in chat log.'),
+('aura',3,'Syntax: .aura #spellid\r\n\r\nAdd the aura from spell #spellid to the selected Unit.'),
+('ban account',3,'Syntax is: ban account $Name $bantime $reason\r\nBan account kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban character',3,'Syntax is: ban character $Name $bantime $reason\r\nBan account and kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban ip',3,'Syntax is: ban ip $Ip $bantime $reason\r\nBan IP.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('baninfo account',3,'Syntax is: baninfo account\r\nWatch full information about a specific ban.'),
+('baninfo character',3,'Syntax is: baninfo character\r\nWatch full information about a specific ban.'),
+('baninfo ip',3,'Syntax is: baninfo ip\r\nWatch full information about a specific ban.'),
+('bank',3,'Syntax: .bank\r\n\r\nShow your bank inventory.'),
+('banlist account',3,'Syntax is: banlist account [$Name]\r\nSearches the banlist for a account name pattern or show full list account bans.'),
+('banlist character',3,'Syntax is: banlist character $Name\r\nSearches the banlist for a character name pattern. Pattern required.'),
+('banlist ip',3,'Syntax is: banlist ip [$Ip]\r\nSearches the banlist for a IP pattern or show full list of IP bans.'),
+('cast',3,'Syntax: .cast #spellid [triggered]\r\n Cast #spellid to selected target. If no target selected cast to self. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast back',3,'Syntax: .cast back #spellid [triggered]\r\n Selected target will cast #spellid to your character. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast dist',3,'Syntax: .cast dist #spellid [#dist [triggered]]\r\n You will cast spell to pint at distance #dist. If \'trigered\' or part provided then spell casted with triggered flag. Not all spells can be casted as area spells.'),
+('cast self',3,'Syntax: .cast self #spellid [triggered]\r\nCast #spellid by target at target itself. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast target',3,'Syntax: .cast target #spellid [triggered]\r\n Selected target will cast #spellid to his victim. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('chardelete',4,'Syntax: .chardelete $charactername\r\n\r\nDelete character.'),
+('combatstop',2,'Syntax: .combatstop [$playername]\r\nStop combat for selected character. If selected non-player then command applied to self. If $playername provided then attempt applied to online player $playername.'),
+('commands',0,'Syntax: .commands\r\n\r\nDisplay a list of available commands for your account level.'),
+('cooldown',3,'Syntax: .cooldown [#spell_id]\r\n\r\nRemove all (if spell_id not provided) or #spel_id spell cooldown from selected character or you (if no selection).'),
+('damage',3,'Syntax: .damage $damage_amount [$school [$spellid]]\r\n\r\nApply $damage to target. If not $school and $spellid provided then this flat clean melee damage without any modifiers. If $school provided then damage modified by armor reduction (if school physical), and target absorbing modifiers and result applied as melee damage to target. If spell provided then damage modified and applied as spell damage. $spellid can be shift-link.'),
+('debug anim',2,'Syntax: .debug anim #emoteid\r\n\r\nPlay emote #emoteid for your character.'),
+('debug getvalue',3,'Syntax: .debug getvalue #field #isInt\r\n\r\nGet the field #field of the selected creature. If no creature is selected, get the content of your field.\r\n\r\nUse a #isInt of value 1 if the expected field content is an integer.'),
+('debug playsound',1,'Syntax: .debug playsound #soundid\r\n\r\nPlay sound with #soundid.\r\nSound will be play only for you. Other players do not hear this.\r\nWarning: client may have more 5000 sounds...'),
+('debug setvalue',3,'Syntax: .debug setvalue #field #value #isInt\r\n\r\nSet the field #field of the selected creature with value #value. If no creature is selected, set the content of your field.\r\n\r\nUse a #isInt of value 1 if #value is an integer.'),
+('debug standstate',2,'Syntax: .debug standstate #emoteid\r\n\r\nChange the emote of your character while standing to #emoteid.'),
+('debug update',3,'Syntax: .debug update #field #value\r\n\r\nUpdate the field #field of the selected character or creature with value #value.\r\n\r\nIf no #value is provided, display the content of field #field.'),
+('delticket',2,'Syntax: .delticket all\r\n .delticket #num\r\n .delticket $character_name\r\n\rall to dalete all tickets at server, $character_name to delete ticket of this character, #num to delete ticket #num.'),
+('demorph',2,'Syntax: .demorph\r\n\r\nDemorph the selected player.'),
+('die',3,'Syntax: .die\r\n\r\nKill the selected player. If no player is selected, it will kill you.'),
+('dismount',0,'Syntax: .dismount\r\n\r\nDismount you, if you are mounted.'),
+('distance',3,'Syntax: .distance\r\n\r\nDisplay the distance from your character to the selected creature.'),
+('event',2,'Syntax: .event #event_id\r\nShow details about event with #event_id.'),
+('event activelist',2,'Syntax: .event activelist\r\nShow list of currently active events.'),
+('event start',2,'Syntax: .event start #event_id\r\nStart event #event_id. Set start time for event to current moment (change not saved in DB).'),
+('event stop',2,'Syntax: .event stop #event_id\r\nStop event #event_id. Set start time for event to time in past that make current moment is event stop time (change not saved in DB).'),
+('explorecheat',3,'Syntax: .explorecheat #flag\r\n\r\nReveal or hide all maps for the selected player. If no player is selected, hide or reveal maps to you.\r\n\r\nUse a #flag of value 1 to reveal, use a #flag value of 0 to hide all maps.'),
+('flusharenapoints','3','Syntax: .flusharenapoints\r\n\r\nUse it to distribute arena points based on arena team ratings, and start a new week.'),
+('gm',1,'Syntax: .gm [on/off]\r\n\r\nEnable or Disable in game GM MODE or show current state of on/off not provided.'),
+('gm chat',1,'Syntax: .gm chat [on/off]\r\n\r\nEnable or disable chat GM MODE (show gm badge in messages) or show current state of on/off not provided.'),
+('gm fly',3,'Syntax: .gm fly on/off\r\nEnable/disable gm fly mode.'),
+('gm ingame',0,'Syntax: .gm ingame\r\n\r\nDisplay a list of available in game Game Masters.'),
+('gm list',3,'Syntax: .gm list\r\n\r\nDisplay a list of all Game Masters accounts and security levels.'),
+('gm online',0,'Syntax: .gm online\r\n\r\nDisplay a list of available Game Masters.'),
+('gm visible',1,'Syntax: .gm visible on/off\r\n\r\nOutput current visibility state or make GM visible(on) and invisible(off) for other players.'),
+('go creature',2,'Syntax: .go creature #creature_guid\r\nTeleport your character to creature with guid #creature_guid.\r\n.gocreature #creature_name\r\nTeleport your character to creature with this name.\r\n.gocreature id #creature_id\r\nTeleport your character to a creature that was spawned from the template with this entry.\r\n*If* more than one creature is found, then you are teleported to the first that is found inside the database.'),
+('go graveyard',2,'Syntax: .go graveyard #graveyardId\r\n Teleport to graveyard with the graveyardId specified.'),
+('go grid',1,'Syntax: .go grid #gridX #gridY [#mapId]\r\n\r\nTeleport the gm to center of grid with provided indexes at map #mapId (or current map if it not provided).'),
+('go object',1,'Syntax: .go object #object_guid\r\nTeleport your character to gameobject with guid #object_guid'),
+('go trigger',2,'Syntax: .go trigger #trigger_id\r\n\r\nTeleport your character to areatrigger with id #trigger_id. Character will be teleported to trigger target if selected areatrigger is telporting trigger.'),
+('go xy',1,'Syntax: .go xy #x #y [#mapid]\r\n\r\nTeleport player to point with (#x,#y) coordinates at ground(water) level at map #mapid or same map if #mapid not provided.'),
+('go xyz',1,'Syntax: .go xyz #x #y #z [#mapid]\r\n\r\nTeleport player to point with (#x,#y,#z) coordinates at ground(water) level at map #mapid or same map if #mapid not provided.'),
+('go zonexy',1,'Syntax: .go zonexy #x #y [#zone]\r\n\r\nTeleport player to point with (#x,#y) client coordinates at ground(water) level in zone #zoneid or current zone if #zoneid not provided. You can look up zone using .lookup area $namepart'),
+('gobject add',2,'Syntax: .gobject add #id <spawntimeSecs>\r\n\r\nAdd a game object from game object templates to the world at your current location using the #id.\r\nspawntimesecs sets the spawntime, it is optional.\r\n\r\nNote: this is a copy of .gameobject.'),
+('gobject delete',2,'Syntax: .gobject delete #go_guid\r\nDelete gameobject with guid #go_guid.'),
+('gobject move',2,'Syntax: .gobject move #goguid [#x #y #z]\r\n\r\nMove gameobject #goguid to character coordinates (or to (#x,#y,#z) coordinates if its provide).'),
+('gobject near ',3,'Syntax: .gobject near [#distance]\r\n\r\nOutput gameobjects at distance #distance from player. Output gameobject guids and coordinates sorted by distance from character. If #distance not provided use 10 as default value.'),
+('gobject turn',2,'Syntax: .gobject turn #goguid \r\n\r\nSet for gameobject #goguid orientation same as current character orientation.'),
+('gobject target',2,'Syntax: .gobject target [#go_id|#go_name_part]\r\n\r\nLocate and show position nearest gameobject. If #go_id or #go_name_part provide then locate and show position of nearest gameobject with gameobject template id #go_id or name included #go_name_part as part.'),
+('goname',1,'Syntax: .goname $charactername\r\n\r\nTeleport to the given character. Either specify the character name or click on the character\'s portrait, e.g. when you are in a group.'),
+('gps',1,'Syntax: .gps\r\n\r\nDisplay the position information for a selected character or creature. Position information includes X, Y, Z, and orientation, map Id and zone Id'),
+('groupgo',1,'Syntax: .groupgo $charactername\r\n\r\nTeleport the given character and his group to you.'),
+('guid',2,'Syntax: .guid\r\n\r\nDisplay the GUID for the selected character.'),
+('guild create',2,'Syntax: .guild create $GuildLeaderName $GuildName\r\n\r\nCreate a guild named $GuildName with the player $GuildLeaderName as leader.'),
+('guild delete',2,'Syntax: .guild delete $GuildName\r\n\r\nDelete guild $GuildName.'),
+('guild invite',2,'Syntax: .guild invite $CharacterName $GuildName\r\n\r\nAdd $CharacterName into a guild $GuildName.'),
+('guild rank',2,'Syntax: .guild rank $CharacterName #Rank\r\n\r\nSet for $CharacterName rank #Rank in a guild.'),
+('guild uninvite',2,'Syntax: .guild uninvite $CharacterName\r\n\r\nRemove $CharacterName from a guild.'),
+('help',0,'Syntax: .help [$command]\r\n\r\nDisplay usage instructions for the given $command. If no $command provided show list available commands.'),
+('hidearea',3,'Syntax: .hidearea #areaid\r\n\r\nHide the area of #areaid to the selected character. If no character is selected, hide this area to you.'),
+('honor add',2,'Syntax: .honor add $amount\r\n\r\nAdd a certain amount of honor (gained today) to the selected player.'),
+('honor addkill',2,'Syntax: .honor addkikll\r\n\r\nAdd the targeted unit as one of your pvp kills today (you only get honor if it\'s a racial leader or a player)'),
+('honor update',2,'Syntax: .honor update\r\n\r\nForce the yesterday\'s honor fields to be updated with today\'s data, which will get reset for the selected player.'),
+('hover',3,'Syntax: .hover #flag\r\n\r\nEnable or disable hover mode for your character.\r\n\r\nUse a #flag of value 1 to enable, use a #flag value of 0 to disable hover.'),
+('instance unbind',3,'Syntax: .instance unbind all\r\n All of the selected player\'s binds will be cleared.'),
+('instance listbinds',3,'Syntax: .instance listbinds\r\n Lists the binds of the selected player.'),
+('instance stats',3,'Syntax: .instance stats\r\n Shows statistics about instances.'),
+('instance savedata',3,'Syntax: .instance savedata\r\n Save the InstanceData for the current player\'s map to the DB.'),
+('itemmove',2,'Syntax: .itemmove #sourceslotid #destinationslotid\r\n\r\nMove an item from slots #sourceslotid to #destinationslotid in your inventory\r\n\r\nNot yet implemented'),
+('kick',2,'Syntax: .kick [$charactername]\r\n\r\nKick the given character name from the world. If no character name is provided then the selected player (except for yourself) will be kicked.'),
+('learn',3,'Syntax: .learn #parameter\r\n\r\nSelected character learn a spell of id #parameter.'),
+('learn all',3,'Syntax: .learn all\r\n\r\nLearn all big set different spell maybe useful for Administaror.'),
+('learn all_crafts',2,'Syntax: .learn crafts\r\n\r\nLearn all professions and recipes.'),
+('learn all_default',1,'Syntax: .learn all_default [$playername]\r\n\r\nLearn for selected/$playername player all default spells for his race/class and spells rewarded by completed quests.'),
+('learn all_gm',2,'Syntax: .learn all_gm\r\n\r\nLearn all default spells for Game Masters.'),
+('learn all_lang',1,'Syntax: .learn all_lang\r\n\r\nLearn all languages'),
+('learn all_myclass',3,'Syntax: .learn all_myclass\r\n\r\nLearn all spells and talents available for his class.'),
+('learn all_myspells',3,'Syntax: .learn all_myspells\r\n\r\nLearn all spells (except talents and spells with first rank learned as talent) available for his class.'),
+('learn all_mytalents',3,'Syntax: .learn all_mytalents\r\n\r\nLearn all talents (and spells with first rank learned as talent) available for his class.'),
+('learn all_recipes',2,'Syntax: .learn all_recipes [$profession]\r\rLearns all recipes of specified profession and sets skill level to max.\rExample: .learn all_recipes enchanting'),
+('levelup',3,'Syntax: .levelup [$playername] [#numberoflevels]\r\n\r\nIncrease/decrease the level of character with $playername (or the selected if not name provided) by #numberoflevels Or +1 if no #numberoflevels provided). If #numberoflevels is omitted, the level will be increase by 1. If #numberoflevels is 0, the same level will be restarted. If no character is selected and name not provided, increase your level. Command can be used for offline character. All stats and dependent VALUESrecalculated. At level decrease talents can be reset if need. Also at level decrease equipped items with greater level requirement can be lost.'),
+('linkgrave',3,'Syntax: .linkgrave #graveyard_id [alliance|horde]\r\n\r\nLink current zone to graveyard for any (or alliance/horde faction ghosts). This let character ghost from zone teleport to graveyard after die if graveyard is nearest from linked to zone and accept ghost of this faction. Add only single graveyard at another map and only if no graveyards linked (or planned linked at same map).'),
+('list creature',3,'Syntax: .list creature #creature_id [#max_count]\r\n\r\nOutput creatures with creature id #creature_id found in world. Output creature guids and coordinates sorted by distance from character. Will be output maximum #max_count creatures. If #max_count not provided use 10 as default value.'),
+('list item',3,'Syntax: .list item #item_id [#max_count]\r\n\r\nOutput items with item id #item_id found in all character inventories, mails, auctions, and guild banks. Output item guids, item owner guid, owner account and owner name (guild name and guid in case guild bank). Will be output maximum #max_count items. If #max_count not provided use 10 as default value.'),
+('list object',3,'Syntax: .list object #gameobject_id [#max_count]\r\n\r\nOutput gameobjects with gameobject id #gameobject_id found in world. Output gameobject guids and coordinates sorted by distance from character. Will be output maximum #max_count gameobject. If #max_count not provided use 10 as default value.'),
+('loadscripts',3,'Syntax: .loadscripts $scriptlibraryname\r\n\r\nUnload current and load the script library $scriptlibraryname or reload current if $scriptlibraryname omitted, in case you changed it while the server was running.'),
+('lockaccount',0,'Syntax: .lockaccount [on|off]\r\n\r\nAllow login from account only from current used IP or remove this requirement.'),
+('lookup area',1,'Syntax: .lookup area $namepart\r\n\r\nLooks up an area by $namepart, and returns all matches with their area ID\'s.'),
+('lookup creature',3,'Syntax: .lookup creature $namepart\r\n\r\nLooks up a creature by $namepart, and returns all matches with their creature ID\'s.'),
+('lookup event',2,'Syntax: .lookup event $name\r\nAttempts to find the ID of the event with the provided $name.'),
+('lookup faction',3,'Syntax: .lookup faction $name\r\nAttempts to find the ID of the faction with the provided $name.'),
+('lookup item',3,'Syntax: .lookup item $itemname\r\n\r\nLooks up an item by $itemname, and returns all matches with their Item ID\'s.'),
+('lookup itemset',3,'Syntax: .lookup itemset $itemname\r\n\r\nLooks up an item set by $itemname, and returns all matches with their Item set ID\'s.'),
+('lookup object',3,'Syntax: .lookup object $objname\r\n\r\nLooks up an gameobject by $objname, and returns all matches with their Gameobject ID\'s.'),
+('lookup player account',2,'Syntax : .lookup player account $account ($limit) \r\n\r\n Searchs players, which account username is $account with optional parametr $limit of results.'),
+('lookup player ip',2,'Syntax : .lookup player ip $ip ($limit) \r\n\r\n Searchs players, which account ast_ip is $ip with optional parametr $limit of results.'),
+('lookup player email',2,'Syntax : .lookup player email $email ($limit) \r\n\r\n Searchs players, which account email is $email with optional parametr $limit of results.'),
+('lookup quest',3,'Syntax: .lookup quest $namepart\r\n\r\nLooks up a quest by $namepart, and returns all matches with their quest ID\'s.'),
+('lookup skill',3,'Syntax: .lookup skill $$namepart\r\n\r\nLooks up a skill by $namepart, and returns all matches with their skill ID\'s.'),
+('lookup spell',3,'Syntax: .lookup spell $namepart\r\n\r\nLooks up a spell by $namepart, and returns all matches with their spell ID\'s.'),
+('lookup tele',1,'Syntax: .lookup tele $substring\r\n\r\nSearch and output all .tele command locations with provide $substring in name.'),
+('maxskill',3,'Syntax: .maxskill\r\nSets all skills of the targeted player to their maximum VALUESfor its current level.'),
+('Mod32Value',3,'Syntax: .Mod32Value #field #value\r\n\r\nAdd #value to field #field of your character.'),
+('modify arena',3,'Syntax: .modify arena #value\r\nAdd $amount arena points to the selected player.'),
+('modify aspeed',1,'Syntax: .modify aspeed #rate\r\n\r\nModify all speeds -run,swim,run back,swim back- of the selected player to \"normalbase speed for this move type\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify bit',1,'Syntax: .modify bit #field #bit\r\n\r\nToggle the #bit bit of the #field field for the selected player. If no player is selected, modify your character.'),
+('modify bwalk',1,'Syntax: .modify bwalk #rate\r\n\r\nModify the speed of the selected player while running backwards to \"normal walk back speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify drunk',1,'Syntax: .modify drunk #value\r\n Set drunk level to #value (0..100). Value 0 remove drunk state, 100 is max drunked state.'),
+('modify energy',1,'Syntax: .modify energy #energy\r\n\r\nModify the energy of the selected player. If no player is selected, modify your energy.'),
+('modify faction',1,'Syntax: .modify faction #factionid #flagid #npcflagid #dynamicflagid\r\n\r\nModify the faction and flags of the selected creature. Without arguments, display the faction and flags of the selected creature.'),
+('modify gender',2,'Syntax: .modify gender male/female\r\n\r\nChange gender of selected player.'),
+('modify honor',1,'Syntax: .modify honor $amount\r\n\r\nAdd $amount honor points to the selected player.'),
+('modify hp',1,'Syntax: .modify hp #newhp\r\n\r\nModify the hp of the selected player. If no player is selected, modify your hp.'),
+('modify mana',1,'Syntax: .modify mana #newmana\r\n\r\nModify the mana of the selected player. If no player is selected, modify your mana.'),
+('modify money',1,'Syntax:\r\n.modify money #money\r\n.money #money\r\n\r\nAdd or remove money to the selected player. If no player is selected, modify your money.\r\n\r\n #gold can be negative to remove money.'),
+('modify morph',2,'Syntax: .modify morph #displayid\r\n\r\nChange your current model id to #displayid.'),
+('modify mount',1,'Syntax:\r\n.modify mount #id #speed\r\nDisplay selected player as mounted at #id creature and set speed to #speed value.'),
+('modify rage',1,'Syntax: .modify rage #newrage\r\n\r\nModify the rage of the selected player. If no player is selected, modify your rage.'),
+('modify rep',2,'Syntax: .modify rep #repId (#repvalue | $rankname [#delta])\r\nSets the selected players reputation with faction #repId to #repvalue or to $reprank.\r\nIf the reputation rank name is provided, the resulting reputation will be the lowest reputation for that rank plus the delta amount, if specified.\r\nYou can use \'.pinfo rep\' to list all known reputation ids, or use \'.lookup faction $name\' to locate a specific faction id.'),
+('modify scale',1,''),
+('modify speed',1,'Syntax:\r\n.modify speed #rate\r\n.speed #rate\r\n\r\nModify the running speed of the selected player to \"normal base run speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify spell',1,''),
+('modify swim',1,'Syntax: .modify swim #rate\r\n\r\nModify the swim speed of the selected player to \"normal swim speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify titles',1,'Syntax:\r\n.modify titles #mask\r\n\r\nAllows user to use all titles from #mask.\r\n\r\n #mask=0 disables the title-choose-field'),
+('movegens',3,'Syntax: .movegens\r\n Show movement generators stack for selected creature or player.'),
+('mute',1,'Syntax: .mute $playerName $timeInMinutes\r\n\r\nDisible chat messaging for any character from account of character $playerName at $timeInMinutes minutes.'),
+('namego',1,'Syntax: .namego $charactername\r\n\r\nTeleport the given character to you.'),
+('neargrave',3,'Syntax: .neargrave [alliance|horde]\r\n\r\nFind nearest graveyard linked to zone (or only nearest from accepts alliance or horde faction ghosts).'),
+('notify',1,'Syntax: .notify $MessageToBroadcast\r\n\r\nSend a global message to all players online in screen.'),
+('npc add',2,'Syntax: .npc add #creatureid\r\n\r\nSpawn a creature by the given template id of #creatureid.'),
+('npc additem',2,'Syntax: .npc additem #itemId <#maxcount><#incrtime><#extendedcost>r\r\n\r\nAdd item #itemid to item list of selected vendor. Also optionally set max count item in vendor item list and time to item count restoring and items ExtendedCost.'),
+('npc addweapon',3,'Not yet implemented.'),
+('npc allowmove',3,'Syntax: .npc allowmove\r\n\r\nEnable or disable movement for the selected creature.'),
+('npc changelevel',2,'Syntax: .npc changelevel #level\r\n\r\nChange the level of the selected creature to #level.\r\n\r\n#level may range from 1 to 63.'),
+('npc delete',2,'Syntax: .npc delete [#guid]\r\n\r\nDelete creature with guid #guid (or the selected if no guid is provided)'),
+('npc delitem',2,'Syntax: .npc delitem #itemId\r\n\r\nRemove item #itemid from item list of selected vendor.'),
+('npc factionid',2,'Syntax: .npc factionid #factionid\r\n\r\nSet the faction of the selected creature to #factionid.'),
+('npc flag',2,'Syntax: .npc flag #npcflag\r\n\r\nSet the NPC flags of creature template of the selected creature and selected creature to #npcflag. NPC flags will applied to all creatures of selected creature template after server restart or grid unload/load.'),
+('npc follow',2,'Syntax: .npc follow\r\n\r\nSelected creature start follow you until death/fight/etc.'),
+('npc info',3,'Syntax: .npc info\r\n\r\nDisplay a list of details for the selected creature.\r\n\r\nThe list includes:\r\n- GUID, Faction, NPC flags, Entry ID, Model ID,\r\n- Level,\r\n- Health (current/maximum),\r\n\r\n- Field flags, dynamic flags, faction template, \r\n- Position information,\r\n- and the creature type, e.g. if the creature is a vendor.'),
+('npc move',2,'Syntax: .npc move [#creature_guid]\r\n\r\nMove the targeted creature spawn point to your coordinates.'),
+('npc name',2,'Syntax: .npc name $name\r\n\r\nChange the name of the selected creature or character to $name.\r\n\r\nCommand disabled.'),
+('npc playemote',3,'Syntax: .npc playemote #emoteid\r\n\r\nMake the selected creature emote with an emote of id #emoteid.'),
+('npc setmodel',2,'Syntax: .npc setmodel #displayid\r\n\r\nChange the model id of the selected creature to #displayid.'),
+('npc setmovetype',2,'Syntax: .npc setmovetype [#creature_guid] stay/random/way [NODEL]\r\n\r\nSet for creature pointed by #creature_guid (or selected if #creature_guid not provided) movement type and move it to respawn position (if creature alive). Any existing waypoints for creature will be removed from the database if you do not use NODEL. If the creature is dead then movement type will applied at creature respawn.\r\nMake sure you use NODEL, if you want to keep the waypoints.'),
+('npc spawndist',2,'Syntax: .npc spawndist #dist\r\n\r\nAdjust spawndistance of selected creature to dist.'),
+('npc spawntime',2,'Syntax: .npc spawntime #time \r\n\r\nAdjust spawntime of selected creature to time.'),
+('npc subname',2,'Syntax: .npc subname $Name\r\n\r\nChange the subname of the selected creature or player to $Name.\r\n\r\nCommand disabled.'),
+('npc tame',2,'Syntax: .npc tame\r\n\r\nTame selected creature (tameable non pet creature). You don''t must have pet.'),
+('npc textemote',3,'Syntax: .npc textemote #emoteid\r\n\r\nMake the selected creature to do textemote with an emote of id #emoteid.'),
+('npc whisper',1,'Syntax: .npc whisper #playerguid #text\r\nMake the selected npc whisper #text to #playerguid.'),
+('npc unfollow',2,'Syntax: .npc unfollow\r\n\r\nSelected creature (non pet) stop follow you.'),
+('password',0,'Syntax: .password $old_password $new_password $new_password\r\n\r\nChange your account password.'),
+('pdump write',3,'Syntax is: pdump write $filename $playerNameOrGUID\r\nWrite character dump with name/guid $playerNameOrGUID to file $filename.'),
+('pdump load',3,'Syntax is: pdump load $filename $account [$newname] [$newguid]\r\nLoad character dump from dump file into character list of $account with saved or $newname, with saved (or first free) or $newguid guid.'),
+('pinfo',2,'Syntax: .pinfo [$player_name] [rep]\r\n\r\nOutput account information for selected player or player find by $player_name. If \"rep\" parameter provided show reputation information for player.'),
+('plimit',3,'Syntax: .plimit [#num|-1|-2|-3|reset|player|moderator|gamemaster|administrator]\r\n\r\nWithout arg show current player amount and security level limitations for login to server, with arg set player linit ($num > 0) or securiti limitation ($num < 0 or security leme name. With `reset` sets player limit to the one in the config file'),
+('quest add',3,'Syntax: .quest add #quest_id\r\n\r\nAdd to character quest log quest #quest_id. Quest started from item can\'t be added by this command but correct .additem call provided in command output.'),
+('quest complete',3,'Syntax: .quest complete #questid\r\nMark all quest objectives as completed for target character active quest. After this target character can go and get quest reward.'),
+('quest remove',3,'Syntax: .quest remove #quest_id\r\n\r\nSet quest #quest_id state to not completed and not active (and remove from active quest list) for selected player.'),
+('recall',1,'Syntax: .recall [$playername]\r\n\r\nTeleport $playername or selected player to the place where he has been before last use of a teleportation command. If no $playername is entered and no player is selected, it will teleport you.'),
+('reload',3,'Syntax: .reload table_name\r\n\r\nReload table `table_name` if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all',3,'Syntax: .reload all\r\n\r\nReload all tables with reload support added and that can be _safe_ reloaded.'),
+('reload all_area',3,'Syntax: .reload all_area\r\n\r\nReload all `areatrigger_*` tables if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all_loot',3,'Syntax: .reload all_loot\r\n\r\nReload all `*_loot_template` tables. This can be slow operation with lags for server run.'),
+('reload all_quest',3,'Syntax: .reload all_quest\r\n\r\nReload all quest related tables if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all_spell',3,'Syntax: .reload all_spell\r\n\r\nReload all `spell_*` tables with reload support added and that can be _safe_ reloaded.'),
+('reload all_locales',3,'Syntax: .reload all_locales\r\n\r\nReload all `locales_*` tables with reload support added and that can be _safe_ reloaded.'),
+('reload config',3,'Syntax: .reload config\r\n\r\nReload config settings (by default stored in mangosd.conf). Not all settings can be change at reload: some new setting values will be ignored until restart, some values will applied with delay or only to new objects/maps, some values will explicitly rejected to change at reload.'),
+('repairitems',2,'Syntax: .repairitems\r\n\r\nRepair all selected player''s items.'),
+('reset all',3,'Syntax: .reset all spells\r\n\r\nSyntax: .reset all talents\r\n\r\nRequest reset spells or talents at next login each existed character.'),
+('reset honor',3,'Syntax:\r\n.reset honor [Playername]\r\n Reset all honor data for targeted character.'),
+('reset level',3,'Syntax:\r\n.reset level [Playername]\r\n Reset level to 1 including reset stats and talents. Equipped items with greater level requirement can be lost.'),
+('reset spells',3,'Syntax:\r\n.reset spells [Playername]\r\n Removes all non-original spells from spellbook.\r\n. Playername can be name of offline character.'),
+('reset stats',3,'Syntax:\r\n.reset stats [Playername]\r\n Resets(recalculate) all stats of the targeted player to their original VALUESat current level.'),
+('reset talents',3,'Syntax:\r\n.reset talents [Playername]\r\n Removes all talents of the targeted player. Playername can be name of offline character.'),
+('respawn',3,'Syntax: .respawn\r\n\r\nRespawn selected creature or respawn all nearest creatures (if none selected) and GO without waiting respawn time expiration.'),
+('revive',3,'Syntax: .revive\r\n\r\nRevive the selected player. If no player is selected, it will revive you.'),
+('save',0,'Syntax: .save\r\n\r\nSaves your character.'),
+('saveall',1,'Syntax: .saveall\r\n\r\nSave all characters in game.'),
+('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'),
+('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".'),
+('sendmoney','3','Syntax: .sendmoney #playername "#subject" "#text" #money\r\n\r\nSend mail with money to a player. Subject and mail text must be in "".'),
+('sendmessage',3,'Syntax: .sendmessage $playername $message\r\n\r\nSend screen message to player from ADMINISTRATOR.'),
+('server corpses',2,'Syntax: .server corpses\r\n\r\nTriggering corpses expire check in world.'),
+('server exit',4,'Syntax: .server exit\r\n\r\nTerminate mangosd NOW. Exit code 0.'),
+('server info',0,'Syntax: .server info\r\n\r\nDisplay server version and the number of connected players.'),
+('server idleshutdown',3,'Syntax: .server idleshutdown #delay [#exist_code]\r\n\r\nShut the server down after #delay seconds if no active connections are present (no players). Use #exist_code or 0 as program exist code.'),
+('server idleshutdown cancel',3,'Syntax: .server idleshutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server idlerestart',3,'Syntax: .server idlerestart #delay\r\n\r\nRestart the server after #delay seconds if no active connections are present (no players). Use #exist_code or 2 as program exist code.'),
+('server idlerestart cancel',3,'Syntax: .server idlerestart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server motd',0,'Syntax: .server motd\r\n\r\nShow server Message of the day.'),
+('server restart',3,'Syntax: .server restart #delay\r\n\r\nRestart the server after #delay seconds. Use #exist_code or 2 as program exist code.'),
+('server restart cancel',3,'Syntax: .server restart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server set loglevel',4,'Syntax: .server set loglevel #level\r\n\r\nSet server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).'),
+('server set motd',3,'Syntax: .server set motd $MOTD\r\n\r\nSet server Message of the day.'),
+('server shutdown',3,'Syntax: .server shutdown #delay [#exist_code]\r\n\r\nShut the server down after #delay seconds. Use #exist_code or 0 as program exist code.'),
+('server shutdown cancel',3,'Syntax: .server shutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('setskill',3,'Syntax: .setskill #skill #level [#max]\r\n\r\nSet a skill of id #skill with a current skill value of #level and a maximum value of #max (or equal current maximum if not provide) for the selected character. If no character is selected, you learn the skill.'),
+('showarea',3,'Syntax: .showarea #areaid\r\n\r\nReveal the area of #areaid to the selected character. If no character is selected, reveal this area to you.'),
+('start',0,'Syntax: .start\r\n\r\nTeleport you to the starting area of your character.'),
+('taxicheat',1,'Syntax: .taxicheat on/off\r\n\r\nTemporary grant access or remove to all taxi routes for the selected character. If no character is selected, hide or reveal all routes to you.\r\n\r\nVisited taxi nodes sill accessible after removing access.'),
+('tele',1,'Syntax: .tele #location\r\n\r\nTeleport player to a given location.'),
+('tele add',3,'Syntax: .tele add $name\r\n\r\nAdd current your position to .tele command target locations list with name $name.'),
+('tele del',3,'Syntax: .tele del $name\r\n\r\nRemove location with name $name for .tele command locations list.'),
+('tele group',1,'Syntax: .tele group#location\r\n\r\nTeleport a selected player and his group members to a given location.'),
+('tele name',1,'Syntax: .tele name #playername #location\r\n\r\nTeleport a player to a given location.'),
+('ticket',2,'Syntax: .ticket on\r\n .ticket off\r\n .ticket #num\r\n .ticket $character_name\r\n\r\non/off for GMs to show or not a new ticket directly, $character_name to show ticket of this character, #num to show ticket #num.'),
+('unaura',3,'Syntax: .unaura #spellid\r\n\r\nRemove aura due to spell #spellid from the selected Unit.'),
+('unban account',3,'Syntax is: unban account $Name\r\nUnban accounts for account name pattern.'),
+('unban character',3,'Syntax is: unban character $Name\r\nUnban accounts for character name pattern.'),
+('unban ip',3,'Syntax is: unban ip $Ip\r\nUnban accounts for IP pattern.'),
+('unlearn',3,'Syntax: .unlearn #startspell #endspell\r\n\r\nUnlearn for selected player the range of spells between id #startspell and #endspell. If no #endspell is provided, just unlearn spell of id #startspell.'),
+('unmute',1,'Syntax: .unmute $playerName\r\n\r\nRestore chat messaging for any character from account of character $playerName.'),
+('waterwalk',2,'Syntax: .waterwalk on/off\r\n\r\nSet on/off waterwalk state for selected player.'),
+('wchange',3,'Syntax: .wchange #weathertype #status\r\n\r\nSet current weather to #weathertype with an intensity of #status.\r\n\r\n#weathertype can be 1 for rain, 2 for snow, and 3 for sand. #status can be 0 for disabled, and 1 for enabled.'),
+('whispers',1,'Syntax: .whispers on|off\r\nEnable/disable accepting whispers by GM from players. By default use mangosd.conf setting.'),
+('wp',2,'Using WP Command:\r\nEach Waypoint Command has it\'s own description!'),
+('wp add',2,'Syntax: .wp add [#creature_guid or Select a Creature]'),
+('wp export',3,'Syntax: .wp export [#creature_guid or Select a Creature] $filename'),
+('wp import',3,'Syntax: .wp import $filename'),
+('wp modify',2,'Syntax: .wp modify [#creature_guid or Select a Creature]\r\nadd - Add a waypoint after the selected visual\r\nwaittime $time\r\nemote ID\r\nspell ID\r\ntext1| text2| text3| text4| text5 <text>\r\nmodel1 ID\r\nmodel2 ID\r\nmove(moves wp to player pos)\r\ndel (deletes the wp)\r\n\r\nOnly one parameter per time!'),
+('wp show',2,'Syntax: .wp show [#creature_guid or Select a Creature]\r\non\r\nfirst\r\nlast\r\noff\r\ninfo\r\n\r\nFor using info you have to do first show on and than select a Visual-Waypoint and do the show info!');
/*!40000 ALTER TABLE `command` ENABLE KEYS */;
UNLOCK TABLES;
@@ -201,7 +454,7 @@ CREATE TABLE `creature` (
`MovementType` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`guid`),
KEY `idx_map` (`map`),
- KEY `idx_id` (`id`)
+ KEY `index_id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Creature System';
--
@@ -219,7 +472,7 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `creature_addon`;
CREATE TABLE `creature_addon` (
- `guid` int(10) unsigned NOT NULL default '0',
+ `guid` int(11) unsigned NOT NULL default '0',
`path_id` int(11) unsigned NOT NULL default '0',
`mount` mediumint(8) unsigned NOT NULL default '0',
`bytes0` int(10) unsigned NOT NULL default '0',
@@ -229,7 +482,7 @@ CREATE TABLE `creature_addon` (
`moveflags` int(10) unsigned NOT NULL default '0',
`auras` text,
PRIMARY KEY (`guid`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `creature_addon`
@@ -247,15 +500,9 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `creature_equip_template`;
CREATE TABLE `creature_equip_template` (
`entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Unique entry',
- `equipmodel1` mediumint(8) unsigned NOT NULL default '0',
- `equipmodel2` mediumint(8) unsigned NOT NULL default '0',
- `equipmodel3` mediumint(8) unsigned NOT NULL default '0',
- `equipinfo1` int(10) unsigned NOT NULL default '0',
- `equipinfo2` int(10) unsigned NOT NULL default '0',
- `equipinfo3` int(10) unsigned NOT NULL default '0',
- `equipslot1` int(11) NOT NULL default '0',
- `equipslot2` int(11) NOT NULL default '0',
- `equipslot3` int(11) NOT NULL default '0',
+ `equipentry1` mediumint(8) unsigned NOT NULL default '0',
+ `equipentry2` mediumint(8) unsigned NOT NULL default '0',
+ `equipentry3` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Creature System (Equipment)';
@@ -327,7 +574,7 @@ CREATE TABLE `creature_loot_template` (
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`item`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
--
-- Dumping data for table `creature_loot_template`
@@ -456,7 +703,7 @@ CREATE TABLE `creature_template` (
`faction_A` smallint(5) unsigned NOT NULL default '0',
`faction_H` smallint(5) unsigned NOT NULL default '0',
`npcflag` int(10) unsigned NOT NULL default '0',
- `speed` float default '1',
+ `speed` float NOT NULL default '1',
`scale` float NOT NULL default '1',
`rank` tinyint(3) unsigned NOT NULL default '0',
`mindmg` float NOT NULL default '0',
@@ -465,7 +712,7 @@ CREATE TABLE `creature_template` (
`attackpower` int(10) unsigned NOT NULL default '0',
`baseattacktime` int(10) unsigned NOT NULL default '0',
`rangeattacktime` int(10) unsigned NOT NULL default '0',
- `flags` int(10) unsigned NOT NULL default '0',
+ `unit_flags` int(10) unsigned NOT NULL default '0',
`dynamicflags` int(10) unsigned NOT NULL default '0',
`family` tinyint(4) NOT NULL default '0',
`trainer_type` tinyint(4) NOT NULL default '0',
@@ -476,7 +723,7 @@ CREATE TABLE `creature_template` (
`maxrangedmg` float NOT NULL default '0',
`rangedattackpower` smallint(5) unsigned NOT NULL default '0',
`type` tinyint(3) unsigned NOT NULL default '0',
- `flag1` int(10) unsigned NOT NULL default '0',
+ `type_flags` int(10) unsigned NOT NULL default '0',
`lootid` mediumint(8) unsigned NOT NULL default '0',
`pickpocketloot` mediumint(8) unsigned NOT NULL default '0',
`skinloot` mediumint(8) unsigned NOT NULL default '0',
@@ -502,8 +749,7 @@ CREATE TABLE `creature_template` (
`mechanic_immune_mask` int(10) unsigned NOT NULL default '0',
`flags_extra` int(10) unsigned NOT NULL default '0',
`ScriptName` char(64) NOT NULL default '',
- PRIMARY KEY (`entry`),
- KEY `idx_name` (`name`)
+ PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System';
--
@@ -512,6 +758,8 @@ CREATE TABLE `creature_template` (
LOCK TABLES `creature_template` WRITE;
/*!40000 ALTER TABLE `creature_template` DISABLE KEYS */;
+INSERT INTO `creature_template` VALUES
+(1,1,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,1,1,64,64,0,0,0,35,35,0,0.91,1,0,14,15,0,100,2000,2200,4096,0,8,0,0,0,0,1.76,2.42,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,0,1,0,0,0x82,'');
/*!40000 ALTER TABLE `creature_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -613,7 +861,7 @@ CREATE TABLE `event_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -772,6 +1020,78 @@ CREATE TABLE `exploration_basexp` (
LOCK TABLES `exploration_basexp` WRITE;
/*!40000 ALTER TABLE `exploration_basexp` DISABLE KEYS */;
+INSERT INTO `exploration_basexp` VALUES
+(0,0),
+(1,5),
+(2,15),
+(3,25),
+(4,35),
+(5,45),
+(6,55),
+(7,65),
+(8,70),
+(9,80),
+(10,85),
+(11,90),
+(12,90),
+(13,90),
+(14,100),
+(15,105),
+(16,115),
+(17,125),
+(18,135),
+(19,145),
+(20,155),
+(21,165),
+(22,175),
+(23,185),
+(24,195),
+(25,200),
+(26,210),
+(27,220),
+(28,230),
+(29,240),
+(30,245),
+(31,250),
+(32,255),
+(33,265),
+(34,270),
+(35,275),
+(36,280),
+(37,285),
+(38,285),
+(39,300),
+(40,315),
+(41,330),
+(42,345),
+(43,360),
+(44,375),
+(45,390),
+(46,405),
+(47,420),
+(48,440),
+(49,455),
+(50,470),
+(51,490),
+(52,510),
+(53,530),
+(54,540),
+(55,560),
+(56,580),
+(57,600),
+(58,620),
+(59,640),
+(60,660),
+(61,970),
+(62,1000),
+(63,1050),
+(64,1080),
+(65,1100),
+(66,1130),
+(67,1160),
+(68,1200),
+(69,1230),
+(70,1250);
/*!40000 ALTER TABLE `exploration_basexp` ENABLE KEYS */;
UNLOCK TABLES;
@@ -791,7 +1111,7 @@ CREATE TABLE `fishing_loot_template` (
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`item`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
--
-- Dumping data for table `fishing_loot_template`
@@ -1229,7 +1549,7 @@ CREATE TABLE `gameobject_loot_template` (
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`item`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
--
-- Dumping data for table `gameobject_loot_template`
@@ -1293,7 +1613,7 @@ CREATE TABLE `gameobject_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -1348,8 +1668,7 @@ CREATE TABLE `gameobject_template` (
`data22` int(10) unsigned NOT NULL default '0',
`data23` int(10) unsigned NOT NULL default '0',
`ScriptName` varchar(64) NOT NULL default '',
- PRIMARY KEY (`entry`),
- KEY `idx_name` (`name`)
+ PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Gameobject System';
--
@@ -1387,6 +1706,33 @@ CREATE TABLE `instance_template` (
LOCK TABLES `instance_template` WRITE;
/*!40000 ALTER TABLE `instance_template` DISABLE KEYS */;
+INSERT INTO `instance_template` VALUES
+(33,0,22,30,10,7200,NULL,NULL,NULL,NULL,''),
+(34,0,24,32,10,7200,NULL,NULL,NULL,NULL,''),
+(36,0,15,20,10,7200,NULL,NULL,NULL,NULL,''),
+(43,0,15,21,10,7200,NULL,NULL,NULL,NULL,''),
+(47,0,29,38,10,7200,NULL,NULL,NULL,NULL,''),
+(48,0,24,32,10,7200,NULL,NULL,NULL,NULL,''),
+(70,0,35,47,10,7200,NULL,NULL,NULL,NULL,''),
+(90,0,29,38,10,7200,NULL,NULL,NULL,NULL,''),
+(109,0,45,55,10,7200,NULL,NULL,NULL,NULL,''),
+(129,0,37,46,10,7200,NULL,NULL,NULL,NULL,''),
+(189,0,34,45,10,7200,NULL,NULL,NULL,NULL,''),
+(209,0,44,54,10,7200,NULL,NULL,NULL,NULL,''),
+(229,0,58,0,10,120000,78.5083,-225.044,49.839,5.1,''),
+(230,0,52,0,5,7200,NULL,NULL,NULL,NULL,''),
+(249,0,60,0,40,432000,NULL,NULL,NULL,NULL,''),
+(289,0,57,0,5,7200,NULL,NULL,NULL,NULL,''),
+(309,0,60,0,20,259200,NULL,NULL,NULL,NULL,''),
+(329,0,58,60,5,7200,NULL,NULL,NULL,NULL,''),
+(349,0,46,55,10,7200,NULL,NULL,NULL,NULL,''),
+(389,0,13,18,10,7200,NULL,NULL,NULL,NULL,''),
+(409,0,60,0,40,604800,NULL,NULL,NULL,NULL,''),
+(429,0,55,60,5,7200,NULL,NULL,NULL,NULL,''),
+(469,0,60,0,40,604800,NULL,NULL,NULL,NULL,''),
+(509,0,60,0,20,259200,NULL,NULL,NULL,NULL,''),
+(531,0,60,0,40,604800,NULL,NULL,NULL,NULL,''),
+(533,0,60,0,40,604800,NULL,NULL,NULL,NULL,'');
/*!40000 ALTER TABLE `instance_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -1422,7 +1768,7 @@ CREATE TABLE `item_loot_template` (
`ChanceOrQuestChance` float NOT NULL default '100',
`groupid` tinyint(3) unsigned NOT NULL default '0',
`mincountOrRef` mediumint(9) NOT NULL default '1',
- `maxcount` smallint(5) unsigned NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
`lootcondition` tinyint(3) unsigned NOT NULL default '0',
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
@@ -1470,6 +1816,7 @@ CREATE TABLE `item_template` (
`maxcount` smallint(5) unsigned NOT NULL default '0',
`stackable` smallint(5) unsigned NOT NULL default '1',
`ContainerSlots` tinyint(3) unsigned NOT NULL default '0',
+ `StatsCount` tinyint(3) unsigned NOT NULL default '0',
`stat_type1` tinyint(3) unsigned NOT NULL default '0',
`stat_value1` smallint(6) NOT NULL default '0',
`stat_type2` tinyint(3) unsigned NOT NULL default '0',
@@ -1490,6 +1837,8 @@ CREATE TABLE `item_template` (
`stat_value9` smallint(6) NOT NULL default '0',
`stat_type10` tinyint(3) unsigned NOT NULL default '0',
`stat_value10` smallint(6) NOT NULL default '0',
+ `ScalingStatDistribution` smallint(6) NOT NULL default '0',
+ `ScalingStatValue` smallint(6) NOT NULL default '0',
`dmg_min1` float NOT NULL default '0',
`dmg_max1` float NOT NULL default '0',
`dmg_type1` tinyint(3) unsigned NOT NULL default '0',
@@ -1567,7 +1916,7 @@ CREATE TABLE `item_template` (
`area` mediumint(8) unsigned NOT NULL default '0',
`Map` smallint(6) NOT NULL default '0',
`BagFamily` mediumint(9) NOT NULL default '0',
- `TotemCategory` tinyint(4) NOT NULL default '0',
+ `TotemCategory` mediumint(9) NOT NULL default '0',
`socketColor_1` tinyint(4) NOT NULL default '0',
`socketContent_1` mediumint(9) NOT NULL default '0',
`socketColor_2` tinyint(4) NOT NULL default '0',
@@ -1578,14 +1927,14 @@ CREATE TABLE `item_template` (
`GemProperties` mediumint(9) NOT NULL default '0',
`RequiredDisenchantSkill` smallint(6) NOT NULL default '-1',
`ArmorDamageModifier` float NOT NULL default '0',
+ `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time',
+ `ItemLimitCategory` smallint(6) NOT NULL default '0',
`ScriptName` varchar(64) NOT NULL default '',
`DisenchantID` mediumint(8) unsigned NOT NULL default '0',
`FoodType` tinyint(3) unsigned NOT NULL default '0',
`minMoneyLoot` int(10) unsigned NOT NULL default '0',
`maxMoneyLoot` int(10) unsigned NOT NULL default '0',
- `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time',
PRIMARY KEY (`entry`),
- KEY `idx_name` (`name`),
KEY `items_index` (`class`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
@@ -1595,6 +1944,94 @@ CREATE TABLE `item_template` (
LOCK TABLES `item_template` WRITE;
/*!40000 ALTER TABLE `item_template` DISABLE KEYS */;
+INSERT INTO `item_template` VALUES
+(25,2,7,-1,'Worn Shortsword',1542,1,0,1,35,7,21,32767,511,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,1,0,0,0,1,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(35,2,10,-1,'Bent Staff',472,1,0,1,47,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,2,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(36,2,4,-1,'Worn Mace',5194,1,0,1,38,7,21,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(37,2,0,-1,'Worn Axe',14029,1,0,1,38,7,21,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(38,4,0,-1,'Recruit\'s Shirt',9891,1,0,1,1,1,4,-1,-1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(39,4,1,-1,'Recruit\'s Pants',9892,0,0,1,5,1,7,32767,511,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(40,4,0,-1,'Recruit\'s Boots',10141,1,0,1,4,1,8,32767,511,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(43,4,0,-1,'Squire\'s Boots',9938,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(44,4,1,-1,'Squire\'s Pants',9937,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(45,4,0,-1,'Squire\'s Shirt',3265,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(47,4,0,-1,'Footpad\'s Shoes',9915,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(48,4,1,-1,'Footpad\'s Pants',9913,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(49,4,0,-1,'Footpad\'s Shirt',9906,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(51,4,0,-1,'Neophyte\'s Boots',9946,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(52,4,1,-1,'Neophyte\'s Pants',9945,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(53,4,0,-1,'Neophyte\'s Shirt',9944,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(55,4,0,-1,'Apprentice\'s Boots',9929,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(56,4,1,-1,'Apprentice\'s Robe',12647,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(57,4,1,-1,'Acolyte\'s Robe',12645,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(59,4,0,-1,'Acolyte\'s Shoes',3261,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(117,0,0,-1,'Tough Jerky',2473,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(120,4,1,-1,'Thug Pants',10006,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(121,4,0,-1,'Thug Boots',10008,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(127,4,0,-1,'Trapper\'s Shirt',9996,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(139,4,1,-1,'Brawler\'s Pants',9988,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(140,4,0,-1,'Brawler\'s Boots',9992,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(147,4,1,-1,'Rugged Trapper\'s Pants',9975,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(148,4,0,-1,'Rugged Trapper\'s Shirt',9976,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(153,4,2,-1,'Primitive Kilt',10050,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,8,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(154,4,0,-1,'Primitive Mantle',10058,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(159,0,0,-1,'Refreshing Spring Water',18084,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,430,0,-1,0,-1,59,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(1395,4,1,-1,'Apprentice\'s Pants',9924,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(1396,4,1,-1,'Acolyte\'s Pants',3260,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2070,0,0,-1,'Darnassian Bleu',6353,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2092,2,15,-1,'Worn Dagger',6442,1,0,1,35,7,13,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1600,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,3,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2101,1,2,-1,'Light Quiver',21328,1,0,1,4,1,18,2047,255,1,1,0,0,0,0,0,0,0,0,1,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,14824,1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2102,1,3,-1,'Small Ammo Pouch',1816,1,0,1,4,1,18,2047,255,1,1,0,0,0,0,0,0,0,0,1,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,14824,1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2105,4,0,-1,'Thug Shirt',10005,1,0,1,5,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2361,2,5,-1,'Battleworn Hammer',8690,1,0,1,45,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,1,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2362,4,6,-1,'Worn Wooden Shield',18730,0,0,1,7,1,14,32767,511,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,4,0,0,1,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2504,2,2,-1,'Worn Shortbow',8106,1,0,1,29,5,15,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2300,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2508,2,3,-1,'Old Blunderbuss',6606,1,0,1,27,5,26,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2300,3,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2512,6,2,-1,'Rough Arrow',5996,1,0,1,10,0,24,2047,255,5,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2516,6,3,-1,'Light Shot',5998,1,0,1,10,0,24,2047,255,5,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2947,2,16,-1,'Small Throwing Knife',16754,1,0,1,15,0,25,2047,255,3,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,4,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(3661,2,10,-1,'Handcrafted Staff',18530,1,0,1,45,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,2,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4536,0,0,-1,'Shiny Red Apple',6410,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4540,0,0,-1,'Tough Hunk of Bread',6399,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4604,0,0,-1,'Forest Mushroom Cap',15852,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6096,4,0,-1,'Apprentice\'s Shirt',2163,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6097,4,0,-1,'Acolyte\'s Shirt',2470,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6098,4,1,-1,'Neophyte\'s Robe',12679,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6119,4,1,-1,'Neophyte\'s Robe',12681,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6123,4,1,-1,'Novice\'s Robe',12683,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6124,4,1,-1,'Novice\'s Pants',9987,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6125,4,0,-1,'Brawler\'s Harness',9995,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6126,4,1,-1,'Trapper\'s Pants',10002,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6127,4,0,-1,'Trapper\'s Boots',10003,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6129,4,1,-1,'Acolyte\'s Robe',12646,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6134,4,0,-1,'Primitive Mantle',10108,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6135,4,2,-1,'Primitive Kilt',10109,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,8,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6139,4,1,-1,'Novice\'s Robe',12684,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6140,4,1,-1,'Apprentice\'s Robe',12649,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6144,4,1,-1,'Neophyte\'s Robe',12680,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6948,15,0,-1,'Hearthstone',6418,1,64,1,0,0,0,32767,511,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8690,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(12282,2,1,-1,'Worn Battleaxe',22291,1,0,1,43,8,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,1,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14646,12,0,-1,'Northshire Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14647,12,0,-1,'Coldridge Valley Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14648,12,0,-1,'Shadowglen Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5842,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14649,12,0,-1,'Valley of Trials Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5843,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14650,12,0,-1,'Camp Narache Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14651,12,0,-1,'Deathknell Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5847,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(25861,2,16,-1,'Crude Throwing Axe',20777,1,0,1,15,0,25,2047,255,3,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,4,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(34648,4,4,-1,'Acherus Knight\'s Greaves',51496,2,32768,1,51,10,8,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,10,7,12,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34649,4,4,-1,'Acherus Knight\'s Gauntlets',51498,2,32768,1,34,6,10,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,6,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34650,4,4,-1,'Acherus Knight\'s Tunic',51494,2,32768,1,69,13,5,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,20,7,11,32,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,570,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34651,4,4,-1,'Acherus Knight\'s Girdle',51497,2,32768,1,35,7,6,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,10,32,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,320,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34652,4,4,-1,'Acherus Knight\'s Hood',51495,2,32768,1,52,10,1,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,15,32,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,463,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34653,4,4,-1,'Acherus Knight\'s Wristguard',51500,2,32768,1,36,7,9,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,7,31,7,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34655,4,4,-1,'Acherus Knight\'s Pauldrons',51501,2,32768,1,54,10,3,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,9,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34656,4,4,-1,'Acherus Knight\'s Cover',51499,2,32768,1,73,14,7,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,13,3,10,7,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34657,4,0,-1,'Choker of Damnation',6539,2,32768,1,2303,575,2,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,9,7,8,31,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34658,4,0,-1,'Plague Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34659,4,1,-1,'Acherus Knight\'s Shroud',49738,2,32768,1,31,6,16,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38145,1,0,-1,'Deathweave Bag',1282,1,32768,1,0,0,18,-1,-1,35,0,0,0,0,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38147,4,0,-1,'Corrupted Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(41751,0,5,-1,'Black Mushroom',36728,1,0,1,100,5,0,-1,-1,65,55,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27094,0,-1,0,0,11,1000,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,'',0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0);
/*!40000 ALTER TABLE `item_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -1703,6 +2140,42 @@ LOCK TABLES `locales_item` WRITE;
/*!40000 ALTER TABLE `locales_item` ENABLE KEYS */;
UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_npc_option`
+--
+
+DROP TABLE IF EXISTS `locales_npc_option`;
+CREATE TABLE `locales_npc_option` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `option_text_loc1` text,
+ `option_text_loc2` text,
+ `option_text_loc3` text,
+ `option_text_loc4` text,
+ `option_text_loc5` text,
+ `option_text_loc6` text,
+ `option_text_loc7` text,
+ `option_text_loc8` text,
+ `box_text_loc1` text,
+ `box_text_loc2` text,
+ `box_text_loc3` text,
+ `box_text_loc4` text,
+ `box_text_loc5` text,
+ `box_text_loc6` text,
+ `box_text_loc7` text,
+ `box_text_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_npc_option`
+--
+
+LOCK TABLES `locales_npc_option` WRITE;
+/*!40000 ALTER TABLE `locales_npc_option` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_npc_option` ENABLE KEYS */;
+UNLOCK TABLES;
+
--
-- Table structure for table `locales_npc_text`
--
@@ -1977,6 +2450,647 @@ LOCK TABLES `locales_quest` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `mangos_string`
+--
+
+DROP TABLE IF EXISTS `mangos_string`;
+CREATE TABLE `mangos_string` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `content_default` text NOT NULL,
+ `content_loc1` text,
+ `content_loc2` text,
+ `content_loc3` text,
+ `content_loc4` text,
+ `content_loc5` text,
+ `content_loc6` text,
+ `content_loc7` text,
+ `content_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `mangos_string`
+--
+
+LOCK TABLES `mangos_string` WRITE;
+/*!40000 ALTER TABLE `mangos_string` DISABLE KEYS */;
+INSERT INTO `mangos_string` VALUES
+(1,'You should select a character or a creature.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(2,'You should select a creature.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(3,'|cffff0000[System Message]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(4,'|cffff0000[Event Message]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(5,'There is no help for that command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(6,'There is no such command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(7,'There is no such subcommand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(8,'Command %s have subcommands:%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(9,'Commands available to you:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10,'Incorrect syntax.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(11,'Your account level is: %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(12,'Online players: %u (max: %u) Queued players: %u (max: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(13,'Server uptime: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(14,'Player saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(15,'All players saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(16,'There are the following active GMs on this server:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(17,'There are no GMs currently logged in on this server.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(18,'Cannot do that while flying.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(19,'Cannot do that in Battlegrounds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(20,'Target is flying you can\'t do that.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(21,'%s is flying command failed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(22,'You are not mounted so you can\'t dismount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(23,'Cannot do that while fighting.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(24,'You used it recently.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(25,'Password not changed (unknown error)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(26,'The password was changed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(27,'The new passwords do not match or the old password is wrong',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(28,'Your account is now locked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(29,'Your account is now unlocked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(30,', rank ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(31,' [known]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(32,' [learn]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(33,' [passive]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(34,' [talent]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(35,' [active]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(36,' [complete]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(37,' (offline)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(38,'on',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(39,'off',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(40,'You are: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(41,'visible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(42,'invisible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(43,'done',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(44,'You',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(45,' <unknown> ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(46,'<error>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(47,'<non-existing character>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(48,'UNKNOWN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(49,'You must be at least level %u to enter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(50,'You must be at least level %u and have item %s to enter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(51,'Hello! Ready for some training?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(52,'Invaid item count (%u) for item %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(53,'Mail can\'t have more %u item stacks',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(54,'The new passwords do not match',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(55,'Your password can\'t be longer than 16 characters (client limit), password not changed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(56,'Current Message of the day: \r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(57,'Using World DB: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(58,'Using script library: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(100,'Global notify: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(101,'Map: %u (%s) Zone: %u (%s) Area: %u (%s)\nX: %f Y: %f Z: %f Orientation: %f\ngrid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(102,'%s is already being teleported.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(103,'You can summon a player to your instance only if he is in your party with you as leader.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(104,'You cannot go to the player\'s instance because you are in a party now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(105,'You can go to the player\'s instance while not being in his party only if your GM mode is on.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(106,'You can not go to player %s from instance to instance.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(107,'You can not summon player %s from instance to instance.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(108,'You are summoning %s%s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(109,'You are being summoned by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(110,'You are teleporting %s%s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(111,'You are being teleported by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(112,'Player (%s) does not exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(113,'Appearing at %s\'s location.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(114,'%s is appearing to your location.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(115,'Incorrect values.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(116,'No character selected.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(117,'%s is not in a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(118,'You changed HP of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(119,'%s changed your HP to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(120,'You changed MANA of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(121,'%s changed your MANA to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(122,'You changed ENERGY of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(123,'%s changed your ENERGY to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(124,'Current energy: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(125,'You changed rage of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(126,'%s changed your rage to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(127,'You changed level of %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(128,'GUID %i, faction is %i, flags is %i, npcflag is %i, DY flag is %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(129,'Wrong faction: %u (not found in factiontemplate.dbc).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(130,'You changed GUID=%i \'s Faction to %i, flags to %i, npcflag to %i, dyflag to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(131,'You changed the spellflatid=%i, val= %i, mark =%i to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(132,'%s changed your spellflatid=%i, val= %i, mark =%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(133,'%s has access to all taxi nodes now (until logout).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(134,'%s has no more access to all taxi nodes now (only visited accessible).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(135,'%s has given you access to all taxi nodes (until logout).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(136,'%s has removed access to all taxi nodes (only visited still accessible).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(137,'You set all speeds to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(138,'%s set all your speeds to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(139,'You set the speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(140,'%s set your speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(141,'You set the swim speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(142,'%s set your swim speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(143,'You set the backwards run speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(144,'%s set your backwards run speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(145,'You set the fly speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(146,'%s set your fly speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(147,'You set the size %2.2f of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(148,'%s set your size to %2.2f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(149,'There is no such mount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(150,'You give a mount to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(151,'%s gave you a mount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(152,'USER1: %i, ADD: %i, DIF: %i\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(153,'You take all copper of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(154,'%s took you all of your copper.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(155,'You take %i copper from %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(156,'%s took %i copper from you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(157,'You give %i copper to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(158,'%s gave you %i copper.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(159,'You hear sound %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(160,'USER2: %i, ADD: %i, RESULT: %i\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(161,'Removed bit %i in field %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(162,'Set bit %i in field %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(163,'Teleport location table is empty!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(164,'Teleport location not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(165,'Requires search parameter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(166,'There are no teleport locations matching your request.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(168,'Locations found are:\n %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(169,'Mail sent to %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(170,'You try to hear sound %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(172,'server console command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(200,'No selection.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(201,'Object GUID is: lowpart %u highpart %X',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(202,'The name was too long by %i characters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(203,'Error, name can only contain characters A-Z and a-z.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(204,'The subname was too long by %i characters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(205,'Not yet implemented',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(206,'Item \'%i\' \'%s\' added to list with maxcount \'%i\' and incrtime \'%i\' and extendedcost \'%i\'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(207,'Item \'%i\' not found in database.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(208,'Item \'%i\' \'%s\' deleted from vendor list',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(209,'Item \'%i\' not found in vendor list.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(210,'Item \'%i\' already in vendor list.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(211,'Spells of %s reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(212,'Spells of %s will reset at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(213,'Talents of %s reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(214,'Talents of %s will reset at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(215,'Your spells have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(216,'Your talents have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(217,'Unknown case \'%s\' for .resetall command. Type full correct case name.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(218,'Spells will reset for all players at login. Strongly recommend re-login!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(219,'Talents will reset for all players at login. Strongly recommend re-login!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(220,'Creature (GUID: %u) No waypoint found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(221,'Creature (GUID: %u) Last waypoint not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(222,'Creature (GUID: %u) No waypoint found - used \'wpguid\'. Now trying to find it by its position...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(223,'Creature (GUID: %u) No waypoints found - This is a MaNGOS db problem (single float).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(224,'Selected creature is ignored - provided GUID is used',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(225,'Creature (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(226,'You must select a visual waypoint.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(227,'No visual waypoints found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(228,'Could not create visual waypoint with creatureID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(229,'All visual waypoints removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(230,'Could not create waypoint-creature with ID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(231,'No GUID provided.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(232,'No waypoint number provided.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(233,'Argument required for \'%s\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(234,'Waypoint %i added to GUID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(235,'Waypoint %d added.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(236,'Waypoint changed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(237,'Waypoint %s modified.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(238,'WP export successfull.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(239,'No waypoints found inside the database.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(240,'File imported.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(241,'Waypoint removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(242,'Warning: Could not delete WP from the world with ID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(243,'This happens if the waypoint is too far away from your char.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(244,'The WP is deleted from the database, but not from the world here.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(245,'They will disappear after a server restart.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(246,'Waypoint %d: Info for creature: %s, GUID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(247,'Waittime: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(248,'Model %d: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(249,'Emote: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(250,'Spell: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(251,'Text%d (ID: %i): %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(252,'AIScript: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(253,'Forced rename for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(254,'Forced rename for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(255,'Waypoint-Creature (GUID: %u) Not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(256,'Could not find NPC...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(257,'Creature movement type set to \'%s\', waypoints removed (if any).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(258,'Creature movement type set to \'%s\', waypoints were not removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(259,'Incorrect value, use on or off',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(260,'Value saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(261,'Value saved, you may need to rejoin or clean your client cache.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(262,'Areatrigger ID %u not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(263,'Target map or coordinates is invalid (X: %f Y: %f MapId: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(264,'Zone coordinates is invalid (X: %f Y: %f AreaId: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(265,'Zone %u (%s) is part of instanceable map %u (%s)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(266,'Nothing found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(267,'Object not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(268,'Creature not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(269,'Warning: Mob found more than once - you will be teleported to the first one found in DB.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(270,'Creature Removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(271,'Creature moved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(272,'Creature (GUID:%u) must be on the same map as player!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(273,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(274,'Game Object (GUID: %u) has references in not found creature %u GO list, can\'t be deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(275,'Game Object (GUID: %u) removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(276,'Game Object (GUID: %u) turned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(277,'Game Object (GUID: %u) moved',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(278,'You must select a vendor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(279,'You must send id for item',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(280,'Vendor has too many items (max 128)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(281,'You can\'t kick self, logout instead',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(282,'Player %s kicked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(283,'Player %s not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(284,'Accepting Whisper: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(285,'Accepting Whisper: ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(286,'Accepting Whisper: OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(287,'Creature (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(288,'Tickets count: %i show new tickets: %s\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(289,'New ticket from %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(290,'Ticket of %s (Last updated: %s):\n%s ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(291,'New ticket show: ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(292,'New ticket show: OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(293,'Ticket %i doesn\'t exist',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(294,'All tickets deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(295,'Character %s ticket deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(296,'Ticket deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(297,'Spawn distance changed to: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(298,'Spawn time changed to: %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(299,'The honor of %s was set to %u!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(300,'Your chat has been disabled for %u minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(301,'You have disabled %s\'s chat for %u minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(302,'Player\'s chat is already enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(303,'Your chat has been enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(304,'You have enabled %s\'s chat.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(305, 'Faction %s (%u) reputation of %s was set to %5d!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(306, 'The arena points of %s was set to %u!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(307, 'No faction found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(308, 'Faction %i unknown!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(309, 'Invalid parameter %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(310, 'delta must be between 0 and %d (inclusive)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(311, '%d - |cffffffff|Hfaction:%d|h[%s]|h|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(312, ' [visible]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(313, ' [at war]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(314, ' [peace forced]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(315, ' [hidden]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(316, ' [invisible forced]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(317, ' [inactive]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(318, 'Hated',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(319, 'Hostile',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(320, 'Unfriendly',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(321, 'Neutral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(322, 'Friendly',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(323, 'Honored',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(324, 'Revered',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(325, 'Exalted',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(326, 'Faction %s (%u) can\'not have reputation.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(327, ' [no reputation]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(328,'Characters at account %s (Id: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(329,' %s (GUID %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(330,'No players found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(331,'Extended item cost %u not exist',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(332,'GM mode is ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(333,'GM mode is OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(334,'GM Chat Badge is ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(335,'GM Chat Badge is OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(336,'You repair all %s''s items.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(337,'All your items repaired by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(338,'You set waterwalk mode %s for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(339,'Your waterwalk mode %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(340,'%s is now following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(341,'%s is not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(342,'%s is now not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(343,'Creature (Entry: %u) cannot be tamed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(344,'You already have pet.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(400,'|cffff0000[System Message]:|rScripts reloaded',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(401,'You change security level of account %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(402,'%s changed your security level to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(403,'You have low security level for this.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(404,'Creature movement disabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(405,'Creature movement enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(406,'Weather can\'t be changed for this zone.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(407,'Weather system disabled at server.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(408,'%s is banned for %s. Reason: %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(409,'%s is banned permanently for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(410,'%s %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(411,'%s unbanned.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(412,'There was an error removing the ban on %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(413,'Account not exist: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(414,'There is no such character.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(415,'There is no such IP in banlist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(416,'Account %s has never been banned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(417,'Ban history for account %s:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(418,'Ban Date: %s Bantime: %s Still active: %s Reason: %s Set by: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(419,'Inf.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(420,'Never',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(421,'Yes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(422,'No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(423,'IP: %s\nBan Date: %s\nUnban Date: %s\nRemaining: %s\nReason: %s\nSet by: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(424,'There is no matching IPban.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(425,'There is no matching account.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(426,'There is no banned account owning a character matching this part.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(427,'The following IPs match your pattern:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(428,'The following accounts match your query:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(429,'You learned many spells/skills.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(430,'You learned all spells for class.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(431,'You learned all talents for class.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(432,'You learned all languages.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(433,'You learned all craft skills and recipes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(434,'Could not find \'%s\'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(435,'Invalid item id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(436,'No items found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(437,'Invalid gameobject id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(438,'Found items %u: %u ( inventory %u mail %u auction %u guild %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(439,'Found gameobjects %u: %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(440,'Invalid creature id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(441,'Found creatures %u: %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(442,'No area found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(443,'No item sets found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(444,'No skills found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(445,'No spells found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(446,'No quests found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(447,'No creatures found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(448,'No gameobjects found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(449,'Graveyard #%u doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(450,'Graveyard #%u already linked to zone #%u (current).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(451,'Graveyard #%u linked to zone #%u (current).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(452,'Graveyard #%u can\'t be linked to subzone or not existed zone #%u (internal error).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(454,'No faction in Graveyard with id= #%u , fix your DB',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(455,'invalid team, please fix database',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(456,'any',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(457,'alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(458,'horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(459,'Graveyard #%u (faction: %s) is nearest from linked to zone #%u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(460,'Zone #%u doesn\'t have linked graveyards.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(461,'Zone #%u doesn\'t have linked graveyards for faction: %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(462,'Teleport location already exists!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(463,'Teleport location added.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(464,'Teleport location NOT added: database error.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(465,'Teleport location deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(467,'Target unit has %d auras:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(468,'id: %d eff: %d type: %d duration: %d maxduration: %d name: %s%s%s caster: %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(469,'Target unit has %d auras of type %d:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(470,'id: %d eff: %d name: %s%s%s caster: %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(471,'Quest %u not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(472,'Quest %u started from item. For correct work, please, add item to inventory and start quest in normal way: .additem %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(473,'Quest removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(474,' [rewarded]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(475,' [complete]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(476,' [active]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(477,'%s\'s Fly Mode %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(478,'Opcode %u sent to %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(479,'Character loaded successfully!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(480,'Failed to load the character!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(481,'Character dumped successfully!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(482,'Character dump failed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(483,'Spell %u broken and not allowed to cast or learn!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(484,'Skill %u (%s) for player %s set to %u and current maximum set to %u (without permanent (talent) bonuses).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(485,'Player %s must have skill %u (%s) before using this command.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(486,'Invalid skill id (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(487,'You learned default GM spells/skills.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(488,'You already know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(489,'Target(%s) already know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(490,'%s doesn\'t know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(491,'You already forgot that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(492,'All spell cooldowns removed for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(493,'Spell %u cooldown removed for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(494,'Command : Additem, itemId = %i, amount = %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(495,'Command : Additemset, itemsetId = %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(496,'Removed itemID = %i, amount = %i from %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(497,'Cannot create item \'%i\' (amount: %i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(498,'You need to provide a guild name!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(499,'Player not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(500,'Player already has a guild!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(501,'Guild not created! (already exists?)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(502,'No items from itemset \'%u\' found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(503,'The distance is: (3D) %f (2D) %f yards.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(504,'Item \'%i\' \'%s\' Item Slot %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(505,'Item \'%i\' doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(506,'Item \'%i\' \'%s\' Added to Slot %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(507,'Item save failed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(508,'%d - owner: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(509,'%d - sender: %s (guid: %u account: %u ) receiver: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(510,'%d - owner: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(511,'Wrong link type!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(512,'%d - |cffffffff|Hitem:%d:0:0:0:0:0:0:0|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(513,'%d - |cffffffff|Hquest:%d|h[%s]|h|r %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(514,'%d - |cffffffff|Hcreature_entry:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(515,'%d - |cffffffff|Hcreature:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(516,'%d - |cffffffff|Hgameobject_entry:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(517,'%d - |cffffffff|Hgameobject:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(518,'%d - |cffffffff|Hitemset:%d|h[%s %s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(519,'|cffffffff|Htele:%s|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(520,'%d - |cffffffff|Hspell:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(521,'%d - |cffffffff|Hskill:%d|h[%s %s]|h|r %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(522,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(523,'>> Game Object %s (GUID: %u) at %f %f %f. Orientation %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(524,'Selected object:\n|cffffffff|Hitemset:%d|h[%s]|h|r\nGUID: %u ID: %u\nX: %f Y: %f Z: %f MapId: %u\nOrientation: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(525,'>> Add Game Object \'%i\' (%s) (GUID: %i) added at \'%f %f %f\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(526,'%s (lowguid: %u) movement generators stack:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(527,' Idle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(528,' Random',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(529,' Waypoint',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(530,' Animal random',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(531,' Confused',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(532,' Targeted to player %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(533,' Targeted to creature %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(534,' Targeted to <NULL>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(535,' Home movement to (X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(536,' Home movement used for player?!?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(537,' Taxi flight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(538,' Unknown movement generator (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(539,'Player selected NPC\nGUID: %u.\nFaction: %u.\nnpcFlags: %u.\nEntry: %u.\nDisplayID: %u (Native: %u).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(540,'Level: %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(541,'Health (base): %u. (max): %u. (current): %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(542,'Field Flags: %u.\nDynamic Flags: %u.\nFaction Template: %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(543,'Loot: %u Pickpocket: %u Skinning: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(544,'Position: %f %f %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(545,'*** Is a vendor!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(546,'*** Is a trainer!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(547,'InstanceID: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(548,'Player%s %s (guid: %u) Account: %s (id: %u) GMLevel: %u Last IP: %s Last login: %s Latency: %ums',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(549,'Played time: %s Level: %u Money: %ug%us%uc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(550,'Command .pinfo doesn\'t support \'rep\' option for offline players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(551,'%s has explored all zones now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(552,'%s has no more explored zones.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(553,'%s has explored all zones for you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(554,'%s has hidden all zones from you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(555,'Hover enabled',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(556,'Hover disabled',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(557,'You have been leveled up (%i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(558,'You have been leveled down (%i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(559,'Your level progress has been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(560,'The area has been set as explored.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(561,'The area has been set as not explored.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(562,'GUID=%i \'s updateIndex: %i, value: %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(563,'You change GUID=%i \'s UpdateIndex: %i value to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(564,'The value index %u is too big to %u(count: %u).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(565,'Set %u uint32 Value:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(566,'You Set %u Field:%u to uint32 Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(567,'Set %u float Value:[OPCODE]:%u [VALUE]:%f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(568,'You Set %u Field:%i to float Value: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(569,'Get %u uint32 Value:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(570,'The uint32 value of %u in %u is: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(571,'Get %u float Value:[OPCODE]:%u [VALUE]:%f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(572,'The float of %u value in %u is: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(573,'.Set32Bit:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(574,'You set Bit of Field:%u to Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(575,'.Mod32Value:[OPCODE]:%u [VALUE]:%i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(576,'You modified the value of Field:%u to Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(577,'You are now invisible.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(578,'You are now visible.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(579,'Selected player or creature not have victim.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(580,'You learned all default spells for race/class and completed quests rewarded spells.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(581,'Found near gameobjects (distance %f): %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(582,'SpawnTime: Full:%s Remain:%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(583,'%d - |cffffffff|Hgameevent:%d|h[%s]|h|r%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(584,'No event found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(585,'Event not exist!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(586,'Event %u: %s%s\nStart: %s End: %s Occurence: %s Length: %s\nNext state change: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(587,'Event %u already active!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(588,'Event %u not active!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(589,' Point movement to (X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(590,' Fear movement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(591,' Distract movement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(592,'You have learned all spells in craft: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(593,'Currently Banned Accounts:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(594,'| Account | BanDate | UnbanDate | Banned By | Ban Reason |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(595,'Currently Banned IPs:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(596,'| IP | BanDate | UnbanDate | Banned By | Ban Reason |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(597,'Current gamemasters:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(598,'| Account | GM |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(599,'No gamemasters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(600,'The Alliance wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(601,'The Horde wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(602,'The battle for Warsong Gulch begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(603,'The battle for Warsong Gulch begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(604,'Let the battle for Warsong Gulch begin!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(605,'$n captured the Horde flag!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(606,'$n captured the Alliance flag!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(607,'The Horde flag was dropped by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(608,'The Alliance Flag was dropped by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(609,'The Alliance Flag was returned to its base by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(610,'The Horde flag was returned to its base by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(611,'The Horde flag was picked up by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(612,'The Alliance Flag was picked up by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(613,'The flags are now placed at their bases.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(636,'The Battle for Eye of the Storm begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(637,'The Battle for Eye of the Storm begins in 30 seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(638,'The Battle for Eye of the Storm has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(650,'Alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(651,'Horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(652,'stables',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(653,'blacksmith',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(654,'farm',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(655,'lumber mill',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(656,'mine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(657,'The %s has taken the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(658,'$n has defended the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(659,'$n has assaulted the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(660,'$n claims the %s! If left unchallenged, the %s will control it in 1 minute!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(661,'The Battle for Arathi Basin begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(662,'The Battle for Arathi Basin begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(663,'The Battle for Arathi Basin has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(664,'The Alliance has gathered $1776W resources, and is near victory!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(665,'The Horde has gathered $1777W resources, and is near victory!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(666,'After your recent battle in %s our best attempts to award you a Mark of Honor failed. Enclosed you will find the Mark of Honor we were not able to deliver to you at the time. Thanks for fighting in %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(700,'You must be level %u to form an arena team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(701,'One minute until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(702,'Thirty seconds until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(703,'Fifteen seconds until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(704,'The Arena battle has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(705,'You must wait %s before speaking again.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(706,'This item(s) have problems with equipping/storing in inventory.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(707,'%s wishes to not be disturbed and cannot receive whisper messages: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(708,'%s is Away from Keyboard: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(709,'Do not Disturb',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(710,'Away from Keyboard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(711,'Queue status for %s (Lvl: %u to %u)\nQueued alliances: %u (Need at least %u more)\nQueued hordes: %u (Need at least %u more)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u (Need: %u), H: %u (Needs %u)|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(713,'You must be level %u to join an arena team!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(714,'%s is not high enough level to join your team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(715,'You don\'t meet Battleground level requirements',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(716,'Your arena team is full, %s cannot join it.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(801,'You do not have enough gold',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(802,'You do not have enough free slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(803,'Your partner does not have enough free bag slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(804,'You do not have permission to perform that function',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(805,'Unknown language',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(806,'You don\'t know that language',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(807,'Please provide character name',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(808,'Player %s not found or offline',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(809,'Account for character %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1000,'Exiting daemon...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1001,'Account deleted: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1002,'Account %s NOT deleted (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1003,'Account %s NOT deleted (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1004,'Account created: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1005,'Account name can\'t be longer than 16 characters (client limit), account not created!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1006,'Account with this name already exist!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1010,'| Account | Character | IP | GM | TBC |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1011,'|<Error> | %20s |<Error> |<Er>|<Err>|',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1100,'Account %s (Id: %u) have up to %u expansion allowed now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1101,'Message of the day changed to:\r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1102,'Message sent to %s: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1103,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1104,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1105,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1106,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1107,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1108,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1109,'%d - %s %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1110,'%d - %s X:%f Y:%f Z:%f MapId:%d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1111,'%d - %s X:%f Y:%f Z:%f MapId:%d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1112,'Failed to open file: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1113,'Account %s (%u) have max amount allowed characters (client limit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1114,'Dump file have broken data!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1115,'Invalid character name!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1116,'Invalid character guid!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1117,'Character guid %u in use!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1118,'%d - guild: %s (guid: %u) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1119,'You must use male or female as gender.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1120,'You change gender of %s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1121,'Your gender changed to %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1122,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1123,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1124,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1125,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1126,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1127,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1128,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1129,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1130,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1131,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1132,'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1133,'Someone in your party is Deserter. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1134,'Someone in your party is already in three battleground queues. You cannot join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1135,'You cannot teleport to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1136,'You cannot summon players to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1137,'You must be in GM mode to teleport to a player in a battleground.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1138,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+/*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `milling_loot_template`
+--
+
+DROP TABLE IF EXISTS `milling_loot_template`;
+CREATE TABLE `milling_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `milling_loot_template`
+--
+
+LOCK TABLES `milling_loot_template` WRITE;
+/*!40000 ALTER TABLE `milling_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `milling_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `npc_gossip`
--
@@ -2023,12 +3137,15 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `npc_option`;
CREATE TABLE `npc_option` (
- `id` tinyint(3) unsigned NOT NULL default '0',
- `gossip_id` tinyint(3) unsigned NOT NULL default '0',
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `gossip_id` mediumint(8) unsigned NOT NULL default '0',
`npcflag` int(10) unsigned NOT NULL default '0',
`icon` tinyint(3) unsigned NOT NULL default '0',
- `action` tinyint(3) unsigned NOT NULL default '0',
+ `action` mediumint(8) unsigned NOT NULL default '0',
+ `box_money` int(10) unsigned NOT NULL default '0',
+ `coded` tinyint(3) unsigned NOT NULL default '0',
`option_text` text,
+ `box_text` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -2152,7 +3269,7 @@ CREATE TABLE `npc_trainer` (
`reqskill` smallint(5) unsigned NOT NULL default '0',
`reqskillvalue` smallint(5) unsigned NOT NULL default '0',
`reqlevel` tinyint(3) unsigned NOT NULL default '0',
- PRIMARY KEY (`entry`,`spell`)
+ UNIQUE KEY `entry_spell` (`entry`,`spell`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
@@ -2197,7 +3314,7 @@ CREATE TABLE `page_text` (
`text` longtext NOT NULL,
`next_page` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Item System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
--
-- Dumping data for table `page_text`
@@ -2255,6 +3372,268 @@ CREATE TABLE `pet_name_generation` (
LOCK TABLES `pet_name_generation` WRITE;
/*!40000 ALTER TABLE `pet_name_generation` DISABLE KEYS */;
+INSERT INTO `pet_name_generation` (`word`,`entry`,`half`) VALUES
+('Aba',416,0),
+('Az',416,0),
+('Bel',416,0),
+('Biz',416,0),
+('Cho',416,0),
+('Dag',416,0),
+('Gak',416,0),
+('Gar',416,0),
+('Gel',416,0),
+('Gho',416,0),
+('Gob',416,0),
+('Gra',416,0),
+('Jak',416,0),
+('Jub',416,0),
+('Kar',416,0),
+('Kup',416,0),
+('Laz',416,0),
+('Nal',416,0),
+('Nok',416,0),
+('Pag',416,0),
+('Pig',416,0),
+('Pip',416,0),
+('Piz',416,0),
+('Quz',416,0),
+('Rui',416,0),
+('Rul',416,0),
+('Rup',416,0),
+('Tar',416,0),
+('Vol',416,0),
+('Yaz',416,0),
+('Zep',416,0),
+('Zig',416,0),
+('Zil',416,0),
+('Zor',416,0),
+('bis',416,1),
+('fip',416,1),
+('gup',416,1),
+('ham',416,1),
+('jub',416,1),
+('kin',416,1),
+('kol',416,1),
+('lop',416,1),
+('loz',416,1),
+('mat',416,1),
+('mir',416,1),
+('nam',416,1),
+('nar',416,1),
+('nik',416,1),
+('nip',416,1),
+('pad',416,1),
+('pep',416,1),
+('pit',416,1),
+('qua',416,1),
+('rai',416,1),
+('rin',416,1),
+('rot',416,1),
+('tai',416,1),
+('tal',416,1),
+('tik',416,1),
+('tip',416,1),
+('tog',416,1),
+('tuk',416,1),
+('uri',416,1),
+('yal',416,1),
+('yap',416,1),
+('Bhee',417,0),
+('Bruu',417,0),
+('Czaa',417,0),
+('Droo',417,0),
+('Flaa',417,0),
+('Fzuu',417,0),
+('Ghaa',417,0),
+('Gree',417,0),
+('Gzaa',417,0),
+('Haa',417,0),
+('Haad',417,0),
+('Haag',417,0),
+('Haap',417,0),
+('Jhaa',417,0),
+('Jhuu',417,0),
+('Khaa',417,0),
+('Khii',417,0),
+('Khuu',417,0),
+('Kree',417,0),
+('Luu',417,0),
+('Maa',417,0),
+('Nhee',417,0),
+('Phuu',417,0),
+('Pryy',417,0),
+('Rhuu',417,0),
+('Shaa',417,0),
+('Sloo',417,0),
+('Sruu',417,0),
+('Thoo',417,0),
+('Traa',417,0),
+('Wraa',417,0),
+('Zhaa',417,0),
+('dhon',417,1),
+('dhum',417,1),
+('dhun',417,1),
+('dom',417,1),
+('don',417,1),
+('drom',417,1),
+('dym',417,1),
+('fenn',417,1),
+('fum',417,1),
+('fun',417,1),
+('ghon',417,1),
+('ghun',417,1),
+('grom',417,1),
+('grym',417,1),
+('hom',417,1),
+('hon',417,1),
+('hun',417,1),
+('jhom',417,1),
+('kun',417,1),
+('lum',417,1),
+('mmon',417,1),
+('mon',417,1),
+('myn',417,1),
+('nam',417,1),
+('nem',417,1),
+('nhym',417,1),
+('nom',417,1),
+('num',417,1),
+('phom',417,1),
+('roon',417,1),
+('rym',417,1),
+('shon',417,1),
+('thun',417,1),
+('tom',417,1),
+('zhem',417,1),
+('zhum',417,1),
+('zun',417,1),
+('Bar',1860,0),
+('Bel',1860,0),
+('Char',1860,0),
+('Grak\'',1860,0),
+('Graz\'',1860,0),
+('Grim',1860,0),
+('Hath',1860,0),
+('Hel',1860,0),
+('Hok',1860,0),
+('Huk',1860,0),
+('Jhaz',1860,0),
+('Jhom',1860,0),
+('Juk\'',1860,0),
+('Kal\'',1860,0),
+('Klath',1860,0),
+('Kon',1860,0),
+('Krag',1860,0),
+('Krak',1860,0),
+('Mak',1860,0),
+('Mezz',1860,0),
+('Orm',1860,0),
+('Phan',1860,0),
+('Sar',1860,0),
+('Tang',1860,0),
+('Than',1860,0),
+('Thog',1860,0),
+('Thok',1860,0),
+('Thul',1860,0),
+('Zag\'',1860,0),
+('Zang',1860,0),
+('Zhar\'',1860,0),
+('kath',1860,1),
+('doc',1860,1),
+('dok',1860,1),
+('gak',1860,1),
+('garth',1860,1),
+('gore',1860,1),
+('gorg',1860,1),
+('grave',1860,1),
+('gron',1860,1),
+('juk',1860,1),
+('krast',1860,1),
+('kresh',1860,1),
+('krit',1860,1),
+('los',1860,1),
+('mon',1860,1),
+('mos',1860,1),
+('moth',1860,1),
+('nagma',1860,1),
+('nak',1860,1),
+('nar',1860,1),
+('nos',1860,1),
+('nuz',1860,1),
+('phog',1860,1),
+('rath',1860,1),
+('tast',1860,1),
+('taz',1860,1),
+('thak',1860,1),
+('thang',1860,1),
+('thyk',1860,1),
+('vhug',1860,1),
+('zazt',1860,1),
+('Ael',1863,0),
+('Aez',1863,0),
+('Ang',1863,0),
+('Ban',1863,0),
+('Bet',1863,0),
+('Bro',1863,0),
+('Bry',1863,0),
+('Cat',1863,0),
+('Dir',1863,0),
+('Dis',1863,0),
+('Dom',1863,0),
+('Drus',1863,0),
+('Fie',1863,0),
+('Fier',1863,0),
+('Gly',1863,0),
+('Hel',1863,0),
+('Hes',1863,0),
+('Kal',1863,0),
+('Lyn',1863,0),
+('Mir',1863,0),
+('Nim',1863,0),
+('Sar',1863,0),
+('Sel',1863,0),
+('Vil',1863,0),
+('Zah',1863,0),
+('aith',1863,1),
+('anda',1863,1),
+('antia',1863,1),
+('evere',1863,1),
+('lia',1863,1),
+('lissa',1863,1),
+('neri',1863,1),
+('neth',1863,1),
+('nia',1863,1),
+('nlissa',1863,1),
+('nora',1863,1),
+('nva',1863,1),
+('nys',1863,1),
+('ola',1863,1),
+('ona',1863,1),
+('ora',1863,1),
+('rah',1863,1),
+('riana',1863,1),
+('riel',1863,1),
+('rona',1863,1),
+('tai',1863,1),
+('tevere',1863,1),
+('thea',1863,1),
+('vina',1863,1),
+('wena',1863,1),
+('wyn',1863,1),
+('xia',1863,1),
+('yla',1863,1),
+('yssa',1863,1),
+('Flaa',17252,0),
+('Haa',17252,0),
+('Jhuu',17252,0),
+('Shaa',17252,0),
+('Thoo',17252,0),
+('dhun',17252,1),
+('ghun',17252,1),
+('roon',17252,1),
+('thun',17252,1),
+('tom',17252,1);
+
/*!40000 ALTER TABLE `pet_name_generation` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2327,6 +3706,807 @@ CREATE TABLE `player_classlevelstats` (
LOCK TABLES `player_classlevelstats` WRITE;
/*!40000 ALTER TABLE `player_classlevelstats` DISABLE KEYS */;
+INSERT INTO `player_classlevelstats` VALUES
+(1,1,20,0),
+(1,2,29,0),
+(1,3,38,0),
+(1,4,47,0),
+(1,5,56,0),
+(1,6,65,0),
+(1,7,74,0),
+(1,8,83,0),
+(1,9,92,0),
+(1,10,101,0),
+(1,11,100,0),
+(1,12,109,0),
+(1,13,118,0),
+(1,14,128,0),
+(1,15,139,0),
+(1,16,151,0),
+(1,17,154,0),
+(1,18,168,0),
+(1,19,183,0),
+(1,20,199,0),
+(1,21,206,0),
+(1,22,224,0),
+(1,23,243,0),
+(1,24,253,0),
+(1,25,274,0),
+(1,26,296,0),
+(1,27,309,0),
+(1,28,333,0),
+(1,29,348,0),
+(1,30,374,0),
+(1,31,401,0),
+(1,32,419,0),
+(1,33,448,0),
+(1,34,468,0),
+(1,35,499,0),
+(1,36,521,0),
+(1,37,545,0),
+(1,38,581,0),
+(1,39,609,0),
+(1,40,649,0),
+(1,41,681,0),
+(1,42,715,0),
+(1,43,761,0),
+(1,44,799,0),
+(1,45,839,0),
+(1,46,881,0),
+(1,47,935,0),
+(1,48,981,0),
+(1,49,1029,0),
+(1,50,1079,0),
+(1,51,1131,0),
+(1,52,1185,0),
+(1,53,1241,0),
+(1,54,1299,0),
+(1,55,1359,0),
+(1,56,1421,0),
+(1,57,1485,0),
+(1,58,1551,0),
+(1,59,1619,0),
+(1,60,1689,0),
+(1,61,1902,0),
+(1,62,2129,0),
+(1,63,2357,0),
+(1,64,2612,0),
+(1,65,2883,0),
+(1,66,3169,0),
+(1,67,3455,0),
+(1,68,3774,0),
+(1,69,4109,0),
+(1,70,4444,0),
+(1,71,4720,0),
+(1,72,5013,0),
+(1,73,5325,0),
+(1,74,5656,0),
+(1,75,6008,0),
+(1,76,6381,0),
+(1,77,6778,0),
+(1,78,7198,0),
+(1,79,7646,0),
+(1,80,8121,0),
+(2,1,28,60),
+(2,2,36,78),
+(2,3,44,98),
+(2,4,52,104),
+(2,5,60,111),
+(2,6,68,134),
+(2,7,76,143),
+(2,8,84,153),
+(2,9,92,179),
+(2,10,100,192),
+(2,11,108,205),
+(2,12,116,219),
+(2,13,124,249),
+(2,14,132,265),
+(2,15,131,282),
+(2,16,141,315),
+(2,17,152,334),
+(2,18,164,354),
+(2,19,177,390),
+(2,20,191,412),
+(2,21,206,435),
+(2,22,222,459),
+(2,23,239,499),
+(2,24,247,525),
+(2,25,266,552),
+(2,26,286,579),
+(2,27,307,621),
+(2,28,329,648),
+(2,29,342,675),
+(2,30,366,702),
+(2,31,391,729),
+(2,32,407,756),
+(2,33,434,798),
+(2,34,462,825),
+(2,35,481,852),
+(2,36,511,879),
+(2,37,542,906),
+(2,38,564,933),
+(2,39,597,960),
+(2,40,621,987),
+(2,41,656,1014),
+(2,42,682,1041),
+(2,43,719,1068),
+(2,44,747,1110),
+(2,45,786,1137),
+(2,46,816,1164),
+(2,47,857,1176),
+(2,48,889,1203),
+(2,49,922,1230),
+(2,50,966,1257),
+(2,51,1001,1284),
+(2,52,1037,1311),
+(2,53,1084,1338),
+(2,54,1122,1365),
+(2,55,1161,1392),
+(2,56,1201,1419),
+(2,57,1252,1446),
+(2,58,1294,1458),
+(2,59,1337,1485),
+(2,60,1381,1512),
+(2,61,1540,1656),
+(2,62,1708,1800),
+(2,63,1884,1944),
+(2,64,2068,2088),
+(2,65,2262,2232),
+(2,66,2466,2377),
+(2,67,2679,2521),
+(2,68,2901,2665),
+(2,69,3134,2809),
+(2,70,3377,2953),
+(2,71,3629,3097),
+(2,72,3900,3241),
+(2,73,4191,3385),
+(2,74,4503,3529),
+(2,75,4839,3673),
+(2,76,5200,3817),
+(2,77,5588,3962),
+(2,78,6005,4106),
+(2,79,6453,4250),
+(2,80,6934,4394),
+(3,1,46,65),
+(3,2,53,70),
+(3,3,60,76),
+(3,4,67,98),
+(3,5,74,106),
+(3,6,81,130),
+(3,7,88,140),
+(3,8,95,166),
+(3,9,102,193),
+(3,10,109,206),
+(3,11,116,235),
+(3,12,123,250),
+(3,13,130,266),
+(3,14,138,298),
+(3,15,147,316),
+(3,16,157,350),
+(3,17,168,370),
+(3,18,180,391),
+(3,19,193,428),
+(3,20,207,451),
+(3,21,222,475),
+(3,22,238,515),
+(3,23,255,541),
+(3,24,273,568),
+(3,25,292,611),
+(3,26,312,640),
+(3,27,333,670),
+(3,28,355,715),
+(3,29,378,745),
+(3,30,402,775),
+(3,31,417,805),
+(3,32,443,850),
+(3,33,470,880),
+(3,34,498,910),
+(3,35,527,940),
+(3,36,547,970),
+(3,37,578,1015),
+(3,38,610,1045),
+(3,39,643,1075),
+(3,40,667,1105),
+(3,41,702,1135),
+(3,42,738,1180),
+(3,43,775,1210),
+(3,44,803,1240),
+(3,45,842,1270),
+(3,46,872,1300),
+(3,47,913,1330),
+(3,48,955,1360),
+(3,49,994,1390),
+(3,50,1047,1420),
+(3,51,1067,1450),
+(3,52,1113,1480),
+(3,53,1150,1510),
+(3,54,1198,1540),
+(3,55,1237,1570),
+(3,56,1287,1600),
+(3,57,1328,1630),
+(3,58,1370,1660),
+(3,59,1423,1690),
+(3,60,1467,1720),
+(3,61,1633,1886),
+(3,62,1819,2053),
+(3,63,2003,2219),
+(3,64,2195,2385),
+(3,65,2397,2552),
+(3,66,2623,2718),
+(3,67,2844,2884),
+(3,68,3075,3050),
+(3,69,3316,3217),
+(3,70,3568,3383),
+(3,71,3834,3549),
+(3,72,4120,3716),
+(3,73,4427,3882),
+(3,74,4757,4048),
+(3,75,5112,4215),
+(3,76,5493,4381),
+(3,77,5903,4547),
+(3,78,6343,4713),
+(3,79,6816,4880),
+(3,80,7324,5046),
+(4,1,25,0),
+(4,2,32,0),
+(4,3,49,0),
+(4,4,56,0),
+(4,5,63,0),
+(4,6,70,0),
+(4,7,87,0),
+(4,8,94,0),
+(4,9,101,0),
+(4,10,118,0),
+(4,11,125,0),
+(4,12,142,0),
+(4,13,149,0),
+(4,14,156,0),
+(4,15,173,0),
+(4,16,181,0),
+(4,17,190,0),
+(4,18,200,0),
+(4,19,221,0),
+(4,20,233,0),
+(4,21,246,0),
+(4,22,260,0),
+(4,23,275,0),
+(4,24,301,0),
+(4,25,318,0),
+(4,26,336,0),
+(4,27,355,0),
+(4,28,375,0),
+(4,29,396,0),
+(4,30,428,0),
+(4,31,451,0),
+(4,32,475,0),
+(4,33,500,0),
+(4,34,526,0),
+(4,35,553,0),
+(4,36,581,0),
+(4,37,610,0),
+(4,38,640,0),
+(4,39,671,0),
+(4,40,703,0),
+(4,41,736,0),
+(4,42,770,0),
+(4,43,805,0),
+(4,44,841,0),
+(4,45,878,0),
+(4,46,916,0),
+(4,47,955,0),
+(4,48,995,0),
+(4,49,1026,0),
+(4,50,1068,0),
+(4,51,1111,0),
+(4,52,1155,0),
+(4,53,1200,0),
+(4,54,1246,0),
+(4,55,1283,0),
+(4,56,1331,0),
+(4,57,1380,0),
+(4,58,1430,0),
+(4,59,1471,0),
+(4,60,1523,0),
+(4,61,1702,0),
+(4,62,1879,0),
+(4,63,2077,0),
+(4,64,2285,0),
+(4,65,2489,0),
+(4,66,2717,0),
+(4,67,2941,0),
+(4,68,3190,0),
+(4,69,3450,0),
+(4,70,3704,0),
+(4,71,3980,0),
+(4,72,4277,0),
+(4,73,4596,0),
+(4,74,4939,0),
+(4,75,5307,0),
+(4,76,5703,0),
+(4,77,6128,0),
+(4,78,6585,0),
+(4,79,7076,0),
+(4,80,7604,0),
+(5,1,52,73),
+(5,2,57,76),
+(5,3,72,95),
+(5,4,77,114),
+(5,5,92,133),
+(5,6,97,152),
+(5,7,112,171),
+(5,8,117,190),
+(5,9,132,209),
+(5,10,137,212),
+(5,11,142,215),
+(5,12,157,234),
+(5,13,172,254),
+(5,14,177,260),
+(5,15,192,282),
+(5,16,197,305),
+(5,17,212,329),
+(5,18,227,339),
+(5,19,232,365),
+(5,20,247,377),
+(5,21,252,405),
+(5,22,268,434),
+(5,23,275,449),
+(5,24,293,480),
+(5,25,302,497),
+(5,26,322,530),
+(5,27,343,549),
+(5,28,355,584),
+(5,29,378,605),
+(5,30,392,627),
+(5,31,417,665),
+(5,32,433,689),
+(5,33,460,728),
+(5,34,478,752),
+(5,35,507,776),
+(5,36,527,800),
+(5,37,548,839),
+(5,38,580,863),
+(5,39,603,887),
+(5,40,637,911),
+(5,41,662,950),
+(5,42,698,974),
+(5,43,725,998),
+(5,44,763,1022),
+(5,45,792,1046),
+(5,46,822,1070),
+(5,47,863,1094),
+(5,48,895,1118),
+(5,49,928,1142),
+(5,50,972,1166),
+(5,51,1007,1190),
+(5,52,1053,1214),
+(5,53,1090,1238),
+(5,54,1128,1262),
+(5,55,1177,1271),
+(5,56,1217,1295),
+(5,57,1258,1319),
+(5,58,1300,1343),
+(5,59,1353,1352),
+(5,60,1397,1376),
+(5,61,1557,1500),
+(5,62,1738,1625),
+(5,63,1916,1749),
+(5,64,2101,1873),
+(5,65,2295,1998),
+(5,66,2495,2122),
+(5,67,2719,2247),
+(5,68,2936,2371),
+(5,69,3160,2495),
+(5,70,3391,2620),
+(5,71,3644,2744),
+(5,72,3916,2868),
+(5,73,4208,2993),
+(5,74,4522,3117),
+(5,75,4859,3242),
+(5,76,5221,3366),
+(5,77,5610,3490),
+(5,78,6028,3615),
+(5,79,6477,3739),
+(5,80,6960,3863),
+(6,1,22,0),
+(6,2,27,0),
+(6,3,32,0),
+(6,4,37,0),
+(6,5,42,0),
+(6,6,47,0),
+(6,7,52,0),
+(6,8,58,0),
+(6,9,64,0),
+(6,10,70,0),
+(6,11,77,0),
+(6,12,84,0),
+(6,13,92,0),
+(6,14,100,0),
+(6,15,117,0),
+(6,16,127,0),
+(6,17,138,0),
+(6,18,150,0),
+(6,19,163,0),
+(6,20,177,0),
+(6,21,192,0),
+(6,22,208,0),
+(6,23,225,0),
+(6,24,239,0),
+(6,25,258,0),
+(6,26,278,0),
+(6,27,299,0),
+(6,28,321,0),
+(6,29,344,0),
+(6,30,368,0),
+(6,31,393,0),
+(6,32,419,0),
+(6,33,446,0),
+(6,34,474,0),
+(6,35,503,0),
+(6,36,533,0),
+(6,37,564,0),
+(6,38,596,0),
+(6,39,629,0),
+(6,40,698,0),
+(6,41,698,0),
+(6,42,734,0),
+(6,43,771,0),
+(6,44,809,0),
+(6,45,849,0),
+(6,46,891,0),
+(6,47,935,0),
+(6,48,981,0),
+(6,49,1029,0),
+(6,50,1079,0),
+(6,51,1131,0),
+(6,52,1185,0),
+(6,53,1241,0),
+(6,54,1299,0),
+(6,55,1359,0),
+(6,56,1421,0),
+(6,57,1485,0),
+(6,58,1551,0),
+(6,59,1619,0),
+(6,60,1689,0),
+(6,61,1902,0),
+(6,62,2129,0),
+(6,63,2357,0),
+(6,64,2612,0),
+(6,65,2883,0),
+(6,66,3169,0),
+(6,67,3455,0),
+(6,68,3774,0),
+(6,69,4109,0),
+(6,70,4444,0),
+(6,71,4720,0),
+(6,72,5013,0),
+(6,73,5325,0),
+(6,74,5656,0),
+(6,75,6008,0),
+(6,76,6381,0),
+(6,77,6778,0),
+(6,78,7199,0),
+(6,79,7646,0),
+(6,80,8121,0),
+(7,1,37,85),
+(7,2,44,91),
+(7,3,51,98),
+(7,4,58,106),
+(7,5,65,115),
+(7,6,72,125),
+(7,7,79,136),
+(7,8,86,148),
+(7,9,93,161),
+(7,10,100,175),
+(7,11,107,190),
+(7,12,114,206),
+(7,13,121,223),
+(7,14,128,241),
+(7,15,135,260),
+(7,16,142,280),
+(7,17,150,301),
+(7,18,159,323),
+(7,19,169,346),
+(7,20,180,370),
+(7,21,192,395),
+(7,22,205,421),
+(7,23,219,448),
+(7,24,234,476),
+(7,25,240,505),
+(7,26,257,535),
+(7,27,275,566),
+(7,28,294,598),
+(7,29,314,631),
+(7,30,335,665),
+(7,31,347,699),
+(7,32,370,733),
+(7,33,394,767),
+(7,34,419,786),
+(7,35,435,820),
+(7,36,462,854),
+(7,37,490,888),
+(7,38,509,922),
+(7,39,539,941),
+(7,40,570,975),
+(7,41,592,1009),
+(7,42,625,1028),
+(7,43,649,1062),
+(7,44,684,1096),
+(7,45,710,1115),
+(7,46,747,1149),
+(7,47,775,1183),
+(7,48,814,1202),
+(7,49,844,1236),
+(7,50,885,1255),
+(7,51,917,1289),
+(7,52,960,1323),
+(7,53,994,1342),
+(7,54,1029,1376),
+(7,55,1075,1395),
+(7,56,1112,1414),
+(7,57,1150,1448),
+(7,58,1199,1467),
+(7,59,1239,1501),
+(7,60,1330,1520),
+(7,61,1428,1664),
+(7,62,1583,1808),
+(7,63,1760,1951),
+(7,64,1932,2095),
+(7,65,2114,2239),
+(7,66,2304,2383),
+(7,67,2504,2527),
+(7,68,2713,2670),
+(7,69,2931,2814),
+(7,70,3159,2958),
+(7,71,3395,3102),
+(7,72,3648,3246),
+(7,73,3920,3389),
+(7,74,4212,3533),
+(7,75,4526,3677),
+(7,76,4863,3821),
+(7,77,5226,3965),
+(7,78,5616,4108),
+(7,79,6035,4252),
+(7,80,6485,4396),
+(8,1,32,100),
+(8,2,47,110),
+(8,3,52,106),
+(8,4,67,118),
+(8,5,82,131),
+(8,6,97,130),
+(8,7,102,145),
+(8,8,117,146),
+(8,9,132,163),
+(8,10,137,196),
+(8,11,152,215),
+(8,12,167,220),
+(8,13,172,241),
+(8,14,187,263),
+(8,15,202,271),
+(8,16,207,295),
+(8,17,222,305),
+(8,18,237,331),
+(8,19,242,343),
+(8,20,257,371),
+(8,21,272,385),
+(8,22,277,415),
+(8,23,292,431),
+(8,24,298,463),
+(8,25,315,481),
+(8,26,333,515),
+(8,27,342,535),
+(8,28,362,556),
+(8,29,373,592),
+(8,30,395,613),
+(8,31,418,634),
+(8,32,432,670),
+(8,33,457,691),
+(8,34,473,712),
+(8,35,500,733),
+(8,36,518,754),
+(8,37,547,790),
+(8,38,577,811),
+(8,39,598,832),
+(8,40,630,853),
+(8,41,653,874),
+(8,42,687,895),
+(8,43,712,916),
+(8,44,748,937),
+(8,45,775,958),
+(8,46,813,979),
+(8,47,842,1000),
+(8,48,882,1021),
+(8,49,913,1042),
+(8,50,955,1048),
+(8,51,988,1069),
+(8,52,1032,1090),
+(8,53,1067,1111),
+(8,54,1103,1117),
+(8,55,1150,1138),
+(8,56,1188,1159),
+(8,57,1237,1165),
+(8,58,1277,1186),
+(8,59,1328,1192),
+(8,60,1370,1213),
+(8,61,1526,1316),
+(8,62,1702,1419),
+(8,63,1875,1521),
+(8,64,2070,1624),
+(8,65,2261,1727),
+(8,66,2461,1830),
+(8,67,2686,1932),
+(8,68,2906,2035),
+(8,69,3136,2138),
+(8,70,3393,2241),
+(8,71,3646,2343),
+(8,72,3918,2446),
+(8,73,4210,2549),
+(8,74,4524,2652),
+(8,75,4861,2754),
+(8,76,5223,2857),
+(8,77,5612,2960),
+(8,78,6030,3063),
+(8,79,6480,3165),
+(8,80,6963,3268),
+(9,1,23,90),
+(9,2,28,98),
+(9,3,43,107),
+(9,4,48,102),
+(9,5,63,113),
+(9,6,68,126),
+(9,7,83,144),
+(9,8,88,162),
+(9,9,93,180),
+(9,10,108,198),
+(9,11,123,200),
+(9,12,128,218),
+(9,13,143,237),
+(9,14,148,257),
+(9,15,153,278),
+(9,16,168,300),
+(9,17,173,308),
+(9,18,189,332),
+(9,19,196,357),
+(9,20,204,383),
+(9,21,223,395),
+(9,22,233,423),
+(9,23,244,452),
+(9,24,266,467),
+(9,25,279,498),
+(9,26,293,530),
+(9,27,318,548),
+(9,28,334,582),
+(9,29,351,602),
+(9,30,379,638),
+(9,31,398,674),
+(9,32,418,695),
+(9,33,439,731),
+(9,34,471,752),
+(9,35,494,788),
+(9,36,518,809),
+(9,37,543,830),
+(9,38,569,866),
+(9,39,606,887),
+(9,40,634,923),
+(9,41,663,944),
+(9,42,693,965),
+(9,43,724,1001),
+(9,44,756,1022),
+(9,45,799,1043),
+(9,46,832,1064),
+(9,47,868,1100),
+(9,48,904,1121),
+(9,49,941,1142),
+(9,50,979,1163),
+(9,51,1018,1184),
+(9,52,1058,1205),
+(9,53,1099,1226),
+(9,54,1141,1247),
+(9,55,1184,1268),
+(9,56,1228,1289),
+(9,57,1273,1310),
+(9,58,1319,1331),
+(9,59,1366,1352),
+(9,60,1414,1373),
+(9,61,1580,1497),
+(9,62,1755,1621),
+(9,63,1939,1745),
+(9,64,2133,1870),
+(9,65,2323,1994),
+(9,66,2535,2118),
+(9,67,2758,2242),
+(9,68,2991,2366),
+(9,69,3235,2490),
+(9,70,3490,2615),
+(9,71,3750,2739),
+(9,72,4025,2863),
+(9,73,4330,2987),
+(9,74,4646,3111),
+(9,75,4997,3235),
+(9,76,5373,3360),
+(9,77,5774,3483),
+(9,78,6207,3608),
+(9,79,6667,3732),
+(9,80,7136,3856),
+(11,1,44,60),
+(11,2,51,66),
+(11,3,58,73),
+(11,4,75,81),
+(11,5,82,90),
+(11,6,89,100),
+(11,7,106,111),
+(11,8,113,123),
+(11,9,120,136),
+(11,10,137,150),
+(11,11,144,165),
+(11,12,151,182),
+(11,13,168,200),
+(11,14,175,219),
+(11,15,182,239),
+(11,16,199,260),
+(11,17,206,282),
+(11,18,214,305),
+(11,19,233,329),
+(11,20,243,354),
+(11,21,254,380),
+(11,22,266,392),
+(11,23,289,420),
+(11,24,303,449),
+(11,25,318,479),
+(11,26,334,509),
+(11,27,361,524),
+(11,28,379,554),
+(11,29,398,584),
+(11,30,418,614),
+(11,31,439,629),
+(11,32,461,659),
+(11,33,494,689),
+(11,34,518,704),
+(11,35,543,734),
+(11,36,569,749),
+(11,37,596,779),
+(11,38,624,809),
+(11,39,653,824),
+(11,40,683,854),
+(11,41,714,869),
+(11,42,746,899),
+(11,43,779,914),
+(11,44,823,944),
+(11,45,858,959),
+(11,46,894,989),
+(11,47,921,1004),
+(11,48,959,1019),
+(11,49,998,1049),
+(11,50,1038,1064),
+(11,51,1079,1079),
+(11,52,1121,1109),
+(11,53,1164,1124),
+(11,54,1208,1139),
+(11,55,1253,1154),
+(11,56,1299,1169),
+(11,57,1346,1199),
+(11,58,1384,1214),
+(11,59,1433,1229),
+(11,60,1483,1244),
+(11,61,1657,1357),
+(11,62,1840,1469),
+(11,63,2020,1582),
+(11,64,2222,1694),
+(11,65,2433,1807),
+(11,66,2640,1919),
+(11,67,2872,2032),
+(11,68,3114,2145),
+(11,69,3351,2257),
+(11,70,3614,2370),
+(11,71,3883,2482),
+(11,72,4172,2595),
+(11,73,4483,2708),
+(11,74,4817,2820),
+(11,75,5176,2933),
+(11,76,5562,3045),
+(11,77,5977,3158),
+(11,78,6423,3270),
+(11,79,6902,3383),
+(11,80,7417,3496);
/*!40000 ALTER TABLE `player_classlevelstats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2353,6 +4533,4967 @@ CREATE TABLE `player_levelstats` (
LOCK TABLES `player_levelstats` WRITE;
/*!40000 ALTER TABLE `player_levelstats` DISABLE KEYS */;
+INSERT INTO `player_levelstats` VALUES
+(1,1,1,23,20,22,20,20),
+(1,1,2,24,21,23,20,20),
+(1,1,3,26,22,24,20,21),
+(1,1,4,27,22,26,20,21),
+(1,1,5,28,23,27,20,21),
+(1,1,6,30,24,28,20,21),
+(1,1,7,31,25,29,21,22),
+(1,1,8,32,26,30,21,22),
+(1,1,9,34,26,32,21,22),
+(1,1,10,35,27,33,21,23),
+(1,1,11,36,28,34,21,23),
+(1,1,12,38,29,35,21,23),
+(1,1,13,39,30,37,21,24),
+(1,1,14,41,31,38,21,24),
+(1,1,15,42,32,39,21,24),
+(1,1,16,44,33,41,21,25),
+(1,1,17,45,34,42,22,25),
+(1,1,18,47,34,43,22,25),
+(1,1,19,48,35,45,22,26),
+(1,1,20,50,36,46,22,26),
+(1,1,21,51,37,48,22,26),
+(1,1,22,53,38,49,22,27),
+(1,1,23,54,39,51,22,27),
+(1,1,24,56,40,52,23,28),
+(1,1,25,58,41,53,23,28),
+(1,1,26,59,42,55,23,28),
+(1,1,27,61,43,56,23,29),
+(1,1,28,63,44,58,23,29),
+(1,1,29,64,45,59,23,30),
+(1,1,30,66,46,61,24,30),
+(1,1,31,68,47,62,24,30),
+(1,1,32,69,48,64,24,31),
+(1,1,33,71,50,66,24,31),
+(1,1,34,73,51,67,24,32),
+(1,1,35,74,52,69,24,32),
+(1,1,36,76,53,70,25,33),
+(1,1,37,78,54,72,25,33),
+(1,1,38,80,55,74,25,34),
+(1,1,39,82,56,75,25,34),
+(1,1,40,83,57,77,25,35),
+(1,1,41,85,58,79,26,35),
+(1,1,42,87,60,80,26,35),
+(1,1,43,89,61,82,26,36),
+(1,1,44,91,62,84,26,36),
+(1,1,45,93,63,85,26,37),
+(1,1,46,95,64,87,27,37),
+(1,1,47,97,66,89,27,38),
+(1,1,48,99,67,91,27,38),
+(1,1,49,101,68,93,27,39),
+(1,1,50,103,69,94,28,40),
+(1,1,51,105,71,96,28,40),
+(1,1,52,107,72,98,28,41),
+(1,1,53,109,73,100,28,41),
+(1,1,54,111,74,102,29,42),
+(1,1,55,113,76,103,29,42),
+(1,1,56,115,77,105,29,43),
+(1,1,57,117,78,107,29,43),
+(1,1,58,119,79,109,30,44),
+(1,1,59,121,81,111,30,44),
+(1,1,60,123,82,113,30,45),
+(1,1,61,125,83,115,30,46),
+(1,1,62,127,85,117,31,46),
+(1,1,63,129,86,119,31,47),
+(1,1,64,132,88,121,31,47),
+(1,1,65,134,89,123,32,48),
+(1,1,66,136,90,125,32,49),
+(1,1,67,138,92,127,32,49),
+(1,1,68,140,93,129,32,50),
+(1,1,69,143,95,131,33,50),
+(1,1,70,145,96,133,33,51),
+(1,1,71,148,97,140,33,53),
+(1,1,72,156,99,143,33,54),
+(1,1,73,162,101,148,33,55),
+(1,1,74,162,102,148,34,55),
+(1,1,75,165,104,150,34,56),
+(1,1,76,171,106,156,34,57),
+(1,1,77,171,108,157,35,58),
+(1,1,78,174,109,159,35,58),
+(1,1,79,181,111,165,35,59),
+(1,1,80,184,113,168,36,60),
+(1,2,1,22,20,22,20,21),
+(1,2,2,23,21,23,21,22),
+(1,2,3,24,21,24,21,22),
+(1,2,4,25,22,25,22,23),
+(1,2,5,26,22,26,23,24),
+(1,2,6,28,23,27,23,25),
+(1,2,7,29,24,28,24,25),
+(1,2,8,30,24,29,25,26),
+(1,2,9,31,25,30,25,27),
+(1,2,10,32,25,32,26,27),
+(1,2,11,33,26,33,27,28),
+(1,2,12,35,27,34,27,29),
+(1,2,13,36,27,35,28,30),
+(1,2,14,37,28,36,29,31),
+(1,2,15,38,29,37,30,31),
+(1,2,16,40,29,38,30,32),
+(1,2,17,41,30,40,31,33),
+(1,2,18,42,31,41,32,34),
+(1,2,19,43,31,42,33,35),
+(1,2,20,45,32,43,33,35),
+(1,2,21,46,33,45,34,36),
+(1,2,22,47,33,46,35,37),
+(1,2,23,49,34,47,36,38),
+(1,2,24,50,35,48,37,39),
+(1,2,25,51,36,50,37,40),
+(1,2,26,53,36,51,38,41),
+(1,2,27,54,37,52,39,42),
+(1,2,28,56,38,54,40,43),
+(1,2,29,57,39,55,41,43),
+(1,2,30,58,39,56,42,44),
+(1,2,31,60,40,58,43,45),
+(1,2,32,61,41,59,43,46),
+(1,2,33,63,42,60,44,47),
+(1,2,34,64,43,62,45,48),
+(1,2,35,66,44,63,46,49),
+(1,2,36,67,44,65,47,50),
+(1,2,37,69,45,66,48,51),
+(1,2,38,70,46,67,49,52),
+(1,2,39,72,47,69,50,53),
+(1,2,40,73,48,70,51,54),
+(1,2,41,75,49,72,52,55),
+(1,2,42,77,49,73,53,56),
+(1,2,43,78,50,75,54,57),
+(1,2,44,80,51,76,55,58),
+(1,2,45,81,52,78,56,59),
+(1,2,46,83,53,79,57,61),
+(1,2,47,85,54,81,58,62),
+(1,2,48,86,55,83,59,63),
+(1,2,49,88,56,84,60,64),
+(1,2,50,90,57,86,61,65),
+(1,2,51,91,58,87,62,66),
+(1,2,52,93,59,89,63,67),
+(1,2,53,95,60,91,64,68),
+(1,2,54,97,61,92,65,69),
+(1,2,55,98,61,94,66,71),
+(1,2,56,100,62,95,67,72),
+(1,2,57,102,63,97,68,73),
+(1,2,58,104,64,99,69,74),
+(1,2,59,105,65,101,70,75),
+(1,2,60,107,66,102,71,77),
+(1,2,61,109,67,104,73,78),
+(1,2,62,111,69,106,74,79),
+(1,2,63,113,70,107,75,80),
+(1,2,64,115,71,109,76,81),
+(1,2,65,116,72,111,77,83),
+(1,2,66,118,73,113,78,84),
+(1,2,67,120,74,115,79,85),
+(1,2,68,122,75,116,81,86),
+(1,2,69,124,76,118,82,88),
+(1,2,70,126,77,120,83,89),
+(1,2,71,148,78,122,84,92),
+(1,2,72,150,79,125,86,94),
+(1,2,73,152,80,127,87,96),
+(1,2,74,156,82,129,89,97),
+(1,2,75,158,83,131,90,99),
+(1,2,76,162,84,134,92,100),
+(1,2,77,164,86,136,93,103),
+(1,2,78,167,87,138,95,105),
+(1,2,79,170,88,153,96,106),
+(1,2,80,173,90,160,98,108),
+(1,4,1,21,23,21,20,20),
+(1,4,2,22,24,22,20,20),
+(1,4,3,23,26,22,20,21),
+(1,4,4,23,27,23,20,21),
+(1,4,5,24,29,24,21,21),
+(1,4,6,25,30,25,21,22),
+(1,4,7,26,32,25,21,22),
+(1,4,8,26,33,26,21,23),
+(1,4,9,27,35,27,21,23),
+(1,4,10,28,36,27,21,23),
+(1,4,11,29,38,28,22,24),
+(1,4,12,30,39,29,22,24),
+(1,4,13,31,41,30,22,25),
+(1,4,14,31,43,31,22,25),
+(1,4,15,32,44,31,22,25),
+(1,4,16,33,46,32,23,26),
+(1,4,17,34,48,33,23,26),
+(1,4,18,35,49,34,23,27),
+(1,4,19,36,51,35,23,27),
+(1,4,20,37,53,35,23,28),
+(1,4,21,38,54,36,24,28),
+(1,4,22,39,56,37,24,29),
+(1,4,23,40,58,38,24,29),
+(1,4,24,41,60,39,24,30),
+(1,4,25,42,61,40,25,30),
+(1,4,26,43,63,41,25,31),
+(1,4,27,44,65,42,25,31),
+(1,4,28,45,67,43,25,32),
+(1,4,29,46,69,43,25,32),
+(1,4,30,47,71,44,26,33),
+(1,4,31,48,72,45,26,33),
+(1,4,32,49,74,46,26,34),
+(1,4,33,50,76,47,27,34),
+(1,4,34,51,78,48,27,35),
+(1,4,35,52,80,49,27,35),
+(1,4,36,53,82,50,27,36),
+(1,4,37,54,84,51,28,36),
+(1,4,38,55,86,52,28,37),
+(1,4,39,56,88,53,28,38),
+(1,4,40,57,90,54,28,38),
+(1,4,41,58,92,55,29,39),
+(1,4,42,60,94,56,29,39),
+(1,4,43,61,96,57,29,40),
+(1,4,44,62,98,58,30,40),
+(1,4,45,63,100,59,30,41),
+(1,4,46,64,103,61,30,42),
+(1,4,47,65,105,62,31,42),
+(1,4,48,66,107,63,31,43),
+(1,4,49,68,109,64,31,44),
+(1,4,50,69,111,65,32,44),
+(1,4,51,70,113,66,32,45),
+(1,4,52,71,116,67,32,45),
+(1,4,53,73,118,68,33,46),
+(1,4,54,74,120,69,33,47),
+(1,4,55,75,122,71,33,47),
+(1,4,56,76,125,72,34,48),
+(1,4,57,78,127,73,34,49),
+(1,4,58,79,129,74,34,49),
+(1,4,59,80,131,75,35,50),
+(1,4,60,81,134,77,35,51),
+(1,4,61,83,136,78,35,51),
+(1,4,62,84,138,79,36,52),
+(1,4,63,85,141,80,36,53),
+(1,4,64,87,143,81,37,54),
+(1,4,65,88,146,83,37,54),
+(1,4,66,89,148,84,37,55),
+(1,4,67,91,151,85,38,56),
+(1,4,68,92,153,86,38,57),
+(1,4,69,94,156,88,39,57),
+(1,4,70,95,158,89,39,58),
+(1,4,71,97,161,90,39,60),
+(1,4,72,99,164,92,40,60),
+(1,4,73,100,167,94,40,61),
+(1,4,74,102,170,95,41,62),
+(1,4,75,104,173,97,41,63),
+(1,4,76,105,176,98,41,64),
+(1,4,77,107,179,100,42,65),
+(1,4,78,109,183,106,42,66),
+(1,4,79,111,186,107,43,67),
+(1,4,80,113,189,109,43,69),
+(1,5,1,20,20,20,22,23),
+(1,5,2,20,20,20,23,24),
+(1,5,3,20,20,21,25,26),
+(1,5,4,20,21,21,26,27),
+(1,5,5,21,21,21,27,28),
+(1,5,6,21,21,22,29,30),
+(1,5,7,21,21,22,30,31),
+(1,5,8,21,22,23,31,33),
+(1,5,9,21,22,23,33,34),
+(1,5,10,21,22,23,34,36),
+(1,5,11,22,22,24,36,37),
+(1,5,12,22,23,24,37,39),
+(1,5,13,22,23,25,38,40),
+(1,5,14,22,23,25,40,42),
+(1,5,15,22,23,25,41,43),
+(1,5,16,23,24,26,43,45),
+(1,5,17,23,24,26,44,46),
+(1,5,18,23,24,27,46,48),
+(1,5,19,23,24,27,47,49),
+(1,5,20,23,25,28,49,51),
+(1,5,21,24,25,28,51,53),
+(1,5,22,24,25,29,52,54),
+(1,5,23,24,26,29,54,56),
+(1,5,24,24,26,30,55,58),
+(1,5,25,25,26,30,57,59),
+(1,5,26,25,27,31,59,61),
+(1,5,27,25,27,31,60,63),
+(1,5,28,25,27,32,62,65),
+(1,5,29,25,28,32,64,66),
+(1,5,30,26,28,33,65,68),
+(1,5,31,26,28,33,67,70),
+(1,5,32,26,29,34,69,72),
+(1,5,33,27,29,34,70,73),
+(1,5,34,27,29,35,72,75),
+(1,5,35,27,30,35,74,77),
+(1,5,36,27,30,36,76,79),
+(1,5,37,28,30,36,78,81),
+(1,5,38,28,31,37,79,83),
+(1,5,39,28,31,38,81,85),
+(1,5,40,28,31,38,83,87),
+(1,5,41,29,32,39,85,88),
+(1,5,42,29,32,39,87,90),
+(1,5,43,29,33,40,89,92),
+(1,5,44,30,33,40,91,94),
+(1,5,45,30,33,41,92,96),
+(1,5,46,30,34,42,94,98),
+(1,5,47,31,34,42,96,100),
+(1,5,48,31,35,43,98,102),
+(1,5,49,31,35,44,100,104),
+(1,5,50,32,36,44,102,106),
+(1,5,51,32,36,45,104,109),
+(1,5,52,32,36,45,106,111),
+(1,5,53,33,37,46,108,113),
+(1,5,54,33,37,47,110,115),
+(1,5,55,33,38,47,112,117),
+(1,5,56,34,38,48,114,119),
+(1,5,57,34,39,49,117,121),
+(1,5,58,34,39,49,119,124),
+(1,5,59,35,40,50,121,126),
+(1,5,60,35,40,51,123,128),
+(1,5,61,35,41,51,125,130),
+(1,5,62,36,41,52,127,132),
+(1,5,63,36,41,53,129,135),
+(1,5,64,37,42,54,132,137),
+(1,5,65,37,42,54,134,139),
+(1,5,66,37,43,55,136,142),
+(1,5,67,38,43,56,138,144),
+(1,5,68,38,44,57,140,146),
+(1,5,69,39,44,57,143,149),
+(1,5,70,39,45,58,145,151),
+(1,5,71,39,46,59,148,158),
+(1,5,72,40,46,59,151,161),
+(1,5,73,40,47,60,154,164),
+(1,5,74,41,47,61,156,167),
+(1,5,75,41,48,62,159,170),
+(1,5,76,41,49,63,162,174),
+(1,5,77,42,49,64,165,177),
+(1,5,78,42,50,65,168,180),
+(1,5,79,43,50,66,171,183),
+(1,5,80,43,51,67,174,186),
+(1,6,1,23,20,22,20,20),
+(1,6,2,24,21,23,20,20),
+(1,6,3,26,22,24,20,21),
+(1,6,4,27,22,26,20,21),
+(1,6,5,28,23,27,20,21),
+(1,6,6,30,24,28,20,21),
+(1,6,7,31,25,29,21,22),
+(1,6,8,32,26,30,21,22),
+(1,6,9,34,26,32,21,22),
+(1,6,10,35,27,33,21,23),
+(1,6,11,36,28,34,21,23),
+(1,6,12,38,29,35,21,23),
+(1,6,13,39,30,37,21,24),
+(1,6,14,41,31,38,21,24),
+(1,6,15,42,32,39,21,24),
+(1,6,16,44,33,41,21,25),
+(1,6,17,45,34,42,22,25),
+(1,6,18,47,34,43,22,25),
+(1,6,19,48,35,45,22,26),
+(1,6,20,50,36,46,22,26),
+(1,6,21,51,37,48,22,26),
+(1,6,22,53,38,49,22,27),
+(1,6,23,54,39,51,22,27),
+(1,6,24,56,40,52,23,28),
+(1,6,25,58,41,53,23,28),
+(1,6,26,59,42,55,23,28),
+(1,6,27,61,43,56,23,29),
+(1,6,28,63,44,58,23,29),
+(1,6,29,64,45,59,23,30),
+(1,6,30,66,46,61,24,30),
+(1,6,31,68,47,62,24,30),
+(1,6,32,69,48,64,24,31),
+(1,6,33,71,50,66,24,31),
+(1,6,34,73,51,67,24,32),
+(1,6,35,74,52,69,24,32),
+(1,6,36,76,53,70,25,33),
+(1,6,37,78,54,72,25,33),
+(1,6,38,80,55,74,25,34),
+(1,6,39,82,56,75,25,34),
+(1,6,40,83,57,77,25,35),
+(1,6,41,85,58,79,26,35),
+(1,6,42,87,60,80,26,35),
+(1,6,43,89,61,82,26,36),
+(1,6,44,91,62,84,26,36),
+(1,6,45,93,63,85,26,37),
+(1,6,46,95,64,87,27,37),
+(1,6,47,97,66,89,27,38),
+(1,6,48,99,67,91,27,38),
+(1,6,49,101,68,93,27,39),
+(1,6,50,103,69,94,28,40),
+(1,6,51,105,71,96,28,40),
+(1,6,52,106,72,97,28,41),
+(1,6,53,107,72,98,28,41),
+(1,6,54,107,73,98,29,42),
+(1,6,55,108,73,99,29,43),
+(1,6,56,111,75,102,29,44),
+(1,6,57,113,76,104,29,44),
+(1,6,58,118,77,106,30,45),
+(1,6,59,118,79,108,30,45),
+(1,6,60,123,80,110,30,46),
+(1,6,61,125,81,112,30,47),
+(1,6,62,128,83,114,30,47),
+(1,6,63,130,84,117,31,48),
+(1,6,64,130,86,119,31,48),
+(1,6,65,140,87,128,31,49),
+(1,6,66,143,89,131,31,50),
+(1,6,67,146,90,133,32,50),
+(1,6,68,148,92,135,32,51),
+(1,6,69,151,93,138,32,52),
+(1,6,70,154,95,140,32,52),
+(1,6,71,162,97,144,33,53),
+(1,6,72,164,98,146,33,54),
+(1,6,73,165,100,148,33,55),
+(1,6,74,166,102,151,33,55),
+(1,6,75,169,103,154,34,56),
+(1,6,76,172,105,157,34,57),
+(1,6,77,175,107,157,34,58),
+(1,6,78,176,108,157,34,58),
+(1,6,79,177,110,157,35,59),
+(1,6,80,180,112,160,35,60),
+(1,8,1,20,20,20,23,22),
+(1,8,2,20,20,20,24,23),
+(1,8,3,20,20,21,26,25),
+(1,8,4,20,20,21,27,26),
+(1,8,5,20,21,21,28,27),
+(1,8,6,20,21,21,30,29),
+(1,8,7,21,21,22,31,30),
+(1,8,8,21,21,22,33,31),
+(1,8,9,21,21,22,34,33),
+(1,8,10,21,21,23,36,34),
+(1,8,11,21,22,23,37,36),
+(1,8,12,21,22,23,39,37),
+(1,8,13,21,22,24,40,38),
+(1,8,14,21,22,24,42,40),
+(1,8,15,21,22,24,43,41),
+(1,8,16,21,23,25,45,43),
+(1,8,17,22,23,25,46,44),
+(1,8,18,22,23,25,48,46),
+(1,8,19,22,23,26,49,47),
+(1,8,20,22,23,26,51,49),
+(1,8,21,22,24,26,53,51),
+(1,8,22,22,24,27,54,52),
+(1,8,23,22,24,27,56,54),
+(1,8,24,23,24,28,58,55),
+(1,8,25,23,25,28,59,57),
+(1,8,26,23,25,28,61,59),
+(1,8,27,23,25,29,63,60),
+(1,8,28,23,25,29,65,62),
+(1,8,29,23,25,30,66,64),
+(1,8,30,24,26,30,68,65),
+(1,8,31,24,26,30,70,67),
+(1,8,32,24,26,31,72,69),
+(1,8,33,24,27,31,73,70),
+(1,8,34,24,27,32,75,72),
+(1,8,35,24,27,32,77,74),
+(1,8,36,25,27,33,79,76),
+(1,8,37,25,28,33,81,78),
+(1,8,38,25,28,34,83,79),
+(1,8,39,25,28,34,85,81),
+(1,8,40,25,28,35,87,83),
+(1,8,41,26,29,35,88,85),
+(1,8,42,26,29,35,90,87),
+(1,8,43,26,29,36,92,89),
+(1,8,44,26,30,36,94,91),
+(1,8,45,26,30,37,96,92),
+(1,8,46,27,30,37,98,94),
+(1,8,47,27,31,38,100,96),
+(1,8,48,27,31,38,102,98),
+(1,8,49,27,31,39,104,100),
+(1,8,50,28,32,40,106,102),
+(1,8,51,28,32,40,109,104),
+(1,8,52,28,32,41,111,106),
+(1,8,53,28,33,41,113,108),
+(1,8,54,29,33,42,115,110),
+(1,8,55,29,33,42,117,112),
+(1,8,56,29,34,43,119,114),
+(1,8,57,29,34,43,121,117),
+(1,8,58,30,34,44,124,119),
+(1,8,59,30,35,44,126,121),
+(1,8,60,30,35,45,128,123),
+(1,8,61,30,35,46,130,125),
+(1,8,62,31,36,46,132,127),
+(1,8,63,31,36,47,135,129),
+(1,8,64,31,37,47,137,132),
+(1,8,65,32,37,48,139,134),
+(1,8,66,32,37,49,142,136),
+(1,8,67,32,38,49,144,138),
+(1,8,68,32,38,50,146,140),
+(1,8,69,33,39,50,149,143),
+(1,8,70,33,39,51,151,145),
+(1,8,71,33,39,52,154,152),
+(1,8,72,33,40,53,160,155),
+(1,8,73,33,40,54,160,158),
+(1,8,74,34,41,54,163,160),
+(1,8,75,34,41,55,166,163),
+(1,8,76,34,41,56,169,166),
+(1,8,77,35,42,57,172,169),
+(1,8,78,35,42,57,175,173),
+(1,8,79,35,43,58,178,176),
+(1,8,80,36,43,59,181,179),
+(1,9,1,20,20,21,22,22),
+(1,9,2,20,20,22,23,23),
+(1,9,3,21,21,22,24,24),
+(1,9,4,21,21,23,26,25),
+(1,9,5,21,21,23,27,27),
+(1,9,6,21,22,24,28,28),
+(1,9,7,22,22,24,29,29),
+(1,9,8,22,23,25,30,30),
+(1,9,9,22,23,26,32,31),
+(1,9,10,23,23,26,33,33),
+(1,9,11,23,24,27,34,34),
+(1,9,12,23,24,27,35,35),
+(1,9,13,24,25,28,37,36),
+(1,9,14,24,25,29,38,38),
+(1,9,15,24,25,29,39,39),
+(1,9,16,25,26,30,41,40),
+(1,9,17,25,26,31,42,42),
+(1,9,18,25,27,31,43,43),
+(1,9,19,26,27,32,45,44),
+(1,9,20,26,28,33,46,46),
+(1,9,21,26,28,33,48,47),
+(1,9,22,27,29,34,49,49),
+(1,9,23,27,29,35,51,50),
+(1,9,24,28,30,35,52,51),
+(1,9,25,28,30,36,53,53),
+(1,9,26,28,31,37,55,54),
+(1,9,27,29,31,37,56,56),
+(1,9,28,29,32,38,58,57),
+(1,9,29,30,32,39,59,59),
+(1,9,30,30,33,40,61,60),
+(1,9,31,30,33,40,62,62),
+(1,9,32,31,34,41,64,63),
+(1,9,33,31,34,42,66,65),
+(1,9,34,32,35,43,67,66),
+(1,9,35,32,35,44,69,68),
+(1,9,36,33,36,44,70,69),
+(1,9,37,33,36,45,72,71),
+(1,9,38,34,37,46,74,73),
+(1,9,39,34,38,47,75,74),
+(1,9,40,35,38,48,77,76),
+(1,9,41,35,39,48,79,78),
+(1,9,42,35,39,49,80,79),
+(1,9,43,36,40,50,82,81),
+(1,9,44,36,40,51,84,83),
+(1,9,45,37,41,52,85,84),
+(1,9,46,37,42,53,87,86),
+(1,9,47,38,42,54,89,88),
+(1,9,48,38,43,55,91,89),
+(1,9,49,39,44,55,93,91),
+(1,9,50,40,44,56,94,93),
+(1,9,51,40,45,57,96,95),
+(1,9,52,41,45,58,98,97),
+(1,9,53,41,46,59,100,98),
+(1,9,54,42,47,60,102,100),
+(1,9,55,42,47,61,103,102),
+(1,9,56,43,48,62,105,104),
+(1,9,57,43,49,63,107,106),
+(1,9,58,44,49,64,109,108),
+(1,9,59,44,50,65,111,109),
+(1,9,60,45,51,66,113,111),
+(1,9,61,46,51,67,115,113),
+(1,9,62,46,52,68,117,115),
+(1,9,63,47,53,69,119,117),
+(1,9,64,47,54,70,121,119),
+(1,9,65,48,54,71,123,121),
+(1,9,66,49,55,72,125,123),
+(1,9,67,49,56,73,127,125),
+(1,9,68,50,57,74,129,127),
+(1,9,69,50,57,75,131,129),
+(1,9,70,51,58,76,133,131),
+(1,9,71,52,59,78,135,146),
+(1,9,72,53,59,79,138,148),
+(1,9,73,54,60,80,140,151),
+(1,9,74,54,61,89,143,154),
+(1,9,75,55,62,91,145,156),
+(1,9,76,56,63,92,148,159),
+(1,9,77,57,64,93,151,162),
+(1,9,78,57,65,95,153,165),
+(1,9,79,58,66,96,156,168),
+(1,9,80,59,67,97,159,170),
+(2,1,1,26,17,24,17,23),
+(2,1,2,27,18,25,17,23),
+(2,1,3,29,19,26,17,24),
+(2,1,4,30,19,27,17,24),
+(2,1,5,31,20,29,17,24),
+(2,1,6,32,21,30,17,24),
+(2,1,7,34,22,31,18,25),
+(2,1,8,35,23,32,18,25),
+(2,1,9,37,24,34,18,25),
+(2,1,10,38,24,35,18,26),
+(2,1,11,39,25,36,18,26),
+(2,1,12,41,26,37,18,26),
+(2,1,13,42,27,39,18,27),
+(2,1,14,44,28,40,18,27),
+(2,1,15,45,29,41,18,27),
+(2,1,16,47,30,43,19,28),
+(2,1,17,48,31,44,19,28),
+(2,1,18,50,32,45,19,28),
+(2,1,19,51,33,47,19,29),
+(2,1,20,53,34,48,19,29),
+(2,1,21,54,34,50,19,29),
+(2,1,22,56,35,51,19,30),
+(2,1,23,57,36,52,20,30),
+(2,1,24,59,37,54,20,30),
+(2,1,25,60,38,55,20,31),
+(2,1,26,62,39,57,20,31),
+(2,1,27,64,40,58,20,32),
+(2,1,28,65,41,60,20,32),
+(2,1,29,67,43,61,21,32),
+(2,1,30,69,44,63,21,33),
+(2,1,31,70,45,64,21,33),
+(2,1,32,72,46,66,21,34),
+(2,1,33,74,47,67,21,34),
+(2,1,34,76,48,69,21,35),
+(2,1,35,77,49,71,22,35),
+(2,1,36,79,50,72,22,36),
+(2,1,37,81,51,74,22,36),
+(2,1,38,83,52,76,22,36),
+(2,1,39,84,53,77,22,37),
+(2,1,40,86,55,79,23,37),
+(2,1,41,88,56,81,23,38),
+(2,1,42,90,57,82,23,38),
+(2,1,43,92,58,84,23,39),
+(2,1,44,94,59,86,23,39),
+(2,1,45,96,60,87,24,40),
+(2,1,46,98,62,89,24,40),
+(2,1,47,100,63,91,24,41),
+(2,1,48,101,64,93,24,41),
+(2,1,49,103,65,94,25,42),
+(2,1,50,105,66,96,25,42),
+(2,1,51,107,68,98,25,43),
+(2,1,52,109,69,100,25,43),
+(2,1,53,111,70,102,25,44),
+(2,1,54,113,71,104,26,45),
+(2,1,55,115,73,105,26,45),
+(2,1,56,118,74,107,26,46),
+(2,1,57,120,75,109,26,46),
+(2,1,58,122,77,111,27,47),
+(2,1,59,124,78,113,27,47),
+(2,1,60,126,79,115,27,48),
+(2,1,61,128,81,117,27,48),
+(2,1,62,130,82,119,28,49),
+(2,1,63,132,83,121,28,50),
+(2,1,64,135,85,123,28,50),
+(2,1,65,137,86,125,29,51),
+(2,1,66,139,87,127,29,52),
+(2,1,67,141,89,129,29,52),
+(2,1,68,143,90,131,29,53),
+(2,1,69,146,92,133,30,53),
+(2,1,70,148,93,135,30,54),
+(2,1,71,157,94,142,30,55),
+(2,1,72,162,96,148,30,56),
+(2,1,73,165,98,150,30,57),
+(2,1,74,168,99,153,31,57),
+(2,1,75,170,101,154,31,58),
+(2,1,76,172,103,156,31,59),
+(2,1,77,174,105,159,32,60),
+(2,1,78,179,106,162,32,60),
+(2,1,79,184,108,167,32,61),
+(2,1,80,187,110,170,33,62),
+(2,3,1,23,20,23,17,24),
+(2,3,2,23,21,24,18,25),
+(2,3,3,24,23,25,18,25),
+(2,3,4,24,24,26,19,26),
+(2,3,5,25,25,27,19,26),
+(2,3,6,25,27,28,20,27),
+(2,3,7,26,28,28,21,28),
+(2,3,8,26,30,29,21,28),
+(2,3,9,26,31,30,22,29),
+(2,3,10,27,33,31,22,30),
+(2,3,11,27,34,32,23,30),
+(2,3,12,28,36,33,24,31),
+(2,3,13,28,37,34,24,32),
+(2,3,14,29,39,35,25,33),
+(2,3,15,29,40,36,26,33),
+(2,3,16,30,42,37,26,34),
+(2,3,17,30,43,39,27,35),
+(2,3,18,31,45,40,28,35),
+(2,3,19,31,47,41,28,36),
+(2,3,20,32,48,42,29,37),
+(2,3,21,32,50,43,30,38),
+(2,3,22,33,51,44,31,39),
+(2,3,23,34,53,45,31,39),
+(2,3,24,34,55,46,32,40),
+(2,3,25,35,57,47,33,41),
+(2,3,26,35,58,48,34,42),
+(2,3,27,36,60,50,34,43),
+(2,3,28,36,62,51,35,43),
+(2,3,29,37,63,52,36,44),
+(2,3,30,38,65,53,37,45),
+(2,3,31,38,67,54,37,46),
+(2,3,32,39,69,56,38,47),
+(2,3,33,39,71,57,39,48),
+(2,3,34,40,72,58,40,49),
+(2,3,35,41,74,59,41,49),
+(2,3,36,41,76,61,42,50),
+(2,3,37,42,78,62,42,51),
+(2,3,38,43,80,63,43,52),
+(2,3,39,43,82,64,44,53),
+(2,3,40,44,84,66,45,54),
+(2,3,41,45,86,67,46,55),
+(2,3,42,45,88,68,47,56),
+(2,3,43,46,90,70,47,57),
+(2,3,44,47,91,71,48,58),
+(2,3,45,47,93,72,49,59),
+(2,3,46,48,95,74,50,60),
+(2,3,47,49,98,75,51,61),
+(2,3,48,50,100,77,52,62),
+(2,3,49,50,102,78,53,63),
+(2,3,50,51,104,79,54,64),
+(2,3,51,52,106,81,55,65),
+(2,3,52,52,108,82,56,66),
+(2,3,53,53,110,84,57,67),
+(2,3,54,54,112,85,58,68),
+(2,3,55,55,114,87,59,69),
+(2,3,56,55,116,88,60,70),
+(2,3,57,56,118,90,61,71),
+(2,3,58,57,121,91,62,72),
+(2,3,59,58,123,93,63,73),
+(2,3,60,59,125,94,64,74),
+(2,3,61,59,127,96,65,76),
+(2,3,62,60,130,97,66,77),
+(2,3,63,61,132,99,67,78),
+(2,3,64,62,134,100,68,79),
+(2,3,65,63,136,102,69,80),
+(2,3,66,64,139,104,70,81),
+(2,3,67,64,141,105,71,82),
+(2,3,68,65,143,107,72,84),
+(2,3,69,66,146,108,73,85),
+(2,3,70,67,148,110,74,86),
+(2,3,71,68,151,112,75,87),
+(2,3,72,69,154,114,76,88),
+(2,3,73,70,157,116,77,90),
+(2,3,74,71,160,118,79,91),
+(2,3,75,72,163,120,80,93),
+(2,3,76,73,166,122,81,94),
+(2,3,77,74,169,124,83,96),
+(2,3,78,75,172,126,84,97),
+(2,3,79,76,175,128,85,99),
+(2,3,80,77,178,130,87,100),
+(2,4,1,24,20,23,17,23),
+(2,4,2,25,21,24,17,23),
+(2,4,3,25,23,24,17,24),
+(2,4,4,26,24,25,17,24),
+(2,4,5,27,26,26,18,24),
+(2,4,6,28,27,26,18,25),
+(2,4,7,29,29,27,18,25),
+(2,4,8,29,30,28,18,26),
+(2,4,9,30,32,29,18,26),
+(2,4,10,31,33,29,19,26),
+(2,4,11,32,35,30,19,27),
+(2,4,12,33,37,31,19,27),
+(2,4,13,34,38,32,19,28),
+(2,4,14,34,40,32,19,28),
+(2,4,15,35,41,33,19,28),
+(2,4,16,36,43,34,20,29),
+(2,4,17,37,45,35,20,29),
+(2,4,18,38,46,36,20,30),
+(2,4,19,39,48,37,20,30),
+(2,4,20,40,50,37,21,31),
+(2,4,21,41,52,38,21,31),
+(2,4,22,42,53,39,21,31),
+(2,4,23,43,55,40,21,32),
+(2,4,24,43,57,41,21,32),
+(2,4,25,44,59,42,22,33),
+(2,4,26,45,60,43,22,33),
+(2,4,27,46,62,44,22,34),
+(2,4,28,47,64,44,22,34),
+(2,4,29,48,66,45,23,35),
+(2,4,30,49,68,46,23,35),
+(2,4,31,50,70,47,23,36),
+(2,4,32,51,72,48,23,36),
+(2,4,33,53,73,49,24,37),
+(2,4,34,54,75,50,24,38),
+(2,4,35,55,77,51,24,38),
+(2,4,36,56,79,52,24,39),
+(2,4,37,57,81,53,25,39),
+(2,4,38,58,83,54,25,40),
+(2,4,39,59,85,55,25,40),
+(2,4,40,60,87,56,26,41),
+(2,4,41,61,89,57,26,41),
+(2,4,42,62,91,58,26,42),
+(2,4,43,63,93,59,27,43),
+(2,4,44,65,95,60,27,43),
+(2,4,45,66,98,61,27,44),
+(2,4,46,67,100,62,27,44),
+(2,4,47,68,102,64,28,45),
+(2,4,48,69,104,65,28,46),
+(2,4,49,71,106,66,28,46),
+(2,4,50,72,108,67,29,47),
+(2,4,51,73,110,68,29,48),
+(2,4,52,74,113,69,29,48),
+(2,4,53,75,115,70,30,49),
+(2,4,54,77,117,71,30,50),
+(2,4,55,78,119,73,30,50),
+(2,4,56,79,122,74,31,51),
+(2,4,57,80,124,75,31,52),
+(2,4,58,82,126,76,31,52),
+(2,4,59,83,129,77,32,53),
+(2,4,60,84,131,78,32,54),
+(2,4,61,86,133,80,33,54),
+(2,4,62,87,136,81,33,55),
+(2,4,63,88,138,82,33,56),
+(2,4,64,90,140,83,34,57),
+(2,4,65,91,143,85,34,57),
+(2,4,66,92,145,86,34,58),
+(2,4,67,94,148,87,35,59),
+(2,4,68,95,150,88,35,59),
+(2,4,69,97,153,90,36,60),
+(2,4,70,98,155,91,36,61),
+(2,4,71,100,158,92,36,62),
+(2,4,72,102,161,94,37,62),
+(2,4,73,103,164,99,37,63),
+(2,4,74,105,167,100,38,64),
+(2,4,75,107,170,102,38,65),
+(2,4,76,108,173,102,38,66),
+(2,4,77,110,176,102,39,67),
+(2,4,78,112,180,103,39,68),
+(2,4,79,114,183,105,40,69),
+(2,4,80,116,186,107,40,70),
+(2,6,1,26,17,24,17,23),
+(2,6,2,27,18,25,17,23),
+(2,6,3,29,19,26,17,24),
+(2,6,4,30,19,27,17,24),
+(2,6,5,31,20,29,17,24),
+(2,6,6,32,21,30,17,24),
+(2,6,7,34,22,31,18,25),
+(2,6,8,35,23,32,18,25),
+(2,6,9,37,24,34,18,25),
+(2,6,10,38,24,35,18,26),
+(2,6,11,39,25,36,18,26),
+(2,6,12,41,26,37,18,26),
+(2,6,13,42,27,39,18,27),
+(2,6,14,44,28,40,18,27),
+(2,6,15,45,29,41,18,27),
+(2,6,16,47,30,43,19,28),
+(2,6,17,48,31,44,19,28),
+(2,6,18,50,32,45,19,28),
+(2,6,19,51,33,47,19,29),
+(2,6,20,53,34,48,19,29),
+(2,6,21,54,34,50,19,29),
+(2,6,22,56,35,51,19,30),
+(2,6,23,57,36,52,20,30),
+(2,6,24,59,37,54,20,30),
+(2,6,25,60,38,55,20,31),
+(2,6,26,62,39,57,20,31),
+(2,6,27,64,40,58,20,32),
+(2,6,28,65,41,60,20,32),
+(2,6,29,67,43,61,21,32),
+(2,6,30,69,44,63,21,33),
+(2,6,31,70,45,64,21,33),
+(2,6,32,72,46,66,21,34),
+(2,6,33,74,47,67,21,34),
+(2,6,34,76,48,69,21,35),
+(2,6,35,77,49,71,22,35),
+(2,6,36,79,50,72,22,36),
+(2,6,37,81,51,74,22,36),
+(2,6,38,83,52,76,22,36),
+(2,6,39,84,53,77,22,37),
+(2,6,40,86,55,79,23,37),
+(2,6,41,88,56,81,23,38),
+(2,6,42,90,57,82,23,38),
+(2,6,43,92,58,84,23,39),
+(2,6,44,94,59,86,23,39),
+(2,6,45,96,60,87,24,40),
+(2,6,46,98,62,89,24,40),
+(2,6,47,100,63,91,24,41),
+(2,6,48,101,64,93,24,41),
+(2,6,49,103,65,94,25,42),
+(2,6,50,105,66,96,25,42),
+(2,6,51,107,68,98,25,43),
+(2,6,52,109,69,100,25,43),
+(2,6,53,110,69,100,25,44),
+(2,6,54,111,70,101,26,45),
+(2,6,55,111,70,101,26,45),
+(2,6,56,114,72,104,26,46),
+(2,6,57,116,73,106,26,46),
+(2,6,58,118,74,108,27,47),
+(2,6,59,124,76,110,27,47),
+(2,6,60,126,77,112,27,48),
+(2,6,61,128,78,114,27,49),
+(2,6,62,131,80,116,27,49),
+(2,6,63,133,81,119,28,50),
+(2,6,64,136,83,121,28,50),
+(2,6,65,136,84,123,28,51),
+(2,6,66,142,86,126,28,52),
+(2,6,67,145,87,128,29,52),
+(2,6,68,147,89,130,29,53),
+(2,6,69,150,90,133,29,54),
+(2,6,70,157,92,135,29,54),
+(2,6,71,160,94,138,30,55),
+(2,6,72,163,95,140,30,56),
+(2,6,73,166,97,151,30,57),
+(2,6,74,169,99,154,30,57),
+(2,6,75,172,100,156,31,58),
+(2,6,76,175,102,160,31,59),
+(2,6,77,179,104,162,31,60),
+(2,6,78,182,105,165,31,60),
+(2,6,79,191,107,168,32,61),
+(2,6,80,194,109,171,32,62),
+(2,7,1,24,17,23,18,25),
+(2,7,2,25,17,24,19,26),
+(2,7,3,26,18,25,20,27),
+(2,7,4,26,18,26,21,28),
+(2,7,5,27,19,27,22,29),
+(2,7,6,28,19,28,23,30),
+(2,7,7,29,20,29,24,31),
+(2,7,8,30,20,30,25,32),
+(2,7,9,31,21,31,26,33),
+(2,7,10,32,21,32,27,34),
+(2,7,11,33,22,33,28,36),
+(2,7,12,34,22,34,29,37),
+(2,7,13,34,23,35,30,38),
+(2,7,14,35,23,36,31,39),
+(2,7,15,36,24,37,32,40),
+(2,7,16,37,24,39,33,41),
+(2,7,17,38,25,40,34,43),
+(2,7,18,39,25,41,35,44),
+(2,7,19,40,26,42,36,45),
+(2,7,20,41,26,43,37,46),
+(2,7,21,42,27,44,38,47),
+(2,7,22,43,27,45,39,49),
+(2,7,23,44,28,47,40,50),
+(2,7,24,45,28,48,41,51),
+(2,7,25,47,29,49,43,52),
+(2,7,26,48,30,50,44,54),
+(2,7,27,49,30,52,45,55),
+(2,7,28,50,31,53,46,56),
+(2,7,29,51,31,54,47,58),
+(2,7,30,52,32,55,48,59),
+(2,7,31,53,33,57,50,60),
+(2,7,32,54,33,58,51,62),
+(2,7,33,55,34,59,52,63),
+(2,7,34,57,34,61,53,65),
+(2,7,35,58,35,62,55,66),
+(2,7,36,59,36,63,56,67),
+(2,7,37,60,36,65,57,69),
+(2,7,38,61,37,66,58,70),
+(2,7,39,62,38,67,60,72),
+(2,7,40,64,38,69,61,73),
+(2,7,41,65,39,70,62,75),
+(2,7,42,66,40,72,64,76),
+(2,7,43,67,40,73,65,78),
+(2,7,44,69,41,74,66,79),
+(2,7,45,70,42,76,68,81),
+(2,7,46,71,42,77,69,82),
+(2,7,47,72,43,79,70,84),
+(2,7,48,74,44,80,72,85),
+(2,7,49,75,45,82,73,87),
+(2,7,50,76,45,83,75,89),
+(2,7,51,78,46,85,76,90),
+(2,7,52,79,47,86,77,92),
+(2,7,53,80,47,88,79,93),
+(2,7,54,82,48,90,80,95),
+(2,7,55,83,49,91,82,97),
+(2,7,56,85,50,93,83,98),
+(2,7,57,86,50,94,85,100),
+(2,7,58,87,51,96,86,102),
+(2,7,59,89,52,97,88,103),
+(2,7,60,90,53,99,89,105),
+(2,7,61,92,54,101,91,107),
+(2,7,62,93,54,102,92,109),
+(2,7,63,95,55,104,94,110),
+(2,7,64,96,56,106,95,112),
+(2,7,65,97,57,107,97,114),
+(2,7,66,99,58,109,99,116),
+(2,7,67,100,58,111,100,118),
+(2,7,68,102,59,113,102,119),
+(2,7,69,103,60,114,103,121),
+(2,7,70,105,61,116,105,123),
+(2,7,71,106,62,118,117,125),
+(2,7,72,108,63,120,119,128),
+(2,7,73,110,64,122,122,130),
+(2,7,74,112,65,125,124,132),
+(2,7,75,114,66,127,126,134),
+(2,7,76,116,67,129,128,137),
+(2,7,77,117,68,131,128,139),
+(2,7,78,119,69,133,133,141),
+(2,7,79,121,70,136,135,144),
+(2,7,80,123,71,138,137,146),
+(2,9,1,23,17,23,19,25),
+(2,9,2,23,17,24,20,26),
+(2,9,3,24,18,24,21,27),
+(2,9,4,24,18,25,23,28),
+(2,9,5,24,18,25,24,30),
+(2,9,6,24,19,26,25,31),
+(2,9,7,25,19,26,26,32),
+(2,9,8,25,20,27,27,33),
+(2,9,9,25,20,27,29,34),
+(2,9,10,26,20,28,30,36),
+(2,9,11,26,21,29,31,37),
+(2,9,12,26,21,29,33,38),
+(2,9,13,27,22,30,34,39),
+(2,9,14,27,22,31,35,41),
+(2,9,15,27,23,31,37,42),
+(2,9,16,28,23,32,38,43),
+(2,9,17,28,23,32,39,45),
+(2,9,18,28,24,33,41,46),
+(2,9,19,29,24,34,42,47),
+(2,9,20,29,25,34,43,49),
+(2,9,21,29,25,35,45,50),
+(2,9,22,30,26,36,46,51),
+(2,9,23,30,26,37,48,53),
+(2,9,24,30,27,37,49,54),
+(2,9,25,31,27,38,51,56),
+(2,9,26,31,28,39,52,57),
+(2,9,27,32,28,39,54,59),
+(2,9,28,32,29,40,55,60),
+(2,9,29,32,29,41,57,62),
+(2,9,30,33,30,42,58,63),
+(2,9,31,33,30,42,60,65),
+(2,9,32,34,31,43,61,66),
+(2,9,33,34,31,44,63,68),
+(2,9,34,35,32,45,64,69),
+(2,9,35,35,32,45,66,71),
+(2,9,36,36,33,46,68,72),
+(2,9,37,36,34,47,69,74),
+(2,9,38,36,34,48,71,76),
+(2,9,39,37,35,49,72,77),
+(2,9,40,37,35,50,74,79),
+(2,9,41,38,36,50,76,80),
+(2,9,42,38,36,51,77,82),
+(2,9,43,39,37,52,79,84),
+(2,9,44,39,38,53,81,85),
+(2,9,45,40,38,54,83,87),
+(2,9,46,40,39,55,84,89),
+(2,9,47,41,39,56,86,91),
+(2,9,48,41,40,56,88,92),
+(2,9,49,42,41,57,90,94),
+(2,9,50,42,41,58,91,96),
+(2,9,51,43,42,59,93,98),
+(2,9,52,43,43,60,95,99),
+(2,9,53,44,43,61,97,101),
+(2,9,54,45,44,62,99,103),
+(2,9,55,45,45,63,101,105),
+(2,9,56,46,45,64,102,107),
+(2,9,57,46,46,65,104,109),
+(2,9,58,47,47,66,106,110),
+(2,9,59,47,47,67,108,112),
+(2,9,60,48,48,68,110,114),
+(2,9,61,48,49,69,112,116),
+(2,9,62,49,49,70,114,118),
+(2,9,63,50,50,71,116,120),
+(2,9,64,50,51,72,118,122),
+(2,9,65,51,51,73,120,124),
+(2,9,66,52,52,74,122,126),
+(2,9,67,52,53,75,124,128),
+(2,9,68,53,54,76,126,130),
+(2,9,69,53,54,77,128,132),
+(2,9,70,54,55,78,130,134),
+(2,9,71,55,56,88,134,145),
+(2,9,72,56,56,89,135,147),
+(2,9,73,57,57,90,137,150),
+(2,9,74,57,58,91,142,153),
+(2,9,75,58,59,93,142,155),
+(2,9,76,59,60,94,145,158),
+(2,9,77,60,61,95,148,161),
+(2,9,78,60,62,97,150,164),
+(2,9,79,61,63,98,153,167),
+(2,9,80,62,64,99,156,169),
+(3,1,1,25,16,25,19,19),
+(3,1,2,26,17,26,19,19),
+(3,1,3,28,18,27,19,20),
+(3,1,4,29,18,28,19,20),
+(3,1,5,30,19,30,19,20),
+(3,1,6,31,20,31,19,20),
+(3,1,7,33,21,32,20,21),
+(3,1,8,34,22,33,20,21),
+(3,1,9,36,23,35,20,21),
+(3,1,10,37,23,36,20,22),
+(3,1,11,38,24,37,20,22),
+(3,1,12,40,25,38,20,22),
+(3,1,13,41,26,40,20,23),
+(3,1,14,43,27,41,20,23),
+(3,1,15,44,28,42,20,23),
+(3,1,16,46,29,44,21,24),
+(3,1,17,47,30,45,21,24),
+(3,1,18,49,31,46,21,24),
+(3,1,19,50,32,48,21,25),
+(3,1,20,52,33,49,21,25),
+(3,1,21,53,34,51,21,26),
+(3,1,22,55,34,52,21,26),
+(3,1,23,56,35,53,21,26),
+(3,1,24,58,36,55,22,27),
+(3,1,25,59,37,56,22,27),
+(3,1,26,61,38,58,22,27),
+(3,1,27,63,39,59,22,28),
+(3,1,28,64,41,61,22,28),
+(3,1,29,66,42,62,22,29),
+(3,1,30,68,43,64,23,29),
+(3,1,31,69,44,65,23,30),
+(3,1,32,71,45,67,23,30),
+(3,1,33,73,46,68,23,30),
+(3,1,34,75,47,70,23,31),
+(3,1,35,76,48,72,24,31),
+(3,1,36,78,49,73,24,32),
+(3,1,37,80,50,75,24,32),
+(3,1,38,82,51,76,24,33),
+(3,1,39,84,52,78,24,33),
+(3,1,40,85,54,80,24,34),
+(3,1,41,87,55,81,25,34),
+(3,1,42,89,56,83,25,35),
+(3,1,43,91,57,85,25,35),
+(3,1,44,93,58,87,25,36),
+(3,1,45,95,59,88,26,36),
+(3,1,46,97,61,90,26,37),
+(3,1,47,99,62,92,26,37),
+(3,1,48,101,63,94,26,38),
+(3,1,49,102,64,95,26,38),
+(3,1,50,104,65,97,27,39),
+(3,1,51,106,67,99,27,39),
+(3,1,52,108,68,101,27,40),
+(3,1,53,110,69,103,27,40),
+(3,1,54,112,70,104,28,41),
+(3,1,55,115,72,106,28,41),
+(3,1,56,117,73,108,28,42),
+(3,1,57,119,74,110,28,42),
+(3,1,58,121,76,112,29,43),
+(3,1,59,123,77,114,29,43),
+(3,1,60,125,78,116,29,44),
+(3,1,61,127,80,118,29,45),
+(3,1,62,129,81,120,30,45),
+(3,1,63,131,82,122,30,46),
+(3,1,64,134,84,124,30,46),
+(3,1,65,136,85,126,31,47),
+(3,1,66,138,86,128,31,48),
+(3,1,67,140,88,130,31,48),
+(3,1,68,142,89,132,31,49),
+(3,1,69,145,91,134,32,49),
+(3,1,70,147,92,136,32,50),
+(3,1,71,150,93,138,32,51),
+(3,1,72,152,95,141,32,52),
+(3,1,73,164,97,151,32,53),
+(3,1,74,164,98,151,33,53),
+(3,1,75,170,100,156,33,54),
+(3,1,76,173,102,160,33,55),
+(3,1,77,173,104,160,34,56),
+(3,1,78,176,105,162,34,56),
+(3,1,79,183,107,168,34,57),
+(3,1,80,186,109,171,35,58),
+(3,2,1,24,16,25,19,20),
+(3,2,2,25,17,26,20,21),
+(3,2,3,26,17,27,20,21),
+(3,2,4,27,18,28,21,22),
+(3,2,5,28,18,29,22,23),
+(3,2,6,29,19,30,22,24),
+(3,2,7,31,20,31,23,24),
+(3,2,8,32,20,32,24,25),
+(3,2,9,33,21,33,24,26),
+(3,2,10,34,21,34,25,26),
+(3,2,11,35,22,36,26,27),
+(3,2,12,36,23,37,26,28),
+(3,2,13,38,23,38,27,29),
+(3,2,14,39,24,39,28,30),
+(3,2,15,40,25,40,29,30),
+(3,2,16,41,25,41,29,31),
+(3,2,17,43,26,43,30,32),
+(3,2,18,44,27,44,31,33),
+(3,2,19,45,28,45,32,34),
+(3,2,20,47,28,46,32,35),
+(3,2,21,48,29,47,33,35),
+(3,2,22,49,30,49,34,36),
+(3,2,23,51,30,50,35,37),
+(3,2,24,52,31,51,36,38),
+(3,2,25,53,32,52,36,39),
+(3,2,26,55,33,54,37,40),
+(3,2,27,56,33,55,38,41),
+(3,2,28,57,34,56,39,42),
+(3,2,29,59,35,58,40,43),
+(3,2,30,60,36,59,41,43),
+(3,2,31,62,37,60,42,44),
+(3,2,32,63,37,62,42,45),
+(3,2,33,65,38,63,43,46),
+(3,2,34,66,39,65,44,47),
+(3,2,35,68,40,66,45,48),
+(3,2,36,69,41,67,46,49),
+(3,2,37,71,41,69,47,50),
+(3,2,38,72,42,70,48,51),
+(3,2,39,74,43,72,49,52),
+(3,2,40,75,44,73,50,53),
+(3,2,41,77,45,75,51,54),
+(3,2,42,78,46,76,52,55),
+(3,2,43,80,47,78,53,56),
+(3,2,44,82,47,79,54,57),
+(3,2,45,83,48,81,55,59),
+(3,2,46,85,49,82,56,60),
+(3,2,47,87,50,84,57,61),
+(3,2,48,88,51,85,58,62),
+(3,2,49,90,52,87,59,63),
+(3,2,50,92,53,89,60,64),
+(3,2,51,93,54,90,61,65),
+(3,2,52,95,55,92,62,66),
+(3,2,53,97,56,93,63,67),
+(3,2,54,98,57,95,64,69),
+(3,2,55,100,58,97,65,70),
+(3,2,56,102,59,98,66,71),
+(3,2,57,104,60,100,67,72),
+(3,2,58,106,61,102,68,73),
+(3,2,59,107,62,103,69,74),
+(3,2,60,109,63,105,70,76),
+(3,2,61,111,64,107,72,77),
+(3,2,62,113,65,109,73,78),
+(3,2,63,115,66,110,74,79),
+(3,2,64,117,67,112,75,80),
+(3,2,65,118,68,114,76,82),
+(3,2,66,120,69,116,77,83),
+(3,2,67,122,70,118,78,84),
+(3,2,68,124,71,119,80,85),
+(3,2,69,126,72,121,81,87),
+(3,2,70,128,73,123,82,88),
+(3,2,71,150,74,125,83,89),
+(3,2,72,152,75,128,85,91),
+(3,2,73,156,76,130,86,93),
+(3,2,74,158,78,132,88,94),
+(3,2,75,161,79,134,89,96),
+(3,2,76,164,80,137,91,97),
+(3,2,77,166,82,139,92,99),
+(3,2,78,170,83,141,94,101),
+(3,2,79,172,84,144,95,102),
+(3,2,80,175,86,146,97,104),
+(3,3,1,22,19,24,19,20),
+(3,3,2,22,20,25,20,21),
+(3,3,3,23,22,26,20,21),
+(3,3,4,23,23,27,21,22),
+(3,3,5,24,25,28,21,23),
+(3,3,6,24,26,29,22,23),
+(3,3,7,25,27,29,23,24),
+(3,3,8,25,29,30,23,25),
+(3,3,9,25,30,31,24,25),
+(3,3,10,26,32,32,24,26),
+(3,3,11,26,33,33,25,27),
+(3,3,12,27,35,34,26,27),
+(3,3,13,27,36,35,26,28),
+(3,3,14,28,38,36,27,29),
+(3,3,15,28,39,37,28,29),
+(3,3,16,29,41,38,28,30),
+(3,3,17,29,42,39,29,31),
+(3,3,18,30,44,41,30,32),
+(3,3,19,30,46,42,30,32),
+(3,3,20,31,47,43,31,33),
+(3,3,21,32,49,44,32,34),
+(3,3,22,32,51,45,33,35),
+(3,3,23,33,52,46,33,36),
+(3,3,24,33,54,47,34,36),
+(3,3,25,34,56,48,35,37),
+(3,3,26,34,57,49,35,38),
+(3,3,27,35,59,51,36,39),
+(3,3,28,35,61,52,37,40),
+(3,3,29,36,63,53,38,40),
+(3,3,30,37,64,54,39,41),
+(3,3,31,37,66,55,39,42),
+(3,3,32,38,68,57,40,43),
+(3,3,33,38,70,58,41,44),
+(3,3,34,39,71,59,42,45),
+(3,3,35,40,73,60,43,46),
+(3,3,36,40,75,62,43,47),
+(3,3,37,41,77,63,44,47),
+(3,3,38,42,79,64,45,48),
+(3,3,39,42,81,65,46,49),
+(3,3,40,43,83,67,47,50),
+(3,3,41,44,85,68,48,51),
+(3,3,42,44,87,69,49,52),
+(3,3,43,45,89,71,49,53),
+(3,3,44,46,91,72,50,54),
+(3,3,45,46,93,73,51,55),
+(3,3,46,47,95,75,52,56),
+(3,3,47,48,97,76,53,57),
+(3,3,48,49,99,78,54,58),
+(3,3,49,49,101,79,55,59),
+(3,3,50,50,103,80,56,60),
+(3,3,51,51,105,82,57,61),
+(3,3,52,51,107,83,58,62),
+(3,3,53,52,109,85,59,63),
+(3,3,54,53,111,86,60,64),
+(3,3,55,54,113,88,61,65),
+(3,3,56,55,115,89,62,66),
+(3,3,57,55,118,91,62,67),
+(3,3,58,56,120,92,63,68),
+(3,3,59,57,122,94,64,70),
+(3,3,60,58,124,95,65,71),
+(3,3,61,58,126,97,67,72),
+(3,3,62,59,129,98,68,73),
+(3,3,63,60,131,100,69,74),
+(3,3,64,61,133,101,70,75),
+(3,3,65,62,135,103,71,76),
+(3,3,66,63,138,105,72,77),
+(3,3,67,63,140,106,73,78),
+(3,3,68,64,142,108,74,80),
+(3,3,69,65,145,109,75,81),
+(3,3,70,66,147,111,76,82),
+(3,3,71,67,150,113,77,83),
+(3,3,72,68,153,115,78,84),
+(3,3,73,69,156,117,79,86),
+(3,3,74,70,159,119,81,87),
+(3,3,75,71,162,121,82,89),
+(3,3,76,72,165,123,83,90),
+(3,3,77,73,168,125,85,92),
+(3,3,78,74,171,127,86,93),
+(3,3,79,75,174,129,87,95),
+(3,3,80,76,177,131,89,96),
+(3,4,1,23,19,24,19,19),
+(3,4,2,24,20,25,19,19),
+(3,4,3,24,22,25,19,20),
+(3,4,4,25,23,26,19,20),
+(3,4,5,26,25,27,20,20),
+(3,4,6,27,26,27,20,21),
+(3,4,7,28,28,28,20,21),
+(3,4,8,28,29,29,20,22),
+(3,4,9,29,31,30,20,22),
+(3,4,10,30,32,30,20,22),
+(3,4,11,31,34,31,21,23),
+(3,4,12,32,36,32,21,23),
+(3,4,13,33,37,33,21,24),
+(3,4,14,33,39,33,21,24),
+(3,4,15,34,40,34,21,25),
+(3,4,16,35,42,35,22,25),
+(3,4,17,36,44,36,22,25),
+(3,4,18,37,45,37,22,26),
+(3,4,19,38,47,38,22,26),
+(3,4,20,39,49,38,22,27),
+(3,4,21,40,51,39,23,27),
+(3,4,22,41,52,40,23,28),
+(3,4,23,42,54,41,23,28),
+(3,4,24,43,56,42,23,29),
+(3,4,25,44,58,43,24,29),
+(3,4,26,44,59,44,24,30),
+(3,4,27,45,61,44,24,30),
+(3,4,28,46,63,45,24,31),
+(3,4,29,47,65,46,25,31),
+(3,4,30,48,67,47,25,32),
+(3,4,31,49,69,48,25,32),
+(3,4,32,51,71,49,25,33),
+(3,4,33,52,72,50,26,33),
+(3,4,34,53,74,51,26,34),
+(3,4,35,54,76,52,26,34),
+(3,4,36,55,78,53,26,35),
+(3,4,37,56,80,54,27,35),
+(3,4,38,57,82,55,27,36),
+(3,4,39,58,84,56,27,37),
+(3,4,40,59,86,57,28,37),
+(3,4,41,60,88,58,28,38),
+(3,4,42,61,90,59,28,38),
+(3,4,43,63,92,60,28,39),
+(3,4,44,64,95,61,29,39),
+(3,4,45,65,97,62,29,40),
+(3,4,46,66,99,63,29,41),
+(3,4,47,67,101,64,30,41),
+(3,4,48,68,103,66,30,42),
+(3,4,49,70,105,67,30,43),
+(3,4,50,71,107,68,31,43),
+(3,4,51,72,110,69,31,44),
+(3,4,52,73,112,70,31,44),
+(3,4,53,74,114,71,32,45),
+(3,4,54,76,116,72,32,46),
+(3,4,55,77,118,73,32,46),
+(3,4,56,78,121,75,33,47),
+(3,4,57,80,123,76,33,48),
+(3,4,58,81,125,77,33,48),
+(3,4,59,82,128,78,34,49),
+(3,4,60,83,130,79,34,50),
+(3,4,61,85,132,81,34,51),
+(3,4,62,86,135,82,35,51),
+(3,4,63,87,137,83,35,52),
+(3,4,64,89,139,84,36,53),
+(3,4,65,90,142,86,36,53),
+(3,4,66,91,144,87,36,54),
+(3,4,67,93,147,88,37,55),
+(3,4,68,94,149,89,37,56),
+(3,4,69,96,152,91,38,56),
+(3,4,70,97,154,92,38,57),
+(3,4,71,99,157,93,38,58),
+(3,4,72,101,160,96,39,58),
+(3,4,73,102,163,97,39,59),
+(3,4,74,104,166,98,40,60),
+(3,4,75,106,169,100,40,61),
+(3,4,76,107,172,101,40,62),
+(3,4,77,109,175,103,41,63),
+(3,4,78,111,179,105,41,64),
+(3,4,79,113,182,106,42,65),
+(3,4,80,115,185,108,42,66),
+(3,5,1,22,16,23,21,22),
+(3,5,2,22,16,23,22,23),
+(3,5,3,22,16,24,24,25),
+(3,5,4,22,17,24,25,26),
+(3,5,5,23,17,24,26,27),
+(3,5,6,23,17,25,28,29),
+(3,5,7,23,17,25,29,30),
+(3,5,8,23,18,26,30,32),
+(3,5,9,23,18,26,32,33),
+(3,5,10,23,18,26,33,35),
+(3,5,11,24,18,27,35,36),
+(3,5,12,24,19,27,36,38),
+(3,5,13,24,19,28,37,39),
+(3,5,14,24,19,28,39,41),
+(3,5,15,24,19,28,40,42),
+(3,5,16,24,20,29,42,44),
+(3,5,17,25,20,29,43,45),
+(3,5,18,25,20,30,45,47),
+(3,5,19,25,21,30,46,49),
+(3,5,20,25,21,31,48,50),
+(3,5,21,25,21,31,50,52),
+(3,5,22,26,22,31,51,53),
+(3,5,23,26,22,32,53,55),
+(3,5,24,26,22,32,54,57),
+(3,5,25,26,22,33,56,58),
+(3,5,26,27,23,33,58,60),
+(3,5,27,27,23,34,59,62),
+(3,5,28,27,23,34,61,64),
+(3,5,29,27,24,35,63,65),
+(3,5,30,28,24,35,64,67),
+(3,5,31,28,24,36,66,69),
+(3,5,32,28,25,36,68,71),
+(3,5,33,28,25,37,70,72),
+(3,5,34,29,26,38,71,74),
+(3,5,35,29,26,38,73,76),
+(3,5,36,29,26,39,75,78),
+(3,5,37,29,27,39,77,80),
+(3,5,38,30,27,40,78,82),
+(3,5,39,30,27,40,80,84),
+(3,5,40,30,28,41,82,86),
+(3,5,41,31,28,41,84,88),
+(3,5,42,31,29,42,86,89),
+(3,5,43,31,29,43,88,91),
+(3,5,44,32,29,43,90,93),
+(3,5,45,32,30,44,92,95),
+(3,5,46,32,30,44,93,97),
+(3,5,47,32,30,45,95,99),
+(3,5,48,33,31,46,97,101),
+(3,5,49,33,31,46,99,103),
+(3,5,50,33,32,47,101,106),
+(3,5,51,34,32,48,103,108),
+(3,5,52,34,33,48,105,110),
+(3,5,53,35,33,49,107,112),
+(3,5,54,35,33,50,109,114),
+(3,5,55,35,34,50,111,116),
+(3,5,56,36,34,51,113,118),
+(3,5,57,36,35,52,116,120),
+(3,5,58,36,35,52,118,123),
+(3,5,59,37,36,53,120,125),
+(3,5,60,37,36,54,122,127),
+(3,5,61,37,37,54,124,129),
+(3,5,62,38,37,55,126,131),
+(3,5,63,38,38,56,128,134),
+(3,5,64,39,38,57,131,136),
+(3,5,65,39,39,57,133,138),
+(3,5,66,39,39,58,135,141),
+(3,5,67,40,40,59,137,143),
+(3,5,68,40,40,59,139,145),
+(3,5,69,41,40,60,142,148),
+(3,5,70,41,41,61,144,150),
+(3,5,71,41,42,62,147,153),
+(3,5,72,42,42,62,150,163),
+(3,5,73,42,43,63,153,166),
+(3,5,74,43,43,64,155,170),
+(3,5,75,43,44,65,158,173),
+(3,5,76,43,45,66,161,176),
+(3,5,77,44,45,67,164,179),
+(3,5,78,44,46,68,167,182),
+(3,5,79,45,46,69,170,184),
+(3,5,80,45,47,70,173,189),
+(3,6,1,25,16,25,19,19),
+(3,6,2,26,17,26,19,19),
+(3,6,3,28,18,27,19,20),
+(3,6,4,29,18,28,19,20),
+(3,6,5,30,19,30,19,20),
+(3,6,6,31,20,31,19,20),
+(3,6,7,33,21,32,20,21),
+(3,6,8,34,22,33,20,21),
+(3,6,9,36,23,35,20,21),
+(3,6,10,37,23,36,20,22),
+(3,6,11,38,24,37,20,22),
+(3,6,12,40,25,38,20,22),
+(3,6,13,41,26,40,20,23),
+(3,6,14,43,27,41,20,23),
+(3,6,15,44,28,42,20,23),
+(3,6,16,46,29,44,21,24),
+(3,6,17,47,30,45,21,24),
+(3,6,18,49,31,46,21,24),
+(3,6,19,50,32,48,21,25),
+(3,6,20,52,33,49,21,25),
+(3,6,21,53,34,51,21,26),
+(3,6,22,55,34,52,21,26),
+(3,6,23,56,35,53,21,26),
+(3,6,24,58,36,55,22,27),
+(3,6,25,59,37,56,22,27),
+(3,6,26,61,38,58,22,27),
+(3,6,27,63,39,59,22,28),
+(3,6,28,64,41,61,22,28),
+(3,6,29,66,42,62,22,29),
+(3,6,30,68,43,64,23,29),
+(3,6,31,69,44,65,23,30),
+(3,6,32,71,45,67,23,30),
+(3,6,33,73,46,68,23,30),
+(3,6,34,75,47,70,23,31),
+(3,6,35,76,48,72,24,31),
+(3,6,36,78,49,73,24,32),
+(3,6,37,80,50,75,24,32),
+(3,6,38,82,51,76,24,33),
+(3,6,39,84,52,78,24,33),
+(3,6,40,85,54,80,24,34),
+(3,6,41,87,55,81,25,34),
+(3,6,42,89,56,83,25,35),
+(3,6,43,91,57,85,25,35),
+(3,6,44,93,58,87,25,36),
+(3,6,45,95,59,88,26,36),
+(3,6,46,97,61,90,26,37),
+(3,6,47,99,62,92,26,37),
+(3,6,48,101,63,94,26,38),
+(3,6,49,102,64,95,26,38),
+(3,6,50,104,65,97,27,39),
+(3,6,51,106,67,99,27,39),
+(3,6,52,108,68,99,27,40),
+(3,6,53,109,68,101,27,40),
+(3,6,54,110,69,101,28,41),
+(3,6,55,110,69,102,28,41),
+(3,6,56,113,71,105,28,42),
+(3,6,57,118,72,107,28,42),
+(3,6,58,120,73,109,29,43),
+(3,6,59,123,75,111,29,43),
+(3,6,60,125,76,113,29,44),
+(3,6,61,126,77,115,29,45),
+(3,6,62,127,79,117,29,45),
+(3,6,63,129,80,120,30,46),
+(3,6,64,132,82,122,30,46),
+(3,6,65,135,83,124,30,47),
+(3,6,66,137,85,127,30,48),
+(3,6,67,144,86,129,31,48),
+(3,6,68,146,88,131,31,49),
+(3,6,69,149,89,133,31,50),
+(3,6,70,152,91,136,31,50),
+(3,6,71,154,93,139,32,51),
+(3,6,72,157,94,141,32,52),
+(3,6,73,160,96,144,32,53),
+(3,6,74,163,98,146,32,53),
+(3,6,75,166,99,150,33,54),
+(3,6,76,169,101,152,33,55),
+(3,6,77,172,103,155,33,56),
+(3,6,78,176,104,157,33,56),
+(3,6,79,179,106,160,34,57),
+(3,6,80,182,108,163,34,58),
+(4,1,1,20,25,21,20,20),
+(4,1,2,21,26,22,20,20),
+(4,1,3,23,27,23,20,21),
+(4,1,4,24,27,25,20,21),
+(4,1,5,25,28,26,20,21),
+(4,1,6,27,29,27,20,21),
+(4,1,7,28,30,28,21,22),
+(4,1,8,29,31,29,21,22),
+(4,1,9,31,31,31,21,22),
+(4,1,10,32,32,32,21,23),
+(4,1,11,33,33,33,21,23),
+(4,1,12,35,34,34,21,23),
+(4,1,13,36,35,36,21,24),
+(4,1,14,38,36,37,21,24),
+(4,1,15,39,37,38,21,24),
+(4,1,16,41,37,40,21,25),
+(4,1,17,42,38,41,22,25),
+(4,1,18,44,39,43,22,25),
+(4,1,19,45,40,44,22,26),
+(4,1,20,47,41,45,22,26),
+(4,1,21,48,42,47,22,26),
+(4,1,22,50,43,48,22,27),
+(4,1,23,52,44,50,22,27),
+(4,1,24,53,45,51,23,28),
+(4,1,25,55,46,52,23,28),
+(4,1,26,56,47,54,23,28),
+(4,1,27,58,48,55,23,29),
+(4,1,28,60,49,57,23,29),
+(4,1,29,61,50,58,23,30),
+(4,1,30,63,51,60,24,30),
+(4,1,31,65,52,62,24,30),
+(4,1,32,66,53,63,24,31),
+(4,1,33,68,54,65,24,31),
+(4,1,34,70,55,66,24,32),
+(4,1,35,72,56,68,24,32),
+(4,1,36,73,58,69,25,33),
+(4,1,37,75,59,71,25,33),
+(4,1,38,77,60,73,25,34),
+(4,1,39,79,61,74,25,34),
+(4,1,40,81,62,76,25,35),
+(4,1,41,82,63,78,26,35),
+(4,1,42,84,64,79,26,35),
+(4,1,43,86,66,81,26,36),
+(4,1,44,88,67,83,26,36),
+(4,1,45,90,68,85,26,37),
+(4,1,46,92,69,86,27,37),
+(4,1,47,94,70,88,27,38),
+(4,1,48,96,72,90,27,38),
+(4,1,49,98,73,92,27,39),
+(4,1,50,100,74,93,28,40),
+(4,1,51,102,75,95,28,40),
+(4,1,52,104,77,97,28,41),
+(4,1,53,106,78,99,28,41),
+(4,1,54,108,79,101,29,42),
+(4,1,55,110,80,103,29,42),
+(4,1,56,112,82,104,29,43),
+(4,1,57,114,83,106,29,43),
+(4,1,58,116,84,108,30,44),
+(4,1,59,118,86,110,30,44),
+(4,1,60,120,87,112,30,45),
+(4,1,61,122,88,114,30,46),
+(4,1,62,124,90,116,31,46),
+(4,1,63,127,91,118,31,47),
+(4,1,64,129,92,120,31,47),
+(4,1,65,131,94,122,32,48),
+(4,1,66,133,95,124,32,49),
+(4,1,67,135,97,126,32,49),
+(4,1,68,138,98,128,32,50),
+(4,1,69,140,100,130,33,50),
+(4,1,70,142,101,132,33,51),
+(4,1,71,145,102,134,33,52),
+(4,1,72,147,104,137,33,53),
+(4,1,73,150,106,139,33,54),
+(4,1,74,153,107,142,34,54),
+(4,1,75,156,109,144,34,55),
+(4,1,76,159,111,148,34,56),
+(4,1,77,162,113,150,35,57),
+(4,1,78,165,114,152,35,57),
+(4,1,79,178,116,164,35,58),
+(4,1,80,181,118,167,36,59),
+(4,3,1,17,28,20,20,21),
+(4,3,2,17,29,21,21,22),
+(4,3,3,18,31,22,21,22),
+(4,3,4,18,32,23,22,23),
+(4,3,5,19,33,24,22,24),
+(4,3,6,19,35,25,23,24),
+(4,3,7,20,36,26,24,25),
+(4,3,8,20,38,27,24,25),
+(4,3,9,21,39,27,25,26),
+(4,3,10,21,40,28,25,27),
+(4,3,11,22,42,29,26,28),
+(4,3,12,22,43,30,27,28),
+(4,3,13,23,45,31,27,29),
+(4,3,14,23,46,32,28,30),
+(4,3,15,24,48,34,29,30),
+(4,3,16,24,50,35,29,31),
+(4,3,17,25,51,36,30,32),
+(4,3,18,25,53,37,31,33),
+(4,3,19,26,54,38,31,33),
+(4,3,20,26,56,39,32,34),
+(4,3,21,27,57,40,33,35),
+(4,3,22,27,59,41,33,36),
+(4,3,23,28,61,42,34,36),
+(4,3,24,28,62,43,35,37),
+(4,3,25,29,64,44,36,38),
+(4,3,26,30,66,46,36,39),
+(4,3,27,30,68,47,37,40),
+(4,3,28,31,69,48,38,41),
+(4,3,29,31,71,49,39,41),
+(4,3,30,32,73,50,39,42),
+(4,3,31,33,75,52,40,43),
+(4,3,32,33,76,53,41,44),
+(4,3,33,34,78,54,42,45),
+(4,3,34,34,80,55,43,46),
+(4,3,35,35,82,57,44,47),
+(4,3,36,36,84,58,44,48),
+(4,3,37,36,86,59,45,48),
+(4,3,38,37,87,60,46,49),
+(4,3,39,38,89,62,47,50),
+(4,3,40,38,91,63,48,51),
+(4,3,41,39,93,64,49,52),
+(4,3,42,40,95,66,49,53),
+(4,3,43,40,97,67,50,54),
+(4,3,44,41,99,68,51,55),
+(4,3,45,42,101,70,52,56),
+(4,3,46,42,103,71,53,57),
+(4,3,47,43,105,72,54,58),
+(4,3,48,44,107,74,55,59),
+(4,3,49,45,109,75,56,60),
+(4,3,50,45,111,77,57,61),
+(4,3,51,46,113,78,58,62),
+(4,3,52,47,115,79,59,63),
+(4,3,53,47,118,81,60,64),
+(4,3,54,48,120,82,61,65),
+(4,3,55,49,122,84,61,66),
+(4,3,56,50,124,85,62,67),
+(4,3,57,50,126,87,63,68),
+(4,3,58,51,128,88,64,69),
+(4,3,59,52,131,90,65,70),
+(4,3,60,53,133,91,66,72),
+(4,3,61,54,135,93,67,73),
+(4,3,62,54,137,94,69,74),
+(4,3,63,55,140,96,70,75),
+(4,3,64,56,142,97,71,76),
+(4,3,65,57,144,99,72,77),
+(4,3,66,58,147,101,73,78),
+(4,3,67,58,149,102,74,79),
+(4,3,68,59,151,104,75,81),
+(4,3,69,60,154,105,76,82),
+(4,3,70,61,156,107,77,83),
+(4,3,71,62,159,109,78,84),
+(4,3,72,63,162,111,79,85),
+(4,3,73,64,165,113,80,87),
+(4,3,74,65,168,115,82,88),
+(4,3,75,66,171,117,83,90),
+(4,3,76,67,174,119,84,91),
+(4,3,77,68,177,121,86,93),
+(4,3,78,69,180,123,87,94),
+(4,3,79,70,190,125,91,96),
+(4,3,80,71,193,127,93,97),
+(4,4,1,18,28,20,20,20),
+(4,4,2,19,29,21,20,20),
+(4,4,3,20,31,21,20,21),
+(4,4,4,20,32,22,20,21),
+(4,4,5,21,34,23,21,21),
+(4,4,6,22,35,24,21,22),
+(4,4,7,23,37,24,21,22),
+(4,4,8,24,38,25,21,23),
+(4,4,9,24,40,26,21,23),
+(4,4,10,25,41,26,21,23),
+(4,4,11,26,43,27,22,24),
+(4,4,12,27,44,28,22,24),
+(4,4,13,28,46,29,22,25),
+(4,4,14,29,48,30,22,25),
+(4,4,15,29,49,30,22,25),
+(4,4,16,30,51,31,23,26),
+(4,4,17,31,52,32,23,26),
+(4,4,18,32,54,33,23,27),
+(4,4,19,33,56,34,23,27),
+(4,4,20,34,57,35,23,28),
+(4,4,21,35,59,35,24,28),
+(4,4,22,36,61,36,24,29),
+(4,4,23,37,63,37,24,29),
+(4,4,24,38,64,38,24,30),
+(4,4,25,39,66,39,25,30),
+(4,4,26,40,68,40,25,31),
+(4,4,27,41,70,41,25,31),
+(4,4,28,42,72,42,25,32),
+(4,4,29,43,73,43,25,32),
+(4,4,30,44,75,43,26,33),
+(4,4,31,45,77,44,26,33),
+(4,4,32,46,79,45,26,34),
+(4,4,33,47,81,46,27,34),
+(4,4,34,48,83,47,27,35),
+(4,4,35,49,85,48,27,35),
+(4,4,36,50,87,49,27,36),
+(4,4,37,51,89,50,28,36),
+(4,4,38,52,91,51,28,37),
+(4,4,39,53,93,52,28,38),
+(4,4,40,54,95,53,28,38),
+(4,4,41,56,97,54,29,39),
+(4,4,42,57,99,55,29,39),
+(4,4,43,58,101,56,29,40),
+(4,4,44,59,103,57,30,40),
+(4,4,45,60,105,59,30,41),
+(4,4,46,61,107,60,30,42),
+(4,4,47,62,109,61,31,42),
+(4,4,48,64,112,62,31,43),
+(4,4,49,65,114,63,31,44),
+(4,4,50,66,116,64,32,44),
+(4,4,51,67,118,65,32,45),
+(4,4,52,68,120,66,32,45),
+(4,4,53,70,123,67,33,46),
+(4,4,54,71,125,69,33,47),
+(4,4,55,72,127,70,33,47),
+(4,4,56,73,129,71,34,48),
+(4,4,57,75,132,72,34,49),
+(4,4,58,76,134,73,34,49),
+(4,4,59,77,136,74,35,50),
+(4,4,60,79,139,76,35,51),
+(4,4,61,80,141,77,35,51),
+(4,4,62,81,143,78,36,52),
+(4,4,63,82,146,79,36,53),
+(4,4,64,84,148,80,37,54),
+(4,4,65,85,151,82,37,54),
+(4,4,66,87,153,83,37,55),
+(4,4,67,88,156,84,38,56),
+(4,4,68,89,158,85,38,57),
+(4,4,69,91,160,87,39,57),
+(4,4,70,92,163,88,39,58),
+(4,4,71,94,166,90,39,59),
+(4,4,72,96,169,91,40,59),
+(4,4,73,97,172,93,40,60),
+(4,4,74,99,175,94,41,61),
+(4,4,75,101,178,96,41,62),
+(4,4,76,102,181,97,41,63),
+(4,4,77,104,184,99,42,64),
+(4,4,78,106,188,101,42,65),
+(4,4,79,108,191,102,43,66),
+(4,4,80,110,194,104,43,67),
+(4,5,1,17,25,19,22,23),
+(4,5,2,17,25,19,23,24),
+(4,5,3,17,25,20,25,26),
+(4,5,4,17,26,20,26,27),
+(4,5,5,18,26,20,27,28),
+(4,5,6,18,26,21,29,30),
+(4,5,7,18,26,21,30,31),
+(4,5,8,18,26,22,31,33),
+(4,5,9,18,27,22,33,34),
+(4,5,10,19,27,22,34,36),
+(4,5,11,19,27,23,36,37),
+(4,5,12,19,27,23,37,39),
+(4,5,13,19,28,24,38,40),
+(4,5,14,19,28,24,40,42),
+(4,5,15,19,28,25,41,43),
+(4,5,16,20,28,25,43,45),
+(4,5,17,20,29,25,44,46),
+(4,5,18,20,29,26,46,48),
+(4,5,19,20,29,26,47,49),
+(4,5,20,21,30,27,49,51),
+(4,5,21,21,30,27,51,53),
+(4,5,22,21,30,28,52,54),
+(4,5,23,21,30,28,54,56),
+(4,5,24,21,31,29,55,58),
+(4,5,25,22,31,29,57,59),
+(4,5,26,22,31,30,59,61),
+(4,5,27,22,32,30,60,63),
+(4,5,28,22,32,31,62,65),
+(4,5,29,23,32,31,64,66),
+(4,5,30,23,33,32,65,68),
+(4,5,31,23,33,32,67,70),
+(4,5,32,23,33,33,69,72),
+(4,5,33,24,34,33,70,73),
+(4,5,34,24,34,34,72,75),
+(4,5,35,24,34,34,74,77),
+(4,5,36,24,35,35,76,79),
+(4,5,37,25,35,35,78,81),
+(4,5,38,25,35,36,79,83),
+(4,5,39,25,36,37,81,85),
+(4,5,40,26,36,37,83,87),
+(4,5,41,26,37,38,85,88),
+(4,5,42,26,37,38,87,90),
+(4,5,43,27,37,39,89,92),
+(4,5,44,27,38,39,91,94),
+(4,5,45,27,38,40,92,96),
+(4,5,46,27,39,41,94,98),
+(4,5,47,28,39,41,96,100),
+(4,5,48,28,39,42,98,102),
+(4,5,49,28,40,43,100,104),
+(4,5,50,29,40,43,102,106),
+(4,5,51,29,41,44,104,109),
+(4,5,52,29,41,44,106,111),
+(4,5,53,30,42,45,108,113),
+(4,5,54,30,42,46,110,115),
+(4,5,55,30,43,46,112,117),
+(4,5,56,31,43,47,114,119),
+(4,5,57,31,43,48,117,121),
+(4,5,58,31,44,48,119,124),
+(4,5,59,32,44,49,121,126),
+(4,5,60,32,45,50,123,128),
+(4,5,61,33,45,51,125,130),
+(4,5,62,33,46,51,127,132),
+(4,5,63,33,46,52,129,135),
+(4,5,64,34,47,53,132,137),
+(4,5,65,34,47,53,134,139),
+(4,5,66,34,48,54,136,142),
+(4,5,67,35,48,55,138,144),
+(4,5,68,35,49,56,140,146),
+(4,5,69,36,49,56,143,149),
+(4,5,70,36,50,57,145,151),
+(4,5,71,36,51,58,148,161),
+(4,5,72,37,51,58,151,164),
+(4,5,73,37,52,59,154,168),
+(4,5,74,38,52,60,156,171),
+(4,5,75,38,53,61,159,174),
+(4,5,76,38,54,62,162,177),
+(4,5,77,39,54,63,165,180),
+(4,5,78,39,55,64,168,183),
+(4,5,79,40,55,65,171,186),
+(4,5,80,40,56,66,200,191),
+(4,6,1,20,25,21,20,20),
+(4,6,2,21,26,22,20,20),
+(4,6,3,23,27,23,20,21),
+(4,6,4,24,27,25,20,21),
+(4,6,5,25,28,26,20,21),
+(4,6,6,27,29,27,20,21),
+(4,6,7,28,30,28,21,22),
+(4,6,8,29,31,29,21,22),
+(4,6,9,31,31,31,21,22),
+(4,6,10,32,32,32,21,23),
+(4,6,11,33,33,33,21,23),
+(4,6,12,35,34,34,21,23),
+(4,6,13,36,35,36,21,24),
+(4,6,14,38,36,37,21,24),
+(4,6,15,39,37,38,21,24),
+(4,6,16,41,37,40,21,25),
+(4,6,17,42,38,41,22,25),
+(4,6,18,44,39,43,22,25),
+(4,6,19,45,40,44,22,26),
+(4,6,20,47,41,45,22,26),
+(4,6,21,48,42,47,22,26),
+(4,6,22,50,43,48,22,27),
+(4,6,23,52,44,50,22,27),
+(4,6,24,53,45,51,23,28),
+(4,6,25,55,46,52,23,28),
+(4,6,26,56,47,54,23,28),
+(4,6,27,58,48,55,23,29),
+(4,6,28,60,49,57,23,29),
+(4,6,29,61,50,58,23,30),
+(4,6,30,63,51,60,24,30),
+(4,6,31,65,52,62,24,30),
+(4,6,32,66,53,63,24,31),
+(4,6,33,68,54,65,24,31),
+(4,6,34,70,55,66,24,32),
+(4,6,35,72,56,68,24,32),
+(4,6,36,73,58,69,25,33),
+(4,6,37,75,59,71,25,33),
+(4,6,38,77,60,73,25,34),
+(4,6,39,79,61,74,25,34),
+(4,6,40,81,62,76,25,35),
+(4,6,41,82,63,78,26,35),
+(4,6,42,84,64,79,26,35),
+(4,6,43,86,66,81,26,36),
+(4,6,44,88,67,83,26,36),
+(4,6,45,90,68,85,26,37),
+(4,6,46,92,69,86,27,37),
+(4,6,47,94,70,88,27,38),
+(4,6,48,96,72,90,27,38),
+(4,6,49,98,73,92,27,39),
+(4,6,50,100,74,93,28,40),
+(4,6,51,101,75,94,28,40),
+(4,6,52,102,76,95,28,41),
+(4,6,53,103,77,96,28,41),
+(4,6,54,104,77,97,29,42),
+(4,6,55,105,78,98,29,42),
+(4,6,56,108,80,101,29,43),
+(4,6,57,113,81,103,29,43),
+(4,6,58,115,82,105,30,44),
+(4,6,59,115,84,107,30,44),
+(4,6,60,120,85,109,30,45),
+(4,6,61,122,86,111,30,46),
+(4,6,62,122,88,113,30,46),
+(4,6,63,127,89,116,31,47),
+(4,6,64,127,91,118,31,47),
+(4,6,65,133,92,120,31,48),
+(4,6,66,135,94,123,31,49),
+(4,6,67,136,95,125,32,49),
+(4,6,68,137,97,127,32,50),
+(4,6,69,140,98,130,32,51),
+(4,6,70,147,100,132,32,51),
+(4,6,71,154,102,135,33,52),
+(4,6,72,156,103,137,33,53),
+(4,6,73,157,105,140,33,54),
+(4,6,74,158,107,142,33,54),
+(4,6,75,161,108,145,34,55),
+(4,6,76,164,110,148,34,56),
+(4,6,77,167,112,150,34,57),
+(4,6,78,170,113,153,34,57),
+(4,6,79,172,115,156,35,58),
+(4,6,80,177,117,159,35,59),
+(4,11,1,18,25,19,22,22),
+(4,11,2,19,25,20,23,23),
+(4,11,3,19,26,20,24,24),
+(4,11,4,20,26,21,25,26),
+(4,11,5,20,27,22,26,27),
+(4,11,6,21,27,22,27,28),
+(4,11,7,21,28,23,28,29),
+(4,11,8,22,28,24,29,30),
+(4,11,9,23,29,24,30,32),
+(4,11,10,23,29,25,32,33),
+(4,11,11,24,30,26,33,34),
+(4,11,12,24,31,26,34,35),
+(4,11,13,25,31,27,35,37),
+(4,11,14,26,32,28,36,38),
+(4,11,15,26,32,29,37,39),
+(4,11,16,27,33,29,38,41),
+(4,11,17,28,33,30,40,42),
+(4,11,18,28,34,31,41,43),
+(4,11,19,29,35,32,42,45),
+(4,11,20,30,35,32,43,46),
+(4,11,21,30,36,33,45,48),
+(4,11,22,31,36,34,46,49),
+(4,11,23,32,37,35,47,51),
+(4,11,24,32,38,36,48,52),
+(4,11,25,33,38,36,50,53),
+(4,11,26,34,39,37,51,55),
+(4,11,27,35,40,38,52,56),
+(4,11,28,35,40,39,54,58),
+(4,11,29,36,41,40,55,59),
+(4,11,30,37,42,41,56,61),
+(4,11,31,38,42,42,58,62),
+(4,11,32,38,43,42,59,64),
+(4,11,33,39,44,43,60,66),
+(4,11,34,40,44,44,62,67),
+(4,11,35,41,45,45,63,69),
+(4,11,36,42,46,46,65,70),
+(4,11,37,42,47,47,66,72),
+(4,11,38,43,47,48,67,74),
+(4,11,39,44,48,49,69,75),
+(4,11,40,45,49,50,70,77),
+(4,11,41,46,50,51,72,79),
+(4,11,42,46,50,52,73,80),
+(4,11,43,47,51,53,75,82),
+(4,11,44,48,52,54,76,84),
+(4,11,45,49,53,55,78,85),
+(4,11,46,50,54,56,79,87),
+(4,11,47,51,54,57,81,89),
+(4,11,48,52,55,58,83,91),
+(4,11,49,53,56,59,84,93),
+(4,11,50,53,57,60,86,94),
+(4,11,51,54,58,61,87,96),
+(4,11,52,55,59,62,89,98),
+(4,11,53,56,59,63,91,100),
+(4,11,54,57,60,64,92,102),
+(4,11,55,58,61,65,94,103),
+(4,11,56,59,62,66,95,105),
+(4,11,57,60,63,67,97,107),
+(4,11,58,61,64,68,99,109),
+(4,11,59,62,65,69,101,111),
+(4,11,60,63,66,70,102,113),
+(4,11,61,64,66,72,104,115),
+(4,11,62,65,67,73,106,117),
+(4,11,63,66,68,74,107,119),
+(4,11,64,67,69,75,109,121),
+(4,11,65,68,70,76,111,123),
+(4,11,66,69,71,77,113,125),
+(4,11,67,70,72,78,115,127),
+(4,11,68,71,73,80,116,129),
+(4,11,69,72,74,81,118,131),
+(4,11,70,73,75,82,120,133),
+(4,11,71,75,76,83,122,135),
+(4,11,72,76,78,85,125,138),
+(4,11,73,77,79,86,127,140),
+(4,11,74,78,80,88,131,143),
+(4,11,75,80,81,89,133,145),
+(4,11,76,81,82,91,134,148),
+(4,11,77,82,83,92,136,151),
+(4,11,78,84,85,94,138,153),
+(4,11,79,85,86,95,141,156),
+(4,11,80,86,87,97,143,159),
+(5,1,1,22,18,23,18,25),
+(5,1,2,23,19,24,18,25),
+(5,1,3,25,20,25,18,26),
+(5,1,4,26,20,26,18,26),
+(5,1,5,27,21,28,18,26),
+(5,1,6,29,22,29,18,26),
+(5,1,7,30,23,30,19,27),
+(5,1,8,31,24,31,19,27),
+(5,1,9,33,25,33,19,27),
+(5,1,10,34,25,34,19,28),
+(5,1,11,35,26,35,19,28),
+(5,1,12,37,27,36,19,28),
+(5,1,13,38,28,38,19,28),
+(5,1,14,40,29,39,19,29),
+(5,1,15,41,30,40,19,29),
+(5,1,16,43,31,42,20,29),
+(5,1,17,44,32,43,20,30),
+(5,1,18,46,33,44,20,30),
+(5,1,19,47,34,46,20,31),
+(5,1,20,49,34,47,20,31),
+(5,1,21,50,35,49,20,31),
+(5,1,22,52,36,50,20,32),
+(5,1,23,53,37,51,21,32),
+(5,1,24,55,38,53,21,32),
+(5,1,25,57,39,54,21,33),
+(5,1,26,58,40,56,21,33),
+(5,1,27,60,41,57,21,34),
+(5,1,28,62,42,59,21,34),
+(5,1,29,63,43,60,21,34),
+(5,1,30,65,44,62,22,35),
+(5,1,31,67,46,63,22,35),
+(5,1,32,68,47,65,22,36),
+(5,1,33,70,48,67,22,36),
+(5,1,34,72,49,68,22,36),
+(5,1,35,74,50,70,23,37),
+(5,1,36,75,51,71,23,37),
+(5,1,37,77,52,73,23,38),
+(5,1,38,79,53,75,23,38),
+(5,1,39,81,54,76,23,39),
+(5,1,40,83,55,78,24,39),
+(5,1,41,84,57,80,24,40),
+(5,1,42,86,58,81,24,40),
+(5,1,43,88,59,83,24,41),
+(5,1,44,90,60,85,24,41),
+(5,1,45,92,61,86,25,42),
+(5,1,46,94,62,88,25,42),
+(5,1,47,96,64,90,25,43),
+(5,1,48,98,65,92,25,43),
+(5,1,49,100,66,93,25,44),
+(5,1,50,102,67,95,26,44),
+(5,1,51,104,69,97,26,45),
+(5,1,52,106,70,99,26,45),
+(5,1,53,108,71,101,26,46),
+(5,1,54,110,72,103,27,46),
+(5,1,55,112,74,104,27,47),
+(5,1,56,114,75,106,27,48),
+(5,1,57,116,76,108,27,48),
+(5,1,58,118,78,110,28,49),
+(5,1,59,120,79,112,28,49),
+(5,1,60,122,80,114,28,50),
+(5,1,61,124,82,116,28,50),
+(5,1,62,126,83,118,29,51),
+(5,1,63,128,84,120,29,52),
+(5,1,64,131,86,122,29,52),
+(5,1,65,133,87,124,30,53),
+(5,1,66,135,88,126,30,53),
+(5,1,67,137,90,128,30,54),
+(5,1,68,139,91,130,30,55),
+(5,1,69,142,93,132,31,55),
+(5,1,70,144,94,134,31,56),
+(5,1,71,147,95,136,31,57),
+(5,1,72,150,97,139,31,58),
+(5,1,73,152,99,141,31,59),
+(5,1,74,155,100,144,32,59),
+(5,1,75,158,102,146,32,60),
+(5,1,76,163,104,149,32,61),
+(5,1,77,167,106,152,33,62),
+(5,1,78,167,107,154,33,62),
+(5,1,79,170,109,157,33,63),
+(5,1,80,173,111,160,34,64),
+(5,4,1,20,21,22,18,25),
+(5,4,2,21,22,23,18,25),
+(5,4,3,22,24,23,18,26),
+(5,4,4,22,25,24,18,26),
+(5,4,5,23,27,25,19,26),
+(5,4,6,24,28,25,19,27),
+(5,4,7,25,30,26,19,27),
+(5,4,8,25,31,27,19,27),
+(5,4,9,26,33,28,19,28),
+(5,4,10,27,34,28,19,28),
+(5,4,11,28,36,29,20,29),
+(5,4,12,29,38,30,20,29),
+(5,4,13,30,39,31,20,29),
+(5,4,14,31,41,32,20,30),
+(5,4,15,31,42,32,20,30),
+(5,4,16,32,44,33,21,31),
+(5,4,17,33,46,34,21,31),
+(5,4,18,34,47,35,21,32),
+(5,4,19,35,49,36,21,32),
+(5,4,20,36,51,36,21,32),
+(5,4,21,37,52,37,22,33),
+(5,4,22,38,54,38,22,33),
+(5,4,23,39,56,39,22,34),
+(5,4,24,40,58,40,22,34),
+(5,4,25,41,60,41,23,35),
+(5,4,26,42,61,42,23,35),
+(5,4,27,43,63,43,23,36),
+(5,4,28,44,65,44,23,36),
+(5,4,29,45,67,44,24,37),
+(5,4,30,46,69,45,24,37),
+(5,4,31,47,71,46,24,38),
+(5,4,32,48,72,47,24,38),
+(5,4,33,49,74,48,25,39),
+(5,4,34,50,76,49,25,39),
+(5,4,35,51,78,50,25,40),
+(5,4,36,52,80,51,25,41),
+(5,4,37,53,82,52,26,41),
+(5,4,38,54,84,53,26,42),
+(5,4,39,55,86,54,26,42),
+(5,4,40,56,88,55,27,43),
+(5,4,41,57,90,56,27,43),
+(5,4,42,59,92,57,27,44),
+(5,4,43,60,94,58,27,45),
+(5,4,44,61,96,59,28,45),
+(5,4,45,62,99,60,28,46),
+(5,4,46,63,101,61,28,46),
+(5,4,47,64,103,63,29,47),
+(5,4,48,66,105,64,29,48),
+(5,4,49,67,107,65,29,48),
+(5,4,50,68,109,66,30,49),
+(5,4,51,69,111,67,30,50),
+(5,4,52,70,114,68,30,50),
+(5,4,53,72,116,69,31,51),
+(5,4,54,73,118,70,31,52),
+(5,4,55,74,120,72,31,52),
+(5,4,56,75,123,73,32,53),
+(5,4,57,77,125,74,32,54),
+(5,4,58,78,127,75,32,54),
+(5,4,59,79,130,76,33,55),
+(5,4,60,81,132,77,33,56),
+(5,4,61,82,134,79,34,56),
+(5,4,62,83,137,80,34,57),
+(5,4,63,84,139,81,34,58),
+(5,4,64,86,141,82,35,59),
+(5,4,65,87,144,84,35,59),
+(5,4,66,88,146,85,35,60),
+(5,4,67,90,149,86,36,61),
+(5,4,68,91,151,87,36,61),
+(5,4,69,93,154,89,37,62),
+(5,4,70,94,156,90,37,63),
+(5,4,71,96,159,91,37,64),
+(5,4,72,98,162,93,38,64),
+(5,4,73,99,165,95,38,65),
+(5,4,74,101,168,96,39,66),
+(5,4,75,103,171,98,39,67),
+(5,4,76,104,174,99,39,68),
+(5,4,77,106,177,101,40,69),
+(5,4,78,108,181,103,40,70),
+(5,4,79,110,184,104,41,71),
+(5,4,80,112,187,106,41,72),
+(5,5,1,19,18,21,20,28),
+(5,5,2,19,18,21,21,29),
+(5,5,3,19,18,22,23,31),
+(5,5,4,19,19,22,24,32),
+(5,5,5,20,19,22,25,33),
+(5,5,6,20,19,23,27,35),
+(5,5,7,20,19,23,28,36),
+(5,5,8,20,20,24,29,38),
+(5,5,9,20,20,24,31,39),
+(5,5,10,20,20,24,32,40),
+(5,5,11,21,20,25,34,42),
+(5,5,12,21,21,25,35,43),
+(5,5,13,21,21,26,37,45),
+(5,5,14,21,21,26,38,46),
+(5,5,15,21,21,26,39,48),
+(5,5,16,22,22,27,41,50),
+(5,5,17,22,22,27,42,51),
+(5,5,18,22,22,28,44,53),
+(5,5,19,22,23,28,46,54),
+(5,5,20,22,23,29,47,56),
+(5,5,21,23,23,29,49,57),
+(5,5,22,23,23,30,50,59),
+(5,5,23,23,24,30,52,61),
+(5,5,24,23,24,31,53,62),
+(5,5,25,24,24,31,55,64),
+(5,5,26,24,25,32,57,66),
+(5,5,27,24,25,32,58,68),
+(5,5,28,24,25,33,60,69),
+(5,5,29,25,26,33,62,71),
+(5,5,30,25,26,34,63,73),
+(5,5,31,25,26,34,65,75),
+(5,5,32,25,27,35,67,76),
+(5,5,33,26,27,35,69,78),
+(5,5,34,26,27,36,70,80),
+(5,5,35,26,28,36,72,82),
+(5,5,36,26,28,37,74,84),
+(5,5,37,27,28,37,76,86),
+(5,5,38,27,29,38,77,87),
+(5,5,39,27,29,38,79,89),
+(5,5,40,28,30,39,81,91),
+(5,5,41,28,30,40,83,93),
+(5,5,42,28,30,40,85,95),
+(5,5,43,28,31,41,87,97),
+(5,5,44,29,31,41,89,99),
+(5,5,45,29,32,42,91,101),
+(5,5,46,29,32,43,92,103),
+(5,5,47,30,32,43,94,105),
+(5,5,48,30,33,44,96,107),
+(5,5,49,30,33,44,98,109),
+(5,5,50,31,34,45,100,111),
+(5,5,51,31,34,46,102,113),
+(5,5,52,31,35,46,104,115),
+(5,5,53,32,35,47,106,118),
+(5,5,54,32,35,48,108,120),
+(5,5,55,32,36,48,110,122),
+(5,5,56,33,36,49,113,124),
+(5,5,57,33,37,50,115,126),
+(5,5,58,33,37,50,117,128),
+(5,5,59,34,38,51,119,131),
+(5,5,60,34,38,52,121,133),
+(5,5,61,34,39,52,123,135),
+(5,5,62,35,39,53,125,137),
+(5,5,63,35,40,54,127,140),
+(5,5,64,36,40,55,130,142),
+(5,5,65,36,41,55,132,144),
+(5,5,66,36,41,56,134,147),
+(5,5,67,37,41,57,136,149),
+(5,5,68,37,42,58,138,151),
+(5,5,69,38,42,58,141,154),
+(5,5,70,38,43,59,143,156),
+(5,5,71,38,44,60,146,159),
+(5,5,72,39,44,60,149,162),
+(5,5,73,39,45,61,152,165),
+(5,5,74,40,45,62,157,168),
+(5,5,75,40,46,63,157,171),
+(5,5,76,40,47,64,160,174),
+(5,5,77,41,47,65,163,177),
+(5,5,78,41,48,66,166,180),
+(5,5,79,42,48,67,169,183),
+(5,5,80,42,49,68,172,186),
+(5,6,1,22,18,23,18,25),
+(5,6,2,23,19,24,18,25),
+(5,6,3,25,20,25,18,26),
+(5,6,4,26,20,26,18,26),
+(5,6,5,27,21,28,18,26),
+(5,6,6,29,22,29,18,26),
+(5,6,7,30,23,30,19,27),
+(5,6,8,31,24,31,19,27),
+(5,6,9,33,25,33,19,27),
+(5,6,10,34,25,34,19,28),
+(5,6,11,35,26,35,19,28),
+(5,6,12,37,27,36,19,28),
+(5,6,13,38,28,38,19,28),
+(5,6,14,40,29,39,19,29),
+(5,6,15,41,30,40,19,29),
+(5,6,16,43,31,42,20,29),
+(5,6,17,44,32,43,20,30),
+(5,6,18,46,33,44,20,30),
+(5,6,19,47,34,46,20,31),
+(5,6,20,49,34,47,20,31),
+(5,6,21,50,35,49,20,31),
+(5,6,22,52,36,50,20,32),
+(5,6,23,53,37,51,21,32),
+(5,6,24,55,38,53,21,32),
+(5,6,25,57,39,54,21,33),
+(5,6,26,58,40,56,21,33),
+(5,6,27,60,41,57,21,34),
+(5,6,28,62,42,59,21,34),
+(5,6,29,63,43,60,21,34),
+(5,6,30,65,44,62,22,35),
+(5,6,31,67,46,63,22,35),
+(5,6,32,68,47,65,22,36),
+(5,6,33,70,48,67,22,36),
+(5,6,34,72,49,68,22,36),
+(5,6,35,74,50,70,23,37),
+(5,6,36,75,51,71,23,37),
+(5,6,37,77,52,73,23,38),
+(5,6,38,79,53,75,23,38),
+(5,6,39,81,54,76,23,39),
+(5,6,40,83,55,78,24,39),
+(5,6,41,84,57,80,24,40),
+(5,6,42,86,58,81,24,40),
+(5,6,43,88,59,83,24,41),
+(5,6,44,90,60,85,24,41),
+(5,6,45,92,61,86,25,42),
+(5,6,46,94,62,88,25,42),
+(5,6,47,96,64,90,25,43),
+(5,6,48,98,65,92,25,43),
+(5,6,49,100,66,93,25,44),
+(5,6,50,102,67,95,26,44),
+(5,6,51,103,67,96,26,45),
+(5,6,52,104,68,97,26,45),
+(5,6,53,105,69,98,26,46),
+(5,6,54,106,70,99,27,46),
+(5,6,55,107,71,100,27,47),
+(5,6,56,110,73,103,27,48),
+(5,6,57,112,74,105,27,48),
+(5,6,58,114,75,107,28,49),
+(5,6,59,119,77,109,28,49),
+(5,6,60,122,78,111,28,50),
+(5,6,61,124,79,113,28,51),
+(5,6,62,127,81,115,28,51),
+(5,6,63,129,82,118,29,52),
+(5,6,64,136,84,120,29,52),
+(5,6,65,137,85,123,29,53),
+(5,6,66,138,87,125,29,54),
+(5,6,67,141,88,127,30,54),
+(5,6,68,143,90,129,30,55),
+(5,6,69,146,91,132,30,56),
+(5,6,70,149,93,134,30,56),
+(5,6,71,152,95,137,31,57),
+(5,6,72,154,96,139,31,58),
+(5,6,73,157,98,142,31,59),
+(5,6,74,158,100,145,31,59),
+(5,6,75,159,101,147,32,60),
+(5,6,76,162,103,150,32,61),
+(5,6,77,167,105,152,32,62),
+(5,6,78,173,106,155,32,62),
+(5,6,79,174,108,158,33,63),
+(5,6,80,174,110,161,33,64),
+(5,8,1,19,18,21,21,27),
+(5,8,2,19,18,21,22,28),
+(5,8,3,19,18,22,24,30),
+(5,8,4,19,18,22,25,31),
+(5,8,5,19,19,22,26,32),
+(5,8,6,19,19,22,28,34),
+(5,8,7,20,19,23,29,35),
+(5,8,8,20,19,23,31,36),
+(5,8,9,20,19,23,32,38),
+(5,8,10,20,19,24,34,39),
+(5,8,11,20,20,24,35,40),
+(5,8,12,20,20,24,37,42),
+(5,8,13,20,20,25,38,43),
+(5,8,14,20,20,25,40,45),
+(5,8,15,20,20,25,41,46),
+(5,8,16,21,21,26,43,48),
+(5,8,17,21,21,26,44,49),
+(5,8,18,21,21,26,46,51),
+(5,8,19,21,21,27,48,52),
+(5,8,20,21,21,27,49,54),
+(5,8,21,21,22,27,51,55),
+(5,8,22,21,22,28,52,57),
+(5,8,23,21,22,28,54,58),
+(5,8,24,22,22,29,56,60),
+(5,8,25,22,23,29,57,62),
+(5,8,26,22,23,29,59,63),
+(5,8,27,22,23,30,61,65),
+(5,8,28,22,23,30,63,67),
+(5,8,29,22,24,31,64,68),
+(5,8,30,23,24,31,66,70),
+(5,8,31,23,24,31,68,72),
+(5,8,32,23,24,32,70,73),
+(5,8,33,23,25,32,72,75),
+(5,8,34,23,25,33,73,77),
+(5,8,35,24,25,33,75,79),
+(5,8,36,24,25,34,77,80),
+(5,8,37,24,26,34,79,82),
+(5,8,38,24,26,35,81,84),
+(5,8,39,24,26,35,83,86),
+(5,8,40,24,27,35,85,88),
+(5,8,41,25,27,36,87,90),
+(5,8,42,25,27,36,89,91),
+(5,8,43,25,27,37,90,93),
+(5,8,44,25,28,37,92,95),
+(5,8,45,26,28,38,94,97),
+(5,8,46,26,28,38,96,99),
+(5,8,47,26,29,39,98,101),
+(5,8,48,26,29,39,100,103),
+(5,8,49,26,29,40,103,105),
+(5,8,50,27,30,40,105,107),
+(5,8,51,27,30,41,107,109),
+(5,8,52,27,30,42,109,111),
+(5,8,53,27,31,42,111,113),
+(5,8,54,28,31,43,113,115),
+(5,8,55,28,31,43,115,117),
+(5,8,56,28,32,44,117,119),
+(5,8,57,28,32,44,119,121),
+(5,8,58,29,32,45,122,123),
+(5,8,59,29,33,45,124,126),
+(5,8,60,29,33,46,126,128),
+(5,8,61,29,34,47,128,130),
+(5,8,62,30,34,47,131,132),
+(5,8,63,30,34,48,133,134),
+(5,8,64,30,35,48,135,136),
+(5,8,65,31,35,49,137,139),
+(5,8,66,31,35,50,140,141),
+(5,8,67,31,36,50,142,143),
+(5,8,68,31,36,51,144,145),
+(5,8,69,32,37,51,147,148),
+(5,8,70,32,37,52,149,150),
+(5,8,71,32,37,53,152,153),
+(5,8,72,32,38,54,155,156),
+(5,8,73,32,38,55,158,159),
+(5,8,74,33,39,55,161,161),
+(5,8,75,33,39,56,164,164),
+(5,8,76,33,39,57,167,167),
+(5,8,77,34,40,58,170,170),
+(5,8,78,34,40,58,173,173),
+(5,8,79,34,41,59,176,176),
+(5,8,80,35,41,60,179,179),
+(5,9,1,19,18,22,20,27),
+(5,9,2,19,18,23,21,28),
+(5,9,3,20,19,23,22,29),
+(5,9,4,20,19,24,24,30),
+(5,9,5,20,19,24,25,32),
+(5,9,6,20,20,25,26,33),
+(5,9,7,21,20,25,27,34),
+(5,9,8,21,21,26,28,35),
+(5,9,9,21,21,26,30,36),
+(5,9,10,22,21,27,31,38),
+(5,9,11,22,22,28,32,39),
+(5,9,12,22,22,28,34,40),
+(5,9,13,23,23,29,35,41),
+(5,9,14,23,23,30,36,43),
+(5,9,15,23,24,30,37,44),
+(5,9,16,24,24,31,39,45),
+(5,9,17,24,24,31,40,47),
+(5,9,18,24,25,32,42,48),
+(5,9,19,25,25,33,43,49),
+(5,9,20,25,26,33,44,51),
+(5,9,21,26,26,34,46,52),
+(5,9,22,26,27,35,47,53),
+(5,9,23,26,27,36,49,55),
+(5,9,24,27,28,36,50,56),
+(5,9,25,27,28,37,52,58),
+(5,9,26,27,29,38,53,59),
+(5,9,27,28,29,38,55,60),
+(5,9,28,28,30,39,56,62),
+(5,9,29,29,30,40,58,63),
+(5,9,30,29,31,41,59,65),
+(5,9,31,30,31,41,61,66),
+(5,9,32,30,32,42,62,68),
+(5,9,33,30,32,43,64,69),
+(5,9,34,31,33,44,65,71),
+(5,9,35,31,33,45,67,73),
+(5,9,36,32,34,45,69,74),
+(5,9,37,32,34,46,70,76),
+(5,9,38,33,35,47,72,77),
+(5,9,39,33,36,48,73,79),
+(5,9,40,34,36,49,75,81),
+(5,9,41,34,37,49,77,82),
+(5,9,42,35,37,50,78,84),
+(5,9,43,35,38,51,80,86),
+(5,9,44,36,39,52,82,87),
+(5,9,45,36,39,53,84,89),
+(5,9,46,37,40,54,85,91),
+(5,9,47,37,40,55,87,92),
+(5,9,48,38,41,55,89,94),
+(5,9,49,38,42,56,91,96),
+(5,9,50,39,42,57,92,98),
+(5,9,51,39,43,58,94,100),
+(5,9,52,40,44,59,96,101),
+(5,9,53,40,44,60,98,103),
+(5,9,54,41,45,61,100,105),
+(5,9,55,41,45,62,102,107),
+(5,9,56,42,46,63,103,109),
+(5,9,57,42,47,64,105,111),
+(5,9,58,43,47,65,107,112),
+(5,9,59,43,48,66,109,114),
+(5,9,60,44,49,67,111,116),
+(5,9,61,45,50,68,113,118),
+(5,9,62,45,50,69,115,120),
+(5,9,63,46,51,70,117,122),
+(5,9,64,46,52,71,119,124),
+(5,9,65,47,52,72,121,126),
+(5,9,66,48,53,73,123,128),
+(5,9,67,48,54,74,125,130),
+(5,9,68,49,55,75,127,132),
+(5,9,69,49,55,76,129,134),
+(5,9,70,50,56,77,131,136),
+(5,9,71,51,57,86,135,147),
+(5,9,72,52,57,88,136,149),
+(5,9,73,53,58,89,138,152),
+(5,9,74,53,59,90,141,155),
+(5,9,75,54,60,92,143,157),
+(5,9,76,55,61,93,146,160),
+(5,9,77,56,62,94,149,163),
+(5,9,78,56,63,96,151,166),
+(5,9,79,57,64,97,154,169),
+(5,9,80,58,65,99,157,171),
+(6,1,1,28,15,24,15,22),
+(6,1,2,29,16,25,15,22),
+(6,1,3,31,17,26,15,23),
+(6,1,4,32,17,27,15,23),
+(6,1,5,33,18,29,15,23),
+(6,1,6,34,19,30,15,23),
+(6,1,7,36,20,31,16,24),
+(6,1,8,37,21,32,16,24),
+(6,1,9,38,22,34,16,24),
+(6,1,10,40,22,35,16,25),
+(6,1,11,41,23,36,16,25),
+(6,1,12,43,24,37,16,25),
+(6,1,13,44,25,39,16,26),
+(6,1,14,46,26,40,16,26),
+(6,1,15,47,27,41,17,26),
+(6,1,16,48,28,43,17,27),
+(6,1,17,50,29,44,17,27),
+(6,1,18,51,30,45,17,27),
+(6,1,19,53,31,47,17,28),
+(6,1,20,54,32,48,17,28),
+(6,1,21,56,33,50,17,28),
+(6,1,22,58,34,51,18,29),
+(6,1,23,59,35,52,18,29),
+(6,1,24,61,36,54,18,30),
+(6,1,25,62,37,55,18,30),
+(6,1,26,64,38,57,18,30),
+(6,1,27,66,39,58,18,31),
+(6,1,28,67,40,60,18,31),
+(6,1,29,69,41,61,19,32),
+(6,1,30,71,42,63,19,32),
+(6,1,31,72,43,64,19,32),
+(6,1,32,74,44,66,19,33),
+(6,1,33,76,45,67,19,33),
+(6,1,34,77,46,69,20,34),
+(6,1,35,79,47,71,20,34),
+(6,1,36,81,48,72,20,35),
+(6,1,37,83,49,74,20,35),
+(6,1,38,85,50,76,20,35),
+(6,1,39,86,51,77,21,36),
+(6,1,40,88,53,79,21,36),
+(6,1,41,90,54,81,21,37),
+(6,1,42,92,55,82,21,37),
+(6,1,43,94,56,84,21,38),
+(6,1,44,96,57,86,22,38),
+(6,1,45,98,58,87,22,39),
+(6,1,46,99,60,89,22,39),
+(6,1,47,101,61,91,22,40),
+(6,1,48,103,62,93,22,40),
+(6,1,49,105,63,94,23,41),
+(6,1,50,107,65,96,23,41),
+(6,1,51,109,66,98,23,42),
+(6,1,52,111,67,100,23,42),
+(6,1,53,113,68,102,24,43),
+(6,1,54,115,70,104,24,44),
+(6,1,55,117,71,105,24,44),
+(6,1,56,119,72,107,24,45),
+(6,1,57,122,73,109,25,45),
+(6,1,58,124,75,111,25,46),
+(6,1,59,126,76,113,25,46),
+(6,1,60,128,77,115,25,47),
+(6,1,61,130,79,117,26,48),
+(6,1,62,132,80,119,26,48),
+(6,1,63,134,81,121,26,49),
+(6,1,64,137,83,123,26,49),
+(6,1,65,139,84,125,27,50),
+(6,1,66,141,85,127,27,51),
+(6,1,67,143,87,129,27,51),
+(6,1,68,145,88,131,27,52),
+(6,1,69,148,90,133,28,52),
+(6,1,70,150,91,135,28,53),
+(6,1,71,153,92,137,28,54),
+(6,1,72,155,94,140,28,55),
+(6,1,73,158,96,142,28,56),
+(6,1,74,161,97,145,29,56),
+(6,1,75,164,99,147,29,57),
+(6,1,76,167,101,150,29,58),
+(6,1,77,170,103,153,30,59),
+(6,1,78,173,104,155,30,59),
+(6,1,79,176,106,164,30,60),
+(6,1,80,179,108,170,31,61),
+(6,3,1,25,18,23,15,23),
+(6,3,2,25,19,24,16,24),
+(6,3,3,26,21,25,16,24),
+(6,3,4,26,22,26,17,25),
+(6,3,5,27,24,27,17,25),
+(6,3,6,27,25,28,18,26),
+(6,3,7,28,26,28,19,27),
+(6,3,8,28,28,29,19,27),
+(6,3,9,28,29,30,20,28),
+(6,3,10,29,31,31,20,29),
+(6,3,11,29,32,32,21,29),
+(6,3,12,30,34,33,22,30),
+(6,3,13,30,35,34,22,31),
+(6,3,14,31,37,35,23,32),
+(6,3,15,31,38,36,24,32),
+(6,3,16,32,40,37,24,33),
+(6,3,17,32,41,39,25,34),
+(6,3,18,33,43,40,26,35),
+(6,3,19,33,45,41,27,35),
+(6,3,20,34,46,42,27,36),
+(6,3,21,34,48,43,28,37),
+(6,3,22,35,50,44,29,38),
+(6,3,23,35,51,45,29,38),
+(6,3,24,36,53,46,30,39),
+(6,3,25,37,55,47,31,40),
+(6,3,26,37,56,48,32,41),
+(6,3,27,38,58,50,32,42),
+(6,3,28,38,60,51,33,42),
+(6,3,29,39,62,52,34,43),
+(6,3,30,39,63,53,35,44),
+(6,3,31,40,65,54,36,45),
+(6,3,32,41,67,56,36,46),
+(6,3,33,41,69,57,37,47),
+(6,3,34,42,71,58,38,48),
+(6,3,35,43,72,59,39,48),
+(6,3,36,43,74,61,40,49),
+(6,3,37,44,76,62,40,50),
+(6,3,38,45,78,63,41,51),
+(6,3,39,45,80,64,42,52),
+(6,3,40,46,82,66,43,53),
+(6,3,41,47,84,67,44,54),
+(6,3,42,47,86,68,45,55),
+(6,3,43,48,88,70,46,56),
+(6,3,44,49,90,71,46,57),
+(6,3,45,49,92,72,47,58),
+(6,3,46,50,94,74,48,59),
+(6,3,47,51,96,75,49,60),
+(6,3,48,51,98,77,50,61),
+(6,3,49,52,100,78,51,62),
+(6,3,50,53,102,79,52,63),
+(6,3,51,54,104,81,53,64),
+(6,3,52,54,106,82,54,65),
+(6,3,53,55,108,84,55,66),
+(6,3,54,56,110,85,56,67),
+(6,3,55,57,112,87,57,68),
+(6,3,56,57,114,88,58,69),
+(6,3,57,58,117,90,59,70),
+(6,3,58,59,119,91,60,71),
+(6,3,59,60,121,93,61,72),
+(6,3,60,61,123,94,62,74),
+(6,3,61,61,125,96,63,75),
+(6,3,62,62,128,97,64,76),
+(6,3,63,63,130,99,65,77),
+(6,3,64,64,132,100,66,78),
+(6,3,65,65,134,102,67,79),
+(6,3,66,66,137,104,68,80),
+(6,3,67,66,139,105,69,81),
+(6,3,68,67,141,107,70,83),
+(6,3,69,68,144,108,71,84),
+(6,3,70,69,146,110,72,85),
+(6,3,71,70,149,112,73,86),
+(6,3,72,71,152,114,74,87),
+(6,3,73,72,155,116,75,89),
+(6,3,74,73,158,118,77,90),
+(6,3,75,74,161,120,78,92),
+(6,3,76,75,164,122,79,93),
+(6,3,77,76,167,124,81,95),
+(6,3,78,77,176,126,85,96),
+(6,3,79,78,179,128,86,98),
+(6,3,80,79,183,130,88,99),
+(6,6,1,28,15,24,15,22),
+(6,6,2,29,16,25,15,22),
+(6,6,3,31,17,26,15,23),
+(6,6,4,32,17,27,15,23),
+(6,6,5,33,18,29,15,23),
+(6,6,6,34,19,30,15,23),
+(6,6,7,36,20,31,16,24),
+(6,6,8,37,21,32,16,24),
+(6,6,9,38,22,34,16,24),
+(6,6,10,40,22,35,16,25),
+(6,6,11,41,23,36,16,25),
+(6,6,12,43,24,37,16,25),
+(6,6,13,44,25,39,16,26),
+(6,6,14,46,26,40,16,26),
+(6,6,15,47,27,41,17,26),
+(6,6,16,48,28,43,17,27),
+(6,6,17,50,29,44,17,27),
+(6,6,18,51,30,45,17,27),
+(6,6,19,53,31,47,17,28),
+(6,6,20,54,32,48,17,28),
+(6,6,21,56,33,50,17,28),
+(6,6,22,58,34,51,18,29),
+(6,6,23,59,35,52,18,29),
+(6,6,24,61,36,54,18,30),
+(6,6,25,62,37,55,18,30),
+(6,6,26,64,38,57,18,30),
+(6,6,27,66,39,58,18,31),
+(6,6,28,67,40,60,18,31),
+(6,6,29,69,41,61,19,32),
+(6,6,30,71,42,63,19,32),
+(6,6,31,72,43,64,19,32),
+(6,6,32,74,44,66,19,33),
+(6,6,33,76,45,67,19,33),
+(6,6,34,77,46,69,20,34),
+(6,6,35,79,47,71,20,34),
+(6,6,36,81,48,72,20,35),
+(6,6,37,83,49,74,20,35),
+(6,6,38,85,50,76,20,35),
+(6,6,39,86,51,77,21,36),
+(6,6,40,88,53,79,21,36),
+(6,6,41,90,54,81,21,37),
+(6,6,42,92,55,82,21,37),
+(6,6,43,94,56,84,21,38),
+(6,6,44,96,57,86,22,38),
+(6,6,45,98,58,87,22,39),
+(6,6,46,99,60,89,22,39),
+(6,6,47,101,60,91,22,40),
+(6,6,48,103,61,93,22,40),
+(6,6,49,105,62,94,23,41),
+(6,6,50,107,63,96,23,41),
+(6,6,51,109,64,97,23,42),
+(6,6,52,110,65,98,23,42),
+(6,6,53,111,66,99,24,43),
+(6,6,54,112,67,100,24,44),
+(6,6,55,113,68,101,24,44),
+(6,6,56,116,70,104,24,45),
+(6,6,57,121,71,106,24,45),
+(6,6,58,123,72,108,25,46),
+(6,6,59,123,74,110,25,46),
+(6,6,60,125,75,112,25,47),
+(6,6,61,127,76,114,25,48),
+(6,6,62,133,78,116,25,48),
+(6,6,63,135,79,119,26,49),
+(6,6,64,139,81,121,26,49),
+(6,6,65,142,82,123,26,50),
+(6,6,66,146,84,126,26,51),
+(6,6,67,150,85,132,27,51),
+(6,6,68,153,87,137,27,52),
+(6,6,69,157,88,140,27,53),
+(6,6,70,160,90,143,27,53),
+(6,6,71,163,92,146,28,54),
+(6,6,72,165,93,148,28,55),
+(6,6,73,167,95,150,28,56),
+(6,6,74,171,97,153,28,56),
+(6,6,75,174,98,156,29,57),
+(6,6,76,178,100,156,29,58),
+(6,6,77,179,102,156,29,59),
+(6,6,78,179,103,156,29,59),
+(6,6,79,182,105,159,30,60),
+(6,6,80,185,107,162,30,61),
+(6,7,1,26,15,23,16,24),
+(6,7,2,27,15,24,17,25),
+(6,7,3,28,16,25,18,26),
+(6,7,4,28,16,26,19,27),
+(6,7,5,29,17,27,20,28),
+(6,7,6,30,17,28,21,29),
+(6,7,7,31,18,29,22,30),
+(6,7,8,32,18,30,23,31),
+(6,7,9,33,19,31,24,32),
+(6,7,10,34,19,32,25,33),
+(6,7,11,35,20,33,26,35),
+(6,7,12,35,20,34,27,36),
+(6,7,13,36,21,35,28,37),
+(6,7,14,37,21,36,29,38),
+(6,7,15,38,22,37,30,39),
+(6,7,16,39,22,39,31,40),
+(6,7,17,40,23,40,32,42),
+(6,7,18,41,23,41,33,43),
+(6,7,19,42,24,42,34,44),
+(6,7,20,43,24,43,35,45),
+(6,7,21,44,25,44,36,46),
+(6,7,22,45,25,45,37,48),
+(6,7,23,46,26,47,38,49),
+(6,7,24,47,27,48,40,50),
+(6,7,25,48,27,49,41,51),
+(6,7,26,49,28,50,42,53),
+(6,7,27,51,28,52,43,54),
+(6,7,28,52,29,53,44,55),
+(6,7,29,53,29,54,45,57),
+(6,7,30,54,30,55,47,58),
+(6,7,31,55,31,57,48,59),
+(6,7,32,56,31,58,49,61),
+(6,7,33,57,32,59,50,62),
+(6,7,34,58,33,61,51,64),
+(6,7,35,60,33,62,53,65),
+(6,7,36,61,34,63,54,66),
+(6,7,37,62,34,65,55,68),
+(6,7,38,63,35,66,57,69),
+(6,7,39,64,36,67,58,71),
+(6,7,40,66,36,69,59,72),
+(6,7,41,67,37,70,60,74),
+(6,7,42,68,38,72,62,75),
+(6,7,43,69,38,73,63,77),
+(6,7,44,70,39,74,64,78),
+(6,7,45,72,40,76,66,80),
+(6,7,46,73,41,77,67,81),
+(6,7,47,74,41,79,69,83),
+(6,7,48,76,42,80,70,84),
+(6,7,49,77,43,82,71,86),
+(6,7,50,78,43,83,73,88),
+(6,7,51,80,44,85,74,89),
+(6,7,52,81,45,86,76,91),
+(6,7,53,82,46,88,77,92),
+(6,7,54,84,46,90,78,94),
+(6,7,55,85,47,91,80,96),
+(6,7,56,86,48,93,81,97),
+(6,7,57,88,49,94,83,99),
+(6,7,58,89,49,96,84,101),
+(6,7,59,91,50,97,86,102),
+(6,7,60,92,51,99,87,104),
+(6,7,61,94,52,101,89,106),
+(6,7,62,95,52,102,90,108),
+(6,7,63,96,53,104,92,109),
+(6,7,64,98,54,106,93,111),
+(6,7,65,99,55,107,95,113),
+(6,7,66,101,56,109,97,115),
+(6,7,67,102,57,111,98,117),
+(6,7,68,104,57,113,100,118),
+(6,7,69,105,58,114,101,120),
+(6,7,70,107,59,116,103,122),
+(6,7,71,108,60,118,113,124),
+(6,7,72,110,61,120,117,127),
+(6,7,73,112,62,122,119,129),
+(6,7,74,114,63,125,122,131),
+(6,7,75,116,64,127,124,133),
+(6,7,76,118,65,129,126,136),
+(6,7,77,119,66,131,128,138),
+(6,7,78,121,67,133,130,140),
+(6,7,79,123,68,136,133,143),
+(6,7,80,125,69,138,135,145),
+(6,11,1,26,15,22,17,24),
+(6,11,2,27,16,23,18,25),
+(6,11,3,27,16,23,19,26),
+(6,11,4,28,17,24,20,27),
+(6,11,5,28,17,25,21,29),
+(6,11,6,29,18,25,22,30),
+(6,11,7,29,18,26,23,31),
+(6,11,8,30,19,27,24,32),
+(6,11,9,30,19,27,26,34),
+(6,11,10,31,20,28,27,35),
+(6,11,11,32,20,29,28,36),
+(6,11,12,32,21,29,29,37),
+(6,11,13,33,21,30,30,39),
+(6,11,14,33,22,31,31,40),
+(6,11,15,34,23,32,32,41),
+(6,11,16,35,23,32,34,43),
+(6,11,17,35,24,33,35,44),
+(6,11,18,36,24,34,36,45),
+(6,11,19,37,25,35,37,47),
+(6,11,20,37,26,35,39,48),
+(6,11,21,38,26,36,40,50),
+(6,11,22,39,27,37,41,51),
+(6,11,23,39,28,38,42,52),
+(6,11,24,40,28,39,44,54),
+(6,11,25,41,29,39,45,55),
+(6,11,26,41,30,40,46,57),
+(6,11,27,42,30,41,47,58),
+(6,11,28,43,31,42,49,60),
+(6,11,29,44,32,43,50,61),
+(6,11,30,44,32,44,52,63),
+(6,11,31,45,33,44,53,64),
+(6,11,32,46,34,45,54,66),
+(6,11,33,47,34,46,56,67),
+(6,11,34,47,35,47,57,69),
+(6,11,35,48,36,48,58,71),
+(6,11,36,49,36,49,60,72),
+(6,11,37,50,37,50,61,74),
+(6,11,38,51,38,51,63,76),
+(6,11,39,52,39,52,64,77),
+(6,11,40,52,39,53,66,79),
+(6,11,41,53,40,54,67,81),
+(6,11,42,54,41,55,69,82),
+(6,11,43,55,42,56,70,84),
+(6,11,44,56,43,57,72,86),
+(6,11,45,57,43,57,73,87),
+(6,11,46,57,44,58,75,89),
+(6,11,47,58,45,60,76,91),
+(6,11,48,59,46,61,78,93),
+(6,11,49,60,47,62,79,94),
+(6,11,50,61,47,63,81,96),
+(6,11,51,62,48,64,83,98),
+(6,11,52,63,49,65,84,100),
+(6,11,53,64,50,66,86,102),
+(6,11,54,65,51,67,87,104),
+(6,11,55,66,51,68,89,105),
+(6,11,56,67,52,69,91,107),
+(6,11,57,68,53,70,92,109),
+(6,11,58,69,54,71,94,111),
+(6,11,59,70,55,72,96,113),
+(6,11,60,71,56,73,97,115),
+(6,11,61,72,57,74,99,117),
+(6,11,62,73,58,76,101,119),
+(6,11,63,74,59,77,103,121),
+(6,11,64,75,59,78,104,123),
+(6,11,65,76,60,79,106,125),
+(6,11,66,77,61,80,108,127),
+(6,11,67,78,62,81,110,129),
+(6,11,68,79,63,83,111,131),
+(6,11,69,80,64,84,113,133),
+(6,11,70,81,65,85,115,135),
+(6,11,71,83,66,86,117,137),
+(6,11,72,84,68,88,120,140),
+(6,11,73,85,69,89,122,142),
+(6,11,74,86,70,91,124,145),
+(6,11,75,88,71,92,126,147),
+(6,11,76,89,72,94,128,150),
+(6,11,77,90,73,95,131,153),
+(6,11,78,92,75,97,133,155),
+(6,11,79,93,76,98,136,158),
+(6,11,80,94,77,100,138,185),
+(7,1,1,18,23,21,24,20),
+(7,1,2,19,24,22,24,20),
+(7,1,3,21,25,23,24,21),
+(7,1,4,22,25,25,24,21),
+(7,1,5,23,26,26,24,21),
+(7,1,6,25,27,27,24,21),
+(7,1,7,26,28,28,24,22),
+(7,1,8,27,29,29,25,22),
+(7,1,9,29,29,31,25,22),
+(7,1,10,30,30,32,25,23),
+(7,1,11,32,31,33,25,23),
+(7,1,12,33,32,34,25,23),
+(7,1,13,34,33,36,25,24),
+(7,1,14,36,34,37,25,24),
+(7,1,15,37,35,38,25,24),
+(7,1,16,39,36,40,25,25),
+(7,1,17,40,36,41,25,25),
+(7,1,18,42,37,43,26,25),
+(7,1,19,43,38,44,26,26),
+(7,1,20,45,39,45,26,26),
+(7,1,21,47,40,47,26,26),
+(7,1,22,48,41,48,26,27),
+(7,1,23,50,42,50,26,27),
+(7,1,24,51,43,51,26,28),
+(7,1,25,53,44,52,27,28),
+(7,1,26,55,45,54,27,28),
+(7,1,27,56,46,55,27,29),
+(7,1,28,58,47,57,27,29),
+(7,1,29,59,48,58,27,30),
+(7,1,30,61,49,60,27,30),
+(7,1,31,63,50,62,27,30),
+(7,1,32,65,51,63,28,31),
+(7,1,33,66,52,65,28,31),
+(7,1,34,68,53,66,28,32),
+(7,1,35,70,55,68,28,32),
+(7,1,36,72,56,69,28,33),
+(7,1,37,73,57,71,29,33),
+(7,1,38,75,58,73,29,34),
+(7,1,39,77,59,74,29,34),
+(7,1,40,79,60,76,29,35),
+(7,1,41,81,61,78,29,35),
+(7,1,42,82,62,79,30,35),
+(7,1,43,84,64,81,30,36),
+(7,1,44,86,65,83,30,36),
+(7,1,45,88,66,85,30,37),
+(7,1,46,90,67,86,30,37),
+(7,1,47,92,68,88,31,38),
+(7,1,48,94,70,90,31,38),
+(7,1,49,96,71,92,31,39),
+(7,1,50,98,72,93,31,40),
+(7,1,51,100,73,95,32,40),
+(7,1,52,102,75,97,32,41),
+(7,1,53,104,76,99,32,41),
+(7,1,54,106,77,101,32,42),
+(7,1,55,108,78,103,33,42),
+(7,1,56,110,80,104,33,43),
+(7,1,57,112,81,106,33,43),
+(7,1,58,114,82,108,33,44),
+(7,1,59,116,84,110,34,44),
+(7,1,60,118,85,112,34,45),
+(7,1,61,120,86,114,34,46),
+(7,1,62,122,88,116,35,46),
+(7,1,63,125,89,118,35,47),
+(7,1,64,127,91,120,35,47),
+(7,1,65,129,92,122,35,48),
+(7,1,66,131,93,124,36,49),
+(7,1,67,133,95,126,36,49),
+(7,1,68,136,96,128,36,50),
+(7,1,69,138,98,130,37,50),
+(7,1,70,140,99,132,37,51),
+(7,1,71,143,100,134,37,52),
+(7,1,72,145,102,137,37,53),
+(7,1,73,148,104,139,37,54),
+(7,1,74,151,105,142,38,54),
+(7,1,75,154,107,144,38,55),
+(7,1,76,157,109,147,38,56),
+(7,1,77,163,111,153,39,57),
+(7,1,78,169,112,158,39,57),
+(7,1,79,172,114,161,39,58),
+(7,1,80,175,116,164,40,59),
+(7,4,1,16,26,20,24,20),
+(7,4,2,17,27,21,24,20),
+(7,4,3,18,29,21,24,21),
+(7,4,4,18,30,22,24,21),
+(7,4,5,19,32,23,25,21),
+(7,4,6,20,33,24,25,22),
+(7,4,7,21,35,24,25,22),
+(7,4,8,22,36,25,25,23),
+(7,4,9,22,38,26,25,23),
+(7,4,10,23,39,26,25,23),
+(7,4,11,24,41,27,25,24),
+(7,4,12,25,42,28,26,24),
+(7,4,13,26,44,29,26,25),
+(7,4,14,27,46,30,26,25),
+(7,4,15,28,47,30,26,25),
+(7,4,16,28,49,31,26,26),
+(7,4,17,29,50,32,27,26),
+(7,4,18,30,52,33,27,27),
+(7,4,19,31,54,34,27,27),
+(7,4,20,32,56,35,27,28),
+(7,4,21,33,57,35,27,28),
+(7,4,22,34,59,36,28,29),
+(7,4,23,35,61,37,28,29),
+(7,4,24,36,62,38,28,30),
+(7,4,25,37,64,39,28,30),
+(7,4,26,38,66,40,29,31),
+(7,4,27,39,68,41,29,31),
+(7,4,28,40,70,42,29,32),
+(7,4,29,41,72,43,29,32),
+(7,4,30,42,73,43,29,33),
+(7,4,31,43,75,44,30,33),
+(7,4,32,44,77,45,30,34),
+(7,4,33,45,79,46,30,34),
+(7,4,34,46,81,47,31,35),
+(7,4,35,47,83,48,31,35),
+(7,4,36,48,85,49,31,36),
+(7,4,37,49,87,50,31,36),
+(7,4,38,50,89,51,32,37),
+(7,4,39,51,91,52,32,38),
+(7,4,40,53,93,53,32,38),
+(7,4,41,54,95,54,33,39),
+(7,4,42,55,97,55,33,39),
+(7,4,43,56,99,56,33,40),
+(7,4,44,57,101,57,33,40),
+(7,4,45,58,103,59,34,41),
+(7,4,46,59,105,60,34,42),
+(7,4,47,61,107,61,34,42),
+(7,4,48,62,110,62,35,43),
+(7,4,49,63,112,63,35,44),
+(7,4,50,64,114,64,35,44),
+(7,4,51,65,116,65,36,45),
+(7,4,52,67,118,66,36,45),
+(7,4,53,68,121,67,36,46),
+(7,4,54,69,123,69,37,47),
+(7,4,55,70,125,70,37,47),
+(7,4,56,72,127,71,37,48),
+(7,4,57,73,130,72,38,49),
+(7,4,58,74,132,73,38,49),
+(7,4,59,75,134,74,39,50),
+(7,4,60,77,137,76,39,51),
+(7,4,61,78,139,77,39,51),
+(7,4,62,79,141,78,40,52),
+(7,4,63,81,144,79,40,53),
+(7,4,64,82,146,80,41,54),
+(7,4,65,83,149,82,41,54),
+(7,4,66,85,151,83,41,55),
+(7,4,67,86,154,84,42,56),
+(7,4,68,87,156,85,42,57),
+(7,4,69,89,158,87,43,57),
+(7,4,70,90,161,88,43,58),
+(7,4,71,92,164,89,44,59),
+(7,4,72,94,167,91,45,59),
+(7,4,73,95,170,93,45,60),
+(7,4,74,97,173,94,46,61),
+(7,4,75,99,176,96,46,62),
+(7,4,76,100,179,97,46,63),
+(7,4,77,102,182,102,47,64),
+(7,4,78,104,186,105,47,65),
+(7,4,79,106,189,106,48,66),
+(7,4,80,108,192,108,48,67),
+(7,6,1,18,23,21,24,20),
+(7,6,2,19,24,22,24,20),
+(7,6,3,21,25,23,24,21),
+(7,6,4,22,25,25,24,21),
+(7,6,5,23,26,26,24,21),
+(7,6,6,25,27,27,24,21),
+(7,6,7,26,28,28,24,22),
+(7,6,8,27,29,29,25,22),
+(7,6,9,29,29,31,25,22),
+(7,6,10,30,30,32,25,23),
+(7,6,11,32,31,33,25,23),
+(7,6,12,33,32,34,25,23),
+(7,6,13,34,33,36,25,24),
+(7,6,14,36,34,37,25,24),
+(7,6,15,37,35,38,25,24),
+(7,6,16,39,36,40,25,25),
+(7,6,17,40,36,41,25,25),
+(7,6,18,42,37,43,26,25),
+(7,6,19,43,38,44,26,26),
+(7,6,20,45,39,45,26,26),
+(7,6,21,47,40,47,26,26),
+(7,6,22,48,41,48,26,27),
+(7,6,23,50,42,50,26,27),
+(7,6,24,51,43,51,26,28),
+(7,6,25,53,44,52,27,28),
+(7,6,26,55,45,54,27,28),
+(7,6,27,56,46,55,27,29),
+(7,6,28,58,47,57,27,29),
+(7,6,29,59,48,58,27,30),
+(7,6,30,61,49,60,27,30),
+(7,6,31,63,50,62,27,30),
+(7,6,32,65,51,63,28,31),
+(7,6,33,66,52,65,28,31),
+(7,6,34,68,53,66,28,32),
+(7,6,35,70,55,68,28,32),
+(7,6,36,72,56,69,28,33),
+(7,6,37,73,57,71,29,33),
+(7,6,38,75,58,73,29,34),
+(7,6,39,77,59,74,29,34),
+(7,6,40,79,60,76,29,35),
+(7,6,41,81,61,78,29,35),
+(7,6,42,82,62,79,30,35),
+(7,6,43,84,64,81,30,36),
+(7,6,44,86,65,83,30,36),
+(7,6,45,88,66,85,30,37),
+(7,6,46,90,67,86,30,37),
+(7,6,47,92,68,88,31,38),
+(7,6,48,94,70,90,31,38),
+(7,6,49,96,71,92,31,39),
+(7,6,50,98,72,93,31,40),
+(7,6,51,99,72,93,32,40),
+(7,6,52,100,73,95,32,41),
+(7,6,53,101,74,96,32,41),
+(7,6,54,102,75,97,32,42),
+(7,6,55,103,76,98,33,42),
+(7,6,56,106,78,101,33,43),
+(7,6,57,111,79,103,33,43),
+(7,6,58,113,80,105,34,44),
+(7,6,59,116,82,107,34,44),
+(7,6,60,118,83,109,34,45),
+(7,6,61,120,84,111,34,46),
+(7,6,62,127,86,119,34,46),
+(7,6,63,129,87,122,35,47),
+(7,6,64,132,89,125,35,47),
+(7,6,65,135,90,127,35,48),
+(7,6,66,137,92,130,35,49),
+(7,6,67,138,93,130,36,49),
+(7,6,68,140,95,131,36,50),
+(7,6,69,142,96,131,36,51),
+(7,6,70,145,98,132,36,51),
+(7,6,71,148,100,135,37,52),
+(7,6,72,150,101,137,37,53),
+(7,6,73,153,103,140,37,54),
+(7,6,74,154,105,142,37,54),
+(7,6,75,155,106,145,38,55),
+(7,6,76,158,108,151,38,56),
+(7,6,77,161,110,157,38,57),
+(7,6,78,164,111,162,38,57),
+(7,6,79,167,113,165,39,58),
+(7,6,80,170,115,168,39,59),
+(7,8,1,15,23,19,27,22),
+(7,8,2,15,23,19,28,23),
+(7,8,3,15,23,20,30,25),
+(7,8,4,15,23,20,31,26),
+(7,8,5,15,24,20,32,27),
+(7,8,6,15,24,20,34,29),
+(7,8,7,16,24,21,35,30),
+(7,8,8,16,24,21,37,31),
+(7,8,9,16,24,21,38,33),
+(7,8,10,16,24,22,40,34),
+(7,8,11,16,25,22,41,36),
+(7,8,12,16,25,22,42,37),
+(7,8,13,16,25,23,44,38),
+(7,8,14,16,25,23,45,40),
+(7,8,15,17,25,23,47,41),
+(7,8,16,17,25,24,49,43),
+(7,8,17,17,26,24,50,44),
+(7,8,18,17,26,24,52,46),
+(7,8,19,17,26,25,53,47),
+(7,8,20,17,26,25,55,49),
+(7,8,21,17,26,26,57,51),
+(7,8,22,18,27,26,58,52),
+(7,8,23,18,27,26,60,54),
+(7,8,24,18,27,27,61,55),
+(7,8,25,18,27,27,63,57),
+(7,8,26,18,28,27,65,59),
+(7,8,27,18,28,28,67,60),
+(7,8,28,18,28,28,68,62),
+(7,8,29,19,28,29,70,64),
+(7,8,30,19,29,29,72,65),
+(7,8,31,19,29,30,74,67),
+(7,8,32,19,29,30,75,69),
+(7,8,33,19,29,30,77,70),
+(7,8,34,20,30,31,79,72),
+(7,8,35,20,30,31,81,74),
+(7,8,36,20,30,32,83,76),
+(7,8,37,20,30,32,85,78),
+(7,8,38,20,31,33,86,79),
+(7,8,39,21,31,33,88,81),
+(7,8,40,21,31,34,90,83),
+(7,8,41,21,32,34,92,85),
+(7,8,42,21,32,35,94,87),
+(7,8,43,21,32,35,96,89),
+(7,8,44,22,32,36,98,91),
+(7,8,45,22,33,36,100,92),
+(7,8,46,22,33,37,102,94),
+(7,8,47,22,33,37,104,96),
+(7,8,48,22,34,38,106,98),
+(7,8,49,23,34,38,108,100),
+(7,8,50,23,34,39,110,102),
+(7,8,51,23,35,39,112,104),
+(7,8,52,23,35,40,114,106),
+(7,8,53,24,35,40,117,108),
+(7,8,54,24,36,41,119,110),
+(7,8,55,24,36,41,121,112),
+(7,8,56,24,37,42,123,114),
+(7,8,57,25,37,42,125,117),
+(7,8,58,25,37,43,127,119),
+(7,8,59,25,38,43,130,121),
+(7,8,60,25,38,44,132,123),
+(7,8,61,26,38,45,134,125),
+(7,8,62,26,39,45,136,127),
+(7,8,63,26,39,46,139,129),
+(7,8,64,26,40,46,141,132),
+(7,8,65,27,40,47,143,134),
+(7,8,66,27,40,48,146,136),
+(7,8,67,27,41,48,148,138),
+(7,8,68,27,41,49,150,140),
+(7,8,69,28,42,49,153,143),
+(7,8,70,28,42,50,155,145),
+(7,8,71,28,42,51,168,148),
+(7,8,72,28,43,52,168,151),
+(7,8,73,28,43,53,171,154),
+(7,8,74,29,44,53,174,156),
+(7,8,75,29,44,54,177,159),
+(7,8,76,29,44,55,180,162),
+(7,8,77,30,45,56,183,165),
+(7,8,78,30,45,56,186,168),
+(7,8,79,30,46,57,190,171),
+(7,8,80,31,46,58,193,174),
+(7,9,1,15,23,20,26,22),
+(7,9,2,15,23,21,27,23),
+(7,9,3,16,24,21,28,24),
+(7,9,4,16,24,22,29,25),
+(7,9,5,16,24,22,31,27),
+(7,9,6,17,25,23,32,28),
+(7,9,7,17,25,23,33,29),
+(7,9,8,17,26,24,34,30),
+(7,9,9,17,26,25,36,31),
+(7,9,10,18,26,25,37,33),
+(7,9,11,18,27,26,38,34),
+(7,9,12,18,27,26,39,35),
+(7,9,13,19,28,27,41,36),
+(7,9,14,19,28,28,42,38),
+(7,9,15,20,28,28,43,39),
+(7,9,16,20,29,29,45,40),
+(7,9,17,20,29,30,46,42),
+(7,9,18,21,30,30,47,43),
+(7,9,19,21,30,31,49,44),
+(7,9,20,21,31,32,50,46),
+(7,9,21,22,31,32,51,47),
+(7,9,22,22,31,33,53,49),
+(7,9,23,23,32,34,54,50),
+(7,9,24,23,32,34,56,51),
+(7,9,25,23,33,35,57,53),
+(7,9,26,24,33,36,59,54),
+(7,9,27,24,34,37,60,56),
+(7,9,28,25,34,37,62,57),
+(7,9,29,25,35,38,63,59),
+(7,9,30,25,35,39,65,60),
+(7,9,31,26,36,40,66,62),
+(7,9,32,26,36,40,68,63),
+(7,9,33,27,37,41,69,65),
+(7,9,34,27,38,42,71,66),
+(7,9,35,28,38,43,73,68),
+(7,9,36,28,39,43,74,69),
+(7,9,37,28,39,44,76,71),
+(7,9,38,29,40,45,77,73),
+(7,9,39,29,40,46,79,74),
+(7,9,40,30,41,47,81,76),
+(7,9,41,30,41,48,82,78),
+(7,9,42,31,42,48,84,79),
+(7,9,43,31,43,49,86,81),
+(7,9,44,32,43,50,88,83),
+(7,9,45,32,44,51,89,84),
+(7,9,46,33,44,52,91,86),
+(7,9,47,33,45,53,93,88),
+(7,9,48,34,46,54,95,89),
+(7,9,49,34,46,54,96,91),
+(7,9,50,35,47,55,98,93),
+(7,9,51,35,48,56,100,95),
+(7,9,52,36,48,57,102,97),
+(7,9,53,36,49,58,104,98),
+(7,9,54,37,50,59,105,100),
+(7,9,55,37,50,60,107,102),
+(7,9,56,38,51,61,109,104),
+(7,9,57,38,52,62,111,106),
+(7,9,58,39,52,63,113,108),
+(7,9,59,40,53,64,115,109),
+(7,9,60,40,54,65,117,111),
+(7,9,61,41,54,66,119,113),
+(7,9,62,41,55,67,121,115),
+(7,9,63,42,56,68,123,117),
+(7,9,64,42,57,69,125,119),
+(7,9,65,43,57,70,127,121),
+(7,9,66,44,58,71,129,123),
+(7,9,67,44,59,72,131,125),
+(7,9,68,45,59,73,133,127),
+(7,9,69,45,60,74,135,129),
+(7,9,70,46,61,75,137,131),
+(7,9,71,47,62,84,147,142),
+(7,9,72,48,62,85,148,144),
+(7,9,73,49,63,85,153,147),
+(7,9,74,49,64,88,153,150),
+(7,9,75,50,65,90,155,152),
+(7,9,76,51,66,91,158,155),
+(7,9,77,52,67,92,161,158),
+(7,9,78,52,68,93,163,161),
+(7,9,79,53,69,95,166,164),
+(7,9,80,54,70,96,170,166),
+(8,1,1,24,22,23,16,21),
+(8,1,2,25,23,24,16,21),
+(8,1,3,27,24,25,16,22),
+(8,1,4,28,24,26,16,22),
+(8,1,5,29,25,28,16,22),
+(8,1,6,31,26,29,16,22),
+(8,1,7,32,27,30,17,23),
+(8,1,8,33,28,31,17,23),
+(8,1,9,35,28,33,17,23),
+(8,1,10,36,29,34,17,24),
+(8,1,11,37,30,35,17,24),
+(8,1,12,39,31,36,17,24),
+(8,1,13,40,32,38,17,25),
+(8,1,14,42,33,39,17,25),
+(8,1,15,43,34,40,18,25),
+(8,1,16,45,35,42,18,26),
+(8,1,17,46,35,43,18,26),
+(8,1,18,48,36,44,18,26),
+(8,1,19,49,37,46,18,27),
+(8,1,20,51,38,47,18,27),
+(8,1,21,52,39,49,18,27),
+(8,1,22,54,40,50,18,28),
+(8,1,23,55,41,51,19,28),
+(8,1,24,57,42,53,19,29),
+(8,1,25,59,43,54,19,29),
+(8,1,26,60,44,56,19,29),
+(8,1,27,62,45,57,19,30),
+(8,1,28,63,46,59,19,30),
+(8,1,29,65,47,60,20,31),
+(8,1,30,67,48,62,20,31),
+(8,1,31,69,49,63,20,31),
+(8,1,32,70,50,65,20,32),
+(8,1,33,72,51,67,20,32),
+(8,1,34,74,53,68,20,33),
+(8,1,35,75,54,70,21,33),
+(8,1,36,77,55,71,21,34),
+(8,1,37,79,56,73,21,34),
+(8,1,38,81,57,75,21,35),
+(8,1,39,83,58,76,21,35),
+(8,1,40,84,59,78,22,35),
+(8,1,41,86,60,80,22,36),
+(8,1,42,88,62,81,22,36),
+(8,1,43,90,63,83,22,37),
+(8,1,44,92,64,85,22,37),
+(8,1,45,94,65,86,23,38),
+(8,1,46,96,66,88,23,38),
+(8,1,47,98,67,90,23,39),
+(8,1,48,100,69,92,23,39),
+(8,1,49,102,70,93,24,40),
+(8,1,50,103,71,95,24,40),
+(8,1,51,105,72,97,24,41),
+(8,1,52,107,74,99,24,42),
+(8,1,53,109,75,101,25,42),
+(8,1,54,112,76,103,25,43),
+(8,1,55,114,78,104,25,43),
+(8,1,56,116,79,106,25,44),
+(8,1,57,118,80,108,25,44),
+(8,1,58,120,81,110,26,45),
+(8,1,59,122,83,112,26,45),
+(8,1,60,124,84,114,26,46),
+(8,1,61,126,85,116,27,47),
+(8,1,62,128,87,118,27,47),
+(8,1,63,130,88,120,27,48),
+(8,1,64,133,90,122,27,48),
+(8,1,65,135,91,124,28,49),
+(8,1,66,137,92,126,28,50),
+(8,1,67,139,94,128,28,50),
+(8,1,68,141,95,130,28,51),
+(8,1,69,144,97,132,29,51),
+(8,1,70,146,98,134,29,52),
+(8,1,71,149,99,136,29,53),
+(8,1,72,151,101,139,29,54),
+(8,1,73,154,103,141,29,55),
+(8,1,74,157,104,144,30,55),
+(8,1,75,166,106,151,30,56),
+(8,1,76,172,108,157,30,57),
+(8,1,77,175,110,161,31,58),
+(8,1,78,179,111,163,31,58),
+(8,1,79,182,113,164,31,59),
+(8,1,80,185,115,169,32,60),
+(8,3,1,21,25,22,16,22),
+(8,3,2,21,26,23,17,23),
+(8,3,3,22,28,24,17,23),
+(8,3,4,22,29,25,18,24),
+(8,3,5,23,30,26,18,25),
+(8,3,6,23,32,27,19,25),
+(8,3,7,24,33,28,20,26),
+(8,3,8,24,35,28,20,26),
+(8,3,9,25,36,29,21,27),
+(8,3,10,25,38,30,21,28),
+(8,3,11,25,39,31,22,29),
+(8,3,12,26,41,32,23,29),
+(8,3,13,26,42,33,23,30),
+(8,3,14,27,44,34,24,31),
+(8,3,15,27,45,35,25,31),
+(8,3,16,28,47,36,25,32),
+(8,3,17,28,48,38,26,33),
+(8,3,18,29,50,39,27,34),
+(8,3,19,29,51,40,28,34),
+(8,3,20,30,53,41,28,35),
+(8,3,21,31,55,42,29,36),
+(8,3,22,31,56,43,30,37),
+(8,3,23,32,58,44,30,37),
+(8,3,24,32,60,45,31,38),
+(8,3,25,33,61,46,32,39),
+(8,3,26,33,63,48,33,40),
+(8,3,27,34,65,49,33,41),
+(8,3,28,35,66,50,34,41),
+(8,3,29,35,68,51,35,42),
+(8,3,30,36,70,52,36,43),
+(8,3,31,36,72,53,37,44),
+(8,3,32,37,73,55,37,45),
+(8,3,33,38,75,56,38,46),
+(8,3,34,38,77,57,39,47),
+(8,3,35,39,79,58,40,48),
+(8,3,36,39,81,60,41,48),
+(8,3,37,40,83,61,41,49),
+(8,3,38,41,85,62,42,50),
+(8,3,39,41,86,63,43,51),
+(8,3,40,42,88,65,44,52),
+(8,3,41,43,90,66,45,53),
+(8,3,42,43,92,67,46,54),
+(8,3,43,44,94,69,47,55),
+(8,3,44,45,96,70,47,56),
+(8,3,45,45,98,71,48,57),
+(8,3,46,46,100,73,49,58),
+(8,3,47,47,102,74,50,59),
+(8,3,48,48,104,76,51,60),
+(8,3,49,48,106,77,52,61),
+(8,3,50,49,108,78,53,62),
+(8,3,51,50,110,80,54,63),
+(8,3,52,51,113,81,55,64),
+(8,3,53,51,115,83,56,65),
+(8,3,54,52,117,84,57,66),
+(8,3,55,53,119,86,58,67),
+(8,3,56,54,121,87,59,68),
+(8,3,57,54,123,89,60,69),
+(8,3,58,55,126,90,61,70),
+(8,3,59,56,128,92,62,71),
+(8,3,60,57,130,93,63,73),
+(8,3,61,58,132,95,64,74),
+(8,3,62,58,134,96,65,75),
+(8,3,63,59,137,98,66,76),
+(8,3,64,60,139,99,67,77),
+(8,3,65,61,141,101,68,78),
+(8,3,66,62,144,103,69,79),
+(8,3,67,62,146,104,70,80),
+(8,3,68,63,148,106,71,82),
+(8,3,69,64,151,107,72,83),
+(8,3,70,65,153,109,73,84),
+(8,3,71,66,156,111,74,85),
+(8,3,72,67,159,113,75,86),
+(8,3,73,68,162,115,76,88),
+(8,3,74,69,165,117,78,89),
+(8,3,75,70,174,119,82,91),
+(8,3,76,71,177,121,83,92),
+(8,3,77,72,180,123,85,94),
+(8,3,78,73,184,125,86,95),
+(8,3,79,74,187,127,87,97),
+(8,3,80,75,190,129,89,98),
+(8,4,1,22,25,22,16,21),
+(8,4,2,23,26,23,16,21),
+(8,4,3,24,28,23,16,22),
+(8,4,4,24,29,24,16,22),
+(8,4,5,25,31,25,17,22),
+(8,4,6,26,32,25,17,23),
+(8,4,7,27,34,26,17,23),
+(8,4,8,27,35,27,17,24),
+(8,4,9,28,37,28,17,24),
+(8,4,10,29,38,28,18,24),
+(8,4,11,30,40,29,18,25),
+(8,4,12,31,41,30,18,25),
+(8,4,13,32,43,31,18,26),
+(8,4,14,32,45,32,18,26),
+(8,4,15,33,46,32,19,26),
+(8,4,16,34,48,33,19,27),
+(8,4,17,35,50,34,19,27),
+(8,4,18,36,51,35,19,28),
+(8,4,19,37,53,36,19,28),
+(8,4,20,38,55,36,20,29),
+(8,4,21,39,56,37,20,29),
+(8,4,22,40,58,38,20,30),
+(8,4,23,41,60,39,20,30),
+(8,4,24,42,62,40,20,31),
+(8,4,25,43,63,41,21,31),
+(8,4,26,44,65,42,21,32),
+(8,4,27,45,67,43,21,32),
+(8,4,28,46,69,44,21,33),
+(8,4,29,47,71,44,22,33),
+(8,4,30,48,72,45,22,34),
+(8,4,31,49,74,46,22,34),
+(8,4,32,50,76,47,22,35),
+(8,4,33,51,78,48,23,35),
+(8,4,34,52,80,49,23,36),
+(8,4,35,53,82,50,23,36),
+(8,4,36,54,84,51,24,37),
+(8,4,37,55,86,52,24,37),
+(8,4,38,56,88,53,24,38),
+(8,4,39,57,90,54,24,38),
+(8,4,40,58,92,55,25,39),
+(8,4,41,59,94,56,25,40),
+(8,4,42,60,96,57,25,40),
+(8,4,43,62,98,58,26,41),
+(8,4,44,63,100,59,26,41),
+(8,4,45,64,102,60,26,42),
+(8,4,46,65,104,61,27,43),
+(8,4,47,66,107,63,27,43),
+(8,4,48,67,109,64,27,44),
+(8,4,49,69,111,65,27,44),
+(8,4,50,70,113,66,28,45),
+(8,4,51,71,115,67,28,46),
+(8,4,52,72,117,68,28,46),
+(8,4,53,74,120,69,29,47),
+(8,4,54,75,122,70,29,48),
+(8,4,55,76,124,72,29,48),
+(8,4,56,77,126,73,30,49),
+(8,4,57,79,129,74,30,50),
+(8,4,58,80,131,75,30,50),
+(8,4,59,81,133,76,31,51),
+(8,4,60,82,136,77,31,52),
+(8,4,61,84,138,79,32,52),
+(8,4,62,85,140,80,32,53),
+(8,4,63,86,143,81,32,54),
+(8,4,64,88,145,82,33,55),
+(8,4,65,89,148,84,33,55),
+(8,4,66,90,150,85,33,56),
+(8,4,67,92,153,86,34,57),
+(8,4,68,93,155,87,34,58),
+(8,4,69,95,157,89,35,58),
+(8,4,70,96,160,90,35,59),
+(8,4,71,98,163,94,35,60),
+(8,4,72,100,166,96,36,60),
+(8,4,73,101,169,96,36,61),
+(8,4,74,103,172,97,37,62),
+(8,4,75,105,175,98,37,63),
+(8,4,76,106,178,99,37,64),
+(8,4,77,108,181,105,38,65),
+(8,4,78,110,185,107,38,66),
+(8,4,79,112,188,109,39,67),
+(8,4,80,114,191,110,39,68),
+(8,5,1,21,22,21,18,24),
+(8,5,2,21,22,21,19,25),
+(8,5,3,21,22,22,21,27),
+(8,5,4,21,23,22,22,28),
+(8,5,5,22,23,22,23,29),
+(8,5,6,22,23,23,25,31),
+(8,5,7,22,23,23,26,32),
+(8,5,8,22,24,24,27,34),
+(8,5,9,22,24,24,29,35),
+(8,5,10,22,24,24,30,37),
+(8,5,11,23,24,25,32,38),
+(8,5,12,23,24,25,33,40),
+(8,5,13,23,25,26,35,41),
+(8,5,14,23,25,26,36,43),
+(8,5,15,23,25,26,38,44),
+(8,5,16,24,26,27,39,46),
+(8,5,17,24,26,27,41,47),
+(8,5,18,24,26,28,42,49),
+(8,5,19,24,26,28,44,50),
+(8,5,20,24,27,29,45,52),
+(8,5,21,25,27,29,47,54),
+(8,5,22,25,27,30,48,55),
+(8,5,23,25,28,30,50,57),
+(8,5,24,25,28,31,52,59),
+(8,5,25,25,28,31,53,60),
+(8,5,26,26,28,32,55,62),
+(8,5,27,26,29,32,56,64),
+(8,5,28,26,29,33,58,65),
+(8,5,29,26,29,33,60,67),
+(8,5,30,27,30,34,62,69),
+(8,5,31,27,30,34,63,71),
+(8,5,32,27,30,35,65,73),
+(8,5,33,27,31,35,67,74),
+(8,5,34,28,31,36,68,76),
+(8,5,35,28,32,36,70,78),
+(8,5,36,28,32,37,72,80),
+(8,5,37,29,32,37,74,82),
+(8,5,38,29,33,38,76,84),
+(8,5,39,29,33,38,77,86),
+(8,5,40,29,33,39,79,87),
+(8,5,41,30,34,40,81,89),
+(8,5,42,30,34,40,83,91),
+(8,5,43,30,35,41,85,93),
+(8,5,44,31,35,41,87,95),
+(8,5,45,31,35,42,89,97),
+(8,5,46,31,36,43,91,99),
+(8,5,47,32,36,43,93,101),
+(8,5,48,32,37,44,94,103),
+(8,5,49,32,37,44,96,105),
+(8,5,50,33,37,45,98,107),
+(8,5,51,33,38,46,100,110),
+(8,5,52,33,38,46,102,112),
+(8,5,53,34,39,47,104,114),
+(8,5,54,34,39,48,106,116),
+(8,5,55,34,40,48,109,118),
+(8,5,56,35,40,49,111,120),
+(8,5,57,35,41,50,113,122),
+(8,5,58,35,41,50,115,125),
+(8,5,59,36,42,51,117,127),
+(8,5,60,36,42,52,119,129),
+(8,5,61,36,42,52,121,131),
+(8,5,62,37,43,53,123,133),
+(8,5,63,37,43,54,125,136),
+(8,5,64,38,44,55,128,138),
+(8,5,65,38,44,55,130,140),
+(8,5,66,38,45,56,132,143),
+(8,5,67,39,45,57,134,145),
+(8,5,68,39,46,58,136,147),
+(8,5,69,40,46,58,139,150),
+(8,5,70,40,47,59,141,152),
+(8,5,71,40,48,60,144,155),
+(8,5,72,41,48,60,147,158),
+(8,5,73,41,49,61,150,161),
+(8,5,74,42,49,62,152,164),
+(8,5,75,42,50,63,155,167),
+(8,5,76,42,51,64,158,170),
+(8,5,77,43,51,65,161,173),
+(8,5,78,43,52,66,164,176),
+(8,5,79,44,52,67,167,179),
+(8,5,80,44,53,68,170,182),
+(8,6,1,24,22,23,16,21),
+(8,6,2,25,23,24,16,21),
+(8,6,3,27,24,25,16,22),
+(8,6,4,28,24,26,16,22),
+(8,6,5,29,25,28,16,22),
+(8,6,6,31,26,29,16,22),
+(8,6,7,32,27,30,17,23),
+(8,6,8,33,28,31,17,23),
+(8,6,9,35,28,33,17,23),
+(8,6,10,36,29,34,17,24),
+(8,6,11,37,30,35,17,24),
+(8,6,12,39,31,36,17,24),
+(8,6,13,40,32,38,17,25),
+(8,6,14,42,33,39,17,25),
+(8,6,15,43,34,40,18,25),
+(8,6,16,45,35,42,18,26),
+(8,6,17,46,35,43,18,26),
+(8,6,18,48,36,44,18,26),
+(8,6,19,49,37,46,18,27),
+(8,6,20,51,38,47,18,27),
+(8,6,21,52,39,49,18,27),
+(8,6,22,54,40,50,18,28),
+(8,6,23,55,41,51,19,28),
+(8,6,24,57,42,53,19,29),
+(8,6,25,59,43,54,19,29),
+(8,6,26,60,44,56,19,29),
+(8,6,27,62,45,57,19,30),
+(8,6,28,63,46,59,19,30),
+(8,6,29,65,47,60,20,31),
+(8,6,30,67,48,62,20,31),
+(8,6,31,69,49,63,20,31),
+(8,6,32,70,50,65,20,32),
+(8,6,33,72,51,67,20,32),
+(8,6,34,74,53,68,20,33),
+(8,6,35,75,54,70,21,33),
+(8,6,36,77,55,71,21,34),
+(8,6,37,79,56,73,21,34),
+(8,6,38,81,57,75,21,35),
+(8,6,39,83,58,76,21,35),
+(8,6,40,84,59,78,22,35),
+(8,6,41,86,60,80,22,36),
+(8,6,42,88,62,81,22,36),
+(8,6,43,90,63,83,22,37),
+(8,6,44,92,64,85,22,37),
+(8,6,45,94,65,86,23,38),
+(8,6,46,96,66,88,23,38),
+(8,6,47,98,67,90,23,39),
+(8,6,48,100,69,92,23,39),
+(8,6,49,102,70,93,24,40),
+(8,6,50,103,71,95,24,40),
+(8,6,51,105,72,96,24,41),
+(8,6,52,106,74,97,24,42),
+(8,6,53,107,73,98,25,42),
+(8,6,54,108,74,99,25,43),
+(8,6,55,109,75,100,25,43),
+(8,6,56,112,77,103,25,44),
+(8,6,57,114,78,105,25,44),
+(8,6,58,118,79,107,26,45),
+(8,6,59,119,81,109,26,45),
+(8,6,60,121,82,111,26,46),
+(8,6,61,123,83,113,26,47),
+(8,6,62,126,85,115,26,47),
+(8,6,63,128,86,118,27,48),
+(8,6,64,131,88,120,27,48),
+(8,6,65,138,89,122,27,49),
+(8,6,66,140,91,125,27,50),
+(8,6,67,143,92,127,28,50),
+(8,6,68,145,94,129,28,51),
+(8,6,69,148,95,132,28,52),
+(8,6,70,151,97,134,28,52),
+(8,6,71,154,99,137,29,53),
+(8,6,72,156,100,139,29,54),
+(8,6,73,159,102,142,29,55),
+(8,6,74,162,104,144,29,55),
+(8,6,75,165,105,147,30,56),
+(8,6,76,168,107,150,30,57),
+(8,6,77,169,109,153,30,58),
+(8,6,78,170,110,155,30,58),
+(8,6,79,178,112,158,31,59),
+(8,6,80,181,114,161,31,60),
+(8,7,1,22,22,22,17,23),
+(8,7,2,23,22,23,18,24),
+(8,7,3,24,23,24,19,25),
+(8,7,4,25,23,25,20,26),
+(8,7,5,25,24,26,21,27),
+(8,7,6,26,24,27,22,28),
+(8,7,7,27,25,28,23,29),
+(8,7,8,28,25,29,24,30),
+(8,7,9,29,25,30,25,31),
+(8,7,10,30,26,31,26,33),
+(8,7,11,31,26,32,27,34),
+(8,7,12,32,27,33,28,35),
+(8,7,13,33,27,34,29,36),
+(8,7,14,34,28,35,30,37),
+(8,7,15,34,28,36,31,38),
+(8,7,16,35,29,38,32,39),
+(8,7,17,36,29,39,33,41),
+(8,7,18,37,30,40,34,42),
+(8,7,19,38,30,41,35,43),
+(8,7,20,39,31,42,36,44),
+(8,7,21,40,32,43,37,45),
+(8,7,22,41,32,45,38,47),
+(8,7,23,43,33,46,39,48),
+(8,7,24,44,33,47,40,49),
+(8,7,25,45,34,48,42,51),
+(8,7,26,46,34,49,43,52),
+(8,7,27,47,35,51,44,53),
+(8,7,28,48,35,52,45,54),
+(8,7,29,49,36,53,46,56),
+(8,7,30,50,37,54,48,57),
+(8,7,31,51,37,56,49,59),
+(8,7,32,52,38,57,50,60),
+(8,7,33,53,38,58,51,61),
+(8,7,34,55,39,60,52,63),
+(8,7,35,56,40,61,54,64),
+(8,7,36,57,40,62,55,66),
+(8,7,37,58,41,64,56,67),
+(8,7,38,59,42,65,57,68),
+(8,7,39,61,42,66,59,70),
+(8,7,40,62,43,68,60,71),
+(8,7,41,63,44,69,61,73),
+(8,7,42,64,44,71,63,74),
+(8,7,43,65,45,72,64,76),
+(8,7,44,67,46,74,65,77),
+(8,7,45,68,46,75,67,79),
+(8,7,46,69,47,76,68,80),
+(8,7,47,71,48,78,69,82),
+(8,7,48,72,49,79,71,83),
+(8,7,49,73,49,81,72,85),
+(8,7,50,74,50,82,74,87),
+(8,7,51,76,51,84,75,88),
+(8,7,52,77,51,85,77,90),
+(8,7,53,78,52,87,78,92),
+(8,7,54,80,53,89,79,93),
+(8,7,55,81,54,90,81,95),
+(8,7,56,83,55,92,82,96),
+(8,7,57,84,55,93,84,98),
+(8,7,58,85,56,95,85,100),
+(8,7,59,87,57,97,87,102),
+(8,7,60,88,58,98,88,103),
+(8,7,61,90,58,100,90,105),
+(8,7,62,91,59,101,91,107),
+(8,7,63,93,60,103,93,108),
+(8,7,64,94,61,105,94,110),
+(8,7,65,95,62,106,96,112),
+(8,7,66,97,63,108,98,114),
+(8,7,67,98,63,110,99,116),
+(8,7,68,100,64,112,101,117),
+(8,7,69,101,65,113,102,119),
+(8,7,70,103,66,115,104,121),
+(8,7,71,104,67,117,116,123),
+(8,7,72,106,68,119,118,126),
+(8,7,73,108,69,121,121,128),
+(8,7,74,110,70,124,123,130),
+(8,7,75,112,71,126,125,132),
+(8,7,76,114,72,128,127,135),
+(8,7,77,115,73,130,129,137),
+(8,7,78,117,74,132,132,139),
+(8,7,79,119,75,135,134,142),
+(8,7,80,121,76,137,136,144),
+(8,8,1,21,22,21,19,23),
+(8,8,2,21,22,21,20,24),
+(8,8,3,21,22,22,22,26),
+(8,8,4,21,22,22,23,27),
+(8,8,5,21,23,22,25,28),
+(8,8,6,21,23,22,26,30),
+(8,8,7,21,23,23,27,31),
+(8,8,8,22,23,23,29,32),
+(8,8,9,22,23,23,30,34),
+(8,8,10,22,23,24,32,35),
+(8,8,11,22,24,24,33,37),
+(8,8,12,22,24,24,35,38),
+(8,8,13,22,24,25,36,39),
+(8,8,14,22,24,25,38,41),
+(8,8,15,22,24,25,39,42),
+(8,8,16,22,24,26,41,44),
+(8,8,17,23,25,26,42,45),
+(8,8,18,23,25,26,44,47),
+(8,8,19,23,25,27,46,48),
+(8,8,20,23,25,27,47,50),
+(8,8,21,23,25,27,49,51),
+(8,8,22,23,26,28,51,53),
+(8,8,23,23,26,28,52,55),
+(8,8,24,24,26,29,54,56),
+(8,8,25,24,26,29,56,58),
+(8,8,26,24,27,29,57,60),
+(8,8,27,24,27,30,59,61),
+(8,8,28,24,27,30,61,63),
+(8,8,29,24,27,31,63,65),
+(8,8,30,24,28,31,64,66),
+(8,8,31,25,28,31,66,68),
+(8,8,32,25,28,32,68,70),
+(8,8,33,25,28,32,70,71),
+(8,8,34,25,29,33,71,73),
+(8,8,35,25,29,33,73,75),
+(8,8,36,26,29,34,75,77),
+(8,8,37,26,29,34,77,79),
+(8,8,38,26,30,35,79,80),
+(8,8,39,26,30,35,81,82),
+(8,8,40,26,30,35,83,84),
+(8,8,41,27,31,36,85,86),
+(8,8,42,27,31,36,87,88),
+(8,8,43,27,31,37,89,90),
+(8,8,44,27,32,37,91,91),
+(8,8,45,27,32,38,93,93),
+(8,8,46,28,32,38,95,95),
+(8,8,47,28,32,39,97,97),
+(8,8,48,28,33,39,99,99),
+(8,8,49,28,33,40,101,101),
+(8,8,50,29,33,40,103,103),
+(8,8,51,29,34,41,105,105),
+(8,8,52,29,34,42,107,107),
+(8,8,53,29,35,42,109,109),
+(8,8,54,30,35,43,111,111),
+(8,8,55,30,35,43,113,113),
+(8,8,56,30,36,44,115,115),
+(8,8,57,30,36,44,118,118),
+(8,8,58,31,36,45,120,120),
+(8,8,59,31,37,45,122,122),
+(8,8,60,31,37,46,124,124),
+(8,8,61,31,37,47,126,126),
+(8,8,62,32,38,47,129,128),
+(8,8,63,32,38,48,131,130),
+(8,8,64,32,39,48,133,133),
+(8,8,65,33,39,49,135,135),
+(8,8,66,33,39,50,138,137),
+(8,8,67,33,40,50,140,139),
+(8,8,68,33,40,51,142,141),
+(8,8,69,34,41,51,145,144),
+(8,8,70,34,41,52,147,146),
+(8,8,71,34,41,53,150,149),
+(8,8,72,34,42,54,153,152),
+(8,8,73,34,42,55,156,155),
+(8,8,74,35,43,55,159,157),
+(8,8,75,35,43,56,162,160),
+(8,8,76,35,43,57,168,163),
+(8,8,77,36,44,58,168,166),
+(8,8,78,36,44,58,171,169),
+(8,8,79,36,45,59,177,172),
+(8,8,80,37,45,60,177,175),
+(10,2,1,19,22,21,24,20),
+(10,2,2,20,23,22,25,21),
+(10,2,3,21,23,23,25,21),
+(10,2,4,22,24,24,26,22),
+(10,2,5,23,24,25,27,23),
+(10,2,6,25,25,26,27,24),
+(10,2,7,26,25,27,28,24),
+(10,2,8,27,26,28,29,25),
+(10,2,9,28,27,29,29,26),
+(10,2,10,29,27,31,30,26),
+(10,2,11,30,28,32,31,27),
+(10,2,12,32,29,33,31,28),
+(10,2,13,33,29,34,32,29),
+(10,2,14,34,30,35,33,30),
+(10,2,15,35,31,36,33,30),
+(10,2,16,37,31,37,34,31),
+(10,2,17,38,32,39,35,32),
+(10,2,18,39,33,40,36,33),
+(10,2,19,40,33,41,36,34),
+(10,2,20,42,34,42,37,35),
+(10,2,21,43,35,44,38,35),
+(10,2,22,44,35,45,39,36),
+(10,2,23,46,36,46,40,37),
+(10,2,24,47,37,47,40,38),
+(10,2,25,49,38,49,41,39),
+(10,2,26,50,38,50,42,40),
+(10,2,27,51,39,51,43,41),
+(10,2,28,53,40,53,44,42),
+(10,2,29,54,41,54,45,43),
+(10,2,30,56,41,55,45,43),
+(10,2,31,57,42,57,46,44),
+(10,2,32,58,43,58,47,45),
+(10,2,33,60,44,59,48,46),
+(10,2,34,61,45,61,49,47),
+(10,2,35,63,45,62,50,48),
+(10,2,36,64,46,64,51,49),
+(10,2,37,66,47,65,52,50),
+(10,2,38,67,48,67,53,51),
+(10,2,39,69,49,68,54,52),
+(10,2,40,71,50,69,55,53),
+(10,2,41,72,50,71,55,54),
+(10,2,42,74,51,72,56,55),
+(10,2,43,75,52,74,57,56),
+(10,2,44,77,53,75,58,57),
+(10,2,45,79,54,77,59,59),
+(10,2,46,80,55,78,60,60),
+(10,2,47,82,56,80,61,61),
+(10,2,48,83,57,82,62,62),
+(10,2,49,85,58,83,63,63),
+(10,2,50,87,59,85,64,64),
+(10,2,51,89,60,86,66,65),
+(10,2,52,90,61,88,67,66),
+(10,2,53,92,61,90,68,67),
+(10,2,54,94,62,91,69,69),
+(10,2,55,95,63,93,70,70),
+(10,2,56,97,64,95,71,71),
+(10,2,57,99,65,96,72,72),
+(10,2,58,101,66,98,73,73),
+(10,2,59,102,67,100,74,74),
+(10,2,60,104,68,101,75,76),
+(10,2,61,106,69,103,76,77),
+(10,2,62,108,70,105,78,78),
+(10,2,63,110,72,106,79,79),
+(10,2,64,112,73,108,80,80),
+(10,2,65,113,74,110,81,82),
+(10,2,66,115,75,112,82,83),
+(10,2,67,117,76,114,83,84),
+(10,2,68,119,77,115,85,85),
+(10,2,69,121,78,117,86,87),
+(10,2,70,123,79,119,87,88),
+(10,2,71,125,80,120,88,89),
+(10,2,72,128,81,123,90,91),
+(10,2,73,130,82,125,91,93),
+(10,2,74,133,84,127,93,94),
+(10,2,75,135,85,129,94,96),
+(10,2,76,137,86,132,96,97),
+(10,2,77,140,88,134,97,99),
+(10,2,78,143,89,136,99,101),
+(10,2,79,145,90,139,100,102),
+(10,2,80,148,92,141,102,104),
+(10,3,1,17,25,20,24,20),
+(10,3,2,17,26,21,25,21),
+(10,3,3,18,28,22,25,21),
+(10,3,4,18,29,23,26,22),
+(10,3,5,19,30,24,26,23),
+(10,3,6,19,32,25,27,23),
+(10,3,7,20,33,26,27,24),
+(10,3,8,20,35,27,28,25),
+(10,3,9,21,36,27,29,25),
+(10,3,10,21,38,28,29,26),
+(10,3,11,22,39,29,30,27),
+(10,3,12,22,41,30,31,27),
+(10,3,13,23,42,31,31,28),
+(10,3,14,23,44,32,32,29),
+(10,3,15,24,45,34,32,29),
+(10,3,16,24,47,35,33,30),
+(10,3,17,25,48,36,34,31),
+(10,3,18,25,50,37,34,32),
+(10,3,19,26,51,38,35,32),
+(10,3,20,26,53,39,36,33),
+(10,3,21,27,55,40,37,34),
+(10,3,22,27,56,41,37,35),
+(10,3,23,28,58,42,38,36),
+(10,3,24,28,60,43,39,36),
+(10,3,25,29,61,44,39,37),
+(10,3,26,30,63,46,40,38),
+(10,3,27,30,65,47,41,39),
+(10,3,28,31,66,48,42,40),
+(10,3,29,31,68,49,42,40),
+(10,3,30,32,70,50,43,41),
+(10,3,31,33,72,52,44,42),
+(10,3,32,33,73,53,45,43),
+(10,3,33,34,75,54,46,44),
+(10,3,34,34,77,55,46,45),
+(10,3,35,35,79,57,47,46),
+(10,3,36,36,81,58,48,47),
+(10,3,37,36,83,59,49,47),
+(10,3,38,37,85,60,50,48),
+(10,3,39,38,86,62,51,49),
+(10,3,40,38,88,63,51,50),
+(10,3,41,39,90,64,52,51),
+(10,3,42,40,92,66,53,52),
+(10,3,43,40,94,67,54,53),
+(10,3,44,41,96,68,55,54),
+(10,3,45,42,98,70,56,55),
+(10,3,46,42,100,71,57,56),
+(10,3,47,43,102,72,58,57),
+(10,3,48,44,104,74,59,58),
+(10,3,49,45,106,75,60,59),
+(10,3,50,45,108,77,61,60),
+(10,3,51,46,110,78,61,61),
+(10,3,52,47,113,79,62,62),
+(10,3,53,47,115,81,63,63),
+(10,3,54,48,117,82,64,64),
+(10,3,55,49,119,84,65,65),
+(10,3,56,50,121,85,66,66),
+(10,3,57,50,123,87,67,67),
+(10,3,58,51,126,88,68,68),
+(10,3,59,52,128,90,69,70),
+(10,3,60,53,130,91,70,71),
+(10,3,61,54,132,93,71,72),
+(10,3,62,54,134,94,72,73),
+(10,3,63,55,137,96,73,74),
+(10,3,64,56,139,97,75,75),
+(10,3,65,57,141,99,76,76),
+(10,3,66,58,144,101,77,77),
+(10,3,67,58,146,102,78,78),
+(10,3,68,59,148,104,79,80),
+(10,3,69,60,151,105,80,81),
+(10,3,70,61,153,107,81,82),
+(10,3,71,62,156,108,82,83),
+(10,3,72,63,159,110,83,84),
+(10,3,73,64,162,112,84,86),
+(10,3,74,65,165,114,86,87),
+(10,3,75,66,168,116,87,89),
+(10,3,76,67,171,118,89,90),
+(10,3,77,68,174,120,90,92),
+(10,3,78,69,177,122,91,93),
+(10,3,79,70,180,124,92,95),
+(10,3,80,71,183,126,94,96),
+(10,4,1,18,25,20,24,19),
+(10,4,2,19,26,21,24,19),
+(10,4,3,20,28,21,24,20),
+(10,4,4,20,29,22,24,20),
+(10,4,5,21,31,23,25,20),
+(10,4,6,22,32,24,25,21),
+(10,4,7,23,34,24,25,21),
+(10,4,8,24,35,25,25,22),
+(10,4,9,24,37,26,25,22),
+(10,4,10,25,38,26,25,22),
+(10,4,11,26,40,27,25,23),
+(10,4,12,27,41,28,26,23),
+(10,4,13,28,43,29,26,24),
+(10,4,14,29,45,30,26,24),
+(10,4,15,29,46,30,26,25),
+(10,4,16,30,48,31,26,25),
+(10,4,17,31,50,32,27,25),
+(10,4,18,32,51,33,27,26),
+(10,4,19,33,53,34,27,26),
+(10,4,20,34,55,35,27,27),
+(10,4,21,35,56,35,27,27),
+(10,4,22,36,58,36,28,28),
+(10,4,23,37,60,37,28,28),
+(10,4,24,38,62,38,28,29),
+(10,4,25,39,63,39,28,29),
+(10,4,26,40,65,40,29,30),
+(10,4,27,41,67,41,29,30),
+(10,4,28,42,69,42,29,31),
+(10,4,29,43,71,43,29,31),
+(10,4,30,44,72,43,29,32),
+(10,4,31,45,74,44,30,32),
+(10,4,32,46,76,45,30,33),
+(10,4,33,47,78,46,30,33),
+(10,4,34,48,80,47,31,34),
+(10,4,35,49,82,48,31,34),
+(10,4,36,50,84,49,31,35),
+(10,4,37,51,86,50,31,35),
+(10,4,38,52,88,51,32,36),
+(10,4,39,53,90,52,32,37),
+(10,4,40,54,92,53,32,37),
+(10,4,41,56,94,54,33,38),
+(10,4,42,57,96,55,33,38),
+(10,4,43,58,98,56,33,39),
+(10,4,44,59,100,57,33,39),
+(10,4,45,60,102,59,34,40),
+(10,4,46,61,104,60,34,41),
+(10,4,47,62,107,61,34,41),
+(10,4,48,64,109,62,35,42),
+(10,4,49,65,111,63,35,43),
+(10,4,50,66,113,64,35,43),
+(10,4,51,67,115,65,36,44),
+(10,4,52,68,117,66,36,44),
+(10,4,53,70,120,67,36,45),
+(10,4,54,71,122,69,37,46),
+(10,4,55,72,124,70,37,46),
+(10,4,56,73,126,71,37,47),
+(10,4,57,75,129,72,38,48),
+(10,4,58,76,131,73,38,48),
+(10,4,59,77,133,74,39,49),
+(10,4,60,79,136,76,39,50),
+(10,4,61,80,138,77,39,51),
+(10,4,62,81,140,78,40,51),
+(10,4,63,82,143,79,40,52),
+(10,4,64,84,145,80,41,53),
+(10,4,65,85,148,82,41,53),
+(10,4,66,87,150,83,41,54),
+(10,4,67,88,153,84,42,55),
+(10,4,68,89,155,85,42,56),
+(10,4,69,91,157,87,43,56),
+(10,4,70,92,160,88,43,57),
+(10,4,71,94,163,88,43,58),
+(10,4,72,96,166,90,44,58),
+(10,4,73,97,169,92,44,59),
+(10,4,74,99,172,93,45,60),
+(10,4,75,101,175,95,45,61),
+(10,4,76,102,178,96,45,62),
+(10,4,77,104,181,101,46,63),
+(10,4,78,106,185,104,46,64),
+(10,4,79,108,188,105,47,65),
+(10,4,80,110,191,107,47,66),
+(10,5,1,17,22,19,26,22),
+(10,5,2,17,22,19,27,23),
+(10,5,3,17,22,20,29,25),
+(10,5,4,17,23,20,30,26),
+(10,5,5,18,23,20,31,27),
+(10,5,6,18,23,21,33,29),
+(10,5,7,18,23,21,34,30),
+(10,5,8,18,24,22,35,32),
+(10,5,9,18,24,22,37,33),
+(10,5,10,19,24,22,38,35),
+(10,5,11,19,24,23,39,36),
+(10,5,12,19,24,23,41,38),
+(10,5,13,19,25,24,42,39),
+(10,5,14,19,25,24,44,41),
+(10,5,15,19,25,25,45,42),
+(10,5,16,20,26,25,47,44),
+(10,5,17,20,26,25,48,45),
+(10,5,18,20,26,26,50,47),
+(10,5,19,20,26,26,51,49),
+(10,5,20,21,27,27,53,50),
+(10,5,21,21,27,27,54,52),
+(10,5,22,21,27,28,56,53),
+(10,5,23,21,28,28,58,55),
+(10,5,24,21,28,29,59,57),
+(10,5,25,22,28,29,61,58),
+(10,5,26,22,28,30,62,60),
+(10,5,27,22,29,30,64,62),
+(10,5,28,22,29,31,66,64),
+(10,5,29,23,29,31,67,65),
+(10,5,30,23,30,32,69,67),
+(10,5,31,23,30,32,71,69),
+(10,5,32,23,30,33,72,71),
+(10,5,33,24,31,33,74,72),
+(10,5,34,24,31,34,76,74),
+(10,5,35,24,32,34,78,76),
+(10,5,36,24,32,35,80,78),
+(10,5,37,25,32,35,81,80),
+(10,5,38,25,33,36,83,82),
+(10,5,39,25,33,37,85,84),
+(10,5,40,26,33,37,87,86),
+(10,5,41,26,34,38,89,88),
+(10,5,42,26,34,38,91,89),
+(10,5,43,27,35,39,92,91),
+(10,5,44,27,35,39,94,93),
+(10,5,45,27,35,40,96,95),
+(10,5,46,27,36,41,98,97),
+(10,5,47,28,36,41,100,99),
+(10,5,48,28,37,42,102,101),
+(10,5,49,28,37,43,104,103),
+(10,5,50,29,37,43,106,106),
+(10,5,51,29,38,44,108,108),
+(10,5,52,29,38,44,110,110),
+(10,5,53,30,39,45,112,112),
+(10,5,54,30,39,46,114,114),
+(10,5,55,30,40,46,116,116),
+(10,5,56,31,40,47,118,118),
+(10,5,57,31,41,48,120,120),
+(10,5,58,31,41,48,123,123),
+(10,5,59,32,42,49,125,125),
+(10,5,60,32,42,50,127,127),
+(10,5,61,33,42,51,129,129),
+(10,5,62,33,43,51,131,131),
+(10,5,63,33,43,52,133,134),
+(10,5,64,34,44,53,135,136),
+(10,5,65,34,44,53,138,138),
+(10,5,66,34,45,54,140,141),
+(10,5,67,35,45,55,142,143),
+(10,5,68,35,46,56,144,145),
+(10,5,69,36,46,56,147,148),
+(10,5,70,36,47,57,149,150),
+(10,5,71,36,48,57,152,153),
+(10,5,72,37,48,57,155,156),
+(10,5,73,37,49,58,158,159),
+(10,5,74,38,49,59,160,163),
+(10,5,75,38,50,60,163,165),
+(10,5,76,38,51,61,166,170),
+(10,5,77,39,51,62,168,175),
+(10,5,78,39,52,63,172,174),
+(10,5,79,40,52,64,175,177),
+(10,5,80,40,53,65,178,180),
+(10,6,1,18,23,21,24,20),
+(10,6,2,19,24,22,24,20),
+(10,6,3,21,25,23,24,21),
+(10,6,4,22,25,25,24,21),
+(10,6,5,23,26,26,24,21),
+(10,6,6,25,27,27,24,21),
+(10,6,7,26,28,28,24,22),
+(10,6,8,27,29,29,25,22),
+(10,6,9,29,29,31,25,22),
+(10,6,10,30,30,32,25,23),
+(10,6,11,32,31,33,25,23),
+(10,6,12,33,32,34,25,23),
+(10,6,13,34,33,36,25,24),
+(10,6,14,36,34,37,25,24),
+(10,6,15,37,35,38,25,24),
+(10,6,16,39,36,40,25,25),
+(10,6,17,40,36,41,25,25),
+(10,6,18,42,37,43,26,25),
+(10,6,19,43,38,44,26,26),
+(10,6,20,45,39,45,26,26),
+(10,6,21,47,40,47,26,26),
+(10,6,22,48,41,48,26,27),
+(10,6,23,50,42,50,26,27),
+(10,6,24,51,43,51,26,28),
+(10,6,25,53,44,52,27,28),
+(10,6,26,55,45,54,27,28),
+(10,6,27,56,46,55,27,29),
+(10,6,28,58,47,57,27,29),
+(10,6,29,59,48,58,27,30),
+(10,6,30,61,49,60,27,30),
+(10,6,31,63,50,62,27,30),
+(10,6,32,65,51,63,28,31),
+(10,6,33,66,52,65,28,31),
+(10,6,34,68,53,66,28,32),
+(10,6,35,70,55,68,28,32),
+(10,6,36,72,56,69,28,33),
+(10,6,37,73,57,71,29,33),
+(10,6,38,75,58,73,29,34),
+(10,6,39,77,59,74,29,34),
+(10,6,40,79,60,76,29,35),
+(10,6,41,81,61,78,29,35),
+(10,6,42,82,62,79,30,35),
+(10,6,43,84,64,81,30,36),
+(10,6,44,86,65,83,30,36),
+(10,6,45,88,66,85,30,37),
+(10,6,46,90,67,86,30,37),
+(10,6,47,92,68,88,31,38),
+(10,6,48,94,69,90,31,38),
+(10,6,49,96,69,92,31,39),
+(10,6,50,98,70,93,31,40),
+(10,6,51,100,71,95,32,40),
+(10,6,52,102,72,96,32,41),
+(10,6,53,103,73,97,32,41),
+(10,6,54,104,74,98,32,41),
+(10,6,55,105,75,97,33,41),
+(10,6,56,108,77,100,33,42),
+(10,6,57,113,78,102,33,42),
+(10,6,58,115,79,104,34,43),
+(10,6,59,117,81,106,34,43),
+(10,6,60,118,82,108,34,44),
+(10,6,61,119,83,110,34,45),
+(10,6,62,121,85,112,34,45),
+(10,6,63,124,86,115,35,46),
+(10,6,64,127,88,117,35,46),
+(10,6,65,133,89,119,35,47),
+(10,6,66,135,91,122,35,48),
+(10,6,67,139,92,124,36,48),
+(10,6,68,141,94,126,36,49),
+(10,6,69,142,95,129,36,50),
+(10,6,70,145,97,131,36,50),
+(10,6,71,150,99,134,37,51),
+(10,6,72,152,100,136,37,52),
+(10,6,73,155,102,139,37,53),
+(10,6,74,158,104,141,37,53),
+(10,6,75,159,105,144,38,54),
+(10,6,76,160,107,147,38,55),
+(10,6,77,163,109,149,38,56),
+(10,6,78,166,110,152,38,56),
+(10,6,79,169,112,155,39,57),
+(10,6,80,172,114,158,39,58),
+(10,8,1,17,22,19,27,21),
+(10,8,2,17,22,19,28,22),
+(10,8,3,17,22,20,30,24),
+(10,8,4,17,22,20,31,25),
+(10,8,5,17,23,20,32,26),
+(10,8,6,17,23,20,34,28),
+(10,8,7,18,23,21,35,29),
+(10,8,8,18,23,21,37,30),
+(10,8,9,18,23,21,38,32),
+(10,8,10,18,23,22,40,33),
+(10,8,11,18,24,22,41,35),
+(10,8,12,18,24,22,42,36),
+(10,8,13,18,24,23,44,37),
+(10,8,14,18,24,23,45,39),
+(10,8,15,18,24,23,47,40),
+(10,8,16,19,24,24,49,42),
+(10,8,17,19,25,24,50,43),
+(10,8,18,19,25,24,52,45),
+(10,8,19,19,25,25,53,46),
+(10,8,20,19,25,25,55,48),
+(10,8,21,19,25,26,57,50),
+(10,8,22,19,26,26,58,51),
+(10,8,23,20,26,26,60,53),
+(10,8,24,20,26,27,61,54),
+(10,8,25,20,26,27,63,56),
+(10,8,26,20,27,27,65,58),
+(10,8,27,20,27,28,67,59),
+(10,8,28,20,27,28,68,61),
+(10,8,29,21,27,29,70,63),
+(10,8,30,21,28,29,72,64),
+(10,8,31,21,28,30,74,66),
+(10,8,32,21,28,30,75,68),
+(10,8,33,21,28,30,77,70),
+(10,8,34,21,29,31,79,71),
+(10,8,35,22,29,31,81,73),
+(10,8,36,22,29,32,83,75),
+(10,8,37,22,29,32,85,77),
+(10,8,38,22,30,33,86,78),
+(10,8,39,22,30,33,88,80),
+(10,8,40,23,30,34,90,82),
+(10,8,41,23,31,34,92,84),
+(10,8,42,23,31,35,94,86),
+(10,8,43,23,31,35,96,88),
+(10,8,44,23,32,36,98,90),
+(10,8,45,24,32,36,100,92),
+(10,8,46,24,32,37,102,93),
+(10,8,47,24,32,37,104,95),
+(10,8,48,24,33,38,106,97),
+(10,8,49,25,33,38,108,99),
+(10,8,50,25,33,39,110,101),
+(10,8,51,25,34,39,112,103),
+(10,8,52,25,34,40,114,105),
+(10,8,53,25,35,40,117,107),
+(10,8,54,26,35,41,119,109),
+(10,8,55,26,35,41,121,111),
+(10,8,56,26,36,42,123,113),
+(10,8,57,26,36,42,125,116),
+(10,8,58,27,36,43,127,118),
+(10,8,59,27,37,43,130,120),
+(10,8,60,27,37,44,132,122),
+(10,8,61,27,37,45,134,124),
+(10,8,62,28,38,45,136,126),
+(10,8,63,28,38,46,139,128),
+(10,8,64,28,39,46,141,131),
+(10,8,65,29,39,47,143,133),
+(10,8,66,29,39,48,146,135),
+(10,8,67,29,40,48,148,137),
+(10,8,68,29,40,49,150,139),
+(10,8,69,30,41,49,153,142),
+(10,8,70,30,41,50,155,144),
+(10,8,71,30,41,50,158,147),
+(10,8,72,30,42,51,161,150),
+(10,8,73,30,42,52,164,153),
+(10,8,74,31,43,52,167,155),
+(10,8,75,31,43,53,170,158),
+(10,8,76,31,43,54,173,161),
+(10,8,77,32,44,55,176,164),
+(10,8,78,32,44,55,179,167),
+(10,8,79,32,45,56,182,170),
+(10,8,80,33,45,57,185,173),
+(10,9,1,17,22,20,26,21),
+(10,9,2,17,22,21,27,22),
+(10,9,3,18,23,21,28,23),
+(10,9,4,18,23,22,29,24),
+(10,9,5,18,23,22,31,26),
+(10,9,6,18,24,23,32,27),
+(10,9,7,19,24,23,33,28),
+(10,9,8,19,25,24,34,29),
+(10,9,9,19,25,25,36,30),
+(10,9,10,20,25,25,37,32),
+(10,9,11,20,26,26,38,33),
+(10,9,12,20,26,26,39,34),
+(10,9,13,21,27,27,41,36),
+(10,9,14,21,27,28,42,37),
+(10,9,15,21,27,28,43,38),
+(10,9,16,22,28,29,45,39),
+(10,9,17,22,28,30,46,41),
+(10,9,18,23,29,30,47,42),
+(10,9,19,23,29,31,49,43),
+(10,9,20,23,30,32,50,45),
+(10,9,21,24,30,32,51,46),
+(10,9,22,24,31,33,53,48),
+(10,9,23,24,31,34,54,49),
+(10,9,24,25,31,34,56,50),
+(10,9,25,25,32,35,57,52),
+(10,9,26,26,32,36,59,53),
+(10,9,27,26,33,37,60,55),
+(10,9,28,26,33,37,62,56),
+(10,9,29,27,34,38,63,58),
+(10,9,30,27,34,39,65,59),
+(10,9,31,28,35,40,66,61),
+(10,9,32,28,36,40,68,62),
+(10,9,33,29,36,41,69,64),
+(10,9,34,29,37,42,71,65),
+(10,9,35,29,37,43,73,67),
+(10,9,36,30,38,43,74,69),
+(10,9,37,30,38,44,76,70),
+(10,9,38,31,39,45,77,72),
+(10,9,39,31,39,46,79,73),
+(10,9,40,32,40,47,81,75),
+(10,9,41,32,41,48,82,77),
+(10,9,42,33,41,48,84,78),
+(10,9,43,33,42,49,86,80),
+(10,9,44,34,42,50,88,82),
+(10,9,45,34,43,51,89,83),
+(10,9,46,35,44,52,91,85),
+(10,9,47,35,44,53,93,87),
+(10,9,48,36,45,54,95,89),
+(10,9,49,36,45,54,96,90),
+(10,9,50,37,46,55,98,92),
+(10,9,51,37,47,56,100,94),
+(10,9,52,38,47,57,102,96),
+(10,9,53,38,48,58,104,97),
+(10,9,54,39,49,59,105,99),
+(10,9,55,39,49,60,107,101),
+(10,9,56,40,50,61,109,103),
+(10,9,57,40,51,62,111,105),
+(10,9,58,41,51,63,113,107),
+(10,9,59,42,52,64,115,108),
+(10,9,60,42,53,65,117,110),
+(10,9,61,43,53,66,119,112),
+(10,9,62,43,54,67,121,114),
+(10,9,63,44,55,68,123,116),
+(10,9,64,44,56,69,125,118),
+(10,9,65,45,56,70,127,120),
+(10,9,66,46,57,71,129,122),
+(10,9,67,46,58,72,131,124),
+(10,9,68,47,58,73,133,126),
+(10,9,69,47,59,74,135,128),
+(10,9,70,48,60,75,137,130),
+(10,9,71,49,61,83,139,141),
+(10,9,72,50,61,84,142,143),
+(10,9,73,51,62,84,144,146),
+(10,9,74,51,63,86,147,149),
+(10,9,75,52,64,89,149,151),
+(10,9,76,53,65,90,155,154),
+(10,9,77,54,66,91,155,157),
+(10,9,78,54,67,93,157,160),
+(10,9,79,55,68,94,160,163),
+(10,9,80,56,69,95,163,165),
+(11,1,1,24,17,21,21,22),
+(11,1,2,25,18,22,21,22),
+(11,1,3,27,19,23,21,23),
+(11,1,4,28,19,25,21,23),
+(11,1,5,29,20,26,21,23),
+(11,1,6,31,21,27,21,23),
+(11,1,7,32,22,28,21,24),
+(11,1,8,33,23,29,22,24),
+(11,1,9,35,24,31,22,24),
+(11,1,10,36,24,32,22,25),
+(11,1,11,37,25,33,22,25),
+(11,1,12,39,26,34,22,25),
+(11,1,13,40,27,36,22,26),
+(11,1,14,42,28,37,22,26),
+(11,1,15,43,29,38,22,26),
+(11,1,16,45,30,40,22,27),
+(11,1,17,46,31,41,23,27),
+(11,1,18,48,32,43,23,27),
+(11,1,19,49,33,44,23,28),
+(11,1,20,51,34,45,23,28),
+(11,1,21,52,34,47,23,28),
+(11,1,22,54,35,48,23,29),
+(11,1,23,55,36,50,23,29),
+(11,1,24,57,37,51,24,30),
+(11,1,25,59,38,52,24,30),
+(11,1,26,60,39,54,24,30),
+(11,1,27,62,40,55,24,31),
+(11,1,28,63,41,57,24,31),
+(11,1,29,65,43,58,24,32),
+(11,1,30,67,44,60,24,32),
+(11,1,31,69,45,62,25,32),
+(11,1,32,70,46,63,25,33),
+(11,1,33,72,47,65,25,33),
+(11,1,34,74,48,66,25,34),
+(11,1,35,75,49,68,25,34),
+(11,1,36,77,50,69,26,35),
+(11,1,37,79,51,71,26,35),
+(11,1,38,81,52,73,26,35),
+(11,1,39,83,53,74,26,36),
+(11,1,40,84,55,76,26,36),
+(11,1,41,86,56,78,27,37),
+(11,1,42,88,57,79,27,37),
+(11,1,43,90,58,81,27,38),
+(11,1,44,92,59,83,27,38),
+(11,1,45,94,60,85,27,39),
+(11,1,46,96,62,86,28,39),
+(11,1,47,98,63,88,28,40),
+(11,1,48,100,64,90,28,40),
+(11,1,49,102,65,92,28,41),
+(11,1,50,103,66,93,29,41),
+(11,1,51,105,68,95,29,42),
+(11,1,52,107,69,97,29,42),
+(11,1,53,109,70,99,29,43),
+(11,1,54,112,71,101,30,44),
+(11,1,55,114,73,103,30,44),
+(11,1,56,116,74,104,30,45),
+(11,1,57,118,75,106,30,45),
+(11,1,58,120,77,108,31,46),
+(11,1,59,122,78,110,31,46),
+(11,1,60,124,79,112,31,47),
+(11,1,61,126,81,114,31,48),
+(11,1,62,128,82,116,32,48),
+(11,1,63,130,83,118,32,49),
+(11,1,64,133,85,120,32,49),
+(11,1,65,135,86,122,33,50),
+(11,1,66,137,87,124,33,51),
+(11,1,67,139,89,126,33,51),
+(11,1,68,141,90,128,33,52),
+(11,1,69,144,92,130,34,52),
+(11,1,70,146,93,132,34,53),
+(11,1,71,149,94,134,34,54),
+(11,1,72,151,96,137,34,55),
+(11,1,73,154,98,139,34,56),
+(11,1,74,157,99,142,35,56),
+(11,1,75,166,101,149,35,57),
+(11,1,76,172,103,155,35,58),
+(11,1,77,175,105,159,36,59),
+(11,1,78,179,106,161,36,59),
+(11,1,79,182,108,164,36,60),
+(11,1,80,185,110,167,37,61),
+(11,2,1,23,17,21,21,23),
+(11,2,2,24,18,22,22,24),
+(11,2,3,25,18,23,22,24),
+(11,2,4,26,19,24,23,25),
+(11,2,5,27,19,25,24,26),
+(11,2,6,29,20,26,24,26),
+(11,2,7,30,21,27,25,27),
+(11,2,8,31,21,28,26,28),
+(11,2,9,32,22,29,26,29),
+(11,2,10,33,22,31,27,29),
+(11,2,11,34,23,32,28,30),
+(11,2,12,36,24,33,28,31),
+(11,2,13,37,24,34,29,32),
+(11,2,14,38,25,35,30,32),
+(11,2,15,39,26,36,31,33),
+(11,2,16,40,26,37,31,34),
+(11,2,17,42,27,39,32,35),
+(11,2,18,43,28,40,33,36),
+(11,2,19,44,28,41,34,37),
+(11,2,20,46,29,42,34,37),
+(11,2,21,47,30,44,35,38),
+(11,2,22,48,31,45,36,39),
+(11,2,23,50,31,46,37,40),
+(11,2,24,51,32,47,38,41),
+(11,2,25,52,33,49,38,42),
+(11,2,26,54,34,50,39,43),
+(11,2,27,55,34,51,40,44),
+(11,2,28,56,35,53,41,44),
+(11,2,29,58,36,54,42,45),
+(11,2,30,59,37,55,43,46),
+(11,2,31,61,37,57,43,47),
+(11,2,32,62,38,58,44,48),
+(11,2,33,64,39,59,45,49),
+(11,2,34,65,40,61,46,50),
+(11,2,35,67,41,62,47,51),
+(11,2,36,68,42,64,48,52),
+(11,2,37,70,42,65,49,53),
+(11,2,38,71,43,67,50,54),
+(11,2,39,73,44,68,51,55),
+(11,2,40,74,45,69,52,56),
+(11,2,41,76,46,71,53,57),
+(11,2,42,78,47,72,54,58),
+(11,2,43,79,47,74,55,59),
+(11,2,44,81,48,75,56,60),
+(11,2,45,82,49,77,57,61),
+(11,2,46,84,50,78,58,62),
+(11,2,47,86,51,80,59,64),
+(11,2,48,87,52,82,60,65),
+(11,2,49,89,53,83,61,66),
+(11,2,50,91,54,85,62,67),
+(11,2,51,92,55,86,63,68),
+(11,2,52,94,56,88,64,69),
+(11,2,53,96,57,90,65,70),
+(11,2,54,97,58,91,66,71),
+(11,2,55,99,59,93,67,73),
+(11,2,56,101,60,95,68,74),
+(11,2,57,103,61,96,69,75),
+(11,2,58,105,62,98,70,76),
+(11,2,59,106,63,100,71,77),
+(11,2,60,108,64,101,72,78),
+(11,2,61,110,65,103,74,80),
+(11,2,62,112,66,105,75,81),
+(11,2,63,114,67,106,76,82),
+(11,2,64,116,68,108,77,83),
+(11,2,65,117,69,110,78,85),
+(11,2,66,119,70,112,79,86),
+(11,2,67,121,71,114,80,87),
+(11,2,68,123,72,115,82,88),
+(11,2,69,125,73,117,83,90),
+(11,2,70,127,74,119,84,91),
+(11,2,71,130,75,121,87,92),
+(11,2,72,132,76,124,90,94),
+(11,2,73,134,77,126,93,96),
+(11,2,74,137,79,128,97,97),
+(11,2,75,139,80,130,101,99),
+(11,2,76,142,81,133,106,100),
+(11,2,77,144,83,135,108,102),
+(11,2,78,147,84,137,110,104),
+(11,2,79,149,85,140,111,105),
+(11,2,80,152,87,142,113,107),
+(11,3,1,21,20,20,21,23),
+(11,3,2,21,21,21,22,24),
+(11,3,3,22,23,22,22,24),
+(11,3,4,22,24,23,23,25),
+(11,3,5,23,25,24,23,25),
+(11,3,6,23,27,25,24,26),
+(11,3,7,24,28,26,24,27),
+(11,3,8,24,30,27,25,27),
+(11,3,9,25,31,27,26,28),
+(11,3,10,25,33,28,26,29),
+(11,3,11,25,34,29,27,29),
+(11,3,12,26,36,30,28,30),
+(11,3,13,26,37,31,28,31),
+(11,3,14,27,39,32,29,32),
+(11,3,15,27,40,34,30,32),
+(11,3,16,28,42,35,30,33),
+(11,3,17,28,43,36,31,34),
+(11,3,18,29,45,37,32,35),
+(11,3,19,29,47,38,32,35),
+(11,3,20,30,48,39,33,36),
+(11,3,21,31,50,40,34,37),
+(11,3,22,31,51,41,34,38),
+(11,3,23,32,53,42,35,38),
+(11,3,24,32,55,43,36,39),
+(11,3,25,33,57,44,37,40),
+(11,3,26,33,58,46,37,41),
+(11,3,27,34,60,47,38,42),
+(11,3,28,35,62,48,39,42),
+(11,3,29,35,63,49,40,43),
+(11,3,30,36,65,50,40,44),
+(11,3,31,36,67,52,41,45),
+(11,3,32,37,69,53,42,46),
+(11,3,33,38,71,54,43,47),
+(11,3,34,38,72,55,44,48),
+(11,3,35,39,74,57,44,48),
+(11,3,36,39,76,58,45,49),
+(11,3,37,40,78,59,46,50),
+(11,3,38,41,80,60,47,51),
+(11,3,39,41,82,62,48,52),
+(11,3,40,42,84,63,49,53),
+(11,3,41,43,86,64,50,54),
+(11,3,42,43,88,66,50,55),
+(11,3,43,44,90,67,51,56),
+(11,3,44,45,91,68,52,57),
+(11,3,45,45,93,70,53,58),
+(11,3,46,46,95,71,54,59),
+(11,3,47,47,98,72,55,60),
+(11,3,48,48,100,74,56,61),
+(11,3,49,48,102,75,57,62),
+(11,3,50,49,104,77,58,63),
+(11,3,51,50,106,78,59,64),
+(11,3,52,51,108,79,60,65),
+(11,3,53,51,110,81,61,66),
+(11,3,54,52,112,82,61,67),
+(11,3,55,53,114,84,62,68),
+(11,3,56,54,116,85,63,69),
+(11,3,57,54,118,87,64,70),
+(11,3,58,55,121,88,65,71),
+(11,3,59,56,123,90,66,72),
+(11,3,60,57,125,91,67,74),
+(11,3,61,58,127,93,68,75),
+(11,3,62,58,130,94,69,76),
+(11,3,63,59,132,96,71,77),
+(11,3,64,60,134,97,72,78),
+(11,3,65,61,136,99,73,79),
+(11,3,66,62,139,101,74,80),
+(11,3,67,62,141,102,75,81),
+(11,3,68,63,143,104,76,83),
+(11,3,69,64,146,105,77,84),
+(11,3,70,65,148,107,78,85),
+(11,3,71,66,151,109,79,86),
+(11,3,72,67,154,111,80,87),
+(11,3,73,68,157,113,81,89),
+(11,3,74,69,160,115,83,90),
+(11,3,75,70,163,117,84,92),
+(11,3,76,71,166,119,85,93),
+(11,3,77,72,169,121,87,95),
+(11,3,78,73,172,123,88,96),
+(11,3,79,74,175,125,89,98),
+(11,3,80,75,178,127,91,99),
+(11,5,1,21,17,19,23,25),
+(11,5,2,21,17,19,24,26),
+(11,5,3,21,17,20,26,28),
+(11,5,4,21,18,20,27,29),
+(11,5,5,22,18,20,28,30),
+(11,5,6,22,18,21,30,32),
+(11,5,7,22,18,21,31,33),
+(11,5,8,22,19,22,32,35),
+(11,5,9,22,19,22,34,36),
+(11,5,10,22,19,22,35,38),
+(11,5,11,23,19,23,37,39),
+(11,5,12,23,20,23,38,41),
+(11,5,13,23,20,24,39,42),
+(11,5,14,23,20,24,41,44),
+(11,5,15,23,20,25,42,45),
+(11,5,16,24,21,25,44,47),
+(11,5,17,24,21,25,45,48),
+(11,5,18,24,21,26,47,50),
+(11,5,19,24,22,26,48,51),
+(11,5,20,24,22,27,50,53),
+(11,5,21,25,22,27,51,55),
+(11,5,22,25,22,28,53,56),
+(11,5,23,25,23,28,55,58),
+(11,5,24,25,23,29,56,60),
+(11,5,25,25,23,29,58,61),
+(11,5,26,26,24,30,60,63),
+(11,5,27,26,24,30,61,65),
+(11,5,28,26,24,31,63,66),
+(11,5,29,26,25,31,65,68),
+(11,5,30,27,25,32,66,70),
+(11,5,31,27,25,32,68,72),
+(11,5,32,27,26,33,70,73),
+(11,5,33,27,26,33,71,75),
+(11,5,34,28,26,34,73,77),
+(11,5,35,28,27,34,75,79),
+(11,5,36,28,27,35,77,81),
+(11,5,37,29,28,35,79,83),
+(11,5,38,29,28,36,80,85),
+(11,5,39,29,28,37,82,86),
+(11,5,40,29,29,37,84,88),
+(11,5,41,30,29,38,86,90),
+(11,5,42,30,29,38,88,92),
+(11,5,43,30,30,39,90,94),
+(11,5,44,31,30,39,91,96),
+(11,5,45,31,31,40,93,98),
+(11,5,46,31,31,41,95,100),
+(11,5,47,32,31,41,97,102),
+(11,5,48,32,32,42,99,104),
+(11,5,49,32,32,43,101,106),
+(11,5,50,33,33,43,103,108),
+(11,5,51,33,33,44,105,110),
+(11,5,52,33,34,44,107,113),
+(11,5,53,34,34,45,109,115),
+(11,5,54,34,34,46,111,117),
+(11,5,55,34,35,46,113,119),
+(11,5,56,35,35,47,115,121),
+(11,5,57,35,36,48,118,123),
+(11,5,58,35,36,48,120,126),
+(11,5,59,36,37,49,122,128),
+(11,5,60,36,37,50,124,130),
+(11,5,61,36,38,51,126,132),
+(11,5,62,37,38,51,128,134),
+(11,5,63,37,39,52,130,137),
+(11,5,64,38,39,53,133,139),
+(11,5,65,38,40,53,135,141),
+(11,5,66,38,40,54,137,144),
+(11,5,67,39,40,55,139,146),
+(11,5,68,39,41,56,141,148),
+(11,5,69,40,41,56,144,151),
+(11,5,70,40,42,57,146,153),
+(11,5,71,40,43,58,149,156),
+(11,5,72,41,43,58,155,159),
+(11,5,73,41,44,59,157,160),
+(11,5,74,42,44,61,160,163),
+(11,5,75,42,45,62,164,166),
+(11,5,76,42,46,62,167,169),
+(11,5,77,43,46,63,168,172),
+(11,5,78,43,47,64,169,177),
+(11,5,79,44,47,65,172,180),
+(11,5,80,44,48,66,175,183),
+(11,6,1,24,17,21,21,22),
+(11,6,2,25,18,22,21,22),
+(11,6,3,27,19,23,21,23),
+(11,6,4,28,19,25,21,23),
+(11,6,5,29,20,26,21,23),
+(11,6,6,31,21,27,21,23),
+(11,6,7,32,22,28,21,24),
+(11,6,8,33,23,29,22,24),
+(11,6,9,35,24,31,22,24),
+(11,6,10,36,24,32,22,25),
+(11,6,11,37,25,33,22,25),
+(11,6,12,39,26,34,22,25),
+(11,6,13,40,27,36,22,26),
+(11,6,14,42,28,37,22,26),
+(11,6,15,43,29,38,22,26),
+(11,6,16,45,30,40,22,27),
+(11,6,17,46,31,41,23,27),
+(11,6,18,48,32,43,23,27),
+(11,6,19,49,33,44,23,28),
+(11,6,20,51,34,45,23,28),
+(11,6,21,52,34,47,23,28),
+(11,6,22,54,35,48,23,29),
+(11,6,23,55,36,50,23,29),
+(11,6,24,57,37,51,24,30),
+(11,6,25,59,38,52,24,30),
+(11,6,26,60,39,54,24,30),
+(11,6,27,62,40,55,24,31),
+(11,6,28,63,41,57,24,31),
+(11,6,29,65,43,58,24,32),
+(11,6,30,67,44,60,24,32),
+(11,6,31,69,45,62,25,32),
+(11,6,32,70,46,63,25,33),
+(11,6,33,72,47,65,25,33),
+(11,6,34,74,48,66,25,34),
+(11,6,35,75,49,68,25,34),
+(11,6,36,77,50,69,26,35),
+(11,6,37,79,51,71,26,35),
+(11,6,38,81,52,73,26,35),
+(11,6,39,83,53,74,26,36),
+(11,6,40,84,55,76,26,36),
+(11,6,41,86,56,78,27,37),
+(11,6,42,88,57,79,27,37),
+(11,6,43,90,58,81,27,38),
+(11,6,44,92,59,83,27,38),
+(11,6,45,94,60,85,27,39),
+(11,6,46,96,62,86,28,39),
+(11,6,47,98,63,88,28,40),
+(11,6,48,100,64,90,28,40),
+(11,6,49,102,65,92,28,41),
+(11,6,50,103,65,93,29,41),
+(11,6,51,105,66,94,29,42),
+(11,6,52,106,67,95,29,42),
+(11,6,53,107,68,96,29,43),
+(11,6,54,108,69,97,30,44),
+(11,6,55,109,70,98,30,44),
+(11,6,56,112,72,101,30,45),
+(11,6,57,114,73,103,30,45),
+(11,6,58,117,74,105,31,46),
+(11,6,59,119,76,107,31,46),
+(11,6,60,121,77,109,31,47),
+(11,6,61,123,78,111,31,48),
+(11,6,62,126,80,113,31,48),
+(11,6,63,128,81,116,32,49),
+(11,6,64,131,83,118,32,49),
+(11,6,65,136,84,120,32,50),
+(11,6,66,140,86,123,32,51),
+(11,6,67,141,87,125,33,51),
+(11,6,68,141,89,127,33,52),
+(11,6,69,144,90,130,33,53),
+(11,6,70,147,92,132,33,53),
+(11,6,71,150,94,135,34,54),
+(11,6,72,152,95,137,34,55),
+(11,6,73,155,97,140,34,56),
+(11,6,74,162,99,142,34,56),
+(11,6,75,165,100,145,35,57),
+(11,6,76,167,102,146,35,58),
+(11,6,77,169,104,150,35,59),
+(11,6,78,170,105,152,35,59),
+(11,6,79,173,107,156,36,60),
+(11,6,80,176,109,159,36,61),
+(11,7,1,22,17,20,22,24),
+(11,7,2,23,17,21,23,25),
+(11,7,3,24,18,22,24,26),
+(11,7,4,25,18,23,25,27),
+(11,7,5,25,19,24,26,28),
+(11,7,6,26,19,25,27,29),
+(11,7,7,27,20,26,28,30),
+(11,7,8,28,20,27,28,31),
+(11,7,9,29,21,28,29,32),
+(11,7,10,30,21,29,30,33),
+(11,7,11,31,22,30,31,35),
+(11,7,12,32,22,31,32,36),
+(11,7,13,33,23,32,33,37),
+(11,7,14,34,23,33,34,38),
+(11,7,15,34,24,35,35,39),
+(11,7,16,35,24,36,36,40),
+(11,7,17,36,25,37,38,42),
+(11,7,18,37,25,38,39,43),
+(11,7,19,38,26,39,40,44),
+(11,7,20,39,26,40,41,45),
+(11,7,21,40,27,41,42,46),
+(11,7,22,41,27,43,43,48),
+(11,7,23,43,28,44,44,49),
+(11,7,24,44,28,45,45,50),
+(11,7,25,45,29,46,46,51),
+(11,7,26,46,30,47,48,53),
+(11,7,27,47,30,49,49,54),
+(11,7,28,48,31,50,50,55),
+(11,7,29,49,31,51,51,57),
+(11,7,30,50,32,53,52,58),
+(11,7,31,51,33,54,53,59),
+(11,7,32,52,33,55,55,61),
+(11,7,33,53,34,56,56,62),
+(11,7,34,55,34,58,57,64),
+(11,7,35,56,35,59,58,65),
+(11,7,36,57,36,60,60,66),
+(11,7,37,58,36,62,61,68),
+(11,7,38,59,37,63,62,69),
+(11,7,39,61,38,65,63,71),
+(11,7,40,62,38,66,65,72),
+(11,7,41,63,39,67,66,74),
+(11,7,42,64,40,69,67,75),
+(11,7,43,65,40,70,69,77),
+(11,7,44,67,41,72,70,78),
+(11,7,45,68,42,73,71,80),
+(11,7,46,69,42,75,73,81),
+(11,7,47,71,43,76,74,83),
+(11,7,48,72,44,78,76,84),
+(11,7,49,73,45,79,77,86),
+(11,7,50,74,45,81,78,88),
+(11,7,51,76,46,82,80,89),
+(11,7,52,77,47,84,81,91),
+(11,7,53,78,47,85,83,92),
+(11,7,54,80,48,87,84,94),
+(11,7,55,81,49,88,86,96),
+(11,7,56,83,50,90,87,97),
+(11,7,57,84,50,91,89,99),
+(11,7,58,85,51,93,90,101),
+(11,7,59,87,52,95,92,102),
+(11,7,60,88,53,96,93,104),
+(11,7,61,90,54,98,95,106),
+(11,7,62,91,54,99,96,108),
+(11,7,63,93,55,101,98,109),
+(11,7,64,94,56,103,99,111),
+(11,7,65,95,57,104,101,113),
+(11,7,66,97,58,106,103,115),
+(11,7,67,98,58,108,104,117),
+(11,7,68,100,59,110,106,118),
+(11,7,69,101,60,111,107,120),
+(11,7,70,103,61,113,109,122),
+(11,7,71,104,62,115,122,124),
+(11,7,72,106,63,117,124,127),
+(11,7,73,108,64,119,126,129),
+(11,7,74,110,65,122,128,131),
+(11,7,75,112,66,124,130,133),
+(11,7,76,114,67,126,133,136),
+(11,7,77,115,68,128,135,138),
+(11,7,78,117,69,130,137,140),
+(11,7,79,119,70,133,139,143),
+(11,7,80,121,71,135,141,145),
+(11,8,1,21,17,19,24,24),
+(11,8,2,21,17,19,25,25),
+(11,8,3,21,17,20,27,27),
+(11,8,4,21,17,20,28,28),
+(11,8,5,21,18,20,29,29),
+(11,8,6,21,18,20,31,31),
+(11,8,7,21,18,21,32,32),
+(11,8,8,22,18,21,34,33),
+(11,8,9,22,18,21,35,35),
+(11,8,10,22,19,22,37,36),
+(11,8,11,22,19,22,38,37),
+(11,8,12,22,19,22,40,39),
+(11,8,13,22,19,23,41,40),
+(11,8,14,22,19,23,43,42),
+(11,8,15,22,19,23,44,43),
+(11,8,16,22,20,24,46,45),
+(11,8,17,23,20,24,47,46),
+(11,8,18,23,20,24,49,48),
+(11,8,19,23,20,25,50,49),
+(11,8,20,23,21,25,52,51),
+(11,8,21,23,21,26,54,52),
+(11,8,22,23,21,26,55,54),
+(11,8,23,23,21,26,57,56),
+(11,8,24,24,21,27,59,57),
+(11,8,25,24,22,27,60,59),
+(11,8,26,24,22,27,62,60),
+(11,8,27,24,22,28,64,62),
+(11,8,28,24,22,28,65,64),
+(11,8,29,24,23,29,67,65),
+(11,8,30,24,23,29,69,67),
+(11,8,31,25,23,30,71,69),
+(11,8,32,25,23,30,73,71),
+(11,8,33,25,24,30,74,72),
+(11,8,34,25,24,31,76,74),
+(11,8,35,25,24,31,78,76),
+(11,8,36,26,24,32,80,78),
+(11,8,37,26,25,32,82,79),
+(11,8,38,26,25,33,84,81),
+(11,8,39,26,25,33,86,83),
+(11,8,40,26,26,34,87,85),
+(11,8,41,27,26,34,89,87),
+(11,8,42,27,26,35,91,89),
+(11,8,43,27,27,35,93,91),
+(11,8,44,27,27,36,95,92),
+(11,8,45,27,27,36,97,94),
+(11,8,46,28,27,37,99,96),
+(11,8,47,28,28,37,101,98),
+(11,8,48,28,28,38,103,100),
+(11,8,49,28,28,38,105,102),
+(11,8,50,29,29,39,107,104),
+(11,8,51,29,29,39,110,106),
+(11,8,52,29,29,40,112,108),
+(11,8,53,29,30,40,114,110),
+(11,8,54,30,30,41,116,112),
+(11,8,55,30,30,41,118,114),
+(11,8,56,30,31,42,120,116),
+(11,8,57,30,31,42,122,118),
+(11,8,58,31,31,43,125,121),
+(11,8,59,31,32,43,127,123),
+(11,8,60,31,32,44,129,125),
+(11,8,61,31,33,45,131,127),
+(11,8,62,32,33,45,133,129),
+(11,8,63,32,33,46,136,131),
+(11,8,64,32,34,46,138,134),
+(11,8,65,33,34,47,140,136),
+(11,8,66,33,34,48,143,138),
+(11,8,67,33,35,48,145,140),
+(11,8,68,33,35,49,147,142),
+(11,8,69,34,36,49,150,145),
+(11,8,70,34,36,50,152,147),
+(11,8,71,34,36,51,155,150),
+(11,8,72,34,37,52,161,153),
+(11,8,73,34,37,53,161,156),
+(11,8,74,35,38,53,164,158),
+(11,8,75,35,38,54,167,161),
+(11,8,76,35,38,55,170,164),
+(11,8,77,36,39,56,173,167),
+(11,8,78,36,39,56,176,170),
+(11,8,79,36,40,57,179,173),
+(11,8,80,37,40,58,182,176);
/*!40000 ALTER TABLE `player_levelstats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2378,6 +9519,69 @@ CREATE TABLE `playercreateinfo` (
LOCK TABLES `playercreateinfo` WRITE;
/*!40000 ALTER TABLE `playercreateinfo` DISABLE KEYS */;
+INSERT INTO `playercreateinfo` VALUES
+(1,1,0,12,-8949,-132,84),
+(1,2,0,12,-8949,-132,84),
+(1,4,0,12,-8949,-132,84),
+(1,5,0,12,-8949,-132,84),
+(1,6,609,4298,2355.84,-5664.77,426.028),
+(1,8,0,12,-8949,-132,84),
+(1,9,0,12,-8949,-132,84),
+(2,1,1,14,-618,-4251,39),
+(2,3,1,14,-618,-4251,39),
+(2,4,1,14,-618,-4251,39),
+(2,6,609,4298,2358.44,-5666.9,426.023),
+(2,7,1,14,-618,-4251,39),
+(2,9,1,14,-618,-4251,39),
+(3,1,0,1,-6240,331,383),
+(3,2,0,1,-6240,331,383),
+(3,3,0,1,-6240,331,383),
+(3,4,0,1,-6240,331,383),
+(3,5,0,1,-6240,331,383),
+(3,6,609,4298,2358.44,-5666.9,426.023),
+(4,1,1,141,10311,832,1327),
+(4,3,1,141,10311,832,1327),
+(4,4,1,141,10311,832,1327),
+(4,5,1,141,10311,832,1327),
+(4,6,609,4298,2356.21,-5662.21,426.026),
+(4,11,1,141,10311,832,1327),
+(5,1,0,85,1676,1677,122),
+(5,4,0,85,1676,1677,122),
+(5,5,0,85,1676,1677,122),
+(5,8,0,85,1676,1677,122),
+(5,9,0,85,1676,1677,122),
+(5,6,609,4298,2356.21,-5662.21,426.026),
+(6,1,1,215,-2917,-257,53),
+(6,3,1,215,-2917,-257,53),
+(6,6,609,4298,2358.17,-5663.21,426.027),
+(6,7,1,215,-2917,-257,53),
+(6,11,1,215,-2917,-257,53),
+(7,1,0,1,-6240,331,383),
+(7,4,0,1,-6340,331,383),
+(7,6,609,4298,2355.05,-5661.7, 426.026),
+(7,8,0,1,-6340,331,383),
+(7,9,0,1,-6340,331,383),
+(8,1,1,14,-618,-4251,39),
+(8,3,1,14,-618,-4251,39),
+(8,4,1,14,-618,-4251,39),
+(8,5,1,14,-618,-4251,39),
+(8,6,609,4298,2355.05,-5661.7, 426.026),
+(8,7,1,14,-618,-4251,39),
+(8,8,1,14,-618,-4251,39),
+(10,2,530,3431,10349.6,-6357.29,33.4026),
+(10,3,530,3431,10349.6,-6357.29,33.4026),
+(10,4,530,3431,10349.6,-6357.29,33.4026),
+(10,5,530,3431,10349.6,-6357.29,33.4026),
+(10,6,609,4298,2355.84,-5664.77,426.028),
+(10,8,530,3431,10349.6,-6357.29,33.4026),
+(10,9,530,3431,10349.6,-6357.29,33.4026),
+(11,1,530,3526,-3961.64,-13931.2,100.615),
+(11,2,530,3526,-3961.64,-13931.2,100.615),
+(11,3,530,3526,-3961.64,-13931.2,100.615),
+(11,5,530,3526,-3961.64,-13931.2,100.615),
+(11,6,609,4298,2358.17,-5663.21,426.027),
+(11,7,530,3526,-3961.64,-13931.2,100.615),
+(11,8,530,3526,-3961.64,-13931.2,100.615);
/*!40000 ALTER TABLE `playercreateinfo` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2402,6 +9606,360 @@ CREATE TABLE `playercreateinfo_action` (
LOCK TABLES `playercreateinfo_action` WRITE;
/*!40000 ALTER TABLE `playercreateinfo_action` DISABLE KEYS */;
+INSERT INTO `playercreateinfo_action` VALUES
+(1,1,1,78,0,0),
+(1,1,0,6603,0,0),
+(1,1,11,117,128,0),
+(1,2,2,635,0,0),
+(1,2,0,6603,0,0),
+(1,2,1,21084,0,0),
+(1,2,10,159,128,0),
+(1,2,11,2070,128,0),
+(1,4,1,1752,0,0),
+(1,4,2,2098,0,0),
+(1,4,3,2764,0,0),
+(1,4,0,6603,0,0),
+(1,4,11,2070,128,0),
+(1,5,1,585,0,0),
+(1,5,2,2050,0,0),
+(1,5,0,6603,0,0),
+(1,5,10,159,128,0),
+(1,5,11,2070,128,0),
+(1,6,0,6603,0,0),
+(1,6,1,49576,0,0),
+(1,6,2,45477,0,0),
+(1,6,3,45462,0,0),
+(1,6,4,45902,0,0),
+(1,6,5,47541,0,0),
+(1,6,11,59752,0,0),
+(1,8,1,133,0,0),
+(1,8,2,168,0,0),
+(1,8,0,6603,0,0),
+(1,8,10,159,128,0),
+(1,8,11,2070,128,0),
+(1,9,1,686,0,0),
+(1,9,2,687,0,0),
+(1,9,0,6603,0,0),
+(1,9,10,159,128,0),
+(1,9,11,4604,128,0),
+(2,1,1,78,0,0),
+(2,1,0,6603,0,0),
+(2,1,11,117,128,0),
+(2,3,2,75,0,0),
+(2,3,1,2973,0,0),
+(2,3,0,6603,0,0),
+(2,3,11,117,128,0),
+(2,3,10,159,128,0),
+(2,4,10,0,128,0),
+(2,4,1,1752,0,0),
+(2,4,2,2098,0,0),
+(2,4,0,6603,0,0),
+(2,4,11,117,128,0),
+(2,6,0,6603,0,0),
+(2,6,1,49576,0,0),
+(2,6,2,45477,0,0),
+(2,6,3,45462,0,0),
+(2,6,4,45902,0,0),
+(2,6,5,47541,0,0),
+(2,6,10,20572,0,0),
+(2,7,2,331,0,0),
+(2,7,1,403,0,0),
+(2,7,0,6603,0,0),
+(2,7,11,117,128,0),
+(2,7,10,159,128,0),
+(2,9,1,686,0,0),
+(2,9,2,687,0,0),
+(2,9,0,6603,0,0),
+(2,9,11,117,128,0),
+(2,9,10,159,128,0),
+(3,1,1,78,0,0),
+(3,1,0,6603,0,0),
+(3,1,11,117,128,0),
+(3,2,2,635,0,0),
+(3,2,0,6603,0,0),
+(3,2,1,21084,0,0),
+(3,2,10,159,128,0),
+(3,2,11,4540,128,0),
+(3,3,2,75,0,0),
+(3,3,1,2973,0,0),
+(3,3,0,6603,0,0),
+(3,3,11,117,128,0),
+(3,3,10,159,128,0),
+(3,4,1,1752,0,0),
+(3,4,2,2098,0,0),
+(3,4,3,2764,0,0),
+(3,4,0,6603,0,0),
+(3,4,11,4540,128,0),
+(3,5,1,585,0,0),
+(3,5,2,2050,0,0),
+(3,5,0,6603,0,0),
+(3,5,10,159,128,0),
+(3,5,11,4540,128,0),
+(3,6,0,6603,0,0),
+(3,6,1,49576,0,0),
+(3,6,2,45477,0,0),
+(3,6,3,45462,0,0),
+(3,6,4,45902,0,0),
+(3,6,5,47541,0,0),
+(3,6,10,2481,0,0),
+(4,1,1,78,0,0),
+(4,1,0,6603,0,0),
+(4,1,11,117,128,0),
+(4,3,2,75,0,0),
+(4,3,1,2973,0,0),
+(4,3,0,6603,0,0),
+(4,3,11,117,128,0),
+(4,3,10,159,128,0),
+(4,4,1,1752,0,0),
+(4,4,2,2098,0,0),
+(4,4,3,2764,0,0),
+(4,4,0,6603,0,0),
+(4,4,11,4540,128,0),
+(4,5,1,585,0,0),
+(4,5,2,2050,0,0),
+(4,5,0,6603,0,0),
+(4,5,10,159,128,0),
+(4,5,11,2070,128,0),
+(4,6,0,6603,0,0),
+(4,6,1,49576,0,0),
+(4,6,2,45477,0,0),
+(4,6,3,45462,0,0),
+(4,6,4,45902,0,0),
+(4,6,5,47541,0,0),
+(4,6,10,58984,0,0),
+(4,6,83,58984,0,0),
+(4,11,1,5176,0,0),
+(4,11,2,5185,0,0),
+(4,11,0,6603,0,0),
+(4,11,10,159,128,0),
+(4,11,11,4536,128,0),
+(5,1,11,4604,128,0),
+(5,1,0,6603,0,0),
+(5,1,1,78,0,0),
+(5,4,11,4604,128,0),
+(5,4,3,2764,0,0),
+(5,4,2,2098,0,0),
+(5,4,1,1752,0,0),
+(5,4,0,6603,0,0),
+(5,5,10,159,128,0),
+(5,5,2,2050,0,0),
+(5,5,1,585,0,0),
+(5,5,11,4604,128,0),
+(5,5,0,6603,0,0),
+(5,6,0,6603,0,0),
+(5,6,1,49576,0,0),
+(5,6,2,45477,0,0),
+(5,6,3,45462,0,0),
+(5,6,4,45902,0,0),
+(5,6,5,47541,0,0),
+(5,6,10,20577,0,0),
+(5,8,11,4604,128,0),
+(5,8,10,159,128,0),
+(5,8,2,168,0,0),
+(5,8,1,133,0,0),
+(5,8,0,6603,0,0),
+(5,9,1,686,0,0),
+(5,9,10,159,128,0),
+(5,9,2,687,0,0),
+(5,9,11,4604,128,0),
+(5,9,0,6603,0,0),
+(6,1,1,78,0,0),
+(6,1,2,20549,0,0),
+(6,1,11,4540,128,0),
+(6,1,0,6603,0,0),
+(6,3,1,2973,0,0),
+(6,3,10,159,128,0),
+(6,3,2,75,0,0),
+(6,3,3,20549,0,0),
+(6,3,11,117,128,0),
+(6,3,0,6603,0,0),
+(6,6,0,6603,0,0),
+(6,6,1,49576,0,0),
+(6,6,2,45477,0,0),
+(6,6,3,45462,0,0),
+(6,6,4,45902,0,0),
+(6,6,5,47541,0,0),
+(6,6,10,20549,0,0),
+(6,6,75,20549,0,0),
+(6,7,1,403,0,0),
+(6,7,10,159,128,0),
+(6,7,2,331,0,0),
+(6,7,3,20549,0,0),
+(6,7,11,4604,128,0),
+(6,7,0,6603,0,0),
+(6,11,1,5176,0,0),
+(6,11,10,159,128,0),
+(6,11,2,5185,0,0),
+(6,11,3,20549,0,0),
+(6,11,11,4536,128,0),
+(6,11,0,6603,0,0),
+(7,1,11,117,128,0),
+(7,1,1,78,0,0),
+(7,1,0,6603,0,0),
+(7,4,11,117,128,0),
+(7,4,3,2764,0,0),
+(7,4,1,1752,0,0),
+(7,4,2,2098,0,0),
+(7,4,0,6603,0,0),
+(7,6,0,6603,0,0),
+(7,6,1,49576,0,0),
+(7,6,2,45477,0,0),
+(7,6,3,45462,0,0),
+(7,6,4,45902,0,0),
+(7,6,5,47541,0,0),
+(7,6,10,20589,0,0),
+(7,6,72,6603,0,0),
+(7,6,83,117,128,0),
+(7,6,84,6603,0,0),
+(7,6,96,6603,0,0),
+(7,6,108,6603,0,0),
+(7,8,11,4536,128,0),
+(7,8,1,133,0,0),
+(7,8,2,168,0,0),
+(7,8,10,159,128,0),
+(7,8,0,6603,0,0),
+(7,9,11,4604,128,0),
+(7,9,1,686,0,0),
+(7,9,2,687,0,0),
+(7,9,10,159,128,0),
+(7,9,0,6603,0,0),
+(8,1,11,117,128,0),
+(8,1,1,78,0,0),
+(8,1,3,2764,0,0),
+(8,1,0,6603,0,0),
+(8,3,10,159,128,0),
+(8,3,11,4604,128,0),
+(8,3,1,2973,0,0),
+(8,3,2,75,0,0),
+(8,3,0,6603,0,0),
+(8,4,1,1752,0,0),
+(8,4,3,2764,0,0),
+(8,4,2,2098,0,0),
+(8,4,11,117,128,0),
+(8,4,0,6603,0,0),
+(8,5,1,585,0,0),
+(8,5,10,159,128,0),
+(8,5,2,2050,0,0),
+(8,5,11,4540,128,0),
+(8,5,0,6603,0,0),
+(8,6,0,6603,0,0),
+(8,6,1,49576,0,0),
+(8,6,2,45477,0,0),
+(8,6,3,45462,0,0),
+(8,6,4,45902,0,0),
+(8,6,5,47541,0,0),
+(8,6,10,50621,0,0),
+(8,7,1,403,0,0),
+(8,7,10,159,128,0),
+(8,7,2,331,0,0),
+(8,7,11,117,128,0),
+(8,7,0,6603,0,0),
+(8,8,1,133,0,0),
+(8,8,10,159,128,0),
+(8,8,2,168,0,0),
+(8,8,11,117,128,0),
+(8,8,0,6603,0,0),
+(10,2,0,6603,0,0),
+(10,2,1,21084,0,0),
+(10,2,2,635,0,0),
+(10,2,3,28734,0,0),
+(10,2,4,28730,0,0),
+(10,2,10,159,128,0),
+(10,2,11,20857,128,0),
+(10,3,0,6603,0,0),
+(10,3,1,2973,0,0),
+(10,3,2,75,0,0),
+(10,3,3,28734,0,0),
+(10,3,4,28730,0,0),
+(10,3,10,159,128,0),
+(10,3,11,20857,128,0),
+(10,4,0,6603,0,0),
+(10,4,1,1752,0,0),
+(10,4,2,2098,0,0),
+(10,4,3,2764,0,0),
+(10,4,4,28734,0,0),
+(10,4,5,25046,0,0),
+(10,4,11,20857,128,0),
+(10,5,0,6603,0,0),
+(10,5,1,585,0,0),
+(10,5,2,2050,0,0),
+(10,5,3,28734,0,0),
+(10,5,4,28730,0,0),
+(10,5,10,159,128,0),
+(10,5,11,20857,128,0),
+(10,6,0,6603,0,0),
+(10,6,1,49576,0,0),
+(10,6,2,45477,0,0),
+(10,6,3,45462,0,0),
+(10,6,4,45902,0,0),
+(10,6,5,47541,0,0),
+(10,6,6,50613,0,0),
+(10,8,0,6603,0,0),
+(10,8,1,133,0,0),
+(10,8,2,168,0,0),
+(10,8,3,28734,0,0),
+(10,8,4,28730,0,0),
+(10,8,10,159,128,0),
+(10,8,11,20857,128,0),
+(10,9,11,20857,128,0),
+(10,9,10,159,128,0),
+(10,9,4,28730,0,0),
+(10,9,3,28734,0,0),
+(10,9,2,687,0,0),
+(10,9,1,686,0,0),
+(10,9,0,6603,0,0),
+(11,1,0,6603,0,0),
+(11,1,72,6603,0,0),
+(11,1,73,78,0,0),
+(11,1,74,28880,0,0),
+(11,1,83,4540,128,0),
+(11,1,84,6603,0,0),
+(11,1,96,6603,0,0),
+(11,1,108,6603,0,0),
+(11,2,0,6603,0,0),
+(11,2,1,21084,0,0),
+(11,2,2,635,0,0),
+(11,2,3,28880,0,0),
+(11,2,10,159,128,0),
+(11,2,11,4540,128,0),
+(11,2,83,4540,128,0),
+(11,3,0,6603,0,0),
+(11,3,1,2973,0,0),
+(11,3,2,75,0,0),
+(11,3,3,28880,0,0),
+(11,3,10,159,128,0),
+(11,3,11,4540,128,0),
+(11,3,72,6603,0,0),
+(11,3,73,2973,0,0),
+(11,3,74,75,0,0),
+(11,3,82,159,128,0),
+(11,3,83,4540,128,0),
+(11,5,0,6603,0,0),
+(11,5,1,585,0,0),
+(11,5,2,2050,0,0),
+(11,5,3,28880,0,0),
+(11,5,10,159,128,0),
+(11,5,11,4540,128,0),
+(11,5,83,4540,128,0),
+(11,6,0,6603,0,0),
+(11,6,1,49576,0,0),
+(11,6,2,45477,0,0),
+(11,6,3,45462,0,0),
+(11,6,4,45902,0,0),
+(11,6,5,47541,0,0),
+(11,7,0,6603,0,0),
+(11,7,1,403,0,0),
+(11,7,2,331,0,0),
+(11,7,3,28880,0,0),
+(11,7,10,159,128,0),
+(11,7,11,4540,128,0),
+(11,8,0,6603,0,0),
+(11,8,1,133,0,0),
+(11,8,2,168,0,0),
+(11,8,3,28880,0,0),
+(11,8,10,159,128,0),
+(11,8,11,4540,128,0),
+(11,8,83,4540,128,0);
/*!40000 ALTER TABLE `playercreateinfo_action` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2447,6 +10005,2694 @@ CREATE TABLE `playercreateinfo_spell` (
LOCK TABLES `playercreateinfo_spell` WRITE;
/*!40000 ALTER TABLE `playercreateinfo_spell` DISABLE KEYS */;
+INSERT INTO `playercreateinfo_spell` VALUES
+(1,1,78,'Heroic Strike',1),
+(1,1,81,'Dodge',1),
+(1,1,107,'Block',1),
+(1,1,196,'One-Handed Axes',1),
+(1,1,198,'One-Handed Maces',1),
+(1,1,201,'One-Handed Swords',1),
+(1,1,203,'Unarmed',1),
+(1,1,204,'Defense',1),
+(1,1,522,'SPELLDEFENSE(DND)',1),
+(1,1,668,'Language Common',1),
+(1,1,2382,'Generic',1),
+(1,1,2457,'Battle Stance',1),
+(1,1,2479,'Honorless Target',1),
+(1,1,3050,'Detect',1),
+(1,1,3365,'Opening',1),
+(1,1,5301,'Defensive State(DND)',1),
+(1,1,6233,'Closing',1),
+(1,1,6246,'Closing',1),
+(1,1,6247,'Opening',1),
+(1,1,6477,'Opening',1),
+(1,1,6478,'Opening',1),
+(1,1,6603,'Attack',1),
+(1,1,7266,'Duel',1),
+(1,1,7267,'Grovel',1),
+(1,1,7355,'Stuck',1),
+(1,1,7376,'Defensive Stance Passive',0),
+(1,1,7381,'Berserker Stance Passive',0),
+(1,1,8386,'Attacking',1),
+(1,1,8737,'Mail',1),
+(1,1,9077,'Leather',1),
+(1,1,9078,'Cloth',1),
+(1,1,9116,'Shield',1),
+(1,1,9125,'Generic',1),
+(1,1,20597,'Sword Specialization',1),
+(1,1,20598,'The Human Spirit',1),
+(1,1,20599,'Diplomacy',1),
+(1,1,20600,'Perception',1),
+(1,1,20864,'Mace Specialization',1),
+(1,1,21156,'Battle Stance Passive',0),
+(1,1,21651,'Opening',1),
+(1,1,21652,'Closing',1),
+(1,1,22027,'Remove Insignia',1),
+(1,1,22810,'Opening - No Text',1),
+(1,1,32215,'Victorious State',1),
+(1,2,81,'Dodge',1),
+(1,2,107,'Block',1),
+(1,2,198,'One-Handed Maces',1),
+(1,2,199,'Two-Handed Maces',1),
+(1,2,203,'Unarmed',1),
+(1,2,204,'Defense',1),
+(1,2,522,'SPELLDEFENSE(DND)',1),
+(1,2,635,'Holy Light',1),
+(1,2,668,'Language Common',1),
+(1,2,2382,'Generic',1),
+(1,2,2479,'Honorless Target',1),
+(1,2,3050,'Detect',1),
+(1,2,3365,'Opening',1),
+(1,2,6233,'Closing',1),
+(1,2,6246,'Closing',1),
+(1,2,6247,'Opening',1),
+(1,2,6477,'Opening',1),
+(1,2,6478,'Opening',1),
+(1,2,6603,'Attack',1),
+(1,2,7266,'Duel',1),
+(1,2,7267,'Grovel',1),
+(1,2,7355,'Stuck',1),
+(1,2,8386,'Attacking',1),
+(1,2,8737,'Mail',1),
+(1,2,9077,'Leather',1),
+(1,2,9078,'Cloth',1),
+(1,2,9116,'Shield',1),
+(1,2,9125,'Generic',1),
+(1,2,21084,'Seal of Righteousness',1),
+(1,2,20597,'Sword Specialization',1),
+(1,2,20598,'The Human Spirit',1),
+(1,2,20599,'Diplomacy',1),
+(1,2,20600,'Perception',1),
+(1,2,20864,'Mace Specialization',1),
+(1,2,21651,'Opening',1),
+(1,2,21652,'Closing',1),
+(1,2,22027,'Remove Insignia',1),
+(1,2,22810,'Opening - No Text',1),
+(1,2,27762,'Libram',1),
+(1,4,81,'Dodge',1),
+(1,4,203,'Unarmed',1),
+(1,4,204,'Defense',1),
+(1,4,522,'SPELLDEFENSE(DND)',1),
+(1,4,668,'Language Common',1),
+(1,4,1180,'Daggers',1),
+(1,4,1752,'Sinister Strike',1),
+(1,4,2098,'Eviscerate',1),
+(1,4,2382,'Generic',1),
+(1,4,2479,'Honorless Target',1),
+(1,4,2567,'Thrown',1),
+(1,4,2764,'Throw',1),
+(1,4,3050,'Detect',1),
+(1,4,3365,'Opening',1),
+(1,4,6233,'Closing',1),
+(1,4,6246,'Closing',1),
+(1,4,6247,'Opening',1),
+(1,4,6477,'Opening',1),
+(1,4,6478,'Opening',1),
+(1,4,6603,'Attack',1),
+(1,4,7266,'Duel',1),
+(1,4,7267,'Grovel',1),
+(1,4,7355,'Stuck',1),
+(1,4,8386,'Attacking',1),
+(1,4,9077,'Leather',1),
+(1,4,9078,'Cloth',1),
+(1,4,9125,'Generic',1),
+(1,4,16092,'Defensive State(DND)',1),
+(1,4,20597,'Sword Specialization',1),
+(1,4,20598,'The Human Spirit',1),
+(1,4,20599,'Diplomacy',1),
+(1,4,20600,'Perception',1),
+(1,4,20864,'Mace Specialization',1),
+(1,4,21184,'Rogue Passive(DND)',1),
+(1,4,21651,'Opening',1),
+(1,4,21652,'Closing',1),
+(1,4,22027,'Remove Insignia',1),
+(1,4,22810,'Opening - No Text',1),
+(1,5,81,'Dodge',1),
+(1,5,198,'One-Handed Maces',1),
+(1,5,203,'Unarmed',1),
+(1,5,204,'Defense',1),
+(1,5,522,'SPELLDEFENSE(DND)',1),
+(1,5,585,'Smite',1),
+(1,5,668,'Language Common',1),
+(1,5,2050,'Lesser Heal',1),
+(1,5,2382,'Generic',1),
+(1,5,2479,'Honorless Target',1),
+(1,5,3050,'Detect',1),
+(1,5,3365,'Opening',1),
+(1,5,5009,'Wands',1),
+(1,5,5019,'Shoot',1),
+(1,5,6233,'Closing',1),
+(1,5,6246,'Closing',1),
+(1,5,6247,'Opening',1),
+(1,5,6477,'Opening',1),
+(1,5,6478,'Opening',1),
+(1,5,6603,'Attack',1),
+(1,5,7266,'Duel',1),
+(1,5,7267,'Grovel',1),
+(1,5,7355,'Stuck',1),
+(1,5,8386,'Attacking',1),
+(1,5,9078,'Cloth',1),
+(1,5,9125,'Generic',1),
+(1,5,20597,'Sword Specialization',1),
+(1,5,20598,'The Human Spirit',1),
+(1,5,20599,'Diplomacy',1),
+(1,5,20600,'Perception',1),
+(1,5,20864,'Mace Specialization',1),
+(1,5,21651,'Opening',1),
+(1,5,21652,'Closing',1),
+(1,5,22027,'Remove Insignia',1),
+(1,5,22810,'Opening - No Text',1),
+(1,6,81,'Dodge',1),
+(1,6,196,'One-Handed Axes',1),
+(1,6,197,'Two-Handed Axes',1),
+(1,6,200,'Polearms',1),
+(1,6,201,'One-Handed Swords',1),
+(1,6,202,'Two-Handed Swords',1),
+(1,6,203,'Unarmed',1),
+(1,6,204,'Defense',1),
+(1,6,522,'SPELLDEFENSE (DND)',1),
+(1,6,668,'Language Common',1),
+(1,6,674,'Dual Wield',1),
+(1,6,750,'Plate Mail',1),
+(1,6,1843,'Disarm',1),
+(1,6,2382,'Generic',1),
+(1,6,2479,'Honorless Target',1),
+(1,6,3050,'Detect',1),
+(1,6,3127,'Parry',1),
+(1,6,3275,'Linen Bandage',1),
+(1,6,3276,'Heavy Linen Bandage',1),
+(1,6,3277,'Wool Bandage',1),
+(1,6,3278,'Heavy Wool Bandage',1),
+(1,6,3365,'Opening',1),
+(1,6,6233,'Closing',1),
+(1,6,6246,'Closing',1),
+(1,6,6247,'Opening',1),
+(1,6,6477,'Opening',1),
+(1,6,6478,'Opening',1),
+(1,6,6603,'Attack',1),
+(1,6,7266,'Duel',1),
+(1,6,7267,'Grovel',1),
+(1,6,7355,'Stuck',1),
+(1,6,7928,'Silk Bandage',1),
+(1,6,7929,'Heavy Silk Bandage',1),
+(1,6,7934,'Anti-Venom',1),
+(1,6,8386,'Attacking',1),
+(1,6,8737,'Mail',1),
+(1,6,9077,'Leather',1),
+(1,6,9078,'Cloth',1),
+(1,6,9125,'Generic',1),
+(1,6,10840,'Mageweave Bandage',1),
+(1,6,10841,'Heavy Mageweave Bandage',1),
+(1,6,10846,'First Aid',1),
+(1,6,18629,'Runecloth Bandage',1),
+(1,6,18630,'Heavy Runecloth Bandage',1),
+(1,6,20597,'Sword Specialization',1),
+(1,6,20598,'The Human Spirit',1),
+(1,6,20599,'Diplomacy',1),
+(1,6,20864,'Mace Specialization',1),
+(1,6,21651,'Opening',1),
+(1,6,21652,'Closing',1),
+(1,6,22027,'Remove Insignia',1),
+(1,6,22810,'Opening - No Text',1),
+(1,6,33391,'Journeyman Riding',1),
+(1,6,45462,'Plague Strike',1),
+(1,6,45477,'Icy Touch',1),
+(1,6,45902,'Blood Strike',1),
+(1,6,45903,'Offensive State (DND)',1),
+(1,6,45927,'Summon Friend',1),
+(1,6,47541,'Death Coil',1),
+(1,6,48266,'Blood Presence',1),
+(1,6,49410,'Forceful Deflection',1),
+(1,6,49576,'Death Grip',1),
+(1,6,52665,'Sigil',1),
+(1,6,58985,'Perception',1),
+(1,6,59752,'Every Man for Himself',1),
+(1,6,59879,'Blood Plague',1),
+(1,6,59921,'Frost Fever',1),
+(1,6,61437,'Opening',1),
+(1,6,61455,'Runic Focus',1),
+(1,8,81,'Dodge',1),
+(1,8,133,'Fireball',1),
+(1,8,168,'Frost Armor',1),
+(1,8,203,'Unarmed',1),
+(1,8,204,'Defense',1),
+(1,8,227,'Staves',1),
+(1,8,522,'SPELLDEFENSE(DND)',1),
+(1,8,668,'Language Common',1),
+(1,8,2382,'Generic',1),
+(1,8,2479,'Honorless Target',1),
+(1,8,3050,'Detect',1),
+(1,8,3365,'Opening',1),
+(1,8,5009,'Wands',1),
+(1,8,5019,'Shoot',1),
+(1,8,6233,'Closing',1),
+(1,8,6246,'Closing',1),
+(1,8,6247,'Opening',1),
+(1,8,6477,'Opening',1),
+(1,8,6478,'Opening',1),
+(1,8,6603,'Attack',1),
+(1,8,7266,'Duel',1),
+(1,8,7267,'Grovel',1),
+(1,8,7355,'Stuck',1),
+(1,8,8386,'Attacking',1),
+(1,8,9078,'Cloth',1),
+(1,8,9125,'Generic',1),
+(1,8,20597,'Sword Specialization',1),
+(1,8,20598,'The Human Spirit',1),
+(1,8,20599,'Diplomacy',1),
+(1,8,20600,'Perception',1),
+(1,8,20864,'Mace Specialization',1),
+(1,8,21651,'Opening',1),
+(1,8,21652,'Closing',1),
+(1,8,22027,'Remove Insignia',1),
+(1,8,22810,'Opening - No Text',1),
+(1,9,81,'Dodge',1),
+(1,9,203,'Unarmed',1),
+(1,9,204,'Defense',1),
+(1,9,522,'SPELLDEFENSE(DND)',1),
+(1,9,668,'Language Common',1),
+(1,9,686,'Shadow Bolt',1),
+(1,9,687,'Demon Skin',1),
+(1,9,1180,'Daggers',1),
+(1,9,2382,'Generic',1),
+(1,9,2479,'Honorless Target',1),
+(1,9,3050,'Detect',1),
+(1,9,3365,'Opening',1),
+(1,9,5009,'Wands',1),
+(1,9,5019,'Shoot',1),
+(1,9,6233,'Closing',1),
+(1,9,6246,'Closing',1),
+(1,9,6247,'Opening',1),
+(1,9,6477,'Opening',1),
+(1,9,6478,'Opening',1),
+(1,9,6603,'Attack',1),
+(1,9,7266,'Duel',1),
+(1,9,7267,'Grovel',1),
+(1,9,7355,'Stuck',1),
+(1,9,8386,'Attacking',1),
+(1,9,9078,'Cloth',1),
+(1,9,9125,'Generic',1),
+(1,9,20597,'Sword Specialization',1),
+(1,9,20598,'The Human Spirit',1),
+(1,9,20599,'Diplomacy',1),
+(1,9,20600,'Perception',1),
+(1,9,20864,'Mace Specialization',1),
+(1,9,21651,'Opening',1),
+(1,9,21652,'Closing',1),
+(1,9,22027,'Remove Insignia',1),
+(1,9,22810,'Opening - No Text',1),
+(2,1,78,'Heroic Strike',1),
+(2,1,81,'Dodge',1),
+(2,1,107,'Block',1),
+(2,1,196,'One-Handed Axes',1),
+(2,1,197,'Two-Handed Axes',1),
+(2,1,201,'One-Handed Swords',1),
+(2,1,203,'Unarmed',1),
+(2,1,204,'Defense',1),
+(2,1,522,'SPELLDEFENSE(DND)',1),
+(2,1,669,'Language Orcish',1),
+(2,1,2382,'Generic',1),
+(2,1,2457,'Battle Stance',1),
+(2,1,2479,'Honorless Target',1),
+(2,1,3050,'Detect',1),
+(2,1,3365,'Opening',1),
+(2,1,5301,'Defensive State(DND)',1),
+(2,1,6233,'Closing',1),
+(2,1,6246,'Closing',1),
+(2,1,6247,'Opening',1),
+(2,1,6477,'Opening',1),
+(2,1,6478,'Opening',1),
+(2,1,6603,'Attack',1),
+(2,1,7266,'Duel',1),
+(2,1,7267,'Grovel',1),
+(2,1,7355,'Stuck',1),
+(2,1,7376,'Defensive Stance Passive',0),
+(2,1,7381,'Berserker Stance Passive',0),
+(2,1,8386,'Attacking',1),
+(2,1,8737,'Mail',1),
+(2,1,9077,'Leather',1),
+(2,1,9078,'Cloth',1),
+(2,1,9116,'Shield',1),
+(2,1,9125,'Generic',1),
+(2,1,20572,'Blood Fury',1),
+(2,1,20573,'Hardiness',1),
+(2,1,20574,'Axe Specialization',1),
+(2,1,21156,'Battle Stance Passive',0),
+(2,1,21563,'Command',1),
+(2,1,21651,'Opening',1),
+(2,1,21652,'Closing',1),
+(2,1,22027,'Remove Insignia',1),
+(2,1,22810,'Opening - No Text',1),
+(2,1,32215,'Victorious State',1),
+(2,3,75,'Auto Shot',1),
+(2,3,81,'Dodge',1),
+(2,3,196,'One-Handed Axes',1),
+(2,3,203,'Unarmed',1),
+(2,3,204,'Defense',1),
+(2,3,264,'Bows',1),
+(2,3,522,'SPELLDEFENSE(DND)',1),
+(2,3,669,'Language Orcish',1),
+(2,3,2382,'Generic',1),
+(2,3,2479,'Honorless Target',1),
+(2,3,2973,'Raptor Strike',1),
+(2,3,3050,'Detect',1),
+(2,3,3365,'Opening',1),
+(2,3,6233,'Closing',1),
+(2,3,6246,'Closing',1),
+(2,3,6247,'Opening',1),
+(2,3,6477,'Opening',1),
+(2,3,6478,'Opening',1),
+(2,3,6603,'Attack',1),
+(2,3,7266,'Duel',1),
+(2,3,7267,'Grovel',1),
+(2,3,7355,'Stuck',1),
+(2,3,8386,'Attacking',1),
+(2,3,9077,'Leather',1),
+(2,3,9078,'Cloth',1),
+(2,3,9125,'Generic',1),
+(2,3,13358,'Defensive State(DND)',1),
+(2,3,20572,'Blood Fury',1),
+(2,3,20573,'Hardiness',1),
+(2,3,20574,'Axe Specialization',1),
+(2,3,20576,'Command',1),
+(2,3,21651,'Opening',1),
+(2,3,21652,'Closing',1),
+(2,3,22027,'Remove Insignia',1),
+(2,3,22810,'Opening - No Text',1),
+(2,3,24949,'Defensive State 2(DND)',1),
+(2,3,34082,'Advantaged State(DND)',1),
+(2,4,81,'Dodge',1),
+(2,4,203,'Unarmed',1),
+(2,4,204,'Defense',1),
+(2,4,522,'SPELLDEFENSE(DND)',1),
+(2,4,669,'Language Orcish',1),
+(2,4,1180,'Daggers',1),
+(2,4,1752,'Sinister Strike',1),
+(2,4,2098,'Eviscerate',1),
+(2,4,2382,'Generic',1),
+(2,4,2479,'Honorless Target',1),
+(2,4,2567,'Thrown',1),
+(2,4,2764,'Throw',1),
+(2,4,3050,'Detect',1),
+(2,4,3365,'Opening',1),
+(2,4,6233,'Closing',1),
+(2,4,6246,'Closing',1),
+(2,4,6247,'Opening',1),
+(2,4,6477,'Opening',1),
+(2,4,6478,'Opening',1),
+(2,4,6603,'Attack',1),
+(2,4,7266,'Duel',1),
+(2,4,7267,'Grovel',1),
+(2,4,7355,'Stuck',1),
+(2,4,8386,'Attacking',1),
+(2,4,9077,'Leather',1),
+(2,4,9078,'Cloth',1),
+(2,4,9125,'Generic',1),
+(2,4,16092,'Defensive State(DND)',1),
+(2,4,20572,'Blood Fury',1),
+(2,4,20573,'Hardiness',1),
+(2,4,20574,'Axe Specialization',1),
+(2,4,21184,'Rogue Passive(DND)',1),
+(2,4,21563,'Command',1),
+(2,4,21651,'Opening',1),
+(2,4,21652,'Closing',1),
+(2,4,22027,'Remove Insignia',1),
+(2,4,22810,'Opening - No Text',1),
+(2,6,81,'Dodge',1),
+(2,6,196,'One-Handed Axes',1),
+(2,6,197,'Two-Handed Axes',1),
+(2,6,200,'Polearms',1),
+(2,6,201,'One-Handed Swords',1),
+(2,6,202,'Two-Handed Swords',1),
+(2,6,203,'Unarmed',1),
+(2,6,204,'Defense',1),
+(2,6,522,'SPELLDEFENSE (DND)',1),
+(2,6,669,'Language Orcish',1),
+(2,6,674,'Dual Wield',1),
+(2,6,750,'Plate Mail',1),
+(2,6,1843,'Disarm',1),
+(2,6,2382,'Generic',1),
+(2,6,2479,'Honorless Target',1),
+(2,6,3050,'Detect',1),
+(2,6,3127,'Parry',1),
+(2,6,3275,'Linen Bandage',1),
+(2,6,3276,'Heavy Linen Bandage',1),
+(2,6,3277,'Wool Bandage',1),
+(2,6,3278,'Heavy Wool Bandage',1),
+(2,6,3365,'Opening',1),
+(2,6,6233,'Closing',1),
+(2,6,6246,'Closing',1),
+(2,6,6247,'Opening',1),
+(2,6,6477,'Opening',1),
+(2,6,6478,'Opening',1),
+(2,6,6603,'Attack',1),
+(2,6,7266,'Duel',1),
+(2,6,7267,'Grovel',1),
+(2,6,7355,'Stuck',1),
+(2,6,7928,'Silk Bandage',1),
+(2,6,7929,'Heavy Silk Bandage',1),
+(2,6,7934,'Anti-Venom',1),
+(2,6,8386,'Attacking',1),
+(2,6,8737,'Mail',1),
+(2,6,9077,'Leather',1),
+(2,6,9078,'Cloth',1),
+(2,6,9125,'Generic',1),
+(2,6,10840,'Mageweave Bandage',1),
+(2,6,10841,'Heavy Mageweave Bandage',1),
+(2,6,10846,'First Aid',1),
+(2,6,18629,'Runecloth Bandage',1),
+(2,6,18630,'Heavy Runecloth Bandage',1),
+(2,6,20572,'Blood Fury',1),
+(2,6,20573,'Hardiness',1),
+(2,6,20574,'Axe Specialization',1),
+(2,6,21651,'Opening',1),
+(2,6,21652,'Closing',1),
+(2,6,22027,'Remove Insignia',1),
+(2,6,22810,'Opening - No Text',1),
+(2,6,33391,'Journeyman Riding',1),
+(2,6,45462,'Plague Strike',1),
+(2,6,45477,'Icy Touch',1),
+(2,6,45902,'Blood Strike',1),
+(2,6,45903,'Offensive State (DND)',1),
+(2,6,45927,'Summon Friend',1),
+(2,6,47541,'Death Coil',1),
+(2,6,48266,'Blood Presence',1),
+(2,6,49410,'Forceful Deflection',1),
+(2,6,49576,'Death Grip',1),
+(2,6,52665,'Sigil',1),
+(2,6,54562,'Command',1),
+(2,6,59879,'Blood Plague',1),
+(2,6,59921,'Frost Fever',1),
+(2,6,61437,'Opening',1),
+(2,6,61455,'Runic Focus',1),
+(2,7,81,'Dodge',1),
+(2,7,107,'Block',1),
+(2,7,198,'One-Handed Maces',1),
+(2,7,203,'Unarmed',1),
+(2,7,204,'Defense',1),
+(2,7,227,'Staves',1),
+(2,7,331,'Healing Wave',1),
+(2,7,403,'Lightning Bolt',1),
+(2,7,522,'SPELLDEFENSE(DND)',1),
+(2,7,669,'Language Orcish',1),
+(2,7,2382,'Generic',1),
+(2,7,2479,'Honorless Target',1),
+(2,7,3050,'Detect',1),
+(2,7,3365,'Opening',1),
+(2,7,6233,'Closing',1),
+(2,7,6246,'Closing',1),
+(2,7,6247,'Opening',1),
+(2,7,6477,'Opening',1),
+(2,7,6478,'Opening',1),
+(2,7,6603,'Attack',1),
+(2,7,7266,'Duel',1),
+(2,7,7267,'Grovel',1),
+(2,7,7355,'Stuck',1),
+(2,7,8386,'Attacking',1),
+(2,7,9077,'Leather',1),
+(2,7,9078,'Cloth',1),
+(2,7,9116,'Shield',1),
+(2,7,9125,'Generic',1),
+(2,7,20573,'Hardiness',1),
+(2,7,20574,'Axe Specialization',1),
+(2,7,21563,'Command',1),
+(2,7,21651,'Opening',1),
+(2,7,21652,'Closing',1),
+(2,7,22027,'Remove Insignia',1),
+(2,7,22810,'Opening - No Text',1),
+(2,7,27763,'Totem',1),
+(2,7,33697,'Blood Fury',1),
+(2,9,81,'Dodge',1),
+(2,9,203,'Unarmed',1),
+(2,9,204,'Defense',1),
+(2,9,522,'SPELLDEFENSE(DND)',1),
+(2,9,669,'Language Orcish',1),
+(2,9,686,'Shadow Bolt',1),
+(2,9,687,'Demon Skin',1),
+(2,9,1180,'Daggers',1),
+(2,9,2382,'Generic',1),
+(2,9,2479,'Honorless Target',1),
+(2,9,3050,'Detect',1),
+(2,9,3365,'Opening',1),
+(2,9,5009,'Wands',1),
+(2,9,5019,'Shoot',1),
+(2,9,6233,'Closing',1),
+(2,9,6246,'Closing',1),
+(2,9,6247,'Opening',1),
+(2,9,6477,'Opening',1),
+(2,9,6478,'Opening',1),
+(2,9,6603,'Attack',1),
+(2,9,7266,'Duel',1),
+(2,9,7267,'Grovel',1),
+(2,9,7355,'Stuck',1),
+(2,9,8386,'Attacking',1),
+(2,9,9078,'Cloth',1),
+(2,9,9125,'Generic',1),
+(2,9,20573,'Hardiness',1),
+(2,9,20574,'Axe Specialization',1),
+(2,9,20575,'Command',1),
+(2,9,21651,'Opening',1),
+(2,9,21652,'Closing',1),
+(2,9,22027,'Remove Insignia',1),
+(2,9,22810,'Opening - No Text',1),
+(2,9,33702,'Blood Fury',1),
+(3,1,78,'Heroic Strike',1),
+(3,1,81,'Dodge',1),
+(3,1,107,'Block',1),
+(3,1,196,'One-Handed Axes',1),
+(3,1,197,'Two-Handed Axes',1),
+(3,1,198,'One-Handed Maces',1),
+(3,1,203,'Unarmed',1),
+(3,1,204,'Defense',1),
+(3,1,522,'SPELLDEFENSE(DND)',1),
+(3,1,668,'Language Common',1),
+(3,1,672,'Language Dwarven',1),
+(3,1,2382,'Generic',1),
+(3,1,2457,'Battle Stance',1),
+(3,1,2479,'Honorless Target',1),
+(3,1,2481,'Find Treasure',1),
+(3,1,3050,'Detect',1),
+(3,1,3365,'Opening',1),
+(3,1,5301,'Defensive State(DND)',1),
+(3,1,6233,'Closing',1),
+(3,1,6246,'Closing',1),
+(3,1,6247,'Opening',1),
+(3,1,6477,'Opening',1),
+(3,1,6478,'Opening',1),
+(3,1,6603,'Attack',1),
+(3,1,7266,'Duel',1),
+(3,1,7267,'Grovel',1),
+(3,1,7355,'Stuck',1),
+(3,1,7376,'Defensive Stance Passive',0),
+(3,1,7381,'Berserker Stance Passive',0),
+(3,1,8386,'Attacking',1),
+(3,1,8737,'Mail',1),
+(3,1,9077,'Leather',1),
+(3,1,9078,'Cloth',1),
+(3,1,9116,'Shield',1),
+(3,1,9125,'Generic',1),
+(3,1,20594,'Stoneform',1),
+(3,1,20595,'Gun Specialization',1),
+(3,1,20596,'Frost Resistance',1),
+(3,1,21156,'Battle Stance Passive',0),
+(3,1,21651,'Opening',1),
+(3,1,21652,'Closing',1),
+(3,1,22027,'Remove Insignia',1),
+(3,1,22810,'Opening - No Text',1),
+(3,1,32215,'Victorious State',1),
+(3,2,81,'Dodge',1),
+(3,2,107,'Block',1),
+(3,2,198,'One-Handed Maces',1),
+(3,2,199,'Two-Handed Maces',1),
+(3,2,203,'Unarmed',1),
+(3,2,204,'Defense',1),
+(3,2,522,'SPELLDEFENSE(DND)',1),
+(3,2,635,'Holy Light',1),
+(3,2,668,'Language Common',1),
+(3,2,672,'Language Dwarven',1),
+(3,2,2382,'Generic',1),
+(3,2,2479,'Honorless Target',1),
+(3,2,2481,'Find Treasure',1),
+(3,2,3050,'Detect',1),
+(3,2,3365,'Opening',1),
+(3,2,6233,'Closing',1),
+(3,2,6246,'Closing',1),
+(3,2,6247,'Opening',1),
+(3,2,6477,'Opening',1),
+(3,2,6478,'Opening',1),
+(3,2,6603,'Attack',1),
+(3,2,7266,'Duel',1),
+(3,2,7267,'Grovel',1),
+(3,2,7355,'Stuck',1),
+(3,2,8386,'Attacking',1),
+(3,2,8737,'Mail',1),
+(3,2,9077,'Leather',1),
+(3,2,9078,'Cloth',1),
+(3,2,9116,'Shield',1),
+(3,2,9125,'Generic',1),
+(3,2,21084,'Seal of Righteousness',1),
+(3,2,20594,'Stoneform',1),
+(3,2,20595,'Gun Specialization',1),
+(3,2,20596,'Frost Resistance',1),
+(3,2,21651,'Opening',1),
+(3,2,21652,'Closing',1),
+(3,2,22027,'Remove Insignia',1),
+(3,2,22810,'Opening - No Text',1),
+(3,2,27762,'Libram',1),
+(3,3,75,'Auto Shot',1),
+(3,3,81,'Dodge',1),
+(3,3,196,'One-Handed Axes',1),
+(3,3,203,'Unarmed',1),
+(3,3,204,'Defense',1),
+(3,3,266,'Guns',1),
+(3,3,522,'SPELLDEFENSE(DND)',1),
+(3,3,668,'Language Common',1),
+(3,3,672,'Language Dwarven',1),
+(3,3,2382,'Generic',1),
+(3,3,2479,'Honorless Target',1),
+(3,3,2481,'Find Treasure',1),
+(3,3,2973,'Raptor Strike',1),
+(3,3,3050,'Detect',1),
+(3,3,3365,'Opening',1),
+(3,3,6233,'Closing',1),
+(3,3,6246,'Closing',1),
+(3,3,6247,'Opening',1),
+(3,3,6477,'Opening',1),
+(3,3,6478,'Opening',1),
+(3,3,6603,'Attack',1),
+(3,3,7266,'Duel',1),
+(3,3,7267,'Grovel',1),
+(3,3,7355,'Stuck',1),
+(3,3,8386,'Attacking',1),
+(3,3,9077,'Leather',1),
+(3,3,9078,'Cloth',1),
+(3,3,9125,'Generic',1),
+(3,3,13358,'Defensive State(DND)',1),
+(3,3,20594,'Stoneform',1),
+(3,3,20595,'Gun Specialization',1),
+(3,3,20596,'Frost Resistance',1),
+(3,3,21651,'Opening',1),
+(3,3,21652,'Closing',1),
+(3,3,22027,'Remove Insignia',1),
+(3,3,22810,'Opening - No Text',1),
+(3,3,24949,'Defensive State 2(DND)',1),
+(3,3,34082,'Advantaged State(DND)',1),
+(3,4,81,'Dodge',1),
+(3,4,203,'Unarmed',1),
+(3,4,204,'Defense',1),
+(3,4,522,'SPELLDEFENSE(DND)',1),
+(3,4,668,'Language Common',1),
+(3,4,672,'Language Dwarven',1),
+(3,4,1180,'Daggers',1),
+(3,4,1752,'Sinister Strike',1),
+(3,4,2098,'Eviscerate',1),
+(3,4,2382,'Generic',1),
+(3,4,2479,'Honorless Target',1),
+(3,4,2481,'Find Treasure',1),
+(3,4,2567,'Thrown',1),
+(3,4,2764,'Throw',1),
+(3,4,3050,'Detect',1),
+(3,4,3365,'Opening',1),
+(3,4,6233,'Closing',1),
+(3,4,6246,'Closing',1),
+(3,4,6247,'Opening',1),
+(3,4,6477,'Opening',1),
+(3,4,6478,'Opening',1),
+(3,4,6603,'Attack',1),
+(3,4,7266,'Duel',1),
+(3,4,7267,'Grovel',1),
+(3,4,7355,'Stuck',1),
+(3,4,8386,'Attacking',1),
+(3,4,9077,'Leather',1),
+(3,4,9078,'Cloth',1),
+(3,4,9125,'Generic',1),
+(3,4,16092,'Defensive State(DND)',1),
+(3,4,20594,'Stoneform',1),
+(3,4,20595,'Gun Specialization',1),
+(3,4,20596,'Frost Resistance',1),
+(3,4,21184,'Rogue Passive(DND)',1),
+(3,4,21651,'Opening',1),
+(3,4,21652,'Closing',1),
+(3,4,22027,'Remove Insignia',1),
+(3,4,22810,'Opening - No Text',1),
+(3,5,81,'Dodge',1),
+(3,5,198,'One-Handed Maces',1),
+(3,5,203,'Unarmed',1),
+(3,5,204,'Defense',1),
+(3,5,522,'SPELLDEFENSE(DND)',1),
+(3,5,585,'Smite',1),
+(3,5,668,'Language Common',1),
+(3,5,672,'Language Dwarven',1),
+(3,5,2050,'Lesser Heal',1),
+(3,5,2382,'Generic',1),
+(3,5,2479,'Honorless Target',1),
+(3,5,2481,'Find Treasure',1),
+(3,5,3050,'Detect',1),
+(3,5,3365,'Opening',1),
+(3,5,5009,'Wands',1),
+(3,5,5019,'Shoot',1),
+(3,5,6233,'Closing',1),
+(3,5,6246,'Closing',1),
+(3,5,6247,'Opening',1),
+(3,5,6477,'Opening',1),
+(3,5,6478,'Opening',1),
+(3,5,6603,'Attack',1),
+(3,5,7266,'Duel',1),
+(3,5,7267,'Grovel',1),
+(3,5,7355,'Stuck',1),
+(3,5,8386,'Attacking',1),
+(3,5,9078,'Cloth',1),
+(3,5,9125,'Generic',1),
+(3,5,20594,'Stoneform',1),
+(3,5,20595,'Gun Specialization',1),
+(3,5,20596,'Frost Resistance',1),
+(3,5,21651,'Opening',1),
+(3,5,21652,'Closing',1),
+(3,5,22027,'Remove Insignia',1),
+(3,5,22810,'Opening - No Text',1),
+(3,6,81,'Dodge',1),
+(3,6,196,'One-Handed Axes',1),
+(3,6,197,'Two-Handed Axes',1),
+(3,6,200,'Polearms',1),
+(3,6,201,'One-Handed Swords',1),
+(3,6,202,'Two-Handed Swords',1),
+(3,6,203,'Unarmed',1),
+(3,6,204,'Defense',1),
+(3,6,522,'SPELLDEFENSE (DND)',1),
+(3,6,668,'Language Common',1),
+(3,6,672,'Language Dwarven',1),
+(3,6,674,'Dual Wield',1),
+(3,6,750,'Plate Mail',1),
+(3,6,1843,'Disarm',1),
+(3,6,2382,'Generic',1),
+(3,6,2479,'Honorless Target',1),
+(3,6,2481,'Find Treasure',1),
+(3,6,3050,'Detect',1),
+(3,6,3127,'Parry',1),
+(3,6,3275,'Linen Bandage',1),
+(3,6,3276,'Heavy Linen Bandage',1),
+(3,6,3277,'Wool Bandage',1),
+(3,6,3278,'Heavy Wool Bandage',1),
+(3,6,3365,'Opening',1),
+(3,6,6233,'Closing',1),
+(3,6,6246,'Closing',1),
+(3,6,6247,'Opening',1),
+(3,6,6477,'Opening',1),
+(3,6,6478,'Opening',1),
+(3,6,6603,'Attack',1),
+(3,6,7266,'Duel',1),
+(3,6,7267,'Grovel',1),
+(3,6,7355,'Stuck',1),
+(3,6,7928,'Silk Bandage',1),
+(3,6,7929,'Heavy Silk Bandage',1),
+(3,6,7934,'Anti-Venom',1),
+(3,6,8386,'Attacking',1),
+(3,6,8737,'Mail',1),
+(3,6,9077,'Leather',1),
+(3,6,9078,'Cloth',1),
+(3,6,9125,'Generic',1),
+(3,6,10840,'Mageweave Bandage',1),
+(3,6,10841,'Heavy Mageweave Bandage',1),
+(3,6,10846,'First Aid',1),
+(3,6,18629,'Runecloth Bandage',1),
+(3,6,18630,'Heavy Runecloth Bandage',1),
+(3,6,20594,'Stoneform',1),
+(3,6,20595,'Gun Specialization',1),
+(3,6,20596,'Frost Resistance',1),
+(3,6,21651,'Opening',1),
+(3,6,21652,'Closing',1),
+(3,6,22027,'Remove Insignia',1),
+(3,6,22810,'Opening - No Text',1),
+(3,6,33391,'Journeyman Riding',1),
+(3,6,45462,'Plague Strike',1),
+(3,6,45477,'Icy Touch',1),
+(3,6,45902,'Blood Strike',1),
+(3,6,45903,'Offensive State (DND)',1),
+(3,6,45927,'Summon Friend',1),
+(3,6,47541,'Death Coil',1),
+(3,6,48266,'Blood Presence',1),
+(3,6,49410,'Forceful Deflection',1),
+(3,6,49576,'Death Grip',1),
+(3,6,52665,'Sigil',1),
+(3,6,59224,'Mace Specialization',1),
+(3,6,59879,'Blood Plague',1),
+(3,6,59921,'Frost Fever',1),
+(3,6,61437,'Opening',1),
+(3,6,61455,'Runic Focus',1),
+(4,1,78,'Heroic Strike',1),
+(4,1,81,'Dodge',1),
+(4,1,107,'Block',1),
+(4,1,198,'One-Handed Maces',1),
+(4,1,201,'One-Handed Swords',1),
+(4,1,203,'Unarmed',1),
+(4,1,204,'Defense',1),
+(4,1,522,'SPELLDEFENSE(DND)',1),
+(4,1,668,'Language Common',1),
+(4,1,671,'Language Darnassian',1),
+(4,1,1180,'Daggers',1),
+(4,1,2382,'Generic',1),
+(4,1,2457,'Battle Stance',1),
+(4,1,2479,'Honorless Target',1),
+(4,1,3050,'Detect',1),
+(4,1,3365,'Opening',1),
+(4,1,5301,'Defensive State(DND)',1),
+(4,1,6233,'Closing',1),
+(4,1,6246,'Closing',1),
+(4,1,6247,'Opening',1),
+(4,1,6477,'Opening',1),
+(4,1,6478,'Opening',1),
+(4,1,6603,'Attack',1),
+(4,1,7266,'Duel',1),
+(4,1,7267,'Grovel',1),
+(4,1,7355,'Stuck',1),
+(4,1,7376,'Defensive Stance Passive',0),
+(4,1,7381,'Berserker Stance Passive',0),
+(4,1,8386,'Attacking',1),
+(4,1,8737,'Mail',1),
+(4,1,9077,'Leather',1),
+(4,1,9078,'Cloth',1),
+(4,1,9116,'Shield',1),
+(4,1,9125,'Generic',1),
+(4,1,20580,'Shadowmeld',1),
+(4,1,20582,'Quickness',1),
+(4,1,20583,'Nature Resistance',1),
+(4,1,20585,'Wisp Spirit',1),
+(4,1,21009,'Shadowmeld Passive',1),
+(4,1,21156,'Battle Stance Passive',0),
+(4,1,21651,'Opening',1),
+(4,1,21652,'Closing',1),
+(4,1,22027,'Remove Insignia',1),
+(4,1,22810,'Opening - No Text',1),
+(4,1,32215,'Victorious State',1),
+(4,3,75,'Auto Shot',1),
+(4,3,81,'Dodge',1),
+(4,3,203,'Unarmed',1),
+(4,3,204,'Defense',1),
+(4,3,264,'Bows',1),
+(4,3,522,'SPELLDEFENSE(DND)',1),
+(4,3,668,'Language Common',1),
+(4,3,671,'Language Darnassian',1),
+(4,3,1180,'Daggers',1),
+(4,3,2382,'Generic',1),
+(4,3,2479,'Honorless Target',1),
+(4,3,2973,'Raptor Strike',1),
+(4,3,3050,'Detect',1),
+(4,3,3365,'Opening',1),
+(4,3,6233,'Closing',1),
+(4,3,6246,'Closing',1),
+(4,3,6247,'Opening',1),
+(4,3,6477,'Opening',1),
+(4,3,6478,'Opening',1),
+(4,3,6603,'Attack',1),
+(4,3,7266,'Duel',1),
+(4,3,7267,'Grovel',1),
+(4,3,7355,'Stuck',1),
+(4,3,8386,'Attacking',1),
+(4,3,9077,'Leather',1),
+(4,3,9078,'Cloth',1),
+(4,3,9125,'Generic',1),
+(4,3,13358,'Defensive State(DND)',1),
+(4,3,20580,'Shadowmeld',1),
+(4,3,20582,'Quickness',1),
+(4,3,20583,'Nature Resistance',1),
+(4,3,20585,'Wisp Spirit',1),
+(4,3,21009,'Shadowmeld Passive',1),
+(4,3,21651,'Opening',1),
+(4,3,21652,'Closing',1),
+(4,3,22027,'Remove Insignia',1),
+(4,3,22810,'Opening - No Text',1),
+(4,3,24949,'Defensive State 2(DND)',1),
+(4,3,34082,'Advantaged State(DND)',1),
+(4,4,81,'Dodge',1),
+(4,4,203,'Unarmed',1),
+(4,4,204,'Defense',1),
+(4,4,522,'SPELLDEFENSE(DND)',1),
+(4,4,668,'Language Common',1),
+(4,4,671,'Language Darnassian',1),
+(4,4,1180,'Daggers',1),
+(4,4,1752,'Sinister Strike',1),
+(4,4,2098,'Eviscerate',1),
+(4,4,2382,'Generic',1),
+(4,4,2479,'Honorless Target',1),
+(4,4,2567,'Thrown',1),
+(4,4,2764,'Throw',1),
+(4,4,3050,'Detect',1),
+(4,4,3365,'Opening',1),
+(4,4,6233,'Closing',1),
+(4,4,6246,'Closing',1),
+(4,4,6247,'Opening',1),
+(4,4,6477,'Opening',1),
+(4,4,6478,'Opening',1),
+(4,4,6603,'Attack',1),
+(4,4,7266,'Duel',1),
+(4,4,7267,'Grovel',1),
+(4,4,7355,'Stuck',1),
+(4,4,8386,'Attacking',1),
+(4,4,9077,'Leather',1),
+(4,4,9078,'Cloth',1),
+(4,4,9125,'Generic',1),
+(4,4,16092,'Defensive State(DND)',1),
+(4,4,20580,'Shadowmeld',1),
+(4,4,20582,'Quickness',1),
+(4,4,20583,'Nature Resistance',1),
+(4,4,20585,'Wisp Spirit',1),
+(4,4,21009,'Shadowmeld Passive',1),
+(4,4,21184,'Rogue Passive(DND)',1),
+(4,4,21651,'Opening',1),
+(4,4,21652,'Closing',1),
+(4,4,22027,'Remove Insignia',1),
+(4,4,22810,'Opening - No Text',1),
+(4,5,81,'Dodge',1),
+(4,5,198,'One-Handed Maces',1),
+(4,5,203,'Unarmed',1),
+(4,5,204,'Defense',1),
+(4,5,522,'SPELLDEFENSE(DND)',1),
+(4,5,585,'Smite',1),
+(4,5,668,'Language Common',1),
+(4,5,671,'Language Darnassian',1),
+(4,5,2050,'Lesser Heal',1),
+(4,5,2382,'Generic',1),
+(4,5,2479,'Honorless Target',1),
+(4,5,3050,'Detect',1),
+(4,5,3365,'Opening',1),
+(4,5,5009,'Wands',1),
+(4,5,5019,'Shoot',1),
+(4,5,6233,'Closing',1),
+(4,5,6246,'Closing',1),
+(4,5,6247,'Opening',1),
+(4,5,6477,'Opening',1),
+(4,5,6478,'Opening',1),
+(4,5,6603,'Attack',1),
+(4,5,7266,'Duel',1),
+(4,5,7267,'Grovel',1),
+(4,5,7355,'Stuck',1),
+(4,5,8386,'Attacking',1),
+(4,5,9078,'Cloth',1),
+(4,5,9125,'Generic',1),
+(4,5,20580,'Shadowmeld',1),
+(4,5,20582,'Quickness',1),
+(4,5,20583,'Nature Resistance',1),
+(4,5,20585,'Wisp Spirit',1),
+(4,5,21009,'Shadowmeld Passive',1),
+(4,5,21651,'Opening',1),
+(4,5,21652,'Closing',1),
+(4,5,22027,'Remove Insignia',1),
+(4,5,22810,'Opening - No Text',1),
+(4,6,81,'Dodge',1),
+(4,6,196,'One-Handed Axes',1),
+(4,6,197,'Two-Handed Axes',1),
+(4,6,200,'Polearms',1),
+(4,6,201,'One-Handed Swords',1),
+(4,6,202,'Two-Handed Swords',1),
+(4,6,203,'Unarmed',1),
+(4,6,204,'Defense',1),
+(4,6,522,'SPELLDEFENSE (DND)',1),
+(4,6,668,'Language Common',1),
+(4,6,671,'Language Darnassian',1),
+(4,6,674,'Dual Wield',1),
+(4,6,750,'Plate Mail',1),
+(4,6,1843,'Disarm',1),
+(4,6,2382,'Generic',1),
+(4,6,2479,'Honorless Target',1),
+(4,6,3050,'Detect',1),
+(4,6,3127,'Parry',1),
+(4,6,3275,'Linen Bandage',1),
+(4,6,3276,'Heavy Linen Bandage',1),
+(4,6,3277,'Wool Bandage',1),
+(4,6,3278,'Heavy Wool Bandage',1),
+(4,6,3365,'Opening',1),
+(4,6,6233,'Closing',1),
+(4,6,6246,'Closing',1),
+(4,6,6247,'Opening',1),
+(4,6,6477,'Opening',1),
+(4,6,6478,'Opening',1),
+(4,6,6603,'Attack',1),
+(4,6,7266,'Duel',1),
+(4,6,7267,'Grovel',1),
+(4,6,7355,'Stuck',1),
+(4,6,7928,'Silk Bandage',1),
+(4,6,7929,'Heavy Silk Bandage',1),
+(4,6,7934,'Anti-Venom',1),
+(4,6,8386,'Attacking',1),
+(4,6,8737,'Mail',1),
+(4,6,9077,'Leather',1),
+(4,6,9078,'Cloth',1),
+(4,6,9125,'Generic',1),
+(4,6,10840,'Mageweave Bandage',1),
+(4,6,10841,'Heavy Mageweave Bandage',1),
+(4,6,10846,'First Aid',1),
+(4,6,18629,'Runecloth Bandage',1),
+(4,6,18630,'Heavy Runecloth Bandage',1),
+(4,6,20582,'Quickness',1),
+(4,6,20583,'Nature Resistance',1),
+(4,6,20585,'Wisp Spirit',1),
+(4,6,21651,'Opening',1),
+(4,6,21652,'Closing',1),
+(4,6,22027,'Remove Insignia',1),
+(4,6,22810,'Opening - No Text',1),
+(4,6,33391,'Journeyman Riding',1),
+(4,6,45462,'Plague Strike',1),
+(4,6,45477,'Icy Touch',1),
+(4,6,45902,'Blood Strike',1),
+(4,6,45903,'Offensive State (DND)',1),
+(4,6,45927,'Summon Friend',1),
+(4,6,47541,'Death Coil',1),
+(4,6,48266,'Blood Presence',1),
+(4,6,49410,'Forceful Deflection',1),
+(4,6,49576,'Death Grip',1),
+(4,6,52665,'Sigil',1),
+(4,6,58984,'Shadowmeld',1),
+(4,6,59879,'Blood Plague',1),
+(4,6,59921,'Frost Fever',1),
+(4,6,61437,'Opening',1),
+(4,6,61455,'Runic Focus',1),
+(4,11,81,'Dodge',1),
+(4,11,203,'Unarmed',1),
+(4,11,204,'Defense',1),
+(4,11,227,'Staves',1),
+(4,11,522,'SPELLDEFENSE(DND)',1),
+(4,11,668,'Language Common',1),
+(4,11,671,'Language Darnassian',1),
+(4,11,1178,'Bear Form(Passive)',0),
+(4,11,1180,'Daggers',1),
+(4,11,2382,'Generic',1),
+(4,11,2479,'Honorless Target',1),
+(4,11,3025,'Cat Form(Passive)',0),
+(4,11,3050,'Detect',1),
+(4,11,3365,'Opening',1),
+(4,11,5176,'Wrath',1),
+(4,11,5185,'Healing Touch',1),
+(4,11,5419,'Travel Form(Passive)',0),
+(4,11,5420,'Tree of Life',0),
+(4,11,5421,'Aquatic Form(Passive)',0),
+(4,11,6233,'Closing',1),
+(4,11,6246,'Closing',1),
+(4,11,6247,'Opening',1),
+(4,11,6477,'Opening',1),
+(4,11,6478,'Opening',1),
+(4,11,6603,'Attack',1),
+(4,11,7266,'Duel',1),
+(4,11,7267,'Grovel',1),
+(4,11,7355,'Stuck',1),
+(4,11,8386,'Attacking',1),
+(4,11,9077,'Leather',1),
+(4,11,9078,'Cloth',1),
+(4,11,9125,'Generic',1),
+(4,11,9635,'Dire Bear Form(Passive)',0),
+(4,11,20580,'Shadowmeld',1),
+(4,11,20582,'Quickness',1),
+(4,11,20583,'Nature Resistance',1),
+(4,11,20585,'Wisp Spirit',1),
+(4,11,21009,'Shadowmeld Passive',1),
+(4,11,21178,'Bear Form(Passive2)',0),
+(4,11,21651,'Opening',1),
+(4,11,21652,'Closing',1),
+(4,11,22027,'Remove Insignia',1),
+(4,11,22810,'Opening - No Text',1),
+(4,11,24905,'Moonkin Form(Passive)',0),
+(4,11,27764,'Fetish',1),
+(4,11,33948,'Flight Form(Passive)',0),
+(4,11,34123,'Tree of Life(Passive)',0),
+(4,11,40121,'Swift Flight Form(Passive)',0),
+(5,1,78,'Heroic Strike',1),
+(5,1,81,'Dodge',1),
+(5,1,107,'Block',1),
+(5,1,201,'One-Handed Swords',1),
+(5,1,202,'Two-Handed Swords',1),
+(5,1,203,'Unarmed',1),
+(5,1,204,'Defense',1),
+(5,1,522,'SPELLDEFENSE(DND)',1),
+(5,1,669,'Language Orcish',1),
+(5,1,1180,'Daggers',1),
+(5,1,2382,'Generic',1),
+(5,1,2457,'Battle Stance',1),
+(5,1,2479,'Honorless Target',1),
+(5,1,3050,'Detect',1),
+(5,1,3365,'Opening',1),
+(5,1,5227,'Underwater Breathing',1),
+(5,1,5301,'Defensive State(DND)',1),
+(5,1,6233,'Closing',1),
+(5,1,6246,'Closing',1),
+(5,1,6247,'Opening',1),
+(5,1,6477,'Opening',1),
+(5,1,6478,'Opening',1),
+(5,1,6603,'Attack',1),
+(5,1,7266,'Duel',1),
+(5,1,7267,'Grovel',1),
+(5,1,7355,'Stuck',1),
+(5,1,7376,'Defensive Stance Passive',0),
+(5,1,7381,'Berserker Stance Passive',0),
+(5,1,7744,'Will of the Forsaken',1),
+(5,1,8386,'Attacking',1),
+(5,1,8737,'Mail',1),
+(5,1,9077,'Leather',1),
+(5,1,9078,'Cloth',1),
+(5,1,9116,'Shield',1),
+(5,1,9125,'Generic',1),
+(5,1,17737,'Language Gutterspeak',1),
+(5,1,20577,'Cannibalize',1),
+(5,1,20579,'Shadow Resistance',1),
+(5,1,21156,'Battle Stance Passive',0),
+(5,1,21651,'Opening',1),
+(5,1,21652,'Closing',1),
+(5,1,22027,'Remove Insignia',1),
+(5,1,22810,'Opening - No Text',1),
+(5,1,32215,'Victorious State',1),
+(5,4,81,'Dodge',1),
+(5,4,203,'Unarmed',1),
+(5,4,204,'Defense',1),
+(5,4,522,'SPELLDEFENSE(DND)',1),
+(5,4,669,'Language Orcish',1),
+(5,4,1180,'Daggers',1),
+(5,4,1752,'Sinister Strike',1),
+(5,4,2098,'Eviscerate',1),
+(5,4,2382,'Generic',1),
+(5,4,2479,'Honorless Target',1),
+(5,4,2567,'Thrown',1),
+(5,4,2764,'Throw',1),
+(5,4,3050,'Detect',1),
+(5,4,3365,'Opening',1),
+(5,4,5227,'Underwater Breathing',1),
+(5,4,6233,'Closing',1),
+(5,4,6246,'Closing',1),
+(5,4,6247,'Opening',1),
+(5,4,6477,'Opening',1),
+(5,4,6478,'Opening',1),
+(5,4,6603,'Attack',1),
+(5,4,7266,'Duel',1),
+(5,4,7267,'Grovel',1),
+(5,4,7355,'Stuck',1),
+(5,4,7744,'Will of the Forsaken',1),
+(5,4,8386,'Attacking',1),
+(5,4,9077,'Leather',1),
+(5,4,9078,'Cloth',1),
+(5,4,9125,'Generic',1),
+(5,4,16092,'Defensive State(DND)',1),
+(5,4,17737,'Language Gutterspeak',1),
+(5,4,20577,'Cannibalize',1),
+(5,4,20579,'Shadow Resistance',1),
+(5,4,21184,'Rogue Passive(DND)',1),
+(5,4,21651,'Opening',1),
+(5,4,21652,'Closing',1),
+(5,4,22027,'Remove Insignia',1),
+(5,4,22810,'Opening - No Text',1),
+(5,5,81,'Dodge',1),
+(5,5,198,'One-Handed Maces',1),
+(5,5,203,'Unarmed',1),
+(5,5,204,'Defense',1),
+(5,5,522,'SPELLDEFENSE(DND)',1),
+(5,5,585,'Smite',1),
+(5,5,669,'Language Orcish',1),
+(5,5,2050,'Lesser Heal',1),
+(5,5,2382,'Generic',1),
+(5,5,2479,'Honorless Target',1),
+(5,5,3050,'Detect',1),
+(5,5,3365,'Opening',1),
+(5,5,5009,'Wands',1),
+(5,5,5019,'Shoot',1),
+(5,5,5227,'Underwater Breathing',1),
+(5,5,6233,'Closing',1),
+(5,5,6246,'Closing',1),
+(5,5,6247,'Opening',1),
+(5,5,6477,'Opening',1),
+(5,5,6478,'Opening',1),
+(5,5,6603,'Attack',1),
+(5,5,7266,'Duel',1),
+(5,5,7267,'Grovel',1),
+(5,5,7355,'Stuck',1),
+(5,5,7744,'Will of the Forsaken',1),
+(5,5,8386,'Attacking',1),
+(5,5,9078,'Cloth',1),
+(5,5,9125,'Generic',1),
+(5,5,17737,'Language Gutterspeak',1),
+(5,5,20577,'Cannibalize',1),
+(5,5,20579,'Shadow Resistance',1),
+(5,5,21651,'Opening',1),
+(5,5,21652,'Closing',1),
+(5,5,22027,'Remove Insignia',1),
+(5,5,22810,'Opening - No Text',1),
+(5,6,81,'Dodge',1),
+(5,6,196,'One-Handed Axes',1),
+(5,6,197,'Two-Handed Axes',1),
+(5,6,200,'Polearms',1),
+(5,6,201,'One-Handed Swords',1),
+(5,6,202,'Two-Handed Swords',1),
+(5,6,203,'Unarmed',1),
+(5,6,204,'Defense',1),
+(5,6,522,'SPELLDEFENSE (DND)',1),
+(5,6,669,'Language Orcish',1),
+(5,6,674,'Dual Wield',1),
+(5,6,750,'Plate Mail',1),
+(5,6,1843,'Disarm',1),
+(5,6,2382,'Generic',1),
+(5,6,2479,'Honorless Target',1),
+(5,6,3050,'Detect',1),
+(5,6,3127,'Parry',1),
+(5,6,3275,'Linen Bandage',1),
+(5,6,3276,'Heavy Linen Bandage',1),
+(5,6,3277,'Wool Bandage',1),
+(5,6,3278,'Heavy Wool Bandage',1),
+(5,6,3365,'Opening',1),
+(5,6,5227,'Underwater Breathing',1),
+(5,6,6233,'Closing',1),
+(5,6,6246,'Closing',1),
+(5,6,6247,'Opening',1),
+(5,6,6477,'Opening',1),
+(5,6,6478,'Opening',1),
+(5,6,6603,'Attack',1),
+(5,6,7266,'Duel',1),
+(5,6,7267,'Grovel',1),
+(5,6,7355,'Stuck',1),
+(5,6,7744,'Will of the Forsaken',1),
+(5,6,7928,'Silk Bandage',1),
+(5,6,7929,'Heavy Silk Bandage',1),
+(5,6,7934,'Anti-Venom',1),
+(5,6,8386,'Attacking',1),
+(5,6,8737,'Mail',1),
+(5,6,9077,'Leather',1),
+(5,6,9078,'Cloth',1),
+(5,6,9125,'Generic',1),
+(5,6,10840,'Mageweave Bandage',1),
+(5,6,10841,'Heavy Mageweave Bandage',1),
+(5,6,10846,'First Aid',1),
+(5,6,17737,'Language Gutterspeak',1),
+(5,6,18629,'Runecloth Bandage',1),
+(5,6,18630,'Heavy Runecloth Bandage',1),
+(5,6,20577,'Cannibalize',1),
+(5,6,20579,'Shadow Resistance',1),
+(5,6,21651,'Opening',1),
+(5,6,21652,'Closing',1),
+(5,6,22027,'Remove Insignia',1),
+(5,6,22810,'Opening - No Text',1),
+(5,6,33391,'Journeyman Riding',1),
+(5,6,45462,'Plague Strike',1),
+(5,6,45477,'Icy Touch',1),
+(5,6,45902,'Blood Strike',1),
+(5,6,45903,'Offensive State (DND)',1),
+(5,6,45927,'Summon Friend',1),
+(5,6,47541,'Death Coil',1),
+(5,6,48266,'Blood Presence',1),
+(5,6,49410,'Forceful Deflection',1),
+(5,6,49576,'Death Grip',1),
+(5,6,52665,'Sigil',1),
+(5,6,59879,'Blood Plague',1),
+(5,6,59921,'Frost Fever',1),
+(5,6,61437,'Opening',1),
+(5,6,61455,'Runic Focus',1),
+(5,8,81,'Dodge',1),
+(5,8,133,'Fireball',1),
+(5,8,168,'Frost Armor',1),
+(5,8,203,'Unarmed',1),
+(5,8,204,'Defense',1),
+(5,8,227,'Staves',1),
+(5,8,522,'SPELLDEFENSE(DND)',1),
+(5,8,669,'Language Orcish',1),
+(5,8,2382,'Generic',1),
+(5,8,2479,'Honorless Target',1),
+(5,8,3050,'Detect',1),
+(5,8,3365,'Opening',1),
+(5,8,5009,'Wands',1),
+(5,8,5019,'Shoot',1),
+(5,8,5227,'Underwater Breathing',1),
+(5,8,6233,'Closing',1),
+(5,8,6246,'Closing',1),
+(5,8,6247,'Opening',1),
+(5,8,6477,'Opening',1),
+(5,8,6478,'Opening',1),
+(5,8,6603,'Attack',1),
+(5,8,7266,'Duel',1),
+(5,8,7267,'Grovel',1),
+(5,8,7355,'Stuck',1),
+(5,8,7744,'Will of the Forsaken',1),
+(5,8,8386,'Attacking',1),
+(5,8,9078,'Cloth',1),
+(5,8,9125,'Generic',1),
+(5,8,17737,'Language Gutterspeak',1),
+(5,8,20577,'Cannibalize',1),
+(5,8,20579,'Shadow Resistance',1),
+(5,8,21651,'Opening',1),
+(5,8,21652,'Closing',1),
+(5,8,22027,'Remove Insignia',1),
+(5,8,22810,'Opening - No Text',1),
+(5,9,81,'Dodge',1),
+(5,9,203,'Unarmed',1),
+(5,9,204,'Defense',1),
+(5,9,522,'SPELLDEFENSE(DND)',1),
+(5,9,669,'Language Orcish',1),
+(5,9,686,'Shadow Bolt',1),
+(5,9,687,'Demon Skin',1),
+(5,9,1180,'Daggers',1),
+(5,9,2382,'Generic',1),
+(5,9,2479,'Honorless Target',1),
+(5,9,3050,'Detect',1),
+(5,9,3365,'Opening',1),
+(5,9,5009,'Wands',1),
+(5,9,5019,'Shoot',1),
+(5,9,5227,'Underwater Breathing',1),
+(5,9,6233,'Closing',1),
+(5,9,6246,'Closing',1),
+(5,9,6247,'Opening',1),
+(5,9,6477,'Opening',1),
+(5,9,6478,'Opening',1),
+(5,9,6603,'Attack',1),
+(5,9,7266,'Duel',1),
+(5,9,7267,'Grovel',1),
+(5,9,7355,'Stuck',1),
+(5,9,7744,'Will of the Forsaken',1),
+(5,9,8386,'Attacking',1),
+(5,9,9078,'Cloth',1),
+(5,9,9125,'Generic',1),
+(5,9,17737,'Language Gutterspeak',1),
+(5,9,20577,'Cannibalize',1),
+(5,9,20579,'Shadow Resistance',1),
+(5,9,21651,'Opening',1),
+(5,9,21652,'Closing',1),
+(5,9,22027,'Remove Insignia',1),
+(5,9,22810,'Opening - No Text',1),
+(6,1,78,'Heroic Strike',1),
+(6,1,81,'Dodge',1),
+(6,1,107,'Block',1),
+(6,1,196,'One-Handed Axes',1),
+(6,1,198,'One-Handed Maces',1),
+(6,1,199,'Two-Handed Maces',1),
+(6,1,203,'Unarmed',1),
+(6,1,204,'Defense',1),
+(6,1,522,'SPELLDEFENSE(DND)',1),
+(6,1,669,'Language Orcish',1),
+(6,1,670,'Language Taurahe',1),
+(6,1,2382,'Generic',1),
+(6,1,2457,'Battle Stance',1),
+(6,1,2479,'Honorless Target',1),
+(6,1,3050,'Detect',1),
+(6,1,3365,'Opening',1),
+(6,1,5301,'Defensive State(DND)',1),
+(6,1,6233,'Closing',1),
+(6,1,6246,'Closing',1),
+(6,1,6247,'Opening',1),
+(6,1,6477,'Opening',1),
+(6,1,6478,'Opening',1),
+(6,1,6603,'Attack',1),
+(6,1,7266,'Duel',1),
+(6,1,7267,'Grovel',1),
+(6,1,7355,'Stuck',1),
+(6,1,7376,'Defensive Stance Passive',0),
+(6,1,7381,'Berserker Stance Passive',0),
+(6,1,8386,'Attacking',1),
+(6,1,8737,'Mail',1),
+(6,1,9077,'Leather',1),
+(6,1,9078,'Cloth',1),
+(6,1,9116,'Shield',1),
+(6,1,9125,'Generic',1),
+(6,1,20549,'War Stomp',1),
+(6,1,20550,'Endurance',1),
+(6,1,20551,'Nature Resistance',1),
+(6,1,20552,'Cultivation',1),
+(6,1,21156,'Battle Stance Passive',0),
+(6,1,21651,'Opening',1),
+(6,1,21652,'Closing',1),
+(6,1,22027,'Remove Insignia',1),
+(6,1,22810,'Opening - No Text',1),
+(6,1,32215,'Victorious State',1),
+(6,3,75,'Auto Shot',1),
+(6,3,81,'Dodge',1),
+(6,3,196,'One-Handed Axes',1),
+(6,3,203,'Unarmed',1),
+(6,3,204,'Defense',1),
+(6,3,266,'Guns',1),
+(6,3,522,'SPELLDEFENSE(DND)',1),
+(6,3,669,'Language Orcish',1),
+(6,3,670,'Language Taurahe',1),
+(6,3,2382,'Generic',1),
+(6,3,2479,'Honorless Target',1),
+(6,3,2973,'Raptor Strike',1),
+(6,3,3050,'Detect',1),
+(6,3,3365,'Opening',1),
+(6,3,6233,'Closing',1),
+(6,3,6246,'Closing',1),
+(6,3,6247,'Opening',1),
+(6,3,6477,'Opening',1),
+(6,3,6478,'Opening',1),
+(6,3,6603,'Attack',1),
+(6,3,7266,'Duel',1),
+(6,3,7267,'Grovel',1),
+(6,3,7355,'Stuck',1),
+(6,3,8386,'Attacking',1),
+(6,3,9077,'Leather',1),
+(6,3,9078,'Cloth',1),
+(6,3,9125,'Generic',1),
+(6,3,13358,'Defensive State(DND)',1),
+(6,3,20549,'War Stomp',1),
+(6,3,20550,'Endurance',1),
+(6,3,20551,'Nature Resistance',1),
+(6,3,20552,'Cultivation',1),
+(6,3,21651,'Opening',1),
+(6,3,21652,'Closing',1),
+(6,3,22027,'Remove Insignia',1),
+(6,3,22810,'Opening - No Text',1),
+(6,3,24949,'Defensive State 2(DND)',1),
+(6,3,34082,'Advantaged State(DND)',1),
+(6,6,81,'Dodge',1),
+(6,6,196,'One-Handed Axes',1),
+(6,6,197,'Two-Handed Axes',1),
+(6,6,200,'Polearms',1),
+(6,6,201,'One-Handed Swords',1),
+(6,6,202,'Two-Handed Swords',1),
+(6,6,203,'Unarmed',1),
+(6,6,204,'Defense',1),
+(6,6,522,'SPELLDEFENSE (DND)',1),
+(6,6,669,'Language Orcish',1),
+(6,6,670,'Language Taurahe',1),
+(6,6,674,'Dual Wield',1),
+(6,6,750,'Plate Mail',1),
+(6,6,1843,'Disarm',1),
+(6,6,2382,'Generic',1),
+(6,6,2479,'Honorless Target',1),
+(6,6,3050,'Detect',1),
+(6,6,3127,'Parry',1),
+(6,6,3275,'Linen Bandage',1),
+(6,6,3276,'Heavy Linen Bandage',1),
+(6,6,3277,'Wool Bandage',1),
+(6,6,3278,'Heavy Wool Bandage',1),
+(6,6,3365,'Opening',1),
+(6,6,6233,'Closing',1),
+(6,6,6246,'Closing',1),
+(6,6,6247,'Opening',1),
+(6,6,6477,'Opening',1),
+(6,6,6478,'Opening',1),
+(6,6,6603,'Attack',1),
+(6,6,7266,'Duel',1),
+(6,6,7267,'Grovel',1),
+(6,6,7355,'Stuck',1),
+(6,6,7928,'Silk Bandage',1),
+(6,6,7929,'Heavy Silk Bandage',1),
+(6,6,7934,'Anti-Venom',1),
+(6,6,8386,'Attacking',1),
+(6,6,8737,'Mail',1),
+(6,6,9077,'Leather',1),
+(6,6,9078,'Cloth',1),
+(6,6,9125,'Generic',1),
+(6,6,10840,'Mageweave Bandage',1),
+(6,6,10841,'Heavy Mageweave Bandage',1),
+(6,6,10846,'First Aid',1),
+(6,6,18629,'Runecloth Bandage',1),
+(6,6,18630,'Heavy Runecloth Bandage',1),
+(6,6,20549,'War Stomp',1),
+(6,6,20550,'Endurance',1),
+(6,6,20551,'Nature Resistance',1),
+(6,6,20552,'Cultivation',1),
+(6,6,21651,'Opening',1),
+(6,6,21652,'Closing',1),
+(6,6,22027,'Remove Insignia',1),
+(6,6,22810,'Opening - No Text',1),
+(6,6,33391,'Journeyman Riding',1),
+(6,6,45462,'Plague Strike',1),
+(6,6,45477,'Icy Touch',1),
+(6,6,45902,'Blood Strike',1),
+(6,6,45903,'Offensive State (DND)',1),
+(6,6,45927,'Summon Friend',1),
+(6,6,47541,'Death Coil',1),
+(6,6,48266,'Blood Presence',1),
+(6,6,49410,'Forceful Deflection',1),
+(6,6,49576,'Death Grip',1),
+(6,6,52665,'Sigil',1),
+(6,6,59879,'Blood Plague',1),
+(6,6,59921,'Frost Fever',1),
+(6,6,61437,'Opening',1),
+(6,6,61455,'Runic Focus',1),
+(6,7,81,'Dodge',1),
+(6,7,107,'Block',1),
+(6,7,198,'One-Handed Maces',1),
+(6,7,203,'Unarmed',1),
+(6,7,204,'Defense',1),
+(6,7,227,'Staves',1),
+(6,7,331,'Healing Wave',1),
+(6,7,403,'Lightning Bolt',1),
+(6,7,522,'SPELLDEFENSE(DND)',1),
+(6,7,669,'Language Orcish',1),
+(6,7,670,'Language Taurahe',1),
+(6,7,2382,'Generic',1),
+(6,7,2479,'Honorless Target',1),
+(6,7,3050,'Detect',1),
+(6,7,3365,'Opening',1),
+(6,7,6233,'Closing',1),
+(6,7,6246,'Closing',1),
+(6,7,6247,'Opening',1),
+(6,7,6477,'Opening',1),
+(6,7,6478,'Opening',1),
+(6,7,6603,'Attack',1),
+(6,7,7266,'Duel',1),
+(6,7,7267,'Grovel',1),
+(6,7,7355,'Stuck',1),
+(6,7,8386,'Attacking',1),
+(6,7,9077,'Leather',1),
+(6,7,9078,'Cloth',1),
+(6,7,9116,'Shield',1),
+(6,7,9125,'Generic',1),
+(6,7,20549,'War Stomp',1),
+(6,7,20550,'Endurance',1),
+(6,7,20551,'Nature Resistance',1),
+(6,7,20552,'Cultivation',1),
+(6,7,21651,'Opening',1),
+(6,7,21652,'Closing',1),
+(6,7,22027,'Remove Insignia',1),
+(6,7,22810,'Opening - No Text',1),
+(6,7,27763,'Totem',1),
+(6,11,81,'Dodge',1),
+(6,11,198,'One-Handed Maces',1),
+(6,11,203,'Unarmed',1),
+(6,11,204,'Defense',1),
+(6,11,227,'Staves',1),
+(6,11,522,'SPELLDEFENSE(DND)',1),
+(6,11,669,'Language Orcish',1),
+(6,11,670,'Language Taurahe',1),
+(6,11,1178,'Bear Form(Passive)',0),
+(6,11,2382,'Generic',1),
+(6,11,2479,'Honorless Target',1),
+(6,11,3025,'Cat Form(Passive)',0),
+(6,11,3050,'Detect',1),
+(6,11,3365,'Opening',1),
+(6,11,5176,'Wrath',1),
+(6,11,5185,'Healing Touch',1),
+(6,11,5419,'Travel Form(Passive)',0),
+(6,11,5420,'Tree of Life',0),
+(6,11,5421,'Aquatic Form(Passive)',0),
+(6,11,6233,'Closing',1),
+(6,11,6246,'Closing',1),
+(6,11,6247,'Opening',1),
+(6,11,6477,'Opening',1),
+(6,11,6478,'Opening',1),
+(6,11,6603,'Attack',1),
+(6,11,7266,'Duel',1),
+(6,11,7267,'Grovel',1),
+(6,11,7355,'Stuck',1),
+(6,11,8386,'Attacking',1),
+(6,11,9077,'Leather',1),
+(6,11,9078,'Cloth',1),
+(6,11,9125,'Generic',1),
+(6,11,9635,'Dire Bear Form(Passive)',0),
+(6,11,20549,'War Stomp',1),
+(6,11,20550,'Endurance',1),
+(6,11,20551,'Nature Resistance',1),
+(6,11,20552,'Cultivation',1),
+(6,11,21178,'Bear Form(Passive2)',0),
+(6,11,21651,'Opening',1),
+(6,11,21652,'Closing',1),
+(6,11,22027,'Remove Insignia',1),
+(6,11,22810,'Opening - No Text',1),
+(6,11,24905,'Moonkin Form(Passive)',0),
+(6,11,27764,'Fetish',1),
+(6,11,33948,'Flight Form(Passive)',0),
+(6,11,34123,'Tree of Life(Passive)',0),
+(6,11,40121,'Swift Flight Form(Passive)',0),
+(7,1,78,'Heroic Strike',1),
+(7,1,81,'Dodge',1),
+(7,1,107,'Block',1),
+(7,1,198,'One-Handed Maces',1),
+(7,1,201,'One-Handed Swords',1),
+(7,1,203,'Unarmed',1),
+(7,1,204,'Defense',1),
+(7,1,522,'SPELLDEFENSE(DND)',1),
+(7,1,668,'Language Common',1),
+(7,1,1180,'Daggers',1),
+(7,1,2382,'Generic',1),
+(7,1,2457,'Battle Stance',1),
+(7,1,2479,'Honorless Target',1),
+(7,1,3050,'Detect',1),
+(7,1,3365,'Opening',1),
+(7,1,5301,'Defensive State(DND)',1),
+(7,1,6233,'Closing',1),
+(7,1,6246,'Closing',1),
+(7,1,6247,'Opening',1),
+(7,1,6477,'Opening',1),
+(7,1,6478,'Opening',1),
+(7,1,6603,'Attack',1),
+(7,1,7266,'Duel',1),
+(7,1,7267,'Grovel',1),
+(7,1,7340,'Language Gnomish',1),
+(7,1,7355,'Stuck',1),
+(7,1,7376,'Defensive Stance Passive',0),
+(7,1,7381,'Berserker Stance Passive',0),
+(7,1,8386,'Attacking',1),
+(7,1,8737,'Mail',1),
+(7,1,9077,'Leather',1),
+(7,1,9078,'Cloth',1),
+(7,1,9116,'Shield',1),
+(7,1,9125,'Generic',1),
+(7,1,20589,'Escape Artist',1),
+(7,1,20591,'Expansive Mind',1),
+(7,1,20592,'Arcane Resistance',1),
+(7,1,20593,'Engineering Specialization',1),
+(7,1,21156,'Battle Stance Passive',0),
+(7,1,21651,'Opening',1),
+(7,1,21652,'Closing',1),
+(7,1,22027,'Remove Insignia',1),
+(7,1,22810,'Opening - No Text',1),
+(7,1,32215,'Victorious State',1),
+(7,4,81,'Dodge',1),
+(7,4,203,'Unarmed',1),
+(7,4,204,'Defense',1),
+(7,4,522,'SPELLDEFENSE(DND)',1),
+(7,4,668,'Language Common',1),
+(7,4,1180,'Daggers',1),
+(7,4,1752,'Sinister Strike',1),
+(7,4,2098,'Eviscerate',1),
+(7,4,2382,'Generic',1),
+(7,4,2479,'Honorless Target',1),
+(7,4,2567,'Thrown',1),
+(7,4,2764,'Throw',1),
+(7,4,3050,'Detect',1),
+(7,4,3365,'Opening',1),
+(7,4,6233,'Closing',1),
+(7,4,6246,'Closing',1),
+(7,4,6247,'Opening',1),
+(7,4,6477,'Opening',1),
+(7,4,6478,'Opening',1),
+(7,4,6603,'Attack',1),
+(7,4,7266,'Duel',1),
+(7,4,7267,'Grovel',1),
+(7,4,7340,'Language Gnomish',1),
+(7,4,7355,'Stuck',1),
+(7,4,8386,'Attacking',1),
+(7,4,9077,'Leather',1),
+(7,4,9078,'Cloth',1),
+(7,4,9125,'Generic',1),
+(7,4,16092,'Defensive State(DND)',1),
+(7,4,20589,'Escape Artist',1),
+(7,4,20591,'Expansive Mind',1),
+(7,4,20592,'Arcane Resistance',1),
+(7,4,20593,'Engineering Specialization',1),
+(7,4,21184,'Rogue Passive(DND)',1),
+(7,4,21651,'Opening',1),
+(7,4,21652,'Closing',1),
+(7,4,22027,'Remove Insignia',1),
+(7,4,22810,'Opening - No Text',1),
+(7,6,81,'Dodge',1),
+(7,6,196,'One-Handed Axes',1),
+(7,6,197,'Two-Handed Axes',1),
+(7,6,200,'Polearms',1),
+(7,6,201,'One-Handed Swords',1),
+(7,6,202,'Two-Handed Swords',1),
+(7,6,203,'Unarmed',1),
+(7,6,204,'Defense',1),
+(7,6,522,'SPELLDEFENSE (DND)',1),
+(7,6,668,'Language Common',1),
+(7,6,674,'Dual Wield',1),
+(7,6,750,'Plate Mail',1),
+(7,6,1843,'Disarm',1),
+(7,6,2382,'Generic',1),
+(7,6,2479,'Honorless Target',1),
+(7,6,3050,'Detect',1),
+(7,6,3127,'Parry',1),
+(7,6,3275,'Linen Bandage',1),
+(7,6,3276,'Heavy Linen Bandage',1),
+(7,6,3277,'Wool Bandage',1),
+(7,6,3278,'Heavy Wool Bandage',1),
+(7,6,3365,'Opening',1),
+(7,6,6233,'Closing',1),
+(7,6,6246,'Closing',1),
+(7,6,6247,'Opening',1),
+(7,6,6477,'Opening',1),
+(7,6,6478,'Opening',1),
+(7,6,6603,'Attack',1),
+(7,6,7266,'Duel',1),
+(7,6,7267,'Grovel',1),
+(7,6,7340,'Language Gnomish',1),
+(7,6,7355,'Stuck',1),
+(7,6,7928,'Silk Bandage',1),
+(7,6,7929,'Heavy Silk Bandage',1),
+(7,6,7934,'Anti-Venom',1),
+(7,6,8386,'Attacking',1),
+(7,6,8737,'Mail',1),
+(7,6,9077,'Leather',1),
+(7,6,9078,'Cloth',1),
+(7,6,9125,'Generic',1),
+(7,6,10840,'Mageweave Bandage',1),
+(7,6,10841,'Heavy Mageweave Bandage',1),
+(7,6,10846,'First Aid',1),
+(7,6,18629,'Runecloth Bandage',1),
+(7,6,18630,'Heavy Runecloth Bandage',1),
+(7,6,20589,'Escape Artist',1),
+(7,6,20591,'Expansive Mind',1),
+(7,6,20592,'Arcane Resistance',1),
+(7,6,20593,'Engineering Specialization',1),
+(7,6,21651,'Opening',1),
+(7,6,21652,'Closing',1),
+(7,6,22027,'Remove Insignia',1),
+(7,6,22810,'Opening - No Text',1),
+(7,6,33391,'Journeyman Riding',1),
+(7,6,45462,'Plague Strike',1),
+(7,6,45477,'Icy Touch',1),
+(7,6,45902,'Blood Strike',1),
+(7,6,45903,'Offensive State (DND)',1),
+(7,6,45927,'Summon Friend',1),
+(7,6,47541,'Death Coil',1),
+(7,6,48266,'Blood Presence',1),
+(7,6,49410,'Forceful Deflection',1),
+(7,6,49576,'Death Grip',1),
+(7,6,52665,'Sigil',1),
+(7,6,59879,'Blood Plague',1),
+(7,6,59921,'Frost Fever',1),
+(7,6,61437,'Opening',1),
+(7,6,61455,'Runic Focus',1),
+(7,8,81,'Dodge',1),
+(7,8,133,'Fireball',1),
+(7,8,168,'Frost Armor',1),
+(7,8,203,'Unarmed',1),
+(7,8,204,'Defense',1),
+(7,8,227,'Staves',1),
+(7,8,522,'SPELLDEFENSE(DND)',1),
+(7,8,668,'Language Common',1),
+(7,8,2382,'Generic',1),
+(7,8,2479,'Honorless Target',1),
+(7,8,3050,'Detect',1),
+(7,8,3365,'Opening',1),
+(7,8,5009,'Wands',1),
+(7,8,5019,'Shoot',1),
+(7,8,6233,'Closing',1),
+(7,8,6246,'Closing',1),
+(7,8,6247,'Opening',1),
+(7,8,6477,'Opening',1),
+(7,8,6478,'Opening',1),
+(7,8,6603,'Attack',1),
+(7,8,7266,'Duel',1),
+(7,8,7267,'Grovel',1),
+(7,8,7340,'Language Gnomish',1),
+(7,8,7355,'Stuck',1),
+(7,8,8386,'Attacking',1),
+(7,8,9078,'Cloth',1),
+(7,8,9125,'Generic',1),
+(7,8,20589,'Escape Artist',1),
+(7,8,20591,'Expansive Mind',1),
+(7,8,20592,'Arcane Resistance',1),
+(7,8,20593,'Engineering Specialization',1),
+(7,8,21651,'Opening',1),
+(7,8,21652,'Closing',1),
+(7,8,22027,'Remove Insignia',1),
+(7,8,22810,'Opening - No Text',1),
+(7,9,81,'Dodge',1),
+(7,9,203,'Unarmed',1),
+(7,9,204,'Defense',1),
+(7,9,522,'SPELLDEFENSE(DND)',1),
+(7,9,668,'Language Common',1),
+(7,9,686,'Shadow Bolt',1),
+(7,9,687,'Demon Skin',1),
+(7,9,1180,'Daggers',1),
+(7,9,2382,'Generic',1),
+(7,9,2479,'Honorless Target',1),
+(7,9,3050,'Detect',1),
+(7,9,3365,'Opening',1),
+(7,9,5009,'Wands',1),
+(7,9,5019,'Shoot',1),
+(7,9,6233,'Closing',1),
+(7,9,6246,'Closing',1),
+(7,9,6247,'Opening',1),
+(7,9,6477,'Opening',1),
+(7,9,6478,'Opening',1),
+(7,9,6603,'Attack',1),
+(7,9,7266,'Duel',1),
+(7,9,7267,'Grovel',1),
+(7,9,7340,'Language Gnomish',1),
+(7,9,7355,'Stuck',1),
+(7,9,8386,'Attacking',1),
+(7,9,9078,'Cloth',1),
+(7,9,9125,'Generic',1),
+(7,9,20589,'Escape Artist',1),
+(7,9,20591,'Expansive Mind',1),
+(7,9,20592,'Arcane Resistance',1),
+(7,9,20593,'Engineering Specialization',1),
+(7,9,21651,'Opening',1),
+(7,9,21652,'Closing',1),
+(7,9,22027,'Remove Insignia',1),
+(7,9,22810,'Opening - No Text',1),
+(8,1,78,'Heroic Strike',1),
+(8,1,81,'Dodge',1),
+(8,1,107,'Block',1),
+(8,1,196,'One-Handed Axes',1),
+(8,1,203,'Unarmed',1),
+(8,1,204,'Defense',1),
+(8,1,522,'SPELLDEFENSE(DND)',1),
+(8,1,669,'Language Orcish',1),
+(8,1,1180,'Daggers',1),
+(8,1,2382,'Generic',1),
+(8,1,2457,'Battle Stance',1),
+(8,1,2479,'Honorless Target',1),
+(8,1,2567,'Thrown',1),
+(8,1,2764,'Throw',1),
+(8,1,3050,'Detect',1),
+(8,1,3365,'Opening',1),
+(8,1,5301,'Defensive State(DND)',1),
+(8,1,6233,'Closing',1),
+(8,1,6246,'Closing',1),
+(8,1,6247,'Opening',1),
+(8,1,6477,'Opening',1),
+(8,1,6478,'Opening',1),
+(8,1,6603,'Attack',1),
+(8,1,7266,'Duel',1),
+(8,1,7267,'Grovel',1),
+(8,1,7341,'Language Troll',1),
+(8,1,7355,'Stuck',1),
+(8,1,7376,'Defensive Stance Passive',0),
+(8,1,7381,'Berserker Stance Passive',0),
+(8,1,8386,'Attacking',1),
+(8,1,8737,'Mail',1),
+(8,1,9077,'Leather',1),
+(8,1,9078,'Cloth',1),
+(8,1,9116,'Shield',1),
+(8,1,9125,'Generic',1),
+(8,1,20555,'Regeneration',1),
+(8,1,20557,'Beast Slaying',1),
+(8,1,20558,'Throwing Specialization',1),
+(8,1,21156,'Battle Stance Passive',0),
+(8,1,21651,'Opening',1),
+(8,1,21652,'Closing',1),
+(8,1,22027,'Remove Insignia',1),
+(8,1,22810,'Opening - No Text',1),
+(8,1,26290,'Bow Specialization',1),
+(8,1,26296,'Berserking',1),
+(8,1,32215,'Victorious State',1),
+(8,3,75,'Auto Shot',1),
+(8,3,81,'Dodge',1),
+(8,3,196,'One-Handed Axes',1),
+(8,3,203,'Unarmed',1),
+(8,3,204,'Defense',1),
+(8,3,264,'Bows',1),
+(8,3,522,'SPELLDEFENSE(DND)',1),
+(8,3,669,'Language Orcish',1),
+(8,3,2382,'Generic',1),
+(8,3,2479,'Honorless Target',1),
+(8,3,2973,'Raptor Strike',1),
+(8,3,3050,'Detect',1),
+(8,3,3365,'Opening',1),
+(8,3,6233,'Closing',1),
+(8,3,6246,'Closing',1),
+(8,3,6247,'Opening',1),
+(8,3,6477,'Opening',1),
+(8,3,6478,'Opening',1),
+(8,3,6603,'Attack',1),
+(8,3,7266,'Duel',1),
+(8,3,7267,'Grovel',1),
+(8,3,7341,'Language Troll',1),
+(8,3,7355,'Stuck',1),
+(8,3,8386,'Attacking',1),
+(8,3,9077,'Leather',1),
+(8,3,9078,'Cloth',1),
+(8,3,9125,'Generic',1),
+(8,3,13358,'Defensive State(DND)',1),
+(8,3,20554,'Berserking',1),
+(8,3,20555,'Regeneration',1),
+(8,3,20557,'Beast Slaying',1),
+(8,3,20558,'Throwing Specialization',1),
+(8,3,21651,'Opening',1),
+(8,3,21652,'Closing',1),
+(8,3,22027,'Remove Insignia',1),
+(8,3,22810,'Opening - No Text',1),
+(8,3,24949,'Defensive State 2(DND)',1),
+(8,3,26290,'Bow Specialization',1),
+(8,3,34082,'Advantaged State(DND)',1),
+(8,4,81,'Dodge',1),
+(8,4,203,'Unarmed',1),
+(8,4,204,'Defense',1),
+(8,4,522,'SPELLDEFENSE(DND)',1),
+(8,4,669,'Language Orcish',1),
+(8,4,1180,'Daggers',1),
+(8,4,1752,'Sinister Strike',1),
+(8,4,2098,'Eviscerate',1),
+(8,4,2382,'Generic',1),
+(8,4,2479,'Honorless Target',1),
+(8,4,2567,'Thrown',1),
+(8,4,2764,'Throw',1),
+(8,4,3050,'Detect',1),
+(8,4,3365,'Opening',1),
+(8,4,6233,'Closing',1),
+(8,4,6246,'Closing',1),
+(8,4,6247,'Opening',1),
+(8,4,6477,'Opening',1),
+(8,4,6478,'Opening',1),
+(8,4,6603,'Attack',1),
+(8,4,7266,'Duel',1),
+(8,4,7267,'Grovel',1),
+(8,4,7341,'Language Troll',1),
+(8,4,7355,'Stuck',1),
+(8,4,8386,'Attacking',1),
+(8,4,9077,'Leather',1),
+(8,4,9078,'Cloth',1),
+(8,4,9125,'Generic',1),
+(8,4,16092,'Defensive State(DND)',1),
+(8,4,20555,'Regeneration',1),
+(8,4,20557,'Beast Slaying',1),
+(8,4,20558,'Throwing Specialization',1),
+(8,4,21184,'Rogue Passive(DND)',1),
+(8,4,21651,'Opening',1),
+(8,4,21652,'Closing',1),
+(8,4,22027,'Remove Insignia',1),
+(8,4,22810,'Opening - No Text',1),
+(8,4,26290,'Bow Specialization',1),
+(8,4,26297,'Berserking',1),
+(8,5,81,'Dodge',1),
+(8,5,198,'One-Handed Maces',1),
+(8,5,203,'Unarmed',1),
+(8,5,204,'Defense',1),
+(8,5,522,'SPELLDEFENSE(DND)',1),
+(8,5,585,'Smite',1),
+(8,5,669,'Language Orcish',1),
+(8,5,2050,'Lesser Heal',1),
+(8,5,2382,'Generic',1),
+(8,5,2479,'Honorless Target',1),
+(8,5,3050,'Detect',1),
+(8,5,3365,'Opening',1),
+(8,5,5009,'Wands',1),
+(8,5,5019,'Shoot',1),
+(8,5,6233,'Closing',1),
+(8,5,6246,'Closing',1),
+(8,5,6247,'Opening',1),
+(8,5,6477,'Opening',1),
+(8,5,6478,'Opening',1),
+(8,5,6603,'Attack',1),
+(8,5,7266,'Duel',1),
+(8,5,7267,'Grovel',1),
+(8,5,7341,'Language Troll',1),
+(8,5,7355,'Stuck',1),
+(8,5,8386,'Attacking',1),
+(8,5,9078,'Cloth',1),
+(8,5,9125,'Generic',1),
+(8,5,20554,'Berserking',1),
+(8,5,20555,'Regeneration',1),
+(8,5,20557,'Beast Slaying',1),
+(8,5,20558,'Throwing Specialization',1),
+(8,5,21651,'Opening',1),
+(8,5,21652,'Closing',1),
+(8,5,22027,'Remove Insignia',1),
+(8,5,22810,'Opening - No Text',1),
+(8,5,26290,'Bow Specialization',1),
+(8,6,81,'Dodge',1),
+(8,6,196,'One-Handed Axes',1),
+(8,6,197,'Two-Handed Axes',1),
+(8,6,200,'Polearms',1),
+(8,6,201,'One-Handed Swords',1),
+(8,6,202,'Two-Handed Swords',1),
+(8,6,203,'Unarmed',1),
+(8,6,204,'Defense',1),
+(8,6,522,'SPELLDEFENSE (DND)',1),
+(8,6,669,'Language Orcish',1),
+(8,6,674,'Dual Wield',1),
+(8,6,750,'Plate Mail',1),
+(8,6,1843,'Disarm',1),
+(8,6,2382,'Generic',1),
+(8,6,2479,'Honorless Target',1),
+(8,6,3050,'Detect',1),
+(8,6,3127,'Parry',1),
+(8,6,3275,'Linen Bandage',1),
+(8,6,3276,'Heavy Linen Bandage',1),
+(8,6,3277,'Wool Bandage',1),
+(8,6,3278,'Heavy Wool Bandage',1),
+(8,6,3365,'Opening',1),
+(8,6,6233,'Closing',1),
+(8,6,6246,'Closing',1),
+(8,6,6247,'Opening',1),
+(8,6,6477,'Opening',1),
+(8,6,6478,'Opening',1),
+(8,6,6603,'Attack',1),
+(8,6,7266,'Duel',1),
+(8,6,7267,'Grovel',1),
+(8,6,7341,'Language Troll',1),
+(8,6,7355,'Stuck',1),
+(8,6,7928,'Silk Bandage',1),
+(8,6,7929,'Heavy Silk Bandage',1),
+(8,6,7934,'Anti-Venom',1),
+(8,6,8386,'Attacking',1),
+(8,6,8737,'Mail',1),
+(8,6,9077,'Leather',1),
+(8,6,9078,'Cloth',1),
+(8,6,9125,'Generic',1),
+(8,6,10840,'Mageweave Bandage',1),
+(8,6,10841,'Heavy Mageweave Bandage',1),
+(8,6,10846,'First Aid',1),
+(8,6,18629,'Runecloth Bandage',1),
+(8,6,18630,'Heavy Runecloth Bandage',1),
+(8,6,20555,'Regeneration',1),
+(8,6,20557,'Beast Slaying',1),
+(8,6,20558,'Throwing Specialization',1),
+(8,6,21651,'Opening',1),
+(8,6,21652,'Closing',1),
+(8,6,22027,'Remove Insignia',1),
+(8,6,22810,'Opening - No Text',1),
+(8,6,26290,'Bow Specialization',1),
+(8,6,33391,'Journeyman Riding',1),
+(8,6,45462,'Plague Strike',1),
+(8,6,45477,'Icy Touch',1),
+(8,6,45902,'Blood Strike',1),
+(8,6,45903,'Offensive State (DND)',1),
+(8,6,45927,'Summon Friend',1),
+(8,6,47541,'Death Coil',1),
+(8,6,48266,'Blood Presence',1),
+(8,6,49410,'Forceful Deflection',1),
+(8,6,49576,'Death Grip',1),
+(8,6,50621,'Berserking',1),
+(8,6,52665,'Sigil',1),
+(8,6,58943,'Da Voodoo Shuffle',1),
+(8,6,59879,'Blood Plague',1),
+(8,6,59921,'Frost Fever',1),
+(8,6,61437,'Opening',1),
+(8,6,61455,'Runic Focus',1),
+(8,7,81,'Dodge',1),
+(8,7,107,'Block',1),
+(8,7,198,'One-Handed Maces',1),
+(8,7,203,'Unarmed',1),
+(8,7,204,'Defense',1),
+(8,7,227,'Staves',1),
+(8,7,331,'Healing Wave',1),
+(8,7,403,'Lightning Bolt',1),
+(8,7,522,'SPELLDEFENSE(DND)',1),
+(8,7,669,'Language Orcish',1),
+(8,7,2382,'Generic',1),
+(8,7,2479,'Honorless Target',1),
+(8,7,3050,'Detect',1),
+(8,7,3365,'Opening',1),
+(8,7,6233,'Closing',1),
+(8,7,6246,'Closing',1),
+(8,7,6247,'Opening',1),
+(8,7,6477,'Opening',1),
+(8,7,6478,'Opening',1),
+(8,7,6603,'Attack',1),
+(8,7,7266,'Duel',1),
+(8,7,7267,'Grovel',1),
+(8,7,7341,'Language Troll',1),
+(8,7,7355,'Stuck',1),
+(8,7,8386,'Attacking',1),
+(8,7,9077,'Leather',1),
+(8,7,9078,'Cloth',1),
+(8,7,9116,'Shield',1),
+(8,7,9125,'Generic',1),
+(8,7,20554,'Berserking',1),
+(8,7,20555,'Regeneration',1),
+(8,7,20557,'Beast Slaying',1),
+(8,7,20558,'Throwing Specialization',1),
+(8,7,21651,'Opening',1),
+(8,7,21652,'Closing',1),
+(8,7,22027,'Remove Insignia',1),
+(8,7,22810,'Opening - No Text',1),
+(8,7,26290,'Bow Specialization',1),
+(8,7,27763,'Totem',1),
+(8,8,81,'Dodge',1),
+(8,8,133,'Fireball',1),
+(8,8,168,'Frost Armor',1),
+(8,8,203,'Unarmed',1),
+(8,8,204,'Defense',1),
+(8,8,227,'Staves',1),
+(8,8,522,'SPELLDEFENSE(DND)',1),
+(8,8,669,'Language Orcish',1),
+(8,8,2382,'Generic',1),
+(8,8,2479,'Honorless Target',1),
+(8,8,3050,'Detect',1),
+(8,8,3365,'Opening',1),
+(8,8,5009,'Wands',1),
+(8,8,5019,'Shoot',1),
+(8,8,6233,'Closing',1),
+(8,8,6246,'Closing',1),
+(8,8,6247,'Opening',1),
+(8,8,6477,'Opening',1),
+(8,8,6478,'Opening',1),
+(8,8,6603,'Attack',1),
+(8,8,7266,'Duel',1),
+(8,8,7267,'Grovel',1),
+(8,8,7341,'Language Troll',1),
+(8,8,7355,'Stuck',1),
+(8,8,8386,'Attacking',1),
+(8,8,9078,'Cloth',1),
+(8,8,9125,'Generic',1),
+(8,8,20554,'Berserking',1),
+(8,8,20555,'Regeneration',1),
+(8,8,20557,'Beast Slaying',1),
+(8,8,20558,'Throwing Specialization',1),
+(8,8,21651,'Opening',1),
+(8,8,21652,'Closing',1),
+(8,8,22027,'Remove Insignia',1),
+(8,8,22810,'Opening - No Text',1),
+(8,8,26290,'Bow Specialization',1),
+(10,2,81,'Dodge',1),
+(10,2,107,'Block',1),
+(10,2,201,'One-Handed Swords',1),
+(10,2,202,'Two-Handed Swords',1),
+(10,2,203,'Unarmed',1),
+(10,2,204,'Defense',1),
+(10,2,522,'SPELLDEFENSE(DND)',1),
+(10,2,635,'Holy Light',1),
+(10,2,669,'Language Orcish',1),
+(10,2,813,'Language Thalassian',1),
+(10,2,822,'Magic Resistance',1),
+(10,2,2382,'Generic',1),
+(10,2,2479,'Honorless Target',1),
+(10,2,3050,'Detect',1),
+(10,2,3365,'Opening',1),
+(10,2,6233,'Closing',1),
+(10,2,6246,'Closing',1),
+(10,2,6247,'Opening',1),
+(10,2,6477,'Opening',1),
+(10,2,6478,'Opening',1),
+(10,2,6603,'Attack',1),
+(10,2,7266,'Duel',1),
+(10,2,7267,'Grovel',1),
+(10,2,7355,'Stuck',1),
+(10,2,8386,'Attacking',1),
+(10,2,8737,'Mail',1),
+(10,2,9077,'Leather',1),
+(10,2,9078,'Cloth',1),
+(10,2,9116,'Shield',1),
+(10,2,9125,'Generic',1),
+(10,2,21084,'Seal of Righteousness',1),
+(10,2,21651,'Opening',1),
+(10,2,21652,'Closing',1),
+(10,2,22027,'Remove Insignia',1),
+(10,2,22810,'Opening - No Text',1),
+(10,2,27762,'Libram',1),
+(10,2,28730,'Arcane Torrent',1),
+(10,2,28734,'Mana Tap',1),
+(10,2,28877,'Arcane Affinity',1),
+(10,3,75,'Auto Shot',1),
+(10,3,81,'Dodge',1),
+(10,3,203,'Unarmed',1),
+(10,3,204,'Defense',1),
+(10,3,264,'Bows',1),
+(10,3,522,'SPELLDEFENSE(DND)',1),
+(10,3,669,'Language Orcish',1),
+(10,3,813,'Language Thalassian',1),
+(10,3,822,'Magic Resistance',1),
+(10,3,1180,'Daggers',1),
+(10,3,2382,'Generic',1),
+(10,3,2479,'Honorless Target',1),
+(10,3,2973,'Raptor Strike',1),
+(10,3,3050,'Detect',1),
+(10,3,3365,'Opening',1),
+(10,3,6233,'Closing',1),
+(10,3,6246,'Closing',1),
+(10,3,6247,'Opening',1),
+(10,3,6477,'Opening',1),
+(10,3,6478,'Opening',1),
+(10,3,6603,'Attack',1),
+(10,3,7266,'Duel',1),
+(10,3,7267,'Grovel',1),
+(10,3,7355,'Stuck',1),
+(10,3,8386,'Attacking',1),
+(10,3,9077,'Leather',1),
+(10,3,9078,'Cloth',1),
+(10,3,9125,'Generic',1),
+(10,3,13358,'Defensive State(DND)',1),
+(10,3,21651,'Opening',1),
+(10,3,21652,'Closing',1),
+(10,3,22027,'Remove Insignia',1),
+(10,3,22810,'Opening - No Text',1),
+(10,3,24949,'Defensive State 2(DND)',1),
+(10,3,28730,'Arcane Torrent',1),
+(10,3,28734,'Mana Tap',1),
+(10,3,28877,'Arcane Affinity',1),
+(10,3,34082,'Advantaged State(DND)',1),
+(10,4,81,'Dodge',1),
+(10,4,203,'Unarmed',1),
+(10,4,204,'Defense',1),
+(10,4,522,'SPELLDEFENSE(DND)',1),
+(10,4,669,'Language Orcish',1),
+(10,4,813,'Language Thalassian',1),
+(10,4,822,'Magic Resistance',1),
+(10,4,1180,'Daggers',1),
+(10,4,1752,'Sinister Strike',1),
+(10,4,2098,'Eviscerate',1),
+(10,4,2382,'Generic',1),
+(10,4,2479,'Honorless Target',1),
+(10,4,2567,'Thrown',1),
+(10,4,2764,'Throw',1),
+(10,4,3050,'Detect',1),
+(10,4,3365,'Opening',1),
+(10,4,6233,'Closing',1),
+(10,4,6246,'Closing',1),
+(10,4,6247,'Opening',1),
+(10,4,6477,'Opening',1),
+(10,4,6478,'Opening',1),
+(10,4,6603,'Attack',1),
+(10,4,7266,'Duel',1),
+(10,4,7267,'Grovel',1),
+(10,4,7355,'Stuck',1),
+(10,4,8386,'Attacking',1),
+(10,4,9077,'Leather',1),
+(10,4,9078,'Cloth',1),
+(10,4,9125,'Generic',1),
+(10,4,16092,'Defensive State(DND)',1),
+(10,4,21184,'Rogue Passive(DND)',1),
+(10,4,21651,'Opening',1),
+(10,4,21652,'Closing',1),
+(10,4,22027,'Remove Insignia',1),
+(10,4,22810,'Opening - No Text',1),
+(10,4,25046,'Arcane Torrent',1),
+(10,4,28734,'Mana Tap',1),
+(10,4,28877,'Arcane Affinity',1),
+(10,5,81,'Dodge',1),
+(10,5,198,'One-Handed Maces',1),
+(10,5,203,'Unarmed',1),
+(10,5,204,'Defense',1),
+(10,5,522,'SPELLDEFENSE(DND)',1),
+(10,5,585,'Smite',1),
+(10,5,669,'Language Orcish',1),
+(10,5,813,'Language Thalassian',1),
+(10,5,822,'Magic Resistance',1),
+(10,5,2050,'Lesser Heal',1),
+(10,5,2382,'Generic',1),
+(10,5,2479,'Honorless Target',1),
+(10,5,3050,'Detect',1),
+(10,5,3365,'Opening',1),
+(10,5,5009,'Wands',1),
+(10,5,5019,'Shoot',1),
+(10,5,6233,'Closing',1),
+(10,5,6246,'Closing',1),
+(10,5,6247,'Opening',1),
+(10,5,6477,'Opening',1),
+(10,5,6478,'Opening',1),
+(10,5,6603,'Attack',1),
+(10,5,7266,'Duel',1),
+(10,5,7267,'Grovel',1),
+(10,5,7355,'Stuck',1),
+(10,5,8386,'Attacking',1),
+(10,5,9078,'Cloth',1),
+(10,5,9125,'Generic',1),
+(10,5,21651,'Opening',1),
+(10,5,21652,'Closing',1),
+(10,5,22027,'Remove Insignia',1),
+(10,5,22810,'Opening - No Text',1),
+(10,5,28730,'Arcane Torrent',1),
+(10,5,28734,'Mana Tap',1),
+(10,5,28877,'Arcane Affinity',1),
+(10,6,81,'Dodge',1),
+(10,6,196,'One-Handed Axes',1),
+(10,6,197,'Two-Handed Axes',1),
+(10,6,200,'Polearms',1),
+(10,6,201,'One-Handed Swords',1),
+(10,6,202,'Two-Handed Swords',1),
+(10,6,203,'Unarmed',1),
+(10,6,204,'Defense',1),
+(10,6,522,'SPELLDEFENSE (DND)',1),
+(10,6,669,'Language Orcish',1),
+(10,6,674,'Dual Wield',1),
+(10,6,750,'Plate Mail',1),
+(10,6,813,'Language Thalassian',1),
+(10,6,822,'Magic Resistance',1),
+(10,6,1843,'Disarm',1),
+(10,6,2382,'Generic',1),
+(10,6,2479,'Honorless Target',1),
+(10,6,3050,'Detect',1),
+(10,6,3127,'Parry',1),
+(10,6,3275,'Linen Bandage',1),
+(10,6,3276,'Heavy Linen Bandage',1),
+(10,6,3277,'Wool Bandage',1),
+(10,6,3278,'Heavy Wool Bandage',1),
+(10,6,3365,'Opening',1),
+(10,6,6233,'Closing',1),
+(10,6,6246,'Closing',1),
+(10,6,6247,'Opening',1),
+(10,6,6477,'Opening',1),
+(10,6,6478,'Opening',1),
+(10,6,6603,'Attack',1),
+(10,6,7266,'Duel',1),
+(10,6,7267,'Grovel',1),
+(10,6,7355,'Stuck',1),
+(10,6,7928,'Silk Bandage',1),
+(10,6,7929,'Heavy Silk Bandage',1),
+(10,6,7934,'Anti-Venom',1),
+(10,6,8386,'Attacking',1),
+(10,6,8737,'Mail',1),
+(10,6,9077,'Leather',1),
+(10,6,9078,'Cloth',1),
+(10,6,9125,'Generic',1),
+(10,6,10840,'Mageweave Bandage',1),
+(10,6,10841,'Heavy Mageweave Bandage',1),
+(10,6,10846,'First Aid',1),
+(10,6,18629,'Runecloth Bandage',1),
+(10,6,18630,'Heavy Runecloth Bandage',1),
+(10,6,21651,'Opening',1),
+(10,6,21652,'Closing',1),
+(10,6,22027,'Remove Insignia',1),
+(10,6,22810,'Opening - No Text',1),
+(10,6,28877,'Arcane Affinity',1),
+(10,6,33391,'Journeyman Riding',1),
+(10,6,45462,'Plague Strike',1),
+(10,6,45477,'Icy Touch',1),
+(10,6,45902,'Blood Strike',1),
+(10,6,45903,'Offensive State (DND)',1),
+(10,6,45927,'Summon Friend',1),
+(10,6,47541,'Death Coil',1),
+(10,6,48266,'Blood Presence',1),
+(10,6,49410,'Forceful Deflection',1),
+(10,6,49576,'Death Grip',1),
+(10,6,50613,'Arcane Torrent',1),
+(10,6,52665,'Sigil',1),
+(10,6,59879,'Blood Plague',1),
+(10,6,59921,'Frost Fever',1),
+(10,6,61437,'Opening',1),
+(10,6,61455,'Runic Focus',1),
+(10,8,81,'Dodge',1),
+(10,8,133,'Fireball',1),
+(10,8,168,'Frost Armor',1),
+(10,8,203,'Unarmed',1),
+(10,8,204,'Defense',1),
+(10,8,227,'Staves',1),
+(10,8,522,'SPELLDEFENSE(DND)',1),
+(10,8,669,'Language Orcish',1),
+(10,8,813,'Language Thalassian',1),
+(10,8,822,'Magic Resistance',1),
+(10,8,2382,'Generic',1),
+(10,8,2479,'Honorless Target',1),
+(10,8,3050,'Detect',1),
+(10,8,3365,'Opening',1),
+(10,8,5009,'Wands',1),
+(10,8,5019,'Shoot',1),
+(10,8,6233,'Closing',1),
+(10,8,6246,'Closing',1),
+(10,8,6247,'Opening',1),
+(10,8,6477,'Opening',1),
+(10,8,6478,'Opening',1),
+(10,8,6603,'Attack',1),
+(10,8,7266,'Duel',1),
+(10,8,7267,'Grovel',1),
+(10,8,7355,'Stuck',1),
+(10,8,8386,'Attacking',1),
+(10,8,9078,'Cloth',1),
+(10,8,9125,'Generic',1),
+(10,8,21651,'Opening',1),
+(10,8,21652,'Closing',1),
+(10,8,22027,'Remove Insignia',1),
+(10,8,22810,'Opening - No Text',1),
+(10,8,28730,'Arcane Torrent',1),
+(10,8,28734,'Mana Tap',1),
+(10,8,28877,'Arcane Affinity',1),
+(10,9,81,'Dodge',1),
+(10,9,203,'Unarmed',1),
+(10,9,204,'Defense',1),
+(10,9,522,'SPELLDEFENSE(DND)',1),
+(10,9,669,'Language Orcish',1),
+(10,9,686,'Shadow Bolt',1),
+(10,9,687,'Demon Skin',1),
+(10,9,813,'Language Thalassian',1),
+(10,9,822,'Magic Resistance',1),
+(10,9,1180,'Daggers',1),
+(10,9,2382,'Generic',1),
+(10,9,2479,'Honorless Target',1),
+(10,9,3050,'Detect',1),
+(10,9,3365,'Opening',1),
+(10,9,5009,'Wands',1),
+(10,9,5019,'Shoot',1),
+(10,9,6233,'Closing',1),
+(10,9,6246,'Closing',1),
+(10,9,6247,'Opening',1),
+(10,9,6477,'Opening',1),
+(10,9,6478,'Opening',1),
+(10,9,6603,'Attack',1),
+(10,9,7266,'Duel',1),
+(10,9,7267,'Grovel',1),
+(10,9,7355,'Stuck',1),
+(10,9,8386,'Attacking',1),
+(10,9,9078,'Cloth',1),
+(10,9,9125,'Generic',1),
+(10,9,21651,'Opening',1),
+(10,9,21652,'Closing',1),
+(10,9,22027,'Remove Insignia',1),
+(10,9,22810,'Opening - No Text',1),
+(10,9,28730,'Arcane Torrent',1),
+(10,9,28734,'Mana Tap',1),
+(10,9,28877,'Arcane Affinity',1),
+(11,1,78,'Heroic Strike',1),
+(11,1,81,'Dodge',1),
+(11,1,107,'Block',1),
+(11,1,198,'One-Handed Maces',1),
+(11,1,201,'One-Handed Swords',1),
+(11,1,202,'Two-Handed Swords',1),
+(11,1,203,'Unarmed',1),
+(11,1,204,'Defense',1),
+(11,1,522,'SPELLDEFENSE(DND)',1),
+(11,1,668,'Language Common',1),
+(11,1,2382,'Generic',1),
+(11,1,2457,'Battle Stance',1),
+(11,1,2479,'Honorless Target',1),
+(11,1,3050,'Detect',1),
+(11,1,3365,'Opening',1),
+(11,1,5301,'Defensive State(DND)',1),
+(11,1,6233,'Closing',1),
+(11,1,6246,'Closing',1),
+(11,1,6247,'Opening',1),
+(11,1,6477,'Opening',1),
+(11,1,6478,'Opening',1),
+(11,1,6562,'Heroic Presence',1),
+(11,1,6603,'Attack',1),
+(11,1,7266,'Duel',1),
+(11,1,7267,'Grovel',1),
+(11,1,7355,'Stuck',1),
+(11,1,7376,'Defensive Stance Passive',0),
+(11,1,7381,'Berserker Stance Passive',0),
+(11,1,8386,'Attacking',1),
+(11,1,8737,'Mail',1),
+(11,1,9077,'Leather',1),
+(11,1,9078,'Cloth',1),
+(11,1,9116,'Shield',1),
+(11,1,9125,'Generic',1),
+(11,1,20579,'Shadow Resistance',1),
+(11,1,21156,'Battle Stance Passive',0),
+(11,1,21651,'Opening',1),
+(11,1,21652,'Closing',1),
+(11,1,22027,'Remove Insignia',1),
+(11,1,22810,'Opening - No Text',1),
+(11,1,28875,'Gemcutting',1),
+(11,1,28880,'Gift of the Naaru',1),
+(11,1,29932,'Language Draenei',1),
+(11,1,32215,'Victorious State',1),
+(11,2,81,'Dodge',1),
+(11,2,107,'Block',1),
+(11,2,198,'One-Handed Maces',1),
+(11,2,199,'Two-Handed Maces',1),
+(11,2,203,'Unarmed',1),
+(11,2,204,'Defense',1),
+(11,2,522,'SPELLDEFENSE(DND)',1),
+(11,2,635,'Holy Light',1),
+(11,2,668,'Language Common',1),
+(11,2,2382,'Generic',1),
+(11,2,2479,'Honorless Target',1),
+(11,2,3050,'Detect',1),
+(11,2,3365,'Opening',1),
+(11,2,6233,'Closing',1),
+(11,2,6246,'Closing',1),
+(11,2,6247,'Opening',1),
+(11,2,6477,'Opening',1),
+(11,2,6478,'Opening',1),
+(11,2,6562,'Heroic Presence',1),
+(11,2,6603,'Attack',1),
+(11,2,7266,'Duel',1),
+(11,2,7267,'Grovel',1),
+(11,2,7355,'Stuck',1),
+(11,2,8386,'Attacking',1),
+(11,2,8737,'Mail',1),
+(11,2,9077,'Leather',1),
+(11,2,9078,'Cloth',1),
+(11,2,9116,'Shield',1),
+(11,2,9125,'Generic',1),
+(11,2,21084,'Seal of Righteousness',1),
+(11,2,20579,'Shadow Resistance',1),
+(11,2,21651,'Opening',1),
+(11,2,21652,'Closing',1),
+(11,2,22027,'Remove Insignia',1),
+(11,2,22810,'Opening - No Text',1),
+(11,2,27762,'Libram',1),
+(11,2,28875,'Gemcutting',1),
+(11,2,28880,'Gift of the Naaru',1),
+(11,2,29932,'Language Draenei',1),
+(11,3,75,'Auto Shot',1),
+(11,3,81,'Dodge',1),
+(11,3,201,'One-Handed Swords',1),
+(11,3,203,'Unarmed',1),
+(11,3,204,'Defense',1),
+(11,3,522,'SPELLDEFENSE(DND)',1),
+(11,3,668,'Language Common',1),
+(11,3,2382,'Generic',1),
+(11,3,2479,'Honorless Target',1),
+(11,3,2973,'Raptor Strike',1),
+(11,3,3050,'Detect',1),
+(11,3,3365,'Opening',1),
+(11,3,5011,'Crossbows',1),
+(11,3,6233,'Closing',1),
+(11,3,6246,'Closing',1),
+(11,3,6247,'Opening',1),
+(11,3,6477,'Opening',1),
+(11,3,6478,'Opening',1),
+(11,3,6562,'Heroic Presence',1),
+(11,3,6603,'Attack',1),
+(11,3,7266,'Duel',1),
+(11,3,7267,'Grovel',1),
+(11,3,7355,'Stuck',1),
+(11,3,8386,'Attacking',1),
+(11,3,9077,'Leather',1),
+(11,3,9078,'Cloth',1),
+(11,3,9125,'Generic',1),
+(11,3,13358,'Defensive State(DND)',1),
+(11,3,20579,'Shadow Resistance',1),
+(11,3,21651,'Opening',1),
+(11,3,21652,'Closing',1),
+(11,3,22027,'Remove Insignia',1),
+(11,3,22810,'Opening - No Text',1),
+(11,3,24949,'Defensive State 2(DND)',1),
+(11,3,28875,'Gemcutting',1),
+(11,3,28880,'Gift of the Naaru',1),
+(11,3,29932,'Language Draenei',1),
+(11,3,34082,'Advantaged State(DND)',1),
+(11,5,81,'Dodge',1),
+(11,5,198,'One-Handed Maces',1),
+(11,5,203,'Unarmed',1),
+(11,5,204,'Defense',1),
+(11,5,522,'SPELLDEFENSE(DND)',1),
+(11,5,585,'Smite',1),
+(11,5,668,'Language Common',1),
+(11,5,2050,'Lesser Heal',1),
+(11,5,2382,'Generic',1),
+(11,5,2479,'Honorless Target',1),
+(11,5,3050,'Detect',1),
+(11,5,3365,'Opening',1),
+(11,5,5009,'Wands',1),
+(11,5,5019,'Shoot',1),
+(11,5,6233,'Closing',1),
+(11,5,6246,'Closing',1),
+(11,5,6247,'Opening',1),
+(11,5,6477,'Opening',1),
+(11,5,6478,'Opening',1),
+(11,5,6603,'Attack',1),
+(11,5,7266,'Duel',1),
+(11,5,7267,'Grovel',1),
+(11,5,7355,'Stuck',1),
+(11,5,8386,'Attacking',1),
+(11,5,9078,'Cloth',1),
+(11,5,9125,'Generic',1),
+(11,5,20579,'Shadow Resistance',1),
+(11,5,21651,'Opening',1),
+(11,5,21652,'Closing',1),
+(11,5,22027,'Remove Insignia',1),
+(11,5,22810,'Opening - No Text',1),
+(11,5,28875,'Gemcutting',1),
+(11,5,28878,'Inspiring Presence',1),
+(11,5,28880,'Gift of the Naaru',1),
+(11,5,29932,'Language Draenei',1),
+(11,6,81,'Dodge',1),
+(11,6,196,'One-Handed Axes',1),
+(11,6,197,'Two-Handed Axes',1),
+(11,6,200,'Polearms',1),
+(11,6,201,'One-Handed Swords',1),
+(11,6,202,'Two-Handed Swords',1),
+(11,6,203,'Unarmed',1),
+(11,6,204,'Defense',1),
+(11,6,522,'SPELLDEFENSE (DND)',1),
+(11,6,668,'Language Common',1),
+(11,6,674,'Dual Wield',1),
+(11,6,750,'Plate Mail',1),
+(11,6,1843,'Disarm',1),
+(11,6,2382,'Generic',1),
+(11,6,2479,'Honorless Target',1),
+(11,6,3050,'Detect',1),
+(11,6,3127,'Parry',1),
+(11,6,3275,'Linen Bandage',1),
+(11,6,3276,'Heavy Linen Bandage',1),
+(11,6,3277,'Wool Bandage',1),
+(11,6,3278,'Heavy Wool Bandage',1),
+(11,6,3365,'Opening',1),
+(11,6,6233,'Closing',1),
+(11,6,6246,'Closing',1),
+(11,6,6247,'Opening',1),
+(11,6,6477,'Opening',1),
+(11,6,6478,'Opening',1),
+(11,6,6562,'Heroic Presence',1),
+(11,6,6603,'Attack',1),
+(11,6,7266,'Duel',1),
+(11,6,7267,'Grovel',1),
+(11,6,7355,'Stuck',1),
+(11,6,7928,'Silk Bandage',1),
+(11,6,7929,'Heavy Silk Bandage',1),
+(11,6,7934,'Anti-Venom',1),
+(11,6,8386,'Attacking',1),
+(11,6,8737,'Mail',1),
+(11,6,9077,'Leather',1),
+(11,6,9078,'Cloth',1),
+(11,6,9125,'Generic',1),
+(11,6,10840,'Mageweave Bandage',1),
+(11,6,10841,'Heavy Mageweave Bandage',1),
+(11,6,10846,'First Aid',1),
+(11,6,18629,'Runecloth Bandage',1),
+(11,6,18630,'Heavy Runecloth Bandage',1),
+(11,6,21651,'Opening',1),
+(11,6,21652,'Closing',1),
+(11,6,22027,'Remove Insignia',1),
+(11,6,22810,'Opening - No Text',1),
+(11,6,28875,'Gemcutting',1),
+(11,6,29932,'Language Draenei',1),
+(11,6,33391,'Journeyman Riding',1),
+(11,6,45462,'Plague Strike',1),
+(11,6,45477,'Icy Touch',1),
+(11,6,45902,'Blood Strike',1),
+(11,6,45903,'Offensive State (DND)',1),
+(11,6,45927,'Summon Friend',1),
+(11,6,47541,'Death Coil',1),
+(11,6,48266,'Blood Presence',1),
+(11,6,49410,'Forceful Deflection',1),
+(11,6,49576,'Death Grip',1),
+(11,6,52665,'Sigil',1),
+(11,6,59539,'Shadow Resistance',1),
+(11,6,59545,'Gift of the Naaru',1),
+(11,6,59879,'Blood Plague',1),
+(11,6,59921,'Frost Fever',1),
+(11,6,61437,'Opening',1),
+(11,6,61455,'Runic Focus',1),
+(11,7,81,'Dodge',1),
+(11,7,107,'Block',1),
+(11,7,198,'One-Handed Maces',1),
+(11,7,203,'Unarmed',1),
+(11,7,204,'Defense',1),
+(11,7,227,'Staves',1),
+(11,7,331,'Healing Wave',1),
+(11,7,403,'Lightning Bolt',1),
+(11,7,522,'SPELLDEFENSE(DND)',1),
+(11,7,668,'Language Common',1),
+(11,7,2382,'Generic',1),
+(11,7,2479,'Honorless Target',1),
+(11,7,3050,'Detect',1),
+(11,7,3365,'Opening',1),
+(11,7,6233,'Closing',1),
+(11,7,6246,'Closing',1),
+(11,7,6247,'Opening',1),
+(11,7,6477,'Opening',1),
+(11,7,6478,'Opening',1),
+(11,7,6603,'Attack',1),
+(11,7,7266,'Duel',1),
+(11,7,7267,'Grovel',1),
+(11,7,7355,'Stuck',1),
+(11,7,8386,'Attacking',1),
+(11,7,9077,'Leather',1),
+(11,7,9078,'Cloth',1),
+(11,7,9116,'Shield',1),
+(11,7,9125,'Generic',1),
+(11,7,20579,'Shadow Resistance',1),
+(11,7,21651,'Opening',1),
+(11,7,21652,'Closing',1),
+(11,7,22027,'Remove Insignia',1),
+(11,7,22810,'Opening - No Text',1),
+(11,7,27763,'Totem',1),
+(11,7,28875,'Gemcutting',1),
+(11,7,28878,'Inspiring Presence',1),
+(11,7,28880,'Gift of the Naaru',1),
+(11,7,29932,'Language Draenei',1),
+(11,8,81,'Dodge',1),
+(11,8,133,'Fireball',1),
+(11,8,168,'Frost Armor',1),
+(11,8,203,'Unarmed',1),
+(11,8,204,'Defense',1),
+(11,8,227,'Staves',1),
+(11,8,522,'SPELLDEFENSE(DND)',1),
+(11,8,668,'Language Common',1),
+(11,8,2382,'Generic',1),
+(11,8,2479,'Honorless Target',1),
+(11,8,3050,'Detect',1),
+(11,8,3365,'Opening',1),
+(11,8,5009,'Wands',1),
+(11,8,5019,'Shoot',1),
+(11,8,6233,'Closing',1),
+(11,8,6246,'Closing',1),
+(11,8,6247,'Opening',1),
+(11,8,6477,'Opening',1),
+(11,8,6478,'Opening',1),
+(11,8,6603,'Attack',1),
+(11,8,7266,'Duel',1),
+(11,8,7267,'Grovel',1),
+(11,8,7355,'Stuck',1),
+(11,8,8386,'Attacking',1),
+(11,8,9078,'Cloth',1),
+(11,8,9125,'Generic',1),
+(11,8,20579,'Shadow Resistance',1),
+(11,8,21651,'Opening',1),
+(11,8,21652,'Closing',1),
+(11,8,22027,'Remove Insignia',1),
+(11,8,22810,'Opening - No Text',1),
+(11,8,28875,'Gemcutting',1),
+(11,8,28878,'Inspiring Presence',1),
+(11,8,28880,'Gift of the Naaru',1),
+(11,8,29932,'Language Draenei',1);
/*!40000 ALTER TABLE `playercreateinfo_spell` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2511,7 +12757,7 @@ CREATE TABLE `quest_end_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -2528,6 +12774,33 @@ LOCK TABLES `quest_end_scripts` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `quest_start_scripts`
+--
+
+DROP TABLE IF EXISTS `quest_start_scripts`;
+CREATE TABLE `quest_start_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `quest_start_scripts`
+--
+
+LOCK TABLES `quest_start_scripts` WRITE;
+/*!40000 ALTER TABLE `quest_start_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `quest_start_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `quest_mail_loot_template`
--
@@ -2555,33 +12828,6 @@ LOCK TABLES `quest_mail_loot_template` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `quest_start_scripts`
---
-
-DROP TABLE IF EXISTS `quest_start_scripts`;
-CREATE TABLE `quest_start_scripts` (
- `id` mediumint(8) unsigned NOT NULL default '0',
- `delay` int(10) unsigned NOT NULL default '0',
- `command` mediumint(8) unsigned NOT NULL default '0',
- `datalong` mediumint(8) unsigned NOT NULL default '0',
- `datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
- `x` float NOT NULL default '0',
- `y` float NOT NULL default '0',
- `z` float NOT NULL default '0',
- `o` float NOT NULL default '0'
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `quest_start_scripts`
---
-
-LOCK TABLES `quest_start_scripts` WRITE;
-/*!40000 ALTER TABLE `quest_start_scripts` DISABLE KEYS */;
-/*!40000 ALTER TABLE `quest_start_scripts` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `quest_template`
--
@@ -2607,6 +12853,8 @@ CREATE TABLE `quest_template` (
`QuestFlags` smallint(5) unsigned NOT NULL default '0',
`SpecialFlags` tinyint(3) unsigned NOT NULL default '0',
`CharTitleId` tinyint(3) unsigned NOT NULL default '0',
+ `PlayersSlain` tinyint(3) unsigned NOT NULL default '0',
+ `BonusTalents` tinyint(3) unsigned NOT NULL default '0',
`PrevQuestId` mediumint(9) NOT NULL default '0',
`NextQuestId` mediumint(9) NOT NULL default '0',
`ExclusiveGroup` mediumint(9) NOT NULL default '0',
@@ -2686,7 +12934,7 @@ CREATE TABLE `quest_template` (
`RewRepValue3` mediumint(9) NOT NULL default '0',
`RewRepValue4` mediumint(9) NOT NULL default '0',
`RewRepValue5` mediumint(9) NOT NULL default '0',
- `RewHonorableKills` mediumint(9) unsigned NOT NULL default '0',
+ `RewHonorableKills` int unsigned NOT NULL default '0',
`RewOrReqMoney` int(11) NOT NULL default '0',
`RewMoneyMaxLevel` int(10) unsigned NOT NULL default '0',
`RewSpell` mediumint(8) unsigned NOT NULL default '0',
@@ -2898,7 +13146,9 @@ DROP TABLE IF EXISTS `spell_affect`;
CREATE TABLE `spell_affect` (
`entry` smallint(5) unsigned NOT NULL default '0',
`effectId` tinyint(3) unsigned NOT NULL default '0',
- `SpellFamilyMask` bigint(20) unsigned NOT NULL default '0',
+ `SpellClassMask0` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask1` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask2` int(5) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`effectId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -2970,6 +13220,106 @@ CREATE TABLE `spell_elixir` (
LOCK TABLES `spell_elixir` WRITE;
/*!40000 ALTER TABLE `spell_elixir` DISABLE KEYS */;
+INSERT INTO `spell_elixir` VALUES
+( 673,0x2),
+( 2367,0x1),
+( 2374,0x1),
+( 2378,0x2),
+( 2380,0x2),
+( 3160,0x1),
+( 3164,0x1),
+( 3166,0x2),
+( 3219,0x2),
+( 3220,0x2),
+( 3222,0x2),
+( 3223,0x2),
+( 3593,0x2),
+( 7844,0x1),
+( 8212,0x1),
+(10667,0x1),
+(10668,0x2),
+(10669,0x1),
+(10692,0x2),
+(10693,0x2),
+(11319,0x2),
+(11328,0x1),
+(11334,0x1),
+(11348,0x2),
+(11349,0x2),
+(11364,0x2),
+(11371,0x2),
+(11390,0x1),
+(11396,0x2),
+(11405,0x1),
+(11406,0x1),
+(11474,0x1),
+(15231,0x2),
+(15233,0x2),
+(16321,0x2),
+(16322,0x1),
+(16323,0x1),
+(16325,0x2),
+(16326,0x2),
+(16327,0x2),
+(16329,0x1),
+(17038,0x1),
+(17535,0x2),
+(17537,0x1),
+(17538,0x1),
+(17539,0x1),
+(17624,0x3),
+(17626,0x3),
+(17627,0x3),
+(17629,0x3),
+(17628,0x3),
+(21920,0x1),
+(24361,0x2),
+(24363,0x2),
+(24382,0x2),
+(24383,0x2),
+(24417,0x2),
+(26276,0x1),
+(27652,0x2),
+(27653,0x2),
+(28486,0x1),
+(28488,0x1),
+(28490,0x1),
+(28491,0x1),
+(28493,0x1),
+(28497,0x1),
+(28501,0x1),
+(28502,0x2),
+(28503,0x1),
+(28509,0x2),
+(28514,0x2),
+(28518,0x3),
+(28519,0x3),
+(28520,0x3),
+(28521,0x3),
+(28540,0x3),
+(29348,0x2),
+(33720,0x1),
+(33721,0x1),
+(33726,0x1),
+(38954,0x1),
+(39625,0x2),
+(39626,0x2),
+(39627,0x2),
+(39628,0x2),
+(40567,0x7),
+(40568,0x7),
+(40572,0x7),
+(40573,0x7),
+(40575,0x7),
+(40576,0x7),
+(41608,0xB),
+(41609,0xB),
+(41610,0xB),
+(41611,0xB),
+(42735,0x3),
+(45373,0x1),
+(46837,0xB),
+(46839,0xB);
/*!40000 ALTER TABLE `spell_elixir` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2990,6 +13340,20 @@ CREATE TABLE `spell_learn_spell` (
LOCK TABLES `spell_learn_spell` WRITE;
/*!40000 ALTER TABLE `spell_learn_spell` DISABLE KEYS */;
+INSERT INTO `spell_learn_spell` VALUES
+(2842,8681),
+(5784,33388),
+(13819,33388),
+(17002,24867),
+(23161,33391),
+(23214,33391),
+(24866,24864),
+(33872,47179),
+(33873,47180),
+(33943,34090),
+(34767,33391),
+(34769,33388);
+
/*!40000 ALTER TABLE `spell_learn_spell` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3011,6 +13375,42 @@ CREATE TABLE `spell_pet_auras` (
LOCK TABLES `spell_pet_auras` WRITE;
/*!40000 ALTER TABLE `spell_pet_auras` DISABLE KEYS */;
+INSERT INTO `spell_pet_auras` VALUES
+(19028, 0, 25228),
+(19578, 0, 19579),
+(20895, 0, 24529),
+(28757, 0, 28758),
+(35029, 0, 35060),
+(35030, 0, 35061),
+(35691, 0, 35696),
+(35692, 0, 35696),
+(35693, 0, 35696),
+(23785, 416, 23759),
+(23822, 416, 23826),
+(23823, 416, 23827),
+(23824, 416, 23828),
+(23825, 416, 23829),
+(23785, 417, 23762),
+(23822, 417, 23837),
+(23823, 417, 23838),
+(23824, 417, 23839),
+(23825, 417, 23840),
+(23785, 1860, 23760),
+(23822, 1860, 23841),
+(23823, 1860, 23842),
+(23824, 1860, 23843),
+(23825, 1860, 23844),
+(23785, 1863, 23761),
+(23822, 1863, 23833),
+(23823, 1863, 23834),
+(23824, 1863, 23835),
+(23825, 1863, 23836),
+(23785, 17252, 35702),
+(23822, 17252, 35703),
+(23823, 17252, 35704),
+(23824, 17252, 35705),
+(23825, 17252, 35706);
+
/*!40000 ALTER TABLE `spell_pet_auras` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3051,7 +13451,7 @@ CREATE TABLE `spell_script_target` (
`type` tinyint(3) unsigned NOT NULL default '0',
`targetEntry` mediumint(8) unsigned NOT NULL default '0',
UNIQUE KEY `entry_type_target` (`entry`,`type`,`targetEntry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Spell System';
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Spell System';
--
-- Dumping data for table `spell_script_target`
@@ -3073,7 +13473,7 @@ CREATE TABLE `spell_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text character set latin1 NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -3130,6 +13530,93 @@ CREATE TABLE `spell_threat` (
LOCK TABLES `spell_threat` WRITE;
/*!40000 ALTER TABLE `spell_threat` DISABLE KEYS */;
+INSERT INTO `spell_threat` VALUES
+(78,20),
+(284,39),
+(285,59),
+(770,108),
+(778,108),
+(1608,78),
+(1672,180),
+(1715,61),
+(2139,300),
+(6343,17),
+(6572,155),
+(6574,195),
+(6809,89),
+(7372,101),
+(7373,141),
+(7379,235),
+(7386,100),
+(7405,140),
+(8198,40),
+(8204,64),
+(8205,96),
+(8380,180),
+(8972,118),
+(9745,148),
+(9749,108),
+(9880,178),
+(9881,207),
+(9907,108),
+(11556,43),
+(11564,98),
+(11565,118),
+(11566,137),
+(11567,145),
+(11580,143),
+(11581,180),
+(11596,220),
+(11597,261),
+(11600,275),
+(11601,315),
+(11775,395),
+(14274,200),
+(14921,415),
+(15629,300),
+(15630,400),
+(15631,500),
+(15632,600),
+(16857,108),
+(17735,200),
+(17750,300),
+(17751,450),
+(17752,600),
+(17390,108),
+(17391,108),
+(17392,108),
+(20569,100),
+(20736,100),
+(20925,20),
+(20927,30),
+(20928,40),
+(23922,160),
+(23923,190),
+(23924,220),
+(23925,250),
+(24394,580),
+(24583,5),
+(25225,300),
+(25231,130),
+(25258,286),
+(25264,215),
+(25269,400),
+(25286,175),
+(25288,355),
+(25289,60),
+(26993,127),
+(26996,176),
+(27011,127),
+(27179,54),
+(29704,230),
+(29707,196),
+(30324,220),
+(30356,323),
+(30357,483),
+(33745,285),
+(33878,129),
+(33986,180),
+(33987,232);
/*!40000 ALTER TABLE `spell_threat` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3311,5 +13798,5 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2008-10-14 13:23:35
+-- Dump completed on 2008-03-30 15:34:54
diff --git a/sql/world_scripts_full.sql b/sql/world_scripts_full.sql
index 5dccce0c283..0601dc6d0f1 100644
--- a/sql/world_scripts_full.sql
+++ b/sql/world_scripts_full.sql
@@ -1,5 +1,3 @@
-/* */
-
/* WORLD BOSS */
UPDATE `creature_template` SET `ScriptName`='boss_ysondre' WHERE `entry`=14887;
UPDATE `creature_template` SET `ScriptName`='boss_emeriss' WHERE `entry`=14889;
@@ -14,14 +12,15 @@ UPDATE `gameobject_template` SET `ScriptName`='go_northern_crystal_pylon' WHERE
UPDATE `gameobject_template` SET `ScriptName`='go_western_crystal_pylon' WHERE `entry`=164956;
UPDATE `gameobject_template` SET `ScriptName`='go_eastern_crystal_pylon' WHERE `entry`=164957;
UPDATE `gameobject_template` SET `ScriptName`='go_barov_journal' WHERE `entry`=180794;
-UPDATE `gameobject_template` SET `ScriptName`='go_field_repair_bot_74A' where `entry`= 179552;
+UPDATE `gameobject_template` SET `ScriptName`='go_field_repair_bot_74A' where `entry`=179552;
UPDATE `gameobject_template` SET `ScriptName`='go_orb_of_command' WHERE `entry`=179879;
UPDATE `gameobject_template` SET `ScriptName`='go_tablet_of_madness' WHERE `entry`=180368;
UPDATE `gameobject_template` SET `ScriptName`='go_tablet_of_the_seven' WHERE `entry`=169294;
-UPDATE `gameobject_template` set `ScriptName`='go_manticron_cube' where entry = 181713;
-UPDATE `gameobject_template` SET `ScriptName`='go_mausoleum_trigger' WHERE `entry` = 104593;
-UPDATE `gameobject_template` SET `ScriptName`='go_mausoleum_door' WHERE `entry` = 176594;
-UPDATE `gameobject_template` SET `scriptname`='go_crystal_prison' WHERE `entry`=185126;
+UPDATE `gameobject_template` set `ScriptName`='go_manticron_cube' WHERE `entry`=181713;
+UPDATE `gameobject_template` SET `ScriptName`='go_mausoleum_trigger' WHERE `entry`=104593;
+UPDATE `gameobject_template` SET `ScriptName`='go_mausoleum_door' WHERE `entry`=176594;
+UPDATE `gameobject_template` SET `ScriptName`='go_crystal_prison' WHERE `entry`=185126;
+UPDATE `gameobject_template` SET `ScriptName`='go_legion_obelisk' WHERE `entry` IN (185193,185195,185196,185197,185198);
/* GUARD */
UPDATE `creature_template` SET `ScriptName`='guard_azuremyst' WHERE `entry`=18038;
@@ -66,7 +65,8 @@ UPDATE `item_template` SET `ScriptName`='item_voodoo_charm' WHERE `entry`=8149;
UPDATE `item_template` SET `ScriptName`='item_vorenthals_presence' WHERE `entry`=30259;
UPDATE `item_template` SET `ScriptName`='item_yehkinyas_bramble' WHERE `entry`=10699;
UPDATE `item_template` SET `ScriptName`='item_zezzaks_shard' WHERE `entry`=31463;
-UPDATE `item_template` SET `ScriptName` = "item_only_for_flight" WHERE `entry` IN (34475, 34489, 24538);
+UPDATE `item_template` SET `ScriptName`='item_only_for_flight' WHERE `entry` IN (34475, 34489, 24538);
+UPDATE `item_template` SET `ScriptName`='item_inoculating_crystal' WHERE `entry`=22962;
/* NPC (usually creatures to be found in more than one specific zone) */
UPDATE `creature_template` SET `ScriptName`='npc_chicken_cluck' WHERE `entry`=620;
@@ -81,11 +81,11 @@ UPDATE `creature_template` SET `ScriptName`='npc_prof_leather' WHERE `entry` IN
UPDATE `creature_template` SET `ScriptName`='npc_prof_tailor' WHERE `entry` IN (22208,22212,22213);
UPDATE `creature_template` SET `ScriptName`='npc_rogue_trainer' WHERE `entry` IN (918,4163,3328,4583,5165,5167,13283,16684);
UPDATE `creature_template` SET `ScriptName`='npc_sayge' WHERE `entry`=14822;
-UPDATE `creature_template` SET `ScriptName`='npc_steam_tonk' WHERE `entry` = 19405;
-UPDATE `creature_template` SET `ScriptName`='npc_tonk_mine' WHERE `entry` = 15368;
+UPDATE `creature_template` SET `ScriptName`='npc_steam_tonk' WHERE `entry`=19405;
+UPDATE `creature_template` SET `ScriptName`='npc_tonk_mine' WHERE `entry`=15368;
UPDATE `creature_template` SET `ScriptName`='npc_winter_reveler' WHERE `entry`=15760;
UPDATE `creature_template` SET `ScriptName`='npc_brewfest_reveler' WHERE `entry`=24484;
-UPDATE `creature_template` SET `ScriptName`='npc_snake_trap_serpents' where entry in (19921, 19833);
+UPDATE `creature_template` SET `ScriptName`='npc_snake_trap_serpents' WHERE `entry` IN (19921, 19833);
/* */
/* ZONE */
@@ -96,19 +96,16 @@ UPDATE `creature_template` SET `ScriptName`='npc_ravenholdt' WHERE `entry`=13936
/* ALTERAC VALLEY */
-
/* ARATHI HIGHLANDS */
-UPDATE `creature_template` SET `ScriptName`='npc_professor_phizzlethorpe' where entry=2768;
+UPDATE `creature_template` SET `ScriptName`='npc_professor_phizzlethorpe' WHERE `entry`=2768;
/* ASHENVALE */
UPDATE `creature_template` SET `ScriptName`='mob_rizzle_sprysprocket' WHERE `entry`=23002;
UPDATE `creature_template` SET `ScriptName`='mob_depth_charge' WHERE `entry`=23025;
UPDATE `creature_template` SET `ScriptName`='npc_torek' WHERE `entry`=12858;
-UPDATE `creature_template` SET `ScriptName`='npc_ruul_snowhoof' WHERE `entry` = 12818;
+UPDATE `creature_template` SET `ScriptName`='npc_ruul_snowhoof' WHERE `entry`=12818;
-/* */
/* AUCHINDOUN */
-/* */
/* MANA TOMBS */
UPDATE `creature_template` SET `ScriptName`='boss_pandemonius' WHERE `entry`=18341;
@@ -119,8 +116,8 @@ UPDATE `creature_template` SET `ScriptName`='mob_ethereal_beacon' WHERE `entry`=
UPDATE `creature_template` SET `ScriptName`='boss_exarch_maladaar' WHERE `entry`=18373;
UPDATE `creature_template` SET `ScriptName`='mob_avatar_of_martyred' WHERE `entry`=18478;
UPDATE `creature_template` SET `ScriptName`='mob_stolen_soul' WHERE `entry`=18441;
-UPDATE `creature_template` SET `ScriptName`='boss_shirrak_the_dead_watcher' WHERE `entry` = '18371';
-UPDATE `creature_template` SET `ScriptName`='mob_focus_fire' WHERE `entry` = '18374';
+UPDATE `creature_template` SET `ScriptName`='boss_shirrak_the_dead_watcher' WHERE `entry`=18371;
+UPDATE `creature_template` SET `ScriptName`='mob_focus_fire' WHERE `entry`=18374;
/* SETHEKK HALLS */
UPDATE `instance_template` SET `script`='instance_sethekk_halls' WHERE `map`=556;
@@ -147,25 +144,24 @@ UPDATE `creature_template` SET `ScriptName`='npc_engineer_spark_overgrind' WHERE
UPDATE `creature_template` SET `ScriptName`='npc_injured_draenei' WHERE `entry`=16971;
UPDATE `creature_template` SET `ScriptName`='npc_susurrus' WHERE `entry`=17435;
UPDATE `creature_template` SET `ScriptName`='npc_magwin' WHERE `entry`=17312;
-UPDATE `creature_template` SET `ScriptName`='npc_geezle' where entry=17318;
-UPDATE `creature_template` SET `ScriptName`='mob_nestlewood_owlkin' where entry=16518;
+UPDATE `creature_template` SET `ScriptName`='npc_geezle' WHERE `entry`=17318;
+UPDATE `creature_template` SET `ScriptName`='mob_nestlewood_owlkin' WHERE `entry`=16518;
/* BADLANDS */
-
/* BARRENS */
UPDATE `creature_template` SET `ScriptName`='npc_beaten_corpse' WHERE `entry`=10668;
UPDATE `creature_template` SET `ScriptName`='npc_sputtervalve' WHERE `entry`=3442;
UPDATE `creature_template` SET `ScriptName`='npc_taskmaster_fizzule' WHERE `entry`=7233;
-UPDATE `creature_template` SET `ScriptName`='npc_twiggy_flathead' WHERE `entry` =6248;
-UPDATE `creature_template` SET `ScriptName`='npc_wizzlecrank_shredder' where entry=3439;
+UPDATE `creature_template` SET `ScriptName`='npc_twiggy_flathead' WHERE `entry`=6248;
+UPDATE `creature_template` SET `ScriptName`='npc_wizzlecrank_shredder' WHERE `entry`=3439;
/* BLACK TEMPLE */
UPDATE `instance_template` SET `script`='instance_black_temple' WHERE `map`=564;
UPDATE `creature_template` SET `ScriptName`='npc_akama_shade' WHERE `entry`=22990; -- Akama at Shade of Akama
UPDATE `creature_template` SET `ScriptName`='npc_akama_illidan' WHERE `entry`=23089; -- Akama at Illidan
UPDATE `creature_template` SET `ScriptName`='mob_illidari_council' WHERE `entry`=23426; -- Illidari Council controller mob
-UPDATE `creature_template` SET `ScriptName`='mob_blood_elf_council_voice_trigger' WHERE `entry` = 23499; -- Voice Trigger Mob (Controls Aggro + Enrage yells)
+UPDATE `creature_template` SET `ScriptName`='mob_blood_elf_council_voice_trigger' WHERE `entry` =23499; -- Voice Trigger Mob (Controls Aggro + Enrage yells)
UPDATE `creature_template` SET `ScriptName`='boss_veras_darkshadow' WHERE `entry`=22952; -- Rogue of Illidari Council
UPDATE `creature_template` SET `ScriptName`='boss_teron_gorefiend' WHERE `entry`=22871; -- Teron Gorefiend
UPDATE `creature_template` SET `ScriptName`='boss_supremus' WHERE `entry`=22898; -- Supremus
@@ -201,7 +197,6 @@ UPDATE `creature_template` SET `ScriptName`='npc_spirit_of_olum' WHERE `entry`=2
/* BLACKFATHOM DEPTHS */
-
/* BLACKROCK DEPTHS */
UPDATE `creature_template` SET `ScriptName`='boss_emperor_dagran_thaurissan' WHERE `entry`=9019;
UPDATE `creature_template` SET `ScriptName`='boss_moira_bronzebeard' WHERE `entry`=8929;
@@ -219,13 +214,14 @@ UPDATE `creature_template` SET `ScriptName`='boss_high_interrogator_gerstahn' WH
UPDATE `creature_template` SET `ScriptName`='boss_magmus' WHERE `entry`=9938;
UPDATE `creature_template` SET `ScriptName`='boss_seethrel' WHERE `entry`=9038;
UPDATE `creature_template` SET `ScriptName`='boss_vilerel' WHERE `entry`=9036;
-UPDATE `creature_template` SET `ScriptName`='phalanx' WHERE `entry`=9502;
UPDATE `creature_template` SET `ScriptName`='npc_lokhtos_darkbargainer' WHERE `entry`=12944;
UPDATE `creature_template` SET `ScriptName`='npc_kharan_mighthammer' WHERE `entry`=9021;
UPDATE `creature_template` SET `ScriptName`='npc_grimstone' WHERE `entry`=10096;
UPDATE `creature_template` SET `ScriptName`='npc_rocknot' WHERE `entry`=9503;
+UPDATE `creature_template` SET `ScriptName`='mob_phalanx' WHERE `entry`=9502;
/* BLACKROCK SPIRE */
+
/* BLACKROCK SPIRE Lower bosses */
UPDATE `creature_template` SET `ScriptName`='boss_highlord_omokk' WHERE `entry`=9196;
UPDATE `creature_template` SET `ScriptName`='boss_shadow_hunter_voshgajin' WHERE `entry`=9236;
@@ -269,6 +265,10 @@ UPDATE `creature_template` SET `ScriptName`='npc_fallen_hero_of_horde' WHERE `en
UPDATE `creature_template` SET `ScriptName`='mob_webbed_creature' WHERE `entry`=17680;
UPDATE `creature_template` SET `ScriptName`='npc_captured_sunhawk_agent' WHERE `entry`=17824;
+/* BOREAN TUNDRA */
+UPDATE `creature_template` SET `ScriptName`='npc_surristrasz' WHERE `entry`=24795;
+UPDATE `creature_template` SET `ScriptName`='npc_tiare' WHERE `entry`=30051;
+
/* BURNING STEPPES */
UPDATE `creature_template` SET `ScriptName`='npc_ragged_john' WHERE `entry`=9563;
@@ -306,10 +306,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_medivh_bm' WHERE `entry`=15608;
UPDATE `creature_template` SET `ScriptName`='npc_time_rift' WHERE `entry`=17838;
UPDATE `creature_template` SET `ScriptName`='npc_saat' WHERE `entry`=20201;
-
-/* */
/* COILFANG RESERVOIR */
-/* */
/* THE SLAVE PENS */
@@ -330,7 +327,7 @@ UPDATE `creature_template` SET `ScriptName`='mob_steamrigger_mechanic' WHERE `en
/* SERPENTSHRINE CAVERN */
UPDATE `instance_template` SET `script`='instance_serpent_shrine' WHERE `map`=548;
UPDATE `creature_template` SET `ScriptName`='boss_hydross_the_unstable' WHERE `entry`=21216;
-UPDATE `creature_template` SET `ScriptName`='mob_toxic_sporebat' WHERE entry=22140;
+UPDATE `creature_template` SET `ScriptName`='mob_toxic_sporebat' WHERE `entry`=22140;
/* Leotheras the Blind event */
UPDATE `creature_template` SET `ScriptName`='boss_leotheras_the_blind' WHERE `entry`=21215;
UPDATE `creature_template` SET `ScriptName`='boss_leotheras_the_blind_demonform' WHERE `entry`=21845;
@@ -344,9 +341,9 @@ UPDATE `creature_template` SET `ScriptName`='boss_fathomguard_caribdis' WHERE `e
UPDATE `creature_template` SET `ScriptName`='boss_morogrim_tidewalker' WHERE `entry`=21213;
UPDATE `creature_template` SET `ScriptName`='mob_water_globule' WHERE `entry`=21913;
/* The Lurker Below */
-UPDATE `creature_template` SET `ScriptName`='boss_the_lurker_below' WHERE `entry` = '21217';
-UPDATE `creature_template` SET `ScriptName`='mob_coilfang_ambusher' WHERE `entry` = '21865';
-UPDATE `creature_template` SET `ScriptName`='mob_coilfang_guardian' WHERE `entry` = '21873';
+UPDATE `creature_template` SET `ScriptName`='boss_the_lurker_below' WHERE `entry`=21217;
+UPDATE `creature_template` SET `ScriptName`='mob_coilfang_ambusher' WHERE `entry`=21865;
+UPDATE `creature_template` SET `ScriptName`='mob_coilfang_guardian' WHERE `entry`=21873;
/* Lady Vashj event */
UPDATE `creature_template` SET `ScriptName`='boss_lady_vashj' WHERE `entry`=21212;
UPDATE `creature_template` SET `ScriptName`='mob_enchanted_elemental' WHERE `entry`=21958;
@@ -356,10 +353,8 @@ UPDATE `creature_template` SET `ScriptName`='mob_coilfang_strider' WHERE `entry`
UPDATE `creature_template` SET `ScriptName`='mob_fathom_sporebat' WHERE `entry`=22140;
UPDATE `creature_template` SET `ScriptName`='mob_shield_generator_channel' WHERE `entry`=19870;
-
/* DARKSHORE */
-
/* DEADMINES */
UPDATE `instance_template` SET `script`='instance_deadmines' WHERE `map`=36;
UPDATE `item_template` SET `ScriptName`='item_defias_gunpowder' WHERE `entry`=5397;
@@ -369,23 +364,17 @@ UPDATE `gameobject_template` SET `ScriptName`='go_main_chambers_access_panel' WH
/* DEADWIND PASS */
-
/* DESOLACE */
-
/* DIRE MAUL */
-
/* DUN MOROGH */
UPDATE `creature_template` SET `ScriptName`='npc_narm_faulk' WHERE `entry`=6177;
-
/* DUROTAR */
-
/* DUSKWOOD */
-
/* DUSTWALLOW MARSH */
UPDATE `creature_template` SET `ScriptName`='mobs_risen_husk_spirit' WHERE `entry` IN (23554,23555);
UPDATE `creature_template` SET `ScriptName`='npc_deserter_agitator' WHERE `entry`=23602;
@@ -403,12 +392,11 @@ UPDATE `creature_template` SET `ScriptName`='npc_tirion_fordring' WHERE `entry`=
UPDATE `creature_template` SET `ScriptName`='npc_henze_faulk' WHERE `entry`=6172;
/* EVERSONG WOODS */
-UPDATE `creature_template` SET `ScriptName`='mobs_mana_tapped' WHERE `entry` IN (15273,15274,15294,15298,15367);
UPDATE `creature_template` SET `ScriptName`='npc_prospector_anvilward' WHERE `entry`=15420;
UPDATE `creature_template` SET `ScriptName`='npc_second_trial_paladin' WHERE `entry` IN (17809,17810,17811,17812);
UPDATE `creature_template` SET `ScriptName`='npc_second_trial_controller' WHERE `entry` IN (17807);
-UPDATE `creature_template` SET `ScriptName`='npc_apprentice_mirveda' where entry=15402;
-UPDATE `creature_template` SET `ScriptName`='npc_infused_crystal' where entry=16364;
+UPDATE `creature_template` SET `ScriptName`='npc_apprentice_mirveda' WHERE `entry`=15402;
+UPDATE `creature_template` SET `ScriptName`='npc_infused_crystal' WHERE `entry`=16364;
UPDATE `gameobject_template` SET `ScriptName`='go_second_trial' WHERE `entry` IN (182052);
/* FELWOOD */
@@ -422,12 +410,11 @@ UPDATE `creature_template` SET `ScriptName`='npc_screecher_spirit' WHERE `entry`
UPDATE `creature_template` SET `ScriptName`='npc_blood_knight_dawnstar' WHERE `entry`=17832;
UPDATE `creature_template` SET `ScriptName`='npc_budd_nedreck' WHERE `entry`=23559;
UPDATE `creature_template` SET `ScriptName`='npc_rathis_tomber' WHERE `entry`=16224;
-UPDATE `creature_template` SET `Scriptname`='npc_ranger_lilatha' WHERE entry=16295;
-update `gameobject_template` SET `ScriptName`='go_gilded_brazier' where entry = 181956;
+UPDATE `creature_template` SET `Scriptname`='npc_ranger_lilatha' WHERE `entry`=16295;
+update `gameobject_template` SET `ScriptName`='go_gilded_brazier' WHERE `entry`=181956;
/* GNOMEREGAN */
-
/* GRUUL'S LAIR */
UPDATE `instance_template` SET `script`='instance_gruuls_lair' WHERE `map` =565;
UPDATE `creature_template` SET `ScriptName`='boss_gruul' WHERE `entry`=19044;
@@ -438,13 +425,11 @@ UPDATE `creature_template` SET `ScriptName`='boss_blindeye_the_seer' WHERE `entr
UPDATE `creature_template` SET `ScriptName`='boss_olm_the_summoner' WHERE `entry`=18834;
UPDATE `creature_template` SET `ScriptName`='boss_krosh_firehand' WHERE `entry`=18832;
-/* */
/* HELLFIRE CITADEL */
-/* */
/* BLOOD FURNACE */
/* The Maker,Broggok,Kelidan,Broggok's cloud */
-UPDATE `instance_template` SET `script` = 'instance_blood_furnace' WHERE `map` = '542';
+UPDATE `instance_template` SET `script`='instance_blood_furnace' WHERE `map`=542;
UPDATE `creature_template` SET `ScriptName`='boss_the_maker' WHERE `entry`=17381;
UPDATE `creature_template` SET `ScriptName`='boss_broggok' WHERE `entry`=17380;
UPDATE `creature_template` SET `ScriptName`='boss_kelidan_the_breaker' WHERE `entry`=17377;
@@ -455,10 +440,10 @@ UPDATE `creature_template` SET `ScriptName`='mob_shadowmoon_channeler' WHERE `en
/* Vazruden,Omor the Unscarred,Watchkeeper Gargolmar */
UPDATE `creature_template` SET `ScriptName`='boss_omor_the_unscarred' WHERE `entry`=17308;
UPDATE `creature_template` SET `ScriptName`='boss_watchkeeper_gargolmar' WHERE `entry`=17306;
-UPDATE `creature_template` SET `ScriptName`='boss_vazruden_the_herald' WHERE `entry` = '17307';
-UPDATE `creature_template` SET `ScriptName`='boss_vazruden' WHERE `entry` = '17537';
-UPDATE `creature_template` SET `ScriptName`='boss_nazan' WHERE `entry` = '17536';
-UPDATE `creature_template` SET `ScriptName`='mob_hellfire_sentry' WHERE `entry` = '17517';
+UPDATE `creature_template` SET `ScriptName`='boss_vazruden_the_herald' WHERE `entry`=17307;
+UPDATE `creature_template` SET `ScriptName`='boss_vazruden' WHERE `entry`=17537;
+UPDATE `creature_template` SET `ScriptName`='boss_nazan' WHERE `entry`=17536;
+UPDATE `creature_template` SET `ScriptName`='mob_hellfire_sentry' WHERE `entry`=17517;
/* SHATTERED HALLS */
/* Nethekurse and his spawned shadowfissure */
@@ -473,9 +458,9 @@ UPDATE `instance_template` SET `script`='instance_shattered_halls' WHERE `map`=5
/* MAGTHERIDON'S LAIR */
UPDATE `instance_template` SET `script`='instance_magtheridons_lair' WHERE `map`=544;
UPDATE `gameobject_template` SET `ScriptName`='go_manticron_cube' WHERE `entry`=181713;
-UPDATE `creature_template` SET `ScriptName`='boss_magtheridon' WHERE `entry` =17257;
+UPDATE `creature_template` SET `ScriptName`='boss_magtheridon' WHERE `entry`=17257;
UPDATE `creature_template` SET `ScriptName`='mob_hellfire_channeler' WHERE `entry`=17256;
-update `creature_template` SET `ScriptName`='mob_abyssal' where entry = 17454;
+update `creature_template` SET `ScriptName`='mob_abyssal' WHERE `entry`=17454;
/* HELLFIRE PENINSULA */
UPDATE `creature_template` SET `ScriptName`='boss_doomlord_kazzak' WHERE `entry`=18728;
@@ -486,10 +471,8 @@ UPDATE `creature_template` SET `ScriptName`='npc_wounded_blood_elf' WHERE `entry
/* HILLSBRAD FOOTHILLS */
-
/* HINTERLANDS */
-
/* IRONFORGE */
UPDATE `creature_template` SET `ScriptName`='npc_royal_historian_archesonus' WHERE `entry`=8879;
@@ -497,7 +480,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_royal_historian_archesonus' WHE
UPDATE `creature_template` SET `ScriptName`='npc_ayren_cloudbreaker' WHERE `entry`=25059;
UPDATE `creature_template` SET `ScriptName`='npc_converted_sentry' WHERE `entry`=24981;
UPDATE `creature_template` SET `ScriptName`='npc_unrestrained_dragonhawk' WHERE `entry`=25236;
-UPDATE `creature_template` SET `ScriptName`='npc_greengill_slave' where entry=25084;
+UPDATE `creature_template` SET `ScriptName`='npc_greengill_slave' WHERE `entry`=25084;
UPDATE `item_template` SET `ScriptName`='item_arcane_charges' WHERE `entry`=34475;
/* KARAZHAN */
@@ -538,7 +521,7 @@ UPDATE `creature_template` SET `ScriptName`='netherspite_infernal' WHERE `entry`
UPDATE `creature_template` SET `ScriptName`='npc_berthold' WHERE `entry`=16153;
UPDATE `creature_template` SET `ScriptName`='npc_barnes' WHERE `entry`=16812;
UPDATE `creature_template` SET `ScriptName`='npc_grandmother' WHERE `entry`=17603;
-UPDATE `creature_template` SET `ScriptName`='npc_image_of_medivh' where entry = 17651;
+UPDATE `creature_template` SET `ScriptName`='npc_image_of_medivh' WHERE `entry`=17651;
/* LOCH MODAN */
UPDATE `creature_template` SET `ScriptName`='npc_mountaineer_pebblebitty' WHERE `entry`=3836;
@@ -593,7 +576,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_bunthen_plainswind' WHERE `entr
UPDATE `creature_template` SET `ScriptName`='npc_great_bear_spirit' WHERE `entry`=11956;
UPDATE `creature_template` SET `ScriptName`='npc_silva_filnaveth' WHERE `entry`=11800;
UPDATE `creature_template` SET `ScriptName`='npc_clintar_dreamwalker' WHERE `entry`=22834;
-UPDATE `creature_template` SET `ScriptName`='npc_clintar_spirit' WHERE `entry` = 22916;
+UPDATE `creature_template` SET `ScriptName`='npc_clintar_spirit' WHERE `entry`=22916;
/* MULGORE */
UPDATE `creature_template` SET `ScriptName`='npc_skorn_whitecloud' WHERE `entry`=3052;
@@ -620,7 +603,6 @@ UPDATE `creature_template` SET `ScriptName`='boss_heigan' WHERE `entry`=15936;
UPDATE `creature_template` SET `ScriptName`='boss_loatheb' WHERE `entry`=16011;
UPDATE `creature_template` SET `ScriptName`='boss_razuvious' WHERE `entry`=16061;
UPDATE `creature_template` SET `ScriptName`='boss_gothik' WHERE `entry`=16060;
-UPDATE `creature_template` SET `ScriptName`='boss_highlord_mograine' WHERE `entry`=16062;
UPDATE `creature_template` SET `ScriptName`='boss_thane_korthazz' WHERE `entry`=16064;
UPDATE `creature_template` SET `ScriptName`='boss_sir_zeliek' WHERE `entry`=16063;
UPDATE `creature_template` SET `ScriptName`='boss_lady_blaumeux' WHERE `entry`=16065;
@@ -632,15 +614,17 @@ UPDATE `creature_template` SET `ScriptName`='boss_stalagg' WHERE `entry`=15929;
UPDATE `creature_template` SET `ScriptName`='boss_fugen' WHERE `entry`=15930;
UPDATE `creature_template` SET `ScriptName`='boss_sapphiron' WHERE `entry`=15989;
UPDATE `creature_template` SET `ScriptName`='boss_kelthuzad' WHERE `entry`=15990;
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=16062;
+UPDATE `creature_template` SET `ScriptName`='boss_rivendare_naxx' WHERE `entry`=30549;
/* NETHERSTORM */
UPDATE `gameobject_template` SET `ScriptName`='go_manaforge_control_console' WHERE `entry` IN (183770,183956,184311,184312);
UPDATE `creature_template` SET `ScriptName`='npc_manaforge_control_console' WHERE `entry` IN (20209,20417,20418,20440);
UPDATE `creature_template` SET `ScriptName`='npc_protectorate_nether_drake' WHERE `entry`=20903;
UPDATE `creature_template` SET `ScriptName`='npc_veronia' WHERE `entry`=20162;
-UPDATE `creature_template` SET `ScriptName`='mob_phase_hunter' WHERE `entry` =18879;
-UPDATE `creature_template` SET `ScriptName`='npc_professor_dabiri' where entry=20907;
-UPDATE `creature_template` SET `ScriptName`='npc_bessy' WHERE entry = 20415;
+UPDATE `creature_template` SET `ScriptName`='mob_phase_hunter' WHERE `entry`=18879;
+UPDATE `creature_template` SET `ScriptName`='npc_professor_dabiri' WHERE `entry`=20907;
+UPDATE `creature_template` SET `ScriptName`='npc_bessy' WHERE `entry`=20415;
/* ONYXIA'S LAIR */
UPDATE `creature_template` SET `ScriptName`='boss_onyxia' WHERE `entry`=10184;
@@ -652,14 +636,13 @@ UPDATE `creature_template` SET `ScriptName`='npc_thrall_warchief' WHERE `entry`=
/* RAGEFIRE CHASM */
-
/* RAZORFEN DOWNS */
UPDATE `creature_template` SET `ScriptName`='boss_amnennar_the_coldbringer' WHERE `entry`=7358;
/* RAZORFEN KRAUL */
-UPDATE `creature_template` SET `Scriptname`='npc_willix' WHERE entry=4508;
-/* REDRIDGE MOUNTAINS */
+UPDATE `creature_template` SET `Scriptname`='npc_willix' WHERE `entry`=4508;
+/* REDRIDGE MOUNTAINS */
/* RUINS OF AHN'QIRAJ */
UPDATE `instance_template` SET `script`='instance_ruins_of_ahnqiraj' WHERE `map`=509;
@@ -676,9 +659,9 @@ UPDATE `creature_template` SET `ScriptName`='boss_houndmaster_loksey' WHERE `ent
UPDATE `creature_template` SET `ScriptName`='boss_interrogator_vishas' WHERE `entry`=3983;
UPDATE `creature_template` SET `ScriptName`='boss_scarlet_commander_mograine' WHERE `entry`=3976;
UPDATE `creature_template` SET `ScriptName`='boss_scorn' WHERE `entry`=14693;
-UPDATE `creature_template` SET `ScriptName`='boss_headless_horseman' WHERE `entry` = 23682;
-UPDATE `creature_template` SET `ScriptName`='mob_head' WHERE `entry` = 23775;
-UPDATE `creature_template` SET `ScriptName`='mob_pulsing_pumpkin' WHERE `entry` = 23694;
+UPDATE `creature_template` SET `ScriptName`='boss_headless_horseman' WHERE `entry`=23682;
+UPDATE `creature_template` SET `ScriptName`='mob_head' WHERE `entry`=23775;
+UPDATE `creature_template` SET `ScriptName`='mob_pulsing_pumpkin' WHERE `entry`=23694;
UPDATE `creature_template` SET `ScriptName`='mob_wisp_invis' WHERE `entry`=23686;
UPDATE `creature_template` SET `ScriptName`='mob_wisp_invis' WHERE `entry`=24034;
UPDATE `creature_template` SET `ScriptName`='mob_scarlet_trainee' WHERE `entry`=6575;
@@ -719,22 +702,23 @@ UPDATE `creature_template` SET `ScriptName`='npc_neltharaku' WHERE `entry`=21657
UPDATE `creature_template` SET `ScriptName`='npc_oronok_tornheart' WHERE `entry`=21183;
UPDATE `creature_template` SET `ScriptName`='mob_mature_netherwing_drake' WHERE `entry`=21648;
UPDATE `creature_template` SET `ScriptName`='mob_enslaved_netherwing_drake' WHERE `entry`=21722;
-UPDATE `creature_template` SET `ScriptName`='npc_overlord_morghor' WHERE entry= 23139;
-UPDATE `creature_template` SET `ScriptName`='' WHERE entry=23141;
+UPDATE `creature_template` SET `ScriptName`='npc_overlord_morghor' WHERE `entry`=23139;
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=23141;
UPDATE `creature_template` SET `ScriptName`='mob_illidari_spawn' WHERE `entry` IN (22075, 22074, 19797);
-UPDATE `creature_template` SET `ScriptName`='mob_torloth_the_magnificent' WHERE `entry`='22076';
+UPDATE `creature_template` SET `ScriptName`='mob_torloth_the_magnificent' WHERE `entry`=22076;
UPDATE `creature_template` SET `ScriptName`='npc_lord_illidan_stormrage' WHERE `entry`=22083;
UPDATE `creature_template` SET `ScriptName`='npc_earthmender_wilda' WHERE `entry`=21027;
+UPDATE `creature_template` SET `ScriptName`='npc_enraged_spirit' WHERE `entry` IN (21050, 21061, 21060, 21059);
/* SHATTRATH */
UPDATE `creature_template` SET `ScriptName`='npc_raliq_the_drunk' WHERE `entry`=18585;
UPDATE `creature_template` SET `ScriptName`='npc_salsalabim' WHERE `entry`=18584;
UPDATE `creature_template` SET `ScriptName`='npc_shattrathflaskvendors' WHERE `entry` IN (23483,23484);
UPDATE `creature_template` SET `ScriptName`='npc_zephyr' WHERE `entry`=25967;
-UPDATE `creature_template` SET `ScriptName`='npc_kservant' WHERE `entry` = 19685;
-UPDATE `creature_template` SET `ScriptName`='npc_dirty_larry' where entry=19720;
+UPDATE `creature_template` SET `ScriptName`='npc_kservant' WHERE `entry`=19685;
+UPDATE `creature_template` SET `ScriptName`='npc_dirty_larry' WHERE `entry`=19720;
UPDATE `creature_template` SET `ScriptName`='npc_ishanah' WHERE `entry`=18538;
-UPDATE `creature_template` SET `ScriptName`='npc_khadgar' where entry=18166;
+UPDATE `creature_template` SET `ScriptName`='npc_khadgar' WHERE `entry`=18166;
/* SILITHUS */
UPDATE `creature_template` SET `ScriptName`='npcs_rutgar_and_frankal' WHERE `entry` IN (15170,15171);
@@ -746,13 +730,13 @@ UPDATE `creature_template` SET `ScriptName`='npc_blood_knight_stillblade' WHERE
/* SILVERPINE FOREST */
UPDATE `creature_template` SET `ScriptName`='npc_astor_hadren' WHERE `entry`=6497;
-UPDATE `creature_template` SET `ScriptName`='npc_deathstalker_erland' where entry=1978;
+UPDATE `creature_template` SET `ScriptName`='npc_deathstalker_erland' WHERE `entry`=1978;
/* STOCKADES */
/* STONETALON MOUNTAINS */
UPDATE `creature_template` SET `ScriptName`='npc_braug_dimspirit' WHERE `entry`=4489;
-UPDATE `creature_template` SET `ScriptName`='npc_kaya_flathoof' where entry=11856;
+UPDATE `creature_template` SET `ScriptName`='npc_kaya_flathoof' WHERE `entry`=11856;
/* STORMWIND CITY */
UPDATE `creature_template` SET `ScriptName`='npc_archmage_malin' WHERE `entry`=2708;
@@ -760,6 +744,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_bartleby' WHERE `entry`=6090;
UPDATE `creature_template` SET `ScriptName`='npc_dashel_stonefist' WHERE `entry`=4961;
UPDATE `creature_template` SET `ScriptName`='npc_general_marcus_jonathan' WHERE `entry`=466;
UPDATE `creature_template` SET `ScriptName`='npc_lady_katrana_prestor' WHERE `entry`=1749;
+UPDATE `creature_template` SET `ScriptName`='npc_stormwind_harbor_taxi' WHERE `entry`=29154;
/* STRANGLETHORN VALE */
UPDATE `creature_template` SET `ScriptName`='mob_yenniku' WHERE `entry`=2530;
@@ -786,32 +771,28 @@ UPDATE `creature_template` SET `ScriptName`='mob_freed_soul' WHERE `entry`=11136
/* SUNKEN TEMPLE */
/* SUNWELL PLATEAU */
-update `instance_template` set `script` = 'instance_sunwell_plateau' where map = 580;
-UPDATE `creature_template` SET `ScriptName` = 'boss_brutallus' WHERE entry = 24882;
-UPDATE `creature_template` SET `ScriptName` = 'boss_felmyst' WHERE `entry` = 25038;
-UPDATE `creature_template` SET `ScriptName` = 'mob_felmyst_vapor' WHERE `entry` = 25265;
-UPDATE `creature_template` SET `ScriptName` = 'mob_felmyst_trail' WHERE `entry` = 25267;
-update `creature_template` set `ScriptName` = 'boss_sacrolash' where entry = 25165;
-update `creature_template` set `ScriptName` = 'boss_alythess' where entry = 25166;
-update `creature_template` set `ScriptName` = 'mob_shadow_image' where entry = 25214;
+update `instance_template` set `script` ='instance_sunwell_plateau' where map =580;
+UPDATE `creature_template` SET `ScriptName`='boss_brutallus' WHERE `entry` =24882;
+UPDATE `creature_template` SET `ScriptName`='boss_felmyst' WHERE `entry`=25038;
+UPDATE `creature_template` SET `ScriptName`='mob_felmyst_vapor' WHERE `entry`=25265;
+UPDATE `creature_template` SET `ScriptName`='mob_felmyst_trail' WHERE `entry`=25267;
+update `creature_template` set `ScriptName`='boss_sacrolash' WHERE `entry`=25165;
+update `creature_template` set `ScriptName`='boss_alythess' WHERE `entry`=25166;
+update `creature_template` set `ScriptName`='mob_shadow_image' WHERE `entry`=25214;
/* SWAMP OF SORROWS */
-
/* TANARIS */
UPDATE `creature_template` SET `ScriptName`='mob_aquementas' WHERE `entry`=9453;
UPDATE `creature_template` SET `ScriptName`='npc_custodian_of_time' WHERE `entry`=20129;
UPDATE `creature_template` SET `ScriptName`='npc_marin_noggenfogger' WHERE `entry`=7564;
UPDATE `creature_template` SET `ScriptName`='npc_steward_of_time' WHERE `entry`=20142;
UPDATE `creature_template` SET `ScriptName`='npc_stone_watcher_of_norgannon' WHERE `entry`=7918;
-UPDATE `creature_template` SET `ScriptName` = 'npc_OOX17' WHERE `entry` = 7784;
+UPDATE `creature_template` SET `ScriptName`='npc_OOX17' WHERE `entry`=7784;
/* TELDRASSIL */
-
-/* */
/* TEMPEST KEEP */
-/* */
/* THE MECHANAR */
UPDATE `creature_template` SET `ScriptName`='boss_gatewatcher_iron_hand' WHERE `entry`=19710;
@@ -837,8 +818,8 @@ UPDATE `creature_template` SET `ScriptName`='npc_millhouse_manastorm' WHERE `ent
/* THE EYE */
UPDATE `instance_template` SET `script`='instance_the_eye' WHERE `map`=550;
-UPDATE `gameobject_template` SET `ScriptName` = 'go_kael_orb' WHERE `entry` = 188173;
-UPDATE `gameobject_template` SET `ScriptName` = 'go_movie_orb' WHERE `entry` = 187578;
+UPDATE `gameobject_template` SET `ScriptName`='go_kael_orb' WHERE `entry`=188173;
+UPDATE `gameobject_template` SET `ScriptName`='go_movie_orb' WHERE `entry`=187578;
/* The Eye Trash Mobs */
UPDATE `creature_template` SET `ScriptName`='mob_crystalcore_devastator' WHERE `entry`=20040;
/* Void Reaver event */
@@ -891,10 +872,10 @@ UPDATE `creature_template` SET `ScriptName`='mob_netherweb_victim' WHERE `entry`
UPDATE `creature_template` SET `ScriptName`='mob_rotting_forest_rager' WHERE `entry`=22307;
UPDATE `creature_template` SET `ScriptName`='npc_floon' WHERE `entry`=18588;
UPDATE `creature_template` SET `ScriptName`='npc_skyguard_handler_irena' WHERE `entry`=23413;
-UPDATE `creature_template` SET `ScriptName`='npc_isla_starmane' where entry=18760;
+UPDATE `creature_template` SET `ScriptName`='npc_isla_starmane' WHERE `entry`=18760;
/* THOUSAND NEEDLES */
-UPDATE `creature_template` SET `ScriptName` = 'npc_swiftmountain' WHERE `entry` = 10427;
+UPDATE `creature_template` SET `ScriptName`='npc_swiftmountain' WHERE `entry`=10427;
UPDATE `creature_template` SET `ScriptName` = 'npc_plucky' WHERE `entry` = '6626';
/* THUNDER BLUFF */
@@ -909,32 +890,36 @@ UPDATE `creature_template` SET `ScriptName`='boss_ironaya' WHERE `entry`=7228;
UPDATE `creature_template` SET `ScriptName`='mob_jadespine_basilisk' WHERE `entry`=4863;
UPDATE `creature_template` SET `ScriptName`='npc_lore_keeper_of_norgannon' WHERE `entry`=7172;
UPDATE `creature_template` SET `ScriptName`='boss_archaedas' WHERE `entry`=2748;
-UPDATE `creature_template` SET `ScriptName`='mob_archaedas_minions' WHERE `entry` IN ('7309', '7077', '7076', '10120');
+UPDATE `creature_template` SET `ScriptName`='mob_archaedas_minions' WHERE `entry` IN (7309, 7077, 7076, 10120);
UPDATE `creature_template` SET `ScriptName`='mob_stonekeepers' WHERE `entry`=4857;
UPDATE `gameobject_template` SET `ScriptName`='go_altar_of_the_keepers' WHERE `entry`=130511;
UPDATE `gameobject_template` SET `ScriptName`='go_altar_of_archaedas' WHERE `entry`=133234;
/* UN'GORO CRATER */
-UPDATE `creature_template` SET `ScriptName` = 'npc_ame' WHERE `entry` = 9623;
+UPDATE `creature_template` SET `ScriptName`='npc_ame' WHERE `entry`=9623;
/* UNDERCITY */
UPDATE `creature_template` SET `ScriptName`='npc_lady_sylvanas_windrunner' WHERE `entry`=10181;
UPDATE `creature_template` SET `ScriptName`='npc_highborne_lamenter' WHERE `entry`=21628;
UPDATE `creature_template` SET `ScriptName`='npc_parqual_fintallas' WHERE `entry`=4488;
-/* WAILING CAVERNS */
+/* UTGARDE KEEP */
+UPDATE `creature_template` SET `scriptname` = 'boss_keleseth' WHERE `entry` = '23953';
+UPDATE `creature_template` SET `scriptname` = 'mob_frost_tomb' WHERE `entry` = '23965';
+UPDATE `instance_template` SET `script`='instance_utgarde_keep' WHERE `map`= '574';
+UPDATE `creature_template` SET `ScriptName`='mob_vrykul_skeleton' WHERE `entry`=23970;
+/* WAILING CAVERNS */
/* WESTERN PLAGUELANDS */
UPDATE `creature_template` SET `ScriptName`='npcs_dithers_and_arbington' WHERE `entry` IN (11056,11057);
UPDATE `creature_template` SET `ScriptName`='npc_the_scourge_cauldron' WHERE `entry`=11152;
/* WESTFALL */
-UPDATE `creature_template` SET `ScriptName`='npc_defias_traitor' WHERE `entry`='467';
+UPDATE `creature_template` SET `ScriptName`='npc_defias_traitor' WHERE `entry`=467;
/* WETLANDS */
-
/* WINTERSPRING */
UPDATE `creature_template` SET `ScriptName`='npc_lorax' WHERE `entry`=10918;
UPDATE `creature_template` SET `ScriptName`='npc_rivern_frostwind' WHERE `entry`=10618;
@@ -945,7 +930,7 @@ UPDATE `creature_template` SET `ScriptName`='npcs_ashyen_and_keleth' WHERE `entr
UPDATE `creature_template` SET `ScriptName`='npc_cooshcoosh' WHERE `entry`=18586;
UPDATE `creature_template` SET `ScriptName`='npc_elder_kuruti' WHERE `entry`=18197;
UPDATE `creature_template` SET `ScriptName`='npc_mortog_steamhead' WHERE `entry`=23373;
-UPDATE `creature_template` SET `ScriptName`='npc_kayra_longmane' where entry=17969;
+UPDATE `creature_template` SET `ScriptName`='npc_kayra_longmane' WHERE `entry`=17969;
/* ZUL'AMAN */
UPDATE `instance_template` SET `script` = 'instance_zulaman' WHERE `map`=568;
@@ -972,7 +957,7 @@ UPDATE `creature_template` SET `ScriptName` = 'boss_koragg' WHERE `entry` =24247
UPDATE `creature_template` SET `ScriptName` = 'boss_zuljin' WHERE `entry` =23863;
UPDATE `creature_template` SET `ScriptName` = 'do_nothing' WHERE `entry` = '24187';
UPDATE `creature_template` SET `ScriptName` = 'mob_zuljin_vortex' WHERE `entry` = '24136';
-UPDATE `creature_template` SET `ScriptName`='npc_zulaman_hostage' WHERE entry IN ('24001','23790','23999','24024');
+UPDATE `creature_template` SET `ScriptName` = 'npc_zulaman_hostage' WHERE `entry` IN (23790, 23999, 24024, 24001);
/* ZUL'FARRAK */
UPDATE `creature_template` SET `ScriptName`='npc_sergeant_bly' WHERE `entry`=7604;
diff --git a/sql/world_scripts_structure.sql b/sql/world_scripts_structure.sql
index aeb1eb6b38c..57556ff5910 100644
--- a/sql/world_scripts_structure.sql
+++ b/sql/world_scripts_structure.sql
@@ -1,5 +1,5 @@
DROP TABLE IF EXISTS `custom_texts`;
-CREATE TABLE `custom_texts` (
+CREATE TABLE IF NOT EXISTS `custom_texts` (
`entry` mediumint(8) NOT NULL,
`content_default` text NOT NULL,
`content_loc1` text,
@@ -10,9 +10,10 @@ CREATE TABLE `custom_texts` (
`content_loc6` text,
`content_loc7` text,
`content_loc8` text,
- `sound` mediumint(8) unsigned NOT NULL default '0',
- `type` tinyint unsigned NOT NULL default '0',
- `language` tinyint unsigned NOT NULL default '0',
+ `sound` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `type` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `language` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `emote` tinyint(3) unsigned NOT NULL DEFAULT '0',
`comment` text,
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Custom Texts';
@@ -69,15 +70,16 @@ CREATE TABLE `eventai_texts` (
`content_loc6` text,
`content_loc7` text,
`content_loc8` text,
- `sound` mediumint(8) unsigned NOT NULL default '0',
- `type` tinyint unsigned NOT NULL default '0',
- `language` tinyint unsigned NOT NULL default '0',
+ `sound` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `type` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `language` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `emote` tinyint(3) unsigned NOT NULL DEFAULT '0',
`comment` text,
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Texts';
DROP TABLE IF EXISTS `script_texts`;
-CREATE TABLE `script_texts` (
+CREATE TABLE IF NOT EXISTS `script_texts` (
`entry` mediumint(8) NOT NULL,
`content_default` text NOT NULL,
`content_loc1` text,
@@ -88,15 +90,17 @@ CREATE TABLE `script_texts` (
`content_loc6` text,
`content_loc7` text,
`content_loc8` text,
- `sound` mediumint(8) unsigned NOT NULL default '0',
- `type` tinyint unsigned NOT NULL default '0',
- `language` tinyint unsigned NOT NULL default '0',
+ `sound` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `type` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `language` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `emote` tinyint(3) unsigned NOT NULL DEFAULT '0',
`comment` text,
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Texts';
+DROP TABLE IF EXISTS `sd2_db_version`;
DROP TABLE IF EXISTS `script_db_version`;
CREATE TABLE `script_db_version` (
- `version` varchar(255) NOT NULL default '' COMMENT 'Script Database version string'
+`version` varchar(255) NOT NULL default '' COMMENT 'Database version string'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/sql/world_spell_full.sql b/sql/world_spell_full.sql
index cfaa310a166..0f7a2bd619e 100644
--- a/sql/world_spell_full.sql
+++ b/sql/world_spell_full.sql
@@ -74,7 +74,9 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm
(45342, 45348, 1, 'Apply Flame Touched'),
(46771, 45348, 1, 'Apply Flame Touched'),
(45271, 45347, 1, 'Apply Dark Touched'),
-(45246, 45348, 1, 'Apply Flame Touched');
+(45246, 45348, 1, 'Apply Flame Touched'),
+(44869, -45018, 1, 'Remove Arcane Buffet'),
+(46019, -45018, 1, 'Remove Arcane Buffet');
-- --------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8c8b9e0126f..fe367ba22d0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,6 +1,6 @@
add_subdirectory(framework)
add_subdirectory(shared)
-add_subdirectory(trinityrealm)
+add_subdirectory(realmd)
add_subdirectory(game)
add_subdirectory(bindings)
-add_subdirectory(trinitycore)
+add_subdirectory(mangosd)
diff --git a/src/Makefile.am b/src/Makefile.am
index 40787fa17d0..7309b10db83 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
#
-# Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+# Thanks to the original authors: MaNGOS <http://getmangos.com/>
#
# 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
@@ -9,17 +9,17 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
-SUBDIRS = framework shared trinityrealm game bindings trinitycore
+SUBDIRS = tools framework shared realmd game bindings mangosd
## Additional files to include when running 'make dist'
# Nothing yet.
diff --git a/src/bindings/Makefile.am b/src/bindings/Makefile.am
index 5e85dfe15bc..26914e8fde1 100644
--- a/src/bindings/Makefile.am
+++ b/src/bindings/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
#
-# Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+# Thanks to the original authors: MaNGOS <http://getmangos.com/>
#
# 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
@@ -18,8 +18,8 @@
# interface folder is disabled for now
-if USE_TSCRIPTS
+#if USE_TSCRIPTS
SUBDIRS = scripts
-else
-SUBDIRS = interface
-endif
+#else
+#SUBDIRS = interface
+#endif
diff --git a/src/bindings/interface/Makefile.am b/src/bindings/interface/Makefile.am
index bcca2128203..9bb53f98454 100644
--- a/src/bindings/interface/Makefile.am
+++ b/src/bindings/interface/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
#
-# Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+# Thanks to the original authors: MaNGOS <http://getmangos.com/>
#
# 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
diff --git a/src/bindings/interface/ScriptMgr.cpp b/src/bindings/interface/ScriptMgr.cpp
index 0499db47e66..81e017685d6 100644
--- a/src/bindings/interface/ScriptMgr.cpp
+++ b/src/bindings/interface/ScriptMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/interface/ScriptMgr.h b/src/bindings/interface/ScriptMgr.h
index 911737f0011..3954616d382 100644
--- a/src/bindings/interface/ScriptMgr.h
+++ b/src/bindings/interface/ScriptMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/interface/Scripts/sc_default.cpp b/src/bindings/interface/Scripts/sc_default.cpp
index 495de39c270..56ec01c4205 100644
--- a/src/bindings/interface/Scripts/sc_default.cpp
+++ b/src/bindings/interface/Scripts/sc_default.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/interface/Scripts/sc_defines.cpp b/src/bindings/interface/Scripts/sc_defines.cpp
index 5665a299106..922beebfc46 100644
--- a/src/bindings/interface/Scripts/sc_defines.cpp
+++ b/src/bindings/interface/Scripts/sc_defines.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/interface/Scripts/sc_defines.h b/src/bindings/interface/Scripts/sc_defines.h
index e942e755ae0..f9bac67683c 100644
--- a/src/bindings/interface/Scripts/sc_defines.h
+++ b/src/bindings/interface/Scripts/sc_defines.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/interface/config.h b/src/bindings/interface/config.h
index eaef18f9aa4..3899d7892a1 100644
--- a/src/bindings/interface/config.h
+++ b/src/bindings/interface/config.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/interface/system.cpp b/src/bindings/interface/system.cpp
index 3cf3c7acf33..05e932ca3ae 100644
--- a/src/bindings/interface/system.cpp
+++ b/src/bindings/interface/system.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/bindings/scripts/CMakeLists.txt b/src/bindings/scripts/CMakeLists.txt
index 39d7a556fa7..80f21126ba3 100644
--- a/src/bindings/scripts/CMakeLists.txt
+++ b/src/bindings/scripts/CMakeLists.txt
@@ -20,15 +20,15 @@ SET(trinityscript_LIB_SRCS
scripts/creature/mob_generic_creature.cpp
scripts/creature/simple_ai.cpp
scripts/creature/simple_ai.h
- scripts/custom/custom_example.cpp
- scripts/custom/custom_gossip_codebox.cpp
- scripts/custom/test.cpp
+ scripts/examples/example_creature.cpp
+ scripts/examples/example_escort.cpp
+ scripts/examples/example_gossip_codebox.cpp
+ scripts/examples/example_misc.cpp
scripts/go/go_scripts.cpp
scripts/guard/guard_ai.cpp
scripts/guard/guard_ai.h
scripts/guard/guards.cpp
scripts/item/item_scripts.cpp
- scripts/item/item_test.cpp
scripts/npc/npc_escortAI.cpp
scripts/npc/npc_escortAI.h
scripts/npc/npc_innkeeper.cpp
@@ -106,6 +106,7 @@ SET(trinityscript_LIB_SRCS
scripts/zone/blasted_lands/blasted_lands.cpp
scripts/zone/blasted_lands/boss_kruul.cpp
scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp
+ scripts/zone/borean_tundra/borean_tundra.cpp
scripts/zone/burning_steppes/burning_steppes.cpp
scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h
scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp
@@ -221,7 +222,6 @@ SET(trinityscript_LIB_SRCS
scripts/zone/naxxramas/boss_gothik.cpp
scripts/zone/naxxramas/boss_grobbulus.cpp
scripts/zone/naxxramas/boss_heigan.cpp
- scripts/zone/naxxramas/boss_highlord_mograine.cpp
scripts/zone/naxxramas/boss_kelthuzad.cpp
scripts/zone/naxxramas/boss_four_horsemen.cpp
scripts/zone/naxxramas/boss_loatheb.cpp
@@ -346,6 +346,8 @@ SET(trinityscript_LIB_SRCS
scripts/zone/uldaman/uldaman.cpp
scripts/zone/undercity/undercity.cpp
scripts/zone/ungoro_crater/ungoro_crater.cpp
+ scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
+ scripts/zone/utgarde_keep/utgarde_keep/boss_keleseth.cpp
scripts/zone/wailing_caverns/instance_wailing_caverns.cpp
scripts/zone/western_plaguelands/western_plaguelands.cpp
scripts/zone/westfall/westfall.cpp
diff --git a/src/bindings/scripts/Makefile.am b/src/bindings/scripts/Makefile.am
index ac5965336a6..d3f20e42994 100644
--- a/src/bindings/scripts/Makefile.am
+++ b/src/bindings/scripts/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
#
-# Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+# Thanks to the original authors: MaNGOS <http://getmangos.com/>
#
# 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
@@ -54,15 +54,15 @@ scripts/creature/mob_event_ai.h \
scripts/creature/mob_generic_creature.cpp \
scripts/creature/simple_ai.cpp \
scripts/creature/simple_ai.h \
-scripts/custom/custom_example.cpp \
-scripts/custom/custom_gossip_codebox.cpp \
-scripts/custom/test.cpp \
+scripts/examples/example_creature.cpp \
+scripts/examples/example_escort.cpp \
+scripts/examples/example_gossip_codebox.cpp \
+scripts/examples/example_misc.cpp \
scripts/go/go_scripts.cpp \
scripts/guard/guard_ai.cpp \
scripts/guard/guard_ai.h \
scripts/guard/guards.cpp \
scripts/item/item_scripts.cpp \
-scripts/item/item_test.cpp \
scripts/npc/npc_escortAI.cpp \
scripts/npc/npc_escortAI.h \
scripts/npc/npc_innkeeper.cpp \
@@ -140,6 +140,7 @@ scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp \
scripts/zone/blasted_lands/blasted_lands.cpp \
scripts/zone/blasted_lands/boss_kruul.cpp \
scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp \
+scripts/zone/borean_tundra/borean_tundra.cpp \
scripts/zone/burning_steppes/burning_steppes.cpp \
scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp \
scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp \
@@ -254,7 +255,6 @@ scripts/zone/naxxramas/boss_gluth.cpp \
scripts/zone/naxxramas/boss_gothik.cpp \
scripts/zone/naxxramas/boss_grobbulus.cpp \
scripts/zone/naxxramas/boss_heigan.cpp \
-scripts/zone/naxxramas/boss_highlord_mograine.cpp \
scripts/zone/naxxramas/boss_kelthuzad.cpp \
scripts/zone/naxxramas/boss_four_horsemen.cpp \
scripts/zone/naxxramas/boss_loatheb.cpp \
@@ -379,6 +379,8 @@ scripts/zone/uldaman/boss_ironaya.cpp \
scripts/zone/uldaman/uldaman.cpp \
scripts/zone/undercity/undercity.cpp \
scripts/zone/ungoro_crater/ungoro_crater.cpp \
+scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp \
+scripts/zone/utgarde_keep/utgarde_keep/boss_keleseth.cpp \
scripts/zone/wailing_caverns/instance_wailing_caverns.cpp \
scripts/zone/western_plaguelands/western_plaguelands.cpp \
scripts/zone/westfall/westfall.cpp \
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp
index eb7e6dafa7b..f8e85b97333 100644
--- a/src/bindings/scripts/ScriptMgr.cpp
+++ b/src/bindings/scripts/ScriptMgr.cpp
@@ -82,9 +82,12 @@ extern void AddSC_mob_event();
extern void AddSC_generic_creature();
// -- Custom --
-extern void AddSC_custom_example();
-extern void AddSC_custom_gossip_codebox();
-extern void AddSC_test();
+
+// -- Examples --
+extern void AddSC_example_creature();
+extern void AddSC_example_escort();
+extern void AddSC_example_gossip_codebox();
+extern void AddSC_example_misc();
// -- GO --
extern void AddSC_go_scripts();
@@ -96,7 +99,6 @@ extern void AddSC_guards();
// -- Item --
extern void AddSC_item_scripts();
-extern void AddSC_item_test();
// -- NPC --
extern void AddSC_npc_professions();
@@ -211,6 +213,9 @@ extern void AddSC_blasted_lands();
//Bloodmyst Isle
extern void AddSC_bloodmyst_isle();
+//Borean Tundra
+extern void AddSC_borean_tundra();
+
//Burning steppes
extern void AddSC_burning_steppes();
@@ -390,14 +395,13 @@ extern void AddSC_boss_anubrekhan();
extern void AddSC_boss_maexxna();
extern void AddSC_boss_patchwerk();
extern void AddSC_boss_razuvious();
-extern void AddSC_boss_highlord_mograine();
extern void AddSC_boss_kelthuzad();
-extern void AddSC_boss_faerlina();
extern void AddSC_boss_loatheb();
extern void AddSC_boss_noth();
extern void AddSC_boss_gluth();
extern void AddSC_boss_sapphiron();
extern void AddSC_boss_four_horsemen();
+extern void AddSC_boss_faerlina();
//Netherstorm
extern void AddSC_netherstorm();
@@ -566,6 +570,11 @@ extern void AddSC_undercity();
extern void AddSC_ungoro_crater();
//Upper blackrock spire
+
+//Utgarde Keep
+extern void AddSC_boss_keleseth();
+extern void AddSC_instance_utgarde_keep();
+
//Wailing caverns
//Western plaguelands
@@ -658,8 +667,7 @@ void LoadDatabase()
LoadTrinityStrings(TScriptDB,"eventai_texts",-1,1+(TEXT_SOURCE_RANGE));
// Gather Additional data from EventAI Texts
- //result = TScriptDB.PQuery("SELECT entry, sound, type, language, emote FROM eventai_texts");
- result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM eventai_texts");
+ result = TScriptDB.PQuery("SELECT entry, sound, type, language, emote FROM eventai_texts");
outstring_log("TSCR: Loading EventAI Texts additional data...");
if (result)
@@ -677,7 +685,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
- temp.Emote = 0;//fields[4].GetInt32();
+ temp.Emote = fields[4].GetInt32();
if (i >= 0)
{
@@ -928,6 +936,10 @@ void LoadDatabase()
temp.event_param3 = fields[8].GetUInt32();
temp.event_param4 = fields[9].GetUInt32();
+ //Creature does not exist in database
+ if (!GetCreatureTemplateStore(temp.creature_id))
+ error_db_log("TSCR: Event %u has script for non-existing creature.", i);
+
//Report any errors in event
if (temp.event_type >= EVENT_T_END)
error_db_log("TSCR: Event %u has incorrect event type. Maybe DB requires updated version of SD2.", i);
@@ -1022,7 +1034,7 @@ void LoadDatabase()
case EVENT_T_AGGRO:
case EVENT_T_DEATH:
case EVENT_T_EVADE:
- case EVENT_T_SPAWNED:
+ case EVENT_T_REACHED_HOME:
{
if (temp.event_flags & EFLAG_REPEATABLE)
{
@@ -1068,7 +1080,29 @@ void LoadDatabase()
}
}
break;
+ case ACTION_T_SET_FACTION:
+ if (temp.action[j].param1 !=0 && !GetFactionStore()->LookupEntry(temp.action[j].param1))
+ {
+ error_db_log("TSCR: Event %u Action %u uses non-existant FactionId %u.", i, j+1, temp.action[j].param1);
+ temp.action[j].param1 = 0;
+ }
+ break;
+ case ACTION_T_MORPH_TO_ENTRY_OR_MODEL:
+ if (temp.action[j].param1 !=0 || temp.action[j].param2 !=0)
+ {
+ if (temp.action[j].param1 && !GetCreatureTemplateStore(temp.action[j].param1))
+ {
+ error_db_log("TSCR: Event %u Action %u uses non-existant Creature entry %u.", i, j+1, temp.action[j].param1);
+ temp.action[j].param1 = 0;
+ }
+ if (temp.action[j].param2 && !GetCreatureDisplayStore()->LookupEntry(temp.action[j].param2))
+ {
+ error_db_log("TSCR: Event %u Action %u uses non-existant ModelId %u.", i, j+1, temp.action[j].param2);
+ temp.action[j].param2 = 0;
+ }
+ }
+ break;
case ACTION_T_SOUND:
if (!GetSoundEntriesStore()->LookupEntry(temp.action[j].param1))
error_db_log("TSCR: Event %u Action %u uses non-existant SoundID %u.", i, j+1, temp.action[j].param1);
@@ -1087,14 +1121,23 @@ void LoadDatabase()
case ACTION_T_CAST:
{
- if (!GetSpellStore()->LookupEntry(temp.action[j].param1))
+ const SpellEntry *spell = GetSpellStore()->LookupEntry(temp.action[j].param1);
+ if (!spell)
error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param1);
+ else
+ {
+ if (spell->RecoveryTime > 0 && temp.event_flags & EFLAG_REPEATABLE)
+ {
+ //output as debug for now, also because there's no general rule all spells have RecoveryTime
+ if (temp.event_param3 < spell->RecoveryTime)
+ debug_log("TSCR: Event %u Action %u uses SpellID %u but cooldown is longer(%u) than minumum defined in event param3(%u).", i, j+1,temp.action[j].param1, spell->RecoveryTime, temp.event_param3);
+ }
+ }
if (temp.action[j].param2 >= TARGET_T_END)
error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
}
break;
-
case ACTION_T_REMOVEAURASFROMSPELL:
{
if (!GetSpellStore()->LookupEntry(temp.action[j].param2))
@@ -1104,9 +1147,36 @@ void LoadDatabase()
error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
}
break;
+ case ACTION_T_QUEST_EVENT:
+ {
+ if (Quest const* qid = GetQuestTemplateStore(temp.action[j].param1))
+ {
+ if (!qid->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT))
+ error_db_log("TSCR: Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j+1, temp.action[j].param1);
+ }
+ else
+ error_db_log("TSCR: Event %u Action %u uses non-existant Quest entry %u.", i, j+1, temp.action[j].param1);
+ if (temp.action[j].param2 >= TARGET_T_END)
+ error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
+ }
+ break;
+ case ACTION_T_QUEST_EVENT_ALL:
+ {
+ if (Quest const* qid = GetQuestTemplateStore(temp.action[j].param1))
+ {
+ if (!qid->HasFlag(QUEST_TRINITY_FLAGS_EXPLORATION_OR_EVENT))
+ error_db_log("TSCR: Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j+1, temp.action[j].param1);
+ }
+ else
+ error_db_log("TSCR: Event %u Action %u uses non-existant Quest entry %u.", i, j+1, temp.action[j].param1);
+ }
+ break;
case ACTION_T_CASTCREATUREGO:
{
+ if (!GetCreatureTemplateStore(temp.action[j].param1))
+ error_db_log("TSCR: Event %u Action %u uses non-existant creature entry %u.", i, j+1, temp.action[j].param1);
+
if (!GetSpellStore()->LookupEntry(temp.action[j].param2))
error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2);
@@ -1114,10 +1184,22 @@ void LoadDatabase()
error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
}
break;
+ case ACTION_T_CASTCREATUREGO_ALL:
+ {
+ if (!GetQuestTemplateStore(temp.action[j].param1))
+ error_db_log("TSCR: Event %u Action %u uses non-existant Quest entry %u.", i, j+1, temp.action[j].param1);
+
+ if (!GetSpellStore()->LookupEntry(temp.action[j].param2))
+ error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2);
+ }
+ break;
//2nd param target
case ACTION_T_SUMMON_ID:
{
+ if (!GetCreatureTemplateStore(temp.action[j].param1))
+ error_db_log("TSCR: Event %u Action %u uses non-existant creature entry %u.", i, j+1, temp.action[j].param1);
+
if (EventAI_Summon_Map.find(temp.action[j].param3) == EventAI_Summon_Map.end())
error_db_log("TSCR: Event %u Action %u summons missing EventAI_Summon %u", i, j+1, temp.action[j].param3);
@@ -1125,19 +1207,35 @@ void LoadDatabase()
error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
}
break;
+ case ACTION_T_KILLED_MONSTER:
+ {
+ if (!GetCreatureTemplateStore(temp.action[j].param1))
+ error_db_log("TSCR: Event %u Action %u uses non-existant creature entry %u.", i, j+1, temp.action[j].param1);
+ if (temp.action[j].param2 >= TARGET_T_END)
+ error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
+ }
+ break;
case ACTION_T_SUMMON:
+ {
+ if (!GetCreatureTemplateStore(temp.action[j].param1))
+ error_db_log("TSCR: Event %u Action %u uses non-existant creature entry %u.", i, j+1, temp.action[j].param1);
+
+ if (temp.action[j].param2 >= TARGET_T_END)
+ error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
+ }
+ break;
case ACTION_T_THREAT_SINGLE_PCT:
- case ACTION_T_QUEST_EVENT:
case ACTION_T_SET_UNIT_FLAG:
case ACTION_T_REMOVE_UNIT_FLAG:
- case ACTION_T_SET_INST_DATA64:
if (temp.action[j].param2 >= TARGET_T_END)
error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
break;
//3rd param target
case ACTION_T_SET_UNIT_FIELD:
+ if (temp.action[j].param1 < OBJECT_END || temp.action[j].param1 >= UNIT_END)
+ error_db_log("TSCR: Event %u Action %u param1 (UNIT_FIELD*). Index out of range for intended use.", i, j+1);
if (temp.action[j].param3 >= TARGET_T_END)
error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
break;
@@ -1152,18 +1250,30 @@ void LoadDatabase()
error_db_log("TSCR: Event %u Action %u is incrementing phase by 0. Was this intended?", i, j+1);
break;
- case ACTION_T_KILLED_MONSTER:
- if (temp.event_type != EVENT_T_DEATH)
- outstring_log("SD2 WARNING: Event %u Action %u calling ACTION_T_KILLED_MONSTER outside of EVENT_T_DEATH", i, j+1);
- break;
-
case ACTION_T_SET_INST_DATA:
- if (temp.action[j].param2 > SPECIAL)
- error_db_log("TSCR2: Event %u Action %u attempts to set instance data above encounter state 4. Custom case?", i, j+1);
+ {
+ if (!(temp.event_flags & EFLAG_NORMAL) && !(temp.event_flags & EFLAG_HEROIC))
+ error_db_log("TSCR: Event %u Action %u. Cannot set instance data without event flags (normal/heroic).", i, j+1);
+
+ if (temp.action[j].param2 > SPECIAL)
+ error_db_log("TSCR: Event %u Action %u attempts to set instance data above encounter state 4. Custom case?", i, j+1);
+ }
break;
+ case ACTION_T_SET_INST_DATA64:
+ {
+ if (!(temp.event_flags & EFLAG_NORMAL) && !(temp.event_flags & EFLAG_HEROIC))
+ error_db_log("TSCR: Event %u Action %u. Cannot set instance data without event flags (normal/heroic).", i, j+1);
- case ACTION_T_YELL:
- case ACTION_T_TEXTEMOTE:
+ if (temp.action[j].param2 >= TARGET_T_END)
+ error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
+ }
+ break;
+ case ACTION_T_UPDATE_TEMPLATE:
+ {
+ if (!GetCreatureTemplateStore(temp.action[j].param1))
+ error_db_log("TSCR: Event %u Action %u uses non-existant creature entry %u.", i, j+1, temp.action[j].param1);
+ }
+ break;
case ACTION_T_RANDOM_SAY:
case ACTION_T_RANDOM_YELL:
case ACTION_T_RANDOM_TEXTEMOTE:
@@ -1211,7 +1321,7 @@ void ScriptsFree()
delete []SpellSummary;
// Free resources before library unload
- for(int i=0;i<num_sc_scripts;i++)
+ for(int i=0;i<MAX_SCRIPTS;i++)
delete m_scripts[i];
num_sc_scripts = 0;
@@ -1290,9 +1400,12 @@ void ScriptsInit()
AddSC_generic_creature();
// -- Custom --
- AddSC_custom_example();
- AddSC_custom_gossip_codebox();
- AddSC_test();
+
+ // -- Examples --
+ AddSC_example_creature();
+ AddSC_example_escort();
+ AddSC_example_gossip_codebox();
+ AddSC_example_misc();
// -- GO --
AddSC_go_scripts();
@@ -1304,7 +1417,6 @@ void ScriptsInit()
// -- Item --
AddSC_item_scripts();
- AddSC_item_test();
// -- NPC --
AddSC_npc_professions();
@@ -1418,6 +1530,9 @@ void ScriptsInit()
//Bloodmyst Isle
AddSC_bloodmyst_isle();
+
+ //Borean Tundra
+ AddSC_borean_tundra();
//Burning steppes
AddSC_burning_steppes();
@@ -1594,12 +1709,11 @@ void ScriptsInit()
//Naxxramas
AddSC_boss_anubrekhan();
+ AddSC_boss_faerlina();
AddSC_boss_maexxna();
AddSC_boss_patchwerk();
AddSC_boss_razuvious();
- AddSC_boss_highlord_mograine();
AddSC_boss_kelthuzad();
- AddSC_boss_faerlina();
AddSC_boss_loatheb();
AddSC_boss_noth();
AddSC_boss_gluth();
@@ -1773,6 +1887,11 @@ void ScriptsInit()
AddSC_ungoro_crater();
//Upper blackrock spire
+
+ //Utgarde Keep
+ AddSC_boss_keleseth();
+ AddSC_instance_utgarde_keep();
+
//Wailing caverns
//Western plaguelands
@@ -1913,8 +2032,12 @@ void Script::RegisterSelf()
{
m_scripts[id] = this;
++num_sc_scripts;
- } else
- debug_log("SD2: RegisterSelf, but script named %s does not have ScriptName assigned in database.",(this)->Name.c_str());
+ }
+ else
+ {
+ debug_log("TSCR: RegisterSelf, but script named %s does not have ScriptName assigned in database.",(this)->Name.c_str());
+ delete this;
+ }
}
//********************************
diff --git a/src/bindings/scripts/ScriptMgr.h b/src/bindings/scripts/ScriptMgr.h
index b3c25bfaffd..5f9ab9b8ae1 100644
--- a/src/bindings/scripts/ScriptMgr.h
+++ b/src/bindings/scripts/ScriptMgr.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+/* Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
* Thanks to the original authors: ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
diff --git a/src/bindings/scripts/VC71/71ScriptDev2.vcproj b/src/bindings/scripts/VC71/71ScriptDev2.vcproj
index a309f585589..e97fbaa8ed4 100644
--- a/src/bindings/scripts/VC71/71ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC71/71ScriptDev2.vcproj
@@ -231,6 +231,22 @@
</File>
</Filter>
<Filter
+ Name="examples"
+ >
+ <File
+ RelativePath="..\scripts\examples\example_creature.cpp">
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_escort.cpp">
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_gossip_codebox.cpp">
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_misc.cpp">
+ </File>
+ </Filter>
+ <Filter
Name="guard"
>
<File
@@ -281,18 +297,6 @@
<Filter
Name="custom"
>
- <File
- RelativePath="..\scripts\custom\custom_example.cpp"
- >
- </File>
- <File
- RelativePath="..\scripts\custom\custom_gossip_codebox.cpp"
- >
- </File>
- <File
- RelativePath="..\scripts\custom\test.cpp"
- >
- </File>
</Filter>
<Filter
Name="areatrigger"
@@ -317,10 +321,6 @@
RelativePath="..\scripts\item\item_scripts.cpp"
>
</File>
- <File
- RelativePath="..\scripts\item\item_test.cpp"
- >
- </File>
</Filter>
<Filter
Name="zone"
@@ -849,10 +849,6 @@
>
</File>
<File
- RelativePath="..\scripts\zone\naxxramas\boss_highlord_mograine.cpp"
- >
- </File>
- <File
RelativePath="..\scripts\zone\naxxramas\boss_kelthuzad.cpp"
>
</File>
@@ -1879,6 +1875,7 @@
RelativePath="..\scripts\zone\caverns_of_time\dark_portal\instance_dark_portal.cpp"
>
</File>
+
</Filter>
<Filter
Name="Battle for Mt. Hyjal"
@@ -1909,6 +1906,9 @@
</File>
</Filter>
<Filter
+ Name="Culling of Stratholme">
+ </Filter>
+ <Filter
Name="Old Hillsbrad"
>
<File
@@ -1936,6 +1936,9 @@
>
</File>
</Filter>
+ <Filter
+ Name="Culling of Stratholme">
+ </Filter>
</Filter>
<Filter
Name="Silvermoon City"
@@ -1969,6 +1972,107 @@
>
</File>
</Filter>
+ <Filter
+ Name="Borean Tundra">
+ <File
+ RelativePath="..\scripts\zone\borean_tundra\borean_tundra.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Howling Fjord">
+ </Filter>
+ <Filter
+ Name="Crystalsong Forest">
+ </Filter>
+ <Filter
+ Name="Dalaran">
+ </Filter>
+ <Filter
+ Name="Dragonblight">
+ </Filter>
+ <Filter
+ Name="Grizzly Hills">
+ </Filter>
+ <Filter
+ Name="Icecrown">
+ </Filter>
+ <Filter
+ Name="Sholazar Basin">
+ </Filter>
+ <Filter
+ Name="The Storm Peaks">
+ </Filter>
+ <Filter
+ Name="Zul&apos;Drak">
+ </Filter>
+ <Filter
+ Name="Azjol-Nerub">
+ <Filter
+ Name="Ahn&apos;kahet">
+ </Filter>
+ <Filter
+ Name="Azjol-Nerub">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Drak&apos;Tharon Keep">
+ </Filter>
+ <Filter
+ Name="Gundrak">
+ </Filter>
+ <Filter
+ Name="Nexus">
+ <Filter
+ Name="Nexus">
+ </Filter>
+ <Filter
+ Name="Oculus">
+ </Filter>
+ <Filter
+ Name="Eye of Eternity">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Violet Hold">
+ </Filter>
+ <Filter
+ Name="Ulduar"
+ >
+ <Filter
+ Name="Halls of Stone">
+ </Filter>
+ <Filter
+ Name="Halls of Lightning">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Utgarde Keep">
+ <Filter
+ Name="Utgarde Keep">
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\boss_keleseth.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\def_utgarde_keep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\instance_utgarde_keep.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Utgarde Pinnacle">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Obsidian Sanctum">
+ </Filter>
+ <Filter
+ Name="Vault of Archavon">
+ </Filter>
<Filter
Name="Shattrath City"
>
diff --git a/src/bindings/scripts/VC80/80ScriptDev2.vcproj b/src/bindings/scripts/VC80/80ScriptDev2.vcproj
index e4e20bbb129..220ab002817 100644
--- a/src/bindings/scripts/VC80/80ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC80/80ScriptDev2.vcproj
@@ -408,6 +408,26 @@
</File>
</Filter>
<Filter
+ Name="examples"
+ >
+ <File
+ RelativePath="..\scripts\examples\example_creature.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_escort.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_gossip_codebox.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_misc.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
Name="guard"
>
<File
@@ -458,18 +478,6 @@
<Filter
Name="custom"
>
- <File
- RelativePath="..\scripts\custom\custom_example.cpp"
- >
- </File>
- <File
- RelativePath="..\scripts\custom\custom_gossip_codebox.cpp"
- >
- </File>
- <File
- RelativePath="..\scripts\custom\test.cpp"
- >
- </File>
</Filter>
<Filter
Name="areatrigger"
@@ -494,10 +502,6 @@
RelativePath="..\scripts\item\item_scripts.cpp"
>
</File>
- <File
- RelativePath="..\scripts\item\item_test.cpp"
- >
- </File>
</Filter>
<Filter
Name="zone"
@@ -1026,10 +1030,6 @@
>
</File>
<File
- RelativePath="..\scripts\zone\naxxramas\boss_highlord_mograine.cpp"
- >
- </File>
- <File
RelativePath="..\scripts\zone\naxxramas\boss_kelthuzad.cpp"
>
</File>
@@ -1078,6 +1078,107 @@
Name="Ragefire Chasm"
>
</Filter>
+ <Filter
+ Name="Borean Tundra">
+ <File
+ RelativePath="..\scripts\zone\borean_tundra\borean_tundra.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Howling Fjord">
+ </Filter>
+ <Filter
+ Name="Crystalsong Forest">
+ </Filter>
+ <Filter
+ Name="Dalaran">
+ </Filter>
+ <Filter
+ Name="Dragonblight">
+ </Filter>
+ <Filter
+ Name="Grizzly Hills">
+ </Filter>
+ <Filter
+ Name="Icecrown">
+ </Filter>
+ <Filter
+ Name="Sholazar Basin">
+ </Filter>
+ <Filter
+ Name="The Storm Peaks">
+ </Filter>
+ <Filter
+ Name="Zul&apos;Drak">
+ </Filter>
+ <Filter
+ Name="Azjol-Nerub">
+ <Filter
+ Name="Ahn&apos;kahet">
+ </Filter>
+ <Filter
+ Name="Azjol-Nerub">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Drak&apos;Tharon Keep">
+ </Filter>
+ <Filter
+ Name="Gundrak">
+ </Filter>
+ <Filter
+ Name="Nexus">
+ <Filter
+ Name="Nexus">
+ </Filter>
+ <Filter
+ Name="Oculus">
+ </Filter>
+ <Filter
+ Name="Eye of Eternity">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Violet Hold">
+ </Filter>
+ <Filter
+ Name="Ulduar"
+ >
+ <Filter
+ Name="Halls of Stone">
+ </Filter>
+ <Filter
+ Name="Halls of Lightning">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Utgarde Keep">
+ <Filter
+ Name="Utgarde Keep">
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\boss_keleseth.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\def_utgarde_keep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\instance_utgarde_keep.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Utgarde Pinnacle">
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Obsidian Sanctum">
+ </Filter>
+ <Filter
+ Name="Vault of Archavon">
+ </Filter>
<Filter
Name="Razorfen Downs"
>
@@ -2086,6 +2187,13 @@
</File>
</Filter>
<Filter
+ Name="Culling of Stratholme">
+ </Filter>
+ <Filter
+ Name="Culling of Stratholme"
+ >
+ </Filter>
+ <Filter
Name="Old Hillsbrad"
>
<File
diff --git a/src/bindings/scripts/VC90/90ScriptDev2.vcproj b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
index e6d36179274..679e14bc9c8 100644
--- a/src/bindings/scripts/VC90/90ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
@@ -401,6 +401,26 @@
</File>
</Filter>
<Filter
+ Name="examples"
+ >
+ <File
+ RelativePath="..\scripts\examples\example_creature.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_escort.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_gossip_codebox.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\examples\example_misc.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
Name="guard"
>
<File
@@ -451,18 +471,6 @@
<Filter
Name="custom"
>
- <File
- RelativePath="..\scripts\custom\custom_example.cpp"
- >
- </File>
- <File
- RelativePath="..\scripts\custom\custom_gossip_codebox.cpp"
- >
- </File>
- <File
- RelativePath="..\scripts\custom\test.cpp"
- >
- </File>
</Filter>
<Filter
Name="areatrigger"
@@ -487,10 +495,6 @@
RelativePath="..\scripts\item\item_scripts.cpp"
>
</File>
- <File
- RelativePath="..\scripts\item\item_test.cpp"
- >
- </File>
</Filter>
<Filter
Name="zone"
@@ -748,6 +752,134 @@
>
</Filter>
<Filter
+ Name="Borean Tundra"
+ >
+ <File
+ RelativePath="..\scripts\zone\borean_tundra\borean_tundra.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Howling Fjord"
+ >
+ </Filter>
+ <Filter
+ Name="Crystalsong Forest"
+ >
+ </Filter>
+ <Filter
+ Name="Dalaran"
+ >
+ </Filter>
+ <Filter
+ Name="Dragonblight"
+ >
+ </Filter>
+ <Filter
+ Name="Grizzly Hills"
+ >
+ </Filter>
+ <Filter
+ Name="Icecrown"
+ >
+ </Filter>
+ <Filter
+ Name="Sholazar Basin"
+ >
+ </Filter>
+ <Filter
+ Name="The Storm Peaks"
+ >
+ </Filter>
+ <Filter
+ Name="Zul&apos;Drak"
+ >
+ </Filter>
+ <Filter
+ Name="Azjol-Nerub"
+ >
+ <Filter
+ Name="Ahn&apos;kahet"
+ >
+ </Filter>
+ <Filter
+ Name="Azjol-Nerub"
+ >
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Drak&apos;Tharon Keep"
+ >
+ </Filter>
+ <Filter
+ Name="Gundrak"
+ >
+ </Filter>
+ <Filter
+ Name="Nexus"
+ >
+ <Filter
+ Name="Nexus"
+ >
+ </Filter>
+ <Filter
+ Name="Oculus"
+ >
+ </Filter>
+ <Filter
+ Name="Eye of Eternity"
+ >
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Violet Hold"
+ >
+ </Filter>
+ <Filter
+ Name="Ulduar"
+ >
+ <Filter
+ Name="Halls of Stone"
+ >
+ </Filter>
+ <Filter
+ Name="Halls of Lightning"
+ >
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Utgarde Keep"
+ >
+ <Filter
+ Name="Utgarde Keep"
+ >
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\boss_keleseth.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\def_utgarde_keep.h"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\zone\utgarde_keep\utgarde_keep\instance_utgarde_keep.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Utgarde Pinnacle"
+ >
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Obsidian Sanctum"
+ >
+ </Filter>
+ <Filter
+ Name="Vault of Archavon"
+ >
+ </Filter>
+ <Filter
Name="Scarlet Monastery"
>
<File
@@ -1019,10 +1151,6 @@
>
</File>
<File
- RelativePath="..\scripts\zone\naxxramas\boss_highlord_mograine.cpp"
- >
- </File>
- <File
RelativePath="..\scripts\zone\naxxramas\boss_kelthuzad.cpp"
>
</File>
@@ -2079,6 +2207,14 @@
</File>
</Filter>
<Filter
+ Name="Culling of Stratholme"
+ >
+ </Filter>
+ <Filter
+ Name="Culling of Stratholme"
+ >
+ </Filter>
+ <Filter
Name="Old Hillsbrad"
>
<File
diff --git a/src/bindings/scripts/docs/EventAI.txt b/src/bindings/scripts/docs/EventAI.txt
index 580f73ae75b..780e817993d 100644
--- a/src/bindings/scripts/docs/EventAI.txt
+++ b/src/bindings/scripts/docs/EventAI.txt
@@ -71,7 +71,9 @@ Events will not repeat until the creature exits combat unless EFLAG_REPEATABLE i
14 EVENT_T_FRIENDLY_HP HPDeficit, Radius, RepeatMin, RepeatMax Expires when a friendly unit in radius has at least (param1) hp missing. Will repeat every (Param3) and (Param4) .
15 EVENT_T_FRIENDLY_IS_CC DispelType, Radius, RepeatMin, RepeatMax Expires when a friendly unit is Crowd controlled within the given radius (param2). Will repeat every (Param3) and (Param4) .
16 EVENT_T_MISSING_BUFF SpellId, Radius, RepeatMin, RepeatMax Expires when a friendly unit is missing aura's given by spell (param1) within radius (param2). Will repeat every (Param3) and (Param4) .
-17 EVENT_T_SUMMONED_UNIT CreatureId, RepeatMin, RepeatMax Expires after creature with entry = (param1) is spawned or for all spawns if param1 = 0. Will repeat every (Param2) and (Param3) .
+17 EVENT_T_SUMMONED_UNIT CreatureId, RepeatMin, RepeatMax Expires after creature with entry = (param1) is spawned or for all spawns if param1 = 0. Will repeat every (Param2) and (Param3).
+18 EVENT_T_TARGET_MANA ManaMax%, ManaMin%, RepeatMin, RepeatMax
+21 EVENT_T_REACHED_HOME NONE Expires when creature reach it's home(spawn) location after Evade.
=========================================
Action Types
@@ -83,8 +85,8 @@ Params are always read from Param1, then Param2, then Param3.
(# Internal Name Param usage Discription)
0 ACTION_T_NONE No Action Does Nothing
1 ACTION_T_TEXT -TextId1, -TextId2, -TextId3 Displays the -TextId as defined. In case -TextId2 and optionally -TextId3, the output will be randomized. Type text are defined in the text table itself(say, yell, whisper, etc) along with other options for the text. All values are required to be negative.
-2 ACTION_T_YELL UNUSED
-3 ACTION_T_TEXTEMOTE UNUSED
+2 ACTION_T_SET_FACTION FactionId Change faction for creature. If param1==0, creature will revert to default faction.
+3 ACTION_T_MORPH_TO_ENTRY_OR_MODEL CreatureEntry, ModelId Set model from creature_template.entry(param1) OR set explicit modelId(param2). If param1 AND param2 both 0, demorph and revert to default model for creature.
4 ACTION_T_SOUND SoundId Plays Sound
5 ACTION_T_EMOTE EmoteId Does emote
6 ACTION_T_RANDOM_SAY UNUSED
@@ -305,6 +307,12 @@ Parameter 3: RepeatMax - Maximum Time used to calculate Random Repeat Expire
BOTH - Expires after creature with entry(Param1) is spawned or for all spawns if param1 = 0. Will repeat every (Param2) and (Param3) .
This is commonly used for NPC's who will do something special once another NPC is summoned. Usually used is Complex Scripts or Special Events.
+---------------------------
+21 = EVENT_T_REACHED_HOME:
+---------------------------
+Expires only when creature has returned to it's home location after Evade. Out of combat event.
+Most commonly used to cast spells that can not be casted in EVENT_T_EVADE and other effects that does not fit in while still running back to spawn/home location.
+
=========================================
Action Types
@@ -321,15 +329,20 @@ Parameter 1: The entry of the text that the NPC should use from eventai_texts ta
Parameter 2: Optional. TextId can be defined in addition. The same apply to this as explained above, however eventAI will randomize between the two.
Parameter 3: Optional, if Parameter 2 exist. In this case, eventAI will randomize between three.
+See Text-tables.txt for documentation of eventai_texts-table.
+
------------------
-2 = ACTION_T_YELL:
+2 = ACTION_T_SET_FACTION:
------------------
-UNUSED Can be reused to create new action type
+Parameter 1: FactionId from Faction.dbc OR 0. Changes faction for creature. If 0, creature will revert to it's default faction if previously changed.
-----------------------
-3 = ACTION_T_TEXTEMOTE:
+3 = ACTION_T_MORPH_TO_ENTRY_OR_MODEL:
-----------------------
-UNUSED Can be reused to create new action type
+Parameter 1: Creature entry from creature_template. Action will then change to the model this creature are using.
+Parameter 2: If parameter 1 is 0, then this modelId will be used (in case parameter 1 exist, parameter 2 will not be used)
+
+If both parameter 1 and 2 is 0, the creature will DeMorph, and use it's default model.
-------------------
4 = ACTION_T_SOUND:
@@ -683,4 +696,4 @@ Below is the list of current Event Flags that EventAI can handle. Event flags ar
6 64
7 128 EFLAG_DEBUG_ONLY Prevents events from occuring on Release builds of ScriptDev2. Useful for testing new features.
-NOTE: You can add the numbers in the decimal column to combine flags.
+NOTE: You can add the numbers in the decimal column to combine flags. \ No newline at end of file
diff --git a/src/bindings/scripts/include/precompiled.cpp b/src/bindings/scripts/include/precompiled.cpp
index 9753d023374..75bfae9e1c4 100644
--- a/src/bindings/scripts/include/precompiled.cpp
+++ b/src/bindings/scripts/include/precompiled.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/include/precompiled.h b/src/bindings/scripts/include/precompiled.h
index cd6d68f9f31..28b37a98349 100644
--- a/src/bindings/scripts/include/precompiled.h
+++ b/src/bindings/scripts/include/precompiled.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index 47bc01f183c..efb6ef36fa2 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+/* Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
* Thanks to the original authors: ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
@@ -108,9 +108,9 @@ void ScriptedAI::AttackStart(Unit* who)
void ScriptedAI::UpdateAI(const uint32 diff)
{
//Check if we have a current target
- if (m_creature->isAlive() && UpdateVictim())
+ if (UpdateVictim())
{
- if (m_creature->isAttackReady() )
+ if (m_creature->isAttackReady())
{
//If we are within range melee the target
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
@@ -169,11 +169,10 @@ void ScriptedAI::DoStartNoMovement(Unit* victim)
m_creature->StopMoving();
}
-
void ScriptedAI::DoMeleeAttackIfReady()
{
- //Make sure our attack is ready and we aren't currently casting before checking distance
- if (m_creature->isAttackReady() && !m_creature->hasUnitState(UNIT_STAT_CASTING))
+ //Make sure our attack is ready before checking distance
+ if (m_creature->isAttackReady())
{
//If we are within range melee the target
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
@@ -231,23 +230,23 @@ void ScriptedAI::DoSay(const char* text, uint32 language, Unit* target, bool Say
{
if (target)
{
- m_creature->Say(text, language, target->GetGUID());
+ m_creature->MonsterSay(text, language, target->GetGUID());
if(SayEmote)
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
}
- else m_creature->Say(text, language, 0);
+ else m_creature->MonsterSay(text, language, 0);
}
void ScriptedAI::DoYell(const char* text, uint32 language, Unit* target)
{
- if (target) m_creature->Yell(text, language, target->GetGUID());
- else m_creature->Yell(text, language, 0);
+ if (target) m_creature->MonsterYell(text, language, target->GetGUID());
+ else m_creature->MonsterYell(text, language, 0);
}
void ScriptedAI::DoTextEmote(const char* text, Unit* target, bool IsBossEmote)
{
- if (target) m_creature->TextEmote(text, target->GetGUID(), IsBossEmote);
- else m_creature->TextEmote(text, 0, IsBossEmote);
+ if (target) m_creature->MonsterTextEmote(text, target->GetGUID(), IsBossEmote);
+ else m_creature->MonsterTextEmote(text, 0, IsBossEmote);
}
void ScriptedAI::DoWhisper(const char* text, Unit* reciever, bool IsBossWhisper)
@@ -255,7 +254,7 @@ void ScriptedAI::DoWhisper(const char* text, Unit* reciever, bool IsBossWhisper)
if (!reciever || reciever->GetTypeId() != TYPEID_PLAYER)
return;
- m_creature->Whisper(text, reciever->GetGUID(), IsBossWhisper);
+ m_creature->MonsterWhisper(text, reciever->GetGUID(), IsBossWhisper);
}
void ScriptedAI::DoPlaySoundToSet(Unit* unit, uint32 sound)
@@ -462,11 +461,9 @@ SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mech
return false;
//Using the extended script system we first create a list of viable spells
- SpellEntry const* Spell[4];
- Spell[0] = 0;
- Spell[1] = 0;
- Spell[2] = 0;
- Spell[3] = 0;
+ SpellEntry const* Spell[CREATURE_MAX_SPELLS];
+ for (uint8 i=0;i<CREATURE_MAX_SPELLS;i++)
+ Spell[i] = 0;
uint32 SpellCount = 0;
@@ -474,7 +471,7 @@ SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mech
SpellRangeEntry const* TempRange;
//Check if each spell is viable(set it to null if not)
- for (uint32 i = 0; i < 4; i++)
+ for (uint32 i = 0; i < CREATURE_MAX_SPELLS; i++)
{
TempSpell = GetSpellStore()->LookupEntry(m_creature->m_spells[i]);
@@ -518,13 +515,13 @@ SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mech
continue;
//Check if the spell meets our range requirements
- if (RangeMin && TempRange->maxRange < RangeMin)
+ if (RangeMin && m_creature->GetSpellMinRangeForTarget(Target, TempRange) < RangeMin)
continue;
- if (RangeMax && TempRange->maxRange > RangeMax)
+ if (RangeMax && m_creature->GetSpellMaxRangeForTarget(Target, TempRange) > RangeMax)
continue;
//Check if our target is in range
- if (m_creature->IsWithinDistInMap(Target, TempRange->minRange) || !m_creature->IsWithinDistInMap(Target, TempRange->maxRange))
+ if (m_creature->IsWithinDistInMap(Target, m_creature->GetSpellMinRangeForTarget(Target, TempRange)) || !m_creature->IsWithinDistInMap(Target, m_creature->GetSpellMaxRangeForTarget(Target, TempRange)))
continue;
//All good so lets add it to the spell list
@@ -562,20 +559,20 @@ bool ScriptedAI::CanCast(Unit* Target, SpellEntry const *Spell, bool Triggered)
return false;
//Unit is out of range of this spell
- if (m_creature->GetDistance(Target) > TempRange->maxRange || m_creature->GetDistance(Target) < TempRange->minRange)
+ if (m_creature->GetDistance(Target) > m_creature->GetSpellMaxRangeForTarget(Target, TempRange) || m_creature->GetDistance(Target) < m_creature->GetSpellMinRangeForTarget(Target, TempRange))
return false;
return true;
}
-float GetSpellMaxRange(uint32 id)
+float GetSpellMaxRangeForHostile(uint32 id)
{
SpellEntry const *spellInfo = GetSpellStore()->LookupEntry(id);
if(!spellInfo) return 0;
SpellRangeEntry const *range = GetSpellRangeStore()->LookupEntry(spellInfo->rangeIndex);
if(!range) return 0;
- return range->maxRange;
+ return range->maxRangeHostile;
}
void FillSpellSummary()
@@ -608,7 +605,7 @@ void FillSpellSummary()
//Spell targets AoE at enemy
if ( TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_ENEMY_IN_AREA ||
TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_ENEMY_IN_AREA_INSTANT ||
- TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_AROUND_CASTER ||
+ TempSpell->EffectImplicitTargetA[j] == TARGET_DEST_CASTER ||
TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_ENEMY_IN_AREA_CHANNELED )
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_ENEMY-1);
@@ -617,7 +614,7 @@ void FillSpellSummary()
TempSpell->EffectImplicitTargetA[j] == TARGET_CURRENT_ENEMY_COORDINATES ||
TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_ENEMY_IN_AREA ||
TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_ENEMY_IN_AREA_INSTANT ||
- TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_AROUND_CASTER ||
+ TempSpell->EffectImplicitTargetA[j] == TARGET_DEST_CASTER ||
TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_ENEMY_IN_AREA_CHANNELED )
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_ENEMY-1);
@@ -630,7 +627,7 @@ void FillSpellSummary()
//Spell targets aoe friends
if ( TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_PARTY_AROUND_CASTER ||
TempSpell->EffectImplicitTargetA[j] == TARGET_AREAEFFECT_PARTY ||
- TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_AROUND_CASTER)
+ TempSpell->EffectImplicitTargetA[j] == TARGET_DEST_CASTER)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_AOE_FRIEND-1);
//Spell targets any friend(or self)
@@ -639,7 +636,7 @@ void FillSpellSummary()
TempSpell->EffectImplicitTargetA[j] == TARGET_SINGLE_PARTY ||
TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_PARTY_AROUND_CASTER ||
TempSpell->EffectImplicitTargetA[j] == TARGET_AREAEFFECT_PARTY ||
- TempSpell->EffectImplicitTargetA[j] == TARGET_ALL_AROUND_CASTER)
+ TempSpell->EffectImplicitTargetA[j] == TARGET_DEST_CASTER)
SpellSummary[i].Targets |= 1 << (SELECT_TARGET_ANY_FRIEND-1);
//Make sure that this spell includes a damage effect
@@ -766,7 +763,7 @@ Unit* FindCreature(uint32 entry, float range, Unit* Finder)
return NULL;
Creature* target = NULL;
Trinity::AllCreaturesOfEntryInRange check(Finder, entry, range);
- Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(target, check);
+ Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(Finder, target, check);
Finder->VisitNearbyObject(range, searcher);
return target;
}
@@ -777,7 +774,7 @@ GameObject* FindGameObject(uint32 entry, float range, Unit* Finder)
return NULL;
GameObject* target = NULL;
Trinity::AllGameObjectsWithEntryInGrid go_check(entry);
- Trinity::GameObjectSearcher<Trinity::AllGameObjectsWithEntryInGrid> searcher(target, go_check);
+ Trinity::GameObjectSearcher<Trinity::AllGameObjectsWithEntryInGrid> searcher(Finder, target, go_check);
Finder->VisitNearbyGridObject(range, searcher);
return target;
}
@@ -786,7 +783,7 @@ Unit* ScriptedAI::DoSelectLowestHpFriendly(float range, uint32 MinHPDiff)
{
Unit* pUnit = NULL;
Trinity::MostHPMissingInRange u_check(m_creature, range, MinHPDiff);
- Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(pUnit, u_check);
+ Trinity::UnitLastSearcher<Trinity::MostHPMissingInRange> searcher(m_creature, pUnit, u_check);
m_creature->VisitNearbyObject(range, searcher);
return pUnit;
}
@@ -795,7 +792,7 @@ std::list<Creature*> ScriptedAI::DoFindFriendlyCC(float range)
{
std::list<Creature*> pList;
Trinity::FriendlyCCedInRange u_check(m_creature, range);
- Trinity::CreatureListSearcher<Trinity::FriendlyCCedInRange> searcher(pList, u_check);
+ Trinity::CreatureListSearcher<Trinity::FriendlyCCedInRange> searcher(m_creature, pList, u_check);
m_creature->VisitNearbyObject(range, searcher);
return pList;
}
@@ -804,7 +801,7 @@ std::list<Creature*> ScriptedAI::DoFindFriendlyMissingBuff(float range, uint32 s
{
std::list<Creature*> pList;
Trinity::FriendlyMissingBuffInRange u_check(m_creature, range, spellid);
- Trinity::CreatureListSearcher<Trinity::FriendlyMissingBuffInRange> searcher(pList, u_check);
+ Trinity::CreatureListSearcher<Trinity::FriendlyMissingBuffInRange> searcher(m_creature, pList, u_check);
m_creature->VisitNearbyObject(range, searcher);
return pList;
}
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index f9eb8c716d5..03039fd709e 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+/* Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
* Thanks to the original authors: ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
@@ -11,7 +11,7 @@
#include "CreatureAI.h"
#include "Creature.h"
-float GetSpellMaxRange(uint32 id);
+float GetSpellMaxRangeForHostile(uint32 id);
class SummonList : std::list<uint64>
{
diff --git a/src/bindings/scripts/include/sc_gossip.h b/src/bindings/scripts/include/sc_gossip.h
index 74bc93694af..4f3188104eb 100644
--- a/src/bindings/scripts/include/sc_gossip.h
+++ b/src/bindings/scripts/include/sc_gossip.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+/* Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
* Thanks to the original authors: ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
@@ -16,29 +16,38 @@
#define GOSSIP_TEXT_BROWSE_GOODS "I'd like to browse your goods."
#define GOSSIP_TEXT_TRAIN "Train me!"
-#define GOSSIP_TEXT_BANK "The Bank"
-#define GOSSIP_TEXT_WINDRIDER "Wind rider master"
-#define GOSSIP_TEXT_GRYPHON "Gryphon Master"
-#define GOSSIP_TEXT_BATHANDLER "Bat Handler"
-#define GOSSIP_TEXT_HIPPOGRYPH "Hippogryph Master"
-#define GOSSIP_TEXT_FLIGHTMASTER "Flight Master"
-#define GOSSIP_TEXT_AUCTIONHOUSE "Auction House"
-#define GOSSIP_TEXT_GUILDMASTER "Guild Master"
-#define GOSSIP_TEXT_INN "The Inn"
-#define GOSSIP_TEXT_MAILBOX "Mailbox"
-#define GOSSIP_TEXT_STABLEMASTER "Stable Master"
-#define GOSSIP_TEXT_WEAPONMASTER "Weapons Trainer"
-#define GOSSIP_TEXT_BATTLEMASTER "Battlemaster"
-#define GOSSIP_TEXT_CLASSTRAINER "Class Trainer"
-#define GOSSIP_TEXT_PROFTRAINER "Profession Trainer"
-#define GOSSIP_TEXT_OFFICERS "The officers` lounge"
+#define GOSSIP_TEXT_BANK "The bank"
+#define GOSSIP_TEXT_IRONFORGE_BANK "The bank of Ironforge"
+#define GOSSIP_TEXT_STORMWIND_BANK "The bank of Stormwind"
+#define GOSSIP_TEXT_WINDRIDER "The wind rider master"
+#define GOSSIP_TEXT_GRYPHON "The gryphon master"
+#define GOSSIP_TEXT_BATHANDLER "The bat handler"
+#define GOSSIP_TEXT_HIPPOGRYPH "The hippogryph master"
+#define GOSSIP_TEXT_ZEPPLINMASTER "The zeppelin master"
+#define GOSSIP_TEXT_DEEPRUNTRAM "The Deeprun Tram"
+#define GOSSIP_TEXT_FERRY "The Rut'theran Ferry"
+#define GOSSIP_TEXT_FLIGHTMASTER "The flight master"
+#define GOSSIP_TEXT_AUCTIONHOUSE "The auction house"
+#define GOSSIP_TEXT_GUILDMASTER "The guild master"
+#define GOSSIP_TEXT_INN "The inn"
+#define GOSSIP_TEXT_MAILBOX "The mailbox"
+#define GOSSIP_TEXT_STABLEMASTER "The stable master"
+#define GOSSIP_TEXT_WEAPONMASTER "The weapon master"
+#define GOSSIP_TEXT_OFFICERS "The officers' lounge"
+#define GOSSIP_TEXT_BATTLEMASTER "The battlemaster"
+#define GOSSIP_TEXT_BARBER "Barber"
+#define GOSSIP_TEXT_CLASSTRAINER "A class trainer"
+#define GOSSIP_TEXT_PROFTRAINER "A profession trainer"
+#define GOSSIP_TEXT_LEXICON "Lexicon of Power"
#define GOSSIP_TEXT_ALTERACVALLEY "Alterac Valley"
#define GOSSIP_TEXT_ARATHIBASIN "Arathi Basin"
#define GOSSIP_TEXT_WARSONGULCH "Warsong Gulch"
#define GOSSIP_TEXT_ARENA "Arena"
#define GOSSIP_TEXT_EYEOFTHESTORM "Eye of The Storm"
-
+#define GOSSIP_TEXT_STRANDOFANCIENT "Strand of the Ancients"
+
+#define GOSSIP_TEXT_DEATH_KNIGHT "Death Knight"
#define GOSSIP_TEXT_DRUID "Druid"
#define GOSSIP_TEXT_HUNTER "Hunter"
#define GOSSIP_TEXT_PRIEST "Priest"
@@ -57,18 +66,12 @@
#define GOSSIP_TEXT_FIRSTAID "First Aid"
#define GOSSIP_TEXT_HERBALISM "Herbalism"
#define GOSSIP_TEXT_LEATHERWORKING "Leatherworking"
-#define GOSSIP_TEXT_POISONS "Poisons"
#define GOSSIP_TEXT_TAILORING "Tailoring"
#define GOSSIP_TEXT_MINING "Mining"
#define GOSSIP_TEXT_FISHING "Fishing"
#define GOSSIP_TEXT_SKINNING "Skinning"
#define GOSSIP_TEXT_JEWELCRAFTING "Jewelcrafting"
-
-#define GOSSIP_TEXT_IRONFORGE_BANK "Bank of Ironforge"
-#define GOSSIP_TEXT_STORMWIND_BANK "Bank of Stormwind"
-#define GOSSIP_TEXT_DEEPRUNTRAM "Deeprun Tram"
-#define GOSSIP_TEXT_ZEPPLINMASTER "Zeppelin master"
-#define GOSSIP_TEXT_FERRY "Rut'theran Ferry"
+#define GOSSIP_TEXT_INSCRIPTION "Inscription"
// Skill defines
@@ -86,6 +89,7 @@
#define TRADESKILL_FISHING 12
#define TRADESKILL_SKINNING 13
#define TRADESKILL_JEWLCRAFTING 14
+#define TRADESKILL_INSCRIPTION 15
#define TRADESKILL_LEVEL_NONE 0
#define TRADESKILL_LEVEL_APPRENTICE 1
@@ -93,6 +97,7 @@
#define TRADESKILL_LEVEL_EXPERT 3
#define TRADESKILL_LEVEL_ARTISAN 4
#define TRADESKILL_LEVEL_MASTER 5
+#define TRADESKILL_LEVEL_GRAND_MASTER 6
// Gossip defines
diff --git a/src/bindings/scripts/include/sc_instance.h b/src/bindings/scripts/include/sc_instance.h
index 75a25490419..2f1cd3a16a6 100644
--- a/src/bindings/scripts/include/sc_instance.h
+++ b/src/bindings/scripts/include/sc_instance.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp b/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp
index 6767a8fe88b..1c1b7312cb3 100644
--- a/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp
+++ b/src/bindings/scripts/scripts/areatrigger/areatrigger_scripts.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,7 +23,6 @@ EndScriptData */
/* ContentData
at_legion_teleporter 4560 Teleporter TO Invasion Point: Cataclysm
-at_test script test only
EndContentData */
#include "precompiled.h"
@@ -56,12 +55,6 @@ bool AreaTrigger_at_legion_teleporter(Player *player, AreaTriggerEntry *at)
return false;
}
-bool ATtest(Player *player, AreaTriggerEntry *at)
-{
- player->Say("Hi!",LANG_UNIVERSAL);
- return true;
-}
-
void AddSC_areatrigger_scripts()
{
Script *newscript;
@@ -70,10 +63,5 @@ void AddSC_areatrigger_scripts()
newscript->Name = "at_legion_teleporter";
newscript->pAreaTrigger = &AreaTrigger_at_legion_teleporter;
newscript->RegisterSelf();
-
- newscript = new Script;
- newscript->Name="at_test";
- newscript->pAreaTrigger = &ATtest;
- newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/boss/boss_emeriss.cpp b/src/bindings/scripts/scripts/boss/boss_emeriss.cpp
index fdaae660d73..15a813cd455 100644
--- a/src/bindings/scripts/scripts/boss/boss_emeriss.cpp
+++ b/src/bindings/scripts/scripts/boss/boss_emeriss.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/boss/boss_lethon.cpp b/src/bindings/scripts/scripts/boss/boss_lethon.cpp
index 721009ac68c..e387891efed 100644
--- a/src/bindings/scripts/scripts/boss/boss_lethon.cpp
+++ b/src/bindings/scripts/scripts/boss/boss_lethon.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/boss/boss_taerar.cpp b/src/bindings/scripts/scripts/boss/boss_taerar.cpp
index 9eddeeb3b30..0de457f4094 100644
--- a/src/bindings/scripts/scripts/boss/boss_taerar.cpp
+++ b/src/bindings/scripts/scripts/boss/boss_taerar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/boss/boss_ysondre.cpp b/src/bindings/scripts/scripts/boss/boss_ysondre.cpp
index 8b3d8bcdfed..44795b41750 100644
--- a/src/bindings/scripts/scripts/boss/boss_ysondre.cpp
+++ b/src/bindings/scripts/scripts/boss/boss_ysondre.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/creature/mob_event_ai.cpp b/src/bindings/scripts/scripts/creature/mob_event_ai.cpp
index 89151cd494b..7102add172d 100644
--- a/src/bindings/scripts/scripts/creature/mob_event_ai.cpp
+++ b/src/bindings/scripts/scripts/creature/mob_event_ai.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,6 +23,7 @@ EndScriptData */
#include "precompiled.h"
#include "mob_event_ai.h"
+#include "ObjectMgr.h"
#define EVENT_UPDATE_TIME 500
#define SPELL_RUN_AWAY 8225
@@ -454,6 +455,10 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
}
}
break;
+ case EVENT_T_REACHED_HOME:
+ {
+ }
+ break;
default:
if (EAI_ErrorLevel > 0)
error_db_log("SD2: Creature %u using Event %u has invalid Event Type(%u), missing from ProcessEvent() Switch.", m_creature->GetEntry(), pHolder.Event.event_id, pHolder.Event.event_type);
@@ -541,7 +546,8 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
}else if ( param2 && urand(0,1) )
{
temp = param2;
- }else
+ }
+ else
{
temp = param1;
}
@@ -577,6 +583,43 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
}
}
break;
+ case ACTION_T_SET_FACTION:
+ {
+ if (param1)
+ m_creature->setFaction(param1);
+ else
+ {
+ if (CreatureInfo const* ci = GetCreatureTemplateStore(m_creature->GetEntry()))
+ {
+ //if no id provided, assume reset and then use default
+ if (m_creature->getFaction() != ci->faction_A)
+ m_creature->setFaction(ci->faction_A);
+ }
+ }
+ }
+ break;
+ case ACTION_T_MORPH_TO_ENTRY_OR_MODEL:
+ {
+ if (param1 || param2)
+ {
+ //set model based on entry from creature_template
+ if (param1)
+ {
+ if (CreatureInfo const* ci = GetCreatureTemplateStore(param1))
+ {
+ //use default display
+ if (ci->Modelid1)
+ m_creature->SetDisplayId(ci->Modelid1);
+ }
+ }
+ //if no param1, then use value from param2 (modelId)
+ else
+ m_creature->SetDisplayId(param2);
+ }
+ else
+ m_creature->DeMorph();
+ }
+ break;
case ACTION_T_SOUND:
DoPlaySoundToSet(m_creature, param1);
break;
@@ -639,14 +682,18 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
//Melee current victim if flag not set
if (!(param3 & CAST_NO_MELEE_IF_OOM))
{
- AttackDistance = 0;
- AttackAngle = 0;
-
- m_creature->GetMotionMaster()->Clear(false);
- m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle);
+ if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE)
+ {
+ AttackDistance = 0;
+ AttackAngle = 0;
+
+ m_creature->GetMotionMaster()->Clear(false);
+ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle);
+ }
}
- }else
+ }
+ else
{
//Interrupt any previous spell
if (caster->IsNonMeleeSpellCasted(false) && param3 & CAST_INTURRUPT_PREVIOUS)
@@ -720,6 +767,9 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
{
Unit* target = GetTargetByType(param3, pActionInvoker);
+ if (param1 < OBJECT_END || param1 >= UNIT_END)
+ return;
+
if (target)
target->SetUInt32Value(param1, param2);
}
@@ -751,10 +801,10 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
{
CombatMovementEnabled = param1;
- //Allow movement (create new targeted movement gen if none exist already)
+ //Allow movement (create new targeted movement gen only if idle)
if (CombatMovementEnabled)
{
- if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE)
+ if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE)
{
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle);
@@ -836,9 +886,12 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
if (CombatMovementEnabled)
{
- //Drop current movement gen
- m_creature->GetMotionMaster()->Clear(false);
- m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle);
+ if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE)
+ {
+ //Drop current movement gen
+ m_creature->GetMotionMaster()->Clear(false);
+ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), AttackDistance, AttackAngle);
+ }
}
}
break;
@@ -1004,7 +1057,7 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
EventUpdateTime = EVENT_UPDATE_TIME;
EventDiff = 0;
- //Handle Evade events and reset all events to enabled
+ //Reset all events to enabled
for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i)
{
switch ((*i).Event.event_type)
@@ -1033,22 +1086,39 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
}
}
+ //when creature reach home after EnterEvadeMode
+ void JustReachedHome()
+ {
+ m_creature->LoadCreaturesAddon();
+
+ for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i)
+ {
+ if ((*i).Event.event_type == EVENT_T_REACHED_HOME)
+ ProcessEvent(*i);
+ }
+
+ Reset();
+ }
+
void EnterEvadeMode()
{
- ScriptedAI::EnterEvadeMode();
+ m_creature->InterruptNonMeleeSpells(true);
+ m_creature->RemoveAllAuras();
+ m_creature->DeleteThreatList();
+ m_creature->CombatStop();
- IsFleeing = false;
+ if (m_creature->isAlive())
+ m_creature->GetMotionMaster()->MoveTargetedHome();
+
+ m_creature->SetLootRecipient(NULL);
+
+ InCombat = false;
//Handle Evade events
for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i)
{
- switch ((*i).Event.event_type)
- {
- //Evade
- case EVENT_T_EVADE:
- ProcessEvent(*i);
- break;
- }
+ if ((*i).Event.event_type == EVENT_T_EVADE)
+ ProcessEvent(*i);
}
}
@@ -1251,27 +1321,6 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
{
EventDiff += diff;
- //Check for range based events
- //if (m_creature->GetDistance(m_creature->getVictim()) >
- if (Combat)
- {
- for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i)
- {
- switch ((*i).Event.event_type)
- {
- case EVENT_T_RANGE:
- // in some cases this is called twice and victim may not exist in the second time
- if(m_creature->getVictim())
- {
- float dist = m_creature->GetDistance(m_creature->getVictim());
- if (dist > (*i).Event.event_param1 && dist < (*i).Event.event_param2)
- ProcessEvent(*i);
- }
- break;
- }
- }
- }
-
//Check for time based events
for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i)
{
@@ -1290,9 +1339,9 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
else (*i).Time = 0;
}
+ //Events that are updated every EVENT_UPDATE_TIME
switch ((*i).Event.event_type)
{
- //Events that are updated every EVENT_UPDATE_TIME
case EVENT_T_TIMER_OOC:
ProcessEvent(*i);
break;
@@ -1302,9 +1351,19 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
case EVENT_T_TARGET_HP:
case EVENT_T_TARGET_CASTING:
case EVENT_T_FRIENDLY_HP:
- if( Combat )
+ if (Combat)
ProcessEvent(*i);
break;
+ case EVENT_T_RANGE:
+ if (Combat)
+ {
+ if (m_creature->IsWithinDistInMap(m_creature->getVictim(),(float)(*i).Event.event_param2))
+ {
+ if (m_creature->GetDistance(m_creature->getVictim()) >= (float)(*i).Event.event_param1)
+ ProcessEvent(*i);
+ }
+ }
+ break;
}
}
diff --git a/src/bindings/scripts/scripts/creature/mob_event_ai.h b/src/bindings/scripts/scripts/creature/mob_event_ai.h
index fafd21b3543..a9834a7d125 100644
--- a/src/bindings/scripts/scripts/creature/mob_event_ai.h
+++ b/src/bindings/scripts/scripts/creature/mob_event_ai.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
@@ -29,52 +29,52 @@ enum Event_Types
EVENT_T_SUMMONED_UNIT = 17, //CreatureId, RepeatMin, RepeatMax
EVENT_T_TARGET_MANA = 18, //ManaMax%, ManaMin%, RepeatMin, RepeatMax
EVENT_T_QUEST_ACCEPT = 19, //QuestID
- EVENT_T_QUEST_COMPLETE = 20, //
+ EVENT_T_REACHED_HOME = 21, //NONE
EVENT_T_END,
};
enum Action_Types
{
- ACTION_T_NONE = 0, //No action
- ACTION_T_TEXT = 1, //-TextId1, optionally -TextId2, optionally -TextId3(if -TextId2 exist). If more than just -TextId1 is defined, randomize. Negative values.
- ACTION_T_YELL = 2, //UNUSED
- ACTION_T_TEXTEMOTE = 3, //UNUSED
- ACTION_T_SOUND = 4, //SoundId
- ACTION_T_EMOTE = 5, //EmoteId
- ACTION_T_RANDOM_SAY = 6, //UNUSED
- ACTION_T_RANDOM_YELL = 7, //UNUSED
- ACTION_T_RANDOM_TEXTEMOTE = 8, //UNUSED
- ACTION_T_RANDOM_SOUND = 9, //SoundId1, SoundId2, SoundId3 (-1 in any field means no output if randomed that field)
- ACTION_T_RANDOM_EMOTE = 10, //EmoteId1, EmoteId2, EmoteId3 (-1 in any field means no output if randomed that field)
- ACTION_T_CAST = 11, //SpellId, Target, CastFlags
- ACTION_T_SUMMON = 12, //CreatureID, Target, Duration in ms
- ACTION_T_THREAT_SINGLE_PCT = 13, //Threat%, Target
- ACTION_T_THREAT_ALL_PCT = 14, //Threat%
- ACTION_T_QUEST_EVENT = 15, //QuestID, Target
- ACTION_T_CASTCREATUREGO = 16, //QuestID, SpellId, Target
- ACTION_T_SET_UNIT_FIELD = 17, //Field_Number, Value, Target
- ACTION_T_SET_UNIT_FLAG = 18, //Flags (may be more than one field OR'd together), Target
- ACTION_T_REMOVE_UNIT_FLAG = 19, //Flags (may be more than one field OR'd together), Target
- ACTION_T_AUTO_ATTACK = 20, //AllowAttackState (0 = stop attack, anything else means continue attacking)
- ACTION_T_COMBAT_MOVEMENT = 21, //AllowCombatMovement (0 = stop combat based movement, anything else continue attacking)
- ACTION_T_SET_PHASE = 22, //Phase
- ACTION_T_INC_PHASE = 23, //Value (may be negative to decrement phase, should not be 0)
- ACTION_T_EVADE = 24, //No Params
- ACTION_T_FLEE = 25, //No Params
- ACTION_T_QUEST_EVENT_ALL = 26, //QuestID
- ACTION_T_CASTCREATUREGO_ALL = 27, //QuestId, SpellId
- ACTION_T_REMOVEAURASFROMSPELL = 28, //Target, Spellid
- ACTION_T_RANGED_MOVEMENT = 29, //Distance, Angle
- ACTION_T_RANDOM_PHASE = 30, //PhaseId1, PhaseId2, PhaseId3
- ACTION_T_RANDOM_PHASE_RANGE = 31, //PhaseMin, PhaseMax
- ACTION_T_SUMMON_ID = 32, //CreatureId, Target, SpawnId
- ACTION_T_KILLED_MONSTER = 33, //CreatureId, Target
- ACTION_T_SET_INST_DATA = 34, //Field, Data
- ACTION_T_SET_INST_DATA64 = 35, //Field, Target
- ACTION_T_UPDATE_TEMPLATE = 36, //Entry, Team
- ACTION_T_DIE = 37, //No Params
- ACTION_T_ZONE_COMBAT_PULSE = 38, //No Params
+ ACTION_T_NONE = 0, //No action
+ ACTION_T_TEXT = 1, //-TextId1, optionally -TextId2, optionally -TextId3(if -TextId2 exist). If more than just -TextId1 is defined, randomize. Negative values.
+ ACTION_T_SET_FACTION = 2, //FactionId (or 0 for default)
+ ACTION_T_MORPH_TO_ENTRY_OR_MODEL = 3, //Creature_template entry(param1) OR ModelId (param2) (or 0 for both to demorph)
+ ACTION_T_SOUND = 4, //SoundId
+ ACTION_T_EMOTE = 5, //EmoteId
+ ACTION_T_RANDOM_SAY = 6, //UNUSED
+ ACTION_T_RANDOM_YELL = 7, //UNUSED
+ ACTION_T_RANDOM_TEXTEMOTE = 8, //UNUSED
+ ACTION_T_RANDOM_SOUND = 9, //SoundId1, SoundId2, SoundId3 (-1 in any field means no output if randomed that field)
+ ACTION_T_RANDOM_EMOTE = 10, //EmoteId1, EmoteId2, EmoteId3 (-1 in any field means no output if randomed that field)
+ ACTION_T_CAST = 11, //SpellId, Target, CastFlags
+ ACTION_T_SUMMON = 12, //CreatureID, Target, Duration in ms
+ ACTION_T_THREAT_SINGLE_PCT = 13, //Threat%, Target
+ ACTION_T_THREAT_ALL_PCT = 14, //Threat%
+ ACTION_T_QUEST_EVENT = 15, //QuestID, Target
+ ACTION_T_CASTCREATUREGO = 16, //QuestID, SpellId, Target
+ ACTION_T_SET_UNIT_FIELD = 17, //Field_Number, Value, Target
+ ACTION_T_SET_UNIT_FLAG = 18, //Flags (may be more than one field OR'd together), Target
+ ACTION_T_REMOVE_UNIT_FLAG = 19, //Flags (may be more than one field OR'd together), Target
+ ACTION_T_AUTO_ATTACK = 20, //AllowAttackState (0 = stop attack, anything else means continue attacking)
+ ACTION_T_COMBAT_MOVEMENT = 21, //AllowCombatMovement (0 = stop combat based movement, anything else continue attacking)
+ ACTION_T_SET_PHASE = 22, //Phase
+ ACTION_T_INC_PHASE = 23, //Value (may be negative to decrement phase, should not be 0)
+ ACTION_T_EVADE = 24, //No Params
+ ACTION_T_FLEE = 25, //No Params
+ ACTION_T_QUEST_EVENT_ALL = 26, //QuestID
+ ACTION_T_CASTCREATUREGO_ALL = 27, //QuestId, SpellId
+ ACTION_T_REMOVEAURASFROMSPELL = 28, //Target, Spellid
+ ACTION_T_RANGED_MOVEMENT = 29, //Distance, Angle
+ ACTION_T_RANDOM_PHASE = 30, //PhaseId1, PhaseId2, PhaseId3
+ ACTION_T_RANDOM_PHASE_RANGE = 31, //PhaseMin, PhaseMax
+ ACTION_T_SUMMON_ID = 32, //CreatureId, Target, SpawnId
+ ACTION_T_KILLED_MONSTER = 33, //CreatureId, Target
+ ACTION_T_SET_INST_DATA = 34, //Field, Data
+ ACTION_T_SET_INST_DATA64 = 35, //Field, Target
+ ACTION_T_UPDATE_TEMPLATE = 36, //Entry, Team
+ ACTION_T_DIE = 37, //No Params
+ ACTION_T_ZONE_COMBAT_PULSE = 38, //No Params
ACTION_T_SET_ACTIVE = 101, //Apply
ACTION_T_SET_AGGRESSIVE = 102, //Apply
diff --git a/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp b/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp
index 1a42f53ed1a..79ffef4ad54 100644
--- a/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp
+++ b/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/creature/simple_ai.cpp b/src/bindings/scripts/scripts/creature/simple_ai.cpp
index 96583c4ee39..5dd299e0a14 100644
--- a/src/bindings/scripts/scripts/creature/simple_ai.cpp
+++ b/src/bindings/scripts/scripts/creature/simple_ai.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -27,34 +27,25 @@ EndScriptData */
SimpleAI::SimpleAI(Creature *c) : ScriptedAI(c)
{
//Clear all data
- Aggro_Text[0] = NULL;
- Aggro_Text[1] = NULL;
- Aggro_Text[2] = NULL;
- Aggro_Say[0] = false;
- Aggro_Say[1] = false;
- Aggro_Say[2] = false;
+ Aggro_TextId[0] = 0;
+ Aggro_TextId[1] = 0;
+ Aggro_TextId[2] = 0;
Aggro_Sound[0] = 0;
Aggro_Sound[1] = 0;
Aggro_Sound[2] = 0;
- Death_Text[0] = NULL;
- Death_Text[1] = NULL;
- Death_Text[2] = NULL;
- Death_Say[0] = false;
- Death_Say[1] = false;
- Death_Say[2] = false;
+ Death_TextId[0] = 0;
+ Death_TextId[1] = 0;
+ Death_TextId[2] = 0;
Death_Sound[0] = 0;
Death_Sound[1] = 0;
Death_Sound[2] = 0;
Death_Spell = 0;
Death_Target_Type = 0;
- Kill_Text[0] = NULL;
- Kill_Text[1] = NULL;
- Kill_Text[2] = NULL;
- Kill_Say[0] = false;
- Kill_Say[1] = false;
- Kill_Say[2] = false;
+ Kill_TextId[0] = 0;
+ Kill_TextId[1] = 0;
+ Kill_TextId[2] = 0;
Kill_Sound[0] = 0;
Kill_Sound[1] = 0;
Kill_Sound[2] = 0;
@@ -106,11 +97,9 @@ void SimpleAI::Aggro(Unit *who)
uint32 random_text = rand()%3;
- //Random yell
- if (Aggro_Text[random_text])
- if (Aggro_Say[random_text])
- DoSay(Aggro_Text[random_text], LANG_UNIVERSAL, who);
- else DoYell(Aggro_Text[random_text], LANG_UNIVERSAL, who);
+ //Random text
+ if (Aggro_TextId[random_text])
+ DoScriptText(Aggro_TextId[random_text], m_creature, who);
//Random sound
if (Aggro_Sound[random_text])
@@ -122,10 +111,8 @@ void SimpleAI::KilledUnit(Unit *victim)
uint32 random_text = rand()%3;
//Random yell
- if (Kill_Text[random_text])
- if (Kill_Say[random_text])
- DoSay(Kill_Text[random_text], LANG_UNIVERSAL, victim);
- else DoYell(Kill_Text[random_text], LANG_UNIVERSAL, victim);
+ if (Kill_TextId[random_text])
+ DoScriptText(Kill_TextId[random_text], m_creature, victim);
//Random sound
if (Kill_Sound[random_text])
@@ -172,10 +159,8 @@ void SimpleAI::DamageTaken(Unit *killer, uint32 &damage)
uint32 random_text = rand()%3;
//Random yell
- if (Death_Text[random_text])
- if (Death_Say[random_text])
- DoSay(Death_Text[random_text], LANG_UNIVERSAL, killer);
- else DoYell(Death_Text[random_text], LANG_UNIVERSAL, killer);
+ if (Death_TextId[random_text])
+ DoScriptText(Death_TextId[random_text], m_creature, killer);
//Random sound
if (Death_Sound[random_text])
@@ -269,10 +254,8 @@ void SimpleAI::UpdateAI(const uint32 diff)
uint32 random_text = rand()%3;
//Random yell
- if (Spell[i].Text[random_text])
- if (Spell[i].Say[random_text])
- DoSay(Spell[i].Text[random_text], LANG_UNIVERSAL, target);
- else DoYell(Spell[i].Text[random_text], LANG_UNIVERSAL, target);
+ if (Spell[i].TextId[random_text])
+ DoScriptText(Spell[i].TextId[random_text], m_creature, target);
//Random sound
if (Spell[i].Text_Sound[random_text])
diff --git a/src/bindings/scripts/scripts/creature/simple_ai.h b/src/bindings/scripts/scripts/creature/simple_ai.h
index 8745d78ad41..44cadef1f33 100644
--- a/src/bindings/scripts/scripts/creature/simple_ai.h
+++ b/src/bindings/scripts/scripts/creature/simple_ai.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
@@ -35,18 +35,15 @@ struct TRINITY_DLL_DECL SimpleAI : public ScriptedAI
public:
- char* Aggro_Text[3];
- bool Aggro_Say[3];
+ int32 Aggro_TextId[3];
uint32 Aggro_Sound[3];
- char* Death_Text[3];
- bool Death_Say[3];
+ int32 Death_TextId[3];
uint32 Death_Sound[3];
uint32 Death_Spell;
uint32 Death_Target_Type;
- char* Kill_Text[3];
- bool Kill_Say[3];
+ int32 Kill_TextId[3];
uint32 Kill_Sound[3];
uint32 Kill_Spell;
uint32 Kill_Target_Type;
@@ -62,8 +59,7 @@ public:
bool Enabled; //Spell enabled or disabled (default: false)
//3 texts to many?
- char* Text[3];
- bool Say[3];
+ int32 TextId[3];
uint32 Text_Sound[3];
}Spell[10];
diff --git a/src/bindings/scripts/scripts/examples/example_creature.cpp b/src/bindings/scripts/scripts/examples/example_creature.cpp
new file mode 100644
index 00000000000..708740c3b9d
--- /dev/null
+++ b/src/bindings/scripts/scripts/examples/example_creature.cpp
@@ -0,0 +1,261 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Example_Creature
+SD%Complete: 100
+SDComment: Short custom scripting example
+SDCategory: Script Examples
+EndScriptData */
+
+#include "precompiled.h"
+
+// **** This script is designed as an example for others to build on ****
+// **** Please modify whatever you'd like to as this script is only for developement ****
+
+// **** Script Info ****
+// This script is written in a way that it can be used for both friendly and hostile monsters
+// Its primary purpose is to show just how much you can really do with scripts
+// I recommend trying it out on both an agressive NPC and on friendly npc
+
+// **** Quick Info ****
+// Functions with Handled Function marked above them are functions that are called automatically by the core
+// Functions that are marked Custom Function are functions I've created to simplify code
+
+//List of text id's. The text is stored in database, also in a localized version
+//(if translation not exist for the textId, default english text will be used)
+//Not required to define in this way, but simplify if changes are needed.
+#define SAY_AGGRO -1999900
+#define SAY_RANDOM_0 -1999901
+#define SAY_RANDOM_1 -1999902
+#define SAY_RANDOM_2 -1999903
+#define SAY_RANDOM_3 -1999904
+#define SAY_RANDOM_4 -1999905
+#define SAY_BESERK -1999906
+#define SAY_PHASE -1999907
+#define SAY_DANCE -1999908
+#define SAY_SALUTE -1999909
+
+//List of gossip item texts. Items will appear in the gossip window.
+#define GOSSIP_ITEM "I'm looking for a fight"
+
+//List of spells. Not required to define them in this way, but will make it easier to maintain in case spellId change
+#define SPELL_BUFF 25661
+#define SPELL_ONE 12555
+#define SPELL_ONE_ALT 24099
+#define SPELL_TWO 10017
+#define SPELL_THREE 26027
+#define SPELL_ENRAGE 23537
+#define SPELL_BESERK 32309
+
+struct TRINITY_DLL_DECL example_creatureAI : public ScriptedAI
+{
+ //*** HANDLED FUNCTION ***
+ //This is the constructor, called only once when the creature is first created
+ example_creatureAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+ //*** CUSTOM VARIABLES ****
+ //These variables are for use only by this individual script.
+ //Nothing else will ever call them but us.
+
+ uint32 Say_Timer; //Timer for random chat
+ uint32 Rebuff_Timer; //Timer for rebuffing
+ uint32 Spell_1_Timer; //Timer for spell 1 when in combat
+ uint32 Spell_2_Timer; //Timer for spell 1 when in combat
+ uint32 Spell_3_Timer; //Timer for spell 1 when in combat
+ uint32 Beserk_Timer; //Timer until we go into Beserk (enraged) mode
+ uint32 Phase; //The current battle phase we are in
+ uint32 Phase_Timer; //Timer until phase transition
+
+ //*** HANDLED FUNCTION ***
+ //This is called whenever the core decides we need to evade
+ void Reset()
+ {
+ Phase = 1; //Start in phase 1
+ Phase_Timer = 60000; //60 seconds
+ Spell_1_Timer = 5000; //5 seconds
+ Spell_2_Timer = 37000; //37 seconds
+ Spell_3_Timer = 19000; //19 seconds
+ Beserk_Timer = 120000; //2 minutes
+ }
+
+ //*** HANDLED FUNCTION ***
+ //Attack Start is called whenever someone hits us.
+ void Aggro(Unit *who)
+ {
+ //Say some stuff
+ DoScriptText(SAY_AGGRO, m_creature, who);
+ }
+
+ //*** HANDLED FUNCTION ***
+ //Update AI is called Every single map update (roughly once every 100ms if a player is within the grid)
+ void UpdateAI(const uint32 diff)
+ {
+ //Out of combat timers
+ if (!m_creature->getVictim())
+ {
+ //Random Say timer
+ if (Say_Timer < diff)
+ {
+ //Random switch between 5 outcomes
+ switch (rand()%5)
+ {
+ case 0: DoScriptText(SAY_RANDOM_0, m_creature); break;
+ case 1: DoScriptText(SAY_RANDOM_1, m_creature); break;
+ case 2: DoScriptText(SAY_RANDOM_2, m_creature); break;
+ case 3: DoScriptText(SAY_RANDOM_3, m_creature); break;
+ case 4: DoScriptText(SAY_RANDOM_4, m_creature); break;
+ }
+
+ Say_Timer = 45000; //Say something agian in 45 seconds
+ }else Say_Timer -= diff;
+
+ //Rebuff timer
+ if (Rebuff_Timer < diff)
+ {
+ DoCast(m_creature,SPELL_BUFF);
+ Rebuff_Timer = 900000; //Rebuff agian in 15 minutes
+ }else Rebuff_Timer -= diff;
+ }
+
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Spell 1 timer
+ if (Spell_1_Timer < diff)
+ {
+ //Cast spell one on our current target.
+ if (rand()%50 > 10)
+ DoCast(m_creature->getVictim(),SPELL_ONE_ALT);
+ else if (m_creature->GetDistance(m_creature->getVictim()) < 25)
+ DoCast(m_creature->getVictim(),SPELL_ONE);
+
+ Spell_1_Timer = 5000;
+ }else Spell_1_Timer -= diff;
+
+ //Spell 2 timer
+ if (Spell_2_Timer < diff)
+ {
+ //Cast spell one on our current target.
+ DoCast(m_creature->getVictim(),SPELL_TWO);
+
+ Spell_2_Timer = 37000;
+ }else Spell_2_Timer -= diff;
+
+ //Spell 3 timer
+ if (Phase > 1)
+ if (Spell_3_Timer < diff)
+ {
+ //Cast spell one on our current target.
+ DoCast(m_creature->getVictim(),SPELL_THREE);
+
+ Spell_3_Timer = 19000;
+ }else Spell_3_Timer -= diff;
+
+ //Beserk timer
+ if (Phase > 1)
+ if (Beserk_Timer < diff)
+ {
+ //Say our line then cast uber death spell
+ DoScriptText(SAY_BESERK, m_creature, m_creature->getVictim());
+ DoCast(m_creature->getVictim(),SPELL_BESERK);
+
+ //Cast our beserk spell agian in 12 seconds if we didn't kill everyone
+ Beserk_Timer = 12000;
+ }else Beserk_Timer -= diff;
+
+ //Phase timer
+ if (Phase == 1)
+ if (Phase_Timer < diff)
+ {
+ //Go to next phase
+ Phase++;
+ DoScriptText(SAY_PHASE, m_creature);
+ DoCast(m_creature,SPELL_ENRAGE);
+ }else Phase_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+//This is the GetAI method used by all scripts that involve AI
+//It is called every time a new creature using this script is created
+CreatureAI* GetAI_example_creature(Creature *_Creature)
+{
+ return new example_creatureAI (_Creature);
+}
+
+//This function is called when the player clicks an option on the gossip menu
+void SendDefaultMenu_example_creature(Player *player, Creature *_Creature, uint32 action)
+{
+ if (action == GOSSIP_ACTION_INFO_DEF + 1) //Fight time
+ {
+ //Set our faction to hostile twoards all
+ _Creature->setFaction(24);
+ _Creature->Attack(player, true);
+ player->PlayerTalkClass->CloseGossip();
+ }
+}
+
+//This function is called when the player clicks an option on the gossip menu
+bool GossipSelect_example_creature(Player *player, Creature *_Creature, uint32 sender, uint32 action )
+{
+ if (sender == GOSSIP_SENDER_MAIN)
+ SendDefaultMenu_example_creature(player, _Creature, action);
+
+ return true;
+}
+
+//This function is called when the player opens the gossip menu
+bool GossipHello_example_creature(Player *player, Creature *_Creature)
+{
+ player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM , GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ player->PlayerTalkClass->SendGossipMenu(907,_Creature->GetGUID());
+
+ return true;
+}
+
+//Our Recive emote function
+bool ReceiveEmote_example_creature(Player *player, Creature *_Creature, uint32 emote)
+{
+ _Creature->HandleEmoteCommand(emote);
+
+ if (emote == TEXTEMOTE_DANCE)
+ DoScriptText(SAY_DANCE, _Creature);
+
+ if (emote == TEXTEMOTE_SALUTE)
+ DoScriptText(SAY_SALUTE, _Creature);
+
+ return true;
+}
+
+//This is the actual function called only once durring InitScripts()
+//It must define all handled functions that are to be run in this script
+//For example if you want this Script to handle Emotes you must include
+//newscript->ReciveEmote = My_Emote_Function;
+void AddSC_example_creature()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "example_creature";
+ newscript->GetAI = &GetAI_example_creature;
+ newscript->pGossipHello = &GossipHello_example_creature;
+ newscript->pGossipSelect = &GossipSelect_example_creature;
+ newscript->pReceiveEmote = &ReceiveEmote_example_creature;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/examples/example_escort.cpp b/src/bindings/scripts/scripts/examples/example_escort.cpp
new file mode 100644
index 00000000000..56c3f5c654b
--- /dev/null
+++ b/src/bindings/scripts/scripts/examples/example_escort.cpp
@@ -0,0 +1,220 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Example_Escort
+SD%Complete: 100
+SDComment: Script used for testing escortAI
+SDCategory: Script Examples
+EndScriptData */
+
+#include "precompiled.h"
+#include "../npc/npc_escortAI.h"
+
+#define SAY_AGGRO1 -1999910
+#define SAY_AGGRO2 -1999911
+#define SAY_WP_1 -1999912
+#define SAY_WP_2 -1999913
+#define SAY_WP_3 -1999914
+#define SAY_WP_4 -1999915
+#define SAY_DEATH_1 -1999916
+#define SAY_DEATH_2 -1999917
+#define SAY_DEATH_3 -1999918
+#define SAY_SPELL -1999919
+#define SAY_RAND_1 -1999920
+#define SAY_RAND_2 -1999921
+
+#define GOSSIP_ITEM_1 "Click to Test Escort(Attack, Defend, Run)"
+#define GOSSIP_ITEM_2 "Click to Test Escort(NoAttack, NoDefend, Walk)"
+#define GOSSIP_ITEM_3 "Click to Test Escort(NoAttack, Defend, Walk)"
+
+struct TRINITY_DLL_DECL example_escortAI : public npc_escortAI
+{
+ public:
+
+ // CreatureAI functions
+ example_escortAI(Creature *c) : npc_escortAI(c) {Reset();}
+
+ uint32 DeathCoilTimer;
+ uint32 ChatTimer;
+
+ // Pure Virtual Functions
+ void WaypointReached(uint32 i)
+ {
+ switch (i)
+ {
+ case 1:
+ DoScriptText(SAY_WP_1, m_creature);
+ break;
+
+ case 3:
+ {
+ DoScriptText(SAY_WP_2, m_creature);
+ Creature* temp = m_creature->SummonCreature(21878, m_creature->GetPositionX()+5, m_creature->GetPositionY()+7, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
+
+ temp->AI()->AttackStart(m_creature);
+ }
+ break;
+
+ case 4:
+ {
+ Unit* temp = Unit::GetUnit(*m_creature, PlayerGUID);
+ if (temp)
+ {
+ //temp is the target of the text
+ DoScriptText(SAY_WP_3, m_creature, temp);
+ //temp is the source of the text
+ DoScriptText(SAY_WP_4, temp);
+ }
+ }
+ break;
+ }
+ }
+
+ void Aggro(Unit* who)
+ {
+ if (IsBeingEscorted)
+ {
+ if (Unit* temp = Unit::GetUnit(*m_creature, PlayerGUID))
+ DoScriptText(SAY_AGGRO1, m_creature, temp);
+ }
+ else DoScriptText(SAY_AGGRO2, m_creature);
+ }
+
+ void Reset()
+ {
+ DeathCoilTimer = 4000;
+ ChatTimer = 4000;
+ }
+
+ void JustDied(Unit* killer)
+ {
+ if (IsBeingEscorted)
+ {
+ Unit *pTemp = Unit::GetUnit(*m_creature,PlayerGUID);
+ //killer = m_creature when player got to far from creature
+ if (killer == m_creature)
+ {
+ //This is actually a whisper. You control the text type in database
+ if (pTemp)
+ DoScriptText(SAY_DEATH_1, m_creature, pTemp);
+ }
+ else if (pTemp) DoScriptText(SAY_DEATH_2, m_creature, pTemp);
+ }
+ else DoScriptText(SAY_DEATH_3, m_creature);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ //Must update npc_escortAI
+ npc_escortAI::UpdateAI(diff);
+
+ //Combat check
+ if (InCombat && m_creature->getVictim())
+ {
+ if (DeathCoilTimer < diff)
+ {
+ DoScriptText(SAY_SPELL, m_creature);
+ m_creature->CastSpell(m_creature->getVictim(), 33130, false);
+
+ DeathCoilTimer = 4000;
+ }else DeathCoilTimer -= diff;
+ }else
+ {
+ //Out of combat but being escorted
+ if (IsBeingEscorted)
+ if (ChatTimer < diff)
+ {
+ if (m_creature->HasAura(3593, 0))
+ {
+ DoScriptText(SAY_RAND_1, m_creature);
+ m_creature->CastSpell(m_creature, 11540, false);
+ }else
+ {
+ DoScriptText(SAY_RAND_2, m_creature);
+ m_creature->CastSpell(m_creature, 3593, false);
+ }
+
+ ChatTimer = 12000;
+ }else ChatTimer -= diff;
+ }
+ }
+};
+
+CreatureAI* GetAI_example_escort(Creature *_Creature)
+{
+ example_escortAI* testAI = new example_escortAI(_Creature);
+
+ testAI->AddWaypoint(0, 1231, -4419, 23);
+ testAI->AddWaypoint(1, 1198, -4440, 23, 0);
+ testAI->AddWaypoint(2, 1208, -4392, 23);
+ testAI->AddWaypoint(3, 1231, -4419, 23, 5000);
+ testAI->AddWaypoint(4, 1208, -4392, 23, 5000);
+
+ return (CreatureAI*)testAI;
+}
+
+bool GossipHello_example_escort(Player *player, Creature *_Creature)
+{
+ player->TalkedToCreature(_Creature->GetEntry(),_Creature->GetGUID());
+ _Creature->prepareGossipMenu(player,0);
+
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
+
+ _Creature->sendPreparedGossip( player );
+ return true;
+}
+
+bool GossipSelect_example_escort(Player *player, Creature *_Creature, uint32 sender, uint32 action )
+{
+ if (action == GOSSIP_ACTION_INFO_DEF+1)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ ((npc_escortAI*)(_Creature->AI()))->Start(true, true, true, player->GetGUID());
+
+ return true; // prevent mangos core handling
+ }
+
+ if (action == GOSSIP_ACTION_INFO_DEF+2)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ ((npc_escortAI*)(_Creature->AI()))->Start(false, false, false, player->GetGUID());
+
+ return true; // prevent mangos core handling
+ }
+
+ if (action == GOSSIP_ACTION_INFO_DEF+3)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ ((npc_escortAI*)(_Creature->AI()))->Start(false, true, false, player->GetGUID());
+
+ return true; // prevent mangos core handling
+ }
+ return false;
+}
+
+void AddSC_example_escort()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "example_escort";
+ newscript->GetAI = &GetAI_example_escort;
+ newscript->pGossipHello = &GossipHello_example_escort;
+ newscript->pGossipSelect = &GossipSelect_example_escort;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/examples/example_gossip_codebox.cpp b/src/bindings/scripts/scripts/examples/example_gossip_codebox.cpp
new file mode 100644
index 00000000000..5d05197fd7a
--- /dev/null
+++ b/src/bindings/scripts/scripts/examples/example_gossip_codebox.cpp
@@ -0,0 +1,88 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Example_Gossip_Codebox
+SD%Complete: 100
+SDComment: Show a codebox in gossip option
+SDCategory: Script Examples
+EndScriptData */
+
+#include "precompiled.h"
+#include <cstring>
+
+#define SAY_NOT_INTERESTED -1999922
+#define SAY_WRONG -1999923
+#define SAY_CORRECT -1999924
+
+#define GOSSIP_ITEM_1 "A quiz: what's your name?"
+#define GOSSIP_ITEM_2 "I'm not interested"
+
+//This function is called when the player opens the gossip menubool
+bool GossipHello_example_gossip_codebox(Player *player, Creature *_Creature)
+{
+ player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1, "", 0, true);
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
+
+ player->PlayerTalkClass->SendGossipMenu(907,_Creature->GetGUID());
+ return true;
+}
+
+//This function is called when the player clicks an option on the gossip menubool
+bool GossipSelect_example_gossip_codebox(Player *player, Creature *_Creature, uint32 sender, uint32 action )
+{
+ if(action == GOSSIP_ACTION_INFO_DEF+2)
+ {
+ DoScriptText(SAY_NOT_INTERESTED, _Creature);
+ player->CLOSE_GOSSIP_MENU();
+ }
+ return true;
+}
+
+bool GossipSelectWithCode_example_gossip_codebox( Player *player, Creature *_Creature, uint32 sender, uint32 action, const char* sCode )
+{
+ if(sender == GOSSIP_SENDER_MAIN)
+ {
+ if(action == GOSSIP_ACTION_INFO_DEF+1)
+ {
+ if(std::strcmp(sCode, player->GetName())!=0)
+ {
+ DoScriptText(SAY_WRONG, _Creature);
+ _Creature->CastSpell(player, 12826, true);
+ }
+ else
+ {
+ DoScriptText(SAY_CORRECT, _Creature);
+ _Creature->CastSpell(player, 26990, true);
+ }
+ player->CLOSE_GOSSIP_MENU();
+ return true;
+ }
+ }
+ return false;
+}
+
+void AddSC_example_gossip_codebox()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "example_gossip_codebox";
+ newscript->pGossipHello = &GossipHello_example_gossip_codebox;
+ newscript->pGossipSelect = &GossipSelect_example_gossip_codebox;
+ newscript->pGossipSelectWithCode = &GossipSelectWithCode_example_gossip_codebox;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/examples/example_misc.cpp b/src/bindings/scripts/scripts/examples/example_misc.cpp
new file mode 100644
index 00000000000..63136c6bc5d
--- /dev/null
+++ b/src/bindings/scripts/scripts/examples/example_misc.cpp
@@ -0,0 +1,65 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Example_Misc
+SD%Complete: 100
+SDComment: Item, Areatrigger and other small code examples
+SDCategory: Script Examples
+EndScriptData */
+
+#include "precompiled.h"
+
+#define SAY_HI -1999925
+
+bool AT_example_areatrigger(Player *player, AreaTriggerEntry *at)
+{
+ DoScriptText(SAY_HI, player);
+ return true;
+}
+
+extern void LoadDatabase();
+bool ItemUse_example_item(Player *player, Item* _Item, SpellCastTargets const& targets)
+{
+ LoadDatabase();
+ return true;
+}
+
+bool GOHello_example_go_teleporter(Player *player, GameObject* _GO)
+{
+ player->TeleportTo(0, 1807.07f,336.105f,70.3975f,0.0f);
+ return false;
+}
+
+void AddSC_example_misc()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "example_areatrigger";
+ newscript->pAreaTrigger = &AT_example_areatrigger;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "example_item";
+ newscript->pItemUse = &ItemUse_example_item;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "example_go_teleporter";
+ newscript->pGOHello = &GOHello_example_go_teleporter;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/go/go_scripts.cpp b/src/bindings/scripts/scripts/go/go_scripts.cpp
index 2a40a1352cb..07eb4656563 100644
--- a/src/bindings/scripts/scripts/go/go_scripts.cpp
+++ b/src/bindings/scripts/scripts/go/go_scripts.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -29,8 +29,7 @@ go_barov_journal
go_field_repair_bot_74A
go_orb_of_command
go_tablet_of_madness
-go_tablet_of_the_seven
-go_teleporter
+go_tablet_of_the_seven
EndContentData */
#include "precompiled.h"
@@ -148,16 +147,6 @@ bool GOHello_go_tablet_of_the_seven(Player *player, GameObject* _GO)
return true;
}
-/*######
-## go_teleporter
-######*/
-
-bool GOHello_go_teleporter(Player *player, GameObject* _GO)
-{
- player->TeleportTo(0, 1807.07f,336.105f,70.3975f,0.0f);
- return false;
-}
-
void AddSC_go_scripts()
{
Script *newscript;
@@ -201,10 +190,5 @@ void AddSC_go_scripts()
newscript->Name="go_tablet_of_the_seven";
newscript->pGOHello = &GOHello_go_tablet_of_the_seven;
newscript->RegisterSelf();
-
- newscript = new Script;
- newscript->Name="go_teleporter";
- newscript->pGOHello = &GOHello_go_teleporter;
- newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/guard/guard_ai.cpp b/src/bindings/scripts/scripts/guard/guard_ai.cpp
index f28820eb7ee..b635ae74b2d 100644
--- a/src/bindings/scripts/scripts/guard/guard_ai.cpp
+++ b/src/bindings/scripts/scripts/guard/guard_ai.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -28,6 +28,10 @@ EndScriptData */
#define GENERIC_CREATURE_COOLDOWN 5000
+#define SAY_GUARD_SIL_AGGRO1 -1070001
+#define SAY_GUARD_SIL_AGGRO2 -1070002
+#define SAY_GUARD_SIL_AGGRO3 -1070003
+
void guardAI::Reset()
{
GlobalCooldown = 0;
@@ -40,15 +44,9 @@ void guardAI::Aggro(Unit *who)
{
switch(rand()%3)
{
- case 0:
- DoSay("Taste blade, mongrel!", LANG_UNIVERSAL,NULL);
- break;
- case 1:
- DoSay("Please tell me that you didn't just do what I think you just did. Please tell me that I'm not going to have to hurt you...", LANG_UNIVERSAL,NULL);
- break;
- case 2:
- DoSay("As if we don't have enough problems, you go and create more!", LANG_UNIVERSAL,NULL);
- break;
+ case 0: DoScriptText(SAY_GUARD_SIL_AGGRO1, m_creature, who); break;
+ case 1: DoScriptText(SAY_GUARD_SIL_AGGRO1, m_creature, who); break;
+ case 2: DoScriptText(SAY_GUARD_SIL_AGGRO1, m_creature, who); break;
}
}
diff --git a/src/bindings/scripts/scripts/guard/guard_ai.h b/src/bindings/scripts/scripts/guard/guard_ai.h
index aba1266ee9f..6b346aefbb3 100644
--- a/src/bindings/scripts/scripts/guard/guard_ai.h
+++ b/src/bindings/scripts/scripts/guard/guard_ai.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/guard/guards.cpp b/src/bindings/scripts/scripts/guard/guards.cpp
index 01da1da33df..6caa6519c74 100644
--- a/src/bindings/scripts/scripts/guard/guards.cpp
+++ b/src/bindings/scripts/scripts/guard/guards.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -115,23 +115,23 @@ void SendDefaultMenu_guard_azuremyst(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Bank
- player->SEND_POI(-3918.95, -11544.7, 6, 6, 0, "Bank");
+ player->SEND_POI(-3918.95, -11544.7, 7, 6, 0, "Bank");
player->SEND_GOSSIP_MENU(10067,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hippogryph Master
- player->SEND_POI(-4057.15, -11788.6, 6, 6, 0, "Stephanos");
+ player->SEND_POI(-4057.15, -11788.6, 7, 6, 0, "Stephanos");
player->SEND_GOSSIP_MENU(10071,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Guild master
- player->SEND_POI(-4092.43, -11626.6, 6, 6, 0, "Funaam");
+ player->SEND_POI(-4092.43, -11626.6, 7, 6, 0, "Funaam");
player->SEND_GOSSIP_MENU(10073,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(-4129.43, -12469, 6, 6, 0, "Caregiver Chellan");
+ player->SEND_POI(-4129.43, -12469, 7, 6, 0, "Caregiver Chellan");
player->SEND_GOSSIP_MENU(10074,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Stable Master
- player->SEND_POI(-4146.42, -12492.7, 6, 6, 0, "Esbina");
+ player->SEND_POI(-4146.42, -12492.7, 7, 6, 0, "Esbina");
player->SEND_GOSSIP_MENU(10075,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Class trainer
@@ -168,31 +168,31 @@ void SendClassTrainerMenu_guard_azuremyst(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(-4274.81, -11495.3, 6, 6, 0, "Shalannius");
+ player->SEND_POI(-4274.81, -11495.3, 7, 6, 0, "Shalannius");
player->SEND_GOSSIP_MENU(10077,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(-4203.65, -12526.5, 6, 6, 0, "Acteon");
+ player->SEND_POI(-4203.65, -12526.5, 7, 6, 0, "Acteon");
player->SEND_GOSSIP_MENU(10078,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Mage
- player->SEND_POI(-4149.62, -12530.1, 6, 6, 0, "Semid");
+ player->SEND_POI(-4149.62, -12530.1, 7, 6, 0, "Semid");
player->SEND_GOSSIP_MENU(10081,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Paladin
- player->SEND_POI(-4138.98, -12468.5, 6, 6, 0, "Tullas");
+ player->SEND_POI(-4138.98, -12468.5, 7, 6, 0, "Tullas");
player->SEND_GOSSIP_MENU(10083,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Priest
- player->SEND_POI(-4131.66, -12478.6, 6, 6, 0, "Guvan");
+ player->SEND_POI(-4131.66, -12478.6, 7, 6, 0, "Guvan");
player->SEND_GOSSIP_MENU(10084,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Shaman
- player->SEND_POI(-4162.33, -12456.1, 6, 6, 0, "Tuluun");
+ player->SEND_POI(-4162.33, -12456.1, 7, 6, 0, "Tuluun");
player->SEND_GOSSIP_MENU(10085,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warrior
- player->SEND_POI(-4165.05, -12536.4, 6, 6, 0, "Ruada");
+ player->SEND_POI(-4165.05, -12536.4, 7, 6, 0, "Ruada");
player->SEND_GOSSIP_MENU(10086,_Creature->GetGUID());
break;
}
@@ -203,54 +203,54 @@ void SendProfTrainerMenu_guard_azuremyst(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-4191.15, -12470, 6, 6, 0, "Daedal");
+ player->SEND_POI(-4191.15, -12470, 7, 6, 0, "Daedal");
player->SEND_GOSSIP_MENU(10088,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-4726.29, -12387, 6, 6, 0, "Blacksmith Calypso");
+ player->SEND_POI(-4726.29, -12387, 7, 6, 0, "Blacksmith Calypso");
player->SEND_GOSSIP_MENU(10089,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-4710.87, -12400.6, 6, 6, 0, "'Cookie' McWeaksauce");
+ player->SEND_POI(-4710.87, -12400.6, 7, 6, 0, "'Cookie' McWeaksauce");
player->SEND_GOSSIP_MENU(10090,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-3882.85, -11496.7, 6, 6, 0, "Nahogg");
+ player->SEND_POI(-3882.85, -11496.7, 7, 6, 0, "Nahogg");
player->SEND_GOSSIP_MENU(10091,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(-4157.57, -12470.2, 6, 6, 0, "Artificer Daelo");
+ player->SEND_POI(-4157.57, -12470.2, 7, 6, 0, "Artificer Daelo");
player->SEND_GOSSIP_MENU(10092,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(-4199.11, -12469.9, 6, 6, 0, "Anchorite Fateema");
+ player->SEND_POI(-4199.11, -12469.9, 7, 6, 0, "Anchorite Fateema");
player->SEND_GOSSIP_MENU(10093,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-4266.38, -12985.1, 6, 6, 0, "Diktynna");
+ player->SEND_POI(-4266.38, -12985.1, 7, 6, 0, "Diktynna");
player->SEND_GOSSIP_MENU(10094,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
player->SEND_GOSSIP_MENU(10095,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Jewelcrafting
- player->SEND_POI(-3781.55, -11541.8, 6, 6, 0, "Farii");
+ player->SEND_POI(-3781.55, -11541.8, 7, 6, 0, "Farii");
player->SEND_GOSSIP_MENU(10096,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Leatherworking
- player->SEND_POI(-3442.68, -12322.2, 6, 6, 0, "Moordo");
+ player->SEND_POI(-3442.68, -12322.2, 7, 6, 0, "Moordo");
player->SEND_GOSSIP_MENU(10098,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Mining
- player->SEND_POI(-4179.89, -12493.1, 6, 6, 0, "Dulvi");
+ player->SEND_POI(-4179.89, -12493.1, 7, 6, 0, "Dulvi");
player->SEND_GOSSIP_MENU(10097,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Skinning
- player->SEND_POI(-3431.17, -12316.5, 6, 6, 0, "Gurf");
+ player->SEND_POI(-3431.17, -12316.5, 7, 6, 0, "Gurf");
player->SEND_GOSSIP_MENU(10098,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 13: //Tailoring
- player->SEND_POI(-4711.54, -12386.7, 6, 6, 0, "Erin Kelly");
+ player->SEND_POI(-4711.54, -12386.7, 7, 6, 0, "Erin Kelly");
player->SEND_GOSSIP_MENU(10099,_Creature->GetGUID());
break;
}
@@ -302,35 +302,35 @@ void SendDefaultMenu_guard_bluffwatcher(Player *player, Creature *_Creature, uin
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Bank
- player->SEND_POI(-1257.8, 24.14, 6, 6, 0, "Thunder Bluff Bank");
+ player->SEND_POI(-1257.8, 24.14, 7, 6, 0, "Thunder Bluff Bank");
player->SEND_GOSSIP_MENU(1292,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Wind master
- player->SEND_POI(-1196.43, 28.26, 6, 6, 0, "Wind Rider Roost");
+ player->SEND_POI(-1196.43, 28.26, 7, 6, 0, "Wind Rider Roost");
player->SEND_GOSSIP_MENU(1293,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Guild master
- player->SEND_POI(-1296.5, 127.57, 6, 6, 0, "Thunder Bluff Civic Information");
+ player->SEND_POI(-1296.5, 127.57, 7, 6, 0, "Thunder Bluff Civic Information");
player->SEND_GOSSIP_MENU(1291,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(-1296, 39.7, 6, 6, 0, "Thunder Bluff Inn");
+ player->SEND_POI(-1296, 39.7, 7, 6, 0, "Thunder Bluff Inn");
player->SEND_GOSSIP_MENU(3153,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Mailbox
- player->SEND_POI(-1263.59, 44.36, 6, 6, 0, "Thunder Bluff Mailbox");
+ player->SEND_POI(-1263.59, 44.36, 7, 6, 0, "Thunder Bluff Mailbox");
player->SEND_GOSSIP_MENU(3154,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Auction House
- player->SEND_POI(1381.77, -4371.16, 6, 6, 0, GOSSIP_TEXT_AUCTIONHOUSE);
+ player->SEND_POI(1381.77, -4371.16, 7, 6, 0, GOSSIP_TEXT_AUCTIONHOUSE);
player->SEND_GOSSIP_MENU(3155,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Weapon master
- player->SEND_POI(-1282.31, 89.56, 6, 6, 0, "Ansekhwa");
+ player->SEND_POI(-1282.31, 89.56, 7, 6, 0, "Ansekhwa");
player->SEND_GOSSIP_MENU(4520,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Stable master
- player->SEND_POI(-1270.19, 48.84, 6, 6, 0, "Bulrug");
+ player->SEND_POI(-1270.19, 48.84, 7, 6, 0, "Bulrug");
player->SEND_GOSSIP_MENU(5977,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //battlemaster
@@ -370,15 +370,15 @@ void SendBattleMasterMenu_guard_bluffwatcher(Player *player, Creature *_Creature
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(-1387.82, -97.55, 6, 6, 0, "Taim Ragetotem");
+ player->SEND_POI(-1387.82, -97.55, 7, 6, 0, "Taim Ragetotem");
player->SEND_GOSSIP_MENU(7522,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(-997, 214.12, 6, 6, 0, "Martin Lindsey");
+ player->SEND_POI(-997, 214.12, 7, 6, 0, "Martin Lindsey");
player->SEND_GOSSIP_MENU(7648,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //WSG
- player->SEND_POI(-1384.94, -75.91, 6, 6, 0, "Kergul Bloodaxe");
+ player->SEND_POI(-1384.94, -75.91, 7, 6, 0, "Kergul Bloodaxe");
player->SEND_GOSSIP_MENU(7523,_Creature->GetGUID());
break;
}
@@ -389,27 +389,27 @@ void SendClassTrainerMenu_guard_bluffwatcher(Player *player, Creature *_Creature
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(-1054.47, -285, 6, 6, 0, "Hall of Elders");
+ player->SEND_POI(-1054.47, -285, 7, 6, 0, "Hall of Elders");
player->SEND_GOSSIP_MENU(1294,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(-1416.32, -114.28, 6, 6, 0, "Hunter's Hall");
+ player->SEND_POI(-1416.32, -114.28, 7, 6, 0, "Hunter's Hall");
player->SEND_GOSSIP_MENU(1295,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Mage
- player->SEND_POI(-1061.2, 195.5, 6, 6, 0, "Pools of Vision");
+ player->SEND_POI(-1061.2, 195.5, 7, 6, 0, "Pools of Vision");
player->SEND_GOSSIP_MENU(1296,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Priest
- player->SEND_POI(-1061.2, 195.5, 6, 6, 0, "Pools of Vision");
+ player->SEND_POI(-1061.2, 195.5, 7, 6, 0, "Pools of Vision");
player->SEND_GOSSIP_MENU(1297,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Shaman
- player->SEND_POI(-989.54, 278.25, 6, 6, 0, "Hall of Spirits");
+ player->SEND_POI(-989.54, 278.25, 7, 6, 0, "Hall of Spirits");
player->SEND_GOSSIP_MENU(1298,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Warrior
- player->SEND_POI(-1416.32, -114.28, 6, 6, 0, "Hunter's Hall");
+ player->SEND_POI(-1416.32, -114.28, 7, 6, 0, "Hunter's Hall");
player->SEND_GOSSIP_MENU(1299,_Creature->GetGUID());
break;
}
@@ -420,47 +420,47 @@ void SendProfTrainerMenu_guard_bluffwatcher(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-1085.56, 27.29, 6, 6, 0, "Bena's Alchemy");
+ player->SEND_POI(-1085.56, 27.29, 7, 6, 0, "Bena's Alchemy");
player->SEND_GOSSIP_MENU(1332,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-1239.75, 104.88, 6, 6, 0, "Karn's Smithy");
+ player->SEND_POI(-1239.75, 104.88, 7, 6, 0, "Karn's Smithy");
player->SEND_GOSSIP_MENU(1333,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-1214.5, -21.23, 6, 6, 0, "Aska's Kitchen");
+ player->SEND_POI(-1214.5, -21.23, 7, 6, 0, "Aska's Kitchen");
player->SEND_GOSSIP_MENU(1334,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-1112.65, 48.26, 6, 6, 0, "Dawnstrider Enchanters");
+ player->SEND_POI(-1112.65, 48.26, 7, 6, 0, "Dawnstrider Enchanters");
player->SEND_GOSSIP_MENU(1335,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //First Aid
- player->SEND_POI(-996.58, 200.5, 6, 6, 0, "Spiritual Healing");
+ player->SEND_POI(-996.58, 200.5, 7, 6, 0, "Spiritual Healing");
player->SEND_GOSSIP_MENU(1336,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Fishing
- player->SEND_POI(-1169.35, -68.87, 6, 6, 0, "Mountaintop Bait & Tackle");
+ player->SEND_POI(-1169.35, -68.87, 7, 6, 0, "Mountaintop Bait & Tackle");
player->SEND_GOSSIP_MENU(1337,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Herbalism
- player->SEND_POI(-1137.7, -1.51, 6, 6, 0, "Holistic Herbalism");
+ player->SEND_POI(-1137.7, -1.51, 7, 6, 0, "Holistic Herbalism");
player->SEND_GOSSIP_MENU(1338,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Leatherworking
- player->SEND_POI(-1156.22, 66.86, 6, 6, 0, "Thunder Bluff Armorers");
+ player->SEND_POI(-1156.22, 66.86, 7, 6, 0, "Thunder Bluff Armorers");
player->SEND_GOSSIP_MENU(1339,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Mining
- player->SEND_POI(-1249.17, 155, 6, 6, 0, "Stonehoof Geology");
+ player->SEND_POI(-1249.17, 155, 7, 6, 0, "Stonehoof Geology");
player->SEND_GOSSIP_MENU(1340,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Skinning
- player->SEND_POI(-1148.56, 51.18, 6, 6, 0, "Mooranta");
+ player->SEND_POI(-1148.56, 51.18, 7, 6, 0, "Mooranta");
player->SEND_GOSSIP_MENU(1343,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Tailoring
- player->SEND_POI(-1156.22, 66.86, 6, 6, 0, "Thunder Bluff Armorers");
+ player->SEND_POI(-1156.22, 66.86, 7, 6, 0, "Thunder Bluff Armorers");
player->SEND_GOSSIP_MENU(1341,_Creature->GetGUID());
break;
}
@@ -525,35 +525,35 @@ void SendDefaultMenu_guard_darnassus(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Auction house
- player->SEND_POI(9861.23, 2334.55, 6, 6, 0, "Darnassus Auction House");
+ player->SEND_POI(9861.23, 2334.55, 7, 6, 0, "Darnassus Auction House");
player->SEND_GOSSIP_MENU(3833, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(9938.45, 2512.35, 6, 6, 0, "Darnassus Bank");
+ player->SEND_POI(9938.45, 2512.35, 7, 6, 0, "Darnassus Bank");
player->SEND_GOSSIP_MENU(3017, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Wind master
- player->SEND_POI(9945.65, 2618.94, 6, 6, 0, "Rut'theran Village");
+ player->SEND_POI(9945.65, 2618.94, 7, 6, 0, "Rut'theran Village");
player->SEND_GOSSIP_MENU(3018, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Guild master
- player->SEND_POI(10076.40, 2199.59, 6, 6, 0, "Darnassus Guild Master");
+ player->SEND_POI(10076.40, 2199.59, 7, 6, 0, "Darnassus Guild Master");
player->SEND_GOSSIP_MENU(3019, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Inn
- player->SEND_POI(10133.29, 2222.52, 6, 6, 0, "Darnassus Inn");
+ player->SEND_POI(10133.29, 2222.52, 7, 6, 0, "Darnassus Inn");
player->SEND_GOSSIP_MENU(3020, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Mailbox
- player->SEND_POI(9942.17, 2495.48, 6, 6, 0, "Darnassus Mailbox");
+ player->SEND_POI(9942.17, 2495.48, 7, 6, 0, "Darnassus Mailbox");
player->SEND_GOSSIP_MENU(3021, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Stable master
- player->SEND_POI(10167.20, 2522.66, 6, 6, 0, "Alassin");
+ player->SEND_POI(10167.20, 2522.66, 7, 6, 0, "Alassin");
player->SEND_GOSSIP_MENU(5980, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Weapon trainer
- player->SEND_POI(9907.11, 2329.70, 6, 6, 0, "Ilyenia Moonfire");
+ player->SEND_POI(9907.11, 2329.70, 7, 6, 0, "Ilyenia Moonfire");
player->SEND_GOSSIP_MENU(4517, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Battlemaster
@@ -590,15 +590,15 @@ void SendBattleMasterMenu_guard_darnassus(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(9923.61, 2327.43, 6, 6, 0, "Brogun Stoneshield");
+ player->SEND_POI(9923.61, 2327.43, 7, 6, 0, "Brogun Stoneshield");
player->SEND_GOSSIP_MENU(7518, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(9977.37, 2324.39, 6, 6, 0, "Keras Wolfheart");
+ player->SEND_POI(9977.37, 2324.39, 7, 6, 0, "Keras Wolfheart");
player->SEND_GOSSIP_MENU(7651, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //WSG
- player->SEND_POI(9979.84, 2315.79, 6, 6, 0, "Aethalas");
+ player->SEND_POI(9979.84, 2315.79, 7, 6, 0, "Aethalas");
player->SEND_GOSSIP_MENU(7482, _Creature->GetGUID());
break;
}
@@ -609,23 +609,23 @@ void SendClassTrainerMenu_guard_darnassus(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(10186, 2570.46, 6, 6, 0, "Darnassus Druid Trainer");
+ player->SEND_POI(10186, 2570.46, 7, 6, 0, "Darnassus Druid Trainer");
player->SEND_GOSSIP_MENU(3024, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(10177.29, 2511.10, 6, 6, 0, "Darnassus Hunter Trainer");
+ player->SEND_POI(10177.29, 2511.10, 7, 6, 0, "Darnassus Hunter Trainer");
player->SEND_GOSSIP_MENU(3023, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Priest
- player->SEND_POI(9659.12, 2524.88, 6, 6, 0, "Temple of the Moon");
+ player->SEND_POI(9659.12, 2524.88, 7, 6, 0, "Temple of the Moon");
player->SEND_GOSSIP_MENU(3025, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Rogue
- player->SEND_POI(10122, 2599.12, 6, 6, 0, "Darnassus Rogue Trainer");
+ player->SEND_POI(10122, 2599.12, 7, 6, 0, "Darnassus Rogue Trainer");
player->SEND_GOSSIP_MENU(3026, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Warrior
- player->SEND_POI(9951.91, 2280.38, 6, 6, 0, "Warrior's Terrace");
+ player->SEND_POI(9951.91, 2280.38, 7, 6, 0, "Warrior's Terrace");
player->SEND_GOSSIP_MENU(3033, _Creature->GetGUID());
break;
}
@@ -636,39 +636,39 @@ void SendProfTrainerMenu_guard_darnassus(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(10075.90, 2356.76, 6, 6, 0, "Darnassus Alchemy Trainer");
+ player->SEND_POI(10075.90, 2356.76, 7, 6, 0, "Darnassus Alchemy Trainer");
player->SEND_GOSSIP_MENU(3035, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Cooking
- player->SEND_POI(10088.59, 2419.21, 6, 6, 0, "Darnassus Cooking Trainer");
+ player->SEND_POI(10088.59, 2419.21, 7, 6, 0, "Darnassus Cooking Trainer");
player->SEND_GOSSIP_MENU(3036, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Enchanting
- player->SEND_POI(10146.09, 2313.42, 6, 6, 0, "Darnassus Enchanting Trainer");
+ player->SEND_POI(10146.09, 2313.42, 7, 6, 0, "Darnassus Enchanting Trainer");
player->SEND_GOSSIP_MENU(3337, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //First Aid
- player->SEND_POI(10150.09, 2390.43, 6, 6, 0, "Darnassus First Aid Trainer");
+ player->SEND_POI(10150.09, 2390.43, 7, 6, 0, "Darnassus First Aid Trainer");
player->SEND_GOSSIP_MENU(3037, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Fishing
- player->SEND_POI(9836.20, 2432.17, 6, 6, 0, "Darnassus Fishing Trainer");
+ player->SEND_POI(9836.20, 2432.17, 7, 6, 0, "Darnassus Fishing Trainer");
player->SEND_GOSSIP_MENU(3038, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Herbalism
- player->SEND_POI(9757.17, 2430.16, 6, 6, 0, "Darnassus Herbalism Trainer");
+ player->SEND_POI(9757.17, 2430.16, 7, 6, 0, "Darnassus Herbalism Trainer");
player->SEND_GOSSIP_MENU(3039, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Leatherworking
- player->SEND_POI(10086.59, 2255.77, 6, 6, 0, "Darnassus Leatherworking Trainer");
+ player->SEND_POI(10086.59, 2255.77, 7, 6, 0, "Darnassus Leatherworking Trainer");
player->SEND_GOSSIP_MENU(3040, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Skinning
- player->SEND_POI(10081.40, 2257.18, 6, 6, 0, "Darnassus Skinning Trainer");
+ player->SEND_POI(10081.40, 2257.18, 7, 6, 0, "Darnassus Skinning Trainer");
player->SEND_GOSSIP_MENU(3042, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Tailoring
- player->SEND_POI(10079.70, 2268.19, 6, 6, 0, "Darnassus Tailor");
+ player->SEND_POI(10079.70, 2268.19, 7, 6, 0, "Darnassus Tailor");
player->SEND_GOSSIP_MENU(3044, _Creature->GetGUID());
break;
}
@@ -727,11 +727,11 @@ void SendDefaultMenu_guard_dunmorogh(Player *player, Creature *_Creature, uint32
player->SEND_GOSSIP_MENU(4290,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(-5582.66, -525.89, 6, 6, 0, "Thunderbrew Distillery");
+ player->SEND_POI(-5582.66, -525.89, 7, 6, 0, "Thunderbrew Distillery");
player->SEND_GOSSIP_MENU(4291,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Stable Master
- player->SEND_POI(-5604, -509.58, 6, 6, 0, "Shelby Stoneflint");
+ player->SEND_POI(-5604, -509.58, 7, 6, 0, "Shelby Stoneflint");
player->SEND_GOSSIP_MENU(5985,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Class trainer
@@ -767,31 +767,31 @@ void SendClassTrainerMenu_guard_dunmorogh(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Hunter
- player->SEND_POI(-5618.29, -454.25, 6, 6, 0, "Grif Wildheart");
+ player->SEND_POI(-5618.29, -454.25, 7, 6, 0, "Grif Wildheart");
player->SEND_GOSSIP_MENU(4293,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Mage
- player->SEND_POI(-5585.6, -539.99, 6, 6, 0, "Magis Sparkmantle");
+ player->SEND_POI(-5585.6, -539.99, 7, 6, 0, "Magis Sparkmantle");
player->SEND_GOSSIP_MENU(4294,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Paladin
- player->SEND_POI(-5585.6, -539.99, 6, 6, 0, "Azar Stronghammer");
+ player->SEND_POI(-5585.6, -539.99, 7, 6, 0, "Azar Stronghammer");
player->SEND_GOSSIP_MENU(4295,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Priest
- player->SEND_POI(-5591.74, -525.61, 6, 6, 0, "Maxan Anvol");
+ player->SEND_POI(-5591.74, -525.61, 7, 6, 0, "Maxan Anvol");
player->SEND_GOSSIP_MENU(4296,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Rogue
- player->SEND_POI(-5602.75, -542.4, 6, 6, 0, "Hogral Bakkan");
+ player->SEND_POI(-5602.75, -542.4, 7, 6, 0, "Hogral Bakkan");
player->SEND_GOSSIP_MENU(4297,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Warlock
- player->SEND_POI(-5641.97, -523.76, 6, 6, 0, "Gimrizz Shadowcog");
+ player->SEND_POI(-5641.97, -523.76, 7, 6, 0, "Gimrizz Shadowcog");
player->SEND_GOSSIP_MENU(4298,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warrior
- player->SEND_POI(-5604.79, -529.38, 6, 6, 0, "Granis Swiftaxe");
+ player->SEND_POI(-5604.79, -529.38, 7, 6, 0, "Granis Swiftaxe");
player->SEND_GOSSIP_MENU(4299,_Creature->GetGUID());
break;
}
@@ -805,26 +805,26 @@ void SendProfTrainerMenu_guard_dunmorogh(Player *player, Creature *_Creature, ui
player->SEND_GOSSIP_MENU(4301,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-5584.72, -428.41, 6, 6, 0, "Tognus Flintfire");
+ player->SEND_POI(-5584.72, -428.41, 7, 6, 0, "Tognus Flintfire");
player->SEND_GOSSIP_MENU(4302,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-5596.85, -541.43, 6, 6, 0, "Gremlock Pilsnor");
+ player->SEND_POI(-5596.85, -541.43, 7, 6, 0, "Gremlock Pilsnor");
player->SEND_GOSSIP_MENU(4303,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
player->SEND_GOSSIP_MENU(4304,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(-5531, -666.53, 6, 6, 0, "Bronk Guzzlegear");
+ player->SEND_POI(-5531, -666.53, 7, 6, 0, "Bronk Guzzlegear");
player->SEND_GOSSIP_MENU(4305,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(-5603.67, -523.57, 6, 6, 0, "Thamner Pol");
+ player->SEND_POI(-5603.67, -523.57, 7, 6, 0, "Thamner Pol");
player->SEND_GOSSIP_MENU(4306,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-5199.9, 58.58, 6, 6, 0, "Paxton Ganter");
+ player->SEND_POI(-5199.9, 58.58, 7, 6, 0, "Paxton Ganter");
player->SEND_GOSSIP_MENU(4307,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
@@ -834,7 +834,7 @@ void SendProfTrainerMenu_guard_dunmorogh(Player *player, Creature *_Creature, ui
player->SEND_GOSSIP_MENU(4310,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
- player->SEND_POI(-5531, -666.53, 6, 6, 0, "Yarr Hamerstone");
+ player->SEND_POI(-5531, -666.53, 7, 6, 0, "Yarr Hamerstone");
player->SEND_GOSSIP_MENU(4311,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
@@ -893,11 +893,11 @@ void SendDefaultMenu_guard_durotar(Player *player, Creature *_Creature, uint32 a
player->SEND_GOSSIP_MENU(4033,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Inn
- player->SEND_POI(338.7, -4688.87, 6, 6, 0, "Razor Hill Inn");
+ player->SEND_POI(338.7, -4688.87, 7, 6, 0, "Razor Hill Inn");
player->SEND_GOSSIP_MENU(4034,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Stable master
- player->SEND_POI(330.31, -4710.66, 6, 6, 0, "Shoja'my");
+ player->SEND_POI(330.31, -4710.66, 7, 6, 0, "Shoja'my");
player->SEND_GOSSIP_MENU(5973,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Class trainer
@@ -933,31 +933,31 @@ void SendClassTrainerMenu_guard_durotar(Player *player, Creature *_Creature, uin
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Hunter
- player->SEND_POI(276, -4706.72, 6, 6, 0, "Thotar");
+ player->SEND_POI(276, -4706.72, 7, 6, 0, "Thotar");
player->SEND_GOSSIP_MENU(4013,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Mage
- player->SEND_POI(-839.33, -4935.6, 6, 6, 0, "Un'Thuwa");
+ player->SEND_POI(-839.33, -4935.6, 7, 6, 0, "Un'Thuwa");
player->SEND_GOSSIP_MENU(4014,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Priest
- player->SEND_POI(296.22, -4828.1, 6, 6, 0, "Tai'jin");
+ player->SEND_POI(296.22, -4828.1, 7, 6, 0, "Tai'jin");
player->SEND_GOSSIP_MENU(4015,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Rogue
- player->SEND_POI(265.76, -4709, 6, 6, 0, "Kaplak");
+ player->SEND_POI(265.76, -4709, 7, 6, 0, "Kaplak");
player->SEND_GOSSIP_MENU(4016,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Shaman
- player->SEND_POI(307.79, -4836.97, 6, 6, 0, "Swart");
+ player->SEND_POI(307.79, -4836.97, 7, 6, 0, "Swart");
player->SEND_GOSSIP_MENU(4017,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Warlock
- player->SEND_POI(355.88, -4836.45, 6, 6, 0, "Dhugru Gorelust");
+ player->SEND_POI(355.88, -4836.45, 7, 6, 0, "Dhugru Gorelust");
player->SEND_GOSSIP_MENU(4018,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warrior
- player->SEND_POI(312.3, -4824.66, 6, 6, 0, "Tarshaw Jaggedscar");
+ player->SEND_POI(312.3, -4824.66, 7, 6, 0, "Tarshaw Jaggedscar");
player->SEND_GOSSIP_MENU(4019,_Creature->GetGUID());
break;
}
@@ -968,11 +968,11 @@ void SendProfTrainerMenu_guard_durotar(Player *player, Creature *_Creature, uint
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-800.25, -4894.33, 6, 6, 0, "Miao'zan");
+ player->SEND_POI(-800.25, -4894.33, 7, 6, 0, "Miao'zan");
player->SEND_GOSSIP_MENU(4020,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(373.24, -4716.45, 6, 6, 0, "Dwukk");
+ player->SEND_POI(373.24, -4716.45, 7, 6, 0, "Dwukk");
player->SEND_GOSSIP_MENU(4021,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
@@ -982,26 +982,26 @@ void SendProfTrainerMenu_guard_durotar(Player *player, Creature *_Creature, uint
player->SEND_GOSSIP_MENU(4023,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(368.95, -4723.95, 6, 6, 0, "Mukdrak");
+ player->SEND_POI(368.95, -4723.95, 7, 6, 0, "Mukdrak");
player->SEND_GOSSIP_MENU(4024,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(327.17, -4825.62, 6, 6, 0, "Rawrk");
+ player->SEND_POI(327.17, -4825.62, 7, 6, 0, "Rawrk");
player->SEND_GOSSIP_MENU(4025,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-1065.48, -4777.43, 6, 6, 0, "Lau'Tiki");
+ player->SEND_POI(-1065.48, -4777.43, 7, 6, 0, "Lau'Tiki");
player->SEND_GOSSIP_MENU(4026,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(-836.25, -4896.89, 6, 6, 0, "Mishiki");
+ player->SEND_POI(-836.25, -4896.89, 7, 6, 0, "Mishiki");
player->SEND_GOSSIP_MENU(4027,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
player->SEND_GOSSIP_MENU(4028,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
- player->SEND_POI(366.94, -4705, 6, 6, 0, "Krunn");
+ player->SEND_POI(366.94, -4705, 7, 6, 0, "Krunn");
player->SEND_GOSSIP_MENU(4029,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
@@ -1064,11 +1064,11 @@ void SendDefaultMenu_guard_elwynnforest(Player *player, Creature *_Creature, uin
player->SEND_GOSSIP_MENU(4262,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(-9459.34, 42.08, 6, 6, 0, "Lion's Pride Inn");
+ player->SEND_POI(-9459.34, 42.08, 7, 6, 0, "Lion's Pride Inn");
player->SEND_GOSSIP_MENU(4263,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Stable Master
- player->SEND_POI(-9466.62, 45.87, 6, 6, 0, "Erma");
+ player->SEND_POI(-9466.62, 45.87, 7, 6, 0, "Erma");
player->SEND_GOSSIP_MENU(5983,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Class trainer
@@ -1111,27 +1111,27 @@ void SendClassTrainerMenu_guard_elwynnforest(Player *player, Creature *_Creature
player->SEND_GOSSIP_MENU(4266,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Mage
- player->SEND_POI(-9471.12, 33.44, 6, 6, 0, "Zaldimar Wefhellt");
+ player->SEND_POI(-9471.12, 33.44, 7, 6, 0, "Zaldimar Wefhellt");
player->SEND_GOSSIP_MENU(4268,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Paladin
- player->SEND_POI(-9469, 108.05, 6, 6, 0, "Brother Wilhelm");
+ player->SEND_POI(-9469, 108.05, 7, 6, 0, "Brother Wilhelm");
player->SEND_GOSSIP_MENU(4269,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Priest
- player->SEND_POI(-9461.07, 32.6, 6, 6, 0, "Priestess Josetta");
+ player->SEND_POI(-9461.07, 32.6, 7, 6, 0, "Priestess Josetta");
player->SEND_GOSSIP_MENU(4267,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Rogue
- player->SEND_POI(-9465.13, 13.29, 6, 6, 0, "Keryn Sylvius");
+ player->SEND_POI(-9465.13, 13.29, 7, 6, 0, "Keryn Sylvius");
player->SEND_GOSSIP_MENU(4270,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warlock
- player->SEND_POI(-9473.21, -4.08, 6, 6, 0, "Maximillian Crowe");
+ player->SEND_POI(-9473.21, -4.08, 7, 6, 0, "Maximillian Crowe");
player->SEND_GOSSIP_MENU(4272,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Warrior
- player->SEND_POI(-9461.82, 109.50, 6, 6, 0, "Lyria Du Lac");
+ player->SEND_POI(-9461.82, 109.50, 7, 6, 0, "Lyria Du Lac");
player->SEND_GOSSIP_MENU(4271,_Creature->GetGUID());
break;
}
@@ -1142,15 +1142,15 @@ void SendProfTrainerMenu_guard_elwynnforest(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-9057.04, 153.63, 6, 6, 0, "Alchemist Mallory");
+ player->SEND_POI(-9057.04, 153.63, 7, 6, 0, "Alchemist Mallory");
player->SEND_GOSSIP_MENU(4274,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-9456.58, 87.90, 6, 6, 0, "Smith Argus");
+ player->SEND_POI(-9456.58, 87.90, 7, 6, 0, "Smith Argus");
player->SEND_GOSSIP_MENU(4275,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-9467.54, -3.16, 6, 6, 0, "Tomas");
+ player->SEND_POI(-9467.54, -3.16, 7, 6, 0, "Tomas");
player->SEND_GOSSIP_MENU(4276,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
@@ -1160,30 +1160,30 @@ void SendProfTrainerMenu_guard_elwynnforest(Player *player, Creature *_Creature,
player->SEND_GOSSIP_MENU(4278,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(-9456.82, 30.49, 6, 6, 0, "Michelle Belle");
+ player->SEND_POI(-9456.82, 30.49, 7, 6, 0, "Michelle Belle");
player->SEND_GOSSIP_MENU(4279,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-9386.54, -118.73, 6, 6, 0, "Lee Brown");
+ player->SEND_POI(-9386.54, -118.73, 7, 6, 0, "Lee Brown");
player->SEND_GOSSIP_MENU(4280,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(-9060.70, 149.23, 6, 6, 0, "Herbalist Pomeroy");
+ player->SEND_POI(-9060.70, 149.23, 7, 6, 0, "Herbalist Pomeroy");
player->SEND_GOSSIP_MENU(4281,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(-9376.12, -75.23, 6, 6, 0, "Adele Fielder");
+ player->SEND_POI(-9376.12, -75.23, 7, 6, 0, "Adele Fielder");
player->SEND_GOSSIP_MENU(4282,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
player->SEND_GOSSIP_MENU(4283,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(-9536.91, -1212.76, 6, 6, 0, "Helene Peltskinner");
+ player->SEND_POI(-9536.91, -1212.76, 7, 6, 0, "Helene Peltskinner");
player->SEND_GOSSIP_MENU(4284,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(-9376.12, -75.23, 6, 6, 0, "Eldrin");
+ player->SEND_POI(-9376.12, -75.23, 7, 6, 0, "Eldrin");
player->SEND_GOSSIP_MENU(4285,_Creature->GetGUID());
break;
}
@@ -1230,18 +1230,18 @@ void SendDefaultMenu_guard_eversong(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Bat Handler
- player->SEND_POI(9371.93, -7164.80, 6, 6, 0, "Skymistress Gloaming");
+ player->SEND_POI(9371.93, -7164.80, 7, 6, 0, "Skymistress Gloaming");
player->SEND_GOSSIP_MENU(10181,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Guild master
player->SEND_GOSSIP_MENU(10182,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Inn
- player->SEND_POI(9483.74, -6844.58, 6, 6, 0, "Delaniel's inn");
+ player->SEND_POI(9483.74, -6844.58, 7, 6, 0, "Delaniel's inn");
player->SEND_GOSSIP_MENU(10183,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Stable Master
- player->SEND_POI(9489.62, -6829.93, 6, 6, 0, "Anathos");
+ player->SEND_POI(9489.62, -6829.93, 7, 6, 0, "Anathos");
player->SEND_GOSSIP_MENU(10184,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Class trainer
@@ -1280,27 +1280,27 @@ void SendClassTrainerMenu_guard_eversong(Player *player, Creature *_Creature, ui
player->SEND_GOSSIP_MENU(10185,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(9527.44, -6865.25, 6, 6, 0, "Hannovia");
+ player->SEND_POI(9527.44, -6865.25, 7, 6, 0, "Hannovia");
player->SEND_GOSSIP_MENU(10186,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Mage
- player->SEND_POI(9464.24, -6855.52, 6, 6, 0, "Garridel");
+ player->SEND_POI(9464.24, -6855.52, 7, 6, 0, "Garridel");
player->SEND_GOSSIP_MENU(10187,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Paladin
- player->SEND_POI(9517.61, -6871.04, 6, 6, 0, "Noellene");
+ player->SEND_POI(9517.61, -6871.04, 7, 6, 0, "Noellene");
player->SEND_GOSSIP_MENU(10189,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Priest
- player->SEND_POI(9467.39, -6845.72, 6, 6, 0, "Ponaris");
+ player->SEND_POI(9467.39, -6845.72, 7, 6, 0, "Ponaris");
player->SEND_GOSSIP_MENU(10190,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Rogue
- player->SEND_POI(9533.67, -6877.39, 6, 6, 0, "Tannaria");
+ player->SEND_POI(9533.67, -6877.39, 7, 6, 0, "Tannaria");
player->SEND_GOSSIP_MENU(10191,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warlock
- player->SEND_POI(9468.99, -6865.60, 6, 6, 0, "Celoenus");
+ player->SEND_POI(9468.99, -6865.60, 7, 6, 0, "Celoenus");
player->SEND_GOSSIP_MENU(10192,_Creature->GetGUID());
break;
}
@@ -1311,48 +1311,48 @@ void SendProfTrainerMenu_guard_eversong(Player *player, Creature *_Creature, uin
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(8659.90, -6368.12, 6, 6, 0, "Arcanist Sheynathren");
+ player->SEND_POI(8659.90, -6368.12, 7, 6, 0, "Arcanist Sheynathren");
player->SEND_GOSSIP_MENU(10193,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(8984.21, -7419.21, 6, 6, 0, "Arathel Sunforge");
+ player->SEND_POI(8984.21, -7419.21, 7, 6, 0, "Arathel Sunforge");
player->SEND_GOSSIP_MENU(10194,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(9494.04, -6881.51, 6, 6, 0, "Quarelestra");
+ player->SEND_POI(9494.04, -6881.51, 7, 6, 0, "Quarelestra");
player->SEND_GOSSIP_MENU(10195,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Engineering
player->SEND_GOSSIP_MENU(10197,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //First Aid
- player->SEND_POI(9479.46, -6879.16, 6, 6, 0, "Kanaria");
+ player->SEND_POI(9479.46, -6879.16, 7, 6, 0, "Kanaria");
player->SEND_GOSSIP_MENU(10198,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Fishing
player->SEND_GOSSIP_MENU(10199,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Herbalism
- player->SEND_POI(8678.92, -6329.09, 6, 6, 0, "Botanist Tyniarrel");
+ player->SEND_POI(8678.92, -6329.09, 7, 6, 0, "Botanist Tyniarrel");
player->SEND_GOSSIP_MENU(10200,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Jewelcrafting
- player->SEND_POI(9484.32, -6874.98, 6, 6, 0, "Aleinia");
+ player->SEND_POI(9484.32, -6874.98, 7, 6, 0, "Aleinia");
player->SEND_GOSSIP_MENU(10203,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(9362.04, -7130.33, 6, 6, 0, "Sathein");
+ player->SEND_POI(9362.04, -7130.33, 7, 6, 0, "Sathein");
player->SEND_GOSSIP_MENU(10204,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
player->SEND_GOSSIP_MENU(10205,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(9362.04, -7130.33, 6, 6, 0, "Mathreyn");
+ player->SEND_POI(9362.04, -7130.33, 7, 6, 0, "Mathreyn");
player->SEND_GOSSIP_MENU(10206,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(8680.36, -6327.51, 6, 6, 0, "Sempstress Ambershine");
+ player->SEND_POI(8680.36, -6327.51, 7, 6, 0, "Sempstress Ambershine");
player->SEND_GOSSIP_MENU(10207,_Creature->GetGUID());
break;
}
@@ -1404,35 +1404,35 @@ void SendDefaultMenu_guard_exodar(Player *player, Creature *_Creature, uint32 ac
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Auction house
- player->SEND_POI(-4023.6, -11739.3, 6, 6, 0, "Exodar Auction House");
+ player->SEND_POI(-4023.6, -11739.3, 7, 6, 0, "Exodar Auction House");
player->SEND_GOSSIP_MENU(9528, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(-3923.89, -11544.5, 6, 6, 0, "Exodar Bank");
+ player->SEND_POI(-3923.89, -11544.5, 7, 6, 0, "Exodar Bank");
player->SEND_GOSSIP_MENU(9529, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Guild master
- player->SEND_POI(-4092.57, -11626.5, 6, 6, 0, "Exodar Guild Master");
+ player->SEND_POI(-4092.57, -11626.5, 7, 6, 0, "Exodar Guild Master");
player->SEND_GOSSIP_MENU(9539, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Hippogryph master
- player->SEND_POI(-4060.46, -11787.1, 6, 6, 0, "Exodar Hippogryph Master");
+ player->SEND_POI(-4060.46, -11787.1, 7, 6, 0, "Exodar Hippogryph Master");
player->SEND_GOSSIP_MENU(9530, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Inn
- player->SEND_POI(-3741.87, -11695.1, 6, 6, 0, "Exodar Inn");
+ player->SEND_POI(-3741.87, -11695.1, 7, 6, 0, "Exodar Inn");
player->SEND_GOSSIP_MENU(9545, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Mailbox
- player->SEND_POI(-3972.5, -11696.0, 6, 6, 0, "Mailbox");
+ player->SEND_POI(-3972.5, -11696.0, 7, 6, 0, "Mailbox");
player->SEND_GOSSIP_MENU(10254, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Stable master
- player->SEND_POI(-3786.5, -11702.5, 6, 6, 0, "Stable Master Arthaid");
+ player->SEND_POI(-3786.5, -11702.5, 7, 6, 0, "Stable Master Arthaid");
player->SEND_GOSSIP_MENU(9558, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Weapon trainer
- player->SEND_POI(-4215.68, -11628.9, 6, 6, 0, "Weapon Master Handiir");
+ player->SEND_POI(-4215.68, -11628.9, 7, 6, 0, "Weapon Master Handiir");
player->SEND_GOSSIP_MENU(9565, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Battlemaster
@@ -1477,23 +1477,23 @@ void SendBattleMasterMenu_guard_exodar(Player *player, Creature *_Creature, uint
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(-3978.1, -11357, 6, 6, 0, "Alterac Valley Battlemaster");
+ player->SEND_POI(-3978.1, -11357, 7, 6, 0, "Alterac Valley Battlemaster");
player->SEND_GOSSIP_MENU(9531, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(-3998.9, -11345.2, 6, 6, 0, "Arathi Basin Battlemaster");
+ player->SEND_POI(-3998.9, -11345.2, 7, 6, 0, "Arathi Basin Battlemaster");
player->SEND_GOSSIP_MENU(9531, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //A
- player->SEND_POI(-3759.27, -11695.63, 6, 6, 0, "Miglik Blotstrom");
+ player->SEND_POI(-3759.27, -11695.63, 7, 6, 0, "Miglik Blotstrom");
player->SEND_GOSSIP_MENU(10223, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //EOS
- player->SEND_POI(-3978.1, -11357, 6, 6, 0, "Eye Of The Storm Battlemaster");
+ player->SEND_POI(-3978.1, -11357, 7, 6, 0, "Eye Of The Storm Battlemaster");
player->SEND_GOSSIP_MENU(9531, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //WSG
- player->SEND_POI(-3977.5, -11381.2, 6, 6, 0, "Warsong Gulch Battlemaster");
+ player->SEND_POI(-3977.5, -11381.2, 7, 6, 0, "Warsong Gulch Battlemaster");
player->SEND_GOSSIP_MENU(9531, _Creature->GetGUID());
break;
}
@@ -1504,31 +1504,31 @@ void SendClassTrainerMenu_guard_exodar(Player *player, Creature *_Creature, uint
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(-4276.0, -11495, 6, 6, 0, "Exodar Druid Trainer");
+ player->SEND_POI(-4276.0, -11495, 7, 6, 0, "Exodar Druid Trainer");
player->SEND_GOSSIP_MENU(9534, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(-4210.6, -11575.2, 6, 6, 0, "Exodar Hunter Trainer");
+ player->SEND_POI(-4210.6, -11575.2, 7, 6, 0, "Exodar Hunter Trainer");
player->SEND_GOSSIP_MENU(9544, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Mage
- player->SEND_POI(-4057.32, -11556.5, 6, 6, 0, "Exodar Mage Trainer");
+ player->SEND_POI(-4057.32, -11556.5, 7, 6, 0, "Exodar Mage Trainer");
player->SEND_GOSSIP_MENU(9550, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Paladin
- player->SEND_POI(-4191.2, -11470.4, 6, 6, 0, "Exodar Paladin Trainer");
+ player->SEND_POI(-4191.2, -11470.4, 7, 6, 0, "Exodar Paladin Trainer");
player->SEND_GOSSIP_MENU(9553, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Priest
- player->SEND_POI(-3969.63, -11482.8, 6, 6, 0, "Exodar Priest Trainer");
+ player->SEND_POI(-3969.63, -11482.8, 7, 6, 0, "Exodar Priest Trainer");
player->SEND_GOSSIP_MENU(9554, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Shaman
- player->SEND_POI(-3805.5, -11380.7, 6, 6, 0, "Exodar Shaman Trainer");
+ player->SEND_POI(-3805.5, -11380.7, 7, 6, 0, "Exodar Shaman Trainer");
player->SEND_GOSSIP_MENU(9556, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warrior
- player->SEND_POI(-4189.43, -11653.7, 6, 6, 0, "Exodar Warrior Trainer");
+ player->SEND_POI(-4189.43, -11653.7, 7, 6, 0, "Exodar Warrior Trainer");
player->SEND_GOSSIP_MENU(9562, _Creature->GetGUID());
break;
}
@@ -1539,55 +1539,55 @@ void SendProfTrainerMenu_guard_exodar(Player *player, Creature *_Creature, uint3
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-4040.6, -11364.5, 6, 6, 0, "Exodar Alchemy Trainer");
+ player->SEND_POI(-4040.6, -11364.5, 7, 6, 0, "Exodar Alchemy Trainer");
player->SEND_GOSSIP_MENU(9527, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-4229.5, -11706, 6, 6, 0, "Exodar Blacksmithing Trainer");
+ player->SEND_POI(-4229.5, -11706, 7, 6, 0, "Exodar Blacksmithing Trainer");
player->SEND_GOSSIP_MENU(9532, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-3798.3, -11651.7, 6, 6, 0, "Exodar Cooking Trainer");
+ player->SEND_POI(-3798.3, -11651.7, 7, 6, 0, "Exodar Cooking Trainer");
player->SEND_GOSSIP_MENU(9551, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-3889.3, -11495, 6, 6, 0, "Exodar Enchanting Trainer");
+ player->SEND_POI(-3889.3, -11495, 7, 6, 0, "Exodar Enchanting Trainer");
player->SEND_GOSSIP_MENU(9535, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(-4257.68, -11640.3, 6, 6, 0, "Exodar Engineering Trainer");
+ player->SEND_POI(-4257.68, -11640.3, 7, 6, 0, "Exodar Engineering Trainer");
player->SEND_GOSSIP_MENU(9536, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(-3769.5, -11479.6, 6, 6, 0, "Exodar First Aid Trainer");
+ player->SEND_POI(-3769.5, -11479.6, 7, 6, 0, "Exodar First Aid Trainer");
player->SEND_GOSSIP_MENU(9537, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-3725.5, -11385.2, 6, 6, 0, "Exodar Fishing Trainer");
+ player->SEND_POI(-3725.5, -11385.2, 7, 6, 0, "Exodar Fishing Trainer");
player->SEND_GOSSIP_MENU(9538, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Jewelcrafting
- player->SEND_POI(-3783, -11546, 6, 6, 0, "Exodar Jewelcrafting Trainer");
+ player->SEND_POI(-3783, -11546, 7, 6, 0, "Exodar Jewelcrafting Trainer");
player->SEND_GOSSIP_MENU(9547, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Herbalism
- player->SEND_POI(-4040.6, -11364.5, 6, 6, 0, "Exodar Herbalist Trainer");
+ player->SEND_POI(-4040.6, -11364.5, 7, 6, 0, "Exodar Herbalist Trainer");
player->SEND_GOSSIP_MENU(9543, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Leatherworking
- player->SEND_POI(-4140.6, -11776.7, 6, 6, 0, "Exodar Leatherworking Trainer");
+ player->SEND_POI(-4140.6, -11776.7, 7, 6, 0, "Exodar Leatherworking Trainer");
player->SEND_GOSSIP_MENU(9549, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Mining
- player->SEND_POI(-4228, -11697, 6, 6, 0, "Exodar Mining Trainer");
+ player->SEND_POI(-4228, -11697, 7, 6, 0, "Exodar Mining Trainer");
player->SEND_GOSSIP_MENU(9552, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Skinning
- player->SEND_POI(-4134.97, -11760.5, 6, 6, 0, "Exodar Skinning Trainer");
+ player->SEND_POI(-4134.97, -11760.5, 7, 6, 0, "Exodar Skinning Trainer");
player->SEND_GOSSIP_MENU(9557, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 13: //Tailoring
- player->SEND_POI(-4092.5, -11744.5, 6, 6, 0, "Exodar Tailor Trainer");
+ player->SEND_POI(-4092.5, -11744.5, 7, 6, 0, "Exodar Tailor Trainer");
player->SEND_GOSSIP_MENU(9559, _Creature->GetGUID());
break;
}
@@ -1641,39 +1641,39 @@ void SendDefaultMenu_guard_ironforge(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Auction House
- player->SEND_POI(-4957.39, -911.6, 6, 6, 0, "Ironforge Auction House");
+ player->SEND_POI(-4957.39, -911.6, 7, 6, 0, "Ironforge Auction House");
player->SEND_GOSSIP_MENU(3014, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(-4891.91, -991.47, 6, 6, 0, "The Vault");
+ player->SEND_POI(-4891.91, -991.47, 7, 6, 0, "The Vault");
player->SEND_GOSSIP_MENU(2761, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Tram
- player->SEND_POI(-4835.27, -1294.69, 6, 6, 0, "Deeprun Tram");
+ player->SEND_POI(-4835.27, -1294.69, 7, 6, 0, "Deeprun Tram");
player->SEND_GOSSIP_MENU(3814, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Gryphon Master
- player->SEND_POI(-4821.52, -1152.3, 6, 6, 0, "Ironforge Gryphon Master");
+ player->SEND_POI(-4821.52, -1152.3, 7, 6, 0, "Ironforge Gryphon Master");
player->SEND_GOSSIP_MENU(2762, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Guild Master
- player->SEND_POI(-5021, -996.45, 6, 6, 0, "Ironforge Visitor's Center");
+ player->SEND_POI(-5021, -996.45, 7, 6, 0, "Ironforge Visitor's Center");
player->SEND_GOSSIP_MENU(2764, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Inn
- player->SEND_POI(-4850.47, -872.57, 6, 6, 0, "Stonefire Tavern");
+ player->SEND_POI(-4850.47, -872.57, 7, 6, 0, "Stonefire Tavern");
player->SEND_GOSSIP_MENU(2768, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Mailbox
- player->SEND_POI(-4845.7, -880.55, 6, 6, 0, "Ironforge Mailbox");
+ player->SEND_POI(-4845.7, -880.55, 7, 6, 0, "Ironforge Mailbox");
player->SEND_GOSSIP_MENU(2769, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Stable Master
- player->SEND_POI(-5010.2, -1262, 6, 6, 0, "Ulbrek Firehand");
+ player->SEND_POI(-5010.2, -1262, 7, 6, 0, "Ulbrek Firehand");
player->SEND_GOSSIP_MENU(5986, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Weapons Trainer
- player->SEND_POI(-5040, -1201.88, 6, 6, 0, "Bixi and Buliwyf");
+ player->SEND_POI(-5040, -1201.88, 7, 6, 0, "Bixi and Buliwyf");
player->SEND_GOSSIP_MENU(4518, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Battlemaster
@@ -1716,15 +1716,15 @@ void SendBattleMasterMenu_guard_ironforge(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(-5047.87, -1263.77, 6, 6, 0, "Glordrum Steelbeard");
+ player->SEND_POI(-5047.87, -1263.77, 7, 6, 0, "Glordrum Steelbeard");
player->SEND_GOSSIP_MENU(7483, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(-5038.37, -1266.39, 6, 6, 0, "Donal Osgood");
+ player->SEND_POI(-5038.37, -1266.39, 7, 6, 0, "Donal Osgood");
player->SEND_GOSSIP_MENU(7649, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //WSG
- player->SEND_POI(-5037.24, -1274.82, 6, 6, 0, "Lylandris");
+ player->SEND_POI(-5037.24, -1274.82, 7, 6, 0, "Lylandris");
player->SEND_GOSSIP_MENU(7528, _Creature->GetGUID());
break;
}
@@ -1735,35 +1735,35 @@ void SendClassTrainerMenu_guard_ironforge(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Hunter
- player->SEND_POI(-5023, -1253.68, 6, 6, 0, "Hall of Arms");
+ player->SEND_POI(-5023, -1253.68, 7, 6, 0, "Hall of Arms");
player->SEND_GOSSIP_MENU(2770, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Mage
- player->SEND_POI(-4627, -926.45, 6, 6, 0, "Hall of Mysteries");
+ player->SEND_POI(-4627, -926.45, 7, 6, 0, "Hall of Mysteries");
player->SEND_GOSSIP_MENU(2771, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Paladin
- player->SEND_POI(-4627.02, -926.45, 6, 6, 0, "Hall of Mysteries");
+ player->SEND_POI(-4627.02, -926.45, 7, 6, 0, "Hall of Mysteries");
player->SEND_GOSSIP_MENU(2773, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Priest
- player->SEND_POI(-4627, -926.45, 6, 6, 0, "Hall of Mysteries");
+ player->SEND_POI(-4627, -926.45, 7, 6, 0, "Hall of Mysteries");
player->SEND_GOSSIP_MENU(2772, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Rogue
- player->SEND_POI(-4647.83, -1124, 6, 6, 0, "Ironforge Rogue Trainer");
+ player->SEND_POI(-4647.83, -1124, 7, 6, 0, "Ironforge Rogue Trainer");
player->SEND_GOSSIP_MENU(2774, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Warlock
- player->SEND_POI(-4605, -1110.45, 6, 6, 0, "Ironforge Warlock Trainer");
+ player->SEND_POI(-4605, -1110.45, 7, 6, 0, "Ironforge Warlock Trainer");
player->SEND_GOSSIP_MENU(2775, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warrior
- player->SEND_POI(-5023.08, -1253.68, 6, 6, 0, "Hall of Arms");
+ player->SEND_POI(-5023.08, -1253.68, 7, 6, 0, "Hall of Arms");
player->SEND_GOSSIP_MENU(2776, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Shaman
- player->SEND_POI(-4732, -1147, 6, 6, 0, "Ironforge Shaman Trainer");
+ player->SEND_POI(-4732, -1147, 7, 6, 0, "Ironforge Shaman Trainer");
//incorrect id
player->SEND_GOSSIP_MENU(2766, _Creature->GetGUID());
break;
@@ -1775,51 +1775,51 @@ void SendProfTrainerMenu_guard_ironforge(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-4858.5, -1241.83, 6, 6, 0, "Berryfizz's Potions and Mixed Drinks");
+ player->SEND_POI(-4858.5, -1241.83, 7, 6, 0, "Berryfizz's Potions and Mixed Drinks");
player->SEND_GOSSIP_MENU(2794, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-4796.97, -1110.17, 6, 6, 0, "The Great Forge");
+ player->SEND_POI(-4796.97, -1110.17, 7, 6, 0, "The Great Forge");
player->SEND_GOSSIP_MENU(2795, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-4767.83, -1184.59, 6, 6, 0, "The Bronze Kettle");
+ player->SEND_POI(-4767.83, -1184.59, 7, 6, 0, "The Bronze Kettle");
player->SEND_GOSSIP_MENU(2796, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-4803.72, -1196.53, 6, 6, 0, "Thistlefuzz Arcanery");
+ player->SEND_POI(-4803.72, -1196.53, 7, 6, 0, "Thistlefuzz Arcanery");
player->SEND_GOSSIP_MENU(2797, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(-4799.56, -1250.23, 6, 6, 0, "Springspindle's Gadgets");
+ player->SEND_POI(-4799.56, -1250.23, 7, 6, 0, "Springspindle's Gadgets");
player->SEND_GOSSIP_MENU(2798, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(-4881.6, -1153.13, 6, 6, 0, "Ironforge Physician");
+ player->SEND_POI(-4881.6, -1153.13, 7, 6, 0, "Ironforge Physician");
player->SEND_GOSSIP_MENU(2799, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-4597.91, -1091.93, 6, 6, 0, "Traveling Fisherman");
+ player->SEND_POI(-4597.91, -1091.93, 7, 6, 0, "Traveling Fisherman");
player->SEND_GOSSIP_MENU(2800, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(-4876.9, -1151.92, 6, 6, 0, "Ironforge Physician");
+ player->SEND_POI(-4876.9, -1151.92, 7, 6, 0, "Ironforge Physician");
player->SEND_GOSSIP_MENU(2801, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(-4745, -1027.57, 6, 6, 0, "Finespindle's Leather Goods");
+ player->SEND_POI(-4745, -1027.57, 7, 6, 0, "Finespindle's Leather Goods");
player->SEND_GOSSIP_MENU(2802, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Minning
- player->SEND_POI(-4705.06, -1116.43, 6, 6, 0, "Deepmountain Mining Guild");
+ player->SEND_POI(-4705.06, -1116.43, 7, 6, 0, "Deepmountain Mining Guild");
player->SEND_GOSSIP_MENU(2804, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(-4745, -1027.57, 6, 6, 0, "Finespindle's Leather Goods");
+ player->SEND_POI(-4745, -1027.57, 7, 6, 0, "Finespindle's Leather Goods");
player->SEND_GOSSIP_MENU(2805, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(-4719.60, -1056.96, 6, 6, 0, "Stonebrow's Clothier");
+ player->SEND_POI(-4719.60, -1056.96, 7, 6, 0, "Stonebrow's Clothier");
player->SEND_GOSSIP_MENU(2807, _Creature->GetGUID());
break;
}
@@ -1873,11 +1873,11 @@ void SendDefaultMenu_guard_mulgore(Player *player, Creature *_Creature, uint32 a
player->SEND_GOSSIP_MENU(4052,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Inn
- player->SEND_POI(-2361.38, -349.19, 6, 6, 0, "Bloodhoof Village Inn");
+ player->SEND_POI(-2361.38, -349.19, 7, 6, 0, "Bloodhoof Village Inn");
player->SEND_GOSSIP_MENU(4053,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Stable master
- player->SEND_POI(-2338.86, -357.56, 6, 6, 0, "Seikwa");
+ player->SEND_POI(-2338.86, -357.56, 7, 6, 0, "Seikwa");
player->SEND_GOSSIP_MENU(5976,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Class trainer
@@ -1909,19 +1909,19 @@ void SendClassTrainerMenu_guard_mulgore(Player *player, Creature *_Creature, uin
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(-2312.15, -443.69, 6, 6, 0, "Gennia Runetotem");
+ player->SEND_POI(-2312.15, -443.69, 7, 6, 0, "Gennia Runetotem");
player->SEND_GOSSIP_MENU(4054,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(-2178.14, -406.14, 6, 6, 0, "Yaw Sharpmane");
+ player->SEND_POI(-2178.14, -406.14, 7, 6, 0, "Yaw Sharpmane");
player->SEND_GOSSIP_MENU(4055,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Shaman
- player->SEND_POI(-2301.5, -439.87, 6, 6, 0, "Narm Skychaser");
+ player->SEND_POI(-2301.5, -439.87, 7, 6, 0, "Narm Skychaser");
player->SEND_GOSSIP_MENU(4056,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Warrior
- player->SEND_POI(-2345.43, -494.11, 6, 6, 0, "Krang Stonehoof");
+ player->SEND_POI(-2345.43, -494.11, 7, 6, 0, "Krang Stonehoof");
player->SEND_GOSSIP_MENU(4057,_Creature->GetGUID());
break;
}
@@ -1938,32 +1938,32 @@ void SendProfTrainerMenu_guard_mulgore(Player *player, Creature *_Creature, uint
player->SEND_GOSSIP_MENU(4059,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-2263.34, -287.91, 6, 6, 0, "Pyall Silentstride");
+ player->SEND_POI(-2263.34, -287.91, 7, 6, 0, "Pyall Silentstride");
player->SEND_GOSSIP_MENU(4060,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
player->SEND_GOSSIP_MENU(4061,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //First Aid
- player->SEND_POI(-2353.52, -355.82, 6, 6, 0, "Vira Younghoof");
+ player->SEND_POI(-2353.52, -355.82, 7, 6, 0, "Vira Younghoof");
player->SEND_GOSSIP_MENU(4062,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Fishing
- player->SEND_POI(-2349.21, -241.37, 6, 6, 0, "Uthan Stillwater");
+ player->SEND_POI(-2349.21, -241.37, 7, 6, 0, "Uthan Stillwater");
player->SEND_GOSSIP_MENU(4063,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Herbalism
player->SEND_GOSSIP_MENU(4064,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Leatherworking
- player->SEND_POI(-2257.12, -288.63, 6, 6, 0, "Chaw Stronghide");
+ player->SEND_POI(-2257.12, -288.63, 7, 6, 0, "Chaw Stronghide");
player->SEND_GOSSIP_MENU(4065,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Mining
player->SEND_GOSSIP_MENU(4066,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Skinning
- player->SEND_POI(-2252.94, -291.32, 6, 6, 0, "Yonn Deepcut");
+ player->SEND_POI(-2252.94, -291.32, 7, 6, 0, "Yonn Deepcut");
player->SEND_GOSSIP_MENU(4067,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Tailoring
@@ -2021,43 +2021,43 @@ void SendDefaultMenu_guard_orgrimmar(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Bank
- player->SEND_POI(1631.51, -4375.33, 6, 6, 0, "Bank of Orgrimmar");
+ player->SEND_POI(1631.51, -4375.33, 7, 6, 0, "Bank of Orgrimmar");
player->SEND_GOSSIP_MENU(2554,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //wind rider
- player->SEND_POI(1676.6, -4332.72, 6, 6, 0, "The Sky Tower");
+ player->SEND_POI(1676.6, -4332.72, 7, 6, 0, "The Sky Tower");
player->SEND_GOSSIP_MENU(2555,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //guild master
- player->SEND_POI(1576.93, -4294.75, 6, 6, 0, "Horde Embassy");
+ player->SEND_POI(1576.93, -4294.75, 7, 6, 0, "Horde Embassy");
player->SEND_GOSSIP_MENU(2556,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(1644.51, -4447.27, 6, 6, 0, "Orgrimmar Inn");
+ player->SEND_POI(1644.51, -4447.27, 7, 6, 0, "Orgrimmar Inn");
player->SEND_GOSSIP_MENU(2557,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //mailbox
- player->SEND_POI(1622.53, -4388.79, 6, 6, 0, "Orgrimmar Mailbox");
+ player->SEND_POI(1622.53, -4388.79, 7, 6, 0, "Orgrimmar Mailbox");
player->SEND_GOSSIP_MENU(2558,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //auction house
- player->SEND_POI(1679.21, -4450.1, 6, 6, 0, "Orgrimmar Auction House");
+ player->SEND_POI(1679.21, -4450.1, 7, 6, 0, "Orgrimmar Auction House");
player->SEND_GOSSIP_MENU(3075,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //zeppelin
- player->SEND_POI(1337.36, -4632.7, 6, 6, 0, "Orgrimmar Zeppelin Tower");
+ player->SEND_POI(1337.36, -4632.7, 7, 6, 0, "Orgrimmar Zeppelin Tower");
player->SEND_GOSSIP_MENU(3173,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //weapon master
- player->SEND_POI(2092.56, -4823.95, 6, 6, 0, "Sayoc & Hanashi");
+ player->SEND_POI(2092.56, -4823.95, 7, 6, 0, "Sayoc & Hanashi");
player->SEND_GOSSIP_MENU(4519,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //stable master
- player->SEND_POI(2133.12, -4663.93, 6, 6, 0, "Xon'cha");
+ player->SEND_POI(2133.12, -4663.93, 7, 6, 0, "Xon'cha");
player->SEND_GOSSIP_MENU(5974,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //officers lounge
- player->SEND_POI(1633.56, -4249.37, 6, 6, 0, "Hall of Legends");
+ player->SEND_POI(1633.56, -4249.37, 7, 6, 0, "Hall of Legends");
player->SEND_GOSSIP_MENU(7046,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //battlemaster
@@ -2100,15 +2100,15 @@ void SendBattleMasterMenu_guard_orgrimmar(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(1983.92, -4794.2, 6, 6, 0, "Hall of the Brave");
+ player->SEND_POI(1983.92, -4794.2, 7, 6, 0, "Hall of the Brave");
player->SEND_GOSSIP_MENU(7484,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(1983.92, -4794.2, 6, 6, 0, "Hall of the Brave");
+ player->SEND_POI(1983.92, -4794.2, 7, 6, 0, "Hall of the Brave");
player->SEND_GOSSIP_MENU(7644,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //WSG
- player->SEND_POI(1983.92, -4794.2, 6, 6, 0, "Hall of the Brave");
+ player->SEND_POI(1983.92, -4794.2, 7, 6, 0, "Hall of the Brave");
player->SEND_GOSSIP_MENU(7520,_Creature->GetGUID());
break;
}
@@ -2119,35 +2119,35 @@ void SendClassTrainerMenu_guard_orgrimmar(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Hunter
- player->SEND_POI(2114.84, -4625.31, 6, 6, 0, "Orgrimmar Hunter's Hall");
+ player->SEND_POI(2114.84, -4625.31, 7, 6, 0, "Orgrimmar Hunter's Hall");
player->SEND_GOSSIP_MENU(2559,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Mage
- player->SEND_POI(1451.26, -4223.33, 6, 6, 0, "Darkbriar Lodge");
+ player->SEND_POI(1451.26, -4223.33, 7, 6, 0, "Darkbriar Lodge");
player->SEND_GOSSIP_MENU(2560,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Priest
- player->SEND_POI(1442.21, -4183.24, 6, 6, 0, "Spirit Lodge");
+ player->SEND_POI(1442.21, -4183.24, 7, 6, 0, "Spirit Lodge");
player->SEND_GOSSIP_MENU(2561,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Shaman
- player->SEND_POI(1925.34, -4181.89, 6, 6, 0, "Thrall's Fortress");
+ player->SEND_POI(1925.34, -4181.89, 7, 6, 0, "Thrall's Fortress");
player->SEND_GOSSIP_MENU(2562,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Rogue
- player->SEND_POI(1773.39, -4278.97, 6, 6, 0, "Shadowswift Brotherhood");
+ player->SEND_POI(1773.39, -4278.97, 7, 6, 0, "Shadowswift Brotherhood");
player->SEND_GOSSIP_MENU(2563,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Warlock
- player->SEND_POI(1849.57, -4359.68, 6, 6, 0, "Darkfire Enclave");
+ player->SEND_POI(1849.57, -4359.68, 7, 6, 0, "Darkfire Enclave");
player->SEND_GOSSIP_MENU(2564,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warrior
- player->SEND_POI(1983.92, -4794.2, 6, 6, 0, "Hall of the Brave");
+ player->SEND_POI(1983.92, -4794.2, 7, 6, 0, "Hall of the Brave");
player->SEND_GOSSIP_MENU(2565,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Paladin
- player->SEND_POI(1906.65, -4134.26, 6, 6, 0, "Valley of Wisdom");
+ player->SEND_POI(1906.65, -4134.26, 7, 6, 0, "Valley of Wisdom");
player->SEND_GOSSIP_MENU(10843,_Creature->GetGUID());
break;
}
@@ -2158,51 +2158,51 @@ void SendProfTrainerMenu_guard_orgrimmar(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(1955.17, -4475.79, 6, 6, 0, "Yelmak's Alchemy and Potions");
+ player->SEND_POI(1955.17, -4475.79, 7, 6, 0, "Yelmak's Alchemy and Potions");
player->SEND_GOSSIP_MENU(2497,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(2054.34, -4831.85, 6, 6, 0, "The Burning Anvil");
+ player->SEND_POI(2054.34, -4831.85, 7, 6, 0, "The Burning Anvil");
player->SEND_GOSSIP_MENU(2499,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(1780.96, -4481.31, 6, 6, 0, "Borstan's Firepit");
+ player->SEND_POI(1780.96, -4481.31, 7, 6, 0, "Borstan's Firepit");
player->SEND_GOSSIP_MENU(2500,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(1917.5, -4434.95, 6, 6, 0, "Godan's Runeworks");
+ player->SEND_POI(1917.5, -4434.95, 7, 6, 0, "Godan's Runeworks");
player->SEND_GOSSIP_MENU(2501,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(2038.45, -4744.75, 6, 6, 0, "Nogg's Machine Shop");
+ player->SEND_POI(2038.45, -4744.75, 7, 6, 0, "Nogg's Machine Shop");
player->SEND_GOSSIP_MENU(2653,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(1485.21, -4160.91, 6, 6, 0, "Survival of the Fittest");
+ player->SEND_POI(1485.21, -4160.91, 7, 6, 0, "Survival of the Fittest");
player->SEND_GOSSIP_MENU(2502,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(1994.15, -4655.7, 6, 6, 0, "Lumak's Fishing");
+ player->SEND_POI(1994.15, -4655.7, 7, 6, 0, "Lumak's Fishing");
player->SEND_GOSSIP_MENU(2503,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(1898.61, -4454.93, 6, 6, 0, "Jandi's Arboretum");
+ player->SEND_POI(1898.61, -4454.93, 7, 6, 0, "Jandi's Arboretum");
player->SEND_GOSSIP_MENU(2504,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(1852.82, -4562.31, 6, 6, 0, "Kodohide Leatherworkers");
+ player->SEND_POI(1852.82, -4562.31, 7, 6, 0, "Kodohide Leatherworkers");
player->SEND_GOSSIP_MENU(2513,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
- player->SEND_POI(2029.79, -4704, 6, 6, 0, "Red Canyon Mining");
+ player->SEND_POI(2029.79, -4704, 7, 6, 0, "Red Canyon Mining");
player->SEND_GOSSIP_MENU(2515,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(1852.82, -4562.31, 6, 6, 0, "Kodohide Leatherworkers");
+ player->SEND_POI(1852.82, -4562.31, 7, 6, 0, "Kodohide Leatherworkers");
player->SEND_GOSSIP_MENU(2516,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(1802.66, -4560.66, 6, 6, 0, "Magar's Cloth Goods");
+ player->SEND_POI(1802.66, -4560.66, 7, 6, 0, "Magar's Cloth Goods");
player->SEND_GOSSIP_MENU(2518,_Creature->GetGUID());
break;
}
@@ -2263,7 +2263,7 @@ void SendDefaultMenu_guard_shattrath(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Tavern
- player->SEND_POI(-1759.5, 5165, 6, 6, 0, "Worlds End Tavern");
+ player->SEND_POI(-1759.5, 5165, 7, 6, 0, "Worlds End Tavern");
player->SEND_GOSSIP_MENU(10394, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
@@ -2277,7 +2277,7 @@ void SendDefaultMenu_guard_shattrath(Player *player, Creature *_Creature, uint32
player->SEND_GOSSIP_MENU(10382, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Flight master
- player->SEND_POI(-1832, 5299, 6, 6, 0, "Flight Master");
+ player->SEND_POI(-1832, 5299, 7, 6, 0, "Flight Master");
player->SEND_GOSSIP_MENU(10385, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Mailbox
@@ -2310,11 +2310,11 @@ void SendDefaultMenu_guard_shattrath(Player *player, Creature *_Creature, uint32
player->SEND_GOSSIP_MENU(10391, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Mana Loom
- player->SEND_POI(-2070, 5265.5, 6, 6, 0, "Mana Loom");
+ player->SEND_POI(-2070, 5265.5, 7, 6, 0, "Mana Loom");
player->SEND_GOSSIP_MENU(10503, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Alchemy Lab
- player->SEND_POI(-1648.5, 5540, 6, 6, 0, "Alchemy Lab");
+ player->SEND_POI(-1648.5, 5540, 7, 6, 0, "Alchemy Lab");
player->SEND_GOSSIP_MENU(10321, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Gem Merchant
@@ -2329,12 +2329,12 @@ void SendBankMenu_guard_shattrath(Player *player, Creature *_Creature, uint32 ac
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->SEND_POI(-1730.5, 5496, 6, 6, 0, "Aldor Bank");
+ player->SEND_POI(-1730.5, 5496, 7, 6, 0, "Aldor Bank");
player->SEND_GOSSIP_MENU(10380, _Creature->GetGUID());
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
- player->SEND_POI(-1997.7, 5363, 6, 6, 0, "Scyers Bank");
+ player->SEND_POI(-1997.7, 5363, 7, 6, 0, "Scyers Bank");
player->SEND_GOSSIP_MENU(10381, _Creature->GetGUID());
}
}
@@ -2343,12 +2343,12 @@ void SendInnMenu_guard_shattrath(Player *player, Creature *_Creature, uint32 act
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->SEND_POI(-1895, 5767, 6, 6, 0, "Aldor Inn");
+ player->SEND_POI(-1895, 5767, 7, 6, 0, "Aldor Inn");
player->SEND_GOSSIP_MENU(10383, _Creature->GetGUID());
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
- player->SEND_POI(-2178, 5405, 6, 6, 0, "Scyers Inn");
+ player->SEND_POI(-2178, 5405, 7, 6, 0, "Scyers Inn");
player->SEND_GOSSIP_MENU(10384, _Creature->GetGUID());
}
}
@@ -2358,19 +2358,19 @@ void SendMailboxMenu_guard_shattrath(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
- player->SEND_POI(-1730.5, 5496, 6, 6, 0, "Aldor Bank");
+ player->SEND_POI(-1730.5, 5496, 7, 6, 0, "Aldor Bank");
player->SEND_GOSSIP_MENU(10380, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2:
- player->SEND_POI(-1895, 5767, 6, 6, 0, "Aldor Inn");
+ player->SEND_POI(-1895, 5767, 7, 6, 0, "Aldor Inn");
player->SEND_GOSSIP_MENU(10383, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3:
- player->SEND_POI(-1997.7, 5363, 6, 6, 0, "Scyers Bank");
+ player->SEND_POI(-1997.7, 5363, 7, 6, 0, "Scyers Bank");
player->SEND_GOSSIP_MENU(10381, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4:
- player->SEND_POI(-2178, 5405, 6, 6, 0, "Scyers Inn");
+ player->SEND_POI(-2178, 5405, 7, 6, 0, "Scyers Inn");
player->SEND_GOSSIP_MENU(10384, _Creature->GetGUID());
break;
}
@@ -2380,12 +2380,12 @@ void SendStableMasterMenu_guard_shattrath(Player *player, Creature *_Creature, u
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->SEND_POI(-1888.5, 5761, 6, 6, 0, "Aldor Stable");
+ player->SEND_POI(-1888.5, 5761, 7, 6, 0, "Aldor Stable");
player->SEND_GOSSIP_MENU(10321, _Creature->GetGUID());
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
- player->SEND_POI(-2170, 5404, 6, 6, 0, "Scyers Stable");
+ player->SEND_POI(-2170, 5404, 7, 6, 0, "Scyers Stable");
player->SEND_GOSSIP_MENU(10321, _Creature->GetGUID());
}
}
@@ -2395,15 +2395,15 @@ void SendBattleMasterMenu_guard_shattrath(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
- player->SEND_POI(-1774, 5251, 6, 6, 0, "Alliance Battlemasters");
+ player->SEND_POI(-1774, 5251, 7, 6, 0, "Alliance Battlemasters");
player->SEND_GOSSIP_MENU(10389, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2:
- player->SEND_POI(-1963, 5263, 6, 6, 0, "Horde Battlemasters");
+ player->SEND_POI(-1963, 5263, 7, 6, 0, "Horde Battlemasters");
player->SEND_GOSSIP_MENU(10390, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3:
- player->SEND_POI(-1960, 5175, 6, 6, 0, "Arena Battlemasters");
+ player->SEND_POI(-1960, 5175, 7, 6, 0, "Arena Battlemasters");
player->SEND_GOSSIP_MENU(12510, _Creature->GetGUID());
break;
}
@@ -2414,35 +2414,35 @@ void SendProfTrainerMenu_guard_shattrath(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-1648.5, 5534, 6, 6, 0, "Lorokeem");
+ player->SEND_POI(-1648.5, 5534, 7, 6, 0, "Lorokeem");
player->SEND_GOSSIP_MENU(10392, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-1847, 5222, 6, 6, 0, "Kradu Grimblade and Zula Slagfury");
+ player->SEND_POI(-1847, 5222, 7, 6, 0, "Kradu Grimblade and Zula Slagfury");
player->SEND_GOSSIP_MENU(10400, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-2067.4, 5316.5, 6, 6, 0, "Jack Trapper");
+ player->SEND_POI(-2067.4, 5316.5, 7, 6, 0, "Jack Trapper");
player->SEND_GOSSIP_MENU(10393, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-2263.5, 5563.5, 6, 6, 0, "High Enchanter Bardolan");
+ player->SEND_POI(-2263.5, 5563.5, 7, 6, 0, "High Enchanter Bardolan");
player->SEND_GOSSIP_MENU(10395, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //First Aid
- player->SEND_POI(-1591, 5265.5, 6, 6, 0, "Mildred Fletcher");
+ player->SEND_POI(-1591, 5265.5, 7, 6, 0, "Mildred Fletcher");
player->SEND_GOSSIP_MENU(10396, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Jewelcrafting
- player->SEND_POI(-1654, 5667.5, 6, 6, 0, "Hamanar");
+ player->SEND_POI(-1654, 5667.5, 7, 6, 0, "Hamanar");
player->SEND_GOSSIP_MENU(10397, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Leatherworking
- player->SEND_POI(-2060.5, 5256.5, 6, 6, 0, "Darmari");
+ player->SEND_POI(-2060.5, 5256.5, 7, 6, 0, "Darmari");
player->SEND_GOSSIP_MENU(10399, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Skinning
- player->SEND_POI(-2048, 5300, 6, 6, 0, "Seymour");
+ player->SEND_POI(-2048, 5300, 7, 6, 0, "Seymour");
player->SEND_GOSSIP_MENU(10398, _Creature->GetGUID());
break;
}
@@ -2452,12 +2452,12 @@ void SendGemMerchantMenu_guard_shattrath(Player *player, Creature *_Creature, ui
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->SEND_POI(-1645, 5669.5, 6, 6, 0, "Aldor Gem Merchant");
+ player->SEND_POI(-1645, 5669.5, 7, 6, 0, "Aldor Gem Merchant");
player->SEND_GOSSIP_MENU(10698, _Creature->GetGUID());
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
- player->SEND_POI(-2193, 5424.5, 6, 6, 0, "Scyers Gem Merchant");
+ player->SEND_POI(-2193, 5424.5, 7, 6, 0, "Scyers Gem Merchant");
player->SEND_GOSSIP_MENU(10699, _Creature->GetGUID());
}
}
@@ -2573,28 +2573,28 @@ void SendDefaultMenu_guard_shattrath_aldor(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Tavern
- player->SEND_POI(-1759.5, 5165, 6, 6, 0, "Worlds End Tavern");
+ player->SEND_POI(-1759.5, 5165, 7, 6, 0, "Worlds End Tavern");
player->SEND_GOSSIP_MENU(10394, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(-1730.5, 5496, 6, 6, 0, "Aldor Bank");
+ player->SEND_POI(-1730.5, 5496, 7, 6, 0, "Aldor Bank");
player->SEND_GOSSIP_MENU(10380, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Inn
- player->SEND_POI(-1895, 5767, 6, 6, 0, "Aldor Inn");
+ player->SEND_POI(-1895, 5767, 7, 6, 0, "Aldor Inn");
player->SEND_GOSSIP_MENU(10525, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Flight master
- player->SEND_POI(-1832, 5299, 6, 6, 0, "Shattrath Flight Master");
+ player->SEND_POI(-1832, 5299, 7, 6, 0, "Shattrath Flight Master");
player->SEND_GOSSIP_MENU(10402, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Mailbox
- player->SEND_POI(0, 0, 6, 6, 0, "Aldor Mailbox");
+ player->SEND_POI(0, 0, 7, 6, 0, "Aldor Mailbox");
//unknown
player->SEND_GOSSIP_MENU(10524, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Stable master
- player->SEND_POI(-1888.5, 5761, 6, 6, 0, "Aldor Stable Master");
+ player->SEND_POI(-1888.5, 5761, 7, 6, 0, "Aldor Stable Master");
player->SEND_GOSSIP_MENU(10527, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Battlemaster
@@ -2615,15 +2615,15 @@ void SendDefaultMenu_guard_shattrath_aldor(Player *player, Creature *_Creature,
player->SEND_GOSSIP_MENU(10391, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Mana Loom
- player->SEND_POI(-2070, 5265.5, 6, 6, 0, "Mana Loom");
+ player->SEND_POI(-2070, 5265.5, 7, 6, 0, "Mana Loom");
player->SEND_GOSSIP_MENU(10522, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Alchemy Lab
- player->SEND_POI(-1648.5, 5540, 6, 6, 0, "Alchemy Lab");
+ player->SEND_POI(-1648.5, 5540, 7, 6, 0, "Alchemy Lab");
player->SEND_GOSSIP_MENU(10696, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Gem Merchant
- player->SEND_POI(-1645, 5669.5, 6, 6, 0, "Aldor Gem Merchant");
+ player->SEND_POI(-1645, 5669.5, 7, 6, 0, "Aldor Gem Merchant");
player->SEND_GOSSIP_MENU(10411, _Creature->GetGUID());
break;
}
@@ -2634,35 +2634,35 @@ void SendProfTrainerMenu_guard_shattrath_aldor(Player *player, Creature *_Creatu
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-1648.5, 5534, 6, 6, 0, "Lorokeem");
+ player->SEND_POI(-1648.5, 5534, 7, 6, 0, "Lorokeem");
player->SEND_GOSSIP_MENU(10392, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-1847, 5222, 6, 6, 0, "Kradu Grimblade and Zula Slagfury");
+ player->SEND_POI(-1847, 5222, 7, 6, 0, "Kradu Grimblade and Zula Slagfury");
player->SEND_GOSSIP_MENU(10400, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-2067.4, 5316.5, 6, 6, 0, "Jack Trapper");
+ player->SEND_POI(-2067.4, 5316.5, 7, 6, 0, "Jack Trapper");
player->SEND_GOSSIP_MENU(10393, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-2263.5, 5563.5, 6, 6, 0, "High Enchanter Bardolan");
+ player->SEND_POI(-2263.5, 5563.5, 7, 6, 0, "High Enchanter Bardolan");
player->SEND_GOSSIP_MENU(10528, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //First Aid
- player->SEND_POI(-1591, 5265.5, 6, 6, 0, "Mildred Fletcher");
+ player->SEND_POI(-1591, 5265.5, 7, 6, 0, "Mildred Fletcher");
player->SEND_GOSSIP_MENU(10396, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Jewelcrafting
- player->SEND_POI(-1654, 5667.5, 6, 6, 0, "Hamanar");
+ player->SEND_POI(-1654, 5667.5, 7, 6, 0, "Hamanar");
player->SEND_GOSSIP_MENU(10529, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Leatherworking
- player->SEND_POI(-2060.5, 5256.5, 6, 6, 0, "Darmari");
+ player->SEND_POI(-2060.5, 5256.5, 7, 6, 0, "Darmari");
player->SEND_GOSSIP_MENU(10399, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Skinning
- player->SEND_POI(-2048, 5300, 6, 6, 0, "Seymour");
+ player->SEND_POI(-2048, 5300, 7, 6, 0, "Seymour");
player->SEND_GOSSIP_MENU(10419, _Creature->GetGUID());
break;
}
@@ -2769,27 +2769,27 @@ void SendDefaultMenu_guard_shattrath_scryer(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Tavern
- player->SEND_POI(-1759.5, 5165, 6, 6, 0, "Worlds End Tavern");
+ player->SEND_POI(-1759.5, 5165, 7, 6, 0, "Worlds End Tavern");
player->SEND_GOSSIP_MENU(10431, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(-1996.6, 5363.7, 6, 6, 0, "Scryer Bank");
+ player->SEND_POI(-1996.6, 5363.7, 7, 6, 0, "Scryer Bank");
player->SEND_GOSSIP_MENU(10432, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Inn
- player->SEND_POI(-2176.6, 5405.8, 6, 6, 0, "Scryer Inn");
+ player->SEND_POI(-2176.6, 5405.8, 7, 6, 0, "Scryer Inn");
player->SEND_GOSSIP_MENU(10433, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Flight master
- player->SEND_POI(-1832, 5299, 6, 6, 0, "Shattrath Flight Master");
+ player->SEND_POI(-1832, 5299, 7, 6, 0, "Shattrath Flight Master");
player->SEND_GOSSIP_MENU(10435, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Mailbox
- player->SEND_POI(-2174.3, 5411.4, 6, 6, 0, "Scryer Mailbox");
+ player->SEND_POI(-2174.3, 5411.4, 7, 6, 0, "Scryer Mailbox");
player->SEND_GOSSIP_MENU(10436, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Stable master
- player->SEND_POI(-2169.9, 5405.1, 6, 6, 0, "Scryer Stable Master");
+ player->SEND_POI(-2169.9, 5405.1, 7, 6, 0, "Scryer Stable Master");
player->SEND_GOSSIP_MENU(10437, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Battlemaster
@@ -2810,15 +2810,15 @@ void SendDefaultMenu_guard_shattrath_scryer(Player *player, Creature *_Creature,
player->SEND_GOSSIP_MENU(10504, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Mana Loom
- player->SEND_POI(-2070, 5265.5, 6, 6, 0, "Mana Loom");
+ player->SEND_POI(-2070, 5265.5, 7, 6, 0, "Mana Loom");
player->SEND_GOSSIP_MENU(10522, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Alchemy Lab
- player->SEND_POI(-1648.5, 5540, 6, 6, 0, "Alchemy Lab");
+ player->SEND_POI(-1648.5, 5540, 7, 6, 0, "Alchemy Lab");
player->SEND_GOSSIP_MENU(10701, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Gem Merchant
- player->SEND_POI(-1645, 5669.5, 6, 6, 0, "Scryer Gem Merchant");
+ player->SEND_POI(-1645, 5669.5, 7, 6, 0, "Scryer Gem Merchant");
player->SEND_GOSSIP_MENU(10702, _Creature->GetGUID());
break;
}
@@ -2829,35 +2829,35 @@ void SendProfTrainerMenu_guard_shattrath_scryer(Player *player, Creature *_Creat
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-1648.5, 5534, 6, 6, 0, "Lorokeem");
+ player->SEND_POI(-1648.5, 5534, 7, 6, 0, "Lorokeem");
player->SEND_GOSSIP_MENU(10516, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-1847, 5222, 6, 6, 0, "Kradu Grimblade and Zula Slagfury");
+ player->SEND_POI(-1847, 5222, 7, 6, 0, "Kradu Grimblade and Zula Slagfury");
player->SEND_GOSSIP_MENU(10517, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-2067.4, 5316.5, 6, 6, 0, "Jack Trapper");
+ player->SEND_POI(-2067.4, 5316.5, 7, 6, 0, "Jack Trapper");
player->SEND_GOSSIP_MENU(10518, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-2263.5, 5563.5, 6, 6, 0, "High Enchanter Bardolan");
+ player->SEND_POI(-2263.5, 5563.5, 7, 6, 0, "High Enchanter Bardolan");
player->SEND_GOSSIP_MENU(10519, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //First Aid
- player->SEND_POI(-1591, 5265.5, 6, 6, 0, "Mildred Fletcher");
+ player->SEND_POI(-1591, 5265.5, 7, 6, 0, "Mildred Fletcher");
player->SEND_GOSSIP_MENU(10520, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Jewelcrafting
- player->SEND_POI(-1654, 5667.5, 6, 6, 0, "Hamanar");
+ player->SEND_POI(-1654, 5667.5, 7, 6, 0, "Hamanar");
player->SEND_GOSSIP_MENU(10521, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Leatherworking
- player->SEND_POI(-2060.5, 5256.5, 6, 6, 0, "Darmari");
+ player->SEND_POI(-2060.5, 5256.5, 7, 6, 0, "Darmari");
player->SEND_GOSSIP_MENU(10523, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Skinning
- player->SEND_POI(-2048, 5300, 6, 6, 0, "Seymour");
+ player->SEND_POI(-2048, 5300, 7, 6, 0, "Seymour");
player->SEND_GOSSIP_MENU(10523, _Creature->GetGUID());
break;
}
@@ -2914,11 +2914,11 @@ void SendDefaultMenu_guard_silvermoon(Player *player, Creature *_Creature, uint3
player->SEND_GOSSIP_MENU(9317, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(9808.4, -7488.16, 6, 6, 0, "Silvermoon Bank");
+ player->SEND_POI(9808.4, -7488.16, 7, 6, 0, "Silvermoon Bank");
player->SEND_GOSSIP_MENU(9322, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Guild master
- player->SEND_POI(9474.97, -7345.21, 6, 6, 0, "Tandrine");
+ player->SEND_POI(9474.97, -7345.21, 7, 6, 0, "Tandrine");
player->SEND_GOSSIP_MENU(9324, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
@@ -2927,19 +2927,19 @@ void SendDefaultMenu_guard_silvermoon(Player *player, Creature *_Creature, uint3
player->SEND_GOSSIP_MENU(9602, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Mailbox
- player->SEND_POI(9658.33, -7492.17, 6, 6, 0, "Silvermoon Mailbox");
+ player->SEND_POI(9658.33, -7492.17, 7, 6, 0, "Silvermoon Mailbox");
player->SEND_GOSSIP_MENU(9326, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Stable master
- player->SEND_POI(9904.95, -7404.31, 6, 6, 0, "Shalenn");
+ player->SEND_POI(9904.95, -7404.31, 7, 6, 0, "Shalenn");
player->SEND_GOSSIP_MENU(9327, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Weapon trainer
- player->SEND_POI(9841.17, -7505.13, 6, 6, 0, "Ileda");
+ player->SEND_POI(9841.17, -7505.13, 7, 6, 0, "Ileda");
player->SEND_GOSSIP_MENU(9328, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Wind master
- player->SEND_POI(9378.45, -7163.94, 6, 6, 0, "Silvermoon Wind Master");
+ player->SEND_POI(9378.45, -7163.94, 7, 6, 0, "Silvermoon Wind Master");
player->SEND_GOSSIP_MENU(10181, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Battlemaster
@@ -2983,12 +2983,12 @@ void SendAuctionhouseMenu_guard_silvermoon(Player *player, Creature *_Creature,
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->SEND_POI(9644.47, -7140.22, 6, 6, 0, "Western Auction House");
+ player->SEND_POI(9644.47, -7140.22, 7, 6, 0, "Western Auction House");
player->SEND_GOSSIP_MENU(9318, _Creature->GetGUID());
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
- player->SEND_POI(9683.27, -7521.22, 6, 6, 0, "Royal Exchange Auction House");
+ player->SEND_POI(9683.27, -7521.22, 7, 6, 0, "Royal Exchange Auction House");
player->SEND_GOSSIP_MENU(9319, _Creature->GetGUID());
}
}
@@ -2997,12 +2997,12 @@ void SendInnMenu_guard_silvermoon(Player *player, Creature *_Creature, uint32 ac
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->SEND_POI(9677.7, -7368, 6, 6, 0, "Silvermoon City Inn");
+ player->SEND_POI(9677.7, -7368, 7, 6, 0, "Silvermoon City Inn");
player->SEND_GOSSIP_MENU(9325, _Creature->GetGUID());
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
- player->SEND_POI(9561.1, -7517.5, 6, 6, 0, "Wayfarer's Rest tavern");
+ player->SEND_POI(9561.1, -7517.5, 7, 6, 0, "Wayfarer's Rest tavern");
player->SEND_GOSSIP_MENU(9603, _Creature->GetGUID());
}
}
@@ -3012,23 +3012,23 @@ void SendBattleMasterMenu_guard_silvermoon(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(9850.49, -7572.26, 6, 6, 0, "Gurak");
+ player->SEND_POI(9850.49, -7572.26, 7, 6, 0, "Gurak");
player->SEND_GOSSIP_MENU(9329, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(9857.18, -7564.36, 6, 6, 0, "Karen Wentworth");
+ player->SEND_POI(9857.18, -7564.36, 7, 6, 0, "Karen Wentworth");
player->SEND_GOSSIP_MENU(9329, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //A
- player->SEND_POI(9850.6, -7559.25, 6, 6, 0, "Bipp Glizzitor");
+ player->SEND_POI(9850.6, -7559.25, 7, 6, 0, "Bipp Glizzitor");
player->SEND_GOSSIP_MENU(9329, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //EOS
- player->SEND_POI(9857.18, -7564.36, 6, 6, 0, "Karen Wentworth");
+ player->SEND_POI(9857.18, -7564.36, 7, 6, 0, "Karen Wentworth");
player->SEND_GOSSIP_MENU(9329, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //WSG
- player->SEND_POI(9845.45, -7562.58, 6, 6, 0, "Krukk");
+ player->SEND_POI(9845.45, -7562.58, 7, 6, 0, "Krukk");
player->SEND_GOSSIP_MENU(9329, _Creature->GetGUID());
break;
}
@@ -3039,31 +3039,31 @@ void SendClassTrainerMenu_guard_silvermoon(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(9700.55, -7262.57, 6, 6, 0, "Harene Plainwalker");
+ player->SEND_POI(9700.55, -7262.57, 7, 6, 0, "Harene Plainwalker");
player->SEND_GOSSIP_MENU(9330, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(9927.48, -7426.14, 6, 6, 0, "Zandine");
+ player->SEND_POI(9927.48, -7426.14, 7, 6, 0, "Zandine");
player->SEND_GOSSIP_MENU(9332, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Mage
- player->SEND_POI(9995.07, -7118.17, 6, 6, 0, "Quithas");
+ player->SEND_POI(9995.07, -7118.17, 7, 6, 0, "Quithas");
player->SEND_GOSSIP_MENU(9333, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Paladin
- player->SEND_POI(9850.22, -7516.93, 6, 6, 0, "Champion Bachi");
+ player->SEND_POI(9850.22, -7516.93, 7, 6, 0, "Champion Bachi");
player->SEND_GOSSIP_MENU(9334, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Priest
- player->SEND_POI(9926.79, -7066.66, 6, 6, 0, "Belestra");
+ player->SEND_POI(9926.79, -7066.66, 7, 6, 0, "Belestra");
player->SEND_GOSSIP_MENU(9335, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Rogue
- player->SEND_POI(9739.88, -7374.33, 6, 6, 0, "Zelanis");
+ player->SEND_POI(9739.88, -7374.33, 7, 6, 0, "Zelanis");
player->SEND_GOSSIP_MENU(9336, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Warlock
- player->SEND_POI(9787.57, -7284.63, 6, 6, 0, "Alamma");
+ player->SEND_POI(9787.57, -7284.63, 7, 6, 0, "Alamma");
player->SEND_GOSSIP_MENU(9337, _Creature->GetGUID());
break;
}
@@ -3074,55 +3074,55 @@ void SendProfTrainerMenu_guard_silvermoon(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(9998.09, -7214.36, 6, 6, 0, "Silvermoon Alchemy Trainer");
+ player->SEND_POI(9998.09, -7214.36, 7, 6, 0, "Silvermoon Alchemy Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(9841.43, -7361.53, 6, 6, 0, "Silvermoon Blacksmithing Trainer");
+ player->SEND_POI(9841.43, -7361.53, 7, 6, 0, "Silvermoon Blacksmithing Trainer");
player->SEND_GOSSIP_MENU(9340, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(9577.26, -7243.6, 6, 6, 0, "Silvermoon Cooking Trainer");
+ player->SEND_POI(9577.26, -7243.6, 7, 6, 0, "Silvermoon Cooking Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(9962.57, -7246.18, 6, 6, 0, "Silvermoon Enchanting Trainer");
+ player->SEND_POI(9962.57, -7246.18, 7, 6, 0, "Silvermoon Enchanting Trainer");
player->SEND_GOSSIP_MENU(9341, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(9820.18, -7329.56, 6, 6, 0, "Silvermoon Engineering Trainer");
+ player->SEND_POI(9820.18, -7329.56, 7, 6, 0, "Silvermoon Engineering Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(9579.8, -7343.71, 6, 6, 0, "Silvermoon First Aid Trainer");
+ player->SEND_POI(9579.8, -7343.71, 7, 6, 0, "Silvermoon First Aid Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(9602.73, -7328.3, 6, 6, 0, "Silvermoon Fishing Trainer");
+ player->SEND_POI(9602.73, -7328.3, 7, 6, 0, "Silvermoon Fishing Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Jewelcrafting
- player->SEND_POI(9553.54, -7506.43, 6, 6, 0, "Silvermoon Jewelcrafting Trainer");
+ player->SEND_POI(9553.54, -7506.43, 7, 6, 0, "Silvermoon Jewelcrafting Trainer");
player->SEND_GOSSIP_MENU(9346, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Herbalism
- player->SEND_POI(10004.4, -7216.86, 6, 6, 0, "Silvermoon Herbalism Trainer");
+ player->SEND_POI(10004.4, -7216.86, 7, 6, 0, "Silvermoon Herbalism Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Leatherworking
- player->SEND_POI(9503.72, -7430.16, 6, 6, 0, "Silvermoon Leatherworking Trainer");
+ player->SEND_POI(9503.72, -7430.16, 7, 6, 0, "Silvermoon Leatherworking Trainer");
player->SEND_GOSSIP_MENU(9347, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Mining
- player->SEND_POI(9805.1, -7355.56, 6, 6, 0, "Silvermoon Mining Trainer");
+ player->SEND_POI(9805.1, -7355.56, 7, 6, 0, "Silvermoon Mining Trainer");
player->SEND_GOSSIP_MENU(9348, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Skinning
- player->SEND_POI(9513.37, -7429.4, 6, 6, 0, "Silvermoon Skinning Trainer");
+ player->SEND_POI(9513.37, -7429.4, 7, 6, 0, "Silvermoon Skinning Trainer");
player->SEND_GOSSIP_MENU(9316, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 13: //Tailoring
- player->SEND_POI(9750.55, -7095.28, 6, 6, 0, "Silvermoon Tailor");
+ player->SEND_POI(9750.55, -7095.28, 7, 6, 0, "Silvermoon Tailor");
player->SEND_GOSSIP_MENU(9350, _Creature->GetGUID());
break;
}
@@ -3179,43 +3179,43 @@ void SendDefaultMenu_guard_stormwind(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Auction House
- player->SEND_POI(-8811.46, 667.46, 6, 6, 0, "Stormwind Auction House");
+ player->SEND_POI(-8811.46, 667.46, 7, 6, 0, "Stormwind Auction House");
player->SEND_GOSSIP_MENU(3834,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bank
- player->SEND_POI(-8916.87, 622.87, 6, 6, 0, "Stormwind Bank");
+ player->SEND_POI(-8916.87, 622.87, 7, 6, 0, "Stormwind Bank");
player->SEND_GOSSIP_MENU(764,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Deeprun tram
- player->SEND_POI(-8378.88, 554.23, 6, 6, 0, "The Deeprun Tram");
+ player->SEND_POI(-8378.88, 554.23, 7, 6, 0, "The Deeprun Tram");
player->SEND_GOSSIP_MENU(3813,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(-8869.0, 675.4, 6, 6, 0, "The Gilded Rose");
+ player->SEND_POI(-8869.0, 675.4, 7, 6, 0, "The Gilded Rose");
player->SEND_GOSSIP_MENU(3860,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Gryphon Master
- player->SEND_POI(-8837.0, 493.5, 6, 6, 0, "Stormwind Gryphon Master");
+ player->SEND_POI(-8837.0, 493.5, 7, 6, 0, "Stormwind Gryphon Master");
player->SEND_GOSSIP_MENU(879,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Guild Master
- player->SEND_POI(-8894.0, 611.2, 6, 6, 0, "Stormwind Vistor`s Center");
+ player->SEND_POI(-8894.0, 611.2, 7, 6, 0, "Stormwind Vistor`s Center");
player->SEND_GOSSIP_MENU(882,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Mailbox
- player->SEND_POI(-8876.48, 649.18, 6, 6, 0, "Stormwind Mailbox");
+ player->SEND_POI(-8876.48, 649.18, 7, 6, 0, "Stormwind Mailbox");
player->SEND_GOSSIP_MENU(3861,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Stable Master
- player->SEND_POI(-8433.0, 554.7, 6, 6, 0, "Jenova Stoneshield");
+ player->SEND_POI(-8433.0, 554.7, 7, 6, 0, "Jenova Stoneshield");
player->SEND_GOSSIP_MENU(5984,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Weapon Trainer
- player->SEND_POI(-8797.0, 612.8, 6, 6, 0, "Woo Ping");
+ player->SEND_POI(-8797.0, 612.8, 7, 6, 0, "Woo Ping");
player->SEND_GOSSIP_MENU(4516,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Officers Lounge
- player->SEND_POI(-8759.92, 399.69, 6, 6, 0, "Champions` Hall");
+ player->SEND_POI(-8759.92, 399.69, 7, 6, 0, "Champions` Hall");
player->SEND_GOSSIP_MENU(7047,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Battlemasters
@@ -3259,15 +3259,15 @@ void SendBattleMasterMenu_guard_stormwind(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(-8443.88, 335.99, 6, 6, 0, "Thelman Slatefist");
+ player->SEND_POI(-8443.88, 335.99, 7, 6, 0, "Thelman Slatefist");
player->SEND_GOSSIP_MENU(7500, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(-8443.88, 335.99, 6, 6, 0, "Lady Hoteshem");
+ player->SEND_POI(-8443.88, 335.99, 7, 6, 0, "Lady Hoteshem");
player->SEND_GOSSIP_MENU(7650, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //WSG
- player->SEND_POI(-8443.88, 335.99, 6, 6, 0, "Elfarran");
+ player->SEND_POI(-8443.88, 335.99, 7, 6, 0, "Elfarran");
player->SEND_GOSSIP_MENU(7501, _Creature->GetGUID());
break;
}
@@ -3278,39 +3278,39 @@ void SendClassTrainerMenu_guard_stormwind(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Mage
- player->SEND_POI(-9012.0, 867.6, 6, 6, 0, "Wizard`s Sanctum");
+ player->SEND_POI(-9012.0, 867.6, 7, 6, 0, "Wizard`s Sanctum");
player->SEND_GOSSIP_MENU(899,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Rogue
- player->SEND_POI(-8753.0, 367.8, 6, 6, 0, "Stormwind - Rogue House");
+ player->SEND_POI(-8753.0, 367.8, 7, 6, 0, "Stormwind - Rogue House");
player->SEND_GOSSIP_MENU(900,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Warrior
- player->SEND_POI(-8690.11, 324.85, 6, 6, 0, "Command Center");
+ player->SEND_POI(-8690.11, 324.85, 7, 6, 0, "Command Center");
player->SEND_GOSSIP_MENU(901,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Druid
- player->SEND_POI(-8751.0, 1124.5, 6, 6, 0, "The Park");
+ player->SEND_POI(-8751.0, 1124.5, 7, 6, 0, "The Park");
player->SEND_GOSSIP_MENU(902,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Priest
- player->SEND_POI(-8512.0, 862.4, 6, 6, 0, "Catedral Of Light");
+ player->SEND_POI(-8512.0, 862.4, 7, 6, 0, "Catedral Of Light");
player->SEND_GOSSIP_MENU(903,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Paladin
- player->SEND_POI(-8577.0, 881.7, 6, 6, 0, "Catedral Of Light");
+ player->SEND_POI(-8577.0, 881.7, 7, 6, 0, "Catedral Of Light");
player->SEND_GOSSIP_MENU(904,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Hunter
- player->SEND_POI(-8413.0, 541.5, 6, 6, 0, "Hunter Lodge");
+ player->SEND_POI(-8413.0, 541.5, 7, 6, 0, "Hunter Lodge");
player->SEND_GOSSIP_MENU(905,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Warlock
- player->SEND_POI(-8948.91, 998.35, 6, 6, 0, "The Slaughtered Lamb");
+ player->SEND_POI(-8948.91, 998.35, 7, 6, 0, "The Slaughtered Lamb");
player->SEND_GOSSIP_MENU(906,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Shaman
- player->SEND_POI(-9033, 550, 6, 6, 0, "Valley Of Heroes");
+ player->SEND_POI(-9033, 550, 7, 6, 0, "Valley Of Heroes");
//incorrect id
player->SEND_GOSSIP_MENU(2593,_Creature->GetGUID());
break;
@@ -3322,51 +3322,51 @@ void SendProfTrainerMenu_guard_stormwind(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(-8988.0, 759.60, 6, 6, 0, "Alchemy Needs");
+ player->SEND_POI(-8988.0, 759.60, 7, 6, 0, "Alchemy Needs");
player->SEND_GOSSIP_MENU(919,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(-8424.0, 616.9, 6, 6, 0, "Therum Deepforge");
+ player->SEND_POI(-8424.0, 616.9, 7, 6, 0, "Therum Deepforge");
player->SEND_GOSSIP_MENU(920,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(-8611.0, 364.6, 6, 6, 0, "Pig and Whistle Tavern");
+ player->SEND_POI(-8611.0, 364.6, 7, 6, 0, "Pig and Whistle Tavern");
player->SEND_GOSSIP_MENU(921,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(-8858.0, 803.7, 6, 6, 0, "Lucan Cordell");
+ player->SEND_POI(-8858.0, 803.7, 7, 6, 0, "Lucan Cordell");
player->SEND_GOSSIP_MENU(941,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(-8347.0, 644.1, 6, 6, 0, "Lilliam Sparkspindle");
+ player->SEND_POI(-8347.0, 644.1, 7, 6, 0, "Lilliam Sparkspindle");
player->SEND_GOSSIP_MENU(922,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(-8513.0, 801.8, 6, 6, 0, "Shaina Fuller");
+ player->SEND_POI(-8513.0, 801.8, 7, 6, 0, "Shaina Fuller");
player->SEND_GOSSIP_MENU(923,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(-8803.0, 767.5, 6, 6, 0, "Arnold Leland");
+ player->SEND_POI(-8803.0, 767.5, 7, 6, 0, "Arnold Leland");
player->SEND_GOSSIP_MENU(940,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(-8967.0, 779.5, 6, 6, 0, "Alchemy Needs");
+ player->SEND_POI(-8967.0, 779.5, 7, 6, 0, "Alchemy Needs");
player->SEND_GOSSIP_MENU(924,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(-8726.0, 477.4, 6, 6, 0, "The Protective Hide");
+ player->SEND_POI(-8726.0, 477.4, 7, 6, 0, "The Protective Hide");
player->SEND_GOSSIP_MENU(925,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
- player->SEND_POI(-8434.0, 692.8, 6, 6, 0, "Gelman Stonehand");
+ player->SEND_POI(-8434.0, 692.8, 7, 6, 0, "Gelman Stonehand");
player->SEND_GOSSIP_MENU(927,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(-8716.0, 469.4, 6, 6, 0, "The Protective Hide");
+ player->SEND_POI(-8716.0, 469.4, 7, 6, 0, "The Protective Hide");
player->SEND_GOSSIP_MENU(928,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(-8938.0, 800.7, 6, 6, 0, "Duncan`s Textiles");
+ player->SEND_POI(-8938.0, 800.7, 7, 6, 0, "Duncan`s Textiles");
player->SEND_GOSSIP_MENU(929,_Creature->GetGUID());
break;
}
@@ -3431,11 +3431,11 @@ void SendDefaultMenu_guard_teldrassil(Player *player, Creature *_Creature, uint3
player->SEND_GOSSIP_MENU(4319,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(9821.49, 960.13, 6, 6, 0, "Dolanaar Inn");
+ player->SEND_POI(9821.49, 960.13, 7, 6, 0, "Dolanaar Inn");
player->SEND_GOSSIP_MENU(4320,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //stable master
- player->SEND_POI(9808.37, 931.1, 6, 6, 0, "Seriadne");
+ player->SEND_POI(9808.37, 931.1, 7, 6, 0, "Seriadne");
player->SEND_GOSSIP_MENU(5982,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //class trainer
@@ -3466,23 +3466,23 @@ void SendClassTrainerMenu_guard_teldrassil(Player *player, Creature *_Creature,
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Druid
- player->SEND_POI(9741.58, 963.7, 6, 6, 0, "Kal");
+ player->SEND_POI(9741.58, 963.7, 7, 6, 0, "Kal");
player->SEND_GOSSIP_MENU(4323,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Hunter
- player->SEND_POI(9815.12, 926.28, 6, 6, 0, "Dazalar");
+ player->SEND_POI(9815.12, 926.28, 7, 6, 0, "Dazalar");
player->SEND_GOSSIP_MENU(4324,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Priest
- player->SEND_POI(9906.16, 986.63, 6, 6, 0, "Laurna Morninglight");
+ player->SEND_POI(9906.16, 986.63, 7, 6, 0, "Laurna Morninglight");
player->SEND_GOSSIP_MENU(4325,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Rogue
- player->SEND_POI(9789, 942.86, 6, 6, 0, "Jannok Breezesong");
+ player->SEND_POI(9789, 942.86, 7, 6, 0, "Jannok Breezesong");
player->SEND_GOSSIP_MENU(4326,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Warrior
- player->SEND_POI(9821.96, 950.61, 6, 6, 0, "Kyra Windblade");
+ player->SEND_POI(9821.96, 950.61, 7, 6, 0, "Kyra Windblade");
player->SEND_GOSSIP_MENU(4327,_Creature->GetGUID());
break;
}
@@ -3493,34 +3493,34 @@ void SendProfTrainerMenu_guard_teldrassil(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(9767.59, 878.81, 6, 6, 0, "Cyndra Kindwhisper");
+ player->SEND_POI(9767.59, 878.81, 7, 6, 0, "Cyndra Kindwhisper");
player->SEND_GOSSIP_MENU(4329,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Cooking
- player->SEND_POI(9751.19, 906.13, 6, 6, 0, "Zarrin");
+ player->SEND_POI(9751.19, 906.13, 7, 6, 0, "Zarrin");
player->SEND_GOSSIP_MENU(4330,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Enchanting
- player->SEND_POI(10677.59, 1946.56, 6, 6, 0, "Alanna Raveneye");
+ player->SEND_POI(10677.59, 1946.56, 7, 6, 0, "Alanna Raveneye");
player->SEND_GOSSIP_MENU(4331,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //First Aid
- player->SEND_POI(9903.12, 999, 6, 6, 0, "Byancie");
+ player->SEND_POI(9903.12, 999, 7, 6, 0, "Byancie");
player->SEND_GOSSIP_MENU(4332,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Fishing
player->SEND_GOSSIP_MENU(4333,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Herbalism
- player->SEND_POI(9773.78, 875.88, 6, 6, 0, "Malorne Bladeleaf");
+ player->SEND_POI(9773.78, 875.88, 7, 6, 0, "Malorne Bladeleaf");
player->SEND_GOSSIP_MENU(4334,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Leatherworking
- player->SEND_POI(10152.59, 1681.46, 6, 6, 0, "Nadyia Maneweaver");
+ player->SEND_POI(10152.59, 1681.46, 7, 6, 0, "Nadyia Maneweaver");
player->SEND_GOSSIP_MENU(4335,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Skinning
- player->SEND_POI(10135.59, 1673.18, 6, 6, 0, "Radnaal Maneweaver");
+ player->SEND_POI(10135.59, 1673.18, 7, 6, 0, "Radnaal Maneweaver");
player->SEND_GOSSIP_MENU(4336,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Tailoring
@@ -3576,11 +3576,11 @@ void SendDefaultMenu_guard_tirisfal(Player *player, Creature *_Creature, uint32
player->SEND_GOSSIP_MENU(4075,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Inn
- player->SEND_POI(2246.68, 241.89, 6, 6, 0, "Gallows` End Tavern");
+ player->SEND_POI(2246.68, 241.89, 7, 6, 0, "Gallows` End Tavern");
player->SEND_GOSSIP_MENU(4076,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Stable Master
- player->SEND_POI(2267.66, 319.32, 6, 6, 0, "Morganus");
+ player->SEND_POI(2267.66, 319.32, 7, 6, 0, "Morganus");
player->SEND_GOSSIP_MENU(5978,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Class trainer
@@ -3614,23 +3614,23 @@ void SendClassTrainerMenu_guard_tirisfal(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Mage
- player->SEND_POI(2259.18, 240.93, 6, 6, 0, "Cain Firesong");
+ player->SEND_POI(2259.18, 240.93, 7, 6, 0, "Cain Firesong");
player->SEND_GOSSIP_MENU(4077,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Priest
- player->SEND_POI(2259.18, 240.93, 6, 6, 0, "Dark Cleric Beryl");
+ player->SEND_POI(2259.18, 240.93, 7, 6, 0, "Dark Cleric Beryl");
player->SEND_GOSSIP_MENU(4078,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Rogue
- player->SEND_POI(2259.18, 240.93, 6, 6, 0, "Marion Call");
+ player->SEND_POI(2259.18, 240.93, 7, 6, 0, "Marion Call");
player->SEND_GOSSIP_MENU(4079,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Warlock
- player->SEND_POI(2259.18, 240.93, 6, 6, 0, "Rupert Boch");
+ player->SEND_POI(2259.18, 240.93, 7, 6, 0, "Rupert Boch");
player->SEND_GOSSIP_MENU(4080,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Warrior
- player->SEND_POI(2256.48, 240.32, 6, 6, 0, "Austil de Mon");
+ player->SEND_POI(2256.48, 240.32, 7, 6, 0, "Austil de Mon");
player->SEND_GOSSIP_MENU(4081,_Creature->GetGUID());
break;
}
@@ -3641,7 +3641,7 @@ void SendProfTrainerMenu_guard_tirisfal(Player *player, Creature *_Creature, uin
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(2263.25, 344.23, 6, 6, 0, "Carolai Anise");
+ player->SEND_POI(2263.25, 344.23, 7, 6, 0, "Carolai Anise");
player->SEND_GOSSIP_MENU(4082,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
@@ -3651,37 +3651,37 @@ void SendProfTrainerMenu_guard_tirisfal(Player *player, Creature *_Creature, uin
player->SEND_GOSSIP_MENU(4084,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(2250.35, 249.12, 6, 6, 0, "Vance Undergloom");
+ player->SEND_POI(2250.35, 249.12, 7, 6, 0, "Vance Undergloom");
player->SEND_GOSSIP_MENU(4085,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
player->SEND_GOSSIP_MENU(4086,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(2246.68, 241.89, 6, 6, 0, "Nurse Neela");
+ player->SEND_POI(2246.68, 241.89, 7, 6, 0, "Nurse Neela");
player->SEND_GOSSIP_MENU(4087,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(2292.37, -10.72, 6, 6, 0, "Clyde Kellen");
+ player->SEND_POI(2292.37, -10.72, 7, 6, 0, "Clyde Kellen");
player->SEND_GOSSIP_MENU(4088,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(2268.21, 331.69, 6, 6, 0, "Faruza");
+ player->SEND_POI(2268.21, 331.69, 7, 6, 0, "Faruza");
player->SEND_GOSSIP_MENU(4089,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(2027, 78.72, 6, 6, 0, "Shelene Rhobart");
+ player->SEND_POI(2027, 78.72, 7, 6, 0, "Shelene Rhobart");
player->SEND_GOSSIP_MENU(4090,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
player->SEND_GOSSIP_MENU(4091,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(2027, 78.72, 6, 6, 0, "Rand Rhobart");
+ player->SEND_POI(2027, 78.72, 7, 6, 0, "Rand Rhobart");
player->SEND_GOSSIP_MENU(4092,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(2160.45, 659.93, 6, 6, 0, "Bowen Brisboise");
+ player->SEND_POI(2160.45, 659.93, 7, 6, 0, "Bowen Brisboise");
player->SEND_GOSSIP_MENU(4093,_Creature->GetGUID());
break;
}
@@ -3734,39 +3734,39 @@ void SendDefaultMenu_guard_undercity(Player *player, Creature *_Creature, uint32
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Bank
- player->SEND_POI(1595.64, 232.45, 6, 6, 0, "Undercity Bank");
+ player->SEND_POI(1595.64, 232.45, 7, 6, 0, "Undercity Bank");
player->SEND_GOSSIP_MENU(3514,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Bat handler
- player->SEND_POI(1565.9, 271.43, 6, 6, 0, "Undercity Bat Handler");
+ player->SEND_POI(1565.9, 271.43, 7, 6, 0, "Undercity Bat Handler");
player->SEND_GOSSIP_MENU(3515,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Guild master
- player->SEND_POI(1594.17, 205.57, 6, 6, 0, "Undercity Guild Master");
+ player->SEND_POI(1594.17, 205.57, 7, 6, 0, "Undercity Guild Master");
player->SEND_GOSSIP_MENU(3516,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Inn
- player->SEND_POI(1639.43, 220.99, 6, 6, 0, "Undercity Inn");
+ player->SEND_POI(1639.43, 220.99, 7, 6, 0, "Undercity Inn");
player->SEND_GOSSIP_MENU(3517,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Mailbox
- player->SEND_POI(1632.68, 219.4, 6, 6, 0, "Undercity Mailbox");
+ player->SEND_POI(1632.68, 219.4, 7, 6, 0, "Undercity Mailbox");
player->SEND_GOSSIP_MENU(3518,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //Auction House
- player->SEND_POI(1647.9, 258.49, 6, 6, 0, "Undercity Auction House");
+ player->SEND_POI(1647.9, 258.49, 7, 6, 0, "Undercity Auction House");
player->SEND_GOSSIP_MENU(3519,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Zeppelin
- player->SEND_POI(2059, 274.86, 6, 6, 0, "Undercity Zeppelin");
+ player->SEND_POI(2059, 274.86, 7, 6, 0, "Undercity Zeppelin");
player->SEND_GOSSIP_MENU(3520,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Weapon Master
- player->SEND_POI(1670.31, 324.66, 6, 6, 0, "Archibald");
+ player->SEND_POI(1670.31, 324.66, 7, 6, 0, "Archibald");
player->SEND_GOSSIP_MENU(4521,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Stable master
- player->SEND_POI(1634.18, 226.76, 6, 6, 0, "Anya Maulray");
+ player->SEND_POI(1634.18, 226.76, 7, 6, 0, "Anya Maulray");
player->SEND_GOSSIP_MENU(5979,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Battlemaster
@@ -3806,15 +3806,15 @@ void SendBattleMasterMenu_guard_undercity(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //AV
- player->SEND_POI(1329, 333.92, 6, 6, 0, "Grizzle Halfmane");
+ player->SEND_POI(1329, 333.92, 7, 6, 0, "Grizzle Halfmane");
player->SEND_GOSSIP_MENU(7525,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //AB
- player->SEND_POI(1283.3, 287.16, 6, 6, 0, "Sir Malory Wheeler");
+ player->SEND_POI(1283.3, 287.16, 7, 6, 0, "Sir Malory Wheeler");
player->SEND_GOSSIP_MENU(7646,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //WSG
- player->SEND_POI(1265, 351.18, 6, 6, 0, "Kurden Bloodclaw");
+ player->SEND_POI(1265, 351.18, 7, 6, 0, "Kurden Bloodclaw");
player->SEND_GOSSIP_MENU(7526,_Creature->GetGUID());
break;
}
@@ -3825,23 +3825,23 @@ void SendClassTrainerMenu_guard_undercity(Player *player, Creature *_Creature, u
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Mage
- player->SEND_POI(1781, 53, 6, 6, 0, "Undercity Mage Trainers");
+ player->SEND_POI(1781, 53, 7, 6, 0, "Undercity Mage Trainers");
player->SEND_GOSSIP_MENU(3513,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Priest
- player->SEND_POI(1758.33, 401.5, 6, 6, 0, "Undercity Priest Trainers");
+ player->SEND_POI(1758.33, 401.5, 7, 6, 0, "Undercity Priest Trainers");
player->SEND_GOSSIP_MENU(3521,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Rogue
- player->SEND_POI(1418.56, 65, 6, 6, 0, "Undercity Rogue Trainers");
+ player->SEND_POI(1418.56, 65, 7, 6, 0, "Undercity Rogue Trainers");
player->SEND_GOSSIP_MENU(3524,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Warlock
- player->SEND_POI(1780.92, 53.16, 6, 6, 0, "Undercity Warlock Trainers");
+ player->SEND_POI(1780.92, 53.16, 7, 6, 0, "Undercity Warlock Trainers");
player->SEND_GOSSIP_MENU(3526,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Warrior
- player->SEND_POI(1775.59, 418.19, 6, 6, 0, "Undercity Warrior Trainers");
+ player->SEND_POI(1775.59, 418.19, 7, 6, 0, "Undercity Warrior Trainers");
player->SEND_GOSSIP_MENU(3527,_Creature->GetGUID());
break;
}
@@ -3852,51 +3852,51 @@ void SendProfTrainerMenu_guard_undercity(Player *player, Creature *_Creature, ui
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1: //Alchemy
- player->SEND_POI(1419.82, 417.19, 6, 6, 0, "The Apothecarium");
+ player->SEND_POI(1419.82, 417.19, 7, 6, 0, "The Apothecarium");
player->SEND_GOSSIP_MENU(3528,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2: //Blacksmithing
- player->SEND_POI(1696, 285, 6, 6, 0, "Undercity Blacksmithing Trainer");
+ player->SEND_POI(1696, 285, 7, 6, 0, "Undercity Blacksmithing Trainer");
player->SEND_GOSSIP_MENU(3529,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 3: //Cooking
- player->SEND_POI(1596.34, 274.68, 6, 6, 0, "Undercity Cooking Trainer");
+ player->SEND_POI(1596.34, 274.68, 7, 6, 0, "Undercity Cooking Trainer");
player->SEND_GOSSIP_MENU(3530,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 4: //Enchanting
- player->SEND_POI(1488.54, 280.19, 6, 6, 0, "Undercity Enchanting Trainer");
+ player->SEND_POI(1488.54, 280.19, 7, 6, 0, "Undercity Enchanting Trainer");
player->SEND_GOSSIP_MENU(3531,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 5: //Engineering
- player->SEND_POI(1408.58, 143.43, 6, 6, 0, "Undercity Engineering Trainer");
+ player->SEND_POI(1408.58, 143.43, 7, 6, 0, "Undercity Engineering Trainer");
player->SEND_GOSSIP_MENU(3532,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 6: //First Aid
- player->SEND_POI(1519.65, 167.19, 6, 6, 0, "Undercity First Aid Trainer");
+ player->SEND_POI(1519.65, 167.19, 7, 6, 0, "Undercity First Aid Trainer");
player->SEND_GOSSIP_MENU(3533,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 7: //Fishing
- player->SEND_POI(1679.9, 89, 6, 6, 0, "Undercity Fishing Trainer");
+ player->SEND_POI(1679.9, 89, 7, 6, 0, "Undercity Fishing Trainer");
player->SEND_GOSSIP_MENU(3534,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 8: //Herbalism
- player->SEND_POI(1558, 349.36, 6, 6, 0, "Undercity Herbalism Trainer");
+ player->SEND_POI(1558, 349.36, 7, 6, 0, "Undercity Herbalism Trainer");
player->SEND_GOSSIP_MENU(3535,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 9: //Leatherworking
- player->SEND_POI(1498.76, 196.43, 6, 6, 0, "Undercity Leatherworking Trainer");
+ player->SEND_POI(1498.76, 196.43, 7, 6, 0, "Undercity Leatherworking Trainer");
player->SEND_GOSSIP_MENU(3536,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 10: //Mining
- player->SEND_POI(1642.88, 335.58, 6, 6, 0, "Undercity Mining Trainer");
+ player->SEND_POI(1642.88, 335.58, 7, 6, 0, "Undercity Mining Trainer");
player->SEND_GOSSIP_MENU(3537,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 11: //Skinning
- player->SEND_POI(1498.6, 196.46, 6, 6, 0, "Undercity Skinning Trainer");
+ player->SEND_POI(1498.6, 196.46, 7, 6, 0, "Undercity Skinning Trainer");
player->SEND_GOSSIP_MENU(3538,_Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 12: //Tailoring
- player->SEND_POI(1689.55, 193, 6, 6, 0, "Undercity Tailoring Trainer");
+ player->SEND_POI(1689.55, 193, 7, 6, 0, "Undercity Tailoring Trainer");
player->SEND_GOSSIP_MENU(3539,_Creature->GetGUID());
break;
}
diff --git a/src/bindings/scripts/scripts/item/item_scripts.cpp b/src/bindings/scripts/scripts/item/item_scripts.cpp
index a2e02069e15..b749b5f087f 100644
--- a/src/bindings/scripts/scripts/item/item_scripts.cpp
+++ b/src/bindings/scripts/scripts/item/item_scripts.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp
index 97f3f088a31..d9089fe0ccc 100644
--- a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp
+++ b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/npc/npc_escortAI.h b/src/bindings/scripts/scripts/npc/npc_escortAI.h
index 906726dd0c2..af0d3f64aa5 100644
--- a/src/bindings/scripts/scripts/npc/npc_escortAI.h
+++ b/src/bindings/scripts/scripts/npc/npc_escortAI.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/npc/npc_innkeeper.cpp b/src/bindings/scripts/scripts/npc/npc_innkeeper.cpp
index f96011266b9..7e01a85719d 100644
--- a/src/bindings/scripts/scripts/npc/npc_innkeeper.cpp
+++ b/src/bindings/scripts/scripts/npc/npc_innkeeper.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/npc/npc_professions.cpp b/src/bindings/scripts/scripts/npc/npc_professions.cpp
index a13dc927603..e121e598528 100644
--- a/src/bindings/scripts/scripts/npc/npc_professions.cpp
+++ b/src/bindings/scripts/scripts/npc/npc_professions.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -634,8 +634,6 @@ void SendActionMenu_npc_prof_blacksmith(Player *player, Creature *_Creature, uin
{
//unknown textID (TALK_MUST_UNLEARN_WEAPON)
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
- //Temporary, not offilike
- _Creature->MonsterSay(TALK_MUST_UNLEARN_WEAPON,0,player->GetGUID());
}
else if( EquippedOk(player,S_UNLEARN_WEAPON) )
{
diff --git a/src/bindings/scripts/scripts/npc/npcs_special.cpp b/src/bindings/scripts/scripts/npc/npcs_special.cpp
index 3a113b8fae6..07556ce46f4 100644
--- a/src/bindings/scripts/scripts/npc/npcs_special.cpp
+++ b/src/bindings/scripts/scripts/npc/npcs_special.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -40,10 +40,11 @@ EndContentData */
# npc_chicken_cluck
#########*/
+#define EMOTE_A_HELLO -1070004
+#define EMOTE_H_HELLO -1070005
+#define EMOTE_CLUCK_TEXT2 -1070006
+
#define QUEST_CLUCK 3861
-#define EMOTE_A_HELLO "looks up at you quizzically. Maybe you should inspect it?"
-#define EMOTE_H_HELLO "looks at you unexpectadly."
-#define CLUCK_TEXT2 "starts pecking at the feed."
#define FACTION_FRIENDLY 84
#define FACTION_CHICKEN 31
@@ -95,18 +96,17 @@ bool ReceiveEmote_npc_chicken_cluck( Player *player, Creature *_Creature, uint32
{
_Creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
_Creature->setFaction(FACTION_FRIENDLY);
- _Creature->MonsterTextEmote(EMOTE_A_HELLO, 0);
+ DoScriptText(EMOTE_A_HELLO, _Creature);
}
}
- } else
- _Creature->MonsterTextEmote(EMOTE_H_HELLO,0);
+ } else DoScriptText(EMOTE_H_HELLO,_Creature);
}
if( emote == TEXTEMOTE_CHEER && player->GetTeam() == ALLIANCE )
if( player->GetQuestStatus(QUEST_CLUCK) == QUEST_STATUS_COMPLETE )
{
_Creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
_Creature->setFaction(FACTION_FRIENDLY);
- _Creature->MonsterTextEmote(CLUCK_TEXT2, 0);
+ DoScriptText(EMOTE_CLUCK_TEXT2, _Creature);
}
return true;
@@ -211,75 +211,46 @@ bool ReceiveEmote_npc_dancing_flames( Player *player, Creature *flame, uint32 em
## Triage quest
######*/
-#define SAY_DOC1 "I'm saved! Thank you, doctor!"
-#define SAY_DOC2 "HOORAY! I AM SAVED!"
-#define SAY_DOC3 "Sweet, sweet embrace... take me..."
+#define SAY_DOC1 -1000201
+#define SAY_DOC2 -1000202
+#define SAY_DOC3 -1000203
+
+#define DOCTOR_ALLIANCE 12939
+#define DOCTOR_HORDE 12920
+#define ALLIANCE_COORDS 7
+#define HORDE_COORDS 6
struct Location
{
float x, y, z, o;
};
-#define DOCTOR_ALLIANCE 12939
-
static Location AllianceCoords[]=
{
- { // Top-far-right bunk as seen from entrance
- -3757.38, -4533.05, 14.16, 3.62
- },
- { // Top-far-left bunk
- -3754.36, -4539.13, 14.16, 5.13
- },
- { // Far-right bunk
- -3749.54, -4540.25, 14.28, 3.34
- },
- { // Right bunk near entrance
- -3742.10, -4536.85, 14.28, 3.64
- },
- { // Far-left bunk
- -3755.89, -4529.07, 14.05, 0.57
- },
- { // Mid-left bunk
- -3749.51, -4527.08, 14.07, 5.26
- },
- { // Left bunk near entrance
- -3746.37, -4525.35, 14.16, 5.22
- },
+ {-3757.38, -4533.05, 14.16, 3.62}, // Top-far-right bunk as seen from entrance
+ {-3754.36, -4539.13, 14.16, 5.13}, // Top-far-left bunk
+ {-3749.54, -4540.25, 14.28, 3.34}, // Far-right bunk
+ {-3742.10, -4536.85, 14.28, 3.64}, // Right bunk near entrance
+ {-3755.89, -4529.07, 14.05, 0.57}, // Far-left bunk
+ {-3749.51, -4527.08, 14.07, 5.26}, // Mid-left bunk
+ {-3746.37, -4525.35, 14.16, 5.22}, // Left bunk near entrance
};
-#define ALLIANCE_COORDS 7
-
//alliance run to where
#define A_RUNTOX -3742.96
#define A_RUNTOY -4531.52
#define A_RUNTOZ 11.91
-#define DOCTOR_HORDE 12920
-
static Location HordeCoords[]=
{
- { // Left, Behind
- -1013.75, -3492.59, 62.62, 4.34
- },
- { // Right, Behind
- -1017.72, -3490.92, 62.62, 4.34
- },
- { // Left, Mid
- -1015.77, -3497.15, 62.82, 4.34
- },
- { // Right, Mid
- -1019.51, -3495.49, 62.82, 4.34
- },
- { // Left, front
- -1017.25, -3500.85, 62.98, 4.34
- },
- { // Right, Front
- -1020.95, -3499.21, 62.98, 4.34
- }
+ {-1013.75, -3492.59, 62.62, 4.34}, // Left, Behind
+ {-1017.72, -3490.92, 62.62, 4.34}, // Right, Behind
+ {-1015.77, -3497.15, 62.82, 4.34}, // Left, Mid
+ {-1019.51, -3495.49, 62.82, 4.34}, // Right, Mid
+ {-1017.25, -3500.85, 62.98, 4.34}, // Left, front
+ {-1020.95, -3499.21, 62.98, 4.34} // Right, Front
};
-#define HORDE_COORDS 6
-
//horde run to where
#define H_RUNTOX -1016.44
#define H_RUNTOY -3508.48
@@ -305,6 +276,8 @@ const uint32 HordeSoldierId[3] =
struct TRINITY_DLL_DECL npc_doctorAI : public ScriptedAI
{
+ npc_doctorAI(Creature *c) : ScriptedAI(c) {Reset();}
+
uint64 Playerguid;
uint32 SummonPatient_Timer;
@@ -317,9 +290,17 @@ struct TRINITY_DLL_DECL npc_doctorAI : public ScriptedAI
std::list<uint64> Patients;
std::vector<Location*> Coordinates;
- npc_doctorAI(Creature *c) : ScriptedAI(c) {Reset();}
+ void Reset()
+ {
+ Playerguid = 0;
+
+ SummonPatient_Timer = 10000;
+ SummonPatientCount = 0;
+ PatientDiedCount = 0;
+ PatientSavedCount = 0;
- void Reset(){}
+ Event = false;
+ }
void BeginEvent(Player* player);
void PatientDied(Location* Point);
@@ -338,20 +319,21 @@ struct TRINITY_DLL_DECL npc_injured_patientAI : public ScriptedAI
npc_injured_patientAI(Creature *c) : ScriptedAI(c) {Reset();}
uint64 Doctorguid;
-
Location* Coord;
void Reset()
{
Doctorguid = 0;
-
Coord = NULL;
- //no select
+
+ //no select
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- //no regen health
+
+ //no regen health
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
- //to make them lay with face down
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_DEAD);
+
+ //to make them lay with face down
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
uint32 mobId = m_creature->GetEntry();
@@ -378,25 +360,34 @@ struct TRINITY_DLL_DECL npc_injured_patientAI : public ScriptedAI
{
if (caster->GetTypeId() == TYPEID_PLAYER && m_creature->isAlive() && spell->Id == 20804)
{
- if( (((Player*)caster)->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (((Player*)caster)->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE))
+ if((((Player*)caster)->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (((Player*)caster)->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE))
{
- if(Doctorguid)
+ if (Doctorguid)
{
- Creature* Doctor = ((Creature*)Unit::GetUnit((*m_creature), Doctorguid));
- if(Doctor)
+ if (Creature* Doctor = ((Creature*)Unit::GetUnit((*m_creature), Doctorguid)))
((npc_doctorAI*)Doctor->AI())->PatientSaved(m_creature, ((Player*)caster), Coord);
}
}
- //make not selectable
+
+ //make not selectable
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- //regen health
+
+ //regen health
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
- //stand up
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_NONE);
- DoSay(SAY_DOC1,LANG_UNIVERSAL,NULL);
+
+ //stand up
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_STAND);
+
+ switch(rand()%3)
+ {
+ case 0: DoScriptText(SAY_DOC1,m_creature); break;
+ case 1: DoScriptText(SAY_DOC2,m_creature); break;
+ case 2: DoScriptText(SAY_DOC3,m_creature); break;
+ }
uint32 mobId = m_creature->GetEntry();
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
+
switch (mobId)
{
case 12923:
@@ -416,8 +407,9 @@ struct TRINITY_DLL_DECL npc_injured_patientAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
+ //lower HP on every world tick makes it a useful counter, not officlone though
if (m_creature->isAlive() && m_creature->GetHealth() > 6)
- { //lower HP on every world tick makes it a useful counter, not officlone though
+ {
m_creature->SetHealth(uint32(m_creature->GetHealth()-5) );
}
@@ -428,10 +420,9 @@ struct TRINITY_DLL_DECL npc_injured_patientAI : public ScriptedAI
m_creature->setDeathState(JUST_DIED);
m_creature->SetFlag(UNIT_DYNAMIC_FLAGS, 32);
- if(Doctorguid)
+ if (Doctorguid)
{
- Creature* Doctor = ((Creature*)Unit::GetUnit((*m_creature), Doctorguid));
- if(Doctor)
+ if (Creature* Doctor = ((Creature*)Unit::GetUnit((*m_creature), Doctorguid)))
((npc_doctorAI*)Doctor->AI())->PatientDied(Coord);
}
}
@@ -462,7 +453,6 @@ void npc_doctorAI::BeginEvent(Player* player)
for(uint8 i = 0; i < ALLIANCE_COORDS; ++i)
Coordinates.push_back(&AllianceCoords[i]);
break;
-
case DOCTOR_HORDE:
for(uint8 i = 0; i < HORDE_COORDS; ++i)
Coordinates.push_back(&HordeCoords[i]);
@@ -470,7 +460,6 @@ void npc_doctorAI::BeginEvent(Player* player)
}
Event = true;
-
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
@@ -489,6 +478,7 @@ void npc_doctorAI::PatientDied(Location* Point)
Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Reset();
}
Coordinates.push_back(Point);
@@ -497,31 +487,31 @@ void npc_doctorAI::PatientDied(Location* Point)
void npc_doctorAI::PatientSaved(Creature* soldier, Player* player, Location* Point)
{
- if(player && Playerguid == player->GetGUID())
+ if (player && Playerguid == player->GetGUID())
{
- if((player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE))
+ if ((player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE))
{
PatientSavedCount++;
- if(PatientSavedCount == 15)
+ if (PatientSavedCount == 15)
{
- if(!Patients.empty())
+ if (!Patients.empty())
{
std::list<uint64>::iterator itr;
for(itr = Patients.begin(); itr != Patients.end(); ++itr)
{
- Creature* Patient = ((Creature*)Unit::GetUnit((*m_creature), *itr));
- if( Patient )
+ if (Creature* Patient = ((Creature*)Unit::GetUnit((*m_creature), *itr)))
Patient->setDeathState(JUST_DIED);
}
}
- if(player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE)
+ if (player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE)
player->AreaExploredOrEventHappens(6624);
- else if(player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)
+ else if (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)
player->AreaExploredOrEventHappens(6622);
Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Reset();
}
Coordinates.push_back(Point);
@@ -531,53 +521,61 @@ void npc_doctorAI::PatientSaved(Creature* soldier, Player* player, Location* Poi
void npc_doctorAI::UpdateAI(const uint32 diff)
{
- if(Event && SummonPatientCount >= 20)
+ if (Event && SummonPatientCount >= 20)
{
Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Reset();
}
- if(Event)
- if(SummonPatient_Timer < diff)
+ if (Event)
{
- Creature* Patient = NULL;
- Location* Point = NULL;
+ if (SummonPatient_Timer < diff)
+ {
+ Creature* Patient = NULL;
+ Location* Point = NULL;
- if(Coordinates.empty())
- return;
+ if (Coordinates.empty())
+ return;
- std::vector<Location*>::iterator itr = Coordinates.begin()+rand()%Coordinates.size();
- uint32 patientEntry = 0;
+ std::vector<Location*>::iterator itr = Coordinates.begin()+rand()%Coordinates.size();
+ uint32 patientEntry = 0;
- switch(m_creature->GetEntry())
- {
- case DOCTOR_ALLIANCE: patientEntry = AllianceSoldierId[rand()%3]; break;
- case DOCTOR_HORDE: patientEntry = HordeSoldierId[rand()%3]; break;
- default:
- error_log("SD2: Invalid entry for Triage doctor. Please check your database");
- return;
- }
+ switch(m_creature->GetEntry())
+ {
+ case DOCTOR_ALLIANCE: patientEntry = AllianceSoldierId[rand()%3]; break;
+ case DOCTOR_HORDE: patientEntry = HordeSoldierId[rand()%3]; break;
+ default:
+ error_log("SD2: Invalid entry for Triage doctor. Please check your database");
+ return;
+ }
- Point = *itr;
+ Point = *itr;
- Patient = m_creature->SummonCreature(patientEntry, Point->x, Point->y, Point->z, Point->o, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
+ Patient = m_creature->SummonCreature(patientEntry, Point->x, Point->y, Point->z, Point->o, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
- if(Patient)
- {
- Patients.push_back(Patient->GetGUID());
- ((npc_injured_patientAI*)Patient->AI())->Doctorguid = m_creature->GetGUID();
- if(Point)
- ((npc_injured_patientAI*)Patient->AI())->Coord = Point;
- Coordinates.erase(itr);
- }
- SummonPatient_Timer = 10000;
- SummonPatientCount++;
- }else SummonPatient_Timer -= diff;
+ if (Patient)
+ {
+ //303, this flag appear to be required for client side item->spell to work (TARGET_SINGLE_FRIEND)
+ Patient->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
+
+ Patients.push_back(Patient->GetGUID());
+ ((npc_injured_patientAI*)Patient->AI())->Doctorguid = m_creature->GetGUID();
+
+ if (Point)
+ ((npc_injured_patientAI*)Patient->AI())->Coord = Point;
+
+ Coordinates.erase(itr);
+ }
+ SummonPatient_Timer = 10000;
+ SummonPatientCount++;
+ }else SummonPatient_Timer -= diff;
+ }
}
bool QuestAccept_npc_doctor(Player *player, Creature *creature, Quest const *quest )
{
- if((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622))
+ if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622))
((npc_doctorAI*)creature->AI())->BeginEvent(player);
return true;
@@ -593,7 +591,6 @@ CreatureAI* GetAI_npc_doctor(Creature *_Creature)
######*/
#define SPELL_DEATHTOUCH 5
-#define SAY_AGGRO "This area is closed!"
struct TRINITY_DLL_DECL npc_guardianAI : public ScriptedAI
{
@@ -606,7 +603,6 @@ struct TRINITY_DLL_DECL npc_guardianAI : public ScriptedAI
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
}
void UpdateAI(const uint32 diff)
diff --git a/src/bindings/scripts/scripts/zone/alterac_mountains/alterac_mountains.cpp b/src/bindings/scripts/scripts/zone/alterac_mountains/alterac_mountains.cpp
index 19b19444b84..10736c84acd 100644
--- a/src/bindings/scripts/scripts/zone/alterac_mountains/alterac_mountains.cpp
+++ b/src/bindings/scripts/scripts/zone/alterac_mountains/alterac_mountains.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp b/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp
index 06cfa1b8a4d..b3f92e93408 100644
--- a/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp
+++ b/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp b/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp
index 79d76824e8c..0192ac01a4a 100644
--- a/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp
+++ b/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -108,6 +108,9 @@ struct TRINITY_DLL_DECL npc_torekAI : public npc_escortAI
void JustDied(Unit* killer)
{
+ if (killer->GetEntry() == m_creature->GetEntry())
+ return;
+
if (PlayerGUID && !Completed)
{
if (Unit* player = Unit::GetUnit((*m_creature), PlayerGUID))
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp
index 89e1dcb5222..de1cc812df8 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -300,7 +300,7 @@ CreatureAI* GetAI_boss_exarch_maladaar(Creature *_Creature)
}
#define SPELL_AV_MORTAL_STRIKE 16856
-#define SPELL_AV_MORTAL_STRIKE 16856
+#define SPELL_AV_SUNDER_ARMOR 16145
struct TRINITY_DLL_DECL mob_avatar_of_martyredAI : public ScriptedAI
{
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp
index 2262266ce38..4df3bc3c356 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp
index 7875addda9e..02e34437474 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_pandemonius.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_pandemonius.cpp
index 74e8fd1e962..067ca215169 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_pandemonius.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_pandemonius.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_darkweaver_syth.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_darkweaver_syth.cpp
index aa198fa0019..046ce673b3f 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_darkweaver_syth.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_darkweaver_syth.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
index 9dc7f53efbe..3b017c48a69 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -148,7 +148,7 @@ struct TRINITY_DLL_DECL boss_talon_king_ikissAI : public ScriptedAI
if (ArcaneVolley_Timer < diff)
{
DoCast(m_creature,HeroicMode ? H_SPELL_ARCANE_VOLLEY : SPELL_ARCANE_VOLLEY);
- ArcaneVolley_Timer = 10000+rand()%5000;
+ ArcaneVolley_Timer = 7000+rand()%5000;
}else ArcaneVolley_Timer -= diff;
if (Sheep_Timer < diff)
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/def_sethekk_halls.h b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/def_sethekk_halls.h
index 52ba2206c21..698571faecc 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/def_sethekk_halls.h
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/def_sethekk_halls.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/instance_sethekk_halls.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/instance_sethekk_halls.cpp
index e22ac68ff02..3d53f7b29e8 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/instance_sethekk_halls.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/instance_sethekk_halls.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp
index b54a402c8d1..b77a2ec7702 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -38,7 +38,7 @@ EndScriptData */
#define SAY_DEATH -1555007
#define SPELL_BANISH 30231
-#define SPELL_CORROSIVE_ACID 23313
+#define SPELL_CORROSIVE_ACID 33551
#define SPELL_FEAR 33547
#define SPELL_ENRAGE 0 //need to find proper spell
@@ -169,14 +169,14 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
if (CorrosiveAcid_Timer < diff)
{
- DoCast(m_creature,SPELL_CORROSIVE_ACID);
- CorrosiveAcid_Timer = 25000;
+ DoCast(m_creature->getVictim(),SPELL_CORROSIVE_ACID);
+ CorrosiveAcid_Timer = 15000 + rand()%10000;
}else CorrosiveAcid_Timer -= diff;
if (Fear_Timer < diff)
{
DoCast(m_creature,SPELL_FEAR);
- Fear_Timer = 35000;
+ Fear_Timer = 20000 + rand()%15000;
}else Fear_Timer -= diff;
/*if (HeroicMode)
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp
index 424869e8c72..49b5524d51a 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -149,14 +149,14 @@ struct TRINITY_DLL_DECL boss_blackheart_the_inciterAI : public ScriptedAI
{
if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CHARGE);
- Charge_Timer = 25000;
+ Charge_Timer = 15000 + rand()%10000;
}else Charge_Timer -= diff;
//Knockback_Timer
if (Knockback_Timer < diff)
{
DoCast(m_creature, SPELL_WAR_STOMP);
- Knockback_Timer = 20000;
+ Knockback_Timer = 18000 + rand()%6000;
}else Knockback_Timer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
index f0461e4ca7f..9e2b88dfd83 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
@@ -152,7 +152,7 @@ struct TRINITY_DLL_DECL boss_grandmaster_vorpilAI : public ScriptedAI
void Reset()
{
- ShadowBoltVolley_Timer = 15000;
+ ShadowBoltVolley_Timer = 7000 + rand()%7000;
DrawShadows_Timer = 45000;
summonTraveler_Timer = 90000;
banish_Timer = 17000;
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL boss_grandmaster_vorpilAI : public ScriptedAI
if (ShadowBoltVolley_Timer < diff)
{
DoCast(m_creature,SPELL_SHADOWBOLT_VOLLEY);
- ShadowBoltVolley_Timer = 15000;
+ ShadowBoltVolley_Timer = 15000 + rand()%15000;;
}else ShadowBoltVolley_Timer -= diff;
if (HeroicMode && banish_Timer < diff)
@@ -288,7 +288,7 @@ struct TRINITY_DLL_DECL boss_grandmaster_vorpilAI : public ScriptedAI
DoCast(m_creature,HeroicMode?H_SPELL_RAIN_OF_FIRE:SPELL_RAIN_OF_FIRE);
ShadowBoltVolley_Timer = 6000;
- DrawShadows_Timer = 30000;
+ DrawShadows_Timer = 3000;
}else DrawShadows_Timer -= diff;
if ( summonTraveler_Timer < diff)
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
index c6599ad7d98..7efb4a496e4 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
@@ -53,9 +53,9 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
void Reset()
{
SonicBoom_Timer = 30000;
- MurmursTouch_Timer = 20000;
- Resonance_Timer = 10000;
- MagneticPull_Timer = 20000;
+ MurmursTouch_Timer = 8000 + rand()%12000;
+ Resonance_Timer = 5000;
+ MagneticPull_Timer = 15000 + rand()%15000;
ThunderingStorm_Timer = 15000;
SonicShock_Timer = 10000;
SonicBoom = false;
@@ -65,6 +65,24 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
if (hp) m_creature->SetHealth(hp);
}
+ void SonicBoomEffect()
+ {
+ std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList();
+ for( std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr )
+ {
+ Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
+ if (target && target->GetTypeId() == TYPEID_PLAYER)
+ {
+ //Not do anything without aura, spell can be resisted!
+ if (target->HasAura(SPELL_SONIC_BOOM_CAST,1) && m_creature->IsWithinDistInMap(target, 34.0f))
+ {
+ //This will be wrong calculation. Also, comments suggest it must deal damage
+ target->SetHealth(uint32(target->GetMaxHealth() - target->GetMaxHealth() * 0.8));
+ }
+ }
+ }
+ }
+
void Aggro(Unit *who) { }
// Sonic Boom instant damage (needs core fix instead of this)
@@ -84,6 +102,8 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
if(SonicBoom)
{
DoCast(m_creature, SPELL_SONIC_BOOM_EFFECT, true);
+ SonicBoomEffect();
+
SonicBoom = false;
Resonance_Timer = 1500;
}
@@ -101,16 +121,18 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,80,true))
DoCast(target, SPELL_MURMURS_TOUCH);
- MurmursTouch_Timer = 30000;
+ MurmursTouch_Timer = 25000 + rand()%10000;
}else MurmursTouch_Timer -= diff;
// Resonance
- if (Resonance_Timer < diff)
+ if (!SonicBoom && !(m_creature->IsWithinMeleeRange(m_creature->getVictim())))
{
- if (!m_creature->IsWithinMeleeRange(SelectUnit(SELECT_TARGET_NEAREST,0,20,true)))
+ if (Resonance_Timer < diff)
+ {
DoCast(m_creature, SPELL_RESONANCE);
- Resonance_Timer = 5000;
- }else Resonance_Timer -= diff;
+ Resonance_Timer = 5000;
+ }else Resonance_Timer -= diff;
+ }
// Magnetic Pull
if (MagneticPull_Timer < diff)
@@ -119,7 +141,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
if (target->GetTypeId() == TYPEID_PLAYER && target->isAlive())
{
DoCast(target, SPELL_MAGNETIC_PULL);
- MagneticPull_Timer = 20000+rand()%15000;
+ MagneticPull_Timer = 15000+rand()%15000;
return;
}
MagneticPull_Timer = 500;
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/def_shadow_labyrinth.h b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/def_shadow_labyrinth.h
index d03c9270181..a78955368bf 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/def_shadow_labyrinth.h
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/def_shadow_labyrinth.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
index c87670085a3..03605ab4eb7 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -80,7 +80,7 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 18732:
GrandmasterVorpil = creature->GetGUID();
diff --git a/src/bindings/scripts/scripts/zone/azshara/azshara.cpp b/src/bindings/scripts/scripts/zone/azshara/azshara.cpp
index 4ed71f89c55..4428f17ea21 100644
--- a/src/bindings/scripts/scripts/zone/azshara/azshara.cpp
+++ b/src/bindings/scripts/scripts/zone/azshara/azshara.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/azshara/boss_azuregos.cpp b/src/bindings/scripts/scripts/zone/azshara/boss_azuregos.cpp
index a38f25361a5..adc985aaef9 100644
--- a/src/bindings/scripts/scripts/zone/azshara/boss_azuregos.cpp
+++ b/src/bindings/scripts/scripts/zone/azshara/boss_azuregos.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp b/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp
index 7a78def9da8..c65186a76ab 100644
--- a/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp
+++ b/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -39,155 +39,140 @@ EndContentData */
## npc_draenei_survivor
######*/
-#define HEAL1 -1000248
-#define HEAL2 -1000249
-#define HEAL3 -1000250
-#define HEAL4 -1000251
+#define SAY_HEAL1 -1000248
+#define SAY_HEAL2 -1000249
+#define SAY_HEAL3 -1000250
+#define SAY_HEAL4 -1000251
-#define HELP1 -1000252
-#define HELP2 -1000253
-#define HELP3 -1000254
-#define HELP4 -1000255
+#define SAY_HELP1 -1000252
+#define SAY_HELP2 -1000253
+#define SAY_HELP3 -1000254
+#define SAY_HELP4 -1000255
+
+#define SPELL_IRRIDATION 35046
+#define SPELL_STUNNED 28630
struct TRINITY_DLL_DECL npc_draenei_survivorAI : public ScriptedAI
{
npc_draenei_survivorAI(Creature *c) : ScriptedAI(c) {Reset();}
- uint32 UnSpawnTimer;
- uint32 ResetlifeTimer;
- uint32 SayingTimer;
- uint32 HealSayTimer;
- bool UnSpawn;
- bool say;
- bool HealSay;
- bool isRun;
- bool isMove;
+ uint64 pCaster;
+
+ uint32 SayThanksTimer;
+ uint32 RunAwayTimer;
+ uint32 SayHelpTimer;
+
+ bool CanSayHelp;
void Reset()
{
- UnSpawnTimer = 2500;
- ResetlifeTimer= 60000;
- SayingTimer = 5000;
- HealSayTimer = 6000;
- say = false;
- isRun = false;
- isMove = false;
- UnSpawn = false;
- HealSay = false;
+ pCaster = 0;
+
+ SayThanksTimer = 0;
+ RunAwayTimer = 0;
+ SayHelpTimer = 10000;
+
+ CanSayHelp = true;
+
+ m_creature->CastSpell(m_creature, SPELL_IRRIDATION, true);
+
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
- //cast red shining
- m_creature->CastSpell(m_creature, 29152, false, NULL);
- //set creature health
m_creature->SetHealth(int(m_creature->GetMaxHealth()*.1));
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 3);
+ m_creature->SetStandState(UNIT_STAND_STATE_SLEEP);
}
void Aggro(Unit *who) {}
- void MoveInLineOfSight(Unit *who) //MoveInLineOfSight is called if creature could see you, updated all 100 ms
+ void MoveInLineOfSight(Unit *who)
{
- if (!who)
- return;
-
- if(who->GetTypeId() == TYPEID_PLAYER && m_creature->IsFriendlyTo(who) && m_creature->IsWithinDistInMap(who, 15) && say && !isRun)
+ if (CanSayHelp && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsFriendlyTo(who) && m_creature->IsWithinDistInMap(who, 25.0f))
{
- switch (rand()%4) //Random switch between 4 texts
+ //Random switch between 4 texts
+ switch (rand()%4)
{
- case 0:
- DoScriptText(HELP1, m_creature);
- SayingTimer = 15000;
- say = false;
- break;
- case 1:
- DoScriptText(HELP2, m_creature);
- SayingTimer = 15000;
- say = false;
- break;
- case 2:
- DoScriptText(HELP3, m_creature);
- SayingTimer = 15000;
- say = false;
- break;
- case 3:
- DoScriptText(HELP4, m_creature);
- SayingTimer = 15000;
- say = false;
- break;
- }
- }
- else
- {
- isRun = false;
+ case 0: DoScriptText(SAY_HELP1, m_creature, who); break;
+ case 1: DoScriptText(SAY_HELP2, m_creature, who); break;
+ case 2: DoScriptText(SAY_HELP3, m_creature, who); break;
+ case 3: DoScriptText(SAY_HELP4, m_creature, who); break;
+ }
+
+ SayHelpTimer = 20000;
+ CanSayHelp = false;
}
}
- void UpdateAI(const uint32 diff) //Is also called each ms for Creature AI Updates...
+ void SpellHit(Unit *Caster, const SpellEntry *Spell)
{
- if (m_creature->GetHealth() > 50)
+ if (Spell->SpellFamilyFlags[2] & 0x080000000)
{
- if(ResetlifeTimer < diff)
- {
- ResetlifeTimer = 60000;
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
- //set creature health
- m_creature->SetHealth(int(m_creature->GetMaxHealth()*.1));
- // ley down
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,3);
- }
- else ResetlifeTimer -= diff;
- }
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
- if(HealSay)
- {
- if (HealSayTimer < diff)
- {
- UnSpawn = true;
- isRun = true;
- isMove = true;
- }else HealSayTimer -= diff;
+ m_creature->CastSpell(m_creature, SPELL_STUNNED, true);
+
+ pCaster = Caster->GetGUID();
+
+ SayThanksTimer = 5000;
}
+ }
- if(UnSpawn)
+ void UpdateAI(const uint32 diff)
+ {
+ if (SayThanksTimer)
{
- if(isMove)
+ if (SayThanksTimer <= diff)
{
+ m_creature->RemoveAurasDueToSpell(SPELL_IRRIDATION);
+
+ if (Player *pPlayer = (Player*)Unit::GetUnit(*m_creature,pCaster))
+ {
+ if (pPlayer->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ switch (rand()%4)
+ {
+ case 0: DoScriptText(SAY_HEAL1, m_creature, pPlayer); break;
+ case 1: DoScriptText(SAY_HEAL2, m_creature, pPlayer); break;
+ case 2: DoScriptText(SAY_HEAL3, m_creature, pPlayer); break;
+ case 3: DoScriptText(SAY_HEAL4, m_creature, pPlayer); break;
+ }
+
+ pPlayer->TalkedToCreature(m_creature->GetEntry(),m_creature->GetGUID());
+ }
+
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MovePoint(0, -4115.053711f, -13754.831055f, 73.508949f);
- isMove = false;
- }
- if (UnSpawnTimer < diff)
- {
- m_creature->StopMoving();
- EnterEvadeMode();
- //set creature health
- m_creature->SetHealth(int(m_creature->GetMaxHealth()*.1));
+ RunAwayTimer = 10000;
+ SayThanksTimer = 0;
+ }else SayThanksTimer -= diff;
- }else UnSpawnTimer -= diff;
+ return;
}
- if(SayingTimer < diff)
+ if (RunAwayTimer)
{
- say = true;
- }else SayingTimer -= diff;
- }
-
- void SpellHit(Unit *Hitter, const SpellEntry *Spellkind)//Called if you cast a spell and do some things if Specified spell is true!
- {
- if (Hitter && Spellkind->Id == 28880)
- {
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED);
- m_creature->HandleEmoteCommand(ANIM_RISE);
- switch (rand()%4) //This switch doesn't work at all, creature say nothing!
+ if (RunAwayTimer <= diff)
{
- case 0: DoScriptText(HEAL1, m_creature, Hitter); break;
- case 1: DoScriptText(HEAL2, m_creature, Hitter); break;
- case 2: DoScriptText(HEAL3, m_creature, Hitter); break;
- case 3: DoScriptText(HEAL4, m_creature, Hitter); break;
- }
- HealSay = true;
+ m_creature->RemoveAllAuras();
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MoveIdle();
+ m_creature->setDeathState(JUST_DIED);
+ m_creature->SetHealth(0);
+ m_creature->CombatStop();
+ m_creature->DeleteThreatList();
+ m_creature->RemoveCorpse();
+ }else RunAwayTimer -= diff;
+
+ return;
}
+
+ if (SayHelpTimer < diff)
+ {
+ CanSayHelp = true;
+ SayHelpTimer = 20000;
+ }else SayHelpTimer -= diff;
}
};
CreatureAI* GetAI_npc_draenei_survivor(Creature *_Creature)
@@ -288,8 +273,8 @@ struct TRINITY_DLL_DECL npc_injured_draeneiAI : public ScriptedAI
m_creature->SetHealth(int(m_creature->GetMaxHealth()*.15));
switch (rand()%2)
{
- case 0: m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 1); break;
- case 1: m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 3); break;
+ case 0: m_creature->SetStandState(UNIT_STAND_STATE_SIT); break;
+ case 1: m_creature->SetStandState(UNIT_STAND_STATE_SLEEP); break;
}
}
@@ -322,7 +307,7 @@ CreatureAI* GetAI_npc_injured_draenei(Creature *_Creature)
#define SAY_END2 -1000115
#define EMOTE_HUG -1000116
-#define QUEST_A_CRY_FOR_HELP 9528
+#define QUEST_A_CRY_FOR_SAY_HELP 9528
struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI
{
@@ -351,7 +336,7 @@ struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI
DoScriptText(EMOTE_HUG, m_creature, player);
DoScriptText(SAY_END2, m_creature, player);
if (player && player->GetTypeId() == TYPEID_PLAYER)
- ((Player*)player)->GroupEventHappens(QUEST_A_CRY_FOR_HELP,m_creature);
+ ((Player*)player)->GroupEventHappens(QUEST_A_CRY_FOR_SAY_HELP,m_creature);
break;
}
}
@@ -373,7 +358,7 @@ struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
- ((Player*)player)->FailQuest(QUEST_A_CRY_FOR_HELP);
+ ((Player*)player)->FailQuest(QUEST_A_CRY_FOR_SAY_HELP);
}
}
@@ -385,7 +370,7 @@ struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI
bool QuestAccept_npc_magwin(Player* player, Creature* creature, Quest const* quest)
{
- if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP)
+ if (quest->GetQuestId() == QUEST_A_CRY_FOR_SAY_HELP)
{
creature->setFaction(113);
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
@@ -562,7 +547,7 @@ struct TRINITY_DLL_DECL npc_geezleAI : public ScriptedAI
cell.SetNoCreate();
Trinity::AllGameObjectsWithEntryInGrid go_check(GO_NAGA_FLAG);
- Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid> go_search(FlagList, go_check);
+ Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid> go_search(m_creature, FlagList, go_check);
TypeContainerVisitor
<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid>, GridTypeMapContainer> go_visit(go_search);
CellLock<GridReadGuard> cell_lock(cell, pair);
diff --git a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp
index 83537bcf2bf..708b199d817 100644
--- a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp
+++ b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -357,7 +357,6 @@ struct TRINITY_DLL_DECL npc_twiggy_flatheadAI : public ScriptedAI
//pCreature->GetMotionMaster()->MovePoint(0, -1693, -4343, 4.32);
//pCreature->GetMotionMaster()->MovePoint(1, -1684, -4333, 2.78);
pCreature->GetMotionMaster()->MovePoint(2, -1682, -4329, 2.79);
- //pCreature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
pCreature->HandleEmoteCommand(EMOTE_STATE_READYUNARMED);
EventBigWill = true;
Wave_Timer = 1000;
diff --git a/src/bindings/scripts/scripts/zone/black_temple/black_temple.cpp b/src/bindings/scripts/scripts/zone/black_temple/black_temple.cpp
index da9b20ef63e..738c58eab2e 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/black_temple.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/black_temple.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_bloodboil.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_bloodboil.cpp
index 16fff2fac02..aab2e8f79c5 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_bloodboil.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_bloodboil.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index dba57924e56..6592e3783f4 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -137,6 +137,9 @@ EndScriptData */
#define FLAME_ENRAGE_DISTANCE 30
#define FLAME_CHARGE_DISTANCE 50
+#define ITEM_ID_MAIN_HAND 32837
+#define ITEM_ID_OFF_HAND 32838
+
/**** Creature Summon and Recognition IDs ****/
enum CreatureEntry
{
@@ -365,6 +368,10 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
pInstance = ((ScriptedInstance*)c->GetInstanceData());
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
Reset();
+
+ SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SHADOWFIEND_PASSIVE);
+ if(TempSpell)
+ TempSpell->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
}
ScriptedInstance* pInstance;
@@ -454,7 +461,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
{
GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(i));
if(Door)
- Door->SetUInt32Value(GAMEOBJECT_STATE, 0); // Open Doors
+ Door->SetGoState(0); // Open Doors
}
}
@@ -487,10 +494,10 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
{
if(spell->Id == SPELL_GLAIVE_RETURNS) // Re-equip our warblades!
{
- if(!m_creature->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY))
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479);
+ if(!m_creature->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479);
else
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
}
@@ -524,7 +531,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
if(Conversation[count].emote)
creature->HandleEmoteCommand(Conversation[count].emote); // Make the creature do some animation!
if(Conversation[count].text)
- creature->Yell(Conversation[count].text, LANG_UNIVERSAL, 0); // Have the creature yell out some text
+ creature->MonsterYell(Conversation[count].text, LANG_UNIVERSAL, 0); // Have the creature yell out some text
if(Conversation[count].sound)
DoPlaySoundToSet(creature, Conversation[count].sound); // Play some sound on the creature
}
@@ -567,8 +574,8 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
Timer[EVENT_FLIGHT_SEQUENCE] = 700;
break;
case 4://throw another
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
{
uint8 i=0;
Creature* Glaive = m_creature->SummonCreature(BLADE_OF_AZZINOTH, GlaivePosition[i].x, GlaivePosition[i].y, GlaivePosition[i].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
@@ -653,14 +660,14 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
if(DemonTransformation[TransformCount].equip)
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); // Requip warglaives if needed
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479); // Requip warglaives if needed
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
else
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); // Unequip warglaives if needed
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+0, 0); // Unequip warglaives if needed
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
}
switch(TransformCount)
@@ -999,10 +1006,10 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
DoorGUID[1] = pInstance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_L);
if(GETGO(Gate, GateGUID))
- Gate->SetUInt32Value(GAMEOBJECT_STATE, 1);
+ Gate->SetGoState(1);
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetUInt32Value(GAMEOBJECT_STATE, 1);
+ Door->SetGoState(1);
}
else
{
@@ -1072,7 +1079,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetUInt32Value(GAMEOBJECT_STATE, 1);
+ Door->SetGoState(1);
if(GETCRE(Illidan, IllidanGUID))
{
@@ -1187,7 +1194,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
if(GETCRE(Illidan, IllidanGUID))
{
((boss_illidan_stormrageAI*)Illidan->AI())->Timer[EVENT_TAUNT] += 30000;
- Illidan->Yell(SAY_AKAMA_MINION, LANG_UNIVERSAL, 0);
+ Illidan->MonsterYell(SAY_AKAMA_MINION, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(Illidan, SOUND_AKAMA_MINION);
}
Timer = 8000;
@@ -1238,7 +1245,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
Spirit[0]->InterruptNonMeleeSpells(true);
Spirit[1]->InterruptNonMeleeSpells(true);
if(GETGO(Gate, GateGUID))
- Gate->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ Gate->SetGoState(0);
Timer = 2000;
break;
case 4:
@@ -1269,7 +1276,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
case 6:
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ Door->SetGoState(0);
break;
case 8:
if(Phase == PHASE_WALK)
@@ -1379,9 +1386,9 @@ struct TRINITY_DLL_DECL boss_maievAI : public ScriptedAI
Timer[EVENT_MAIEV_STEALTH] = 0;
Timer[EVENT_MAIEV_TAUNT] = 22000 + rand()%21 * 1000;
Timer[EVENT_MAIEV_SHADOW_STRIKE] = 30000;
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 44850);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 2, 45738);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 44850);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, 45738);
}
void Aggro(Unit *who) {}
@@ -1658,7 +1665,7 @@ bool GOHello_cage_trap(Player* plr, GameObject* go)
// Grid search for nearest live creature of entry 23304 within 10 yards
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck check(*plr, 23304, true, 10);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(trigger, check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(plr, trigger, check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> cSearcher(searcher);
@@ -1666,7 +1673,7 @@ bool GOHello_cage_trap(Player* plr, GameObject* go)
cell_lock->Visit(cell_lock, cSearcher, *(plr->GetMap()));
((cage_trap_triggerAI*)trigger->AI())->Active = true;
- go->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ go->SetGoState(0);
return true;
}
@@ -1785,7 +1792,7 @@ struct TRINITY_DLL_DECL blade_of_azzinothAI : public NullCreatureAI
void SpellHit(Unit *caster, const SpellEntry *spell)
{
if(spell->Id == SPELL_THROW_GLAIVE2 || spell->Id == SPELL_THROW_GLAIVE)
- me->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21431);//appear when hit by Illidan's glaive
+ m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21431);//appear when hit by Illidan's glaive
}
};
@@ -1830,8 +1837,8 @@ void boss_illidan_stormrageAI::Reset()
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->setActive(false);
Summons.DespawnAll();
@@ -1888,8 +1895,8 @@ void boss_illidan_stormrageAI::HandleTalkSequence()
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
break;
case 8:
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); // Equip our warglaives!
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479); // Equip our warglaives!
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
@@ -1949,7 +1956,7 @@ void boss_illidan_stormrageAI::HandleTalkSequence()
{
Maiev->CastSpell(Maiev, SPELL_TELEPORT_VISUAL, true);
Maiev->setDeathState(JUST_DIED);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,UNIT_STAND_STATE_DEAD);
}
break;
case 21: // Kill ourself.
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_mother_shahraz.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_mother_shahraz.cpp
index 705e7ed8842..3e6598ae374 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_mother_shahraz.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_mother_shahraz.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp
index 777d5fdcd76..a5fcea2923a 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
index 6a4d18c727d..d68b51e461f 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -346,7 +346,7 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
std::list<Creature*> ChannelerList;
Trinity::AllCreaturesOfEntryInRange check(m_creature, CREATURE_CHANNELER, 50);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(ChannelerList, check);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_creature, ChannelerList, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> visitor(searcher);
CellLock<GridReadGuard> cell_lock(cell, pair);
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_teron_gorefiend.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_teron_gorefiend.cpp
index 36554a7c2ee..778874c9078 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_teron_gorefiend.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_teron_gorefiend.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
index d8e4f5c7a8a..1c2952e6791 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -155,7 +155,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 80, true);
for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
m_creature->CastSpell(*i, 39835, true);
- NeedleSpineTimer = 20000+rand()%5000;
+ NeedleSpineTimer = 2000+rand()%1000;
}else NeedleSpineTimer -= diff;
if(SpecialYellTimer < diff)
@@ -200,7 +200,7 @@ bool GOHello_go_najentus_spine(Player *player, GameObject* _GO)
{
player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
_GO->SetLootState(GO_NOT_READY);
- _GO->SetRespawnTime(0);
+ _GO->Delete();
}
return true;
}
diff --git a/src/bindings/scripts/scripts/zone/black_temple/def_black_temple.h b/src/bindings/scripts/scripts/zone/black_temple/def_black_temple.h
index 0d5bb184792..4779f92fa4d 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/def_black_temple.h
+++ b/src/bindings/scripts/scripts/zone/black_temple/def_black_temple.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/black_temple/illidari_council.cpp b/src/bindings/scripts/scripts/zone/black_temple/illidari_council.cpp
index 92a7e42473c..21104389edf 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/illidari_council.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/illidari_council.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
index a5db59abb52..56bef01ae14 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -42,6 +42,9 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
{
instance_black_temple(Map *map) : ScriptedInstance(map) {Initialize();};
+ uint32 Encounters[ENCOUNTERS];
+ std::string str_data;
+
uint64 Najentus;
uint64 Akama; // This is the Akama that starts the Illidan encounter.
uint64 Akama_Shade; // This is the Akama that starts the Shade of Akama encounter.
@@ -68,9 +71,6 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
uint64 IllidanGate;
uint64 IllidanDoor[2];
- uint32 Encounters[ENCOUNTERS];
- std::string str_data;
-
void Initialize()
{
Najentus = 0;
@@ -145,7 +145,7 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 22887: Najentus = creature->GetGUID(); break;
case 23089: Akama = creature->GetGUID(); break;
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/blackrock_depths.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/blackrock_depths.cpp
index 92031355a12..7941a93840d 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/blackrock_depths.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/blackrock_depths.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp
index 8c1b1748adf..8ac58521395 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_anubshiah.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_anubshiah.cpp
index c6b4931e0b1..9df9b7039e6 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_anubshiah.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_anubshiah.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp
index f6a755bfee3..4d7130dc3d0 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,12 +23,12 @@ EndScriptData */
#include "precompiled.h"
+#define SAY_AGGRO -1230001
+#define SAY_SLAY -1230002
+
#define SPELL_HANDOFTHAURISSAN 17492
#define SPELL_AVATAROFFLAME 15636
-#define SAY_AGGRO "Come to aid the Throne!"
-#define SAY_SLAY "Hail to the king, baby!"
-
struct TRINITY_DLL_DECL boss_draganthaurissanAI : public ScriptedAI
{
boss_draganthaurissanAI(Creature *c) : ScriptedAI(c) {Reset();}
@@ -46,12 +46,12 @@ struct TRINITY_DLL_DECL boss_draganthaurissanAI : public ScriptedAI
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
+ DoScriptText(SAY_AGGRO, m_creature);
}
void KilledUnit(Unit* victim)
{
- DoYell(SAY_SLAY, LANG_UNIVERSAL, NULL);
+ DoScriptText(SAY_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -62,9 +62,8 @@ struct TRINITY_DLL_DECL boss_draganthaurissanAI : public ScriptedAI
if (HandOfThaurissan_Timer < diff)
{
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM,0);
- if (target) DoCast(target,SPELL_HANDOFTHAURISSAN);
+ if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
+ DoCast(target,SPELL_HANDOFTHAURISSAN);
//3 Hands of Thaurissan will be casted
//if (Counter < 3)
@@ -89,6 +88,7 @@ struct TRINITY_DLL_DECL boss_draganthaurissanAI : public ScriptedAI
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_boss_draganthaurissan(Creature *_Creature)
{
return new boss_draganthaurissanAI (_Creature);
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_general_angerforge.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_general_angerforge.cpp
index 7ef0d5d532b..192cd18fbfa 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_general_angerforge.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_general_angerforge.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp
index bb67b572316..b2241df6e9d 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_grizzle.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_grizzle.cpp
index 24ba7183d59..bd9b200ea69 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_grizzle.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_grizzle.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -23,6 +23,8 @@ EndScriptData */
#include "precompiled.h"
+#define EMOTE_GENERIC_FRENZY_KILL -1000001
+
#define SPELL_GROUNDTREMOR 6524
#define SPELL_FRENZY 28371
@@ -62,7 +64,7 @@ struct TRINITY_DLL_DECL boss_grizzleAI : public ScriptedAI
if (Frenzy_Timer < diff)
{
DoCast(m_creature,SPELL_FRENZY);
- DoTextEmote("goes into a killing frenzy!",NULL);
+ DoScriptText(EMOTE_GENERIC_FRENZY_KILL, m_creature);
Frenzy_Timer = 15000;
}else Frenzy_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp
index 77d1093e234..65e4f6a0cf7 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_magmus.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_magmus.cpp
index 4b89c34ddb7..722f3f02e04 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_magmus.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_magmus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_moira_bronzebeard.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_moira_bronzebeard.cpp
index 7184706eb18..2f562123068 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/boss_moira_bronzebeard.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/boss_moira_bronzebeard.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
index 2d5615779a7..e056f732158 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_drakkisath.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_drakkisath.cpp
index c2bcac760a3..9a909141eec 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_drakkisath.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_drakkisath.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_gyth.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_gyth.cpp
index 6f0172d06a3..77725fb81d2 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_gyth.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_gyth.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_halycon.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_halycon.cpp
index 40bd0fb52ec..437d85d6405 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_halycon.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_halycon.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_highlord_omokk.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_highlord_omokk.cpp
index ce8d7dc16e4..20a37278863 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_highlord_omokk.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_highlord_omokk.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp
index 63fb0e5d6e6..db30e876ec3 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp
index 08e832052f7..c8ba7a91e8e 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp
index 10252a3c5cf..f54494d80d1 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_quartermaster_zigris.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_quartermaster_zigris.cpp
index 849d47ed7fb..b0977de9696 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_quartermaster_zigris.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_quartermaster_zigris.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_rend_blackhand.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_rend_blackhand.cpp
index a0af3dd2b64..46ed8545fad 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_rend_blackhand.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_rend_blackhand.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp
index e746f8eddea..0d41ca5227f 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_the_beast.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_the_beast.cpp
index ea9c90c5b6c..855b3539dd2 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_the_beast.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_the_beast.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_warmaster_voone.cpp b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_warmaster_voone.cpp
index f257eb63119..e59cecea060 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_spire/boss_warmaster_voone.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_spire/boss_warmaster_voone.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp
index 858fa96d3cb..71fb5e9a022 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_chromaggus.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_chromaggus.cpp
index 8e89a3aeed4..6d73fdf93e9 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_chromaggus.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_chromaggus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_ebonroc.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_ebonroc.cpp
index 6574cc8a97b..981bd74d02c 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_ebonroc.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_ebonroc.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_firemaw.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_firemaw.cpp
index edc2650fa2f..a2613feff20 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_firemaw.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_firemaw.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_flamegor.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_flamegor.cpp
index 9339f604f02..9c2b5f28387 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_flamegor.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_flamegor.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_nefarian.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_nefarian.cpp
index 3bbb33cfde0..548baf49ca3 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_nefarian.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_nefarian.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_razorgore.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_razorgore.cpp
index 701c9b5aacf..479e81d1d87 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_razorgore.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_razorgore.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp
index db7f46ad9e2..46ee49fb1be 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp
index e969898884e..b0b8135396e 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/boss_victor_nefarius.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blackwing_lair/instance_blackwing_lair.cpp b/src/bindings/scripts/scripts/zone/blackwing_lair/instance_blackwing_lair.cpp
index ddd9e8b9aa3..97bf717589a 100644
--- a/src/bindings/scripts/scripts/zone/blackwing_lair/instance_blackwing_lair.cpp
+++ b/src/bindings/scripts/scripts/zone/blackwing_lair/instance_blackwing_lair.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp b/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp
index da4eb5cf262..b2cec0bda09 100644
--- a/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp
+++ b/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Blades_Edge_Mountains
SD%Complete: 90
-SDComment: Quest support: 10503, 10504, 10556, 10609, 10682, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
+SDComment: Quest support: 10503, 10504, 10556, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
SDCategory: Blade's Edge Mountains
EndScriptData */
@@ -28,10 +28,20 @@ npc_daranelle
npc_overseer_nuaar
npc_saikkal_the_elder
npc_skyguard_handler_irena
+go_legion_obelisk
EndContentData */
#include "precompiled.h"
+//Support for quest: You're Fired! (10821)
+bool obelisk_one, obelisk_two, obelisk_three, obelisk_four, obelisk_five;
+
+#define LEGION_OBELISK_ONE 185193
+#define LEGION_OBELISK_TWO 185195
+#define LEGION_OBELISK_THREE 185196
+#define LEGION_OBELISK_FOUR 185197
+#define LEGION_OBELISK_FIVE 185198
+
/*######
## mobs_bladespire_ogre
######*/
@@ -96,14 +106,9 @@ struct TRINITY_DLL_DECL mobs_nether_drakeAI : public ScriptedAI
void Reset()
{
- NihilSpeech_Timer = 2000;
IsNihil = false;
- if( m_creature->GetEntry() == ENTRY_NIHIL )
- {
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- IsNihil = true;
- }
- NihilSpeech_Phase = 1;
+ NihilSpeech_Timer = 3000;
+ NihilSpeech_Phase = 0;
ArcaneBlast_Timer = 7500;
ManaBurn_Timer = 10000;
@@ -112,138 +117,115 @@ struct TRINITY_DLL_DECL mobs_nether_drakeAI : public ScriptedAI
void Aggro(Unit* who) { }
+ void MoveInLineOfSight(Unit *who)
+ {
+ if (m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ ScriptedAI::MoveInLineOfSight(who);
+ }
+
+ //in case creature was not summoned (not expected)
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (id == 0)
+ {
+ m_creature->setDeathState(JUST_DIED);
+ m_creature->RemoveCorpse();
+ m_creature->SetHealth(0);
+ }
+ }
+
void SpellHit(Unit *caster, const SpellEntry *spell)
{
- if( spell->Id == SPELL_T_PHASE_MODULATOR && caster->GetTypeId() == TYPEID_PLAYER )
+ if (spell->Id == SPELL_T_PHASE_MODULATOR && caster->GetTypeId() == TYPEID_PLAYER)
{
- uint32 cEntry = 0;
+ const uint32 entry_list[4] = {ENTRY_PROTO, ENTRY_ADOLE, ENTRY_MATUR, ENTRY_NIHIL};
+ int cid = rand()%(4-1);
+
+ if (entry_list[cid] == m_creature->GetEntry())
+ ++cid;
- switch( m_creature->GetEntry() )
+ //we are nihil, so say before transform
+ if (m_creature->GetEntry() == ENTRY_NIHIL)
{
- case ENTRY_WHELP:
- switch(rand()%4)
- {
- case 0: cEntry = ENTRY_PROTO; break;
- case 1: cEntry = ENTRY_ADOLE; break;
- case 2: cEntry = ENTRY_MATUR; break;
- case 3: cEntry = ENTRY_NIHIL; break;
- }
- break;
- case ENTRY_PROTO:
- switch(rand()%3)
- {
- case 0: cEntry = ENTRY_ADOLE; break;
- case 1: cEntry = ENTRY_MATUR; break;
- case 2: cEntry = ENTRY_NIHIL; break;
- }
- break;
- case ENTRY_ADOLE:
- switch(rand()%3)
- {
- case 0: cEntry = ENTRY_PROTO; break;
- case 1: cEntry = ENTRY_MATUR; break;
- case 2: cEntry = ENTRY_NIHIL; break;
- }
- break;
- case ENTRY_MATUR:
- switch(rand()%3)
- {
- case 0: cEntry = ENTRY_PROTO; break;
- case 1: cEntry = ENTRY_ADOLE; break;
- case 2: cEntry = ENTRY_NIHIL; break;
- }
- break;
- case ENTRY_NIHIL:
- if( NihilSpeech_Phase )
- {
- DoScriptText(SAY_NIHIL_INTERRUPT, m_creature);
- IsNihil = false;
- switch(rand()%3)
- {
- case 0: cEntry = ENTRY_PROTO; break;
- case 1: cEntry = ENTRY_ADOLE; break;
- case 2: cEntry = ENTRY_MATUR; break;
- }
- }
- break;
+ DoScriptText(SAY_NIHIL_INTERRUPT, m_creature);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ IsNihil = false;
}
- if( cEntry )
+ if (m_creature->UpdateEntry(entry_list[cid]))
{
- m_creature->UpdateEntry(cEntry);
-
- if( cEntry == ENTRY_NIHIL )
+ if (entry_list[cid] == ENTRY_NIHIL)
{
- m_creature->InterruptNonMeleeSpells(true);
- m_creature->RemoveAllAuras();
- m_creature->DeleteThreatList();
- m_creature->CombatStop();
- InCombat = false;
- Reset();
- }
+ EnterEvadeMode();
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ IsNihil = true;
+ }else
+ AttackStart(caster);
}
}
}
void UpdateAI(const uint32 diff)
{
- if( IsNihil )
+ if (IsNihil)
{
- if( NihilSpeech_Phase )
+ if (NihilSpeech_Timer <= diff)
{
- if(NihilSpeech_Timer <= diff)
+ switch(NihilSpeech_Phase)
{
- switch( NihilSpeech_Phase )
- {
- case 1:
- DoScriptText(SAY_NIHIL_1, m_creature);
- ++NihilSpeech_Phase;
- break;
- case 2:
- DoScriptText(SAY_NIHIL_2, m_creature);
- ++NihilSpeech_Phase;
- break;
- case 3:
- DoScriptText(SAY_NIHIL_3, m_creature);
- ++NihilSpeech_Phase;
- break;
- case 4:
- DoScriptText(SAY_NIHIL_4, m_creature);
- ++NihilSpeech_Phase;
- break;
- case 5:
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- // + MOVEMENTFLAG_LEVITATING
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
- //then take off to random location. creature is initially summoned, so don't bother do anything else.
- m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+100, m_creature->GetPositionY(), m_creature->GetPositionZ()+100);
- NihilSpeech_Phase = 0;
- break;
- }
- NihilSpeech_Timer = 5000;
- }else NihilSpeech_Timer -=diff;
- }
- return; //anything below here is not interesting for Nihil, so skip it
+ case 0:
+ DoScriptText(SAY_NIHIL_1, m_creature);
+ ++NihilSpeech_Phase;
+ break;
+ case 1:
+ DoScriptText(SAY_NIHIL_2, m_creature);
+ ++NihilSpeech_Phase;
+ break;
+ case 2:
+ DoScriptText(SAY_NIHIL_3, m_creature);
+ ++NihilSpeech_Phase;
+ break;
+ case 3:
+ DoScriptText(SAY_NIHIL_4, m_creature);
+ ++NihilSpeech_Phase;
+ break;
+ case 4:
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ //take off to location above
+ m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+50.0f, m_creature->GetPositionY(), m_creature->GetPositionZ()+50.0f);
+ ++NihilSpeech_Phase;
+ break;
+ }
+ NihilSpeech_Timer = 5000;
+ }else NihilSpeech_Timer -=diff;
+
+ //anything below here is not interesting for Nihil, so skip it
+ return;
}
- if( !UpdateVictim() )
+ if (!UpdateVictim() )
return;
- if( IntangiblePresence_Timer <= diff )
+ if (IntangiblePresence_Timer <= diff)
{
DoCast(m_creature->getVictim(),SPELL_INTANGIBLE_PRESENCE);
IntangiblePresence_Timer = 15000+rand()%15000;
}else IntangiblePresence_Timer -= diff;
- if( ManaBurn_Timer <= diff )
+ if (ManaBurn_Timer <= diff)
{
Unit* target = m_creature->getVictim();
- if( target && target->getPowerType() == POWER_MANA )
+ if (target && target->getPowerType() == POWER_MANA)
DoCast(target,SPELL_MANA_BURN);
ManaBurn_Timer = 8000+rand()%8000;
}else ManaBurn_Timer -= diff;
- if( ArcaneBlast_Timer <= diff )
+ if (ArcaneBlast_Timer <= diff)
{
DoCast(m_creature->getVictim(),SPELL_ARCANE_BLAST);
ArcaneBlast_Timer = 2500+rand()%5000;
@@ -252,6 +234,7 @@ struct TRINITY_DLL_DECL mobs_nether_drakeAI : public ScriptedAI
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_mobs_nether_drake(Creature *_Creature)
{
return new mobs_nether_drakeAI (_Creature);
@@ -261,27 +244,23 @@ CreatureAI* GetAI_mobs_nether_drake(Creature *_Creature)
## npc_daranelle
######*/
-#define SAY_DARANELLE -1000401
+#define SAY_SPELL_INFLUENCE -1000174
struct TRINITY_DLL_DECL npc_daranelleAI : public ScriptedAI
{
npc_daranelleAI(Creature *c) : ScriptedAI(c) {Reset();}
- void Reset()
- {
- }
+ void Reset() { }
- void Aggro(Unit* who)
- {
- }
+ void Aggro(Unit* who) { }
void MoveInLineOfSight(Unit *who)
{
if (who->GetTypeId() == TYPEID_PLAYER)
{
- if(who->HasAura(36904,0))
+ if (who->HasAura(36904,0) && m_creature->IsWithinDistInMap(who, 10.0f))
{
- DoScriptText(SAY_DARANELLE, m_creature, who);
+ DoScriptText(SAY_SPELL_INFLUENCE, m_creature, who);
//TODO: Move the below to updateAI and run if this statement == true
((Player*)who)->KilledMonster(21511, m_creature->GetGUID());
((Player*)who)->RemoveAurasDueToSpell(36904);
@@ -301,12 +280,10 @@ CreatureAI* GetAI_npc_daranelle(Creature *_Creature)
## npc_overseer_nuaar
######*/
-#define GOSSIP_HON "Overseer, I am here to negotiate on behalf of the Cenarion Expedition."
-
bool GossipHello_npc_overseer_nuaar(Player *player, Creature *_Creature)
{
if (player->GetQuestStatus(10682) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM( 0, GOSSIP_HON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ player->ADD_GOSSIP_ITEM( 0, "Overseer, I am here to negotiate on behalf of the Cenarion Expedition.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(10532, _Creature->GetGUID());
@@ -327,13 +304,10 @@ bool GossipSelect_npc_overseer_nuaar(Player *player, Creature *_Creature, uint32
## npc_saikkal_the_elder
######*/
-#define GOSSIP_HSTE "Yes... yes, it's me."
-#define GOSSIP_SSTE "Yes elder. Tell me more of the book."
-
bool GossipHello_npc_saikkal_the_elder(Player *player, Creature *_Creature)
{
if (player->GetQuestStatus(10980) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM( 0, GOSSIP_HSTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ player->ADD_GOSSIP_ITEM( 0, "Yes... yes, it's me.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(10794, _Creature->GetGUID());
@@ -345,7 +319,7 @@ bool GossipSelect_npc_saikkal_the_elder(Player *player, Creature *_Creature, uin
switch (action)
{
case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM( 0, GOSSIP_SSTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
+ player->ADD_GOSSIP_ITEM( 0, "Yes elder. Tell me more of the book.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
player->SEND_GOSSIP_MENU(10795, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
@@ -380,18 +354,54 @@ bool GossipSelect_npc_skyguard_handler_irena(Player *player, Creature *_Creature
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
player->CLOSE_GOSSIP_MENU();
-
- std::vector<uint32> nodes;
-
- nodes.resize(2);
- nodes[0] = 172; //from ogri'la
- nodes[1] = 171; //end at skettis
- player->ActivateTaxiPathTo(nodes); //TaxiPath 706
+ player->CastSpell(player,41278,true); //TaxiPath 706
}
return true;
}
/*######
+## go_legion_obelisk
+######*/
+
+bool GOHello_go_legion_obelisk(Player *player, GameObject* _GO)
+{
+ if ( player->GetQuestStatus(10821) == QUEST_STATUS_INCOMPLETE )
+ {
+ switch( _GO->GetEntry() )
+ {
+ case LEGION_OBELISK_ONE:
+ obelisk_one = true;
+ break;
+ case LEGION_OBELISK_TWO:
+ obelisk_two = true;
+ break;
+ case LEGION_OBELISK_THREE:
+ obelisk_three = true;
+ break;
+ case LEGION_OBELISK_FOUR:
+ obelisk_four = true;
+ break;
+ case LEGION_OBELISK_FIVE:
+ obelisk_five = true;
+ break;
+ }
+
+ if ( obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true )
+ {
+ _GO->SummonCreature(19963,2943.40f,4778.20f,284.49f,0.94f,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,120000);
+ //reset global var
+ obelisk_one = false;
+ obelisk_two = false;
+ obelisk_three = false;
+ obelisk_four = false;
+ obelisk_five = false;
+ }
+ }
+
+ return true;
+}
+
+/*######
## AddSC
######*/
@@ -425,6 +435,11 @@ void AddSC_blades_edge_mountains()
newscript->pGossipHello = &GossipHello_npc_saikkal_the_elder;
newscript->pGossipSelect = &GossipSelect_npc_saikkal_the_elder;
newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="go_legion_obelisk";
+ newscript->pGOHello = &GOHello_go_legion_obelisk;
+ newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_skyguard_handler_irena";
diff --git a/src/bindings/scripts/scripts/zone/blasted_lands/blasted_lands.cpp b/src/bindings/scripts/scripts/zone/blasted_lands/blasted_lands.cpp
index 954792a1044..432633e90fe 100644
--- a/src/bindings/scripts/scripts/zone/blasted_lands/blasted_lands.cpp
+++ b/src/bindings/scripts/scripts/zone/blasted_lands/blasted_lands.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/blasted_lands/boss_kruul.cpp b/src/bindings/scripts/scripts/zone/blasted_lands/boss_kruul.cpp
index 6627ee05fd5..ae21c17b526 100644
--- a/src/bindings/scripts/scripts/zone/blasted_lands/boss_kruul.cpp
+++ b/src/bindings/scripts/scripts/zone/blasted_lands/boss_kruul.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp b/src/bindings/scripts/scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp
index a7db97a394a..2d13e3168a8 100644
--- a/src/bindings/scripts/scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp
+++ b/src/bindings/scripts/scripts/zone/bloodmyst_isle/bloodmyst_isle.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/borean_tundra/borean_tundra.cpp b/src/bindings/scripts/scripts/zone/borean_tundra/borean_tundra.cpp
new file mode 100644
index 00000000000..c776c1f9271
--- /dev/null
+++ b/src/bindings/scripts/scripts/zone/borean_tundra/borean_tundra.cpp
@@ -0,0 +1,105 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Borean_Tundra
+SD%Complete: 100
+SDComment:
+SDCategory: Borean Tundra
+EndScriptData */
+
+/* ContentData
+npc_tiare
+npc_surristrasz
+EndContentData */
+
+#include "precompiled.h"
+
+/*######
+## npc_tiare
+######*/
+
+#define GOSSIP_ITEM_TELEPORT "Teleport me to Amber Ledge, please."
+
+bool GossipHello_npc_tiare(Player *player, Creature *_Creature)
+{
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_TELEPORT, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_GOSSIP);
+ player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
+ return true;
+}
+
+bool GossipSelect_npc_tiare(Player *player, Creature *_Creature, uint32 sender, uint32 action)
+{
+ if (action == GOSSIP_OPTION_GOSSIP)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ player->CastSpell(player,50135,true);
+ }
+ return true;
+}
+
+/*######
+## npc_surristrasz
+######*/
+
+#define GOSSIP_ITEM_FREE_FLIGHT "I'd like passage to the Transitus Shield."
+#define GOSSIP_ITEM_FLIGHT "May I use a drake to fly elsewhere?"
+
+bool GossipHello_npc_surristrasz(Player *player, Creature *_Creature)
+{
+ if (_Creature->isQuestGiver())
+ player->PrepareQuestMenu(_Creature->GetGUID());
+
+ if (_Creature->isTaxi())
+ {
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_FREE_FLIGHT, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_GOSSIP);
+ player->ADD_GOSSIP_ITEM(2, GOSSIP_ITEM_FLIGHT, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_TAXIVENDOR);
+ }
+
+ player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
+ return true;
+}
+
+bool GossipSelect_npc_surristrasz(Player *player, Creature *_Creature, uint32 sender, uint32 action)
+{
+ if (action == GOSSIP_OPTION_GOSSIP)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ player->CastSpell(player,46064,true); //TaxiPath 795 (amber to coldarra)
+ }
+ if (action == GOSSIP_OPTION_TAXIVENDOR)
+ {
+ player->GetSession()->SendTaxiMenu(_Creature);
+ }
+ return true;
+}
+
+void AddSC_borean_tundra()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "npc_tiare";
+ newscript->pGossipHello = &GossipHello_npc_tiare;
+ newscript->pGossipSelect = &GossipSelect_npc_tiare;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "npc_surristrasz";
+ newscript->pGossipHello = &GossipHello_npc_surristrasz;
+ newscript->pGossipSelect = &GossipSelect_npc_surristrasz;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp b/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp
index a512a1f190c..59fbfae60d8 100644
--- a/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp
+++ b/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp
index 7bd5575fe56..6599eab6a4e 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp
index c689c77bc97..636c4a5270e 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp
index 6f5f6962e64..ed84d5548c7 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/dark_portal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/dark_portal.cpp
index 57511f891c2..8407b5c258b 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/dark_portal.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/dark_portal.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -93,7 +93,7 @@ struct TRINITY_DLL_DECL npc_medivh_bmAI : public ScriptedAI
if (who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(who, 10.0f))
{
- if (pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
+ if (pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS || pInstance->GetData(TYPE_MEDIVH) == DONE)
return;
DoScriptText(SAY_INTRO, m_creature);
@@ -157,7 +157,7 @@ struct TRINITY_DLL_DECL npc_medivh_bmAI : public ScriptedAI
if (SpellCorrupt_Timer)
{
- if (SpellCorrupt_Timer < diff)
+ if (SpellCorrupt_Timer <= diff)
{
pInstance->SetData(TYPE_MEDIVH,SPECIAL);
@@ -172,7 +172,7 @@ struct TRINITY_DLL_DECL npc_medivh_bmAI : public ScriptedAI
if (Check_Timer)
{
- if (Check_Timer < diff)
+ if (Check_Timer <= diff)
{
uint32 pct = pInstance->GetData(DATA_SHIELD);
@@ -182,7 +182,6 @@ struct TRINITY_DLL_DECL npc_medivh_bmAI : public ScriptedAI
{
DoScriptText(SAY_WEAK25, m_creature);
Life25 = false;
- Check_Timer = 0;
}
else if (Life50 && pct <= 50)
{
@@ -204,11 +203,16 @@ struct TRINITY_DLL_DECL npc_medivh_bmAI : public ScriptedAI
return;
}
- if (pInstance->GetData(TYPE_MEDIVH) == DONE)
+ if (pInstance->GetData(TYPE_RIFT) == DONE)
{
DoScriptText(SAY_WIN, m_creature);
Check_Timer = 0;
+
+ if (m_creature->HasAura(SPELL_CHANNEL,0))
+ m_creature->RemoveAura(SPELL_CHANNEL,0);
+
//TODO: start the post-event here
+ pInstance->SetData(TYPE_MEDIVH,DONE);
}
}else Check_Timer -= diff;
}
@@ -336,7 +340,8 @@ struct TRINITY_DLL_DECL npc_time_riftAI : public ScriptedAI
debug_log("SD2: npc_time_rift: not casting anylonger, i need to die.");
m_creature->setDeathState(JUST_DIED);
- pInstance->SetData(TYPE_RIFT,SPECIAL);
+ if (pInstance->GetData(TYPE_RIFT) == IN_PROGRESS)
+ pInstance->SetData(TYPE_RIFT,SPECIAL);
}
};
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h
index 61018f58118..7bfd8c917d7 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/def_dark_portal.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp
index 39445fe727c..697134cd82d 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/instance_dark_portal.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -108,7 +108,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
}
}
- debug_log("SD2: Instance Black Portal: GetPlayerInMap, but PlayerList is empty!");
+ debug_log("TSCR: Instance Black Portal: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
@@ -123,7 +123,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
if (Player* player = itr->getSource())
player->SendUpdateWorldState(id,state);
}
- }else debug_log("SD2: Instance Black Portal: UpdateBMWorldState, but PlayerList is empty!");
+ }else debug_log("TSCR: Instance Black Portal: UpdateBMWorldState, but PlayerList is empty!");
}
void InitWorldState(bool Enable = true)
@@ -187,7 +187,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
if (!player)
{
- debug_log("SD2: Instance Black Portal: SetData (Type: %u Data %u) cannot find any player.", type, data);
+ debug_log("TSCR: Instance Black Portal: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
@@ -216,7 +216,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
{
if (data == IN_PROGRESS)
{
- debug_log("SD2: Instance Dark Portal: Starting event.");
+ debug_log("TSCR: Instance Dark Portal: Starting event.");
InitWorldState();
Encounter[1] = IN_PROGRESS;
NextPortal_Timer = 15000;
@@ -227,6 +227,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
//this may be completed further out in the post-event
if (Unit *medivh = Unit::GetUnit(*player,MedivhGUID))
{
+ debug_log("TSCR: Instance Dark Portal: Event completed.");
player->GroupEventHappens(QUEST_OPENING_PORTAL,medivh);
player->GroupEventHappens(QUEST_MASTER_TOUCH,medivh);
}
@@ -282,7 +283,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
//normalize Z-level if we can, if rift is not at ground level.
z = std::max(instance->GetHeight(x, y, MAX_HEIGHT), instance->GetWaterLevel(x, y));
- debug_log("SD2: Instance Dark Portal: Summoning rift boss entry %u.",entry);
+ debug_log("TSCR: Instance Dark Portal: Summoning rift boss entry %u.",entry);
Unit *Summon = source->SummonCreature(entry,x,y,z,source->GetOrientation(),
TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000);
@@ -290,7 +291,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
if (Summon)
return Summon;
- debug_log("SD2: Instance Dark Portal: what just happened there? No boss, no loot, no fun...");
+ debug_log("TSCR: Instance Dark Portal: what just happened there? No boss, no loot, no fun...");
return NULL;
}
@@ -302,12 +303,11 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
if (Unit *medivh = Unit::GetUnit(*player,MedivhGUID))
{
- for(uint8 i = 0; i < 4; i++)
- {
- int tmp = rand()%4;
- if (tmp != CurrentRiftId)
- {
- debug_log("SD2: Instance Dark Portal: Creating Time Rift at locationId %i (old locationId was %u).",tmp,CurrentRiftId);
+ int tmp = rand()%(4-1);
+
+ if (tmp >= CurrentRiftId)
+ tmp++;
+ debug_log("TSCR: Instance Dark Portal: Creating Time Rift at locationId %i (old locationId was %u).",tmp,CurrentRiftId);
CurrentRiftId = tmp;
@@ -334,9 +334,6 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
}
}
}
- break;
- }
- }
}
}
@@ -354,7 +351,7 @@ struct TRINITY_DLL_DECL instance_dark_portal : public ScriptedInstance
if (NextPortal_Timer)
{
- if (NextPortal_Timer < diff)
+ if (NextPortal_Timer <= diff)
{
++mRiftPortalCount;
UpdateBMWorldState(WORLD_STATE_BM_RIFT,mRiftPortalCount);
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_archimonde.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_archimonde.cpp
index ef709977da0..217a1002e5d 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_archimonde.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_archimonde.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,12 +6,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
@@ -39,9 +39,9 @@ EndScriptData */
#define SAY_SOUL_CHARGE1 -1534029
#define SAY_SOUL_CHARGE2 -1534030
-#define SPELL_DENOUEMENT_WISP 32124
-#define SPELL_ANCIENT_SPARK 39349
-#define SPELL_PROTECTION_OF_ELUNE 38528
+#define SPELL_DENOUEMENT_WISP 32124
+#define SPELL_ANCIENT_SPARK 39349
+#define SPELL_PROTECTION_OF_ELUNE 38528
#define SPELL_DRAIN_WORLD_TREE 39140
#define SPELL_DRAIN_WORLD_TREE_2 39141
@@ -52,8 +52,7 @@ EndScriptData */
#define SPELL_GRIP_OF_THE_LEGION 31972
#define SPELL_DOOMFIRE_STRIKE 31903 //summons two creatures
#define SPELL_DOOMFIRE_SPAWN 32074
-#define SPELL_DOOMFIRE_VISUAL 42344 // This is actually a Zul'Aman spell, but the proper Doomfire spell sometimes freezes the server if a player stands in it for too long
-#define SPELL_DOOMFIRE_DAMAGE 31944
+#define SPELL_DOOMFIRE 31945
#define SPELL_SOUL_CHARGE_YELLOW 32045
#define SPELL_SOUL_CHARGE_GREEN 32051
#define SPELL_SOUL_CHARGE_RED 32052
@@ -64,7 +63,7 @@ EndScriptData */
#define CREATURE_ARCHIMONDE 17968
#define CREATURE_DOOMFIRE 18095
-#define CREATURE_DOOMFIRE_TARGETING 18104
+#define CREATURE_DOOMFIRE_SPIRIT 18104
#define CREATURE_ANCIENT_WISP 17946
#define CREATURE_CHANNEL_TARGET 22418
@@ -98,20 +97,20 @@ struct mob_ancient_wispAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
- if(!ArchimondeGUID)
+ if (!ArchimondeGUID)
{
- if(pInstance)
+ if (pInstance)
ArchimondeGUID = pInstance->GetData64(DATA_ARCHIMONDE);
}
- if(CheckTimer < diff)
+ if (CheckTimer < diff)
{
- if(ArchimondeGUID)
+ if (ArchimondeGUID)
{
Unit* Archimonde = Unit::GetUnit((*m_creature), ArchimondeGUID);
- if(Archimonde)
+ if (Archimonde)
{
- if((((Archimonde->GetHealth()*100) / Archimonde->GetMaxHealth()) < 2) || !Archimonde->isAlive())
+ if ((((Archimonde->GetHealth()*100) / Archimonde->GetMaxHealth()) < 2) || !Archimonde->isAlive())
DoCast(m_creature, SPELL_DENOUEMENT_WISP);
else
DoCast(Archimonde, SPELL_ANCIENT_SPARK);
@@ -122,192 +121,65 @@ struct mob_ancient_wispAI : public ScriptedAI
}
};
-/* This script controls the Doomfire mob. Unlike the other Doomfire mob, this one does not stalk players.
- Instead, this doomfire will simply stand in one place after spawning and deal damage to any players that
- are within 3 yards. Another creature called Doomfire Targetting spawns this creature as well as stalks. */
+/* This script is merely a placeholder for the Doomfire that triggers Doomfire spell. It will
+ MoveChase the Doomfire Spirit always, until despawn (AttackStart is called upon it's spawn) */
struct TRINITY_DLL_DECL mob_doomfireAI : public ScriptedAI
{
- mob_doomfireAI(Creature* c) : ScriptedAI(c)
- {
- Reset();
- }
-
- uint32 CheckTimer;
- uint32 RefreshTimer;
-
- bool TargetSelected;
-
- uint64 ArchimondeGUID;
- uint64 TargetGUID;
-
- void Reset()
- {
- CheckTimer = 5000;
- RefreshTimer = 0;
-
- TargetSelected = false;
-
- ArchimondeGUID = 0;
- TargetGUID = 0;
- }
+ mob_doomfireAI(Creature* c) : ScriptedAI(c) { Reset(); }
- void DamageTaken(Unit *done_by, uint32 &damage) { damage = 0; }
+ void Reset() { }
+ void MoveInLineOfSight(Unit* who) { }
void Aggro(Unit* who) { }
-
- void MoveInLineOfSight(Unit* who)
- {
- // Do not do anything if who does not exist, or we are refreshing our timer, or who is Doomfire, Archimonde or Doomfire targetting
- if(!who || who == m_creature || RefreshTimer || who->GetEntry() == CREATURE_ANCIENT_WISP ||
- who->GetEntry() == CREATURE_ARCHIMONDE || who->GetEntry() == CREATURE_DOOMFIRE ||
- who->GetEntry() == CREATURE_DOOMFIRE_TARGETING || !who->isTargetableForAttack())
- return;
-
- if(m_creature->IsWithinDistInMap(who, 3))
- {
- TargetSelected = true;
- TargetGUID = who->GetGUID();
- RefreshTimer = 2000;
- }
- }
-
- void KilledUnit(Unit* victim)
- {
- bool suicide = true;
- if(ArchimondeGUID)
- {
- Creature* Archimonde = ((Creature*)Unit::GetUnit((*m_creature), ArchimondeGUID));
- if(Archimonde && Archimonde->isAlive())
- {
- suicide = false;
- Archimonde->AI()->KilledUnit(victim);
- }
- }
-
- if(suicide)
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
-
- void UpdateAI(const uint32 diff)
- {
- if(RefreshTimer < diff)
- RefreshTimer = 0;
- else RefreshTimer -= diff;
-
- if(TargetSelected && TargetGUID)
- {
- Unit* target = Unit::GetUnit((*m_creature), TargetGUID);
- if(target && target->isAlive())
- {
- target->CastSpell(target, SPELL_DOOMFIRE_DAMAGE, true);
- TargetGUID = 0;
- TargetSelected = false;
- }
- }
-
- if(CheckTimer < diff)
- {
- if(ArchimondeGUID)
- {
- Unit* Archimonde = Unit::GetUnit((*m_creature), ArchimondeGUID);
- if(!Archimonde || !Archimonde->isAlive())
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- CheckTimer = 5000;
- }
- else m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }else CheckTimer -= diff;
- }
+ void DamageTaken(Unit *done_by, uint32 &damage) { damage = 0; }
};
-/* This is the script for the Doomfire Targetting Mob. This mob simply follows players and/or travels in random directions and spawns the actual Doomfire which does damage to anyone that moves close. */
+/* This is the script for the Doomfire Spirit Mob. This mob simply follow players or
+ travels in random directions if target cannot be found. */
struct TRINITY_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI
{
- mob_doomfire_targettingAI(Creature* c) : ScriptedAI(c)
- {
- Reset();
- }
+ mob_doomfire_targettingAI(Creature* c) : ScriptedAI(c) { Reset(); }
+ uint64 TargetGUID;
uint32 ChangeTargetTimer;
- uint32 SummonTimer; // This timer will serve as both a summon timer for the doomfire that does damage as well as to check on Archionde
-
- uint64 ArchimondeGUID;
void Reset()
{
+ TargetGUID = 0;
ChangeTargetTimer = 5000;
- SummonTimer = 1000;
-
- ArchimondeGUID = 0;
}
- void Aggro(Unit* who) {}
-
void MoveInLineOfSight(Unit* who)
{
- // Do not do anything if who does not exist, or who is Doomfire, Archimonde or Doomfire targetting
- if(!who || who == m_creature || who->GetEntry() == CREATURE_ARCHIMONDE
- || who->GetEntry() == CREATURE_DOOMFIRE || who->GetEntry() == CREATURE_DOOMFIRE_TARGETING || !who->isTargetableForAttack())
- return;
-
- m_creature->AddThreat(who, 0.0f);
+ //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
+ if (!TargetGUID && who->GetTypeId() == TYPEID_PLAYER)
+ TargetGUID = who->GetGUID();
}
+ void Aggro(Unit* who) {}
+
void DamageTaken(Unit *done_by, uint32 &damage) { damage = 0; }
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
- return;
-
- if(SummonTimer < diff)
+ if (ChangeTargetTimer < diff)
{
- if(ArchimondeGUID)
+ if (Unit *temp = Unit::GetUnit(*m_creature,TargetGUID))
{
- Unit* Archimonde = Unit::GetUnit((*m_creature), ArchimondeGUID);
- if(Archimonde && Archimonde->isAlive())
- {
- Creature* Doomfire = DoSpawnCreature(CREATURE_DOOMFIRE, 0, 0, 2, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
- if(Doomfire)
- {
- Doomfire->CastSpell(Doomfire, SPELL_DOOMFIRE_VISUAL, true);
- ((mob_doomfireAI*)Doomfire->AI())->ArchimondeGUID = ArchimondeGUID;
- Doomfire->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
- SummonTimer = 500;
- }
- else
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ m_creature->GetMotionMaster()->MoveFollow(temp,0.0f,0.0f);
+ TargetGUID = 0;
}
else
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }else SummonTimer -= diff;
-
- if(ChangeTargetTimer < diff)
- {
- Unit* target = NULL;
- switch(rand()%2)
{
- case 0: // stalk player
- target = SelectUnit(SELECT_TARGET_RANDOM, 1);
- if(target && target->isAlive())
- {
- m_creature->AddThreat(target, DoGetThreat(m_creature->getVictim()));
- m_creature->GetMotionMaster()->MoveChase(target);
- }
- break;
-
- case 1: // random location
- float x = 0;
- float y = 0;
- float z = 0;
- m_creature->GetRandomPoint(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 40, x, y, z);
- m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
- break;
+ float x,y,z = 0.0;
+ m_creature->GetRandomPoint(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 40, x, y, z);
+ m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
}
+
ChangeTargetTimer = 5000;
}else ChangeTargetTimer -= diff;
}
-
};
/* Finally, Archimonde's script. His script isn't extremely complex, most are simply spells on timers.
@@ -315,8 +187,8 @@ struct TRINITY_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI
hardest bit to code. Finger of Death is simply a distance check - if no one is in melee range, then
select a random target and cast the spell on them. However, if someone IS in melee range, and this
is NOT the main tank (creature's victim), then we aggro that player and they become the new victim.
- For Doomfire, we summon a mob (Doomfire Targetting) that summons another mob (Doomfire every second)
- Doomfire Targetting 'stalks' players whilst Doomfire damages player that are within range. */
+ For Doomfire, we summon a mob (Doomfire Spirit) for the Doomfire mob to follow. It's spirit will
+ randomly select it's target to follow and then we create the random movement making it unpredictable. */
// This is used to sort by distance in order to see who is the closest target, when checking for Finger of Death
struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool>
@@ -340,6 +212,9 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
ScriptedInstance* pInstance;
+ uint64 DoomfireSpiritGUID;
+ uint64 WorldTreeGUID;
+
uint32 DrainNordrassilTimer;
uint32 FearTimer;
uint32 AirBurstTimer;
@@ -361,9 +236,12 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
void Reset()
{
- if(pInstance)
+ if (pInstance)
pInstance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED);
+ DoomfireSpiritGUID = 0;
+ WorldTreeGUID = 0;
+
DrainNordrassilTimer = 0;
FearTimer = 42000;
AirBurstTimer = 30000;
@@ -389,7 +267,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
- if(pInstance)
+ if (pInstance)
pInstance->SetData(DATA_ARCHIMONDEEVENT, IN_PROGRESS);
}
@@ -397,12 +275,12 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
switch(rand()%2)
{
- case 0: DoScriptText(SAY_SLAY1, m_creature); break;
- case 1: DoScriptText(SAY_SLAY2, m_creature); break;
- case 2: DoScriptText(SAY_SLAY3, m_creature); break;
+ case 0: DoScriptText(SAY_SLAY1, m_creature); break;
+ case 1: DoScriptText(SAY_SLAY2, m_creature); break;
+ case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
- if(victim && (victim->GetTypeId() == TYPEID_PLAYER))
+ if (victim && (victim->GetTypeId() == TYPEID_PLAYER))
GainSoulCharge(((Player*)victim));
}
@@ -435,7 +313,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
DoScriptText(SAY_DEATH, m_creature);
- if(pInstance)
+ if (pInstance)
pInstance->SetData(DATA_ARCHIMONDEEVENT, DONE);
}
@@ -443,11 +321,11 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
// First we check if our current victim is in melee range or not.
Unit* victim = m_creature->getVictim();
- if(victim && m_creature->IsWithinDistInMap(victim, m_creature->GetAttackDistance(victim)))
+ if (victim && m_creature->IsWithinDistInMap(victim, m_creature->GetAttackDistance(victim)))
return false;
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
- if(m_threatlist.empty())
+ if (m_threatlist.empty())
return false;
std::list<Unit*> targets;
@@ -455,56 +333,70 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
for( ; itr != m_threatlist.end(); ++itr)
{
Unit* pUnit = Unit::GetUnit((*m_creature), (*itr)->getUnitGuid());
- if(pUnit && pUnit->isAlive())
+ if (pUnit && pUnit->isAlive())
targets.push_back(pUnit);
}
- if(targets.empty())
+ if (targets.empty())
return false;
targets.sort(TargetDistanceOrder(m_creature));
Unit* target = targets.front();
- if(target)
+ if (target)
{
- if(!m_creature->IsWithinDistInMap(target, m_creature->GetAttackDistance(target)))
+ if (!m_creature->IsWithinDistInMap(target, m_creature->GetAttackDistance(target)))
return true; // Cast Finger of Death
else // This target is closest, he is our new tank
- m_creature->AddThreat(target, DoGetThreat(m_creature->getVictim()));
+ m_creature->AddThreat(target, m_creature->getThreatManager().getThreat(m_creature->getVictim()));
}
return false;
}
- void SummonDoomfire(Unit* target)
+ void JustSummoned(Creature *summoned)
{
- Creature* Doomfire = DoSpawnCreature(CREATURE_DOOMFIRE_TARGETING, rand()%30, rand()%30, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
- if(Doomfire)
+ summoned->setFaction(m_creature->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)
{
- ((mob_doomfire_targettingAI*)Doomfire->AI())->ArchimondeGUID = m_creature->GetGUID();
- Doomfire->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- // Give Doomfire a taste of everyone in the threatlist = more targets to chase.
- std::list<HostilReference*>::iterator itr;
- for(itr = m_creature->getThreatManager().getThreatList().begin(); itr != m_creature->getThreatManager().getThreatList().end(); ++itr)
- Doomfire->AddThreat(Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()), 1.0f);
- Doomfire->setFaction(m_creature->getFaction());
- DoCast(Doomfire, SPELL_DOOMFIRE_SPAWN);
- Doomfire->CastSpell(Doomfire, SPELL_DOOMFIRE_VISUAL, true);
- if(target)
- Doomfire->AI()->AttackStart(target);
-
- if(rand()%2 == 0)
- DoScriptText(SAY_DOOMFIRE1, m_creature);
- else
- DoScriptText(SAY_DOOMFIRE2, m_creature);
+ DoomfireSpiritGUID = summoned->GetGUID();
+ }
+
+ if (summoned->GetEntry() == CREATURE_DOOMFIRE)
+ {
+ summoned->CastSpell(summoned,SPELL_DOOMFIRE_SPAWN,false);
+ summoned->CastSpell(summoned,SPELL_DOOMFIRE,true,0,0,m_creature->GetGUID());
+
+ if (Unit *DoomfireSpirit = Unit::GetUnit(*m_creature, DoomfireSpiritGUID))
+ {
+ summoned->GetMotionMaster()->MoveFollow(DoomfireSpirit,0.0f,0.0f);
+ DoomfireSpiritGUID = 0;
+ }
}
}
+ //this is code doing close to what the summoning spell would do (spell 31903)
+ void SummonDoomfire(Unit* target)
+ {
+ m_creature->SummonCreature(CREATURE_DOOMFIRE_SPIRIT,
+ target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0,
+ TEMPSUMMON_TIMED_DESPAWN, 27000);
+
+ m_creature->SummonCreature(CREATURE_DOOMFIRE,
+ target->GetPositionX()-15.0,target->GetPositionY()-15.0,target->GetPositionZ(),0,
+ TEMPSUMMON_TIMED_DESPAWN, 27000);
+ }
+
void UnleashSoulCharge()
{
m_creature->InterruptNonMeleeSpells(false);
+
bool HasCast = false;
uint32 chargeSpell = 0;
uint32 unleashSpell = 0;
+
switch(rand()%3)
{
case 0:
@@ -520,42 +412,48 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
unleashSpell = SPELL_UNLEASH_SOUL_GREEN;
break;
}
- if(m_creature->HasAura(chargeSpell, 0))
+
+ if (m_creature->HasAura(chargeSpell, 0))
{
m_creature->RemoveSingleAuraFromStack(chargeSpell, 0);
DoCast(m_creature->getVictim(), unleashSpell);
HasCast = true;
SoulChargeCount--;
}
- if(HasCast)
+
+ if (HasCast)
SoulChargeTimer = 2000 + rand()%28000;
}
void UpdateAI(const uint32 diff)
{
- if(!InCombat)
+ if (!InCombat)
{
- if(pInstance)
+ if (pInstance)
{
// Do not let the raid skip straight to Archimonde. Visible and hostile ONLY if Azagalor is finished.
- if((pInstance->GetData(DATA_AZGALOREVENT) < DONE) && ((m_creature->GetVisibility() != VISIBILITY_OFF) || (m_creature->getFaction() != 35)))
+ if ((pInstance->GetData(DATA_AZGALOREVENT) < DONE) && ((m_creature->GetVisibility() != VISIBILITY_OFF) || (m_creature->getFaction() != 35)))
{
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->setFaction(35);
}
- else if((pInstance->GetData(DATA_AZGALOREVENT) >= DONE) && ((m_creature->GetVisibility() != VISIBILITY_ON) || (m_creature->getFaction() == 35)))
+ else if ((pInstance->GetData(DATA_AZGALOREVENT) >= DONE) && ((m_creature->GetVisibility() != VISIBILITY_ON) || (m_creature->getFaction() == 35)))
{
m_creature->setFaction(1720);
m_creature->SetVisibility(VISIBILITY_ON);
}
}
- if(DrainNordrassilTimer < diff)
+ if (DrainNordrassilTimer < diff)
{
- if(!IsChanneling)
+ if (!IsChanneling)
{
- Creature* Nordrassil = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 1200000);
- if(Nordrassil)
+ Creature *temp = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 1200000);
+
+ if (temp)
+ WorldTreeGUID = temp->GetGUID();
+
+ if (Unit *Nordrassil = Unit::GetUnit(*m_creature, WorldTreeGUID))
{
Nordrassil->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Nordrassil->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
@@ -563,26 +461,24 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
IsChanneling = true;
}
}
- Creature* Nordrassil = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 5000);
- if(Nordrassil)
+
+ if (Unit *Nordrassil = Unit::GetUnit(*m_creature, WorldTreeGUID))
{
- Nordrassil->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- Nordrassil->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
Nordrassil->CastSpell(m_creature, SPELL_DRAIN_WORLD_TREE_2, true);
DrainNordrassilTimer = 1000;
}
}else DrainNordrassilTimer -= diff;
}
- if(!UpdateVictim())
+ if (!UpdateVictim() )
return;
- if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 10) && !BelowTenPercent && !Enraged)
+ if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 10) && !BelowTenPercent && !Enraged)
BelowTenPercent = true;
- if(!Enraged)
+ if (!Enraged)
{
- if(EnrageTimer < diff)
+ if (EnrageTimer < diff)
{
if((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) > 10)
{
@@ -593,14 +489,15 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
}
}else EnrageTimer -= diff;
- if(CheckDistanceTimer < diff)
+ 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 = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000);
- if(Check)
+ if (Check)
{
Check->SetVisibility(VISIBILITY_OFF);
- if(m_creature->IsWithinDistInMap(Check, 75))
+
+ if (m_creature->IsWithinDistInMap(Check, 75))
{
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
@@ -612,22 +509,23 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
}else CheckDistanceTimer -= diff;
}
- if(BelowTenPercent)
+ if (BelowTenPercent)
{
- if(!HasProtected)
+ if (!HasProtected)
{
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
+
//all members of raid must get this buff
DoCast(m_creature->getVictim(), SPELL_PROTECTION_OF_ELUNE);
HasProtected = true;
Enraged = true;
}
- if(SummonWispTimer < diff)
+ if (SummonWispTimer < diff)
{
Creature* Wisp = DoSpawnCreature(CREATURE_ANCIENT_WISP, rand()%40, rand()%40, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if(Wisp)
+ if (Wisp)
{
Wisp->AI()->AttackStart(m_creature);
((mob_ancient_wispAI*)Wisp->AI())->ArchimondeGUID = m_creature->GetGUID();
@@ -636,13 +534,13 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
++WispCount;
}else SummonWispTimer -= diff;
- if(WispCount >= 30)
+ if (WispCount >= 30)
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
- if(Enraged)
+ if (Enraged)
{
- if(HandOfDeathTimer < diff)
+ if (HandOfDeathTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_HAND_OF_DEATH);
HandOfDeathTimer = 2000;
@@ -650,46 +548,57 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
return; // Don't do anything after this point.
}
- if(SoulChargeCount)
+ if (SoulChargeCount)
{
- if(SoulChargeTimer < diff)
+ if (SoulChargeTimer < diff)
UnleashSoulCharge();
else SoulChargeTimer -= diff;
}
- if(GripOfTheLegionTimer < diff)
+ if (GripOfTheLegionTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_GRIP_OF_THE_LEGION);
GripOfTheLegionTimer = 5000 + rand()%20000;
}else GripOfTheLegionTimer -= diff;
- if(AirBurstTimer < diff)
+ if (AirBurstTimer < diff)
{
- if(rand()%2 == 0)
+ if (rand()%2 == 0)
DoScriptText(SAY_AIR_BURST1, m_creature);
else
DoScriptText(SAY_AIR_BURST2, m_creature);
-
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_AIR_BURST);
AirBurstTimer = 25000 + rand()%15000;
}else AirBurstTimer -= diff;
- if(FearTimer < diff)
+ if (FearTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FEAR);
FearTimer = 42000;
}else FearTimer -= diff;
- if(DoomfireTimer < diff)
+ if (DoomfireTimer < diff)
{
- SummonDoomfire(SelectUnit(SELECT_TARGET_RANDOM, 1));
- DoomfireTimer = 40000;
+ if (rand()%2 == 0)
+ DoScriptText(SAY_DOOMFIRE1, m_creature);
+ else
+ DoScriptText(SAY_DOOMFIRE2, m_creature);
+
+ Unit *temp = SelectUnit(SELECT_TARGET_RANDOM, 1);
+ if (!temp)
+ temp = m_creature->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 (MeleeRangeCheckTimer < diff)
{
- if(CanUseFingerOfDeath())
+ if (CanUseFingerOfDeath())
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FINGER_OF_DEATH);
MeleeRangeCheckTimer = 1000;
@@ -726,7 +635,7 @@ void AddSC_boss_archimonde()
{
Script *newscript;
newscript = new Script;
- newscript->Name="boss_archimonde";
+ newscript->Name = "boss_archimonde";
newscript->GetAI = &GetAI_boss_archimonde;
newscript->RegisterSelf();
@@ -745,4 +654,3 @@ void AddSC_boss_archimonde()
newscript->GetAI = &GetAI_mob_ancient_wisp;
newscript->RegisterSelf();
}
-
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/def_hyjal.h b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/def_hyjal.h
index 757ce2ce2cb..f33f9a95da3 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/def_hyjal.h
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/def_hyjal.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal.cpp
index 8d6686bb56b..98d5c352d3f 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp
index 366c5863ddd..960cea141c9 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -149,7 +149,7 @@ void hyjalAI::EnterEvadeMode()
void hyjalAI::Aggro(Unit *who)
{
- for(uint8 i = 0; i < 2; ++i)
+ for(uint8 i = 0; i < 3; ++i)
if(Spell[i].Cooldown)
SpellTimer[i] = Spell[i].Cooldown;
@@ -335,7 +335,7 @@ void hyjalAI::Retreat()
// First get all creatures.
std::list<Creature*> creatures;
Trinity::AllFriendlyCreaturesInGrid creature_check(m_creature);
- Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> creature_searcher(creatures, creature_check);
+ Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> creature_searcher(m_creature, creatures, creature_check);
TypeContainerVisitor
<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>,
GridTypeMapContainer> creature_visitor(creature_searcher);
@@ -343,7 +343,7 @@ void hyjalAI::Retreat()
// Then get all Ancient Gem Veins. NOTE: Grid Search will only be able to find those in the grid.
std::list<GameObject*> goList;
Trinity::AllGameObjectsWithEntryInGrid go_check(185557);
- Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid> go_search(goList, go_check);
+ Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid> go_search(m_creature, goList, go_check);
TypeContainerVisitor
<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid>, GridTypeMapContainer> go_visit(go_search);
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h
index cb4e3f72ab3..135afede0b7 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
index 44419b37575..63256988e27 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -38,6 +38,9 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
{
instance_mount_hyjal(Map *map) : ScriptedInstance(map) {Initialize();};
+ uint32 Encounters[ENCOUNTERS];
+ std::string str_data;
+
uint64 RageWinterchill;
uint64 Anetheron;
uint64 Kazrogal;
@@ -48,7 +51,6 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
uint64 TyrandeWhisperwind;
uint32 Trash;
- uint32 Encounters[ENCOUNTERS];
void Initialize()
{
@@ -76,7 +78,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 17767: RageWinterchill = creature->GetGUID(); break;
case 17808: Anetheron = creature->GetGUID(); break;
@@ -127,7 +129,19 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)",type,data);
if(data == DONE)
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
+ << Encounters[3] << " " << Encounters[4];
+
+ str_data = saveStream.str();
+
SaveToDB();
+ OUT_SAVE_INST_DATA_COMPLETE;
+ }
+
}
uint32 GetData(uint32 type)
@@ -160,19 +174,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
const char* Save()
{
- OUT_SAVE_INST_DATA;
- std::ostringstream stream;
- stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
- << Encounters[3] << " " << Encounters[4];
- char* out = new char[stream.str().length() + 1];
- strcpy(out, stream.str().c_str());
- if(out)
- {
- OUT_SAVE_INST_DATA_COMPLETE;
- return out;
- }
-
- return NULL;
+ return str_data.c_str();
}
void Load(const char* in)
@@ -184,8 +186,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
}
OUT_LOAD_INST_DATA(in);
- std::istringstream loadStream;
- loadStream.str(in);
+ std::istringstream loadStream(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if(Encounters[i] == IN_PROGRESS) // Do not load an encounter as IN_PROGRESS - reset it instead.
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp
index c3abfe68167..e21cc826978 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -57,9 +57,9 @@ struct TRINITY_DLL_DECL boss_captain_skarlocAI : public ScriptedAI
void Reset()
{
- Holy_Light_Timer = 30000;
+ Holy_Light_Timer = 20000 + rand()%10000;
Cleanse_Timer = 10000;
- HammerOfJustice_Timer = 60000;
+ HammerOfJustice_Timer = 20000 + rand()%15000;
HolyShield_Timer = 240000;
DevotionAura_Timer = 3000;
Consecration_Timer = 8000;
@@ -127,14 +127,14 @@ struct TRINITY_DLL_DECL boss_captain_skarlocAI : public ScriptedAI
if (DevotionAura_Timer < diff)
{
DoCast(m_creature, SPELL_DEVOTION_AURA);
- DevotionAura_Timer = 60000;
+ DevotionAura_Timer = 45000 + rand()%10000;
}else DevotionAura_Timer -= diff;
//Consecration
if (Consecration_Timer < diff)
{
//DoCast(m_creature->getVictim(), SPELL_CONSECRATION);
- Consecration_Timer = 8000;
+ Consecration_Timer = 5000 + rand()%5000;
}else Consecration_Timer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp
index 02b90958ff6..863a3d9d5d1 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -57,8 +57,8 @@ struct TRINITY_DLL_DECL boss_epoch_hunterAI : public ScriptedAI
void Reset()
{
- SandBreath_Timer = 25000;
- ImpendingDeath_Timer = 30000;
+ SandBreath_Timer = 8000 + rand()%8000;
+ ImpendingDeath_Timer = 25000 + rand()%5000;
WingBuffet_Timer = 35000;
Mda_Timer = 40000;
}
@@ -109,13 +109,13 @@ struct TRINITY_DLL_DECL boss_epoch_hunterAI : public ScriptedAI
case 1: DoScriptText(SAY_BREATH2, m_creature); break;
}
- SandBreath_Timer = 25000+rand()%5000;
+ SandBreath_Timer = 10000 + rand()%10000;
}else SandBreath_Timer -= diff;
if (ImpendingDeath_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_IMPENDING_DEATH);
- ImpendingDeath_Timer = 30000+rand()%5000;
+ ImpendingDeath_Timer = 25000+rand()%5000;
}else ImpendingDeath_Timer -= diff;
if (WingBuffet_Timer < diff)
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp
index f80dfcdca34..9b938d4d18b 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -159,7 +159,7 @@ struct TRINITY_DLL_DECL boss_lieutenant_drakeAI : public ScriptedAI
{
DoScriptText(SAY_SHOUT, m_creature);
DoCast(m_creature->getVictim(), SPELL_FRIGHTENING_SHOUT);
- Fear_Timer = 30000+rand()%10000;
+ Fear_Timer = 25000+rand()%10000;
}else Fear_Timer -= diff;
//Mortal Strike
@@ -167,7 +167,7 @@ struct TRINITY_DLL_DECL boss_lieutenant_drakeAI : public ScriptedAI
{
DoScriptText(SAY_MORTAL, m_creature);
DoCast(m_creature->getVictim(), SPELL_MORTAL_STRIKE);
- MortalStrike_Timer = 45000+rand()%5000;
+ MortalStrike_Timer = 20000+rand()%10000;
}else MortalStrike_Timer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/def_old_hillsbrad.h b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/def_old_hillsbrad.h
index b49e671339a..95934718599 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/def_old_hillsbrad.h
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/def_old_hillsbrad.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp
index 9e713cf8fcf..92d9c7c10a6 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -95,7 +95,7 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case THRALL_ENTRY:
ThrallGUID = creature->GetGUID();
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
index 675cc78f8a5..bc18f91e795 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -235,12 +235,12 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
case 9:
DoScriptText(SAY_TH_ARMORY, m_creature);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, THRALL_WEAPON_MODEL);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, THRALL_SHIELD_MODEL);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, THRALL_SHIELD_INFO);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 1038);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_MODEL);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, THRALL_SHIELD_MODEL);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, THRALL_SHIELD_INFO);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 1038);
break;
case 10:
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, THRALL_MODEL_EQUIPPED);
@@ -278,7 +278,6 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
break;
case 31:
DoScriptText(SAY_TH_MOUNTS_UP, m_creature);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
DoMount();
break;
case 37:
@@ -347,11 +346,9 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
break;
case 96:
DoScriptText(SAY_TH_EPOCH_WONDER, m_creature);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
break;
case 97:
DoScriptText(SAY_TH_EPOCH_KILL_TARETHA, m_creature);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 98:
@@ -399,12 +396,8 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
DoUnmount();
HadMount = false;
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, THRALL_MODEL_UNEQUIPPED);
}
if( IsBeingEscorted )
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp
index 273f0cc0f55..22d539db2ab 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp
index 69006dade60..665af987a6d 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
index fa997c69afe..9d66533972d 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
index 4835ff90637..4f96e672352 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -196,8 +196,8 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
InnderDemon_Count = 0;
m_creature->SetSpeed( MOVE_RUN, 2.0f, true);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
m_creature->SetCorpseDelay(1000*60*60);
if(pInstance)
@@ -275,7 +275,7 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
m_creature->RemoveAurasDueToSpell(AURA_BANISH);
// Leotheras is getting immune again
- m_creature->ApplySpellImmune(AURA_BANISH, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
+ m_creature->ApplySpellImmune(AURA_BANISH, IMMUNITY_MECHANIC, 1<<MECHANIC_BANISH, true);
// changing model to bloodelf
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);
@@ -296,15 +296,15 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
{
// channelers != 0 apply banish aura
// removing Leotheras banish immune to apply AURA_BANISH
- m_creature->ApplySpellImmune(AURA_BANISH, IMMUNITY_MECHANIC, MECHANIC_BANISH, false);
+ m_creature->ApplySpellImmune(AURA_BANISH, IMMUNITY_MECHANIC, 1<<MECHANIC_BANISH, false);
DoCast(m_creature, AURA_BANISH);
// changing model
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_DEMON);
// and removing weapons
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
}
}
@@ -467,8 +467,8 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
m_creature->RemoveAurasDueToSpell(SPELL_WHIRLWIND,0);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_DEMON);
DoScriptText(SAY_SWITCH_TO_DEMON, m_creature);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
DemonForm = true;
NeedThreatReset = true;
SwitchToDemon_Timer = 45000;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
index 4944f902257..6d1fc0a9d51 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
index d8538dd3e62..f243126e0d3 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h
index aceabea4b5c..13144bc93c0 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
index 94e94c9be50..ef69ab220bf 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -137,12 +137,12 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(open ? 0 : 1);
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 21212: LadyVashj = creature->GetGUID(); break;
case 21214: Karathress = creature->GetGUID(); break;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp
index 6bd8257ddf3..5fd7837d911 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp
index 0b5dfa9c731..3424850686a 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp
index 1396179473e..e525461de71 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -145,7 +145,7 @@ struct TRINITY_DLL_DECL boss_warlord_kalithreshAI : public ScriptedAI
cell.SetNoCreate();
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*m_creature, entry, true, range);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(pCreature, creature_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_creature, pCreature, creature_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/def_steam_vault.h b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/def_steam_vault.h
index 09a76d482b7..4b407ac4816 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/def_steam_vault.h
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/def_steam_vault.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
index b76cfedb777..92df1fffbe1 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_hungarfen.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_hungarfen.cpp
index 28543aea833..1d6584b9523 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_hungarfen.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_hungarfen.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp b/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp
index aea0e52e4f7..fcb13e9f479 100644
--- a/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp
+++ b/src/bindings/scripts/scripts/zone/darkshore/darkshore.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp b/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp
index 3f71dc9041b..cafdc5fbc46 100644
--- a/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp
+++ b/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -69,7 +69,7 @@ struct TRINITY_DLL_DECL instance_deadmines : public ScriptedInstance
CannonBlast_Timer = CANNON_BLAST_TIMER;
// it's a hack - Mr. Smite should do that but his too far away
IronCladDoor->SetName("Mr. Smite");
- IronCladDoor->Yell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, 0);
+ IronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, 0);
DoPlaySound(IronCladDoor, SOUND_MR_SMITE_ALARM1);
State=CANNON_BLAST_INITIATED;
break;
@@ -81,7 +81,7 @@ struct TRINITY_DLL_DECL instance_deadmines : public ScriptedInstance
ShootCannon();
BlastOutDoor();
LeverStucked();
- IronCladDoor->Yell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, 0);
+ IronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, 0);
DoPlaySound(IronCladDoor, SOUND_MR_SMITE_ALARM2);
State = PIRATES_ATTACK;
}else
@@ -120,13 +120,13 @@ struct TRINITY_DLL_DECL instance_deadmines : public ScriptedInstance
void ShootCannon()
{
- DefiasCannon->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ DefiasCannon->SetGoState(0);
DoPlaySound(DefiasCannon, SOUND_CANNONFIRE);
}
void BlastOutDoor()
{
- IronCladDoor->SetUInt32Value(GAMEOBJECT_STATE, 2);
+ IronCladDoor->SetGoState(2);
DoPlaySound(IronCladDoor, SOUND_DESTROYDOOR);
}
diff --git a/src/bindings/scripts/scripts/zone/dun_morogh/dun_morogh.cpp b/src/bindings/scripts/scripts/zone/dun_morogh/dun_morogh.cpp
index db79d4498ea..185d545d98d 100644
--- a/src/bindings/scripts/scripts/zone/dun_morogh/dun_morogh.cpp
+++ b/src/bindings/scripts/scripts/zone/dun_morogh/dun_morogh.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -44,7 +44,7 @@ struct TRINITY_DLL_DECL npc_narm_faulkAI : public ScriptedAI
{
lifeTimer = 120000;
m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 32);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,7); // lay down
+ m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
spellHit = false;
}
@@ -59,7 +59,7 @@ struct TRINITY_DLL_DECL npc_narm_faulkAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
- if (!m_creature->GetUInt32Value(UNIT_FIELD_BYTES_1))
+ if (m_creature->IsStandState())
{
if(lifeTimer < diff)
m_creature->AI()->EnterEvadeMode();
@@ -73,7 +73,7 @@ struct TRINITY_DLL_DECL npc_narm_faulkAI : public ScriptedAI
if(Spellkind->Id == 8593 && !spellHit)
{
DoCast(m_creature,32343);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
//m_creature->RemoveAllAuras();
DoScriptText(SAY_HEAL, m_creature);
diff --git a/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp b/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp
index 8cc53ece44f..ed8a50f9d94 100644
--- a/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp
+++ b/src/bindings/scripts/scripts/zone/dustwallow_marsh/dustwallow_marsh.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/eastern_plaguelands/eastern_plaguelands.cpp b/src/bindings/scripts/scripts/zone/eastern_plaguelands/eastern_plaguelands.cpp
index de026011180..0c8c47a4c52 100644
--- a/src/bindings/scripts/scripts/zone/eastern_plaguelands/eastern_plaguelands.cpp
+++ b/src/bindings/scripts/scripts/zone/eastern_plaguelands/eastern_plaguelands.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -118,7 +118,7 @@ bool GossipHello_npc_tirion_fordring(Player *player, Creature *_Creature)
if (_Creature->isQuestGiver())
player->PrepareQuestMenu( _Creature->GetGUID() );
- if (player->GetQuestStatus(5742) == QUEST_STATUS_INCOMPLETE && player->getStandState() == PLAYER_STATE_SIT )
+ if (player->GetQuestStatus(5742) == QUEST_STATUS_INCOMPLETE && player->getStandState() == UNIT_STAND_STATE_SIT )
player->ADD_GOSSIP_ITEM( 0, "I am ready to hear your tale, Tirion.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
diff --git a/src/bindings/scripts/scripts/zone/elwynn_forest/elwynn_forest.cpp b/src/bindings/scripts/scripts/zone/elwynn_forest/elwynn_forest.cpp
index 01c4e89d9aa..b9ac3aa18c3 100644
--- a/src/bindings/scripts/scripts/zone/elwynn_forest/elwynn_forest.cpp
+++ b/src/bindings/scripts/scripts/zone/elwynn_forest/elwynn_forest.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -44,7 +44,7 @@ struct TRINITY_DLL_DECL npc_henze_faulkAI : public ScriptedAI
{
lifeTimer = 120000;
m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 32);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,7); // lay down
+ m_creature->SetStandState(UNIT_STAND_STATE_DEAD); // lay down
spellHit = false;
}
@@ -59,7 +59,7 @@ struct TRINITY_DLL_DECL npc_henze_faulkAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
- if (!m_creature->GetUInt32Value(UNIT_FIELD_BYTES_1))
+ if (m_creature->IsStandState())
{
if(lifeTimer < diff)
m_creature->AI()->EnterEvadeMode();
@@ -73,7 +73,7 @@ struct TRINITY_DLL_DECL npc_henze_faulkAI : public ScriptedAI
if(Spellkind->Id == 8593 && !spellHit)
{
DoCast(m_creature,32343);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
//m_creature->RemoveAllAuras();
DoScriptText(SAY_HEAL, m_creature);
diff --git a/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp b/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp
index 9665e10cad8..b29e99d6206 100644
--- a/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp
+++ b/src/bindings/scripts/scripts/zone/eversong_woods/eversong_woods.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -17,12 +17,11 @@
/* ScriptData
SDName: Eversong_Woods
SD%Complete: 100
-SDComment: Quest support: 8346, 8483, 8488, 8490
+SDComment: Quest support: 8483, 8488, 8490
SDCategory: Eversong Woods
EndScriptData */
/* ContentData
-mobs_mana_tapped
npc_prospector_anvilward
npc_apprentice_mirveda
npc_infused_crystal
@@ -32,31 +31,6 @@ EndContentData */
#include "../../npc/npc_escortAI.h"
/*######
-## mobs_mana_tapped
-######*/
-
-struct TRINITY_DLL_DECL mobs_mana_tappedAI : public ScriptedAI
-{
- mobs_mana_tappedAI(Creature *c) : ScriptedAI(c) {Reset();}
-
- void Reset() { }
-
- void Aggro(Unit *who) { }
-
- void SpellHit(Unit *caster, const SpellEntry *spell)
- {
- if( caster->GetTypeId() == TYPEID_PLAYER)
- if( ((Player*)caster)->GetQuestStatus(8346) == QUEST_STATUS_INCOMPLETE && !((Player*)caster)->GetReqKillOrCastCurrentCount(8346, m_creature->GetEntry()) && spell->Id == 28734)
- ((Player*)caster)->CastedCreatureOrGO(15468, m_creature->GetGUID(), spell->Id);
- return;
- }
-};
-CreatureAI* GetAI_mobs_mana_tapped(Creature *_Creature)
-{
- return new mobs_mana_tappedAI (_Creature);
-}
-
-/*######
## npc_prospector_anvilward
######*/
@@ -229,7 +203,7 @@ struct TRINITY_DLL_DECL npc_secondTrialAI : public ScriptedAI
questPhase = 0;
summonerGuid = 0;
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_KNEEL);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_KNEEL);
m_creature->setFaction(FACTION_FRIENDLY);
spellFlashLight = false;
@@ -268,7 +242,7 @@ struct TRINITY_DLL_DECL npc_secondTrialAI : public ScriptedAI
if ( questPhase == 1 ) {
if ( timer < diff ) {
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_NONE);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_STAND);
m_creature->setFaction(FACTION_HOSTILE);
questPhase = 0;
@@ -539,7 +513,7 @@ bool GOHello_go_second_trial(Player *player, GameObject* _GO)
Creature* event_controller = NULL;
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*_GO, MASTER_KELERUN_BLOODMOURN, true, 30);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(event_controller, u_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(player, event_controller, u_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
//cell_lock->Visit(cell_lock, grid_unit_searcher, *MapManager::Instance().GetMap(_GO->GetMap(), _GO));
cell_lock->Visit(cell_lock, grid_unit_searcher, *(_GO->GetMap()));
@@ -754,11 +728,6 @@ void AddSC_eversong_woods()
Script *newscript;
newscript = new Script;
- newscript->Name="mobs_mana_tapped";
- newscript->GetAI = &GetAI_mobs_mana_tapped;
- newscript->RegisterSelf();
-
- newscript = new Script;
newscript->Name= "npc_prospector_anvilward";
newscript->GetAI = &GetAI_npc_prospector_anvilward;
newscript->pGossipHello = &GossipHello_npc_prospector_anvilward;
diff --git a/src/bindings/scripts/scripts/zone/felwood/felwood.cpp b/src/bindings/scripts/scripts/zone/felwood/felwood.cpp
index b7a4bc03c59..4103283be43 100644
--- a/src/bindings/scripts/scripts/zone/felwood/felwood.cpp
+++ b/src/bindings/scripts/scripts/zone/felwood/felwood.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/feralas/feralas.cpp b/src/bindings/scripts/scripts/zone/feralas/feralas.cpp
index f3822bcdb7a..ff30fc3f90c 100644
--- a/src/bindings/scripts/scripts/zone/feralas/feralas.cpp
+++ b/src/bindings/scripts/scripts/zone/feralas/feralas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp b/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp
index 398d642b264..b7b462a85a7 100644
--- a/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp
+++ b/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp
index 0d47bed71af..f2da55becc8 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,12 +6,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
@@ -24,7 +24,6 @@ EndScriptData */
#include "precompiled.h"
#include "def_gruuls_lair.h"
-/* Yells & Quotes */
#define SAY_AGGRO -1565010
#define SAY_SLAM1 -1565011
#define SAY_SLAM2 -1565012
@@ -36,17 +35,18 @@ EndScriptData */
#define SAY_DEATH -1565018
#define EMOTE_GROW -1565019
-/* Spells */
-#define SPELL_GROWTH 36300
-#define SPELL_CAVE_IN 36240
-#define SPELL_GROUND_SLAM 33525 // AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
-#define SPELL_REVERBERATION 36297 //AoE Silence
-#define SPELL_SHATTER 33654
-#define SPELL_MAGNETIC_PULL 28337
-#define SPELL_KNOCK_BACK 24199 //Knockback spell until correct implementation is made
+#define SPELL_GROWTH 36300
+#define SPELL_CAVE_IN 36240
+#define SPELL_GROUND_SLAM 33525 //AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
+#define SPELL_REVERBERATION 36297 //AoE Silence
+#define SPELL_SHATTER 33654
+
#define SPELL_SHATTER_EFFECT 33671
#define SPELL_HURTFUL_STRIKE 33813
#define SPELL_STONED 33652 //Spell is self cast
+#define SPELL_MAGNETIC_PULL 28337
+#define SPELL_KNOCK_BACK 24199 //Knockback spell until correct implementation is made
+
#define SPELL_GRONN_LORDS_GRASP 33572 //Triggered by Ground Slam
struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
@@ -61,6 +61,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
uint32 Growth_Timer;
uint32 CaveIn_Timer;
+ uint32 CaveIn_StaticTimer;
uint32 GroundSlamTimer;
uint32 GroundSlamStage;
uint32 PerformingGroundSlam;
@@ -70,62 +71,60 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
void Reset()
{
Growth_Timer= 30000;
- CaveIn_Timer= 40000;
+ CaveIn_Timer= 27000;
+ CaveIn_StaticTimer = 30000;
GroundSlamTimer= 35000;
GroundSlamStage= 0;
PerformingGroundSlam= false;
HurtfulStrike_Timer= 8000;
Reverberation_Timer= 60000+45000;
- if(pInstance)
+ if (pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, NOT_STARTED);
+ GameObject* EncounterDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
+ if (EncounterDoor)
+ EncounterDoor->SetGoState(0); // Open the encounter door
+ }else error_log(ERROR_INST_DATA);
- GameObject* Door = NULL;
- Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
- if(Door)
- Door->SetGoState(0);
- }
- }
-
- void JustDied(Unit* Killer)
- {
- DoScriptText(SAY_DEATH, m_creature);
-
- if(pInstance)
- {
- pInstance->SetData(DATA_GRUULEVENT, DONE);
-
- GameObject* Door = NULL;
- Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
- if(Door)
- Door->SetGoState(0);
- }
+ m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
}
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
- DoZoneInCombat();
- if(pInstance)
- {
+ if (pInstance)
+ {
pInstance->SetData(DATA_GRUULEVENT, IN_PROGRESS);
-
- GameObject* Door = NULL;
- Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
- if(Door)
- Door->SetGoState(1);
- }
+ GameObject* EncounterDoor = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GRUULDOOR));
+ if (EncounterDoor)
+ EncounterDoor->SetGoState(1); //Close the encounter door, open it in JustDied/Reset
+ }
}
void KilledUnit()
{
switch(rand()%3)
{
- case 0: DoScriptText(SAY_SLAY1, m_creature); break;
- case 1: DoScriptText(SAY_SLAY2, m_creature); break;
- case 2: DoScriptText(SAY_SLAY3, m_creature); break;
+ case 0: DoScriptText(SAY_SLAY1, m_creature); break;
+ case 1: DoScriptText(SAY_SLAY2, m_creature); break;
+ case 2: DoScriptText(SAY_SLAY3, m_creature); break;
+ }
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ DoScriptText(SAY_DEATH, m_creature);
+
+ if(pInstance)
+ {
+ pInstance->SetData(DATA_GRUULEVENT, DONE);
+
+ GameObject* EncounterDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
+ if (EncounterDoor)
+ EncounterDoor->SetGoState(0); // Open the encounter door
}
}
@@ -139,14 +138,14 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
// Gruul can cast this spell up to 30 times
if (Growth_Timer < diff)
{
- DoCast(m_creature,SPELL_GROWTH);
DoScriptText(EMOTE_GROW, m_creature);
+ DoCast(m_creature,SPELL_GROWTH);
Growth_Timer = 30000;
}else Growth_Timer -= diff;
- if(PerformingGroundSlam)
+ if (PerformingGroundSlam)
{
- if(GroundSlamTimer < diff)
+ if (GroundSlamTimer < diff)
{
switch(GroundSlamStage)
{
@@ -162,7 +161,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
{
Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
- if(target && target->GetTypeId() == TYPEID_PLAYER)
+ if (target && target->GetTypeId() == TYPEID_PLAYER)
knockback_targets.push_back(target);
}
@@ -172,7 +171,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
Unit *target = *itr;
Unit *target2 = *(knockback_targets.begin() + rand()%knockback_targets.size());
- if(target && target2)
+ if (target && target2)
{
switch(rand()%2)
{
@@ -183,7 +182,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
}
GroundSlamTimer = 7000;
- break;
+ break;
}
case 1:
@@ -203,18 +202,15 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
}
GroundSlamTimer = 5000;
-
- break;
+ break;
}
case 2:
{
//The dummy shatter spell is cast
DoCast(m_creature, SPELL_SHATTER);
-
GroundSlamTimer = 1000;
-
- break;
+ break;
}
case 3:
@@ -239,20 +235,20 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear();
Unit *victim = m_creature->getVictim();
- if(victim)
+ if (victim)
{
m_creature->GetMotionMaster()->MoveChase(victim);
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, victim->GetGUID());
}
PerformingGroundSlam = false;
-
GroundSlamTimer =120000;
HurtfulStrike_Timer= 8000;
- if(Reverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter
+
+ if (Reverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter
Reverberation_Timer += 10000;
- break;
+ break;
}
}
@@ -281,7 +277,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
if (Reverberation_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_REVERBERATION, true);
- Reverberation_Timer = 30000;
+ Reverberation_Timer = 15000 + rand()%10000;
}else Reverberation_Timer -= diff;
// Cave In
@@ -290,7 +286,11 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_CAVE_IN);
- CaveIn_Timer = 20000;
+ if(CaveIn_StaticTimer >= 4000)
+ CaveIn_StaticTimer -= 2000;
+
+ CaveIn_Timer = CaveIn_StaticTimer;
+
}else CaveIn_Timer -= diff;
// Ground Slam, Gronn Lord's Grasp, Stoned, Shatter
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
index c731dd63ce7..68d89bccc2b 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -238,8 +238,8 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
DoScriptText(SAY_ENRAGE, m_creature);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
}
if(Phase2)
@@ -448,7 +448,7 @@ struct TRINITY_DLL_DECL boss_kiggler_the_crazedAI : public ScriptedAI
if(target)
DoCast(target, SPELL_GREATER_POLYMORPH);
- GreaterPolymorph_Timer = 20000;
+ GreaterPolymorph_Timer = 15000 + rand()%5000;
}else GreaterPolymorph_Timer -= diff;
//LightningBolt_Timer
@@ -487,13 +487,15 @@ struct TRINITY_DLL_DECL boss_blindeye_the_seerAI : public ScriptedAI
uint32 GreaterPowerWordShield_Timer;
uint32 Heal_Timer;
+ uint32 PrayerofHealing_Timer;
ScriptedInstance* pInstance;
void Reset()
{
GreaterPowerWordShield_Timer = 5000;
- Heal_Timer = 30000;
+ Heal_Timer = 25000 + rand()%15000;
+ PrayerofHealing_Timer = 45000 + rand()%10000;
//reset encounter
if (pInstance)
@@ -556,9 +558,16 @@ struct TRINITY_DLL_DECL boss_blindeye_the_seerAI : public ScriptedAI
if(Heal_Timer < diff)
{
DoCast(m_creature, SPELL_HEAL);
- Heal_Timer = 60000;
+ Heal_Timer = 15000 + rand()%25000;
}else Heal_Timer -= diff;
+ //PrayerofHealing_Timer
+ if (PrayerofHealing_Timer < diff)
+ {
+ DoCast(m_creature, SPELL_PRAYER_OH);
+ PrayerofHealing_Timer = 35000 + rand()%15000;
+ }else PrayerofHealing_Timer -= diff;
+
DoMeleeAttackIfReady();
}
};
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h b/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h
index 145e573f02a..7003dcb1e26 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h
@@ -1,19 +1,21 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
#ifndef DEF_GRUULS_LAIR_H
#define DEF_GRUULS_LAIR_H
-#define DATA_BLINDEYETHESEER 1
-#define DATA_GRUULEVENT 2
-#define DATA_KIGGLERTHECRAZED 3
-#define DATA_KROSHFIREHAND 4
-#define DATA_MAULGAREVENT 5
-#define DATA_MAULGAREVENT_TANK 6
-#define DATA_OLMTHESUMMONER 7
-#define DATA_MAULGARDOOR 8
-#define DATA_GRUULDOOR 9
-#define DATA_MAULGAR 10
+#define DATA_BLINDEYETHESEER 1
+#define DATA_GRUULEVENT 2
+#define DATA_KIGGLERTHECRAZED 3
+#define DATA_KROSHFIREHAND 4
+#define DATA_MAULGAREVENT 5
+#define DATA_MAULGAREVENT_TANK 6
+#define DATA_OLMTHESUMMONER 7
+#define DATA_MAULGARDOOR 8
+#define DATA_GRUULDOOR 9
+#define DATA_MAULGAR 10
+
+#define ERROR_INST_DATA "TSCR Error: Instance Data not set properly for Gruul's Lair instance (map 565). Encounters will be buggy."
#endif
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
index c5a82bff322..9ecd95176f0 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -74,7 +74,7 @@ struct TRINITY_DLL_DECL instance_gruuls_lair : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 18835: KigglerTheCrazed = creature->GetGUID(); break;
case 18836: BlindeyeTheSeer = creature->GetGUID(); break;
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_broggok.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_broggok.cpp
index 20bffd9052f..affe771babb 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_broggok.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_broggok.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,18 +6,18 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Boss_Broggok
-SD%Complete: 100
-SDComment:
+SD%Complete: 70
+SDComment: pre-event not made
SDCategory: Hellfire Citadel, Blood Furnace
EndScriptData */
@@ -51,25 +51,32 @@ struct TRINITY_DLL_DECL boss_broggokAI : public ScriptedAI
DoScriptText(SAY_AGGRO, m_creature);
}
- void UpdateAI(const uint32 diff)
+ void JustSummoned(Creature *summoned)
{
+ summoned->setFaction(16);
+ summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ summoned->CastSpell(summoned,SPELL_POISON,false,0,0,m_creature->GetGUID());
+ }
- if (!UpdateVictim())
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim() )
return;
- if(AcidSpray_Timer < diff)
+ if (AcidSpray_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SLIME_SPRAY);
AcidSpray_Timer = 4000+rand()%8000;
}else AcidSpray_Timer -=diff;
- if(PoisonBolt_Timer < diff)
+ if (PoisonBolt_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_POISON_BOLT);
PoisonBolt_Timer = 4000+rand()%8000;
}else PoisonBolt_Timer -=diff;
- if(PoisonSpawn_Timer < diff)
+ if (PoisonSpawn_Timer < diff)
{
DoCast(m_creature,SPELL_POISON_CLOUD);
PoisonSpawn_Timer = 20000;
@@ -79,17 +86,36 @@ struct TRINITY_DLL_DECL boss_broggokAI : public ScriptedAI
}
};
-CreatureAI* GetAI_boss_broggokAI(Creature *_Creature)
+struct TRINITY_DLL_DECL mob_broggok_poisoncloudAI : public ScriptedAI
+{
+ mob_broggok_poisoncloudAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+ void Reset() { }
+ void MoveInLineOfSight(Unit *who) { }
+ void AttackStart(Unit *who) { }
+ void Aggro(Unit* who) { }
+};
+
+CreatureAI* GetAI_boss_broggok(Creature *_Creature)
{
return new boss_broggokAI (_Creature);
}
+CreatureAI* GetAI_mob_broggok_poisoncloud(Creature *_Creature)
+{
+ return new mob_broggok_poisoncloudAI (_Creature);
+}
+
void AddSC_boss_broggok()
{
Script *newscript;
newscript = new Script;
- newscript->Name="boss_broggok";
- newscript->GetAI = &GetAI_boss_broggokAI;
+ newscript->Name = "boss_broggok";
+ newscript->GetAI = &GetAI_boss_broggok;
newscript->RegisterSelf();
-}
+ newscript = new Script;
+ newscript->Name = "mob_broggok_poisoncloud";
+ newscript->GetAI = &GetAI_mob_broggok_poisoncloud;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp
index 7959b9a60cd..2f8e2738fee 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_the_maker.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_the_maker.cpp
index 7e2f6b65cc8..5606719dc65 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_the_maker.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/blood_furnace/boss_the_maker.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
index 2118dcc203f..be9ae2525d8 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp
index bd4c5a9f170..608042cc43c 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/def_magtheridons_lair.h b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/def_magtheridons_lair.h
index 3c0012ce447..c5469acaea0 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/def_magtheridons_lair.h
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/def_magtheridons_lair.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp
index ea51e575824..1bdce52aea9 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -166,7 +166,7 @@ struct TRINITY_DLL_DECL instance_magtheridons_lair : public ScriptedInstance
Creature *Magtheridon = instance->GetCreatureInMap(MagtheridonGUID);
if(Magtheridon && Magtheridon->isAlive())
{
- Magtheridon->TextEmote("'s bonds begin to weaken!", 0);
+ Magtheridon->MonsterTextEmote("'s bonds begin to weaken!", 0);
CageTimer = 120000;
}
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp
index afd7fe9f117..ffe9efa2309 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -184,10 +184,11 @@ struct TRINITY_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI
void MoveInLineOfSight(Unit *who)
{
- if (!m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessiblePlaceFor(m_creature) )
- {
- if (!IntroOnce && m_creature->IsWithinDistInMap(who, 75))
+ if (!IntroOnce && m_creature->IsWithinDistInMap(who, 50.0f))
{
+ if (who->GetTypeId() != TYPEID_PLAYER)
+ return;
+
DoScriptText(SAY_INTRO, m_creature);
IntroOnce = true;
IsIntroEvent = true;
@@ -196,19 +197,10 @@ struct TRINITY_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI
pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS);
}
- if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE )
- return;
-
if (IsIntroEvent || !IsMainEvent)
return;
- float attackRadius = m_creature->GetAttackDistance(who);
- if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
- {
- //who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
- AttackStart(who);
- }
- }
+ ScriptedAI::MoveInLineOfSight(who);
}
void Aggro(Unit *who)
@@ -223,9 +215,13 @@ struct TRINITY_DLL_DECL boss_grand_warlock_nethekurseAI : public ScriptedAI
void JustSummoned(Creature *summoned)
{
- summoned->setFaction(14);
+ summoned->setFaction(16);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+
+ //triggered spell of consumption does not properly show it's SpellVisual, wrong spellid?
+ summoned->CastSpell(summoned,SPELL_TEMPORARY_VISUAL,true);
+ summoned->CastSpell(summoned,SPELL_CONSUMPTION,false,0,0,m_creature->GetGUID());
}
void KilledUnit(Unit* victim)
@@ -342,20 +338,24 @@ struct TRINITY_DLL_DECL mob_fel_orc_convertAI : public ScriptedAI
if (pInstance->GetData64(DATA_NETHEKURSE))
{
Creature *pKurse = (Creature*)Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_NETHEKURSE));
- if (pKurse)
+ if (pKurse && m_creature->GetDistance(pKurse) < 45.0f)
+ {
((boss_grand_warlock_nethekurseAI*)pKurse->AI())->DoYellForPeonAggro();
- }
- if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS )
- return;
- else pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS);
- }
+ if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS )
+ return;
+ else pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS);
+ }
+ }
+ }
}
void JustDied(Unit* Killer)
{
if (pInstance)
{
+ if (pInstance->GetData(TYPE_NETHEKURSE) != IN_PROGRESS)
+ return;
if (pInstance->GetData64(DATA_NETHEKURSE))
{
Creature *pKurse = (Creature*)Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_NETHEKURSE));
@@ -385,39 +385,10 @@ struct TRINITY_DLL_DECL mob_lesser_shadow_fissureAI : public ScriptedAI
{
mob_lesser_shadow_fissureAI(Creature *c) : ScriptedAI(c) {Reset();}
- bool Start;
- uint32 Stop_Timer;
-
- void Reset()
- {
- Start = false;
- Stop_Timer = 30000;
- }
-
+ void Reset() { }
+ void MoveInLineOfSight(Unit *who) { }
+ void AttackStart(Unit* who) { }
void Aggro(Unit* who) { }
-
- void MoveInLineOfSight(Unit *who) { return; }
-
- void AttackStart(Unit* who) { return; }
-
- void UpdateAI(const uint32 diff)
- {
- if (!Start)
- {
- //triggered spell of consumption does not properly show it's SpellVisual, hack it a bit
- m_creature->CastSpell(m_creature,SPELL_TEMPORARY_VISUAL,true);
- m_creature->CastSpell(m_creature,SPELL_CONSUMPTION,false);
- Start = true;
- }
-
- if (Stop_Timer < diff)
- {
- m_creature->setDeathState(JUST_DIED);
- m_creature->SetHealth(0);
- m_creature->CombatStop();
- m_creature->DeleteThreatList();
- }else Stop_Timer -= diff;
- }
};
CreatureAI* GetAI_boss_grand_warlock_nethekurse(Creature *_Creature)
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp
index 6b88d266cbf..9f241774cbe 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -157,8 +157,6 @@ struct TRINITY_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI
void Reset()
{
- m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
- m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
LeftHead = 0;
RightHead = 0;
@@ -176,6 +174,9 @@ struct TRINITY_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI
ThunderClap_Timer = 15000;
ResetThreat_Timer = 30000;
+ m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ m_creature->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
+
if (pInstance)
pInstance->SetData(TYPE_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid.
}
@@ -203,8 +204,8 @@ struct TRINITY_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI
void Aggro(Unit *who)
{
- DoSpawnCreature(ENTRY_LEFT_HEAD,0,0,0,0,TEMPSUMMON_TIMED_DESPAWN,1800000);
- DoSpawnCreature(ENTRY_RIGHT_HEAD,0,0,0,0,TEMPSUMMON_TIMED_DESPAWN,1800000);
+ DoSpawnCreature(ENTRY_LEFT_HEAD,0,0,0,0,TEMPSUMMON_TIMED_DESPAWN,90000);
+ DoSpawnCreature(ENTRY_RIGHT_HEAD,0,0,0,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,90000);
if (Unit *Left = Unit::GetUnit(*m_creature,LeftHead))
{
@@ -358,19 +359,19 @@ struct TRINITY_DLL_DECL boss_warbringer_omroggAI : public ScriptedAI
DoResetThreat();
m_creature->AddThreat(target, 0.0f);
}
- ResetThreat_Timer = 35000+rand()%10000;
+ ResetThreat_Timer = 25000+rand()%15000;
}else ResetThreat_Timer -= diff;
if (Fear_Timer < diff)
{
DoCast(m_creature,SPELL_FEAR);
- Fear_Timer = 15000+rand()%25000;
+ Fear_Timer = 15000+rand()%20000;
}else Fear_Timer -= diff;
if (ThunderClap_Timer < diff)
{
DoCast(m_creature,SPELL_THUNDERCLAP);
- ThunderClap_Timer = 25000+rand()%15000;
+ ThunderClap_Timer = 15000+rand()%15000;
}else ThunderClap_Timer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp
index dccfbaa0a8d..391ec9f4b93 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp
@@ -1,6 +1,39 @@
-/* Copyright (C) 2008 - 2009 BroodWyrm */
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Warchief_Kargath_Bladefist
+SD%Complete: 90
+SDComment:
+SDCategory: Hellfire Citadel, Shattered Halls
+EndScriptData */
+
+/* ContentData
+boss_warchief_kargath_bladefist
+EndContentData */
+
#include "precompiled.h"
+#define SAY_AGGRO1 -1540042
+#define SAY_AGGRO2 -1540043
+#define SAY_AGGRO3 -1540044
+#define SAY_SLAY1 -1540045
+#define SAY_SLAY2 -1540046
+#define SAY_DEATH -1540047
+
#define SPELL_BLADE_DANCE 30739
#define H_SPELL_CHARGE 25821
@@ -11,23 +44,10 @@
#define MOB_SHARPSHOOTER_GUARD 17622
#define MOB_REAVER_GUARD 17623
-float AssassEntrance[3] = {275.136,-84.29,2.3}; // y +-8
-float AssassExit[3] = {184.233,-84.29,2.3}; // y +-8
+float AssassEntrance[3] = {275.136,-84.29,2.3}; // y -8
+float AssassExit[3] = {184.233,-84.29,2.3}; // y -8
float AddsEntrance[3] = {306.036,-84.29,1.93};
-#define SOUND_AGGRO1 10323
-#define SAY_AGGRO1 "Ours is the true Horde! The only Horde!"
-#define SOUND_AGGRO2 10324
-#define SAY_AGGRO2 "I'll carve the meat from your bones!"
-#define SOUND_AGGRO3 10325
-#define SAY_AGGRO3 "I am called Bladefist for a reason, as you will see!"
-#define SOUND_SLAY1 10326
-#define SAY_SLAY1 "For the real Horde!"
-#define SOUND_SLAY2 10327
-#define SAY_SLAY2 "I am the only Warchief!"
-#define SOUND_DEATH 10328
-#define SAY_DEATH "The true Horde... will.. prevail.."
-
struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
{
boss_warchief_kargath_bladefistAI(Creature *c) : ScriptedAI(c)
@@ -51,11 +71,11 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
uint32 Assassins_Timer;
- uint32 summoned;
+ uint32 summoned;
bool InBlade;
uint32 target_num;
-
+
void Reset()
{
removeAdds();
@@ -68,8 +88,8 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
Wait_Timer = 0;
Charge_timer = 0;
- Blade_Dance_Timer = 30000;
- Summon_Assistant_Timer = 15000;
+ Blade_Dance_Timer = 45000;
+ Summon_Assistant_Timer = 30000;
Assassins_Timer = 5000;
resetcheck_timer = 5000;
}
@@ -78,18 +98,9 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
{
switch (rand()%3)
{
- case 0:
- DoPlaySoundToSet(m_creature,SOUND_AGGRO1);
- DoYell(SAY_AGGRO1,LANG_UNIVERSAL,NULL);
- break;
- case 1:
- DoPlaySoundToSet(m_creature,SOUND_AGGRO2);
- DoYell(SAY_AGGRO2,LANG_UNIVERSAL,NULL);
- break;
- case 2:
- DoPlaySoundToSet(m_creature,SOUND_AGGRO3);
- DoYell(SAY_AGGRO3,LANG_UNIVERSAL,NULL);
- break;
+ case 0:DoScriptText(SAY_AGGRO1, m_creature);break;
+ case 1:DoScriptText(SAY_AGGRO2, m_creature);break;
+ case 2:DoScriptText(SAY_AGGRO3, m_creature);break;
}
}
@@ -115,22 +126,15 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
{
switch(rand()%2)
{
- case 0:
- DoPlaySoundToSet(m_creature, SOUND_SLAY1);
- DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
- break;
- case 1:
- DoPlaySoundToSet(m_creature, SOUND_SLAY2);
- DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
- break;
+ case 0: DoScriptText(SAY_SLAY1, m_creature); break;
+ case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
}
void JustDied(Unit* Killer)
{
- DoPlaySoundToSet(m_creature, SOUND_DEATH);
- DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
+ DoScriptText(SAY_DEATH, m_creature);
removeAdds();
}
@@ -143,7 +147,7 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
if(id != 1)
return;
-
+
if(target_num > 0) // to prevent loops
{
Wait_Timer = 1;
@@ -159,8 +163,8 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
{
Unit* temp = Unit::GetUnit((*m_creature),*itr);
if(temp && temp->isAlive())
- {
- (*temp).GetMotionMaster()->Clear(true);
+ {
+ (*temp).GetMotionMaster()->Clear(true);
m_creature->DealDamage(temp,temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
((Creature*)temp)->RemoveCorpse();
}
@@ -181,15 +185,16 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
}
void SpawnAssassin()
{
- m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]+8, AssassEntrance[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
- m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]-8, AssassEntrance[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
- m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]+8, AssassExit[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
- m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]-8, AssassExit[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000);
+ m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]+8, AssassEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
+ m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]-8, AssassEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
+ m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]+8, AssassExit[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
+ m_creature->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]-8, AssassExit[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
}
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim() )
+ //Return since we have no target
+ if (!UpdateVictim())
return;
if(Assassins_Timer)
@@ -251,49 +256,49 @@ struct TRINITY_DLL_DECL boss_warchief_kargath_bladefistAI : public ScriptedAI
if (Summon_Assistant_Timer < diff)
{
Unit* target = NULL;
- Creature* Summoned;
+ Creature* Assistance;
for(int i = 0; i < summoned; i++)
{
switch(rand()%3)
{
- case 0: Summoned = m_creature->SummonCreature(MOB_HEARTHEN_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000); break;
- case 1: Summoned = m_creature->SummonCreature(MOB_SHARPSHOOTER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000); break;
- case 2: Summoned = m_creature->SummonCreature(MOB_REAVER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000); break;
+ case 0: Assistance = m_creature->SummonCreature(MOB_HEARTHEN_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break;
+ case 1: Assistance = m_creature->SummonCreature(MOB_SHARPSHOOTER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break;
+ case 2: Assistance = m_creature->SummonCreature(MOB_REAVER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break;
}
}
if(rand()%100 < 20) summoned++;
- Summon_Assistant_Timer = 15000 + (rand()%5000) ;
+ Summon_Assistant_Timer = 25000 + (rand()%10000) ;
}else Summon_Assistant_Timer -= diff;
DoMeleeAttackIfReady();
}
- if(resetcheck_timer < diff)
+ if (resetcheck_timer < diff)
{
uint32 tempx,tempy;
- tempx = m_creature->GetPositionX();
- tempy = m_creature->GetPositionY();
- if ( tempx > 255 || tempx < 205)
+ tempx = uint32(m_creature->GetPositionX());
+ tempy = uint32(m_creature->GetPositionY());
+ if (tempx > 255 || tempx < 205)
{
- EnterEvadeMode();
+ EnterEvadeMode();
}
resetcheck_timer = 5000;
- }else resetcheck_timer -= diff;
+ }else resetcheck_timer -= diff;
}
};
-
+
CreatureAI* GetAI_boss_warchief_kargath_bladefist(Creature *_Creature)
{
return new boss_warchief_kargath_bladefistAI (_Creature);
-}
-
+}
+
void AddSC_boss_warchief_kargath_bladefist()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_warchief_kargath_bladefist";
- newscript->GetAI = &GetAI_boss_warchief_kargath_bladefist;
+ newscript->GetAI = GetAI_boss_warchief_kargath_bladefist;
newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/def_shattered_halls.h b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/def_shattered_halls.h
index cb3a06055cb..cbfa23ec4e0 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/def_shattered_halls.h
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/def_shattered_halls.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp
index aa2817ca994..b606ff0f97e 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp b/src/bindings/scripts/scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp
index de466759f3d..0cb6b7a849e 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp b/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp
index d7d343e8d0d..93a5be1e19d 100644
--- a/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp
+++ b/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -293,8 +293,6 @@ struct TRINITY_DLL_DECL npc_wounded_blood_elfAI : public npc_escortAI
break;
case 13:
DoScriptText(SAY_ELF_RESTING, m_creature, player);
- // make the NPC kneel
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
break;
case 14:
DoScriptText(SAY_ELF_SUMMON2, m_creature, player);
diff --git a/src/bindings/scripts/scripts/zone/ironforge/ironforge.cpp b/src/bindings/scripts/scripts/zone/ironforge/ironforge.cpp
index 674bf56bb26..b17a280391a 100644
--- a/src/bindings/scripts/scripts/zone/ironforge/ironforge.cpp
+++ b/src/bindings/scripts/scripts/zone/ironforge/ironforge.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/isle_of_queldanas/isle_of_queldanas.cpp b/src/bindings/scripts/scripts/zone/isle_of_queldanas/isle_of_queldanas.cpp
index 9d2f1dbf7b9..c9ea67ac824 100644
--- a/src/bindings/scripts/scripts/zone/isle_of_queldanas/isle_of_queldanas.cpp
+++ b/src/bindings/scripts/scripts/zone/isle_of_queldanas/isle_of_queldanas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_curator.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_curator.cpp
index 1c7ea45cd3a..50eb20371f1 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_curator.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_curator.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,18 +6,18 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Boss_Curator
SD%Complete: 100
-SDComment: Evocation may cause client crash (Core related)
+SDComment:
SDCategory: Karazhan
EndScriptData */
@@ -34,10 +34,6 @@ EndScriptData */
//Flare spell info
#define SPELL_ASTRAL_FLARE_PASSIVE 30234 //Visual effect + Flare damage
-#define SPELL_ASTRAL_FLARE_NE 30236
-#define SPELL_ASTRAL_FLARE_NW 30239
-#define SPELL_ASTRAL_FLARE_SE 30240
-#define SPELL_ASTRAL_FLARE_SW 30241
//Curator spell info
#define SPELL_HATEFUL_BOLT 30383
@@ -45,7 +41,7 @@ EndScriptData */
#define SPELL_ENRAGE 30403 //Arcane Infusion: Transforms Curator and adds damage.
#define SPELL_BERSERK 26662
-struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
{
boss_curatorAI(Creature *c) : ScriptedAI(c) {Reset();}
@@ -69,8 +65,8 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
{
switch(rand()%2)
{
- case 0: DoScriptText(SAY_KILL1, m_creature); break;
- case 1: DoScriptText(SAY_KILL2, m_creature); break;
+ case 0: DoScriptText(SAY_KILL1, m_creature); break;
+ case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
@@ -89,18 +85,38 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
if (!UpdateVictim() )
return;
- if (Evocating && !m_creature->HasAura(SPELL_EVOCATION, 0))
- Evocating = false;
-
- if (m_creature->GetPower(POWER_MANA) <= 1000 && !Evocating)
+ //always decrease BerserkTimer
+ if (BerserkTimer < diff)
{
- DoScriptText(SAY_EVOCATE, m_creature);
- m_creature->InterruptNonMeleeSpells(false);
- DoCast(m_creature, SPELL_EVOCATION);
- Evocating = true;
- }
+ //if evocate, then break evocate
+ if (Evocating)
+ {
+ if (m_creature->HasAura(SPELL_EVOCATION))
+ m_creature->RemoveAurasDueToSpell(SPELL_EVOCATION);
+
+ Evocating = false;
+ }
+
+ //may not be correct SAY (generic hard enrage)
+ DoScriptText(SAY_ENRAGE, m_creature);
- if (!Enraged && !Evocating)
+ m_creature->InterruptNonMeleeSpells(true);
+ DoCast(m_creature, SPELL_BERSERK);
+
+ //don't know if he's supposed to do summon/evocate after hard enrage (probably not)
+ Enraged = true;
+ }else BerserkTimer -= diff;
+
+ if (Evocating)
+ {
+ //not supposed to do anything while evocate
+ if (m_creature->HasAura(SPELL_EVOCATION))
+ return;
+ else
+ Evocating = false;
+ }
+
+ if (!Enraged)
{
if (AddTimer < diff)
{
@@ -113,29 +129,40 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
{
AstralFlare->CastSpell(AstralFlare, SPELL_ASTRAL_FLARE_PASSIVE, false);
AstralFlare->AI()->AttackStart(target);
+ AstralFlare->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ AstralFlare->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
}
- //Reduce Mana by 10%
- int32 mana = (int32)(0.1f*(m_creature->GetMaxPower(POWER_MANA)));
- m_creature->ModifyPower(POWER_MANA, -mana);
- switch(rand()%4)
+ //Reduce Mana by 10% of max health
+ if (int32 mana = m_creature->GetMaxPower(POWER_MANA))
{
- case 0: DoScriptText(SAY_SUMMON1, m_creature);break;
- case 1: DoScriptText(SAY_SUMMON2, m_creature);break;
+ mana /= 10;
+ m_creature->ModifyPower(POWER_MANA, -mana);
+
+ //if this get's us below 10%, then we evocate (the 10th should be summoned now)
+ if (m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA) < 10)
+ {
+ DoScriptText(SAY_EVOCATE, m_creature);
+ m_creature->InterruptNonMeleeSpells(false);
+ DoCast(m_creature, SPELL_EVOCATION);
+ Evocating = true;
+ //no AddTimer cooldown, this will make first flare appear instantly after evocate end, like expected
+ return;
+ }
+ else
+ {
+ switch(rand()%4)
+ {
+ case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
+ case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
+ }
+ }
}
+
AddTimer = 10000;
}else AddTimer -= diff;
- if (HatefulBoltTimer < diff)
- {
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);
- DoCast(target, SPELL_HATEFUL_BOLT);
-
- HatefulBoltTimer = 15000;
- }else HatefulBoltTimer -= diff;
-
- if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 15)
+ if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 15)
{
Enraged = true;
DoCast(m_creature, SPELL_ENRAGE);
@@ -143,11 +170,17 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
}
}
- if (BerserkTimer < diff)
+ if (HatefulBoltTimer < diff)
{
- DoCast(m_creature, SPELL_BERSERK);
- DoScriptText(SAY_ENRAGE, m_creature);
- }else BerserkTimer -= diff;
+ if (Enraged)
+ HatefulBoltTimer = 7000;
+ else
+ HatefulBoltTimer = 15000;
+
+ if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1))
+ DoCast(target, SPELL_HATEFUL_BOLT);
+
+ }else HatefulBoltTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -162,8 +195,7 @@ void AddSC_boss_curator()
{
Script *newscript;
newscript = new Script;
- newscript->Name="boss_curator";
+ newscript->Name = "boss_curator";
newscript->GetAI = &GetAI_boss_curator;
newscript->RegisterSelf();
}
-
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_maiden_of_virtue.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_maiden_of_virtue.cpp
index b3f74f18ada..a8581a351ff 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_maiden_of_virtue.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_maiden_of_virtue.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -51,9 +51,9 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
void Reset()
{
- Repentance_Timer = 30000+(rand()%15000);
+ Repentance_Timer = 25000+(rand()%15000);
Holyfire_Timer = 8000+(rand()%17000);
- Holywrath_Timer = 20000+(rand()%10000);
+ Holywrath_Timer = 15000+(rand()%10000);
Holyground_Timer = 3000;
Enrage_Timer = 600000;
@@ -109,7 +109,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
case 0: DoScriptText(SAY_REPENTANCE1, m_creature);break;
case 1: DoScriptText(SAY_REPENTANCE2, m_creature);break;
}
- Repentance_Timer = 30000 + rand()%15000; //A little randomness on that spell
+ Repentance_Timer = 25000 + rand()%10000; //A little randomness on that spell
}else Repentance_Timer -= diff;
if (Holyfire_Timer < diff)
@@ -117,7 +117,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYFIRE);
- Holyfire_Timer = 8000 + rand()%17000; //Anywhere from 8 to 25 seconds, good luck having several of those in a row!
+ Holyfire_Timer = 8000 + rand()%15000; //Anywhere from 8 to 23 seconds, good luck having several of those in a row!
}else Holyfire_Timer -= diff;
if (Holywrath_Timer < diff)
@@ -125,7 +125,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYWRATH);
- Holywrath_Timer = 20000+(rand()%10000); //20-30 secs sounds nice
+ Holywrath_Timer = 20000+(rand()%5000); //20-30 secs sounds nice
}else Holywrath_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp
index 9c81d7a4cd6..440e4bdfec1 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_midnight.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -186,6 +186,9 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
void Reset()
{
ResetTimer = 2000;
+
+ m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
}
void Aggro(Unit* who) {}
@@ -284,6 +287,7 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
{
((boss_midnightAI*)(pMidnight->AI()))->Mount(m_creature);
m_creature->SetHealth(pMidnight->GetHealth());
+ DoResetThreat();
}
}
}
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
index 5a725f19789..52303a2abc8 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -321,6 +321,8 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
m_creature->setFaction(16);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
m_creature->AI()->AttackStart(m_creature->getVictim());
InVanish = false;
}else Wait_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_netherspite.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_netherspite.cpp
index b074dc920c1..6db1b193234 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_netherspite.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_netherspite.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp
index 8ed47127e16..aae8b56cdf7 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -136,9 +136,9 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
void HandleTerraceDoors(bool open)
{
if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_1)))
- Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(open ? 0 : 1);
if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_2)))
- Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(open ? 0 : 1);
}
void Aggro(Unit *who)
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp
index 73139d9c757..fe5c08ae45d 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -37,7 +37,7 @@ EndScriptData */
#define SAY_SUMMON2 -1532101
#define SAY_DEATH -1532102
-// 19 Coordinates for Infernal spawns
+// 18 Coordinates for Infernal spawns
struct InfernalPoint
{
float x,y;
@@ -64,11 +64,10 @@ static InfernalPoint InfernalPoints[] =
{-10948.8, -2005.1},
{-10984.0, -2019.3},
{-10932.8, -1979.6},
- {-10932.8, -1979.6},
{-10935.7, -1996.0}
};
-#define TOTAL_INFERNAL_POINTS 19
+#define TOTAL_INFERNAL_POINTS 18
//Enfeeble is supposed to reduce hp to 1 and then heal player back to full when it ends
//Along with reducing healing and regen while enfeebled to 0%
@@ -81,9 +80,10 @@ static InfernalPoint InfernalPoints[] =
#define SPELL_SW_PAIN 30854 //Shadow word pain during phase 1 and 3 (different targeting rules though)
#define SPELL_THRASH_PASSIVE 12787 //Extra attack chance during phase 2
#define SPELL_SUNDER_ARMOR 30901 //Sunder armor during phase 2
-#define SPELL_THRASH_AURA 3417 //Passive proc chance for thrash
+#define SPELL_THRASH_AURA 12787 //Passive proc chance for thrash
#define SPELL_EQUIP_AXES 30857 //Visual for axe equiping
-#define SPELL_AMPLIFY_DAMAGE 12738 //Amplifiy during phase 3
+#define SPELL_AMPLIFY_DAMAGE 39095 //Amplifiy during phase 3
+#define SPELL_CLEAVE 30131 //Same as Nightbane.
#define SPELL_HELLFIRE 30859 //Infenals' hellfire aura
#define NETHERSPITE_INFERNAL 17646 //The netherspite infernal creature
#define MALCHEZARS_AXE 17650 //Malchezar's axes (creatures), summoned during phase 3
@@ -169,6 +169,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
uint32 SWPainTimer;
uint32 SunderArmorTimer;
uint32 AmplifyDamageTimer;
+ uint32 Cleave_Timer;
uint32 InfernalTimer;
uint32 AxesTargetSwitchTimer;
uint32 InfernalCleanupTimer;
@@ -197,12 +198,14 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
EnfeebleTimer = 30000;
EnfeebleResetTimer = 38000;
- ShadowNovaTimer = 35000;
+ ShadowNovaTimer = 35500;
SWPainTimer = 20000;
- AmplifyDamageTimer = 10000;
+ AmplifyDamageTimer = 5000;
+ Cleave_Timer = 8000;
InfernalTimer = 45000;
InfernalCleanupTimer = 47000;
AxesTargetSwitchTimer = 7500 + rand()%12500;
+ SunderArmorTimer = 5000 + rand()%5000;
phase = 1;
if(pInstance)
@@ -289,11 +292,11 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
void ClearWeapons()
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
//damage
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
@@ -433,11 +436,11 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
m_creature->CastSpell(m_creature, SPELL_THRASH_AURA, true);
//models
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, AXE_EQUIP_MODEL);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, AXE_EQUIP_MODEL);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, AXE_EQUIP_MODEL);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, AXE_EQUIP_INFO);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, AXE_EQUIP_MODEL);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, AXE_EQUIP_INFO);
//damage
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
@@ -475,8 +478,8 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
Creature *axe = m_creature->SummonCreature(MALCHEZARS_AXE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
if(axe)
{
- axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, AXE_EQUIP_MODEL);
- axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
+ axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, AXE_EQUIP_MODEL);
+ //axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
axe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
axe->setFaction(m_creature->getFaction());
@@ -500,9 +503,16 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
if(SunderArmorTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SUNDER_ARMOR);
- SunderArmorTimer = 15000;
+ SunderArmorTimer = 10000 + rand()%8000;
}else SunderArmorTimer -= diff;
+
+ if (Cleave_Timer < diff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_CLEAVE);
+ Cleave_Timer = 6000 + rand()%6000;
+
+ }else Cleave_Timer -= diff;
}
else
{
@@ -544,13 +554,13 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
if(InfernalTimer < diff)
{
SummonInfernal(diff);
- InfernalTimer = phase == 3 ? 15000 : 45000; //15 secs in phase 3, 45 otherwise
+ InfernalTimer = phase == 3 ? 14500 : 44500; //15 secs in phase 3, 45 otherwise
}else InfernalTimer -= diff;
if(ShadowNovaTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SHADOWNOVA);
- ShadowNovaTimer = phase == 3 ? 35000 : -1;
+ ShadowNovaTimer = phase == 3 ? 31000 : -1;
}else ShadowNovaTimer -= diff;
if(phase != 2)
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_shade_of_aran.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_shade_of_aran.cpp
index 50a8e01f5dd..580cedf910b 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_shade_of_aran.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_shade_of_aran.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -274,8 +274,7 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
m_creature->CastSpell(m_creature, SPELL_MASS_POLY, true);
m_creature->CastSpell(m_creature, SPELL_CONJURE, false);
m_creature->CastSpell(m_creature, SPELL_DRINK, false);
- //Sitting down
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 1);
+ m_creature->SetStandState(UNIT_STAND_STATE_SIT);
DrinkInturruptTimer = 10000;
}
}
@@ -285,7 +284,7 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
{
Drinking = false;
m_creature->RemoveAurasDueToSpell(SPELL_DRINK);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->SetPower(POWER_MANA, m_creature->GetMaxPower(POWER_MANA)-32000);
m_creature->CastSpell(m_creature, SPELL_POTION, false);
}
@@ -296,7 +295,7 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
DrinkInturruptTimer -= diff;
else
{
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->CastSpell(m_creature, SPELL_POTION, true);
m_creature->CastSpell(m_creature, SPELL_AOE_PYROBLAST, false);
DrinkInturrupted = true;
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp
index a6cd3233301..1bad8750736 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -45,11 +45,10 @@ EndScriptData */
#define SPELL_FIENDISH_PORTAL 30171 // Opens portal and summons Fiendish Portal, 2 sec cast
#define SPELL_FIENDISH_PORTAL_1 30179 // Opens portal and summons Fiendish Portal, instant cast
-#define SPELL_FIREBOLT 18086 // Blasts a target for 150 Fire damage.
+#define SPELL_FIREBOLT 30050 // Blasts a target for 150 Fire damage.
#define SPELL_BROKEN_PACT 30065 // All damage taken increased by 25%.
#define SPELL_AMPLIFY_FLAMES 30053 // Increases the Fire damage taken by an enemy by 500 for 25 sec.
-#define SPELL_FIREBOLT 18086 // Blasts a target for 150 Fire damage.
#define CREATURE_DEMONCHAINS 17248
#define CREATURE_FIENDISHIMP 17267
@@ -80,8 +79,7 @@ struct TRINITY_DLL_DECL mob_kilrekAI : public ScriptedAI
void Reset()
{
TerestianGUID = 0;
-
- AmplifyTimer = 0;
+ AmplifyTimer = 2000;
}
void Aggro(Unit *who)
@@ -122,13 +120,10 @@ struct TRINITY_DLL_DECL mob_kilrekAI : public ScriptedAI
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature->getVictim(),SPELL_AMPLIFY_FLAMES);
- AmplifyTimer = 20000;
+ AmplifyTimer = 10000 + rand()%10000;
}else AmplifyTimer -= diff;
- //Chain cast
- if (!m_creature->IsNonMeleeSpellCasted(false) && m_creature->IsWithinDistInMap(m_creature->getVictim(), 30))
- DoCast(m_creature->getVictim(),SPELL_FIREBOLT);
- else DoMeleeAttackIfReady();
+ DoMeleeAttackIfReady();
}
};
@@ -180,6 +175,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
uint32 SummonTimer;
uint32 BerserkTimer;
+ bool ReSummon;
bool SummonKilrek;
bool SummonedPortals;
bool Berserk;
@@ -206,6 +202,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
SummonedPortals = false;
Berserk = false;
+ ReSummon = false;
if(pInstance)
pInstance->SetData(DATA_TERESTIAN_EVENT, NOT_STARTED);
@@ -217,8 +214,15 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
if(pInstance)
{
- // Put Kil'rek in combat against our target so players don't skip him
Creature* Kilrek = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KILREK)));
+
+ // Respawn Kil'rek on aggro if Kil'rek is dead.
+ if (!Kilrek || !Kilrek->isAlive())
+ {
+ Kilrek->Respawn();
+ }
+
+ // Put Kil'rek in combat against our target so players don't skip him
if(Kilrek && !Kilrek->getVictim())
Kilrek->AddThreat(who, 1.0f);
@@ -262,18 +266,22 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
if(CheckKilrekTimer < diff)
{
+
CheckKilrekTimer = 5000;
if(pInstance)
uint64 KilrekGUID = pInstance->GetData64(DATA_KILREK);
else ERROR_INST_DATA(m_creature);
- Creature* Kilrek = ((Creature*)Unit::GetUnit((*m_creature), KilrekGUID));
+ Creature* Kilrek = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KILREK)));
if(SummonKilrek && Kilrek)
{
Kilrek->Respawn();
if(Kilrek->AI())
+ {
Kilrek->AI()->AttackStart(m_creature->getVictim());
+ m_creature->RemoveAurasDueToSpell(SPELL_BROKEN_PACT);
+ }
SummonKilrek = false;
}
@@ -360,7 +368,9 @@ struct TRINITY_DLL_DECL mob_karazhan_impAI : public ScriptedAI
void Reset()
{
- FireboltTimer = 3000;
+ FireboltTimer = 2000;
+
+ m_creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
}
void Aggro(Unit *who) {}
@@ -374,7 +384,7 @@ struct TRINITY_DLL_DECL mob_karazhan_impAI : public ScriptedAI
if(FireboltTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FIREBOLT);
- FireboltTimer = 1500;
+ FireboltTimer = 2200;
}else FireboltTimer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp b/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp
index 8478bdca284..77026561ad7 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -91,7 +91,7 @@ void SummonCroneIfReady(ScriptedInstance* pInstance, Creature *_Creature)
pInstance->SetData(DATA_OPERA_OZ_DEATHCOUNT, 0); // Increment DeathCount
if(pInstance->GetData(DATA_OPERA_OZ_DEATHCOUNT) == 4)
{
- Creature* Crone = _Creature->SummonCreature(CREATURE_CRONE, -10891.96, -1755.95, _Creature->GetPositionZ(), 4.64, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
+ Creature* Crone = _Creature->SummonCreature(CREATURE_CRONE, -10891.96, -1755.95, _Creature->GetPositionZ(), 4.64, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
if(Crone)
{
if(_Creature->getVictim())
@@ -118,7 +118,6 @@ struct TRINITY_DLL_DECL boss_dorotheeAI : public ScriptedAI
bool SummonedTito;
bool TitoDied;
- bool InCombat;
void Reset()
{
@@ -130,7 +129,6 @@ struct TRINITY_DLL_DECL boss_dorotheeAI : public ScriptedAI
SummonedTito = false;
TitoDied = false;
- InCombat = false;
}
void Aggro(Unit* who)
@@ -209,13 +207,11 @@ struct TRINITY_DLL_DECL mob_titoAI : public ScriptedAI
}
uint64 DorotheeGUID;
-
uint32 YipTimer;
void Reset()
{
DorotheeGUID = 0;
-
YipTimer = 10000;
}
@@ -251,7 +247,7 @@ struct TRINITY_DLL_DECL mob_titoAI : public ScriptedAI
void boss_dorotheeAI::SummonTito()
{
- Creature* Tito = DoSpawnCreature(CREATURE_TITO, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
+ Creature* Tito = DoSpawnCreature(CREATURE_TITO, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
if(Tito)
{
DoScriptText(SAY_DOROTHEE_SUMMON, m_creature);
@@ -306,8 +302,15 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void SpellHit(Unit* caster, const SpellEntry *Spell)
{
- if((Spell->SchoolMask == SPELL_SCHOOL_MASK_FIRE) && (!(rand()%10)))
+ if ((Spell->SchoolMask == SPELL_SCHOOL_MASK_FIRE) && (!(rand()%10)))
+ {
+ /*
+ if (not direct damage(aoe,dot))
+ return;
+ */
+
DoCast(m_creature, SPELL_BURNING_STRAW, true);
+ }
}
void JustDied(Unit* killer)
@@ -577,9 +580,11 @@ struct TRINITY_DLL_DECL boss_croneAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
- GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT));
- if(Door)
- Door->UseDoorOrButton();
+
+ if (GameObject* lDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
+ lDoor->SetGoState(0);
+ if (GameObject* rDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT)))
+ rDoor->SetGoState(0);
}
}
@@ -716,7 +721,7 @@ bool GossipSelect_npc_grandmother(Player* player, Creature* _Creature, uint32 se
_Creature->SetVisibility(VISIBILITY_OFF);
float x,y,z;
_Creature->GetPosition(x,y,z);
- Creature* BigBadWolf = _Creature->SummonCreature(CREATURE_BIG_BAD_WOLF, x, y, z, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
+ Creature* BigBadWolf = _Creature->SummonCreature(CREATURE_BIG_BAD_WOLF, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
if(BigBadWolf)
{
BigBadWolf->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -772,9 +777,11 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
- GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT));
- if(Door)
- Door->UseDoorOrButton();
+
+ if (GameObject* lDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
+ lDoor->SetGoState(0);
+ if (GameObject* rDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT)))
+ rDoor->SetGoState(0);
}
}
@@ -807,8 +814,8 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
else
{
IsChasing = false;
- Unit* target = Unit::GetUnit((*m_creature), HoodGUID);
- if(target)
+
+ if (Unit* target = Unit::GetUnit((*m_creature), HoodGUID))
{
HoodGUID = 0;
if(DoGetThreat(target))
@@ -880,9 +887,9 @@ CreatureAI* GetAI_boss_bigbadwolf(Creature* _Creature)
#define SPELL_RES_VISUAL 24171
/*** Misc. Information ****/
-#define CREATURE_ROMULO 17533
-#define ROMULO_X -10900
-#define ROMULO_Y -1758
+#define CREATURE_ROMULO 17533
+#define ROMULO_X -10900
+#define ROMULO_Y -1758
enum RAJPhase
{
@@ -893,33 +900,28 @@ enum RAJPhase
void PretendToDie(Creature* _Creature)
{
- _Creature->InterruptNonMeleeSpells(false);
+ _Creature->InterruptNonMeleeSpells(true);
+ _Creature->RemoveAllAuras();
_Creature->SetHealth(0);
- _Creature->StopMoving();
- _Creature->ClearComboPointHolders();
- _Creature->RemoveAllAurasOnDeath();
- _Creature->ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
- _Creature->ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false);
_Creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- _Creature->ClearAllReactives();
- _Creature->SetUInt64Value(UNIT_FIELD_TARGET,0);
- _Creature->GetMotionMaster()->Clear();
+ _Creature->GetMotionMaster()->MovementExpired(false);
_Creature->GetMotionMaster()->MoveIdle();
- _Creature->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ _Creature->SetStandState(UNIT_STAND_STATE_DEAD);
};
void Resurrect(Creature* target)
{
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
target->SetHealth(target->GetMaxHealth());
- target->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ target->SetStandState(UNIT_STAND_STATE_STAND);
target->CastSpell(target, SPELL_RES_VISUAL, true);
if(target->getVictim())
{
- target->SetUInt64Value(UNIT_FIELD_TARGET, target->getVictim()->GetGUID());
target->GetMotionMaster()->MoveChase(target->getVictim());
target->AI()->AttackStart(target->getVictim());
}
+ else
+ target->GetMotionMaster()->Initialize();
};
struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
@@ -934,18 +936,21 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
ScriptedInstance* pInstance;
+ uint32 EntryYellTimer;
+ uint32 AggroYellTimer;
+
uint64 RomuloGUID;
uint32 Phase;
- uint32 EntryYellTimer;
- uint32 AggroYellTimer;
uint32 BlindingPassionTimer;
uint32 DevotionTimer;
uint32 EternalAffectionTimer;
uint32 PowerfulAttractionTimer;
uint32 SummonRomuloTimer;
uint32 ResurrectTimer;
+ uint32 DrinkPoisonTimer;
+ uint32 ResurrectSelfTimer;
bool IsFakingDeath;
bool SummonedRomulo;
@@ -961,15 +966,18 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
Romulo->DealDamage(Romulo, Romulo->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
- RomuloGUID = 0;
}
+ RomuloGUID = 0;
Phase = PHASE_JULIANNE;
BlindingPassionTimer = 30000;
DevotionTimer = 15000;
EternalAffectionTimer = 25000;
PowerfulAttractionTimer = 5000;
+ SummonRomuloTimer = 10000;
+ DrinkPoisonTimer = 0;
+ ResurrectSelfTimer = 0;
if(IsFakingDeath)
Resurrect(m_creature);
@@ -997,6 +1005,15 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
ScriptedAI::MoveInLineOfSight(who);
}
+ void SpellHit(Unit* caster, const SpellEntry *Spell)
+ {
+ if (Spell->Id == SPELL_DRINK_POISON)
+ {
+ DoScriptText(SAY_JULIANNE_DEATH01, m_creature);
+ DrinkPoisonTimer = 2500;
+ }
+ }
+
void DamageTaken(Unit* done_by, uint32 &damage);
void JustDied(Unit* killer)
@@ -1006,9 +1023,11 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
if(pInstance)
{
pInstance->SetData(DATA_OPERA_EVENT, DONE);
- GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT));
- if(Door)
- Door->UseDoorOrButton();
+
+ if (GameObject* lDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
+ lDoor->SetGoState(0);
+ if (GameObject* rDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT)))
+ rDoor->SetGoState(0);
}
}
@@ -1024,13 +1043,15 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
{
boss_romuloAI(Creature* c) : ScriptedAI(c)
{
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
EntryYellTimer = 8000;
AggroYellTimer = 15000;
}
+
+ ScriptedInstance* pInstance;
uint64 JulianneGUID;
-
uint32 Phase;
uint32 EntryYellTimer;
@@ -1041,22 +1062,19 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
uint32 PoisonThrustTimer;
uint32 ResurrectTimer;
- bool JulianneDead;
bool IsFakingDeath;
+ bool JulianneDead;
void Reset()
{
JulianneGUID = 0;
-
Phase = PHASE_ROMULO;
BackwardLungeTimer = 15000;
DaringTimer = 20000;
DeadlySwatheTimer = 25000;
PoisonThrustTimer = 10000;
-
- if(IsFakingDeath)
- Resurrect(m_creature);
+ ResurrectTimer = 10000;
IsFakingDeath = false;
JulianneDead = false;
@@ -1089,6 +1107,16 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoScriptText(SAY_ROMULO_DEATH, m_creature);
+
+ if (pInstance)
+ {
+ pInstance->SetData(DATA_OPERA_EVENT, DONE);
+
+ if (GameObject* lDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
+ lDoor->SetGoState(0);
+ if (GameObject* rDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORRIGHT)))
+ rDoor->SetGoState(0);
+ }
}
void KilledUnit(Unit* victim)
@@ -1101,137 +1129,169 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
void boss_julianneAI::DamageTaken(Unit* done_by, uint32 &damage)
{
- if(damage < m_creature->GetHealth() || done_by == m_creature || done_by->GetGUID() == RomuloGUID)
+ if (damage < m_creature->GetHealth())
return;
+ //anything below only used if incoming damage will kill
+
if(Phase == PHASE_JULIANNE)
{
- DoScriptText(SAY_JULIANNE_DEATH01, m_creature);
+ damage = 0;
+
+ //this means already drinking, so return
+ if (IsFakingDeath)
+ return;
+
m_creature->InterruptNonMeleeSpells(true);
DoCast(m_creature, SPELL_DRINK_POISON);
- PretendToDie(m_creature);
- Phase = PHASE_ROMULO;
- damage = 0;
+
IsFakingDeath = true;
- SummonRomuloTimer = 10000;
+ //IS THIS USEFULL? Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
return;
}
- if(!IsFakingDeath)
+ if (Phase == PHASE_ROMULO)
{
- Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID));
- if(Romulo && Romulo->isAlive() && !((boss_romuloAI*)Romulo->AI())->IsFakingDeath)
- {
- ((boss_romuloAI*)Romulo->AI())->ResurrectTimer = 10000;
- ((boss_romuloAI*)Romulo->AI())->JulianneDead = true;
- }
- else
+ error_log("TSCR: boss_julianneAI: cannot take damage in PHASE_ROMULO, why was i here?");
+ damage = 0;
+ return;
+ }
+
+ if (Phase == PHASE_BOTH)
+ {
+ //if this is true then we have to kill romulo too
+ if (RomuloDead)
{
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- if(Romulo)
+ if (Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID)))
{
- Romulo->DealDamage(Romulo, Romulo->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
Romulo->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Romulo->GetMotionMaster()->Clear();
+ Romulo->setDeathState(JUST_DIED);
+ Romulo->CombatStop();
+ Romulo->DeleteThreatList();
+ Romulo->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
- JustDied(done_by);
+ return;
}
- IsFakingDeath = true;
- PretendToDie(m_creature);
- damage = 0;
+ //if not already returned, then romulo is alive and we can pretend die
+ if (Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID)))
+ {
+ PretendToDie(m_creature);
+ IsFakingDeath = true;
+ ((boss_romuloAI*)Romulo->AI())->ResurrectTimer = 10000;
+ ((boss_romuloAI*)Romulo->AI())->JulianneDead = true;
+ damage = 0;
+ return;
+ }
}
- else
- damage = 0;
+ error_log("TSCR: boss_julianneAI: DamageTaken reach end of code, that should not happen.");
}
void boss_romuloAI::DamageTaken(Unit* done_by, uint32 &damage)
{
- if(damage < m_creature->GetHealth() || done_by == m_creature || done_by->GetGUID() == JulianneGUID)
+ if (damage < m_creature->GetHealth())
return;
- if(!IsFakingDeath)
+ //anything below only used if incoming damage will kill
+
+ if (Phase == PHASE_ROMULO)
{
- IsFakingDeath = true;
+ DoScriptText(SAY_ROMULO_DEATH, m_creature);
PretendToDie(m_creature);
+ IsFakingDeath = true;
+ Phase = PHASE_BOTH;
- if(Phase == PHASE_BOTH)
+ if (Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID)))
{
- Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
- if(Julianne && Julianne->isAlive() && !((boss_julianneAI*)Julianne->AI())->IsFakingDeath)
- {
- ((boss_julianneAI*)Julianne->AI())->ResurrectTimer = 10000;
- ((boss_julianneAI*)Julianne->AI())->RomuloDead = true;
- }
- else
- {
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- if(Julianne)
- {
- Julianne->DealDamage(Julianne, Julianne->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- Julianne->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- }
- JustDied(done_by);
- }
+ ((boss_julianneAI*)Julianne->AI())->RomuloDead = true;
+ ((boss_julianneAI*)Julianne->AI())->ResurrectSelfTimer = 10000;
}
- else
+
+ damage = 0;
+ return;
+ }
+
+ if (Phase == PHASE_BOTH)
+ {
+ if (JulianneDead)
{
- Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
- if(Julianne)
+ if (Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID)))
{
- Resurrect(Julianne);
- m_creature->SetHealth(m_creature->GetMaxHealth());
- ((boss_julianneAI*)Julianne->AI())->ResurrectTimer = 4000;
- ((boss_julianneAI*)Julianne->AI())->RomuloDead = true;
- ((boss_julianneAI*)Julianne->AI())->Phase = PHASE_BOTH;
- ((boss_julianneAI*)Julianne->AI())->IsFakingDeath = false;
+ Julianne->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Julianne->GetMotionMaster()->Clear();
+ Julianne->setDeathState(JUST_DIED);
+ Julianne->CombatStop();
+ Julianne->DeleteThreatList();
+ Julianne->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
- Phase = PHASE_BOTH;
+ return;
}
- damage = 0;
+ if (Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID)))
+ {
+ PretendToDie(m_creature);
+ IsFakingDeath = true;
+ ((boss_julianneAI*)Julianne->AI())->ResurrectTimer = 10000;
+ ((boss_julianneAI*)Julianne->AI())->RomuloDead = true;
+ damage = 0;
+ return;
+ }
}
- if(IsFakingDeath) damage = 0;
+ error_log("TSCR: boss_romuloAI: DamageTaken reach end of code, that should not happen.");
}
void boss_julianneAI::UpdateAI(const uint32 diff)
{
if(EntryYellTimer)
{
- if(EntryYellTimer < diff)
+ if (EntryYellTimer <= diff)
{
DoScriptText(SAY_JULIANNE_ENTER, m_creature);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
EntryYellTimer = 0;
}else EntryYellTimer -= diff;
}
if(AggroYellTimer)
{
- if(AggroYellTimer < diff)
+ if (AggroYellTimer <= diff)
{
DoScriptText(SAY_JULIANNE_AGGRO, m_creature);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->setFaction(16);
AggroYellTimer = 0;
}else AggroYellTimer -= diff;
}
- if(Phase == PHASE_ROMULO && !SummonedRomulo)
+ if (DrinkPoisonTimer)
+ {
+ //will do this 2secs after spell hit. this is time to display visual as expected
+ if (DrinkPoisonTimer <= diff)
+ {
+ PretendToDie(m_creature);
+ Phase = PHASE_ROMULO;
+ SummonRomuloTimer = 10000;
+ DrinkPoisonTimer = 0;
+ }else DrinkPoisonTimer -= diff;
+ }
+
+ if (Phase == PHASE_ROMULO && !SummonedRomulo)
{
if(SummonRomuloTimer < diff)
{
- Creature* Romulo = m_creature->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 45000);
+ Creature* Romulo = m_creature->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
if(Romulo)
{
RomuloGUID = Romulo->GetGUID();
((boss_romuloAI*)Romulo->AI())->JulianneGUID = m_creature->GetGUID();
((boss_romuloAI*)Romulo->AI())->Phase = PHASE_ROMULO;
+ Romulo->setFaction(16);
+
if(m_creature->getVictim())
{
- Romulo->AI()->AttackStart(m_creature->getVictim());
- Romulo->AddThreat(m_creature->getVictim(), 50.0f);
+ Romulo->AddThreat(m_creature->getVictim(), 0.0f);
}
DoZoneInCombat(Romulo);
}
@@ -1239,7 +1299,23 @@ void boss_julianneAI::UpdateAI(const uint32 diff)
}else SummonRomuloTimer -= diff;
}
- if(!UpdateVictim() ||IsFakingDeath)
+ if (ResurrectSelfTimer)
+ {
+ if (ResurrectSelfTimer <= diff)
+ {
+ Resurrect(m_creature);
+ Phase = PHASE_BOTH;
+ IsFakingDeath = false;
+
+ if (m_creature->getVictim())
+ AttackStart(m_creature->getVictim());
+
+ ResurrectSelfTimer = 0;
+ ResurrectTimer = 1000;
+ }else ResurrectSelfTimer -= diff;
+ }
+
+ if(!UpdateVictim() || IsFakingDeath)
return;
if(RomuloDead)
@@ -1252,9 +1328,9 @@ void boss_julianneAI::UpdateAI(const uint32 diff)
DoScriptText(SAY_JULIANNE_RESURRECT, m_creature);
Resurrect(Romulo);
((boss_romuloAI*)Romulo->AI())->IsFakingDeath = false;
+ RomuloDead = false;
ResurrectTimer = 10000;
}
- RomuloDead = false;
}else ResurrectTimer -= diff;
}
@@ -1281,10 +1357,8 @@ void boss_julianneAI::UpdateAI(const uint32 diff)
if(rand()%2 == 1 && SummonedRomulo)
{
Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID));
- if(Romulo && Romulo->isAlive() && !((boss_romuloAI*)Romulo->AI())->IsFakingDeath)
+ if (Romulo && Romulo->isAlive() && !RomuloDead)
DoCast(Romulo, SPELL_ETERNAL_AFFECTION);
- else
- return;
}else DoCast(m_creature, SPELL_ETERNAL_AFFECTION);
EternalAffectionTimer = 45000 + rand()%15000;
@@ -1308,9 +1382,9 @@ void boss_romuloAI::UpdateAI(const uint32 diff)
DoScriptText(SAY_ROMULO_RESURRECT, m_creature);
Resurrect(Julianne);
((boss_julianneAI*)Julianne->AI())->IsFakingDeath = false;
+ JulianneDead = false;
ResurrectTimer = 10000;
}
- JulianneDead = false;
}else ResurrectTimer -= diff;
}
diff --git a/src/bindings/scripts/scripts/zone/karazhan/def_karazhan.h b/src/bindings/scripts/scripts/zone/karazhan/def_karazhan.h
index d08911d9c76..4304477de2a 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/def_karazhan.h
+++ b/src/bindings/scripts/scripts/zone/karazhan/def_karazhan.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
index f274e81b5c4..72a839cc5bd 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -46,6 +46,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
instance_karazhan(Map* map) : ScriptedInstance(map) {Initialize();}
uint32 Encounters[ENCOUNTERS];
+ std::string str_data;
uint32 OperaEvent;
uint32 OzDeathCount;
@@ -197,7 +198,19 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
}
if(data == DONE)
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
+ << Encounters[3] << " " << Encounters[4] << " " << Encounters[5] << " " << Encounters[6] << " "
+ << Encounters[7] << " " << Encounters[8] << " " << Encounters[9] << " " << Encounters[10];
+
+ str_data = saveStream.str();
+
SaveToDB();
+ OUT_SAVE_INST_DATA_COMPLETE;
+ }
}
void SetData64(uint32 identifier, uint64 data)
@@ -240,20 +253,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
const char* Save()
{
- OUT_SAVE_INST_DATA;
- std::ostringstream stream;
- stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " " << Encounters[3] << " "
- << Encounters[4] << " " << Encounters[5] << " " << Encounters[6] << " " << Encounters[7] << " "
- << Encounters[8] << " " << Encounters[9] << " " << Encounters[10];
- char* out = new char[stream.str().length() + 1];
- strcpy(out, stream.str().c_str());
- if(out)
- {
- OUT_SAVE_INST_DATA_COMPLETE;
- return out;
- }
-
- return NULL;
+ return str_data.c_str();
}
void Load(const char* in)
@@ -265,8 +265,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
}
OUT_LOAD_INST_DATA(in);
- std::istringstream stream(in);
- stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]
+ std::istringstream loadStream(in);
+ loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]
>> Encounters[4] >> Encounters[5] >> Encounters[6] >> Encounters[7]
>> Encounters[8] >> Encounters[9] >> Encounters[10];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
diff --git a/src/bindings/scripts/scripts/zone/karazhan/karazhan.cpp b/src/bindings/scripts/scripts/zone/karazhan/karazhan.cpp
index 144eea914c2..c1246b444df 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/karazhan.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/karazhan.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -46,6 +46,10 @@ EndContentData */
#define SAY_RAJ_INTRO1 "The romantic plays are really tough, but you'll do better this time. You have TALENT. Ready?"
#define RAJ_GOSSIP1 "I've never been more ready."
+#define OZ_GM_GOSSIP1 "[GM] Change event to EVENT_OZ"
+#define OZ_GM_GOSSIP2 "[GM] Change event to EVENT_HOOD"
+#define OZ_GM_GOSSIP3 "[GM] Change event to EVENT_RAJ"
+
struct Dialogue
{
int32 textid;
@@ -182,6 +186,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
}
IsBeingEscorted = false;
PerformanceReady = true;
+ m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
break;
}
}
@@ -378,6 +383,13 @@ bool GossipHello_npc_barnes(Player* player, Creature* _Creature)
{
player->ADD_GOSSIP_ITEM(0, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (player->isGameMaster())
+ {
+ player->ADD_GOSSIP_ITEM(5, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ player->ADD_GOSSIP_ITEM(5, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ player->ADD_GOSSIP_ITEM(5, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ }
+
if(!((npc_barnesAI*)_Creature->AI())->RaidWiped)
player->SEND_GOSSIP_MENU(8970, _Creature->GetGUID());
else
@@ -395,11 +407,25 @@ bool GossipSelect_npc_barnes(Player *player, Creature *_Creature, uint32 sender,
player->ADD_GOSSIP_ITEM(0, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
player->SEND_GOSSIP_MENU(8971, _Creature->GetGUID());
break;
-
case GOSSIP_ACTION_INFO_DEF+2:
player->CLOSE_GOSSIP_MENU();
((npc_barnesAI*)_Creature->AI())->StartEvent();
break;
+ case GOSSIP_ACTION_INFO_DEF+3:
+ player->CLOSE_GOSSIP_MENU();
+ ((npc_barnesAI*)_Creature->AI())->Event = EVENT_OZ;
+ outstring_log("TSCR: player (GUID %i) manually set Opera event to EVENT_OZ",player->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF+4:
+ player->CLOSE_GOSSIP_MENU();
+ ((npc_barnesAI*)_Creature->AI())->Event = EVENT_HOOD;
+ outstring_log("TSCR: player (GUID %i) manually set Opera event to EVENT_HOOD",player->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF+5:
+ player->CLOSE_GOSSIP_MENU();
+ ((npc_barnesAI*)_Creature->AI())->Event = EVENT_RAJ;
+ outstring_log("TSCR: player (GUID %i) manually set Opera event to EVENT_RAJ",player->GetGUID());
+ break;
}
return true;
@@ -526,25 +552,25 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
{
case 0: return 9999999;
case 1:
- m_creature->Yell(SAY_DIALOG_MEDIVH_1,LANG_UNIVERSAL,NULL);
+ m_creature->MonsterYell(SAY_DIALOG_MEDIVH_1,LANG_UNIVERSAL,NULL);
return 10000;
case 2:
if(arca)
- ((Creature*)arca)->Yell(SAY_DIALOG_ARCANAGOS_2,LANG_UNIVERSAL,NULL);
+ ((Creature*)arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_2,LANG_UNIVERSAL,NULL);
return 20000;
case 3:
- m_creature->Yell(SAY_DIALOG_MEDIVH_3,LANG_UNIVERSAL,NULL);
+ m_creature->MonsterYell(SAY_DIALOG_MEDIVH_3,LANG_UNIVERSAL,NULL);
return 10000;
case 4:
if(arca)
- ((Creature*)arca)->Yell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, NULL);
+ ((Creature*)arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, NULL);
return 20000;
case 5:
- m_creature->Yell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, NULL);
+ m_creature->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, NULL);
return 20000;
case 6:
if(arca)
- ((Creature*)arca)->Yell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, NULL);
+ ((Creature*)arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, NULL);
return 10000;
case 7:
FireArcanagosTimer = 500;
@@ -554,7 +580,7 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
DoCast(m_creature, SPELL_MANA_SHIELD);
return 10000;
case 9:
- m_creature->TextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false);
+ m_creature->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false);
return 10000;
case 10:
if(arca)
@@ -562,7 +588,7 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
return 1000;
case 11:
if(arca)
- ((Creature*)arca)->Yell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, NULL);
+ ((Creature*)arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, NULL);
return 5000;
case 12:
arca->GetMotionMaster()->MovePoint(0, -11010.82,-1761.18, 156.47);
@@ -571,7 +597,7 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
arca->SetSpeed(MOVE_FLIGHT, 2.0f);
return 10000;
case 13:
- m_creature->Yell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, NULL);
+ m_creature->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, NULL);
return 10000;
case 14:
m_creature->SetVisibility(VISIBILITY_OFF);
diff --git a/src/bindings/scripts/scripts/zone/loch_modan/loch_modan.cpp b/src/bindings/scripts/scripts/zone/loch_modan/loch_modan.cpp
index d79f581d1c8..b838fc97aab 100644
--- a/src/bindings/scripts/scripts/zone/loch_modan/loch_modan.cpp
+++ b/src/bindings/scripts/scripts/zone/loch_modan/loch_modan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp
index 72ce8097dd1..f8304b409b3 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,18 +6,18 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Boss_Felblood_Kaelthas
SD%Complete: 80
-SDComment: Normal and Heroic Support. Issues: Arcane Spheres do not initially follow targets. TODO: Convert Phoenix to ACID.
+SDComment: Normal and Heroic Support. Issues: Arcane Spheres do not initially follow targets.
SDCategory: Magisters' Terrace
EndScriptData */
@@ -25,7 +25,7 @@ EndScriptData */
#include "def_magisters_terrace.h"
#include "WorldPacket.h"
-#define SAY_AGGRO -1585023 //This yell should be done when the room is cleared. For now, set it as aggro yell.
+#define SAY_AGGRO -1585023 //This yell should be done when the room is cleared. For now, set it as a movelineofsight yell.
#define SAY_PHOENIX -1585024
#define SAY_FLAMESTRIKE -1585025
#define SAY_GRAVITY_LAPSE -1585026
@@ -36,13 +36,12 @@ EndScriptData */
/*** Spells ***/
// Phase 1 spells
-
#define SPELL_FIREBALL_NORMAL 44189 // Deals 2700-3300 damage at current target
#define SPELL_FIREBALL_HEROIC 46164 // 4950-6050
#define SPELL_PHOENIX 44194 // Summons a phoenix (Doesn't work?)
-#define SPELL_PHOENIX_BURN 44198 // A spell Phoenix uses to damage everything around
-#define SPELL_PHOENIX_FIREBALL 44202 // Phoenix casts this in phase 2 and stops moving
+#define SPELL_PHOENIX_BURN 44197 // A spell Phoenix uses to damage everything around
+#define SPELL_REBIRTH_DMG 44196 // DMG if a Phoenix rebirth happen
#define SPELL_FLAMESTRIKE1_NORMAL 44190 // Damage part
#define SPELL_FLAMESTRIKE1_HEROIC 46163 // Heroic damage part
@@ -53,7 +52,6 @@ EndScriptData */
#define SPELL_PYROBLAST 36819 // Heroic only; 45-55k fire damage
// Phase 2 spells
-
#define SPELL_GRAVITY_LAPSE_INITIAL 44224 // Cast at the beginning of every Gravity Lapse
#define SPELL_GRAVITY_LAPSE_CHANNEL 44251 // Channeled; blue beam animation to every enemy in range
#define SPELL_TELEPORT_CENTER 44218 // Should teleport people to the center. Requires DB entry in spell_target_position.
@@ -68,16 +66,14 @@ EndScriptData */
#define CREATURE_ARCANE_SPHERE 24708
/** Locations **/
-float KaelLocations[6][2]=
+float KaelLocations[3][2]=
{
- {148.744659, 181.377426},//center
- {140.823883, 195.403046},//phoenixpos1
- {156.574188, 195.650482},//phoenixpos2
- {149.813, 160.917},//spherepos1
- {167.223, 173.594},//spherepos2
- {130.68, 173.007},//spherepos3
+ {148.744659, 181.377426},
+ {140.823883, 195.403046},
+ {156.574188, 195.650482},
};
-#define LOCATION_Z -16.727455
+
+#define LOCATION_Z -16.727455
struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
@@ -108,6 +104,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
bool FirstGravityLapse;
bool Heroic;
+ bool HasTaunted;
uint8 Phase;
// 0 = Not started
@@ -118,7 +115,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
// TODO: Timers
FireballTimer = 0;
- PhoenixTimer = 30000;
+ PhoenixTimer = 10000;
FlameStrikeTimer = 25000;
CombatPulseTimer = 0;
@@ -128,55 +125,57 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
GravityLapsePhase = 0;
FirstGravityLapse = true;
+ HasTaunted = false;
Phase = 0;
- if(pInstance)
- {
- if(m_creature->isDead())
- pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
- else
- pInstance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED);
- }
- }
+ if (pInstance)
+ pInstance->SetData(DATA_KAELTHAS_EVENT, 0);
- void KilledUnit(Unit* victim)
- {
- if(victim && (victim->GetTypeId() == TYPEID_PLAYER))
- {
- victim->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
- victim->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT);
- WorldPacket data(12);
- data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY);
- data.append(victim->GetPackGUID());
- data << uint32(0);
- victim->SendMessageToSet(&data, true);
- }
+ GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_KAEL_DOOR));
+ if (Door)
+ Door->SetGoState(0); // Open the big encounter door. Close it in Aggro and open it only in JustDied(and here)
+ // Small door opened after event are expected to be closed by default
}
+
void JustDied(Unit *killer)
{
- RemoveGravityLapse();
DoScriptText(SAY_DEATH, m_creature);
- if(pInstance)
- pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
+ GameObject* EncounterDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_KAEL_DOOR));
+ if (EncounterDoor)
+ EncounterDoor->SetGoState(0); // Open the encounter door
}
void DamageTaken(Unit* done_by, uint32 &damage)
{
- if(damage > m_creature->GetHealth())
+ if (damage > m_creature->GetHealth())
RemoveGravityLapse(); // Remove Gravity Lapse so that players fall to ground if they kill him when in air.
}
void Aggro(Unit *who)
{
- DoScriptText(SAY_AGGRO, m_creature);
- if(pInstance)
- pInstance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS);
+ if (pInstance)
+ {
+ GameObject* EncounterDoor = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_KAEL_DOOR));
+ if (EncounterDoor)
+ EncounterDoor->SetGoState(1); //Close the encounter door, open it in JustDied/Reset
+ }
+ }
+
+ void MoveInLineOfSight(Unit *who)
+ {
+ if (!HasTaunted && m_creature->IsWithinDistInMap(who, 40.0))
+ {
+ DoScriptText(SAY_AGGRO, m_creature);
+ HasTaunted = true;
+ }
+
+ ScriptedAI::MoveInLineOfSight(who);
}
void SetThreatList(Creature* SummonedUnit)
{
- if(!SummonedUnit)
+ if (!SummonedUnit)
return;
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
@@ -184,114 +183,86 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
for(i = m_threatlist.begin(); i != m_threatlist.end(); i++)
{
Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
- if(pUnit && pUnit->isAlive())
+ if (pUnit && pUnit->isAlive())
{
- float threat = DoGetThreat(pUnit);
- SummonedUnit->AddThreat(pUnit, 0.1f);
+ float threat = m_creature->getThreatManager().getThreat(pUnit);
+ SummonedUnit->AddThreat(pUnit, threat);
}
}
}
- void EnterEvadeMode()
- {
- RemoveGravityLapse();
- m_creature->InterruptNonMeleeSpells(true);
- m_creature->RemoveAllAuras();
- m_creature->DeleteThreatList();
- m_creature->CombatStop();
- m_creature->LoadCreaturesAddon();
-
- if( m_creature->isAlive() )
- m_creature->GetMotionMaster()->MoveTargetedHome();
-
- m_creature->SetLootRecipient(NULL);
-
- InCombat = false;
- Reset();
- }
-
void TeleportPlayersToSelf()
{
- float x,y,z;
- m_creature->Relocate(KaelLocations[0][0], KaelLocations[0][1], LOCATION_Z, 0);
- Map *map = m_creature->GetMap();
- Map::PlayerList const &PlayerList = map->GetPlayers();
- Map::PlayerList::const_iterator i;
- for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ float x = KaelLocations[0][0];
+ float y = KaelLocations[0][1];
+ m_creature->Relocate(x, y, LOCATION_Z, 0);
+ //m_creature->SendMonsterMove(x, y, LOCATION_Z, 0, 0, 0); // causes some issues...
+ std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin();
+ for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i)
{
- if (Player* i_pl = i->getSource())
- if(i_pl->isAlive())
- {
- i_pl->CastSpell(i_pl, SPELL_TELEPORT_CENTER, true);
- m_creature->GetNearPoint(m_creature,x,y,z,5,5,0);
- i_pl->TeleportTo(m_creature->GetMapId(),x,y,LOCATION_Z,i_pl->GetOrientation());
- }
+ Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
+ if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER))
+ pUnit->CastSpell(pUnit, SPELL_TELEPORT_CENTER, true);
}
DoCast(m_creature, SPELL_TELEPORT_CENTER, true);
}
void CastGravityLapseKnockUp()
{
- Map *map = m_creature->GetMap();
- Map::PlayerList const &PlayerList = map->GetPlayers();
- Map::PlayerList::const_iterator i;
- for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin();
+ for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i)
{
- if (Player* i_pl = i->getSource())
- if(i_pl->isAlive())
+ Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
+ if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER))
// Knockback into the air
- i_pl->CastSpell(i_pl, SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, m_creature->GetGUID());
+ pUnit->CastSpell(pUnit, SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, m_creature->GetGUID());
}
}
void CastGravityLapseFly() // Use Fly Packet hack for now as players can't cast "fly" spells unless in map 530. Has to be done a while after they get knocked into the air...
{
- Map *map = m_creature->GetMap();
- Map::PlayerList const &PlayerList = map->GetPlayers();
- Map::PlayerList::const_iterator i;
- for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin();
+ for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i)
{
- if (Player* i_pl = i->getSource())
+ Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
+ if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER))
{
- if(i_pl->isAlive())
- {
- // Also needs an exception in spell system.
- i_pl->CastSpell(i_pl, SPELL_GRAVITY_LAPSE_FLY, true, 0, 0, m_creature->GetGUID());
- // Use packet hack
- WorldPacket data(12);
- data.SetOpcode(SMSG_MOVE_SET_CAN_FLY);
- data.append(i_pl->GetPackGUID());
- data << uint32(0);
- i_pl->SendMessageToSet(&data, true);
- i_pl->SetSpeed(MOVE_FLIGHT, 2.0f);
- }
+ // Also needs an exception in spell system.
+ pUnit->CastSpell(pUnit, SPELL_GRAVITY_LAPSE_FLY, true, 0, 0, m_creature->GetGUID());
+ // Use packet hack
+ WorldPacket data(12);
+ data.SetOpcode(SMSG_MOVE_SET_CAN_FLY);
+ data.append(pUnit->GetPackGUID());
+ data << uint32(0);
+ pUnit->SendMessageToSet(&data, true);
}
}
}
void RemoveGravityLapse()
{
- Map *map = m_creature->GetMap();
- Map::PlayerList const &PlayerList = map->GetPlayers();
- Map::PlayerList::const_iterator i;
- for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin();
+ for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i)
{
- if(Player* i_pl = i->getSource())
+ Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid());
+ if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER))
{
- i_pl->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
- i_pl->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT);
+ pUnit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
+ pUnit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT);
+
WorldPacket data(12);
data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY);
- data.append(i_pl->GetPackGUID());
+ data.append(pUnit->GetPackGUID());
data << uint32(0);
- i_pl->SendMessageToSet(&data, true);
+ pUnit->SendMessageToSet(&data, true);
}
}
}
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ //Return since we have no target
+ if (!UpdateVictim())
return;
switch(Phase)
@@ -299,9 +270,9 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
case 0:
{
// *Heroic mode only:
- if(Heroic)
+ if (Heroic)
{
- if(PyroblastTimer < diff)
+ if (PyroblastTimer < diff)
{
DoCast(m_creature, SPELL_SHOCK_BARRIER, true);
DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
@@ -309,56 +280,47 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
}else PyroblastTimer -= diff;
}
- if(FireballTimer < diff)
+ if (FireballTimer < diff)
{
DoCast(m_creature->getVictim(), Heroic ? SPELL_FIREBALL_HEROIC : SPELL_FIREBALL_NORMAL);
FireballTimer = 2000 + rand()%4000;
}else FireballTimer -= diff;
- if(PhoenixTimer < diff)
+ if (PhoenixTimer < diff)
{
+
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,1);
+
uint32 random = rand()%2 + 1;
float x = KaelLocations[random][0];
float y = KaelLocations[random][1];
- Creature* Phoenix = m_creature->SummonCreature(CREATURE_PHOENIX, x, y, LOCATION_Z, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000);
- if(Phoenix)
+
+ Creature* Phoenix = m_creature->SummonCreature(CREATURE_PHOENIX, x, y, LOCATION_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
+ if (Phoenix)
{
Phoenix->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
SetThreatList(Phoenix);
- Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1);
- if(target)
- {
- Phoenix->AddThreat(target,1000);
- Phoenix->Attack(target,true);
- Phoenix->GetMotionMaster()->MoveChase(target);
- }
- else
- {
- Phoenix->AddThreat(m_creature->getVictim(),1000);
- Phoenix->Attack(m_creature->getVictim(),true);
- Phoenix->GetMotionMaster()->MoveChase(m_creature->getVictim());
- }
+ Phoenix->AI()->AttackStart(target);
}
DoScriptText(SAY_PHOENIX, m_creature);
- PhoenixTimer = 40000;
+ PhoenixTimer = 60000;
}else PhoenixTimer -= diff;
- if(FlameStrikeTimer < diff)
+ if (FlameStrikeTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
- m_creature->InterruptNonMeleeSpells(false);
DoCast(target, SPELL_FLAMESTRIKE3, true);
DoScriptText(SAY_FLAMESTRIKE, m_creature);
-
- FlameStrikeTimer = 20000 + rand()%5000;
}
+ FlameStrikeTimer = 15000 + rand()%10000;
}else FlameStrikeTimer -= diff;
// Below 50%
- if(m_creature->GetMaxHealth() * 0.5 > m_creature->GetHealth())
+ if (m_creature->GetMaxHealth() * 0.5 > m_creature->GetHealth())
{
m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
m_creature->StopMoving();
@@ -368,34 +330,35 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
GravityLapsePhase = 0;
Phase = 1;
}
+
DoMeleeAttackIfReady();
}
break;
case 1:
{
- m_creature->StopMoving();
- if(GravityLapseTimer < diff)
+ if (GravityLapseTimer < diff)
{
switch(GravityLapsePhase)
{
case 0:
- if(FirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse
+ if (FirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse
{
DoScriptText(SAY_GRAVITY_LAPSE, m_creature);
FirstGravityLapse = false;
- if(pInstance)
+
+ if (pInstance)
{
GameObject* KaelLeft = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_KAEL_STATUE_LEFT));
- if(KaelLeft) KaelLeft->SetGoState(0);
+ if (KaelLeft) KaelLeft->SetGoState(0);
GameObject* KaelRight = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_KAEL_STATUE_RIGHT));
- if(KaelRight) KaelRight->SetGoState(0);
+ if (KaelRight) KaelRight->SetGoState(0);
}
}else
{
DoScriptText(SAY_RECAST_GRAVITY, m_creature);
}
- m_creature->StopMoving();
+
DoCast(m_creature, SPELL_GRAVITY_LAPSE_INITIAL);
GravityLapseTimer = 2000 + diff;// Don't interrupt the visual spell
GravityLapsePhase = 1;
@@ -417,31 +380,23 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
CastGravityLapseFly();
GravityLapseTimer = 30000;
GravityLapsePhase = 4;
+
+
for(uint8 i = 0; i < 3; ++i)
{
- Creature* Orb = m_creature->SummonCreature(CREATURE_ARCANE_SPHERE,KaelLocations[3+i][0],KaelLocations[3+i][1],LOCATION_Z,0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000);
- if(Orb)
- {
- SetThreatList(Orb);
- Unit *target = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,i);
- if(target)
- {
- Orb->AddThreat(target,1000);
- Orb->Attack(target,true);
- Orb->GetMotionMaster()->MoveChase(target);
- }
- else
- {
- Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0);
- if(ntarget)
- {
- Orb->AddThreat(ntarget,1000);
- Orb->Attack(ntarget,true);
- Orb->GetMotionMaster()->MoveChase(ntarget);
- }
- }
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,0);
+
+ Creature* Orb = DoSpawnCreature(CREATURE_ARCANE_SPHERE, 5, 5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
+ if (Orb && target)
+ {
+ //SetThreatList(Orb);
+ Orb->AddThreat(target, 1.0f);
+ Orb->AI()->AttackStart(target);
}
+
}
+
DoCast(m_creature, SPELL_GRAVITY_LAPSE_CHANNEL);
break;
@@ -486,7 +441,7 @@ struct TRINITY_DLL_DECL mob_felkael_flamestrikeAI : public ScriptedAI
void MoveInLineOfSight(Unit *who) {}
void UpdateAI(const uint32 diff)
{
- if(FlameStrikeTimer < diff)
+ if (FlameStrikeTimer < diff)
{
DoCast(m_creature, Heroic ? SPELL_FLAMESTRIKE1_HEROIC : SPELL_FLAMESTRIKE1_NORMAL, true);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
@@ -496,214 +451,188 @@ struct TRINITY_DLL_DECL mob_felkael_flamestrikeAI : public ScriptedAI
struct TRINITY_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI
{
- mob_felkael_phoenixAI(Creature *c) : ScriptedAI(c)
+ mob_felkael_phoenixAI(Creature* c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
- uint32 BurnTimer;
- uint32 CheckTimer;
- uint8 phase;
+
ScriptedInstance* pInstance;
- bool end;
+ uint32 BurnTimer;
+ uint32 Death_Timer;
+ bool Rebirth;
+ bool FakeDeath;
void Reset()
{
- m_creature->SetSpeed(MOVE_RUN, 0.5f);
- m_creature->SetSpeed(MOVE_WALK, 0.5f);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+ m_creature->CastSpell(m_creature,SPELL_PHOENIX_BURN,true);
BurnTimer = 2000;
- CheckTimer = 1000;
- phase = 0;
- end = false;
+ Death_Timer = 2700;
+ Rebirth = false;
+ FakeDeath = false;
}
void Aggro(Unit* who) {}
- void JustDied(Unit* slayer)
+ void DamageTaken(Unit* pKiller, uint32 &damage)
{
- if (end)
+ if (damage < m_creature->GetHealth())
+ return;
+
+ //Prevent glitch if in fake death
+ if (FakeDeath)
+ {
+ damage = 0;
return;
- DoSpawnCreature(CREATURE_PHOENIX_EGG, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 45000);
+
+ }
+ //Don't really die in all phases of Kael'Thas
+ if (pInstance && pInstance->GetData(DATA_KAELTHAS_EVENT) == 0)
+ {
+ //prevent death
+ damage = 0;
+ FakeDeath = true;
+
+ m_creature->InterruptNonMeleeSpells(false);
+ m_creature->SetHealth(0);
+ m_creature->StopMoving();
+ m_creature->ClearComboPointHolders();
+ m_creature->RemoveAllAurasOnDeath();
+ m_creature->ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
+ m_creature->ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false);
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ m_creature->ClearAllReactives();
+ m_creature->SetUInt64Value(UNIT_FIELD_TARGET,0);
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MoveIdle();
+ m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
+
+ }
+
+ }
+
+ void JustDied(Unit* slayer)
+ {
+ DoSpawnCreature(CREATURE_PHOENIX_EGG, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
}
void UpdateAI(const uint32 diff)
{
- if(CheckTimer < diff)
- {
- if (pInstance)
+
+ //If we are fake death, we cast revbirth and after that we kill the phoenix to spawn the egg.
+ if (FakeDeath)
+ {
+ if (!Rebirth)
{
- Creature *boss = ((Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL)));
- if (boss)
+ DoCast(m_creature, SPELL_REBIRTH_DMG);
+ Rebirth = true;
+ }
+
+ if (Rebirth)
+ {
+
+ if (Death_Timer < diff)
{
- phase = ((boss_felblood_kaelthasAI*)boss->AI())->Phase;
- if(boss->isDead() || !boss->isInCombat())
- {
- end = true;
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self
- }
- }
+ DoSpawnCreature(CREATURE_PHOENIX_EGG, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
+ m_creature->setDeathState(JUST_DIED);
+ m_creature->RemoveCorpse();
+ Rebirth = false;
+ }else Death_Timer -= diff;
}
- CheckTimer = 1000;
- }else CheckTimer -= diff;
+
+
+ }
if (!UpdateVictim())
return;
if (BurnTimer < diff)
{
- if(!phase)
- {
- DoCast(m_creature, SPELL_PHOENIX_BURN);
- m_creature->DealDamage(m_creature, 1500, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self
- }
- else
- {
- m_creature->StopMoving();
- DoCast(m_creature->getVictim(), SPELL_PHOENIX_FIREBALL);
- }
- BurnTimer = 2000;
- }else BurnTimer -= diff;
+ //spell Burn should possible do this, but it doesn't, so do this for now.
+ uint32 dmg = urand(1650,2050);
+ m_creature->DealDamage(m_creature, dmg, 0, DOT, SPELL_SCHOOL_MASK_FIRE, NULL, false);
+ BurnTimer += 2000;
+ } BurnTimer -= diff;
- //DoMeleeAttackIfReady();
+
+ DoMeleeAttackIfReady();
}
};
-struct TRINITY_DLL_DECL mob_felkael_phoenix_eggAI : public Scripted_NoMovementAI
+struct TRINITY_DLL_DECL mob_felkael_phoenix_eggAI : public ScriptedAI
{
- mob_felkael_phoenix_eggAI(Creature *c) : Scripted_NoMovementAI(c)
- {
- pInstance = ((ScriptedInstance*)c->GetInstanceData());
- Reset();
- }
+ mob_felkael_phoenix_eggAI(Creature *c) : ScriptedAI(c) {Reset();}
uint32 HatchTimer;
- ScriptedInstance* pInstance;
- void Reset() { HatchTimer = 15000; }
+
+ void Reset()
+ {
+ HatchTimer = 10000;
+
+ }
void Aggro(Unit* who) {}
void MoveInLineOfSight(Unit* who) {}
+
void UpdateAI(const uint32 diff)
{
-
- if(HatchTimer < diff)
+ if (HatchTimer < diff)
{
- Creature *bird = DoSpawnCreature(CREATURE_PHOENIX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000);
- if (bird)
- {
- Unit *boss = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL));
- if (boss && boss->getVictim())
- {
- bird->AddThreat(boss->getVictim(),100);
- bird->Attack(boss->getVictim(),true);
- bird->GetMotionMaster()->MoveChase(boss->getVictim());
- }
- }
+ DoSpawnCreature(CREATURE_PHOENIX, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}else HatchTimer -= diff;
+
}
};
struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI
{
- mob_arcane_sphereAI(Creature *c) : ScriptedAI(c)
- {
- pInstance = ((ScriptedInstance*)c->GetInstanceData());
- Reset();
- }
+ mob_arcane_sphereAI(Creature *c) : ScriptedAI(c) {Reset();}
+
uint32 DespawnTimer;
uint32 ChangeTargetTimer;
- uint32 CheckTimer;
-
- ScriptedInstance* pInstance;
void Reset()
{
- m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
DespawnTimer = 30000;
- ChangeTargetTimer = 5000;
- CheckTimer = 1000;
- m_creature->SetSpeed(MOVE_RUN, 0.5f);
- m_creature->SetSpeed(MOVE_WALK, 0.5f);
+ ChangeTargetTimer = 6000 + rand()%6000;
+
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
m_creature->setFaction(14);
DoCast(m_creature, SPELL_ARCANE_SPHERE_PASSIVE, true);
}
+
void Aggro(Unit* who) {}
- void StalkTarget(Unit* target)
- {
- if(!target)
- return;
- m_creature->AddThreat(target,100000);
- m_creature->GetMotionMaster()->MoveChase(target);
- m_creature->Attack(target,true);
- }
void UpdateAI(const uint32 diff)
{
- if(DespawnTimer < diff)
+ if (DespawnTimer < diff)
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
else DespawnTimer -= diff;
- if(!UpdateVictim())
- ChangeTargetTimer = 0;
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
- if(ChangeTargetTimer < diff)
+ if (ChangeTargetTimer < diff)
{
- DoResetThreat();
- Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0);
- if (ntarget)
- StalkTarget(ntarget);
- ChangeTargetTimer = 10000;
- }else ChangeTargetTimer -= diff;
- if(CheckTimer < diff)
- {
- if (pInstance)
- {
- Creature *boss = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL));
- if(boss)
- {
- if(!((boss_felblood_kaelthasAI*)boss->AI())->Phase || boss->isDead())
- DespawnTimer = 0;
- }else DespawnTimer = 0;
- }
- CheckTimer = 1000;
- }else CheckTimer -= diff;
- }
-};
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,0);
+ if (target)
+ m_creature->AddThreat(target, 1.0f);
+ m_creature->TauntApply(target);
+ AttackStart(target);
-bool GOHello_go_kael_orb(Player *player, GameObject* _GO)
-{
- ScriptedInstance* pInst = (ScriptedInstance*)_GO->GetInstanceData();
- if (pInst && player)
- {
- Unit *kael = Unit::GetUnit((*_GO),pInst->GetData64(DATA_KAEL));
- if (kael && kael->isDead())
- player->TeleportTo(530, 12888, -6876, 9, 0.3);
- }
- return true;
-}
-
-bool GOHello_go_movie_orb(Player *player, GameObject* _GO)
-{
- if (player)
- {
- WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4);
- data << (uint32)164;
- player->GetSession()->SendPacket(&data);
-
- if (player->GetQuestStatus(11490) == QUEST_STATUS_INCOMPLETE)
- {
- Unit *qUnit = player->SummonCreature(25042,player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()-10,0,TEMPSUMMON_CORPSE_DESPAWN,0);
- if(qUnit)
- player->DealDamage(qUnit, qUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
+ ChangeTargetTimer = 5000 + rand()%10000;
+ }else ChangeTargetTimer -= diff;
}
- return true;
-}
+};
CreatureAI* GetAI_boss_felblood_kaelthas(Creature* c)
{
@@ -745,28 +674,18 @@ void AddSC_boss_felblood_kaelthas()
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="mob_felkael_phoenix";
+ newscript->Name = "mob_felkael_phoenix";
newscript->GetAI = &GetAI_mob_felkael_phoenix;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="mob_felkael_phoenix_egg";
+ newscript->Name = "mob_felkael_phoenix_egg";
newscript->GetAI = &GetAI_mob_felkael_phoenix_egg;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="mob_felkael_flamestrike";
+ newscript->Name = "mob_felkael_flamestrike";
newscript->GetAI = &GetAI_mob_felkael_flamestrike;
newscript->RegisterSelf();
-
- newscript = new Script;
- newscript->Name="go_kael_orb";
- newscript->pGOHello = &GOHello_go_kael_orb;
- newscript->RegisterSelf();
-
- newscript = new Script;
- newscript->Name="go_movie_orb";
- newscript->pGOHello = &GOHello_go_movie_orb;
- newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
index c027d3a4b90..1a0c7743933 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -98,8 +98,8 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Adds.clear();
- //SummonAdds();
Reset();
+ SummonAdds();
Heroic = c->GetMap()->IsHeroic();
}
@@ -122,7 +122,6 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void Reset()
{
- m_creature->SetCorpseDelay(60*60*1000);
LackeysKilled = 0;
PlayersKilled = 0;
@@ -136,13 +135,11 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
CheckAdds();
- if(pInstance)
+ if (pInstance)
{
+ pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED);
pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 0);
- if (m_creature->isDead())
- pInstance->SetData(DATA_DELRISSA_EVENT, DONE);
- else pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED);
- }else error_log(ERROR_INST_DATA);
+ } else error_log(ERROR_INST_DATA);
}
void Aggro(Unit* who)
@@ -156,8 +153,6 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void SummonAdds()
{
- /*if (m_creature->isDead())
- return;*/
std::vector<uint32> AddList;
for(uint8 i = 0; i < 8; ++i)
AddList.push_back(AddEntry[i]);
@@ -168,7 +163,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
for(uint8 i = 0; i < AddList.size(); ++i)
{
Creature* pAdd = m_creature->SummonCreature(AddList[i], LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
- if(pAdd)
+ if (pAdd)
{
Add* nAdd = new Add(AddList[i], pAdd->GetGUID());
Adds.push_back(nAdd);
@@ -178,51 +173,47 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void CheckAdds()
{
- //if (m_creature->isDead())
- // return;
- if(Adds.empty())
- {
- SummonAdds();
+ if (Adds.empty())
return;
- }
+
for(uint8 i = 0; i < Adds.size(); ++i)
{
+ bool resummon = true;
+
Creature* pAdd = ((Creature*)Unit::GetUnit(*m_creature, Adds[i]->guid));
- if(pAdd && pAdd->isAlive())
+ if (pAdd && pAdd->isAlive())
{
- pAdd->AI()->EnterEvadeMode();
- pAdd->GetMotionMaster()->MovePoint(0,LackeyLocations[i][0], LackeyLocations[i][1], POS_Z);
+ pAdd->AI()->EnterEvadeMode(); // Force them out of combat and reset if they are in combat.
+ resummon = false;
}
- if(!pAdd || (pAdd && pAdd->isDead()))
+
+ if (resummon)
{
- if(pAdd)
- pAdd->RemoveCorpse();//looks stupid if mob is alive but has a dead corpse in front of him :)
- Creature* pAdd = m_creature->SummonCreature(Adds[i]->entry, LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
- if(pAdd)
- Adds[i]->guid = pAdd->GetGUID();
+ pAdd = m_creature->SummonCreature(Adds[i]->entry, LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
+ Add* nAdd = new Add(Adds[i]->entry, pAdd->GetGUID());
+ Adds.erase(Adds.begin() + i);
+ Adds.push_back(nAdd);
}
}
}
void KilledUnit(Unit* victim)
{
- if(victim->GetTypeId() != TYPEID_PLAYER || m_creature->isDead())
+ if (victim->GetTypeId() != TYPEID_PLAYER)
return;
DoScriptText(PlayerDeath[PlayersKilled].id, m_creature);
- if( PlayersKilled < 4 )
+
+ if (PlayersKilled < 4)
++PlayersKilled;
}
void KilledLackey()
{
- if(m_creature->isDead())//no sense to talk if dead..
- return;
DoScriptText(LackeyDeath[LackeysKilled].id, m_creature);
- if( LackeysKilled < 3 )
- ++LackeysKilled;
- CheckLootable();
+ if (LackeysKilled < 3)
+ ++LackeysKilled;
}
void JustDied(Unit* killer)
@@ -231,21 +222,21 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
CheckLootable();
- if(!pInstance)
+ if (!pInstance)
{
error_log(ERROR_INST_DATA);
return;
}
- pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 1);
pInstance->SetData(DATA_DELRISSA_EVENT, DONE);
- if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_DELRISSA_DOOR)))
+
+ if (GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_DELRISSA_DOOR)))
Door->SetGoState(0);
}
void CheckLootable()
{
- if(pInstance && pInstance->GetData(DATA_DELRISSA_DEATH_COUNT) >= 4)
+ if (LackeysKilled > 3)
m_creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
else
m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
@@ -253,30 +244,30 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ if (!UpdateVictim())
return;
- if(HealTimer < diff)
+ if (HealTimer < diff)
{
uint32 health = m_creature->GetHealth();
Unit* target = m_creature;
for(uint8 i = 0; i < Adds.size(); ++i)
- if(Unit* pAdd = Unit::GetUnit(*m_creature, Adds[i]->guid))
- if(pAdd->isAlive() && pAdd->GetHealth() < health)
+ if (Unit* pAdd = Unit::GetUnit(*m_creature, Adds[i]->guid))
+ if (pAdd->isAlive() && pAdd->GetHealth() < health)
target = pAdd;
DoCast(target, SPELL_FLASH_HEAL);
HealTimer = 15000;
}else HealTimer -= diff;
- if(RenewTimer < diff)
+ if (RenewTimer < diff)
{
Unit* target = m_creature;
- if(rand()%2 == 1)
+ if (rand()%2 == 1)
{
std::vector<Add*>::iterator itr = Adds.begin() + rand()%Adds.size();
Unit* pAdd = Unit::GetUnit(*m_creature, (*itr)->guid);
- if(pAdd && pAdd->isAlive())
+ if (pAdd && pAdd->isAlive())
target = pAdd;
}
DoCast(target,Heroic ? SPELL_RENEW_HEROIC : SPELL_RENEW_NORMAL);
@@ -286,44 +277,44 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
if(ShieldTimer < diff)
{
Unit* target = m_creature;
- if(rand()%2 == 1)
+ if (rand()%2 == 1)
{
std::vector<Add*>::iterator itr = Adds.begin() + rand()%Adds.size();
- if(Unit* pAdd = Unit::GetUnit(*m_creature, (*itr)->guid))
- if(!pAdd->HasAura(SPELL_SHIELD, 0) && pAdd->isAlive())
+ if (Unit* pAdd = Unit::GetUnit(*m_creature, (*itr)->guid))
+ if (!pAdd->HasAura(SPELL_SHIELD, 0) && pAdd->isAlive())
target = pAdd;
}
DoCast(target, SPELL_SHIELD);
ShieldTimer = 7500;
}else ShieldTimer -= diff;
- if(DispelTimer < diff)
+ if (DispelTimer < diff)
{
Unit* target = NULL;
bool friendly = false;
- if(rand()%2 == 1)
+ if (rand()%2 == 1)
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
else
{
friendly = true;
- if(rand()%2 == 1)
+ if (rand()%2 == 1)
target = m_creature;
else
{
std::vector<Add*>::iterator itr = Adds.begin() + rand()%Adds.size();
Unit* pAdd = Unit::GetUnit(*m_creature, (*itr)->guid);
- if(pAdd && pAdd->isAlive())
+ if (pAdd && pAdd->isAlive())
target = pAdd;
}
}
- if(target)
+ if (target)
{
DoCast(target, SPELL_DISPEL_MAGIC);
DispelTimer = 12000;
}
}else DispelTimer -= diff;
- if(SWPainTimer < diff)
+ if (SWPainTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0),Heroic ? SPELL_SW_PAIN_HEROIC : SPELL_SW_PAIN_NORMAL);
SWPainTimer = 10000;
@@ -370,12 +361,7 @@ struct TRINITY_DLL_DECL boss_priestess_guestAI : public ScriptedAI
void Reset()
{
UsedPotion = false;
- if(pInstance)
- {
- Creature *boss = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA)));
- if (boss && boss->isDead())
- boss->Respawn();
- }
+
ResetThreatTimer = 5000 + rand()%15000; // These guys like to switch targets often, and are not meant to be tanked.
}
@@ -383,46 +369,47 @@ struct TRINITY_DLL_DECL boss_priestess_guestAI : public ScriptedAI
void JustDied(Unit* killer)
{
- if(!pInstance)
+ if (!pInstance)
{
error_log(ERROR_INST_DATA);
return;
}
Creature* Delrissa = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA)));
- if(Delrissa)
+ if (Delrissa)
{
+ pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 1);
+
((boss_priestess_delrissaAI*)Delrissa->AI())->KilledLackey();
- if(!Delrissa->isAlive() && pInstance->GetData(DATA_DELRISSA_DEATH_COUNT) > 3)
- ((boss_priestess_delrissaAI*)Delrissa->AI())->CheckLootable();
- pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 1);
+ if (!Delrissa->isAlive() && pInstance->GetData(DATA_DELRISSA_DEATH_COUNT) > 3)
+ Delrissa->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
}
void KilledUnit(Unit* victim)
{
- if(!pInstance)
+ if (!pInstance)
{
error_log(ERROR_INST_DATA);
return;
}
Creature* Delrissa = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA)));
- if(Delrissa)
+ if (Delrissa)
Delrissa->AI()->KilledUnit(victim);
}
void AcquireGUIDs()
{
- if(!pInstance)
+ if (!pInstance)
{
error_log(ERROR_INST_DATA);
return;
}
Creature* Delrissa = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA)));
- if(Delrissa)
+ if (Delrissa)
{
Group = ((boss_priestess_delrissaAI*)Delrissa->AI())->Adds;
Add* dAdd = new Add(Delrissa->GetEntry(), Delrissa->GetGUID());
@@ -432,13 +419,13 @@ struct TRINITY_DLL_DECL boss_priestess_guestAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
- if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) && !UsedPotion)
+ if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) && !UsedPotion)
{
DoCast(m_creature, SPELL_HEALING_POTION, true);
UsedPotion = true;
}
- if(ResetThreatTimer < diff)
+ if (ResetThreatTimer < diff)
{
DoResetThreat();
ResetThreatTimer = 5000 + rand()%15000;
@@ -480,12 +467,12 @@ struct TRINITY_DLL_DECL boss_kagani_nightstrikeAI : public boss_priestess_guestA
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Vanish_Timer < diff)
+ if (Vanish_Timer < diff)
{
m_creature->SetVisibility(VISIBILITY_OFF); // ...? Hacklike
DoCast(m_creature, SPELL_VANISH);
@@ -496,35 +483,36 @@ struct TRINITY_DLL_DECL boss_kagani_nightstrikeAI : public boss_priestess_guestA
m_creature->AddThreat(SelectUnit(SELECT_TARGET_RANDOM, 0), 1000.0f);
}else Vanish_Timer -= diff;
- if(InVanish)
- if(Wait_Timer < diff)
+ if (InVanish)
{
- DoCast(m_creature->getVictim(), SPELL_BACKSTAB, true);
- DoCast(m_creature->getVictim(), SPELL_KIDNEY_SHOT, true);
- m_creature->SetVisibility(VISIBILITY_ON); // ...? Hacklike
- InVanish = false;
- }else Wait_Timer -= diff;
+ if (Wait_Timer < diff)
+ {
+ DoCast(m_creature->getVictim(), SPELL_BACKSTAB, true);
+ DoCast(m_creature->getVictim(), SPELL_KIDNEY_SHOT, true);
+ m_creature->SetVisibility(VISIBILITY_ON); // ...? Hacklike
+ InVanish = false;
+ }else Wait_Timer -= diff;
+ }
- if(Gouge_Timer < diff)
+ if (Gouge_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_GOUGE);
- DoModifyThreatPercent(m_creature->getVictim(),-100);
Gouge_Timer = 5500;
}else Gouge_Timer -= diff;
- if(Kick_Timer < diff)
+ if (Kick_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_KICK);
Kick_Timer = 7000;
}else Kick_Timer -= diff;
- if(Eviscerate_Timer < diff)
+ if (Eviscerate_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_EVISCERATE);
Eviscerate_Timer = 4000;
}else Eviscerate_Timer -= diff;
- if(!InVanish)
+ if (!InVanish)
DoMeleeAttackIfReady();
}
};
@@ -559,7 +547,8 @@ struct TRINITY_DLL_DECL boss_kagani_nightstrikeAI : public boss_priestess_guestA
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim() )
+ //Return since we have no target
+ if (!UpdateVictim())
return;
//Chain cast
@@ -572,9 +561,7 @@ struct TRINITY_DLL_DECL boss_kagani_nightstrikeAI : public boss_priestess_guestA
struct TRINITY_DLL_DECL boss_ellris_duskhallowAI : public boss_priestess_guestAI
{
//Warlock
- boss_ellris_duskhallowAI(Creature *c) : boss_priestess_guestAI(c)
- {
- }
+ boss_ellris_duskhallowAI(Creature *c) : boss_priestess_guestAI(c) {}
bool HasSummonedImp;
@@ -586,7 +573,7 @@ struct TRINITY_DLL_DECL boss_ellris_duskhallowAI : public boss_priestess_guestAI
void Reset()
{
- //HasSummonedImp = false;
+ HasSummonedImp = false;
Immolate_Timer = 6000;
Shadow_Bolt_Timer = 3000;
@@ -604,51 +591,49 @@ struct TRINITY_DLL_DECL boss_ellris_duskhallowAI : public boss_priestess_guestAI
void UpdateAI(const uint32 diff)
{
- if(!HasSummonedImp)
+ if (!HasSummonedImp)
{
//Imp will not despawn unless it's killed, even if owner dies, this is correct way.
DoCast(m_creature,SPELL_SUMMON_IMP);
HasSummonedImp = true;
}
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Immolate_Timer < diff)
+ if (Immolate_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_IMMOLATE);
Immolate_Timer = 6000;
}else Immolate_Timer -= diff;
- if(Shadow_Bolt_Timer < diff)
+ if (Shadow_Bolt_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SHADOW_BOLT);
Shadow_Bolt_Timer = 5000;
}else Shadow_Bolt_Timer -= diff;
- if(Seed_of_Corruption_Timer < diff)
+ if (Seed_of_Corruption_Timer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_SEED_OF_CORRUPTION);
Seed_of_Corruption_Timer = 10000;
}else Seed_of_Corruption_Timer -= diff;
- if(Curse_of_Agony_Timer < diff)
+ if (Curse_of_Agony_Timer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_CURSE_OF_AGONY);
Curse_of_Agony_Timer = 13000;
}else Curse_of_Agony_Timer -= diff;
- if(Fear_Timer < diff)
+ if (Fear_Timer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FEAR);
Fear_Timer = 10000;
}else Fear_Timer -= diff;
- if (m_creature->GetDistance(m_creature->getVictim()) <= 10)
- m_creature->StopMoving();
- //DoMeleeAttackIfReady();//should not melee, she's a warlock
+ DoMeleeAttackIfReady();
}
};
@@ -685,18 +670,18 @@ struct TRINITY_DLL_DECL boss_eramas_brightblazeAI : public boss_priestess_guestA
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Knockdown_Timer < diff)
+ if (Knockdown_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_KNOCKDOWN);
Knockdown_Timer = 6000;
}else Knockdown_Timer -= diff;
- if(Snap_Kick_Timer < diff)
+ if (Snap_Kick_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SNAP_KICK);
Snap_Kick_Timer = 4500;
@@ -717,7 +702,7 @@ struct TRINITY_DLL_DECL boss_eramas_brightblazeAI : public boss_priestess_guestA
struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
{
//Mage
- boss_yazzaiAI(Creature *c) : boss_priestess_guestAI(c) {}
+ boss_yazzaiAI(Creature *c) : boss_priestess_guestAI(c) {}
bool HasIceBlocked;
@@ -748,82 +733,75 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Polymorph_Timer < diff)
+ if (Polymorph_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_POLYMORPH);
- DoModifyThreatPercent(target,-100);
Polymorph_Timer = 20000;
}
}else Polymorph_Timer -= diff;
- if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 35) && !HasIceBlocked)
+ if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 35) && !HasIceBlocked)
{
DoCast(m_creature, SPELL_ICE_BLOCK);
HasIceBlocked = true;
}
- if(Blizzard_Timer < diff)
+ if (Blizzard_Timer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_BLIZZARD);
Blizzard_Timer = 8000;
}else Blizzard_Timer -= diff;
- if(Ice_Lance_Timer < diff)
+ if (Ice_Lance_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_ICE_LANCE);
Ice_Lance_Timer = 12000;
}else Ice_Lance_Timer -= diff;
- if(Cone_of_Cold_Timer < diff)
+ if (Cone_of_Cold_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_CONE_OF_COLD);
Cone_of_Cold_Timer = 10000;
}else Cone_of_Cold_Timer -= diff;
- if(Frostbolt_Timer < diff)
+ if (Frostbolt_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FROSTBOLT);
Frostbolt_Timer = 8000;
}else Frostbolt_Timer -= diff;
- if(Blink_Timer < diff)
+ if (Blink_Timer < diff)
{
bool InMeleeRange = false;
std::list<HostilReference*>& t_list = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
{
- if(Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()))
+ if (Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()))
+ {
//if in melee range
if (target->IsWithinDistInMap(m_creature, 5))
{
InMeleeRange = true;
break;
}
+ }
}
+
//if anybody is in melee range than escape by blink
- if(InMeleeRange)
- {
- //DoCast(m_creature, SPELL_BLINK); //blink does not work on npcs
- float x,y,z;
- m_creature->GetPosition(x,y,z);
- x = rand()%2 ? x+10+rand()%10 : x-10-rand()%10;
- y = rand()%2 ? y+10+rand()%10 : y-10-rand()%10;
- DoTeleportTo(x, y, z);
- }
+ if (InMeleeRange)
+ DoCast(m_creature, SPELL_BLINK);
+
Blink_Timer = 8000;
}else Blink_Timer -= diff;
- if (m_creature->GetDistance(m_creature->getVictim()) <= 10)
- m_creature->StopMoving();
-
- //DoMeleeAttackIfReady(); //mage type, no melee needed
+ DoMeleeAttackIfReady();
}
};
@@ -856,6 +834,7 @@ struct TRINITY_DLL_DECL boss_warlord_salarisAI : public boss_priestess_guestAI
Hamstring_Timer = 4500;
Mortal_Strike_Timer = 8000;
DoCast(m_creature, SPELL_BATTLE_SHOUT);
+
boss_priestess_guestAI::Reset();
}
@@ -866,56 +845,60 @@ struct TRINITY_DLL_DECL boss_warlord_salarisAI : public boss_priestess_guestAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Intercept_Stun_Timer < diff)
+ if (Intercept_Stun_Timer < diff)
{
bool InMeleeRange = false;
std::list<HostilReference*>& t_list = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
{
- if(Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()))
- //if in melee range
- if (target->IsWithinDistInMap(m_creature, 5))
+ if (Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()))
{
- InMeleeRange = true;
- break;
+ //if in melee range
+ if (target->IsWithinDistInMap(m_creature, 5))
+ {
+ InMeleeRange = true;
+ break;
+ }
}
}
+
//if nobody is in melee range than try to use Intercept
- if(!InMeleeRange)
+ if (!InMeleeRange)
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_INTERCEPT_STUN);
+
Intercept_Stun_Timer = 10000;
}else Intercept_Stun_Timer -= diff;
- if(Disarm_Timer < diff)
+ if (Disarm_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_DISARM);
Disarm_Timer = 6000;
}else Disarm_Timer -= diff;
- if(Hamstring_Timer < diff)
+ if (Hamstring_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_HAMSTRING);
Hamstring_Timer = 4500;
}else Hamstring_Timer -= diff;
- if(Mortal_Strike_Timer < diff)
+ if (Mortal_Strike_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_MORTAL_STRIKE);
Mortal_Strike_Timer = 4500;
}else Mortal_Strike_Timer -= diff;
- if(Piercing_Howl_Timer < diff)
+ if (Piercing_Howl_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_PIERCING_HOWL);
Piercing_Howl_Timer = 10000;
}else Piercing_Howl_Timer -= diff;
- if(Frightening_Shout_Timer < diff)
+ if (Frightening_Shout_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FRIGHTENING_SHOUT);
Frightening_Shout_Timer = 18000;
@@ -967,13 +950,11 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
uint32 Multi_Shot_Timer;
uint32 Wing_Clip_Timer;
uint32 Freezing_Trap_Timer;
- uint32 StopMoving;
- bool Stopped;
void Reset()
{
//SliverGUID = 0;
- //HasSummonedSliver = false;
+ HasSummonedSliver = false;
Aimed_Shot_Timer = 6000;
Shoot_Timer = 2500;
@@ -981,8 +962,6 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
Multi_Shot_Timer = 10000;
Wing_Clip_Timer = 4000;
Freezing_Trap_Timer = 15000;
- StopMoving = 2000;
- Stopped = false;
boss_priestess_guestAI::Reset();
}
@@ -994,10 +973,10 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
void UpdateAI(const uint32 diff)
{
- if(!HasSummonedSliver)
+ if (!HasSummonedSliver)
{
Creature* Sliver = m_creature->SummonCreature(CREATURE_SLIVER, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
- if(Sliver)
+ if (Sliver)
{
//((mob_sliverAI*)Sliver->AI())->GaraxxasGUID = m_creature->GetGUID();
//SliverGUID = Sliver->GetGUID();
@@ -1005,64 +984,53 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
}
}
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(m_creature->IsWithinDistInMap(m_creature->getVictim(), 5))
+ if (m_creature->IsWithinDistInMap(m_creature->getVictim(), 5.0f))
{
- if(Wing_Clip_Timer < diff)
+ if (Wing_Clip_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_WING_CLIP);
Wing_Clip_Timer = 4000;
}else Wing_Clip_Timer -= diff;
- if(Freezing_Trap_Timer < diff)
+ if (Freezing_Trap_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FREEZING_TRAP);
- DoModifyThreatPercent(m_creature->getVictim(),-100);
Freezing_Trap_Timer = 30000;
}else Freezing_Trap_Timer -= diff;
- if(!m_creature->getVictim()->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT | UNIT_STAT_CONFUSED | UNIT_STAT_DISTRACTED))
- DoMeleeAttackIfReady();
- }else
+ DoMeleeAttackIfReady();
+ }
+ else
{
- if(Concussive_Shot_Timer < diff)
+ if (Concussive_Shot_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_CONCUSSIVE_SHOT);
Concussive_Shot_Timer = 8000;
}else Concussive_Shot_Timer -= diff;
- if(Multi_Shot_Timer < diff)
+ if (Multi_Shot_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_MULTI_SHOT);
Multi_Shot_Timer = 10000;
}else Multi_Shot_Timer -= diff;
- if(Aimed_Shot_Timer < diff)
+ if (Aimed_Shot_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_AIMED_SHOT);
Aimed_Shot_Timer = 6000;
}else Aimed_Shot_Timer -= diff;
- if(Shoot_Timer < diff)
+ if (Shoot_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SHOOT);
Shoot_Timer = 2500;
}else Shoot_Timer -= diff;
}
- if(StopMoving < diff)
- {
- if(Stopped)
- Stopped = false;
- else
- Stopped = true;
- StopMoving = 2000+rand()%5000;
- }else StopMoving -= diff;
- if (Stopped)
- m_creature->StopMoving();
}
};
@@ -1112,12 +1080,12 @@ struct TRINITY_DLL_DECL boss_apokoAI : public boss_priestess_guestAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Totem_Timer < diff)
+ if (Totem_Timer < diff)
{
switch(rand()%3)
{
@@ -1129,25 +1097,25 @@ struct TRINITY_DLL_DECL boss_apokoAI : public boss_priestess_guestAI
Totem_Timer = Totem_Amount*2000;
}else Totem_Timer -= diff;
- if(War_Stomp_Timer < diff)
+ if (War_Stomp_Timer < diff)
{
DoCast(m_creature, SPELL_WAR_STOMP);
War_Stomp_Timer = 10000;
}else War_Stomp_Timer -= diff;
- if(Purge_Timer < diff)
+ if (Purge_Timer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_PURGE);
Purge_Timer = 15000;
}else Purge_Timer -= diff;
- if(Frost_Shock_Timer < diff)
+ if (Frost_Shock_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FROST_SHOCK);
Frost_Shock_Timer = 7000;
}else Frost_Shock_Timer -= diff;
- if(Healing_Wave_Timer < diff)
+ if (Healing_Wave_Timer < diff)
{
// std::vector<Add*>::iterator itr = Group.begin() + rand()%Group.size();
// uint64 guid = (*itr)->guid;
@@ -1199,44 +1167,45 @@ struct TRINITY_DLL_DECL boss_zelfanAI : public boss_priestess_guestAI
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim() )
+ if (!UpdateVictim())
return;
boss_priestess_guestAI::UpdateAI(diff);
- if(Goblin_Dragon_Gun_Timer < diff)
+ if (Goblin_Dragon_Gun_Timer < diff)
{
- if (m_creature->GetDistance(m_creature->getVictim()) <= 5)
- {
- Goblin_Dragon_Gun_Timer = 10000;
- DoCast(m_creature->getVictim(), SPELL_GOBLIN_DRAGON_GUN);
- }else Goblin_Dragon_Gun_Timer = 2000;
+ DoCast(m_creature->getVictim(), SPELL_GOBLIN_DRAGON_GUN);
+ Goblin_Dragon_Gun_Timer = 10000;
}else Goblin_Dragon_Gun_Timer -= diff;
- if(Rocket_Launch_Timer < diff)
+ if (Rocket_Launch_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_ROCKET_LAUNCH);
Rocket_Launch_Timer = 9000;
}else Rocket_Launch_Timer -= diff;
- if(Fel_Iron_Bomb_Timer < diff)
+ if (Fel_Iron_Bomb_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FEL_IRON_BOMB);
Fel_Iron_Bomb_Timer = 15000;
}else Fel_Iron_Bomb_Timer -= diff;
- if(Recombobulate_Timer < diff)
+ if (Recombobulate_Timer < diff)
{
for(uint8 i = 0; i < Group.size(); ++i)
- if(Unit* pAdd = Unit::GetUnit(*m_creature, Group[i]->guid))
- if(pAdd->IsPolymorphed())
+ {
+ if (Unit* pAdd = Unit::GetUnit(*m_creature, Group[i]->guid))
+ {
+ if (pAdd->IsPolymorphed())
{
DoCast(pAdd, SPELL_RECOMBOBULATE);
break;
}
+ }
+ }
}else Recombobulate_Timer -= diff;
- if(High_Explosive_Sheep_Timer < diff)
+ if (High_Explosive_Sheep_Timer < diff)
{
DoCast(m_creature, SPELL_HIGH_EXPLOSIVE_SHEEP);
High_Explosive_Sheep_Timer = 65000;
@@ -1336,62 +1305,62 @@ void AddSC_boss_priestess_delrissa()
Script *newscript;
newscript = new Script;
- newscript->Name="boss_priestess_delrissa";
+ newscript->Name = "boss_priestess_delrissa";
newscript->GetAI = &GetAI_boss_priestess_delrissa;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_kagani_nightstrike";
+ newscript->Name = "boss_kagani_nightstrike";
newscript->GetAI = &GetAI_boss_kagani_nightstrike;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_ellris_duskhallow";
+ newscript->Name = "boss_ellris_duskhallow";
newscript->GetAI = &GetAI_ellris_duskhallow;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_eramas_brightblaze";
+ newscript->Name = "boss_eramas_brightblaze";
newscript->GetAI = &GetAI_eramas_brightblaze;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_yazzai";
+ newscript->Name = "boss_yazzai";
newscript->GetAI = &GetAI_yazzai;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_warlord_salaris";
+ newscript->Name = "boss_warlord_salaris";
newscript->GetAI = &GetAI_warlord_salaris;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_garaxxas";
+ newscript->Name = "boss_garaxxas";
newscript->GetAI = &GetAI_garaxxas;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_apoko";
+ newscript->Name = "boss_apoko";
newscript->GetAI = &GetAI_apoko;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="boss_zelfan";
+ newscript->Name = "boss_zelfan";
newscript->GetAI = &GetAI_zelfan;
newscript->RegisterSelf();
/*newscript = new Script;
- newscript->Name="mob_high_explosive_sheep";
+ newscript->Name = "mob_high_explosive_sheep";
newscript->GetAI = &GetAI_mob_high_explosive_sheep;
newscript->RegisterSelf();*/
/*newscript = new Script;
- newscript->Name="mob_fizzle";
+ newscript->Name = "mob_fizzle";
newscript->GetAI = &GetAI_mob_fizzle;
newscript->RegisterSelf();*/
/*newscript = new Script;
- newscript->Name="mob_sliver";
+ newscript->Name = "mob_sliver";
newscript->GetAI = &GetAI_mob_sliver;
newscript->RegisterSelf();*/
}
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp
index 8cf38da357c..90533797d5e 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,12 +6,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
@@ -32,7 +32,7 @@ EndScriptData */
#define SAY_DEATH -1585005
#define EMOTE_CRYSTAL -1585006
-//Crystal efect spells
+//Crystal effect spells
#define SPELL_FEL_CRYSTAL_COSMETIC 44374
#define SPELL_FEL_CRYSTAL_DUMMY 44329
#define SPELL_FEL_CRYSTAL_VISUAL 44355
@@ -56,8 +56,8 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Crystals.clear();
- // GUIDs per instance is static, so we only need to load them once.
- if(pInstance)
+ //GUIDs per instance is static, so we only need to load them once.
+ if (pInstance)
{
uint32 size = pInstance->GetData(DATA_FEL_CRYSTAL_SIZE);
for(uint8 i = 0; i < size; ++i)
@@ -72,6 +72,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
}
ScriptedInstance* pInstance;
+ bool Heroic;
std::list<uint64> Crystals;
@@ -79,23 +80,23 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
uint32 DrainManaTimer;
uint32 FelExplosionTimer;
uint32 DrainCrystalTimer;
- uint32 CheckTimer;
+ uint32 EmpowerTimer;
bool IsDraining;
bool DrainingCrystal;
- bool Heroic;
+
uint64 CrystalGUID; // This will help us create a pointer to the crystal we are draining. We store GUIDs, never units in case unit is deleted/offline (offline if player of course).
void Reset()
{
- if(pInstance)
+ if (pInstance)
{
//for(uint8 i = 0; i < CRYSTALS_NUMBER; ++i)
for(std::list<uint64>::iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr)
{
//Unit* pUnit = Unit::GetUnit(*m_creature, FelCrystals[i]);
Unit* pUnit = Unit::GetUnit(*m_creature, *itr);
- if(pUnit)
+ if (pUnit)
{
if(!pUnit->isAlive())
((Creature*)pUnit)->Respawn(); // Let MaNGOS handle setting death state, etc.
@@ -104,14 +105,13 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
pUnit->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
}
+
GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_SELIN_ENCOUNTER_DOOR));
- if( Door )
+ if (Door)
Door->SetGoState(0); // Open the big encounter door. Close it in Aggro and open it only in JustDied(and here)
// Small door opened after event are expected to be closed by default
// Set Inst data for encounter
- if (m_creature->isDead())
- pInstance->SetData(DATA_SELIN_EVENT, DONE);
- else pInstance->SetData(DATA_SELIN_EVENT, NOT_STARTED);
+ pInstance->SetData(DATA_SELIN_EVENT, NOT_STARTED);
}else error_log(ERROR_INST_DATA);
DrainLifeTimer = 3000 + rand()%4000;
@@ -119,7 +119,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
FelExplosionTimer = 2100;
DrainCrystalTimer = 10000 + rand()%5000;
DrainCrystalTimer = 20000 + rand()%5000;
- CheckTimer = 1000;
+ EmpowerTimer = 10000;
IsDraining = false;
DrainingCrystal = false;
@@ -128,7 +128,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
void SelectNearestCrystal()
{
- if(Crystals.empty())
+ if (Crystals.empty())
return;
float ShortestDistance = 0;
@@ -141,9 +141,9 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
pCrystal = NULL;
//pCrystal = Unit::GetUnit(*m_creature, FelCrystals[i]);
pCrystal = Unit::GetUnit(*m_creature, *itr);
- if(pCrystal && pCrystal->isAlive())
+ if (pCrystal && pCrystal->isAlive())
{
- if(!ShortestDistance || (ShortestDistance > m_creature->GetDistance2d(pCrystal)))
+ if (!ShortestDistance || (ShortestDistance > m_creature->GetDistance2d(pCrystal)))
{
ShortestDistance = m_creature->GetDistance2d(pCrystal);
CrystalGUID = pCrystal->GetGUID();
@@ -151,7 +151,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
}
}
}
- if( CrystalChosen )
+ if (CrystalChosen)
{
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_CRYSTAL, m_creature);
@@ -169,7 +169,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
void ShatterRemainingCrystals()
{
- if(Crystals.empty())
+ if (Crystals.empty())
return;
//for(uint8 i = 0; i < CRYSTALS_NUMBER; ++i)
@@ -177,20 +177,19 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{
//Creature* pCrystal = ((Creature*)Unit::GetUnit(*m_creature, FelCrystals[i]));
Creature* pCrystal = ((Creature*)Unit::GetUnit(*m_creature, *itr));
- if( pCrystal && pCrystal->isAlive())
+ if (pCrystal && pCrystal->isAlive())
pCrystal->DealDamage(pCrystal, pCrystal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
void Aggro(Unit* who)
{
- m_creature->SetPower(POWER_MANA, 0);
DoScriptText(SAY_AGGRO, m_creature);
- if( pInstance )
+ if (pInstance)
{
GameObject* EncounterDoor = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_SELIN_ENCOUNTER_DOOR));
- if( EncounterDoor )
+ if (EncounterDoor)
EncounterDoor->SetGoState(1); //Close the encounter door, open it in JustDied/Reset
}
}
@@ -199,17 +198,17 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{
switch(rand()%2)
{
- case 0: DoScriptText(SAY_KILL_1, m_creature); break;
- case 1: DoScriptText(SAY_KILL_2, m_creature); break;
+ case 0: DoScriptText(SAY_KILL_1, m_creature); break;
+ case 1: DoScriptText(SAY_KILL_2, m_creature); break;
}
}
void MovementInform(uint32 type, uint32 id)
{
- if(type == POINT_MOTION_TYPE && id == 1)
+ if (type == POINT_MOTION_TYPE && id == 1)
{
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
- if(CrystalChosen && CrystalChosen->isAlive())
+ if (CrystalChosen && CrystalChosen->isAlive())
{
// Make the crystal attackable
// We also remove NON_ATTACKABLE in case the database has it set.
@@ -230,7 +229,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{
DoScriptText(SAY_DEATH, m_creature);
- if(!pInstance)
+ if (!pInstance)
{
error_log(ERROR_INST_DATA);
return;
@@ -239,35 +238,36 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
pInstance->SetData(DATA_SELIN_EVENT, DONE); // Encounter complete!
GameObject* EncounterDoor = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_SELIN_ENCOUNTER_DOOR));
- if( EncounterDoor )
+ if (EncounterDoor)
EncounterDoor->SetGoState(0); // Open the encounter door
GameObject* ContinueDoor = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_SELIN_DOOR));
- if( ContinueDoor )
+ if (ContinueDoor)
ContinueDoor->SetGoState(0); // Open the door leading further in
+ ShatterRemainingCrystals();
}
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
+ if (!UpdateVictim())
return;
- if(!DrainingCrystal)
+ if (!DrainingCrystal)
{
uint32 maxPowerMana = m_creature->GetMaxPower(POWER_MANA);
- if( maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10) )
+ if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10))
{
- if( DrainLifeTimer < diff )
+ if (DrainLifeTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_LIFE);
DrainLifeTimer = 10000;
}else DrainLifeTimer -= diff;
// Heroic only
- if( Heroic )
+ if (Heroic)
{
- if( DrainManaTimer < diff )
+ if (DrainManaTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_MANA);
DrainManaTimer = 10000;
@@ -275,9 +275,9 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
}
}
- if( FelExplosionTimer < diff )
+ if (FelExplosionTimer < diff)
{
- if(!m_creature->IsNonMeleeSpellCasted(false))
+ if (!m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature, SPELL_FEL_EXPLOSION);
FelExplosionTimer = 2000;
@@ -286,48 +286,40 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
// If below 10% mana, start recharging
maxPowerMana = m_creature->GetMaxPower(POWER_MANA);
- if( maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10) )
+ if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10))
{
- if(DrainCrystalTimer < diff)
+ if (DrainCrystalTimer < diff)
{
SelectNearestCrystal();
- if(Heroic) DrainCrystalTimer = 10000 + rand()%5000;
- else DrainCrystalTimer = 20000 + rand()%5000;
+ if (Heroic) DrainCrystalTimer = 10000 + rand()%5000;
+ else DrainCrystalTimer = 20000 + rand()%5000;
}else DrainCrystalTimer -= diff;
}
}else
{
- if( IsDraining )
+ if (IsDraining)
{
- if (CheckTimer < diff)
+ if (EmpowerTimer < diff)
{
+ IsDraining = false;
+ DrainingCrystal = false;
+
+ DoScriptText(SAY_EMPOWERED, m_creature);
+
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
- if(CrystalChosen)
- {
- if(CrystalChosen->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MANA_RAGE)
- {
- m_creature->StopMoving();
- }else{
- IsDraining = false;
- DrainingCrystal = false;
-
- DoScriptText(SAY_EMPOWERED, m_creature);
-
- Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
- if( CrystalChosen && CrystalChosen->isAlive() )
- // Use Deal Damage to kill it, not setDeathState.
- CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- CrystalGUID = 0;
-
- m_creature->GetMotionMaster()->Clear();
- m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
- }
- }
- CheckTimer = 1000;
- }else CheckTimer -= diff;
+ if (CrystalChosen && CrystalChosen->isAlive())
+ // Use Deal Damage to kill it, not setDeathState.
+ CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+
+ CrystalGUID = 0;
+
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
+ }else EmpowerTimer -= diff;
}
}
+
DoMeleeAttackIfReady(); // No need to check if we are draining crystal here, as the spell has a stun.
}
};
@@ -349,19 +341,18 @@ struct TRINITY_DLL_DECL mob_fel_crystalAI : public ScriptedAI
void JustDied(Unit* killer)
{
- m_creature->RemoveAurasDueToSpell(SPELL_MANA_RAGE);
- if(ScriptedInstance* pInstance = ((ScriptedInstance*)m_creature->GetInstanceData()))
+ if (ScriptedInstance* pInstance = ((ScriptedInstance*)m_creature->GetInstanceData()))
{
Creature* Selin = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_SELIN)));
- if(Selin && Selin->isAlive())
+ if (Selin && Selin->isAlive())
{
- if(((boss_selin_fireheartAI*)Selin->AI())->CrystalGUID == m_creature->GetGUID())
+ if (((boss_selin_fireheartAI*)Selin->AI())->CrystalGUID == m_creature->GetGUID())
{
// Set this to false if we are the creature that Selin is draining so his AI flows properly
((boss_selin_fireheartAI*)Selin->AI())->DrainingCrystal = false;
((boss_selin_fireheartAI*)Selin->AI())->IsDraining = false;
- Selin->RemoveAurasDueToSpell(SPELL_MANA_RAGE);
- if(Selin->getVictim())
+ ((boss_selin_fireheartAI*)Selin->AI())->EmpowerTimer = 10000;
+ if (Selin->getVictim())
{
Selin->AI()->AttackStart(Selin->getVictim());
Selin->GetMotionMaster()->MoveChase(Selin->getVictim());
@@ -382,12 +373,12 @@ void AddSC_boss_selin_fireheart()
Script *newscript;
newscript = new Script;
- newscript->Name="boss_selin_fireheart";
+ newscript->Name = "boss_selin_fireheart";
newscript->GetAI = &GetAI_boss_selin_fireheart;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="mob_fel_crystal";
+ newscript->Name = "mob_fel_crystal";
newscript->GetAI = &GetAI_mob_fel_crystal;
newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp
index b50f248bbe8..57ccde94bf0 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,12 +6,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
@@ -29,33 +29,37 @@ EndScriptData */
#define SAY_OVERLOAD -1585009
#define SAY_KILL -1585010
#define EMOTE_DISCHARGE_ENERGY -1585011
+
//is this text for real?
-#define SAY_DEATH "What...happen...ed."
+//#define SAY_DEATH "What...happen...ed."
//Pure energy spell info
-#define SPELL_ENERGY_BOLT 44342
+#define SPELL_ENERGY_BOLT 46156
#define SPELL_ENERGY_FEEDBACK 44335
//Vexallus spell info
#define SPELL_CHAIN_LIGHTNING 44318
-#define SPELL_SUMMON_PURE_ENERGY 44322 //not-working, this script summon this creatures without this spell
#define SPELL_OVERLOAD 44353
#define SPELL_ARCANE_SHOCK 44319
-#define ASTRAL_FLARE_VISUAL 30237
+
+#define SPELL_SUMMON_PURE_ENERGY 44322 //mod scale -10
+#define H_SPELL_SUMMON_PURE_ENERGY1 46154 //mod scale -5
+#define H_SPELL_SUMMON_PURE_ENERGY2 46159 //mod scale -5
//Creatures
#define CREATURE_PURE_ENERGY 24745
-struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
{
boss_vexallusAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Heroic = c->GetMap()->IsHeroic();
Reset();
- Heroic = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
+ bool Heroic;
uint32 ChainLightningTimer;
uint32 ArcaneShockTimer;
@@ -63,7 +67,6 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
uint32 SpawnAddInterval;
uint32 AlreadySpawnedAmount;
bool Enraged;
- bool Heroic;
void Reset()
{
@@ -72,15 +75,10 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
OverloadTimer = 2200;
SpawnAddInterval = 15;
AlreadySpawnedAmount = 0;
-
Enraged = false;
- if(pInstance)
- {
- if (m_creature->isDead())
- pInstance->SetData(DATA_VEXALLUS_EVENT, DONE);
- else pInstance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED);
- }
+ if (pInstance)
+ pInstance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED);
}
void KilledUnit(Unit *victim)
@@ -90,14 +88,11 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
void JustDied(Unit *victim)
{
- DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
if (pInstance)
{
pInstance->SetData(DATA_VEXALLUS_EVENT, DONE);
- GameObject* Door = NULL;
- Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_VEXALLUS_DOOR));
- if(Door)
+ if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_VEXALLUS_DOOR)))
Door->SetGoState(0);
}
}
@@ -105,68 +100,83 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
+
if (pInstance)
pInstance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS);
}
+ void JustSummoned(Creature *summoned)
+ {
+ if (Unit *temp = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ summoned->GetMotionMaster()->MoveFollow(temp,0,0);
+
+ //spells are SUMMON_TYPE_GUARDIAN, so using setOwner should be ok
+ summoned->SetOwnerGUID(m_creature->GetGUID());
+ summoned->CastSpell(summoned,SPELL_ENERGY_BOLT,false,0,0,m_creature->GetGUID());
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim() )
return;
- if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 11)
+ if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10)
{
Enraged = true;
}
- if(!Enraged)
+ if (!Enraged)
{
//used for check, when Vexallus cast adds 85%, 70%, 55%, 40%, 25%
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < (100-(SpawnAddInterval*(AlreadySpawnedAmount+1))))
{
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_DISCHARGE_ENERGY, m_creature);
- Creature* PureEnergyCreature = NULL;
- PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, 10, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0);
- if (PureEnergyCreature && target)
- PureEnergyCreature->AI()->AttackStart(target);
-
- if(Heroic) // *Heroic mode only - he summons two instead of one.
+
+ if (Heroic)
{
- PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, -10, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
- target = SelectUnit(SELECT_TARGET_RANDOM, 0);
- if (PureEnergyCreature && target)
- PureEnergyCreature->AI()->AttackStart(target);
+ m_creature->CastSpell(m_creature,H_SPELL_SUMMON_PURE_ENERGY1,false);
+ m_creature->CastSpell(m_creature,H_SPELL_SUMMON_PURE_ENERGY2,false);
}
+ else
+ m_creature->CastSpell(m_creature,SPELL_SUMMON_PURE_ENERGY,false);
+
+ //below are workaround summons, remove when summoning spells w/implicitTarget 73 implemented in Mangos
+ DoSpawnCreature(CREATURE_PURE_ENERGY, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+
+ if (Heroic)
+ DoSpawnCreature(CREATURE_PURE_ENERGY, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
++AlreadySpawnedAmount;
- };
+ }
- if(ChainLightningTimer < diff)
+ if (ChainLightningTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_CHAIN_LIGHTNING);
+ DoCast(target, SPELL_CHAIN_LIGHTNING);
+
ChainLightningTimer = 10000;
}else ChainLightningTimer -= diff;
- if(ArcaneShockTimer < diff)
+ if (ArcaneShockTimer < diff)
{
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0);
- DoCast(target, SPELL_ARCANE_SHOCK);
+ if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_ARCANE_SHOCK);
+
ArcaneShockTimer = 8000;
}else ArcaneShockTimer -= diff;
- }else
+ }
+ else
{
- if(OverloadTimer < diff)
+ if (OverloadTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_OVERLOAD);
+ DoCast(target, SPELL_OVERLOAD);
+
OverloadTimer = 2200;
}else OverloadTimer -= diff;
}
+
DoMeleeAttackIfReady();
}
};
@@ -176,44 +186,24 @@ CreatureAI* GetAI_boss_vexallus(Creature *_Creature)
return new boss_vexallusAI (_Creature);
};
-struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI
+struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI
{
mob_pure_energyAI(Creature *c) : ScriptedAI(c) {Reset();}
- uint32 EnergyBoltTimer;
- uint32 VisualTimer;
-
- void Reset()
- {
- EnergyBoltTimer = 1700;
- VisualTimer = 1000;
- m_creature->SetSpeed(MOVE_RUN, 0.5f);
- m_creature->SetSpeed(MOVE_WALK, 0.5f);
- }
+ void Reset() { }
void JustDied(Unit* slayer)
{
- slayer->CastSpell(slayer, SPELL_ENERGY_FEEDBACK, true, 0, 0, m_creature->GetGUID());
- }
-
- void Aggro(Unit *who){}
-
- void UpdateAI(const uint32 diff)
- {
- if(!UpdateVictim())
- return;
-
- if(EnergyBoltTimer < diff)
+ if (Unit *temp = m_creature->GetOwner())
{
- DoCast(m_creature->getVictim(), SPELL_ENERGY_BOLT);
- EnergyBoltTimer = 1700;
- }else EnergyBoltTimer -= diff;
- if(VisualTimer < diff)
- {
- DoCast(m_creature->getVictim(), ASTRAL_FLARE_VISUAL, true);
- VisualTimer = 1000;
- }else VisualTimer -= diff;
+ if (temp && temp->isAlive())
+ slayer->CastSpell(slayer, SPELL_ENERGY_FEEDBACK, true, 0, 0, temp->GetGUID());
+ }
}
+
+ void Aggro(Unit *who) { }
+ void MoveInLineOfSight(Unit *who) { }
+ void AttackStart(Unit *who) { }
};
CreatureAI* GetAI_mob_pure_energy(Creature *_Creature)
@@ -226,13 +216,12 @@ void AddSC_boss_vexallus()
Script *newscript;
newscript = new Script;
- newscript->Name="boss_vexallus";
+ newscript->Name = "boss_vexallus";
newscript->GetAI = &GetAI_boss_vexallus;
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name="mob_pure_energy";
+ newscript->Name = "mob_pure_energy";
newscript->GetAI = &GetAI_mob_pure_energy;
newscript->RegisterSelf();
}
-
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h b/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h
index f509a8bc73c..d6419ea409c 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
@@ -20,13 +20,12 @@
#define DATA_DELRISSA_DOOR 11
#define DATA_SELIN_ENCOUNTER_DOOR 12
-#define DATA_KAEL_STATUE_LEFT 13
-#define DATA_KAEL_STATUE_RIGHT 14
+#define DATA_KAEL_DOOR 13
+#define DATA_KAEL_STATUE_LEFT 14
+#define DATA_KAEL_STATUE_RIGHT 15
-#define DATA_DELRISSA_DEATH_COUNT 15
+#define DATA_DELRISSA_DEATH_COUNT 16
-#define DATA_KAEL 16
-
-#define ERROR_INST_DATA "SD2 Error: Instance Data not set properly for Magister's Terrace instance (map 585). Encounters will be buggy."
+#define ERROR_INST_DATA "TSCR Error: Instance Data not set properly for Magister's Terrace instance (map 585). Encounters will be buggy."
#endif
diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp
index 5afb79e84d0..7e16b37c353 100644
--- a/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp
+++ b/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -6,12 +6,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
@@ -37,29 +37,25 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
{
instance_magisters_terrace(Map* map) : ScriptedInstance(map) {Initialize();}
- uint32 DoorState[3];//0seline, 1vexallus, 2derlissa
uint32 Encounters[NUMBER_OF_ENCOUNTERS];
uint32 DelrissaDeathCount;
std::list<uint64> FelCrystals;
std::list<uint64>::iterator CrystalItr;
- uint64 KaelGUID;
uint64 SelinGUID;
uint64 DelrissaGUID;
uint64 VexallusDoorGUID;
uint64 SelinDoorGUID;
uint64 SelinEncounterDoorGUID;
uint64 DelrissaDoorGUID;
+ uint64 KaelDoorGUID;
uint64 KaelStatue[2];
bool InitializedItr;
void Initialize()
{
- for(uint8 i = 0; i < 3; i++)
- DoorState[i] = 1;//1 closed, 0 opened
-
for(uint8 i = 0; i < NUMBER_OF_ENCOUNTERS; i++)
Encounters[i] = NOT_STARTED;
@@ -67,13 +63,13 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
DelrissaDeathCount = 0;
- KaelGUID = 0;
SelinGUID = 0;
DelrissaGUID = 0;
VexallusDoorGUID = 0;
SelinDoorGUID = 0;
SelinEncounterDoorGUID = 0;
DelrissaDoorGUID = 0;
+ KaelDoorGUID = 0;
KaelStatue[0] = 0;
KaelStatue[1] = 0;
@@ -106,30 +102,9 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
{
switch(identifier)
{
- case DATA_SELIN_EVENT:
- Encounters[0] = data;
- if(data==DONE)
- {
- DoorState[0] = 0;
- SaveToDB();
- }
- break;
- case DATA_VEXALLUS_EVENT:
- Encounters[1] = data;
- if(data==DONE)
- {
- DoorState[1] = 0;
- SaveToDB();
- }
- break;
- case DATA_DELRISSA_EVENT:
- Encounters[2] = data;
- if(data==DONE)
- {
- DoorState[2] = 0;
- SaveToDB();
- }
- break;
+ case DATA_SELIN_EVENT: Encounters[0] = data; break;
+ case DATA_VEXALLUS_EVENT: Encounters[1] = data; break;
+ case DATA_DELRISSA_EVENT: Encounters[2] = data; break;
case DATA_KAELTHAS_EVENT: Encounters[3] = data; break;
case DATA_DELRISSA_DEATH_COUNT:
@@ -138,38 +113,13 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
}
}
- const char* Save()
- {
- std::ostringstream ss;
- ss << "S " << DoorState[0] << " " << DoorState[1] << " " << DoorState[2];
- char* data = new char[ss.str().length()+1];
- strcpy(data, ss.str().c_str());
- return data;
- }
-
- void Load(const char* load)
- {
- if(!load) return;
- std::istringstream ss(load);
- char dataHead; // S
- uint32 data1, data2, data3;
- ss >> dataHead >> data1 >> data2 >> data3;
- if(dataHead == 'S')
- {
- DoorState[0] = data1;
- DoorState[1] = data2;
- DoorState[2] = data3;
- }else error_log("SD2: Magister's Terrace: corrupted save data.");
- }
-
void OnCreatureCreate(Creature *creature, uint32 entry)
{
- switch(entry)
+ switch(creature->GetEntry())
{
case 24723: SelinGUID = creature->GetGUID(); break;
case 24560: DelrissaGUID = creature->GetGUID(); break;
case 24722: FelCrystals.push_back(creature->GetGUID()); break;
- case 24664: KaelGUID = creature->GetGUID(); break;
}
}
@@ -177,21 +127,13 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
{
switch(go->GetEntry())
{
- case 187896:
- VexallusDoorGUID = go->GetGUID();
- go->SetGoState(DoorState[1]);
- break;
+ case 187896: VexallusDoorGUID = go->GetGUID(); break;
//SunwellRaid Gate 02
- case 187979:
- SelinDoorGUID = go->GetGUID();
- go->SetGoState(DoorState[0]);
- break;
+ case 187979: SelinDoorGUID = go->GetGUID(); break;
//Assembly Chamber Door
case 188065: SelinEncounterDoorGUID = go->GetGUID(); break;
- case 187770:
- DelrissaDoorGUID = go->GetGUID();
- go->SetGoState(DoorState[2]);
- break;
+ case 187770: DelrissaDoorGUID = go->GetGUID(); break;
+ case 188064: KaelDoorGUID = go->GetGUID(); break;
case 188165: KaelStatue[0] = go->GetGUID(); break;
case 188166: KaelStatue[1] = go->GetGUID(); break;
}
@@ -202,12 +144,12 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
switch(identifier)
{
case DATA_SELIN: return SelinGUID;
- case DATA_KAEL: return KaelGUID;
case DATA_DELRISSA: return DelrissaGUID;
case DATA_VEXALLUS_DOOR: return VexallusDoorGUID;
case DATA_SELIN_DOOR: return SelinDoorGUID;
case DATA_SELIN_ENCOUNTER_DOOR: return SelinEncounterDoorGUID;
case DATA_DELRISSA_DOOR: return DelrissaDoorGUID;
+ case DATA_KAEL_DOOR: return KaelDoorGUID;
case DATA_KAEL_STATUE_LEFT: return KaelStatue[0];
case DATA_KAEL_STATUE_RIGHT: return KaelStatue[1];
diff --git a/src/bindings/scripts/scripts/zone/maraudon/boss_celebras_the_cursed.cpp b/src/bindings/scripts/scripts/zone/maraudon/boss_celebras_the_cursed.cpp
index 3ae6cd01ceb..767246b876c 100644
--- a/src/bindings/scripts/scripts/zone/maraudon/boss_celebras_the_cursed.cpp
+++ b/src/bindings/scripts/scripts/zone/maraudon/boss_celebras_the_cursed.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/maraudon/boss_landslide.cpp b/src/bindings/scripts/scripts/zone/maraudon/boss_landslide.cpp
index 8790a578b06..49d50b43a59 100644
--- a/src/bindings/scripts/scripts/zone/maraudon/boss_landslide.cpp
+++ b/src/bindings/scripts/scripts/zone/maraudon/boss_landslide.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/maraudon/boss_noxxion.cpp b/src/bindings/scripts/scripts/zone/maraudon/boss_noxxion.cpp
index a04715e8d6f..a987fd6399a 100644
--- a/src/bindings/scripts/scripts/zone/maraudon/boss_noxxion.cpp
+++ b/src/bindings/scripts/scripts/zone/maraudon/boss_noxxion.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/maraudon/boss_princess_theradras.cpp b/src/bindings/scripts/scripts/zone/maraudon/boss_princess_theradras.cpp
index 11c6047eb13..c78d28e0aa8 100644
--- a/src/bindings/scripts/scripts/zone/maraudon/boss_princess_theradras.cpp
+++ b/src/bindings/scripts/scripts/zone/maraudon/boss_princess_theradras.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_baron_geddon.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_baron_geddon.cpp
index 21623b999df..da8b47d6a7c 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_baron_geddon.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_baron_geddon.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_garr.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_garr.cpp
index dce2e8e9d46..ac1ff61c2ba 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_garr.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_garr.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_gehennas.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_gehennas.cpp
index 34c87b909d7..c65782c3e4d 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_gehennas.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_gehennas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_golemagg.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_golemagg.cpp
index 4aa53087b95..b5ebfbe4c73 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_golemagg.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_golemagg.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_lucifron.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_lucifron.cpp
index d85d2604acd..c87d77ab73b 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_lucifron.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_lucifron.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_magmadar.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_magmadar.cpp
index 4e8b8c32396..de26001d185 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_magmadar.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_magmadar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_majordomo_executus.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_majordomo_executus.cpp
index ff96627b28e..9f5f815631a 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_majordomo_executus.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_majordomo_executus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp
index f27265444e6..852fcd3873b 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_ragnaros.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp
index e98fca723f3..e0ee20518b0 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_shazzrah.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/boss_sulfuron_harbinger.cpp b/src/bindings/scripts/scripts/zone/molten_core/boss_sulfuron_harbinger.cpp
index 93e8b478c93..cc0cb5c9f12 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/boss_sulfuron_harbinger.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/boss_sulfuron_harbinger.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/def_molten_core.h b/src/bindings/scripts/scripts/zone/molten_core/def_molten_core.h
index e728c863767..5874d8b9408 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/def_molten_core.h
+++ b/src/bindings/scripts/scripts/zone/molten_core/def_molten_core.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/molten_core/instance_molten_core.cpp b/src/bindings/scripts/scripts/zone/molten_core/instance_molten_core.cpp
index 5c783edfe10..bfaa583e033 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/instance_molten_core.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/instance_molten_core.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/molten_core/molten_core.cpp b/src/bindings/scripts/scripts/zone/molten_core/molten_core.cpp
index 8d9977957d6..d25ddc7631c 100644
--- a/src/bindings/scripts/scripts/zone/molten_core/molten_core.cpp
+++ b/src/bindings/scripts/scripts/zone/molten_core/molten_core.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp b/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp
index 8b6e61c9dd6..0431f348f83 100644
--- a/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp
+++ b/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/mulgore/mulgore.cpp b/src/bindings/scripts/scripts/zone/mulgore/mulgore.cpp
index 1b581bf65a9..d6d905eaa86 100644
--- a/src/bindings/scripts/scripts/zone/mulgore/mulgore.cpp
+++ b/src/bindings/scripts/scripts/zone/mulgore/mulgore.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp b/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp
index 2e24f802e6b..b90ba14104f 100644
--- a/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp
+++ b/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -125,7 +125,7 @@ struct TRINITY_DLL_DECL mob_lumpAI : public ScriptedAI
m_creature->DeleteThreatList();
m_creature->CombatStop();
m_creature->setFaction(1080); //friendly
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_SIT);
+ m_creature->SetStandState(UNIT_STAND_STATE_SIT);
DoScriptText(LUMP_DEFEAT, m_creature);
bReset = true;
@@ -139,7 +139,7 @@ struct TRINITY_DLL_DECL mob_lumpAI : public ScriptedAI
m_creature->RemoveAura(SPELL_VISUAL_SLEEP,0);
if (!m_creature->IsStandState())
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_NONE);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
switch(rand()%2)
{
@@ -227,7 +227,7 @@ struct TRINITY_DLL_DECL mob_sunspring_villagerAI : public ScriptedAI
void Reset()
{
m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 32);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,7); // lay down
+ m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
}
void Aggro(Unit *who) {}
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
index 9995ed95069..6e8fb71f155 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -16,7 +16,7 @@
/* ScriptData
SDName: Boss_Anubrekhan
-SD%Complete: 70
+SD%Complete: 100
SDComment:
SDCategory: Naxxramas
EndScriptData */
@@ -38,7 +38,7 @@ EndScriptData */
#define SPELL_LOCUSTSWARM 28785 //This is a self buff that triggers the dmg debuff
#define H_SPELL_LOCUSTSWARM 54021
-//invalid
+//spellId invalid
#define SPELL_SUMMONGUARD 29508 //Summons 1 crypt guard at targeted location
#define SPELL_SELF_SPAWN_5 29105 //This spawns 5 corpse scarabs ontop of us (most likely the player casts this on death)
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
index 8ac7d8a5c5e..19ec0ed8487 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Boss_Faerlina
SD%Complete: 50
-SDComment: Without Mindcontrol boss cannot be defeated
+SDComment:
SDCategory: Naxxramas
EndScriptData */
@@ -32,6 +32,8 @@ EndScriptData */
#define SAY_SLAY2 -1533015
#define SAY_DEATH -1533016
+//#define SOUND_RANDOM_AGGRO 8955 //soundId containing the 4 aggro sounds, we not using this
+
#define SPELL_POSIONBOLT_VOLLEY 28796
#define H_SPELL_POSIONBOLT_VOLLEY 54098
#define SPELL_ENRAGE 28798
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_four_horsemen.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_four_horsemen.cpp
index 49815dd3164..26c9eb09f14 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_four_horsemen.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_four_horsemen.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
index 3817e0ceeee..f9e739c5be9 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gluth.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
index ed2ef9de4e6..0becff399da 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -41,8 +41,10 @@ EndScriptData */
#define SPELL_SHADOW_MARK 27825
//Unrelenting Rider
-#define SPELL_UNHOLY_AURA 28340
-#define SPELL_SHADOWBOLT 19729 //Search thru targets and find those who have the SHADOW_MARK to cast this on
+#define SPELL_UNHOLY_AURA 55606
+#define H_SPELL_UNHOLY_AURA 55608
+#define SPELL_SHADOWBOLT_VOLLEY 27831 //Search thru targets and find those who have the SHADOW_MARK to cast this on
+#define H_SPELL_SHADOWBOLT_VOLLEY 55638
//Spectral Trainee
#define SPELL_ARCANE_EXPLOSION 27989
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp
index 88ce581e6dd..e0bf157dc43 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
index 78921efff3d..d5f1e594d0c 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -21,20 +21,19 @@ SDComment: Place Holder
SDCategory: Naxxramas
EndScriptData */
-//Lotheb or Heigan?
-//8825 aggro1 - You are mine now!
-//8826 aggro2 - I see you!
-//8827 aggro3 - You...are next!
-//8828 death -
-//8829 slay - close your eyes... sleep
-//8830 taunt1 - The races of the world will perish. It is only a matter of time.
-//8831 taunt2 - I see endless suffering, I see torment, I see rage. I see... everything!
-//8832 taunt3 - Soon... the world will tremble!
-//8833 taunt4 - The end is upon you.
-//8834 taunt5 - Hungry worms will feast on your rotten flesh!
-
#include "precompiled.h"
+#define SAY_AGGRO1 -1533109
+#define SAY_AGGRO2 -1533110
+#define SAY_AGGRO3 -1533111
+#define SAY_SLAY -1533112
+#define SAY_TAUNT1 -1533113
+#define SAY_TAUNT2 -1533114
+#define SAY_TAUNT3 -1533115
+#define SAY_TAUNT4 -1533116
+#define SAY_TAUNT5 -1533117
+#define SAY_DEATH -1533118
+
//Spell used by floor peices to cause damage to players
#define SPELL_ERUPTION 29371
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_highlord_mograine.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_highlord_mograine.cpp
deleted file mode 100644
index 8f8ee3ed7b5..00000000000
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_highlord_mograine.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* ScriptData
-SDName: Boss_Highlord_Mograine
-SD%Complete: 100
-SDComment: SCRIPT OBSOLETE
-SDCategory: Naxxramas
-EndScriptData */
-
-#include "precompiled.h"
-
-//All horsemen
-#define SPELL_SHIELDWALL 29061
-#define SPELL_BESERK 26662
-
-// highlord mograine
-#define SPELL_MARK_OF_MOGRAINE 28834
-#define SPELL_RIGHTEOUS_FIRE 28882 // Applied as a 25% chance on melee hit to proc. m_creature->GetVictim()
-
-#define SAY_TAUNT1 "Enough prattling. Let them come! We shall grind their bones to dust."
-#define SAY_TAUNT2 "Conserve your anger! Harness your rage! You will all have outlets for your frustration soon enough."
-#define SAY_TAUNT3 "Life is meaningless. It is in death that we are truly tested."
-#define SAY_AGGRO1 "You seek death?"
-#define SAY_AGGRO2 "None shall pass!"
-#define SAY_AGGRO3 "Be still!"
-#define SAY_SLAY1 "You will find no peace in death."
-#define SAY_SLAY2 "The master's will is done."
-#define SAY_SPECIAL "Bow to the might of the Highlord!"
-#define SAY_DEATH "I... am... released! Perhaps it's not too late to - noo! I need... more time..."
-
-#define SOUND_TAUNT1 8842
-#define SOUND_TAUNT2 8843
-#define SOUND_TAUNT3 8844
-#define SOUND_AGGRO1 8835
-#define SOUND_AGGRO2 8836
-#define SOUND_AGGRO3 8837
-#define SOUND_SLAY1 8839
-#define SOUND_SLAY2 8840
-#define SOUND_SPECIAL 8841
-#define SOUND_DEATH 8838
-
-#define SPIRIT_OF_MOGRAINE 16775
-
-struct TRINITY_DLL_DECL boss_highlord_mograineAI : public ScriptedAI
-{
- boss_highlord_mograineAI(Creature *c) : ScriptedAI(c) {Reset();}
-
- uint32 Mark_Timer;
- uint32 RighteousFire_Timer;
- bool ShieldWall1;
- bool ShieldWall2;
-
- void Reset()
- {
- Mark_Timer = 20000; // First Horsemen Mark is applied at 20 sec.
- RighteousFire_Timer = 2000; // applied approx 1 out of 4 attacks
- ShieldWall1 = true;
- ShieldWall2 = true;
- }
-
- void InitialYell()
- {
- if(!InCombat)
- {
- switch(rand()%3)
- {
- case 0:
- DoYell(SAY_AGGRO1,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO1);
- break;
- case 1:
- DoYell(SAY_AGGRO2,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO2);
- break;
- case 2:
- DoYell(SAY_AGGRO3,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO3);
- break;
- }
- }
- }
-
- void KilledUnit()
- {
- switch(rand()%2)
- {
- case 0:
- DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY1);
- break;
- case 1:
- DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY2);
- break;
- }
- }
-
- void JustDied(Unit* Killer)
- {
- DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature, SOUND_DEATH);
- }
-
- void Aggro(Unit *who)
- {
- InitialYell();
- }
-
- void UpdateAI(const uint32 diff)
- {
- if (!UpdateVictim())
- return;
-
- // Mark of Mograine
- if(Mark_Timer < diff)
- {
- DoCast(m_creature->getVictim(),SPELL_MARK_OF_MOGRAINE);
- Mark_Timer = 12000;
- }else Mark_Timer -= diff;
-
- // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
- if(ShieldWall1 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 50)
- {
- if(ShieldWall1)
- {
- DoCast(m_creature,SPELL_SHIELDWALL);
- ShieldWall1 = false;
- }
- }
- if(ShieldWall2 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 20)
- {
- if(ShieldWall2)
- {
- DoCast(m_creature,SPELL_SHIELDWALL);
- ShieldWall2 = false;
- }
- }
-
- // Righteous Fire
- if(RighteousFire_Timer < diff)
- {
- if(rand()%4 == 1) // 1/4
- {
- DoCast(m_creature->getVictim(),SPELL_RIGHTEOUS_FIRE);
- }
- RighteousFire_Timer = 2000;
- }else RighteousFire_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
-};
-CreatureAI* GetAI_boss_highlord_mograine(Creature *_Creature)
-{
- return new boss_highlord_mograineAI (_Creature);
-}
-
-void AddSC_boss_highlord_mograine()
-{
- Script *newscript;
- newscript = new Script;
- newscript->Name="boss_highlord_mograine";
- newscript->GetAI = &GetAI_boss_highlord_mograine;
- newscript->RegisterSelf();
-}
-
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp
index 43619fcd0fe..bb285c3de4f 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_loatheb.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_loatheb.cpp
index bb10ce6802e..9b2458630e3 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_loatheb.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_loatheb.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,28 +23,6 @@ EndScriptData */
#include "precompiled.h"
-#define SAY_AGGRO1 "You are mine now!"
-#define SAY_AGGRO2 "I see you!"
-#define SAY_AGGRO3 "You...are next!"
-#define SAY_SLAY1 "Close your eyes... sleep!"
-#define SAY_SLAY2 "The races of the world will perish. It is only a matter of time."
-#define SAY_SLAY3 "I see endless suffering, I see torment, I see rage. I see... everything!"
-#define SAY_SLAY4 "Soon... the world will tremble!"
-#define SAY_SLAY5 "The end is upon you."
-#define SAY_SLAY6 "Hungry worms will feast on your rotten flesh!"
-#define SAY_DEATH ""
-
-#define SOUND_AGGRO1 8825
-#define SOUND_AGGRO2 8826
-#define SOUND_AGGRO3 8827
-#define SOUND_SLAY1 8829
-#define SOUND_SLAY2 8830
-#define SOUND_SLAY3 8831
-#define SOUND_SLAY4 8832
-#define SOUND_SLAY5 8833
-#define SOUND_SLAY6 8834
-#define SOUND_DEATH 8828
-
#define SPELL_CORRUPTED_MIND 29198
#define SPELL_POISON_AURA 29865
#define SPELL_INEVITABLE_DOOM 29204
@@ -85,58 +63,10 @@ struct TRINITY_DLL_DECL boss_loathebAI : public ScriptedAI
void Aggro(Unit *who)
{
- switch (rand()%3)
- {
- case 0:
- DoYell(SAY_AGGRO1,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO1);
- break;
- case 1:
- DoYell(SAY_AGGRO2,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO2);
- break;
- case 2:
- DoYell(SAY_AGGRO3,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO3);
- break;
- }
- }
-
- void KilledUnit(Unit* victim)
- {
- switch (rand()%6)
- {
- case 0:
- DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY1);
- break;
- case 1:
- DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY2);
- break;
- case 2:
- DoYell(SAY_SLAY3,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY3);
- break;
- case 3:
- DoYell(SAY_SLAY4,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY4);
- break;
- case 4:
- DoYell(SAY_SLAY5,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY5);
- break;
- case 5:
- DoYell(SAY_SLAY6,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SLAY6);
- break;
- }
}
void JustDied(Unit* Killer)
{
- DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_DEATH);
}
void UpdateAI(const uint32 diff)
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_maexxna.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_maexxna.cpp
index 2bf39656f4f..4885079646d 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_maexxna.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_maexxna.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -16,8 +16,8 @@
/* ScriptData
SDName: Boss_Maexxna
-SD%Complete: 80
-SDComment:
+SD%Complete: 60
+SDComment: this needs review, and rewrite of the webwrap ability
SDCategory: Naxxramas
EndScriptData */
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
index 7f399c2e859..857ec33e3fa 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp
index c36195c159e..9d96e35d572 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -16,8 +16,8 @@
/* ScriptData
SDName: Boss_Patchwerk
-SD%Complete: 100
-SDComment: Some issues with hateful strike inturrupting the melee swing timer. Probably core issue.
+SD%Complete: 80
+SDComment: Some issues with hateful strike inturrupting the melee swing timer.
SDCategory: Naxxramas
EndScriptData */
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp
index a078b98e396..77e1303f8b6 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
index 333d13e91f9..bf600c29eef 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_thaddius.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_thaddius.cpp
index a8bc620ec17..259c1589791 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_thaddius.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_thaddius.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Boss_Thaddius
SD%Complete: 0
-SDComment: Merge Feugen & Stalagg with this script
+SDComment: Placeholder. Includes Feugen & Stalagg.
SDCategory: Naxxramas
EndScriptData */
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
index e589630c15f..2ed8399f57a 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp b/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp
index 6d44bf52dc1..70add388c60 100644
--- a/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp
+++ b/src/bindings/scripts/scripts/zone/netherstorm/netherstorm.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -404,7 +404,7 @@ struct TRINITY_DLL_DECL npc_commander_dawnforgeAI : public ScriptedAI
cell.SetNoCreate();
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*m_creature, entry, true, range);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(pCreature, creature_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_creature, pCreature, creature_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
@@ -441,8 +441,8 @@ struct TRINITY_DLL_DECL npc_commander_dawnforgeAI : public ScriptedAI
ardonis->SendUpdateToPlayer(player);
//Set them to kneel
- m_creature->SetStandState(PLAYER_STATE_KNEEL);
- ardonis->SetStandState(PLAYER_STATE_KNEEL);
+ m_creature->SetStandState(UNIT_STAND_STATE_KNEEL);
+ ardonis->SetStandState(UNIT_STAND_STATE_KNEEL);
}
//Set them back to each other
@@ -466,8 +466,8 @@ struct TRINITY_DLL_DECL npc_commander_dawnforgeAI : public ScriptedAI
ardonis->SendUpdateToPlayer(player);
//Set state
- m_creature->SetStandState(PLAYER_STATE_NONE);
- ardonis->SetStandState(PLAYER_STATE_NONE);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
+ ardonis->SetStandState(UNIT_STAND_STATE_STAND);
}
}
@@ -639,7 +639,7 @@ Creature* SearchDawnforge(Player *source, uint32 entry, float range)
cell.SetNoCreate();
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*source, entry, true, range);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(pCreature, creature_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(source, pCreature, creature_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
diff --git a/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp b/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp
index 1e9298b2c7d..eff383f872b 100644
--- a/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp
+++ b/src/bindings/scripts/scripts/zone/onyxias_lair/boss_onyxia.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -125,7 +125,6 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (Phase == 1))
{
Phase = 2;
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->SetHover(true);
m_creature->GetMotionMaster()->Clear(false);
@@ -137,7 +136,6 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
{
Phase = 3;
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->SetHover(false);
m_creature->GetMotionMaster()->MovePoint(0, -10.6155, -219.357, -87.7344);
DoStartMovement(m_creature->getVictim());
diff --git a/src/bindings/scripts/scripts/zone/orgrimmar/orgrimmar.cpp b/src/bindings/scripts/scripts/zone/orgrimmar/orgrimmar.cpp
index 0f8616115be..68b2d6d3dd9 100644
--- a/src/bindings/scripts/scripts/zone/orgrimmar/orgrimmar.cpp
+++ b/src/bindings/scripts/scripts/zone/orgrimmar/orgrimmar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp b/src/bindings/scripts/scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp
index 4f9eff778ec..ff03a97481f 100644
--- a/src/bindings/scripts/scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp
+++ b/src/bindings/scripts/scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,15 +23,16 @@ EndScriptData */
#include "precompiled.h"
-#define SAY_0 "You'll never leave this place... alive."
-#define SAY_1 "Come, spirits, attend your master."
-#define SAY_SLAY "Too...easy!"
-#define SOUND_AGGRO 5825
-#define SOUND_SLAY 5826
-#define SOUND_SUMMON 5829
+#define SAY_AGGRO -1129000
+#define SAY_SUMMON60 -1129001
+#define SAY_SUMMON30 -1129002
+#define SAY_HP -1129003
+#define SAY_KILL -1129004
-#define SPELL_AMNENNARSWRATH 13009
-#define SPELL_FROSTBOLT 10179
+#define SPELL_AMNENNARSWRATH 13009
+#define SPELL_FROSTBOLT 15530
+#define SPELL_FROST_NOVA 15531
+#define SPELL_FROST_SPECTRES 12642
struct TRINITY_DLL_DECL boss_amnennar_the_coldbringerAI : public ScriptedAI
{
@@ -39,50 +40,29 @@ struct TRINITY_DLL_DECL boss_amnennar_the_coldbringerAI : public ScriptedAI
uint32 AmnenarsWrath_Timer;
uint32 FrostBolt_Timer;
- bool Spectrals;
- int Rand;
- int RandX;
- int RandY;
- Creature* Summoned;
+ uint32 FrostNova_Timer;
+ bool Spectrals60;
+ bool Spectrals30;
+ bool Hp;
void Reset()
{
AmnenarsWrath_Timer = 8000;
FrostBolt_Timer = 1000;
- Spectrals = false;
+ FrostNova_Timer = 10000 + rand()%5000;
+ Spectrals30 = false;
+ Spectrals60 = false;
+ Hp = false;
}
void Aggro(Unit *who)
{
- DoYell(SAY_0,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO);
+ DoScriptText(SAY_AGGRO, m_creature);
}
void KilledUnit()
{
- DoYell(SAY_SLAY, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature, SOUND_SLAY);
- }
-
- void SummonSpectrals(Unit* victim)
- {
- Rand = rand()%5;
- switch (rand()%2)
- {
- case 0: RandX = 0 - Rand; break;
- case 1: RandX = 0 + Rand; break;
- }
- Rand = 0;
- Rand = rand()%5;
- switch (rand()%2)
- {
- case 0: RandY = 0 - Rand; break;
- case 1: RandY = 0 + Rand; break;
- }
- Rand = 0;
- Summoned = DoSpawnCreature(8585, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
- if(Summoned)
- ((CreatureAI*)Summoned->AI())->AttackStart(victim);
+ DoScriptText(SAY_KILL, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -100,25 +80,34 @@ struct TRINITY_DLL_DECL boss_amnennar_the_coldbringerAI : public ScriptedAI
//FrostBolt_Timer
if (FrostBolt_Timer < diff)
{
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM,0);
- if (target) DoCast(target,SPELL_FROSTBOLT);
-
+ DoCast(m_creature->getVictim(),SPELL_FROSTBOLT);
FrostBolt_Timer = 8000;
} else FrostBolt_Timer -= diff;
- if ( !Spectrals && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 50 )
+ if (FrostNova_Timer < diff)
{
- DoYell(SAY_1, LANG_UNIVERSAL, NULL);
- DoPlaySoundToSet(m_creature, SOUND_SUMMON);
+ DoCast(m_creature,SPELL_FROST_NOVA);
+ FrostNova_Timer = 15000;
+ } else FrostNova_Timer -= diff;
- Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM,0);
+ if (!Spectrals60 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 60)
+ {
+ DoScriptText(SAY_SUMMON60, m_creature);
+ DoCast(m_creature->getVictim(),SPELL_FROST_SPECTRES);
+ Spectrals60 = true;
+ }
- SummonSpectrals(target);
- SummonSpectrals(target);
- SummonSpectrals(target);
- Spectrals = true;
+ if (!Hp && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 50)
+ {
+ DoScriptText(SAY_HP, m_creature);
+ Hp = true;
+ }
+
+ if (!Spectrals30 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
+ {
+ DoScriptText(SAY_SUMMON30, m_creature);
+ DoCast(m_creature->getVictim(),SPELL_FROST_SPECTRES);
+ Spectrals30 = true;
}
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/razorfen_kraul/razorfen_kraul.cpp b/src/bindings/scripts/scripts/zone/razorfen_kraul/razorfen_kraul.cpp
index 4af1cc89417..540c8e77c0b 100644
--- a/src/bindings/scripts/scripts/zone/razorfen_kraul/razorfen_kraul.cpp
+++ b/src/bindings/scripts/scripts/zone/razorfen_kraul/razorfen_kraul.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp
index df85b64f4e6..4ed8e3cb73f 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_buru.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_buru.cpp
index 4297c32492f..58c48540362 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_buru.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_buru.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp
index 6762e34f056..e1505496516 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp
index 5269ccb9486..6c293b4a1c1 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ossirian.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ossirian.cpp
index 1d389830045..5652b706917 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ossirian.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_ossirian.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_rajaxx.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_rajaxx.cpp
index 0639a02deb6..fb2c92ff59f 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_rajaxx.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/boss_rajaxx.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp
index 27a0621b2be..b94e6f16a80 100644
--- a/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp
+++ b/src/bindings/scripts/scripts/zone/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp
index 0b265560d55..51355f90198 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -23,6 +23,9 @@ EndScriptData */
#include "precompiled.h"
+#define SAY_AGGRO -1189019
+#define SAY_SPECIALAE -1189020
+
#define SPELL_POLYMORPH 12826
#define SPELL_AOESILENCE 8988
#define SPELL_ARCANEEXPLOSION3 8438
@@ -33,19 +36,12 @@ EndScriptData */
#define SPELL_MANASHIELD4 10191
#define SPELL_ARCANEBUBBLE 9438
-#define SAY_AGGRO "You will not defile these mysteries!"
-#define SAY_SPECIALAE "Burn in righteous fire!"
-
-#define SOUND_AGGRO 5842
-#define SOUND_SPECIALAE 5843
-
struct TRINITY_DLL_DECL boss_arcanist_doanAI : public ScriptedAI
{
boss_arcanist_doanAI(Creature *c) : ScriptedAI(c) {Reset();}
uint32 FullAOE_Timer;
uint32 Polymorph_Timer;
- uint32 Yell_Timer;
uint32 ArcaneBubble_Timer;
uint32 AoESilence_Timer;
uint32 ArcaneExplosion3_Timer;
@@ -58,7 +54,6 @@ struct TRINITY_DLL_DECL boss_arcanist_doanAI : public ScriptedAI
{
FullAOE_Timer = 5000;
Polymorph_Timer = 1;
- Yell_Timer = 2000;
ArcaneBubble_Timer = 3000;
AoESilence_Timer = 20000;
ArcaneExplosion3_Timer = 10000;
@@ -70,8 +65,7 @@ struct TRINITY_DLL_DECL boss_arcanist_doanAI : public ScriptedAI
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO);
+ DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -91,13 +85,6 @@ struct TRINITY_DLL_DECL boss_arcanist_doanAI : public ScriptedAI
Polymorph_Timer = 40000;
}else Polymorph_Timer -= diff;
- if (Yell_Timer < diff)
- {
- DoYell(SAY_SPECIALAE,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_SPECIALAE);
- Yell_Timer = 40000;
- }else Yell_Timer -= diff;
-
if (ArcaneBubble_Timer < diff)
{
DoCast(m_creature,SPELL_ARCANEBUBBLE);
@@ -106,6 +93,7 @@ struct TRINITY_DLL_DECL boss_arcanist_doanAI : public ScriptedAI
if (FullAOE_Timer < diff)
{
+ DoScriptText(SAY_SPECIALAE, m_creature);
DoCast(m_creature->getVictim(),SPELL_FIREAOE);
FullAOE_Timer = 40000;
}else FullAOE_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp
index 9422dfba60f..a7e1785eb4f 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp
index ed3a7f946a8..8688d6a8292 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -23,34 +23,29 @@ EndScriptData */
#include "precompiled.h"
+#define SAY_AGGRO -1189016
+#define SAY_HEALTH -1189017
+#define SAY_KILL -1189018
+
#define SPELL_FROSTNOVA2 865
#define SPELL_FLAMESHOCK3 8053
#define SPELL_SHADOWBOLT5 1106
#define SPELL_FLAMESPIKE 8814
#define SPELL_FIRENOVA 16079
-#define SAY_AGGRO "We hunger for vengeance."
-#define SAY_HEALTH "No rest... for the angry dead!"
-#define SAY_DEATH "More... More souls!"
-
-#define SOUND_AGGRO 5844
-#define SOUND_HEALTH 5846
-#define SOUND_DEATH 5845
-
struct TRINITY_DLL_DECL boss_bloodmage_thalnosAI : public ScriptedAI
{
boss_bloodmage_thalnosAI(Creature *c) : ScriptedAI(c) {Reset();}
+ bool HpYell;
uint32 FrostNova2_Timer;
uint32 FlameShock3_Timer;
uint32 ShadowBolt5_Timer;
uint32 FlameSpike_Timer;
uint32 FireNova_Timer;
- uint32 Yell_Timer;
void Reset()
{
- Yell_Timer = 1;
FrostNova2_Timer = 10000;
FlameShock3_Timer = 15000;
ShadowBolt5_Timer = 20000;
@@ -60,8 +55,12 @@ struct TRINITY_DLL_DECL boss_bloodmage_thalnosAI : public ScriptedAI
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO);
+ DoScriptText(SAY_AGGRO, m_creature);
+ }
+
+ void KilledUnit(Unit* Victim)
+ {
+ DoScriptText(SAY_KILL, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -70,16 +69,10 @@ struct TRINITY_DLL_DECL boss_bloodmage_thalnosAI : public ScriptedAI
return;
//If we are <35% hp
- if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 35)
+ if (!HpYell && ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 35))
{
- Yell_Timer -= diff;
-
- if (Yell_Timer < diff)
- {
- DoYell(SAY_HEALTH,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_HEALTH);
- Yell_Timer = 900000;
- }
+ DoScriptText(SAY_HEALTH, m_creature);
+ HpYell = true;
}
//FrostNova2_Timer
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp
index 7bbbd4d4bc9..013bebb860d 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -573,7 +573,7 @@ struct TRINITY_DLL_DECL boss_headless_horsemanAI : public ScriptedAI
DoCast(m_creature,SPELL_BODY_REGEN,true);
m_creature->CastSpell(Head, SPELL_FLYING_HEAD,true);
DoCast(m_creature,SPELL_CONFUSE,false); //test
- done_by->ProcDamageAndSpell(m_creature,PROC_FLAG_KILL_AND_GET_XP,PROC_FLAG_KILLED,PROC_EX_NONE,0);
+ done_by->ProcDamageAndSpell(m_creature,PROC_FLAG_KILL,PROC_FLAG_KILLED,PROC_EX_NONE,0);
whirlwind = 4000 + (rand()%5)*1000;
regen = 0;
}
@@ -736,7 +736,7 @@ struct TRINITY_DLL_DECL mob_pulsing_pumpkinAI : public ScriptedAI
sprouted = false;
DoCast(m_creature,SPELL_PUMPKIN_AURA,true);
DoCast(m_creature,SPELL_SPROUTING);
- m_creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_ROTATE);
+ m_creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_STUNNED);
}
void Aggro(Unit *who){}
@@ -747,7 +747,7 @@ struct TRINITY_DLL_DECL mob_pulsing_pumpkinAI : public ScriptedAI
{
sprouted = true;
m_creature->RemoveAllAuras();
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_ROTATE);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_STUNNED);
DoCast(m_creature,SPELL_SPROUT_BODY,true);
m_creature->UpdateEntry(PUMPKIN_FIEND);
DoStartMovement(m_creature->getVictim());
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_herod.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_herod.cpp
index f78677b51ab..d8486fa211d 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_herod.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_herod.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp
index fd9808d3e8c..63d167fb4c4 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp
index b5c54d3cc6e..1d193ba43eb 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -23,11 +23,10 @@ EndScriptData */
#include "precompiled.h"
-#define SPELL_SUMMONSCARLETHOUND 17164
-#define SPELL_ENRAGE 28747
+#define SAY_AGGRO -1189021
-#define SAY_AGGRO "Release the hounds!"
-#define SOUND_AGGRO 5841
+#define SPELL_SUMMONSCARLETHOUND 17164
+#define SPELL_ENRAGE 6742
struct TRINITY_DLL_DECL boss_houndmaster_lokseyAI : public ScriptedAI
{
@@ -37,15 +36,12 @@ struct TRINITY_DLL_DECL boss_houndmaster_lokseyAI : public ScriptedAI
void Reset()
{
- Enrage_Timer = 6000000;
+ Enrage_Timer = 0;
}
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO);
-
- DoCast(m_creature,SPELL_SUMMONSCARLETHOUND);
+ DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -53,16 +49,17 @@ struct TRINITY_DLL_DECL boss_houndmaster_lokseyAI : public ScriptedAI
if (!UpdateVictim())
return;
- //If we are <10% hp cast healing spells at self and Mograine
- if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10 && !m_creature->IsNonMeleeSpellCasted(false) && Enrage_Timer < diff)
+ //If we are <25% hp, bloodlust
+ if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 25 && Enrage_Timer < diff)
{
DoCast(m_creature,SPELL_ENRAGE);
- Enrage_Timer = 900000;
+ Enrage_Timer = 60000;
}else Enrage_Timer -= diff;
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_boss_houndmaster_loksey(Creature *_Creature)
{
return new boss_houndmaster_lokseyAI (_Creature);
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp
index 1f0dbe49dc6..83f115470e6 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -22,36 +22,53 @@ SDCategory: Scarlet Monastery
EndScriptData */
#include "precompiled.h"
+#include "def_scarlet_monastery.h"
-#define SPELL_POWERWORDSHIELD 6065
+#define SAY_AGGRO -1189011
+#define SAY_HEALTH1 -1189012
+#define SAY_HEALTH2 -1189013
+#define SAY_KILL -1189014
+#define SAY_TRIGGER_VORREL -1189015
-#define SAY_AGGRO "Tell me... tell me everything!"
-#define SAY_HEALTH1 "Naughty secrets"
-#define SAY_HEALTH2 "I'll rip the secrets from your flesh!"
-#define SAY_DEATH "Purged by pain!"
-
-#define SOUND_AGGRO 5847
-#define SOUND_HEALTH1 5849
-#define SOUND_HEALTH2 5850
-#define SOUND_DEATH 5848
+#define SPELL_POWERWORDSHIELD 2767
struct TRINITY_DLL_DECL boss_interrogator_vishasAI : public ScriptedAI
{
- boss_interrogator_vishasAI(Creature *c) : ScriptedAI(c) {Reset();}
+ boss_interrogator_vishasAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
+ Reset();
+ }
+
+ ScriptedInstance* pInstance;
- uint32 Yell_Timer;
+ bool Yell30;
+ bool Yell60;
uint32 PowerWordShield_Timer;
void Reset()
{
- Yell_Timer = 6000000;
PowerWordShield_Timer = 60000;
}
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO);
+ DoScriptText(SAY_AGGRO, m_creature);
+ }
+
+ void KilledUnit(Unit* Victim)
+ {
+ DoScriptText(SAY_KILL, m_creature);
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ if (!pInstance)
+ return;
+
+ //Any other actions to do with vorrel? setStandState?
+ if (Unit *vorrel = Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_VORREL)))
+ DoScriptText(SAY_TRIGGER_VORREL, vorrel);
}
void UpdateAI(const uint32 diff)
@@ -60,32 +77,16 @@ struct TRINITY_DLL_DECL boss_interrogator_vishasAI : public ScriptedAI
return;
//If we are low on hp Do sayings
- if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 60 && !m_creature->IsNonMeleeSpellCasted(false))
+ if (!Yell60 && ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 60))
{
- //Yell_Timer
- if (Yell_Timer < diff)
- {
- DoYell(SAY_HEALTH1,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_HEALTH1);
- return;
-
- //60 seconds until we should cast this agian
- Yell_Timer = 60000;
- }else Yell_Timer -= diff;
+ DoScriptText(SAY_HEALTH1, m_creature);
+ Yell60 = true;
}
- if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->IsNonMeleeSpellCasted(false))
+ if (!Yell30 && ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 30))
{
- //Yell_Timer
- if (Yell_Timer < diff)
- {
- DoYell(SAY_HEALTH2,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_HEALTH2);
- return;
-
- //60 seconds until we should cast this agian
- Yell_Timer = 6000000;
- }else Yell_Timer -= diff;
+ DoScriptText(SAY_HEALTH2, m_creature);
+ Yell30 = true;
}
//PowerWordShield_Timer
@@ -98,6 +99,7 @@ struct TRINITY_DLL_DECL boss_interrogator_vishasAI : public ScriptedAI
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_boss_interrogator_vishas(Creature *_Creature)
{
return new boss_interrogator_vishasAI (_Creature);
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_mograine_and_whitemane.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_mograine_and_whitemane.cpp
index 31ede8aa4c6..23e1e50ab75 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_mograine_and_whitemane.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_mograine_and_whitemane.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_scorn.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_scorn.cpp
index b0bb79cabcf..7542b4e4801 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_scorn.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_scorn.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/def_scarlet_monastery.h b/src/bindings/scripts/scripts/zone/scarlet_monastery/def_scarlet_monastery.h
index b8ab822129d..2b6399ae3e4 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/def_scarlet_monastery.h
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/def_scarlet_monastery.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
@@ -10,7 +10,9 @@
#define DATA_WHITEMANE 3
#define DATA_DOOR_WHITEMANE 4
-#define DATA_HORSEMAN_EVENT 5
-#define GAMEOBJECT_PUMPKIN_SHRINE 6
+#define DATA_HORSEMAN_EVENT 5
+#define GAMEOBJECT_PUMPKIN_SHRINE 6
+
+#define DATA_VORREL 7
#endif
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp
index 44152e6b4e0..4a2239f3b36 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -43,6 +43,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
uint64 MograineGUID;
uint64 WhitemaneGUID;
+ uint64 VorrelGUID;
uint64 DoorHighInquisitorGUID;
uint32 Encounter[ENCOUNTERS];
@@ -56,6 +57,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
MograineGUID = 0;
WhitemaneGUID = 0;
+ VorrelGUID = 0;
DoorHighInquisitorGUID = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
@@ -80,6 +82,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
case ENTRY_PUMPKIN: HorsemanAdds.insert(creature->GetGUID());break;
case 3976: MograineGUID = creature->GetGUID(); break;
case 3977: WhitemaneGUID = creature->GetGUID(); break;
+ case 3981: VorrelGUID = creature->GetGUID(); break;
}
}
@@ -92,7 +95,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
{
GameObject *Shrine = instance->GetGameObjectInMap(PumpkinShrineGUID);
if(Shrine)
- Shrine->SetUInt32Value(GAMEOBJECT_STATE,1);
+ Shrine->SetGoState(1);
}break;
case DATA_HORSEMAN_EVENT:
if (data == DONE)
@@ -106,7 +109,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
HorsemanAdds.clear();
GameObject *Shrine = instance->GetGameObjectInMap(PumpkinShrineGUID);
if(Shrine)
- Shrine->SetUInt32Value(GAMEOBJECT_STATE,1);
+ Shrine->SetGoState(1);
}
break;
}
@@ -121,6 +124,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
//case DATA_HEAD: return HeadGUID;
case DATA_MOGRAINE: return MograineGUID;
case DATA_WHITEMANE: return WhitemaneGUID;
+ case DATA_VORREL: return VorrelGUID;
case DATA_DOOR_WHITEMANE: return DoorHighInquisitorGUID;
}
return 0;
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_darkmaster_gandling.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_darkmaster_gandling.cpp
index 3f52b06ee54..d2e94ad4ab9 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_darkmaster_gandling.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_darkmaster_gandling.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -16,12 +16,13 @@
/* ScriptData
SDName: Boss_Darkmaster_Gandling
-SD%Complete: 99
+SD%Complete: 75
SDComment: Doors missing in instance script.
SDCategory: Scholomance
EndScriptData */
#include "precompiled.h"
+#include "def_scholomance.h"
#define SPELL_ARCANEMISSILES 22272
#define SPELL_SHADOWSHIELD 22417 //Not right ID. But 12040 is wrong either.
@@ -49,12 +50,19 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_darkmaster_gandlingAI : public ScriptedAI
{
- boss_darkmaster_gandlingAI(Creature *c) : ScriptedAI(c) {Reset();}
+ boss_darkmaster_gandlingAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
+ Reset();
+ }
+
+ ScriptedInstance* pInstance;
uint32 ArcaneMissiles_Timer;
uint32 ShadowShield_Timer;
uint32 Curse_Timer;
uint32 Teleport_Timer;
+
Creature *Summoned;
void Reset()
@@ -69,6 +77,12 @@ struct TRINITY_DLL_DECL boss_darkmaster_gandlingAI : public ScriptedAI
{
}
+ void JustDied(Unit *killer)
+ {
+ if (pInstance)
+ pInstance->SetData(TYPE_GANDLING, DONE);
+ }
+
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_death_knight_darkreaver.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_death_knight_darkreaver.cpp
index 9090ed148a0..6d18d2ba1bf 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_death_knight_darkreaver.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_death_knight_darkreaver.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp
index 139809ab16f..03d3b63e49d 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -24,6 +24,8 @@ EndScriptData */
#include "precompiled.h"
#include "def_scholomance.h"
+#define EMOTE_GENERIC_FRENZY_KILL -1000001
+
#define SPELL_REND 18106
#define SPELL_CLEAVE 15584
#define SPELL_FRENZY 28371
@@ -50,7 +52,7 @@ struct TRINITY_DLL_DECL boss_theolenkrastinovAI : public ScriptedAI
{
pInstance->SetData(DATA_DOCTORTHEOLENKRASTINOV_DEATH, 0);
- if(pInstance->GetData(DATA_CANSPAWNGANDLING))
+ if (pInstance->GetData(TYPE_GANDLING) == IN_PROGRESS)
m_creature->SummonCreature(1853, 180.73, -9.43856, 75.507, 1.61399, TEMPSUMMON_DEAD_DESPAWN, 0);
}
}
@@ -84,7 +86,7 @@ struct TRINITY_DLL_DECL boss_theolenkrastinovAI : public ScriptedAI
if (Frenzy_Timer < diff)
{
DoCast(m_creature,SPELL_FRENZY);
- DoTextEmote("goes into a killing frenzy!",NULL);
+ DoScriptText(EMOTE_GENERIC_FRENZY_KILL, m_creature);
Frenzy_Timer = 8000;
}else Frenzy_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_illucia_barov.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_illucia_barov.cpp
index 9072c8390de..dc77bc79800 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_illucia_barov.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_illucia_barov.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -53,7 +53,7 @@ struct TRINITY_DLL_DECL boss_illuciabarovAI : public ScriptedAI
{
pInstance->SetData(DATA_LADYILLUCIABAROV_DEATH, 0);
- if(pInstance->GetData(DATA_CANSPAWNGANDLING))
+ if (pInstance->GetData(TYPE_GANDLING) == IN_PROGRESS)
m_creature->SummonCreature(1853, 180.73, -9.43856, 75.507, 1.61399, TEMPSUMMON_DEAD_DESPAWN, 0);
}
}
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_instructor_malicia.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_instructor_malicia.cpp
index dcee4c8d2d5..e31f20aaa3e 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_instructor_malicia.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_instructor_malicia.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -60,7 +60,7 @@ struct TRINITY_DLL_DECL boss_instructormaliciaAI : public ScriptedAI
{
pInstance->SetData(DATA_INSTRUCTORMALICIA_DEATH, 0);
- if(pInstance->GetData(DATA_CANSPAWNGANDLING))
+ if (pInstance->GetData(TYPE_GANDLING) == IN_PROGRESS)
m_creature->SummonCreature(1853, 180.73, -9.43856, 75.507, 1.61399, TEMPSUMMON_DEAD_DESPAWN, 0);
}
}
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_jandice_barov.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_jandice_barov.cpp
index 01d9632ecf1..972fb9d1cfa 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_jandice_barov.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_jandice_barov.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_kormok.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_kormok.cpp
index fab849a59c1..0a630ad0cd9 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_kormok.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_kormok.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_lord_alexei_barov.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_lord_alexei_barov.cpp
index f1a2b4310d3..a76c07a6bd8 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_lord_alexei_barov.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_lord_alexei_barov.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -49,7 +49,7 @@ struct TRINITY_DLL_DECL boss_lordalexeibarovAI : public ScriptedAI
{
pInstance->SetData(DATA_LORDALEXEIBAROV_DEATH, 0);
- if(pInstance->GetData(DATA_CANSPAWNGANDLING))
+ if (pInstance->GetData(TYPE_GANDLING) == IN_PROGRESS)
m_creature->SummonCreature(1853, 180.73, -9.43856, 75.507, 1.61399, TEMPSUMMON_DEAD_DESPAWN, 0);
}
}
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp
index f78882af4cd..0f33e8d38d7 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -53,7 +53,7 @@ struct TRINITY_DLL_DECL boss_lorekeeperpolkeltAI : public ScriptedAI
{
pInstance->SetData(DATA_LOREKEEPERPOLKELT_DEATH, 0);
- if(pInstance->GetData(DATA_CANSPAWNGANDLING))
+ if (pInstance->GetData(TYPE_GANDLING) == IN_PROGRESS)
m_creature->SummonCreature(1853, 180.73, -9.43856, 75.507, 1.61399, TEMPSUMMON_DEAD_DESPAWN, 0);
}
}
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_ras_frostwhisper.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_ras_frostwhisper.cpp
index 06ebd10c80b..3ca8b414673 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_ras_frostwhisper.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_ras_frostwhisper.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_the_ravenian.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_the_ravenian.cpp
index 92b13248d63..ccb9a79e150 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_the_ravenian.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_the_ravenian.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -29,8 +29,6 @@ EndScriptData */
#define SPELL_SUNDERINCLEAVE 25174
#define SPELL_KNOCKAWAY 10101
-#define SAY_AGGRO1 "Mine! Mine! Mine! Gizlock is the ruler of this domain! You shall never reveal my presence!"
-
struct TRINITY_DLL_DECL boss_theravenianAI : public ScriptedAI
{
boss_theravenianAI(Creature *c) : ScriptedAI(c) {Reset();}
@@ -57,14 +55,13 @@ struct TRINITY_DLL_DECL boss_theravenianAI : public ScriptedAI
{
pInstance->SetData(DATA_THERAVENIAN_DEATH, 0);
- if(pInstance->GetData(DATA_CANSPAWNGANDLING))
+ if (pInstance->GetData(TYPE_GANDLING) == IN_PROGRESS)
m_creature->SummonCreature(1853, 180.73, -9.43856, 75.507, 1.61399, TEMPSUMMON_DEAD_DESPAWN, 0);
}
}
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO1, LANG_UNIVERSAL, NULL);
}
void UpdateAI(const uint32 diff)
@@ -103,6 +100,7 @@ struct TRINITY_DLL_DECL boss_theravenianAI : public ScriptedAI
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_boss_theravenian(Creature *_Creature)
{
return new boss_theravenianAI (_Creature);
diff --git a/src/bindings/scripts/scripts/zone/scholomance/boss_vectus.cpp b/src/bindings/scripts/scripts/zone/scholomance/boss_vectus.cpp
index 18b3168e43c..c85ac0158b2 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/boss_vectus.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/boss_vectus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,6 +23,8 @@ EndScriptData */
#include "precompiled.h"
+#define EMOTE_GENERIC_FRENZY_KILL -1000001
+
#define SPELL_FIRESHIELD 19626
#define SPELL_BLASTWAVE 13021
#define SPELL_FRENZY 28371
@@ -71,7 +73,7 @@ struct TRINITY_DLL_DECL boss_vectusAI : public ScriptedAI
if (Frenzy_Timer < diff)
{
DoCast(m_creature,SPELL_FRENZY);
- DoTextEmote("goes into a killing frenzy!",NULL);
+ DoScriptText(EMOTE_GENERIC_FRENZY_KILL, m_creature);
Frenzy_Timer = 24000;
}else Frenzy_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/scholomance/def_scholomance.h b/src/bindings/scripts/scripts/zone/scholomance/def_scholomance.h
index 0216a48fc74..83ce26c9687 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/def_scholomance.h
+++ b/src/bindings/scripts/scripts/zone/scholomance/def_scholomance.h
@@ -1,16 +1,17 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
#ifndef DEF_SCHOLOMANCE_H
#define DEF_SCHOLOMANCE_H
-#define DATA_CANSPAWNGANDLING 1
+#define TYPE_GANDLING 1
#define DATA_DOCTORTHEOLENKRASTINOV_DEATH 2
#define DATA_INSTRUCTORMALICIA_DEATH 3
#define DATA_LADYILLUCIABAROV_DEATH 4
#define DATA_LORDALEXEIBAROV_DEATH 5
#define DATA_LOREKEEPERPOLKELT_DEATH 6
#define DATA_THERAVENIAN_DEATH 7
+#define TYPE_KIRTONOS 8
#endif
diff --git a/src/bindings/scripts/scripts/zone/scholomance/instance_scholomance.cpp b/src/bindings/scripts/scripts/zone/scholomance/instance_scholomance.cpp
index 74b90dfdf53..d99546fbcea 100644
--- a/src/bindings/scripts/scripts/zone/scholomance/instance_scholomance.cpp
+++ b/src/bindings/scripts/scripts/zone/scholomance/instance_scholomance.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -24,36 +24,65 @@ EndScriptData */
#include "precompiled.h"
#include "def_scholomance.h"
+#define GO_GATE_KIRTONOS 175570
+#define GO_GATE_GANDLING 177374
+#define GO_GATE_MALICIA 177375
+#define GO_GATE_THEOLEN 177377
+#define GO_GATE_POLKELT 177376
+#define GO_GATE_RAVENIAN 177372
+#define GO_GATE_BAROV 177373
+#define GO_GATE_ILLUCIA 177371
+
+#define ENCOUNTERS 2
+
struct TRINITY_DLL_DECL instance_scholomance : public ScriptedInstance
{
instance_scholomance(Map *map) : ScriptedInstance(map) {Initialize();};
//Lord Alexei Barov, Doctor Theolen Krastinov, The Ravenian, Lorekeeper Polkelt, Instructor Malicia and the Lady Illucia Barov.
bool IsBossDied[6];
+ uint32 Encounter[ENCOUNTERS];
- void Initialize()
- {
- IsBossDied[0] = false;
- IsBossDied[1] = false;
- IsBossDied[2] = false;
- IsBossDied[3] = false;
- IsBossDied[4] = false;
- IsBossDied[5] = false;
- }
+ uint64 GateKirtonosGUID;
+ uint64 GateGandlingGUID;
+ uint64 GateMiliciaGUID;
+ uint64 GateTheolenGUID;
+ uint64 GatePolkeltGUID;
+ uint64 GateRavenianGUID;
+ uint64 GateBarovGUID;
+ uint64 GateIlluciaGUID;
- bool IsEncounterInProgress() const
+ void Initialize()
{
- //not active in scholomance
- return false;
+ GateKirtonosGUID = 0;
+ GateGandlingGUID = 0;
+ GateMiliciaGUID = 0;
+ GateTheolenGUID = 0;
+ GatePolkeltGUID = 0;
+ GateRavenianGUID = 0;
+ GateBarovGUID = 0;
+ GateIlluciaGUID = 0;
+
+ for(uint8 i = 0; i < 6; i++)
+ IsBossDied[i] = false;
+
+ for(uint8 i = 0; i < ENCOUNTERS; i++)
+ Encounter[i] = NOT_STARTED;
}
- uint32 GetData(uint32 type)
+ void OnObjectCreate(GameObject *go)
{
- if(type == DATA_CANSPAWNGANDLING)
- if(IsBossDied[0] && IsBossDied[1] && IsBossDied[2] && IsBossDied[3] && IsBossDied[4] && IsBossDied[5])
- return 1;
-
- return 0;
+ switch(go->GetEntry())
+ {
+ case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
+ case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
+ case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
+ case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
+ case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
+ case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
+ case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
+ case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
+ }
}
void SetData(uint32 type, uint32 data)
@@ -63,28 +92,43 @@ struct TRINITY_DLL_DECL instance_scholomance : public ScriptedInstance
case DATA_LORDALEXEIBAROV_DEATH:
IsBossDied[0] = true;
break;
-
case DATA_DOCTORTHEOLENKRASTINOV_DEATH:
IsBossDied[1] = true;
break;
-
case DATA_THERAVENIAN_DEATH:
IsBossDied[2] = true;
break;
-
case DATA_LOREKEEPERPOLKELT_DEATH:
IsBossDied[3] = true;
break;
-
case DATA_INSTRUCTORMALICIA_DEATH:
IsBossDied[4] = true;
break;
-
case DATA_LADYILLUCIABAROV_DEATH:
IsBossDied[5] = true;
break;
+ case TYPE_GANDLING:
+ Encounter[0] = data;
+ break;
+ case TYPE_KIRTONOS:
+ Encounter[1] = data;
+ break;
}
}
+
+ uint32 GetData(uint32 type)
+ {
+ if (type == TYPE_GANDLING)
+ {
+ if (IsBossDied[0] && IsBossDied[1] && IsBossDied[2] && IsBossDied[3] && IsBossDied[4] && IsBossDied[5])
+ {
+ Encounter[0] = IN_PROGRESS;
+ return IN_PROGRESS;
+ }
+ }
+
+ return 0;
+ }
};
InstanceData* GetInstanceData_instance_scholomance(Map* map)
diff --git a/src/bindings/scripts/scripts/zone/searing_gorge/searing_gorge.cpp b/src/bindings/scripts/scripts/zone/searing_gorge/searing_gorge.cpp
index fff417bcf21..4d55b5d91fd 100644
--- a/src/bindings/scripts/scripts/zone/searing_gorge/searing_gorge.cpp
+++ b/src/bindings/scripts/scripts/zone/searing_gorge/searing_gorge.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/def_shadowfang_keep.h b/src/bindings/scripts/scripts/zone/shadowfang_keep/def_shadowfang_keep.h
index 1612bfd59f0..8383a5c3950 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/def_shadowfang_keep.h
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/def_shadowfang_keep.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
index 3e7caef435f..0364c132447 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp b/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp
index cc07d76398d..9759f55a939 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/shadowfang_keep.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -50,7 +50,6 @@ struct TRINITY_DLL_DECL npc_shadowfang_prisonerAI : public npc_escortAI
{
if( pInstance && i == 6)
{
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
DoScriptText(SAY_FREE, m_creature);
pInstance->SetData(TYPE_FREE_NPC, DONE);
}
diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/boss_doomwalker.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/boss_doomwalker.cpp
index 99f1a91797d..87698fe7658 100644
--- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/boss_doomwalker.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/boss_doomwalker.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp
index 1a7e6b655e8..757bf6141e7 100644
--- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -56,8 +56,8 @@ struct TRINITY_DLL_DECL mob_mature_netherwing_drakeAI : public ScriptedAI
{
mob_mature_netherwing_drakeAI(Creature* c) : ScriptedAI(c)
{
- Reset();
PlayerGUID = 0;
+ Reset();
}
uint64 PlayerGUID;
@@ -179,9 +179,9 @@ struct TRINITY_DLL_DECL mob_enslaved_netherwing_drakeAI : public ScriptedAI
{
mob_enslaved_netherwing_drakeAI(Creature* c) : ScriptedAI(c)
{
- Reset();
PlayerGUID = 0;
Tapped = false;
+ Reset();
}
uint64 PlayerGUID;
diff --git a/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp b/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
index fbad656adcc..460a19aeb59 100644
--- a/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
+++ b/src/bindings/scripts/scripts/zone/shattrath/shattrath_city.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/silithus/silithus.cpp b/src/bindings/scripts/scripts/zone/silithus/silithus.cpp
index 35dca28ddc8..bd1ecf748a0 100644
--- a/src/bindings/scripts/scripts/zone/silithus/silithus.cpp
+++ b/src/bindings/scripts/scripts/zone/silithus/silithus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/silvermoon/silvermoon_city.cpp b/src/bindings/scripts/scripts/zone/silvermoon/silvermoon_city.cpp
index 2ce8e3eeaa3..c5bf5720624 100644
--- a/src/bindings/scripts/scripts/zone/silvermoon/silvermoon_city.cpp
+++ b/src/bindings/scripts/scripts/zone/silvermoon/silvermoon_city.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
@@ -47,7 +47,7 @@ struct TRINITY_DLL_DECL npc_blood_knight_stillbladeAI : public ScriptedAI
void Reset()
{
lifeTimer = 120000;
- m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 32);
+ m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,7); // lay down
spellHit = false;
}
@@ -63,7 +63,7 @@ struct TRINITY_DLL_DECL npc_blood_knight_stillbladeAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
- if (!m_creature->GetUInt32Value(UNIT_FIELD_BYTES_1))
+ if (m_creature->IsStandState())
{
if(lifeTimer < diff)
m_creature->AI()->EnterEvadeMode();
@@ -79,7 +79,7 @@ struct TRINITY_DLL_DECL npc_blood_knight_stillbladeAI : public ScriptedAI
{
((Player*)Hitter)->AreaExploredOrEventHappens(QUEST_REDEEMING_THE_DEAD);
DoCast(m_creature,SPELL_REVIVE_SELF);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
//m_creature->RemoveAllAuras();
DoScriptText(SAY_HEAL, m_creature);
diff --git a/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp b/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp
index f23f6d7fb4e..8dfda004d55 100644
--- a/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp
+++ b/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp b/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp
index 1ef6b15950a..5678c27e276 100644
--- a/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp
+++ b/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stormwind/stormwind_city.cpp b/src/bindings/scripts/scripts/zone/stormwind/stormwind_city.cpp
index 27395081a7a..16468a04b41 100644
--- a/src/bindings/scripts/scripts/zone/stormwind/stormwind_city.cpp
+++ b/src/bindings/scripts/scripts/zone/stormwind/stormwind_city.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -27,6 +27,7 @@ npc_bartleby
npc_dashel_stonefist
npc_general_marcus_jonathan
npc_lady_katrana_prestor
+npc_harbor_taxi
EndContentData */
#include "precompiled.h"
@@ -173,6 +174,8 @@ CreatureAI* GetAI_npc_dashel_stonefist(Creature *_creature)
## npc_general_marcus_jonathan
######*/
+#define SAY_GREETING -1000005
+
bool ReceiveEmote_npc_general_marcus_jonathan(Player *player, Creature *_Creature, uint32 emote)
{
if(player->GetTeam() == ALLIANCE)
@@ -184,7 +187,7 @@ bool ReceiveEmote_npc_general_marcus_jonathan(Player *player, Creature *_Creatur
}
if (emote == TEXTEMOTE_WAVE)
{
- _Creature->MonsterSay("Greetings citizen",LANG_COMMON,0);
+ DoScriptText(SAY_GREETING, _Creature, player);
}
}
return true;
@@ -236,6 +239,28 @@ bool GossipSelect_npc_lady_katrana_prestor(Player *player, Creature *_Creature,
return true;
}
+/*######
+## npc_harbor_taxi
+######*/
+
+#define GOSSIP_STORMWIND "I'd like to take a flight around Stormwind Harbor."
+
+bool GossipHello_npc_stormwind_harbor_taxi(Player *player, Creature *_Creature)
+{
+ player->ADD_GOSSIP_ITEM(0, GOSSIP_STORMWIND, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
+ player->SEND_GOSSIP_MENU(13454,_Creature->GetGUID());
+ return true;
+}
+
+bool GossipSelect_npc_stormwind_harbor_taxi(Player *player, Creature *_Creature, uint32 sender, uint32 action )
+{
+ if (action == GOSSIP_ACTION_INFO_DEF + 10)
+ {
+ player->GetSession()->SendDoFlight(1149, 1041);
+ }
+ return true;
+}
+
void AddSC_stormwind_city()
{
Script *newscript;
@@ -268,5 +293,11 @@ void AddSC_stormwind_city()
newscript->pGossipHello = &GossipHello_npc_lady_katrana_prestor;
newscript->pGossipSelect = &GossipSelect_npc_lady_katrana_prestor;
newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="npc_stormwind_harbor_taxi";
+ newscript->pGossipHello = &GossipHello_npc_stormwind_harbor_taxi;
+ newscript->pGossipSelect = &GossipSelect_npc_stormwind_harbor_taxi;
+ newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp b/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp
index 7f9bb894572..d9da6ee786b 100644
--- a/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp
+++ b/src/bindings/scripts/scripts/zone/stranglethorn_vale/stranglethorn_vale.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_baron_rivendare.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_baron_rivendare.cpp
index 9d6b3b591e5..0b612bbf3b9 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_baron_rivendare.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_baron_rivendare.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_baroness_anastari.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_baroness_anastari.cpp
index c082da10554..3c9a343c84f 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_baroness_anastari.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_baroness_anastari.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_cannon_master_willey.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_cannon_master_willey.cpp
index 8be1f7f4f87..7a4e71a5413 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_cannon_master_willey.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_cannon_master_willey.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp
index f44585d9e23..bac6d4bcb7d 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_magistrate_barthilas.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_magistrate_barthilas.cpp
index 47522bda5f0..e4f7903d897 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_magistrate_barthilas.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_magistrate_barthilas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_maleki_the_pallid.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_maleki_the_pallid.cpp
index 4a9b9159e6a..b9bd3349d7d 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_maleki_the_pallid.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_maleki_the_pallid.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_nerubenkan.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_nerubenkan.cpp
index 455b544b1d7..b1376ef7cd6 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_nerubenkan.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_nerubenkan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_order_of_silver_hand.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_order_of_silver_hand.cpp
index 8aaafcc2517..71ec3d59fed 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_order_of_silver_hand.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_order_of_silver_hand.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_postmaster_malown.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_postmaster_malown.cpp
index 18f8af2a0c6..5edf47787fd 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_postmaster_malown.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_postmaster_malown.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_ramstein_the_gorger.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_ramstein_the_gorger.cpp
index 9467dde2511..f729e2e34ce 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_ramstein_the_gorger.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_ramstein_the_gorger.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp b/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp
index 45a214dd75a..9458964712b 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/def_stratholme.h b/src/bindings/scripts/scripts/zone/stratholme/def_stratholme.h
index 79dd277c999..b9246091a7c 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/def_stratholme.h
+++ b/src/bindings/scripts/scripts/zone/stratholme/def_stratholme.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/stratholme/instance_stratholme.cpp b/src/bindings/scripts/scripts/zone/stratholme/instance_stratholme.cpp
index 142c38f06d6..62b210313a1 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/instance_stratholme.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/instance_stratholme.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp b/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp
index e3eba9074a9..3a5e9c0daa7 100644
--- a/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp
+++ b/src/bindings/scripts/scripts/zone/stratholme/stratholme.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -72,10 +72,10 @@ bool GOHello_go_gauntlet_gate(Player *player, GameObject* _GO)
######*/
//Possibly more of these quotes around.
-#define SAY_ZAPPED0 "Thanks to Egan"
-#define SAY_ZAPPED1 "Rivendare must die"
-#define SAY_ZAPPED2 "Who you gonna call?"
-#define SAY_ZAPPED3 "Don't cross those beams!"
+#define SAY_ZAPPED0 -1329000
+#define SAY_ZAPPED1 -1329001
+#define SAY_ZAPPED2 -1329002
+#define SAY_ZAPPED3 -1329003
struct TRINITY_DLL_DECL mob_freed_soulAI : public ScriptedAI
{
@@ -85,10 +85,10 @@ struct TRINITY_DLL_DECL mob_freed_soulAI : public ScriptedAI
{
switch (rand()%4)
{
- case 0: DoSay(SAY_ZAPPED0,LANG_UNIVERSAL,NULL); break;
- case 1: DoSay(SAY_ZAPPED1,LANG_UNIVERSAL,NULL); break;
- case 2: DoSay(SAY_ZAPPED2,LANG_UNIVERSAL,NULL); break;
- case 3: DoSay(SAY_ZAPPED3,LANG_UNIVERSAL,NULL); break;
+ case 0: DoScriptText(SAY_ZAPPED0, m_creature); break;
+ case 1: DoScriptText(SAY_ZAPPED1, m_creature); break;
+ case 2: DoScriptText(SAY_ZAPPED2, m_creature); break;
+ case 3: DoScriptText(SAY_ZAPPED3, m_creature); break;
}
}
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp
index 124aa8bb680..e1235155f71 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp
index 9f2324f5651..471a2acef16 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -546,31 +546,31 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
case 0: DoPlaySoundToSet(m_creature,SOUND_INTRO); return 0;
case 1:
if(Sacrolash)
- Sacrolash->Yell(YELL_INTRO_SAC_1, LANG_UNIVERSAL,NULL);
+ Sacrolash->MonsterYell(YELL_INTRO_SAC_1, LANG_UNIVERSAL,NULL);
return 1000;
case 2:
- m_creature->Yell(YELL_INTRO_ALY_2, LANG_UNIVERSAL,NULL);
+ m_creature->MonsterYell(YELL_INTRO_ALY_2, LANG_UNIVERSAL,NULL);
return 1000;
case 3:
if(Sacrolash)
- Sacrolash->Yell(YELL_INTRO_SAC_3, LANG_UNIVERSAL,NULL);
+ Sacrolash->MonsterYell(YELL_INTRO_SAC_3, LANG_UNIVERSAL,NULL);
return 2000;
case 4:
- m_creature->Yell(YELL_INTRO_ALY_4, LANG_UNIVERSAL,NULL);
+ m_creature->MonsterYell(YELL_INTRO_ALY_4, LANG_UNIVERSAL,NULL);
return 1000;
case 5:
if(Sacrolash)
- Sacrolash->Yell(YELL_INTRO_SAC_5, LANG_UNIVERSAL,NULL);
+ Sacrolash->MonsterYell(YELL_INTRO_SAC_5, LANG_UNIVERSAL,NULL);
return 2000;
case 6:
- m_creature->Yell(YELL_INTRO_ALY_6, LANG_UNIVERSAL,NULL);
+ m_creature->MonsterYell(YELL_INTRO_ALY_6, LANG_UNIVERSAL,NULL);
return 1000;
case 7:
if(Sacrolash)
- Sacrolash->Yell(YELL_INTRO_SAC_7, LANG_UNIVERSAL,NULL);
+ Sacrolash->MonsterYell(YELL_INTRO_SAC_7, LANG_UNIVERSAL,NULL);
return 3000;
case 8:
- m_creature->Yell(YELL_INTRO_ALY_8, LANG_UNIVERSAL,NULL);
+ m_creature->MonsterYell(YELL_INTRO_ALY_8, LANG_UNIVERSAL,NULL);
return 900000;
}
return 10000;
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
index 3a5512c9301..adea2dab4e2 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
@@ -493,7 +493,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
cell.SetNoCreate();
Trinity::AllCreaturesOfEntryInRange check(m_creature, entry, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_creature, templist, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp
index 539a3db3ab4..ec0ba0037ff 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -134,7 +134,7 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
m_creature->SetVisibility(VISIBILITY_ON);
- m_creature->SetStandState(PLAYER_STATE_SLEEP);
+ m_creature->SetStandState(UNIT_STAND_STATE_SLEEP);
ArcaneBuffetTimer = 8000;
FrostBreathTimer = 15000;
@@ -158,7 +158,7 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
void Aggro(Unit* who)
{
- m_creature->SetStandState(PLAYER_STATE_NONE);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
DoScriptText(SAY_EVIL_AGGRO, m_creature);
GameObject *Door = GameObject::GetGameObject(*m_creature, DoorGUID);
if(Door) Door->SetLootState(GO_ACTIVATED);
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h b/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h
index 0844d5dffe6..8ae61602616 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
index fd93aa15d6c..cd4f62584f0 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp b/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp
index 4cdf369d4d5..538aee596ec 100644
--- a/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp
+++ b/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp
index 746721a0e35..7b013c54781 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp
index 352ee66880d..8e17151c0c5 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/def_arcatraz.h b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/def_arcatraz.h
index 76f8d575383..3f8dee8bbd0 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/def_arcatraz.h
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/def_arcatraz.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/instance_arcatraz.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/instance_arcatraz.cpp
index ddf648d52fd..36ff863abe7 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/instance_arcatraz.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/instance_arcatraz.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_high_botanist_freywinn.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_high_botanist_freywinn.cpp
index f2b56ba9f8d..59ccd996236 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_high_botanist_freywinn.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_high_botanist_freywinn.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_laj.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_laj.cpp
index 86c8c6d91ad..1c4e27bac48 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_laj.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_laj.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_warp_splinter.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_warp_splinter.cpp
index ea623ddbd18..dd6344269de 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_warp_splinter.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/botanica/boss_warp_splinter.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
index 78e9d3edee1..3486f937214 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
@@ -228,12 +228,12 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
WaitEvent = WE_DUMMY;
return;
case WE_DIE:
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_DEAD);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
WaitTimer = 5000;
WaitEvent = WE_REVIVE;
return;
case WE_REVIVE:
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_NONE);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_STAND);
m_creature->SetHealth(m_creature->GetMaxHealth());
m_creature->SetSpeed(MOVE_RUN, DefaultMoveSpeedRate);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -333,7 +333,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
if(Charge_Timer < diff)
{
- Unit *target= SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRange(SPELL_CHARGE), true);
+ Unit *target= SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_CHARGE), true);
DoCast(target, SPELL_CHARGE);
Charge_Timer = 30000;
}else Charge_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
index 896ccc3a3bf..32432da45fc 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -121,6 +121,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI
Jump_Timer=8000;
Wrath_Timer = 20000+rand()%5000;//twice in phase one
Phase = 1;
+ Wrath_Timer = 20000+rand()%5000;//twice in phase one
if(pInstance)
pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED);
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
index 7d22b76ac70..be733b5c819 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -238,7 +238,7 @@ struct TRINITY_DLL_DECL advisorbase_ai : public ScriptedAI
m_creature->SetUInt64Value(UNIT_FIELD_TARGET,0);
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1,UNIT_STAND_STATE_DEAD);
if (pInstance->GetData(DATA_KAELTHASEVENT) == 3)
JustDied(pKiller);
@@ -344,7 +344,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
std::list<Creature*> PhoenixList;
Trinity::AllCreaturesOfEntryInRange check(m_creature, PHOENIX, 50);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(PhoenixList, check);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_creature, PhoenixList, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> visitor(searcher);
CellLock<GridReadGuard> cell_lock(cell, pair);
@@ -572,7 +572,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
//Subphase 2 - Start
case 2:
Advisor = (Creature*)(Unit::GetUnit((*m_creature), AdvisorGuid[0]));
- if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == PLAYER_STATE_DEAD))
+ if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == UNIT_STAND_STATE_DEAD))
{
DoScriptText(SAY_INTRO_SANGUINAR, m_creature);
@@ -606,7 +606,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
//Subphase 3 - Start
case 4:
Advisor = (Creature*)(Unit::GetUnit((*m_creature), AdvisorGuid[1]));
- if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == PLAYER_STATE_DEAD))
+ if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == UNIT_STAND_STATE_DEAD))
{
DoScriptText(SAY_INTRO_CAPERNIAN, m_creature);
@@ -640,7 +640,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
//Subphase 4 - Start
case 6:
Advisor = (Creature*)(Unit::GetUnit((*m_creature), AdvisorGuid[2]));
- if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == PLAYER_STATE_DEAD))
+ if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == UNIT_STAND_STATE_DEAD))
{
DoScriptText(SAY_INTRO_TELONICUS, m_creature);
@@ -676,7 +676,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
//End of phase 1
case 8:
Advisor = (Creature*)(Unit::GetUnit((*m_creature), AdvisorGuid[3]));
- if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == PLAYER_STATE_DEAD))
+ if(Advisor && (Advisor->GetUInt32Value(UNIT_FIELD_BYTES_1) == UNIT_STAND_STATE_DEAD))
{
Phase = 2;
pInstance->SetData(DATA_KAELTHASEVENT, 2);
@@ -1462,7 +1462,7 @@ struct TRINITY_DLL_DECL mob_phoenix_tkAI : public ScriptedAI
if(SummonEgg == 1){ //hack die animation
m_creature->RemoveAllAuras();
DoStartNoMovement(m_creature->getVictim());
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_DEAD);
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
SummonEgg = 2;
Cycle_Timer = 1000;
}
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp
index 13ef44b29d2..66ee717bc4f 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h
index 7162fb90199..d0d3ea09061 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
index 6f7dcb0f10d..bc407a3de99 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -77,7 +77,7 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 20064: ThaladredTheDarkener = creature->GetGUID(); break;
case 20063: MasterEngineerTelonicus = creature->GetGUID(); break;
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/the_eye.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/the_eye.cpp
index 65190e375d5..83ba68c955c 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/the_eye.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/the_eye.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp
index c77989e27f3..268cfeb2918 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp
index cdbfd0a6367..2fcf154eb67 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp
index 93b653a344c..da576d9ebbc 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -110,7 +110,7 @@ boss_nethermancer_sepethreaAI(Creature *c) : ScriptedAI(c)
if(frost_attack_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FROST_ATTACK);
- frost_attack_Timer = 7000 + rand()%30000;
+ frost_attack_Timer = 7000 + rand()%3000;
}else frost_attack_Timer -= diff;
//Arcane Blast
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp
index 4511b76e757..dd46457c759 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/instance_mechanar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/instance_mechanar.cpp
index d2c62b89234..d5506fbf44e 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/instance_mechanar.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_mechanar/instance_mechanar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
index 1b262fa2d0c..70cba44e8d6 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp
index 6bdb489fc65..96801fd334b 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -1257,7 +1257,7 @@ void flesh_tentacleAI::JustDied(Unit* killer)
{
if (!Parent)
{
- DoYell("Error: No Parent variable", LANG_UNIVERSAL, NULL);
+ error_log("TSCR: flesh_tentacle: No Parent variable");
return;
}
@@ -1265,7 +1265,7 @@ void flesh_tentacleAI::JustDied(Unit* killer)
if (Cthun)
((cthunAI*)(Cthun->AI()))->FleshTentcleKilled();
- else DoYell("Error: No Cthun", LANG_UNIVERSAL, NULL);
+ else error_log("TSCR: flesh_tentacle: No Cthun");
}
//GetAIs
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_fankriss.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_fankriss.cpp
index 159e67604da..b06225344a0 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_fankriss.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_fankriss.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp
index baaa7d5a9a0..7d39c026cbc 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,6 +23,9 @@ EndScriptData */
#include "precompiled.h"
+#define EMOTE_GENERIC_FRENZY_KILL -1000001
+#define EMOTE_GENERIC_BERSERK -1000004
+
#define SPELL_FRENZY 26051
#define SPELL_BERSERK 26068
#define SPELL_POISONBOLT 26052
@@ -71,6 +74,7 @@ struct TRINITY_DLL_DECL boss_huhuranAI : public ScriptedAI
if (!Frenzy && Frenzy_Timer < diff)
{
DoCast(m_creature, SPELL_FRENZY);
+ DoScriptText(EMOTE_GENERIC_FRENZY_KILL, m_creature);
Frenzy = true;
PoisonBolt_Timer = 3000;
Frenzy_Timer = 25000 + rand()%10000;
@@ -119,7 +123,7 @@ struct TRINITY_DLL_DECL boss_huhuranAI : public ScriptedAI
if ( !Berserk && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 31 )
{
m_creature->InterruptNonMeleeSpells(false);
- DoTextEmote("is going berserk", NULL);
+ DoScriptText(EMOTE_GENERIC_BERSERK, m_creature);
DoCast(m_creature, SPELL_BERSERK);
Berserk = true;
}
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp
index 7c760fcd099..35efe3f1dab 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_ouro.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp
index 52d9f2ddfbe..5b0495cb097 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -94,8 +94,12 @@ struct TRINITY_DLL_DECL boss_sarturaAI : public ScriptedAI
if (WhirlWindRandom_Timer < diff)
{
//Attack random Gamers
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1))
- AttackStart(target);
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,1);
+ if (target)
+ m_creature->AddThreat(target, 1.0f);
+ m_creature->TauntApply(target);
+ AttackStart(target);
WhirlWindRandom_Timer = 3000 + rand()%4000;
}else WhirlWindRandom_Timer -= diff;
@@ -119,8 +123,12 @@ struct TRINITY_DLL_DECL boss_sarturaAI : public ScriptedAI
if (AggroReset_Timer < diff)
{
//Attack random Gamers
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1))
- m_creature->TauntApply(target);
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,1);
+ if (target)
+ m_creature->AddThreat(target, 1.0f);
+ m_creature->TauntApply(target);
+ AttackStart(target);
AggroReset = true;
AggroReset_Timer = 2000 + rand()%3000;
@@ -213,8 +221,12 @@ struct TRINITY_DLL_DECL mob_sartura_royal_guardAI : public ScriptedAI
if (WhirlWindRandom_Timer < diff)
{
//Attack random Gamers
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1))
- m_creature->TauntApply(target);
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,1);
+ if (target)
+ m_creature->AddThreat(target, 1.0f);
+ m_creature->TauntApply(target);
+ AttackStart(target);
WhirlWindRandom_Timer = 3000 + rand()%4000;
}else WhirlWindRandom_Timer -= diff;
@@ -230,8 +242,12 @@ struct TRINITY_DLL_DECL mob_sartura_royal_guardAI : public ScriptedAI
if (AggroReset_Timer < diff)
{
//Attack random Gamers
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1))
- AttackStart(target);
+ Unit* target = NULL;
+ target = SelectUnit(SELECT_TARGET_RANDOM,1);
+ if (target)
+ m_creature->AddThreat(target, 1.0f);
+ m_creature->TauntApply(target);
+ AttackStart(target);
AggroReset = true;
AggroReset_Timer = 2000 + rand()%3000;
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp
index 436d39c14ed..8ecb7ef0a7a 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_skeram.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
index 266a013f872..92be01c4a6d 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -336,7 +336,7 @@ struct TRINITY_DLL_DECL boss_twinemperorsAI : public ScriptedAI
std::list<Creature*> unitList;
AnyBugCheck u_check(m_creature, 150);
- Trinity::CreatureListSearcher<AnyBugCheck> searcher(unitList, u_check);
+ Trinity::CreatureListSearcher<AnyBugCheck> searcher(m_creature, unitList, u_check);
TypeContainerVisitor<Trinity::CreatureListSearcher<AnyBugCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
CellLock<GridReadGuard> cell_lock(cell, p);
cell_lock->Visit(cell_lock, grid_creature_searcher, *(m_creature->GetMap()));
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_viscidus.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_viscidus.cpp
index 7b310dfe10d..2bb9f1bfb0b 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_viscidus.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_viscidus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/def_temple_of_ahnqiraj.h b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/def_temple_of_ahnqiraj.h
index 95db307f778..5d545ed7c74 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/def_temple_of_ahnqiraj.h
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/def_temple_of_ahnqiraj.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp
index 7ca0f33566f..9048591b774 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp
index 0ad6548514d..d86e3937b13 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -175,7 +175,7 @@ struct TRINITY_DLL_DECL aqsentinelAI : public ScriptedAI
std::list<Creature*> assistList;
NearbyAQSentinel u_check(nears);
- Trinity::CreatureListSearcher<NearbyAQSentinel> searcher(assistList, u_check);
+ Trinity::CreatureListSearcher<NearbyAQSentinel> searcher(m_creature, assistList, u_check);
TypeContainerVisitor<Trinity::CreatureListSearcher<NearbyAQSentinel>, GridTypeMapContainer > grid_creature_searcher(searcher);
CellLock<GridReadGuard> cell_lock(cell, p);
cell_lock->Visit(cell_lock, grid_creature_searcher, *(nears->GetMap()));
diff --git a/src/bindings/scripts/scripts/zone/terokkar_forest/terokkar_forest.cpp b/src/bindings/scripts/scripts/zone/terokkar_forest/terokkar_forest.cpp
index fdfc034fc5f..90ba27b2511 100644
--- a/src/bindings/scripts/scripts/zone/terokkar_forest/terokkar_forest.cpp
+++ b/src/bindings/scripts/scripts/zone/terokkar_forest/terokkar_forest.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -60,7 +60,7 @@ struct TRINITY_DLL_DECL mob_unkor_the_ruthlessAI : public ScriptedAI
CanDoQuest = false;
UnkorUnfriendly_Timer = 0;
Pulverize_Timer = 3000;
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_NONE);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->setFaction(FACTION_HOSTILE);
}
@@ -70,7 +70,7 @@ struct TRINITY_DLL_DECL mob_unkor_the_ruthlessAI : public ScriptedAI
{
DoScriptText(SAY_SUBMIT, m_creature);
m_creature->setFaction(FACTION_FRIENDLY);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_SIT);
+ m_creature->SetStandState(UNIT_STAND_STATE_SIT);
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
diff --git a/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp b/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp
index 62ca98928e6..c4c21fdc132 100644
--- a/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp
+++ b/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/thunder_bluff/thunder_bluff.cpp b/src/bindings/scripts/scripts/zone/thunder_bluff/thunder_bluff.cpp
index 07dd70cba81..e5d345bd0e7 100644
--- a/src/bindings/scripts/scripts/zone/thunder_bluff/thunder_bluff.cpp
+++ b/src/bindings/scripts/scripts/zone/thunder_bluff/thunder_bluff.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/tirisfal_glades/tirisfal_glades.cpp b/src/bindings/scripts/scripts/zone/tirisfal_glades/tirisfal_glades.cpp
index ee813c58f81..4e23707e371 100644
--- a/src/bindings/scripts/scripts/zone/tirisfal_glades/tirisfal_glades.cpp
+++ b/src/bindings/scripts/scripts/zone/tirisfal_glades/tirisfal_glades.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -100,7 +100,7 @@ GameObject* SearchMausoleumGo(Unit *source, uint32 entry, float range)
cell.SetNoCreate();
Trinity::NearestGameObjectEntryInObjectRangeCheck go_check(*source, entry, range);
- Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> searcher(pGo, go_check);
+ Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> searcher(source, pGo, go_check);
TypeContainerVisitor<Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer> go_searcher(searcher);
diff --git a/src/bindings/scripts/scripts/zone/uldaman/boss_ironaya.cpp b/src/bindings/scripts/scripts/zone/uldaman/boss_ironaya.cpp
index babb2ecab7b..85eede55913 100644
--- a/src/bindings/scripts/scripts/zone/uldaman/boss_ironaya.cpp
+++ b/src/bindings/scripts/scripts/zone/uldaman/boss_ironaya.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -23,12 +23,11 @@ EndScriptData */
#include "precompiled.h"
-#define SPELL_ARCINGSMASH 39144
-#define SPELL_KNOCKAWAY 22893
-#define SPELL_WSTOMP 16727
+#define SAY_AGGRO -1070000
-#define SAY_AGGRO "None may steal the secrets of the makers!"
-#define SOUND_AGGRO 5851
+#define SPELL_ARCINGSMASH 8374
+#define SPELL_KNOCKAWAY 10101
+#define SPELL_WSTOMP 11876
struct TRINITY_DLL_DECL boss_ironayaAI : public ScriptedAI
{
@@ -47,8 +46,7 @@ struct TRINITY_DLL_DECL boss_ironayaAI : public ScriptedAI
void Aggro(Unit *who)
{
- DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
- DoPlaySoundToSet(m_creature,SOUND_AGGRO);
+ DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
diff --git a/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp b/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
index 7a5e50805f1..a8a1820f0a4 100644
--- a/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
+++ b/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
@@ -70,7 +70,7 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
break;
case ANCIENT_VAULT_DOOR:
- go->SetUInt32Value(GAMEOBJECT_STATE,1);
+ go->SetGoState(1);
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
ancientVaultDoor = go->GetGUID();
break;
@@ -93,7 +93,7 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
return;
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
- go->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ go->SetGoState(0);
}
void ActivateStoneKeepers()
diff --git a/src/bindings/scripts/scripts/zone/uldaman/uldaman.cpp b/src/bindings/scripts/scripts/zone/uldaman/uldaman.cpp
index b9ca7de07a6..2fecc120d14 100644
--- a/src/bindings/scripts/scripts/zone/uldaman/uldaman.cpp
+++ b/src/bindings/scripts/scripts/zone/uldaman/uldaman.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/undercity/undercity.cpp b/src/bindings/scripts/scripts/zone/undercity/undercity.cpp
index 8b2de36e3e4..d1b7386ff31 100644
--- a/src/bindings/scripts/scripts/zone/undercity/undercity.cpp
+++ b/src/bindings/scripts/scripts/zone/undercity/undercity.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -174,8 +174,8 @@ struct TRINITY_DLL_DECL npc_highborne_lamenterAI : public ScriptedAI
{
if( EventMove_Timer < diff )
{
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
- m_creature->SendMonsterMoveWithSpeed(m_creature->GetPositionX(),m_creature->GetPositionY(),HIGHBORNE_LOC_Y_NEW,MOVEMENTFLAG_ONTRANSPORT,5000);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ m_creature->SendMonsterMoveWithSpeed(m_creature->GetPositionX(),m_creature->GetPositionY(),HIGHBORNE_LOC_Y_NEW,5000);
m_creature->GetMap()->CreatureRelocation(m_creature,m_creature->GetPositionX(),m_creature->GetPositionY(),HIGHBORNE_LOC_Y_NEW,m_creature->GetOrientation());
EventMove = false;
}else EventMove_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/boss_keleseth.cpp b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/boss_keleseth.cpp
new file mode 100644
index 00000000000..00c126a63c5
--- /dev/null
+++ b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/boss_keleseth.cpp
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Prince_Keleseth
+SD%Complete: 90
+SDComment: Needs Prince Movements, Needs adjustments to blizzlike timers, Needs Shadowbolt castbar, Needs right Ressurect Visual, Needs Some Heroic Spells
+SDCategory: Utgarde Keep
+EndScriptData */
+
+#include "precompiled.h"
+#include "def_utgarde_keep.h"
+
+#define SPELL_SHADOWBOLT 43667
+#define SPELL_SHADOWBOLT_HEROIC 59389
+#define SPELL_FROST_TOMB 48400
+#define SPELL_FROST_TOMB_SUMMON 42714
+#define SPELL_DECREPIFY 42702
+#define SPELL_SCOURGE_RESSURRECTION 42704
+#define CREATURE_FROSTTOMB 23965
+#define CREATURE_SKELETON 23970
+
+#define SAY_AGGRO -1574000
+#define SAY_KILL -1574001
+#define SAY_DEATH -1574002
+#define SAY_FROST_TOMB -1574003
+#define SAY_SKELETONS -1574004
+
+#define SKELETONSPAWN_Z 42.8668
+
+float SkeletonSpawnPoint[5][5]=
+{
+ {156.2559, 259.2093},
+ {156.2559, 259.2093},
+ {156.2559, 259.2093},
+ {156.2559, 259.2093},
+ {156.2559, 259.2093},
+};
+
+float AttackLoc[3]={197.636, 194.046, 40.8164};
+
+struct TRINITY_DLL_DECL mob_frost_tombAI : public ScriptedAI
+{
+ mob_frost_tombAI(Creature *c) : ScriptedAI(c)
+ {
+ FrostTombGUID = 0;
+ Reset();
+ }
+
+ uint64 FrostTombGUID;
+
+ void SetPrisoner(Unit* uPrisoner)
+ {
+ FrostTombGUID = uPrisoner->GetGUID();
+ }
+
+ void Reset(){ FrostTombGUID = 0; }
+ void Aggro(Unit* who) {}
+ void AttackStart(Unit* who) {}
+ void MoveInLineOfSight(Unit* who) {}
+
+ void JustDied(Unit *killer)
+ {
+ if(FrostTombGUID)
+ {
+ Unit* FrostTomb = Unit::GetUnit((*m_creature),FrostTombGUID);
+ if(FrostTomb)
+ FrostTomb->RemoveAurasDueToSpell(SPELL_FROST_TOMB);
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ Unit* temp = Unit::GetUnit((*m_creature),FrostTombGUID);
+ if((temp && temp->isAlive() && !temp->HasAura(SPELL_FROST_TOMB,0)) || !temp )
+ m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ }
+};
+
+struct TRINITY_DLL_DECL boss_kelesethAI : public ScriptedAI
+{
+ boss_kelesethAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Reset();
+ Heroic = c->GetMap()->IsHeroic();
+ }
+
+ ScriptedInstance* pInstance;
+
+ uint32 FrostTombTimer;
+ uint32 SummonSkeletonsTimer;
+ uint32 RespawnSkeletonsTimer;
+ uint32 ShadowboltTimer;
+ uint64 SkeletonGUID[5];
+ bool Skeletons;
+ bool Heroic;
+ bool RespawnSkeletons;
+
+ void Reset()
+ {
+ ShadowboltTimer = 0;
+ Skeletons = false;
+
+ ResetTimer();
+
+ if(pInstance)
+ pInstance->SetData(DATA_PRINCEKELESETH, NOT_STARTED);
+ }
+
+ void KilledUnit(Unit *victim)
+ {
+ if(victim == m_creature)
+ return;
+
+ DoScriptText(SAY_KILL, m_creature);
+ }
+
+ void JustDied(Unit* killer)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_PRINCEKELESETH, DONE);
+
+ DoScriptText(SAY_DEATH, m_creature);
+ }
+
+ void Aggro(Unit* who)
+ {
+ if(pInstance)
+ pInstance->SetData(DATA_PRINCEKELESETH, IN_PROGRESS);
+
+ DoScriptText(SAY_AGGRO, m_creature);
+ DoZoneInCombat();
+ }
+
+ void ResetTimer(uint32 inc = 0)
+ {
+ SummonSkeletonsTimer = 5000 + inc;
+ FrostTombTimer = 28000 + inc;
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if(ShadowboltTimer < diff)
+ {
+ Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
+ if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER)
+ m_creature->CastSpell(target, Heroic ? SPELL_SHADOWBOLT_HEROIC : SPELL_SHADOWBOLT, true);
+ ShadowboltTimer = 10000;
+ }else ShadowboltTimer -= diff;
+
+ if(!Skeletons)
+ if((SummonSkeletonsTimer < diff))
+ {
+ Creature* Skeleton;
+ DoScriptText(SAY_SKELETONS, m_creature);
+ for(uint8 i = 0; i < 5; ++i)
+ {
+ Skeleton = m_creature->SummonCreature(CREATURE_SKELETON, SkeletonSpawnPoint[i][0], SkeletonSpawnPoint[i][1] , SKELETONSPAWN_Z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000);
+ if(Skeleton)
+ {
+ Skeleton->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
+ Skeleton->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(), m_creature->GetPositionY() , m_creature->GetPositionZ());
+ Skeleton->AddThreat(m_creature->getVictim(), 0.0f);
+ DoZoneInCombat(Skeleton);
+ }
+ }
+ Skeletons = true;
+ }else SummonSkeletonsTimer -= diff;
+
+ if(FrostTombTimer < diff)
+ {
+ Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
+ if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER)
+ {
+ //DoCast(target, SPELL_FROST_TOMB_SUMMON, true);
+ Creature* Chains = m_creature->SummonCreature(CREATURE_FROSTTOMB, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000);
+ if(Chains)
+ {
+ ((mob_frost_tombAI*)Chains->AI())->SetPrisoner(target);
+ Chains->CastSpell(target, SPELL_FROST_TOMB, true);
+
+ DoScriptText(SAY_FROST_TOMB, m_creature);
+ }
+ }
+ FrostTombTimer = 15000;
+ }else FrostTombTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+struct TRINITY_DLL_DECL mob_vrykul_skeletonAI : public ScriptedAI
+{
+ mob_vrykul_skeletonAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = ((ScriptedInstance*)c->GetInstanceData());
+ Reset();
+ }
+
+ ScriptedInstance *pInstance;
+ uint32 Respawn_Time;
+ uint64 Target_Guid;
+ uint32 Decrepify_Timer;
+
+ bool isDead;
+
+ void Reset()
+ {
+ Respawn_Time = 12000;
+ Decrepify_Timer = 10000 + rand()%20000;
+ isDead = false;
+ }
+
+ void Aggro(Unit *who){}
+ void DamageTaken(Unit *done_by, uint32 &damage)
+ {
+ if(done_by->GetGUID() == m_creature->GetGUID())
+ return;
+
+ if(damage >= m_creature->GetHealth())
+ {
+ PretendToDie();
+ damage = 0;
+ }
+ }
+
+
+ void PretendToDie()
+ {
+ isDead = true;
+ m_creature->InterruptNonMeleeSpells(true);
+ m_creature->RemoveAllAuras();
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->GetMotionMaster()->MovementExpired(false);
+ m_creature->GetMotionMaster()->MoveIdle();
+ m_creature->SetStandState(UNIT_STAND_STATE_DEAD);
+ };
+
+ void Resurrect()
+ {
+ isDead = false;
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
+ m_creature->CastSpell(m_creature,SPELL_SCOURGE_RESSURRECTION,true);
+
+ if(m_creature->getVictim())
+ {
+ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
+ m_creature->AI()->AttackStart(m_creature->getVictim());
+ }
+ else
+ m_creature->GetMotionMaster()->Initialize();
+ };
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(pInstance->GetData(DATA_PRINCEKELESETH) == IN_PROGRESS)
+ {
+ if(isDead)
+ {
+ if(Respawn_Time < diff)
+ {
+ Resurrect();
+ Respawn_Time = 12000;
+ }else Respawn_Time -= diff;
+ }
+ else
+ {
+ if(!UpdateVictim())
+ return;
+
+ if(Decrepify_Timer < diff)
+ {
+ DoCast(m_creature->getVictim(),SPELL_DECREPIFY);
+ Decrepify_Timer = 30000;
+ }else Decrepify_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+ }else
+ {
+ if(m_creature->isAlive())
+ m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ }
+
+ }
+};
+
+CreatureAI* GetAI_mob_frost_tomb(Creature *_Creature)
+{
+ return new mob_frost_tombAI(_Creature);
+}
+
+CreatureAI* GetAI_boss_keleseth(Creature *_Creature)
+{
+ return new boss_kelesethAI (_Creature);
+}
+
+CreatureAI* GetAI_mob_vrykul_skeleton(Creature *_Creature)
+{
+ return new mob_vrykul_skeletonAI (_Creature);
+}
+
+void AddSC_boss_keleseth()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name="boss_keleseth";
+ newscript->GetAI = &GetAI_boss_keleseth;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_frost_tomb";
+ newscript->GetAI = &GetAI_mob_frost_tomb;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="mob_vrykul_skeleton";
+ newscript->GetAI = GetAI_mob_vrykul_skeleton;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/def_utgarde_keep.h b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/def_utgarde_keep.h
new file mode 100644
index 00000000000..1a5c419f932
--- /dev/null
+++ b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/def_utgarde_keep.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef DEF_UTGARDE_KEEP_H
+#define DEF_UTGARDE_KEEP_H
+
+#define DATA_PRINCEKELESETH 1
+#define DATA_SKARVALD 2
+#define DATA_DALRONN 3
+#define DATA_INGVAR 4
+
+#define DATA_SKARVALD_DALRONN_EVENT 2
+#endif
diff --git a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
new file mode 100644
index 00000000000..f609c6285d3
--- /dev/null
+++ b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Instance_Utgarde_Keep
+SD%Complete: 90
+SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Utgarde Keep Scripts
+SDCategory: Utgarde Keep
+EndScriptData */
+
+#include "precompiled.h"
+#include "def_utgarde_keep.h"
+
+#define ENCOUNTERS 3
+
+/* Utgarde Keep encounters:
+0 - Prince Keleseth
+1 - Skarvald Dalronn
+2 - Ingvar the Plunderer
+*/
+
+struct TRINITY_DLL_DECL instance_utgarde_keep : public ScriptedInstance
+{
+ instance_utgarde_keep(Map *Map) : ScriptedInstance(Map) {Initialize();};
+
+ uint64 Keleseth;
+ uint64 Skarvald;
+ uint64 Dalronn;
+ uint64 Ingvar;
+
+ bool IsBossDied[2];
+
+ uint32 Encounters[ENCOUNTERS];
+ std::string str_data;
+
+ void Initialize()
+ {
+ Keleseth = 0;
+ Skarvald = 0;
+ Dalronn =0;
+ Ingvar =0;
+
+ for(uint8 i = 0; i < ENCOUNTERS; ++i)
+ Encounters[i] = NOT_STARTED;
+ }
+
+ bool IsEncounterInProgress() const
+ {
+ for(uint8 i = 0; i < ENCOUNTERS; ++i)
+ if(Encounters[i] == IN_PROGRESS) return true;
+
+ return false;
+ }
+
+ Player* GetPlayerInMap()
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+
+ if (!players.isEmpty())
+ {
+ for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ {
+ if (Player* plr = itr->getSource())
+ return plr;
+ }
+ }
+
+ debug_log("TSCR: Instance Utgarde Keep: GetPlayerInMap, but PlayerList is empty!");
+ return NULL;
+ }
+
+ void HandleGameObject(uint64 guid, uint32 state)
+ {
+ Player *player = GetPlayerInMap();
+
+ if (!player || !guid)
+ {
+ debug_log("TSCR: Utgarde Keep: HandleGameObject fail");
+ return;
+ }
+
+ if (GameObject *go = GameObject::GetGameObject(*player,guid))
+ go->SetGoState(state);
+ }
+
+ void OnCreatureCreate(Creature *creature, uint32 creature_entry)
+ {
+ switch(creature->GetEntry())
+ {
+ case 23953: Keleseth = creature->GetGUID(); break;
+ case 24200: Dalronn = creature->GetGUID(); break;
+ case 24201: Skarvald = creature->GetGUID(); break;
+ case 23954: Ingvar = creature->GetGUID(); break;
+ }
+ }
+
+ void OnObjectCreate(GameObject* go)
+ {
+ //switch(go->GetEntry())
+ //{
+ //door and object id
+ //}
+ }
+
+ uint64 GetData64(uint32 identifier)
+ {
+ switch(identifier)
+ {
+ case DATA_PRINCEKELESETH: return Keleseth;
+ case DATA_DALRONN: return Dalronn;
+ case DATA_SKARVALD: return Skarvald;
+ case DATA_INGVAR: return Ingvar;
+ }
+
+ return 0;
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ switch(type)
+ {
+ case DATA_PRINCEKELESETH:
+ if(data == DONE)
+ {
+ //HandleGameObject(doorname, 0);
+ }
+ Encounters[0] = data;break;
+ case DATA_SKARVALD_DALRONN_EVENT:
+ if(data == DONE)
+ {
+ //HandleGameObject(doorname, 0);
+ }
+ Encounters[1] = data; break;
+ case DATA_INGVAR:
+ if(data == DONE)
+ {
+ //HandleGameObject(doorname, 0);
+ }
+ Encounters[3] = data; break;
+ }
+
+ if (data == DONE)
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "U K " << Encounters[0] << " " << Encounters[1] << " "
+ << Encounters[2];
+
+ str_data = saveStream.str();
+
+ SaveToDB();
+ OUT_SAVE_INST_DATA_COMPLETE;
+ }
+ }
+
+ uint32 GetData(uint32 type)
+ {
+ switch(type)
+ {
+ case DATA_PRINCEKELESETH: return Encounters[0];
+ case DATA_DALRONN: return Encounters[1];
+ case DATA_SKARVALD: return Encounters[2];
+ case DATA_INGVAR: return Encounters[3];
+ }
+
+ return 0;
+ }
+
+ const char* Save()
+ {
+ return str_data.c_str();
+ }
+
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(in);
+
+ char dataHead1, dataHead2;
+ uint16 data0,data1,data2;
+
+ std::istringstream loadStream(in);
+ loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2;
+
+ if( dataHead1 == 'U' && dataHead2 == 'K')
+ {
+ Encounters[0] = data0;
+ Encounters[1] = data1;
+ Encounters[2] = data2;
+
+ for(uint8 i = 0; i < ENCOUNTERS; ++i)
+ if (Encounters[i] == IN_PROGRESS)
+ Encounters[i] = NOT_STARTED;
+
+ }else OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+};
+
+InstanceData* GetInstanceData_instance_utgarde_keep(Map* map)
+{
+ return new instance_utgarde_keep(map);
+}
+
+void AddSC_instance_utgarde_keep()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "instance_utgarde_keep";
+ newscript->GetInstanceData = &GetInstanceData_instance_utgarde_keep;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/zone/wailing_caverns/instance_wailing_caverns.cpp b/src/bindings/scripts/scripts/zone/wailing_caverns/instance_wailing_caverns.cpp
index 9aaa32725c1..5327bf7041d 100644
--- a/src/bindings/scripts/scripts/zone/wailing_caverns/instance_wailing_caverns.cpp
+++ b/src/bindings/scripts/scripts/zone/wailing_caverns/instance_wailing_caverns.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp b/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp
index ea9c19b0137..51fe821f0af 100644
--- a/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp
+++ b/src/bindings/scripts/scripts/zone/western_plaguelands/western_plaguelands.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/westfall/westfall.cpp b/src/bindings/scripts/scripts/zone/westfall/westfall.cpp
index dfb6b1bc894..67c7f548ec5 100644
--- a/src/bindings/scripts/scripts/zone/westfall/westfall.cpp
+++ b/src/bindings/scripts/scripts/zone/westfall/westfall.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -38,7 +38,11 @@ EndContentData */
struct TRINITY_DLL_DECL npc_defias_traitorAI : public npc_escortAI
{
- npc_defias_traitorAI(Creature *c) : npc_escortAI(c) {Reset();}
+ npc_defias_traitorAI(Creature *c) : npc_escortAI(c)
+ {
+ IsWalking = false;
+ Reset();
+ }
bool IsWalking;
diff --git a/src/bindings/scripts/scripts/zone/winterspring/winterspring.cpp b/src/bindings/scripts/scripts/zone/winterspring/winterspring.cpp
index 1986d2c1b27..db6555d058f 100644
--- a/src/bindings/scripts/scripts/zone/winterspring/winterspring.cpp
+++ b/src/bindings/scripts/scripts/zone/winterspring/winterspring.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
index faeedd7b4c1..7d76ea20917 100644
--- a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
+++ b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
index 34001fc7744..481fa508864 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
@@ -188,7 +188,7 @@ struct TRINITY_DLL_DECL boss_akilzonAI : public ScriptedAI
{
Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, m_creature, 999);
- Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(m_creature, tempUnitMap, u_check);
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp
index 20ccec7176a..3ab0be0747e 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_halazzi.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
index 7603a4db788..51e21d86c22 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
@@ -237,8 +237,7 @@ struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
SpawnAdds();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 46916);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 50268674);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp
index e23b6beada1..9a63ea4ad70 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_janalai.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -239,7 +239,7 @@ struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI
cell.SetNoCreate();
Trinity::AllCreaturesOfEntryInRange check(m_creature, MOB_EGG, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_creature, templist, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
@@ -274,7 +274,7 @@ struct TRINITY_DLL_DECL boss_janalaiAI : public ScriptedAI
cell.SetNoCreate();
Trinity::AllCreaturesOfEntryInRange check(m_creature, MOB_FIRE_BOMB, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_creature, templist, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
@@ -516,7 +516,7 @@ struct TRINITY_DLL_DECL mob_amanishi_hatcherAI : public ScriptedAI
cell.SetNoCreate();
Trinity::AllCreaturesOfEntryInRange check(m_creature, 23817, 50);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(m_creature, templist, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
index 02b36056bb7..8e908880d3a 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -143,7 +143,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
Berserk_Timer = 600000;
inBearForm = false;
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
}
void SendAttacker(Unit* target)
@@ -159,7 +159,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
cell.SetNoCreate();
Trinity::AllFriendlyCreaturesInGrid check(m_creature);
- Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(templist, check);
+ Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(m_creature, templist, check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>, GridTypeMapContainer> cSearcher(searcher);
@@ -361,7 +361,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
{
if(inBearForm)
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
DoYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_TOTROLL);
m_creature->RemoveAurasDueToSpell(SPELL_BEARFORM);
@@ -373,7 +373,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
}
else
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
DoYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_TOBEAR);
DoCast(m_creature, SPELL_BEARFORM, true);
@@ -407,7 +407,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
{
DoYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_SURGE);
- Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRange(SPELL_SURGE), true);
+ Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_SURGE), true);
DoCast(target, SPELL_SURGE);
Surge_Timer = 15000 + rand()%5000;
}else Surge_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
index d1a7fa9fd13..2bb04ee4bb9 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
@@ -207,9 +207,9 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
Summons.DespawnAll();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 47174);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
- m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 47174);
+ //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
+ //m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
}
void Aggro(Unit *who)
@@ -253,7 +253,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE);
if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[3]))
- Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,UNIT_STAND_STATE_DEAD);
}
void AttackStart(Unit *who)
@@ -340,7 +340,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
case 4:
DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100);
DoResetThreat();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
m_creature->RemoveAurasDueToSpell(Transform[Phase].unaura);
DoCast(m_creature, Transform[Phase].spell);
DoYell(Transform[Phase].text, LANG_UNIVERSAL, NULL);
@@ -348,7 +348,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
if(Phase > 0)
{
if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[Phase - 1]))
- Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,PLAYER_STATE_DEAD);
+ Temp->SetUInt32Value(UNIT_FIELD_BYTES_1,UNIT_STAND_STATE_DEAD);
}
if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[NextPhase - 1]))
Temp->CastSpell(m_creature, SPELL_SIPHON_SOUL, false); // should m cast on temp
diff --git a/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h b/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h
index c249cf6b3ec..6fb0ef173bd 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h
+++ b/src/bindings/scripts/scripts/zone/zulaman/def_zulaman.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
index a56cdf3f9a7..2ff8a6e9b8a 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
@@ -1,4 +1,4 @@
- /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -106,7 +106,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
- switch(creature_entry)
+ switch(creature->GetEntry())
{
case 23578://janalai
case 23863://zuljin
@@ -140,7 +140,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(open ? 0 : 1);
}
void SummonHostage(uint8 num)
diff --git a/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp
index 8e3b4e1ec6c..78fe5ee274b 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/zulaman.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulfarrak/zulfarrak.cpp b/src/bindings/scripts/scripts/zone/zulfarrak/zulfarrak.cpp
index 227ab686cd5..a91acd38b54 100644
--- a/src/bindings/scripts/scripts/zone/zulfarrak/zulfarrak.cpp
+++ b/src/bindings/scripts/scripts/zone/zulfarrak/zulfarrak.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp
index 7968f315ce2..466b8bd489f 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_gahzranka.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_gahzranka.cpp
index d1bb952b2f1..d0c11277cb5 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_gahzranka.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_gahzranka.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp
index 44191cbf42b..adfddad2ac0 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_hakkar.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_hakkar.cpp
index 5566879cf04..4c6c62fa4e3 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_hakkar.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_hakkar.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_hazzarah.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_hazzarah.cpp
index ef5607a2d05..c32608a01a3 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_hazzarah.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_hazzarah.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
index a6c2f633075..b7fe7d8f31e 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_jindo.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_jindo.cpp
index cb390b1c2bd..df3a02e69f2 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_jindo.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_jindo.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
index 14eb635a61a..81bc9dc7c25 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp
index aae7b4e8895..309e6135a64 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
index 5b68dfb8390..b2e66b1bbdb 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -65,9 +65,9 @@ struct TRINITY_DLL_DECL boss_renatakiAI : public ScriptedAI
if (Invisible_Timer < diff)
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
+ //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);
Invisible = true;
@@ -99,9 +99,9 @@ struct TRINITY_DLL_DECL boss_renatakiAI : public ScriptedAI
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,15268);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 31818);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_ID, 31818);
+ //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
+ //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Invisible = false;
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
index e2aa7d3049b..8319ac8f174 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
@@ -119,7 +119,7 @@ struct TRINITY_DLL_DECL boss_thekalAI : public ScriptedAI
{
//Resurrect LorKhan
Unit *pLorKhan = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_LORKHAN));
- pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pLorKhan->SetStandState(UNIT_STAND_STATE_STAND);
pLorKhan->setFaction(14);
pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pLorKhan->SetHealth(int(pLorKhan->GetMaxHealth()*1.0));
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL boss_thekalAI : public ScriptedAI
{
//Resurrect Zath
Unit *pZath = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_ZATH));
- pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pZath->SetStandState(UNIT_STAND_STATE_STAND);
pZath->setFaction(14);
pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pZath->SetHealth(int(pZath->GetMaxHealth()*1.0));
@@ -154,7 +154,7 @@ struct TRINITY_DLL_DECL boss_thekalAI : public ScriptedAI
if (!PhaseTwo && !WasDead && m_creature->GetHealth() <= m_creature->GetMaxHealth() * 0.05)
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 3);
+ m_creature->SetStandState(UNIT_STAND_STATE_SLEEP);
m_creature->AttackStop();
if(pInstance)
@@ -170,7 +170,7 @@ struct TRINITY_DLL_DECL boss_thekalAI : public ScriptedAI
{
DoCast(m_creature,SPELL_TIGER_FORM);
m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.00f);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetHealth(int(m_creature->GetMaxHealth()*1.0));
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
@@ -330,7 +330,7 @@ struct TRINITY_DLL_DECL mob_zealot_lorkhanAI : public ScriptedAI
{
//Resurrect Thekal
Unit *pThekal = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_THEKAL));
- pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pThekal->SetStandState(UNIT_STAND_STATE_STAND);
pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pThekal->setFaction(14);
pThekal->SetHealth(int(pThekal->GetMaxHealth()*1.0));
@@ -340,7 +340,7 @@ struct TRINITY_DLL_DECL mob_zealot_lorkhanAI : public ScriptedAI
{
//Resurrect Zath
Unit *pZath = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_ZATH));
- pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pZath->SetStandState(UNIT_STAND_STATE_STAND);
pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pZath->setFaction(14);
pZath->SetHealth(int(pZath->GetMaxHealth()*1.0));
@@ -353,7 +353,7 @@ struct TRINITY_DLL_DECL mob_zealot_lorkhanAI : public ScriptedAI
if (m_creature->GetHealth() <= m_creature->GetMaxHealth() * 0.05)
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 3);
+ m_creature->SetStandState(UNIT_STAND_STATE_SLEEP);
m_creature->setFaction(35);
m_creature->AttackStop();
@@ -401,7 +401,7 @@ struct TRINITY_DLL_DECL mob_zealot_zathAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_ZATH_ALIVE, 0);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ m_creature->SetStandState(UNIT_STAND_STATE_STAND);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
@@ -462,7 +462,7 @@ struct TRINITY_DLL_DECL mob_zealot_zathAI : public ScriptedAI
{
//Resurrect LorKhan
Unit *pLorKhan = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_LORKHAN));
- pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pLorKhan->SetStandState(UNIT_STAND_STATE_STAND);
pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pLorKhan->setFaction(14);
pLorKhan->SetHealth(int(pLorKhan->GetMaxHealth()*1.0));
@@ -472,7 +472,7 @@ struct TRINITY_DLL_DECL mob_zealot_zathAI : public ScriptedAI
{
//Resurrect Thekal
Unit *pThekal = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_THEKAL));
- pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pThekal->SetStandState(UNIT_STAND_STATE_STAND);
pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pThekal->setFaction(14);
pThekal->SetHealth(int(pThekal->GetMaxHealth()*1.0));
@@ -485,7 +485,7 @@ struct TRINITY_DLL_DECL mob_zealot_zathAI : public ScriptedAI
if (m_creature->GetHealth() <= m_creature->GetMaxHealth() * 0.05)
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 3);
+ m_creature->SetStandState(UNIT_STAND_STATE_SLEEP);
m_creature->setFaction(35);
m_creature->AttackStop();
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp
index 405c85d4b09..04a51ff7925 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_venoxis.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_wushoolay.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_wushoolay.cpp
index 76345cf6867..858feb06e54 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_wushoolay.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_wushoolay.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/def_zulgurub.h b/src/bindings/scripts/scripts/zone/zulgurub/def_zulgurub.h
index fd1c905048e..f14bd8eca98 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/def_zulgurub.h
+++ b/src/bindings/scripts/scripts/zone/zulgurub/def_zulgurub.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/instance_zulgurub.cpp b/src/bindings/scripts/scripts/zone/zulgurub/instance_zulgurub.cpp
index a49ff110b2d..eb3cbd1d495 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/instance_zulgurub.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/instance_zulgurub.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* 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
diff --git a/src/bindings/scripts/system.cpp b/src/bindings/scripts/system.cpp
index 893e476e2fd..ab62e530681 100644
--- a/src/bindings/scripts/system.cpp
+++ b/src/bindings/scripts/system.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/framework/Dynamic/FactoryHolder.h b/src/framework/Dynamic/FactoryHolder.h
index 39c6061a687..858b8c1e1d3 100644
--- a/src/framework/Dynamic/FactoryHolder.h
+++ b/src/framework/Dynamic/FactoryHolder.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Dynamic/ObjectRegistry.h b/src/framework/Dynamic/ObjectRegistry.h
index 6e4b9aca53b..8c2659e8f53 100644
--- a/src/framework/Dynamic/ObjectRegistry.h
+++ b/src/framework/Dynamic/ObjectRegistry.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/Grid.h b/src/framework/GameSystem/Grid.h
index 06c4dde2ed3..fad792ba5ec 100644
--- a/src/framework/GameSystem/Grid.h
+++ b/src/framework/GameSystem/Grid.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/GridLoader.h b/src/framework/GameSystem/GridLoader.h
index 23d32858e50..8a483044f8f 100644
--- a/src/framework/GameSystem/GridLoader.h
+++ b/src/framework/GameSystem/GridLoader.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/GridRefManager.h b/src/framework/GameSystem/GridRefManager.h
index 715d13fa2fe..bd32f836e18 100644
--- a/src/framework/GameSystem/GridRefManager.h
+++ b/src/framework/GameSystem/GridRefManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/GridReference.h b/src/framework/GameSystem/GridReference.h
index 5f9dbaf5279..d4bd6752515 100644
--- a/src/framework/GameSystem/GridReference.h
+++ b/src/framework/GameSystem/GridReference.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/NGrid.h b/src/framework/GameSystem/NGrid.h
index a4863bb287e..126703febd2 100644
--- a/src/framework/GameSystem/NGrid.h
+++ b/src/framework/GameSystem/NGrid.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -75,21 +75,21 @@ class TRINITY_DLL_DECL NGrid
public:
typedef Grid<ACTIVE_OBJECT, WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES, ThreadModel> GridType;
- NGrid(uint32 id, int32 x, int32 y, time_t expiry, bool unload = true) :
- i_gridId(id), i_cellstate(GRID_STATE_INVALID), i_x(x), i_y(y), i_GridObjectDataLoaded(false)
- {
- i_GridInfo = GridInfo(expiry, unload);
- }
+ NGrid(uint32 id, int32 x, int32 y, time_t expiry, bool unload = true)
+ : i_gridId(id), i_x(x), i_y(y), i_cellstate(GRID_STATE_INVALID), i_GridObjectDataLoaded(false)
+ {
+ i_GridInfo = GridInfo(expiry, unload);
+ }
const GridType& operator()(unsigned short x, unsigned short y) const { return i_cells[x][y]; }
GridType& operator()(unsigned short x, unsigned short y) { return i_cells[x][y]; }
- inline const uint32& GetGridId(void) const { return i_gridId; }
- inline void SetGridId(const uint32 id) const { i_gridId = id; }
- inline grid_state_t GetGridState(void) const { return i_cellstate; }
- inline void SetGridState(grid_state_t s) { i_cellstate = s; }
- inline int32 getX() const { return i_x; }
- inline int32 getY() const { return i_y; }
+ const uint32& GetGridId(void) const { return i_gridId; }
+ void SetGridId(const uint32 id) const { i_gridId = id; }
+ grid_state_t GetGridState(void) const { return i_cellstate; }
+ void SetGridState(grid_state_t s) { i_cellstate = s; }
+ int32 getX() const { return i_x; }
+ int32 getY() const { return i_y; }
void link(GridRefManager<NGrid<N, ACTIVE_OBJECT, WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES, ThreadModel> >* pTo)
{
diff --git a/src/framework/GameSystem/TypeContainer.h b/src/framework/GameSystem/TypeContainer.h
index 8d4989debb7..9e4c6da65e2 100644
--- a/src/framework/GameSystem/TypeContainer.h
+++ b/src/framework/GameSystem/TypeContainer.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/TypeContainerFunctions.h b/src/framework/GameSystem/TypeContainerFunctions.h
index 4ca4e660236..f9945f84ac7 100644
--- a/src/framework/GameSystem/TypeContainerFunctions.h
+++ b/src/framework/GameSystem/TypeContainerFunctions.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/TypeContainerFunctionsPtr.h b/src/framework/GameSystem/TypeContainerFunctionsPtr.h
index 6bb4c9e4bf5..b22c07db2b4 100644
--- a/src/framework/GameSystem/TypeContainerFunctionsPtr.h
+++ b/src/framework/GameSystem/TypeContainerFunctionsPtr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/GameSystem/TypeContainerVisitor.h b/src/framework/GameSystem/TypeContainerVisitor.h
index 40f61b65cc4..97570b370c2 100644
--- a/src/framework/GameSystem/TypeContainerVisitor.h
+++ b/src/framework/GameSystem/TypeContainerVisitor.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Makefile.am b/src/framework/Makefile.am
index 081b1cc9b44..e76e12ee76a 100644
--- a/src/framework/Makefile.am
+++ b/src/framework/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Network/SocketDefines.h b/src/framework/Network/SocketDefines.h
index bb59725bb76..e69f2fb41e0 100644
--- a/src/framework/Network/SocketDefines.h
+++ b/src/framework/Network/SocketDefines.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Platform/CompilerDefs.h b/src/framework/Platform/CompilerDefs.h
index 64d4976210c..691acb2e6d7 100644
--- a/src/framework/Platform/CompilerDefs.h
+++ b/src/framework/Platform/CompilerDefs.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Platform/Define.h b/src/framework/Platform/Define.h
index 5e0cdfdd179..7a7bdcab419 100644
--- a/src/framework/Platform/Define.h
+++ b/src/framework/Platform/Define.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 Mangos <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Policies/CreationPolicy.h b/src/framework/Policies/CreationPolicy.h
index df46d764917..91bec9eab37 100644
--- a/src/framework/Policies/CreationPolicy.h
+++ b/src/framework/Policies/CreationPolicy.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Policies/ObjectLifeTime.cpp b/src/framework/Policies/ObjectLifeTime.cpp
index cb963f9c2b0..852e382a0e9 100644
--- a/src/framework/Policies/ObjectLifeTime.cpp
+++ b/src/framework/Policies/ObjectLifeTime.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Policies/ObjectLifeTime.h b/src/framework/Policies/ObjectLifeTime.h
index aaf46810085..86303f889fb 100644
--- a/src/framework/Policies/ObjectLifeTime.h
+++ b/src/framework/Policies/ObjectLifeTime.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -34,7 +34,7 @@ namespace Trinity
class TRINITY_DLL_DECL ObjectLifeTime
{
public:
- inline static void ScheduleCall(void (*destroyer)() )
+ static void ScheduleCall(void (*destroyer)() )
{
at_exit( destroyer );
}
@@ -44,7 +44,7 @@ namespace Trinity
};
template <class T>
- inline void ObjectLifeTime<T>::OnDeadReference(void)// We don't handle Dead Reference for now
+ void ObjectLifeTime<T>::OnDeadReference(void) // We don't handle Dead Reference for now
{
throw std::runtime_error("Dead Reference");
}
diff --git a/src/framework/Policies/Singleton.h b/src/framework/Policies/Singleton.h
index 6961200c760..66daaba5a9a 100644
--- a/src/framework/Policies/Singleton.h
+++ b/src/framework/Policies/Singleton.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Policies/SingletonImp.h b/src/framework/Policies/SingletonImp.h
index 20d311858a7..89a4738ae22 100644
--- a/src/framework/Policies/SingletonImp.h
+++ b/src/framework/Policies/SingletonImp.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Policies/ThreadingModel.h b/src/framework/Policies/ThreadingModel.h
index e41ed53b416..a380fe78323 100644
--- a/src/framework/Policies/ThreadingModel.h
+++ b/src/framework/Policies/ThreadingModel.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/ByteConverter.h b/src/framework/Utilities/ByteConverter.h
index bfb5fea1471..d9282c1787d 100644
--- a/src/framework/Utilities/ByteConverter.h
+++ b/src/framework/Utilities/ByteConverter.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/Callback.h b/src/framework/Utilities/Callback.h
index 05fa2d9d160..28c0931e6e7 100644
--- a/src/framework/Utilities/Callback.h
+++ b/src/framework/Utilities/Callback.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/CountedReference/Reference.h b/src/framework/Utilities/CountedReference/Reference.h
index 3c4a2185651..1e1083e1a66 100644
--- a/src/framework/Utilities/CountedReference/Reference.h
+++ b/src/framework/Utilities/CountedReference/Reference.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/CountedReference/ReferenceHolder.h b/src/framework/Utilities/CountedReference/ReferenceHolder.h
index f4cbf240493..4cfb7d16ded 100644
--- a/src/framework/Utilities/CountedReference/ReferenceHolder.h
+++ b/src/framework/Utilities/CountedReference/ReferenceHolder.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/CountedReference/ReferenceImpl.h b/src/framework/Utilities/CountedReference/ReferenceImpl.h
index b3f7ab2aab7..c3116a21cf4 100644
--- a/src/framework/Utilities/CountedReference/ReferenceImpl.h
+++ b/src/framework/Utilities/CountedReference/ReferenceImpl.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/EventProcessor.cpp b/src/framework/Utilities/EventProcessor.cpp
index b547392065a..852f84bc4e2 100644
--- a/src/framework/Utilities/EventProcessor.cpp
+++ b/src/framework/Utilities/EventProcessor.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/EventProcessor.h b/src/framework/Utilities/EventProcessor.h
index 0ce4251def7..d0a98c80e30 100644
--- a/src/framework/Utilities/EventProcessor.h
+++ b/src/framework/Utilities/EventProcessor.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/LinkedList.h b/src/framework/Utilities/LinkedList.h
index a25bbf75d5e..171ff3601e3 100644
--- a/src/framework/Utilities/LinkedList.h
+++ b/src/framework/Utilities/LinkedList.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/LinkedReference/RefManager.h b/src/framework/Utilities/LinkedReference/RefManager.h
index 5f0e3a9e10b..ed580f49ec2 100644
--- a/src/framework/Utilities/LinkedReference/RefManager.h
+++ b/src/framework/Utilities/LinkedReference/RefManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/LinkedReference/Reference.h b/src/framework/Utilities/LinkedReference/Reference.h
index bba58cf06d3..c77d3a2cbdb 100644
--- a/src/framework/Utilities/LinkedReference/Reference.h
+++ b/src/framework/Utilities/LinkedReference/Reference.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -44,7 +44,7 @@ template <class TO, class FROM> class Reference : public LinkedListElement
virtual ~Reference() {}
// Create new link
- inline void link(TO* toObj, FROM* fromObj)
+ void link(TO* toObj, FROM* fromObj)
{
assert(fromObj); // fromObj MUST not be NULL
if(isValid())
@@ -59,16 +59,16 @@ template <class TO, class FROM> class Reference : public LinkedListElement
// We don't need the reference anymore. Call comes from the refFrom object
// Tell our refTo object, that the link is cut
- inline void unlink() { targetObjectDestroyLink(); delink(); iRefTo = NULL; iRefFrom = NULL; }
+ void unlink() { targetObjectDestroyLink(); delink(); iRefTo = NULL; iRefFrom = NULL; }
// Link is invalid due to destruction of referenced target object. Call comes from the refTo object
// Tell our refFrom object, that the link is cut
- inline void invalidate() // the iRefFrom MUST remain!!
+ void invalidate() // the iRefFrom MUST remain!!
{
sourceObjectDestroyLink(); delink(); iRefTo = NULL;
}
- inline bool isValid() const // Only check the iRefTo
+ bool isValid() const // Only check the iRefTo
{
return iRefTo != NULL;
}
@@ -83,10 +83,10 @@ template <class TO, class FROM> class Reference : public LinkedListElement
Reference<TO,FROM> * nocheck_prev() { return((Reference<TO,FROM> *) LinkedListElement::nocheck_prev()); }
Reference<TO,FROM> const * nocheck_prev() const { return((Reference<TO,FROM> const *) LinkedListElement::nocheck_prev()); }
- inline TO* operator ->() const { return iRefTo; }
- inline TO* getTarget() const { return iRefTo; }
+ TO* operator ->() const { return iRefTo; }
+ TO* getTarget() const { return iRefTo; }
- inline FROM* getSource() const { return iRefFrom; }
+ FROM* getSource() const { return iRefFrom; }
};
//=====================================================
diff --git a/src/framework/Utilities/TypeList.h b/src/framework/Utilities/TypeList.h
index 143a9738381..07b1ebad3e6 100644
--- a/src/framework/Utilities/TypeList.h
+++ b/src/framework/Utilities/TypeList.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/framework/Utilities/UnorderedMap.h b/src/framework/Utilities/UnorderedMap.h
index a1de27cb615..dd539cc0bda 100644
--- a/src/framework/Utilities/UnorderedMap.h
+++ b/src/framework/Utilities/UnorderedMap.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/AccountMgr.cpp b/src/game/AccountMgr.cpp
index 6d27df2cb73..a39203f3755 100644
--- a/src/game/AccountMgr.cpp
+++ b/src/game/AccountMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -25,11 +25,7 @@
#include "Policies/SingletonImp.h"
#include "Util.h"
-#ifdef DO_POSTGRESQL
-extern DatabasePostgre LoginDatabase;
-#else
-extern DatabaseMysql LoginDatabase;
-#endif
+extern DatabaseType LoginDatabase;
INSTANTIATE_SINGLETON_1(AccountMgr);
diff --git a/src/game/AccountMgr.h b/src/game/AccountMgr.h
index febd5c6216b..adb1bdfa6b9 100644
--- a/src/game/AccountMgr.h
+++ b/src/game/AccountMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
new file mode 100644
index 00000000000..989c1be35d9
--- /dev/null
+++ b/src/game/AchievementMgr.cpp
@@ -0,0 +1,1272 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "AchievementMgr.h"
+#include "Common.h"
+#include "Player.h"
+#include "WorldPacket.h"
+#include "Database/DBCEnums.h"
+#include "ObjectMgr.h"
+#include "Guild.h"
+#include "Database/DatabaseEnv.h"
+#include "GameEvent.h"
+#include "World.h"
+#include "SpellMgr.h"
+#include "ProgressBar.h"
+#include "GridNotifiersImpl.h"
+#include "CellImpl.h"
+#include "Language.h"
+
+#include "Policies/SingletonImp.h"
+
+INSTANTIATE_SINGLETON_1(AchievementGlobalMgr);
+
+const CriteriaCastSpellRequirement AchievementGlobalMgr::m_criteriaCastSpellRequirements[CRITERIA_CAST_SPELL_REQ_COUNT] =
+ {
+ {5272, 3057, 0, 0},
+ {5273, 2784, 0, 0},
+ {5752, 9099, 0, 0},
+ {5753, 8403, 0, 0},
+ {5772, 0, 0, RACE_GNOME},
+ {5774, 0, 0, RACE_BLOODELF},
+ {5775, 0, 0, RACE_DRAENEI},
+ {5776, 0, 0, RACE_DWARF},
+ {5777, 0, 0, RACE_HUMAN},
+ {5778, 0, 0, RACE_NIGHTELF},
+ {5779, 0, 0, RACE_ORC},
+ {5780, 0, 0, RACE_TAUREN},
+ {5781, 0, 0, RACE_TROLL},
+ {5782, 0, 0, RACE_UNDEAD_PLAYER},
+ {6225, 5661, 0, 0},
+ {6226, 26044, 0, 0},
+ {6228, 739, 0, 0},
+ {6229, 927, 0, 0},
+ {6230, 1444, 0, 0},
+ {6231, 8140, 0, 0},
+ {6232, 5489, 0, 0},
+ {6233,12336, 0, 0},
+ {6234, 1351, 0, 0},
+ {6235, 5484, 0, 0},
+ {6236, 1182, 0, 0},
+ {6237, 0, CLASS_DEATH_KNIGHT, RACE_ORC},
+ {6238, 0, CLASS_WARRIOR, RACE_HUMAN},
+ {6239, 0, CLASS_SHAMAN, RACE_TAUREN},
+ {6240, 0, CLASS_DRUID, RACE_NIGHTELF},
+ {6241, 0, CLASS_ROGUE, RACE_UNDEAD_PLAYER},
+ {6242, 0, CLASS_HUNTER, RACE_TROLL},
+ {6243, 0, CLASS_MAGE, RACE_GNOME},
+ {6244, 0, CLASS_PALADIN, RACE_DWARF},
+ {6245, 0, CLASS_WARLOCK, RACE_BLOODELF},
+ {6246, 0, CLASS_PRIEST, RACE_DRAENEI},
+ {6312, 0, CLASS_WARLOCK, RACE_GNOME},
+ {6313, 0, CLASS_DEATH_KNIGHT, RACE_HUMAN},
+ {6314, 0, CLASS_PRIEST, RACE_NIGHTELF},
+ {6315, 0, CLASS_SHAMAN, RACE_ORC},
+ {6316, 0, CLASS_DRUID, RACE_TAUREN},
+ {6317, 0, CLASS_ROGUE, RACE_TROLL},
+ {6318, 0, CLASS_WARRIOR, RACE_UNDEAD_PLAYER},
+ {6319, 0, CLASS_MAGE, RACE_BLOODELF},
+ {6320, 0, CLASS_PALADIN, RACE_DRAENEI},
+ {6321, 0, CLASS_HUNTER, RACE_DWARF},
+ {6662, 31261, 0, 0}
+ };
+
+
+namespace MaNGOS
+{
+ class AchievementChatBuilder
+ {
+ public:
+ AchievementChatBuilder(Player const& pl, ChatMsg msgtype, int32 textId, uint32 ach_id)
+ : i_player(pl), i_msgtype(msgtype), i_textId(textId), i_achievementId(ach_id) {}
+ void operator()(WorldPacket& data, int32 loc_idx)
+ {
+ char const* text = objmgr.GetMangosString(i_textId,loc_idx);
+
+ data << uint8(i_msgtype);
+ data << uint32(LANG_UNIVERSAL);
+ data << uint64(i_player.GetGUID());
+ data << uint32(5);
+ data << uint64(i_player.GetGUID());
+ data << uint32(strlen(text)+1);
+ data << text;
+ data << uint8(0);
+ data << uint32(i_achievementId);
+ }
+
+ private:
+ Player const& i_player;
+ ChatMsg i_msgtype;
+ int32 i_textId;
+ uint32 i_achievementId;
+ };
+} // namespace MaNGOS
+
+AchievementMgr::AchievementMgr(Player *player)
+{
+ m_player = player;
+}
+
+AchievementMgr::~AchievementMgr()
+{
+}
+
+void AchievementMgr::Reset()
+{
+ for(CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); ++iter)
+ {
+ WorldPacket data(SMSG_ACHIEVEMENT_DELETED,4);
+ data << uint32(iter->first);
+ m_player->SendDirectMessage(&data);
+ }
+
+ for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
+ {
+ WorldPacket data(SMSG_CRITERIA_DELETED,4);
+ data << uint32(iter->first);
+ m_player->SendDirectMessage(&data);
+ }
+
+ m_completedAchievements.clear();
+ m_criteriaProgress.clear();
+ DeleteFromDB(m_player->GetGUIDLow());
+
+ // re-fill data
+ CheckAllAchievementCriteria();
+}
+
+void AchievementMgr::DeleteFromDB(uint32 lowguid)
+{
+ CharacterDatabase.BeginTransaction ();
+ CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = %u",lowguid);
+ CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = %u",lowguid);
+ CharacterDatabase.CommitTransaction ();
+}
+
+void AchievementMgr::SaveToDB()
+{
+ if(!m_completedAchievements.empty())
+ {
+ bool need_execute = false;
+ std::ostringstream ssdel;
+ std::ostringstream ssins;
+ for(CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); ++iter)
+ {
+ if(!iter->second.changed)
+ continue;
+
+ /// first new/changed record prefix
+ if(!need_execute)
+ {
+ ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN (";
+ ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES ";
+ need_execute = true;
+ }
+ /// next new/changed record prefix
+ else
+ {
+ ssdel << ", ";
+ ssins << ", ";
+ }
+
+ // new/changed record data
+ ssdel << iter->first;
+ ssins << "("<<GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << uint64(iter->second.date) << ")";
+
+ /// mark as saved in db
+ iter->second.changed = false;
+ }
+
+ if(need_execute)
+ ssdel << ")";
+
+ if(need_execute)
+ {
+ CharacterDatabase.BeginTransaction ();
+ CharacterDatabase.Execute( ssdel.str().c_str() );
+ CharacterDatabase.Execute( ssins.str().c_str() );
+ CharacterDatabase.CommitTransaction ();
+ }
+ }
+
+ if(!m_criteriaProgress.empty())
+ {
+ /// prepare deleting and insert
+ bool need_execute_del = false;
+ bool need_execute_ins = false;
+ std::ostringstream ssdel;
+ std::ostringstream ssins;
+ for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
+ {
+ if(!iter->second.changed)
+ continue;
+
+ // deleted data (including 0 progress state)
+ {
+ /// first new/changed record prefix (for any counter value)
+ if(!need_execute_del)
+ {
+ ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN (";
+ need_execute_del = true;
+ }
+ /// next new/changed record prefix
+ else
+ ssdel << ", ";
+
+ // new/changed record data
+ ssdel << iter->first;
+ }
+
+ // store data only for real progress
+ if(iter->second.counter != 0)
+ {
+ /// first new/changed record prefix
+ if(!need_execute_ins)
+ {
+ ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES ";
+ need_execute_ins = true;
+ }
+ /// next new/changed record prefix
+ else
+ ssins << ", ";
+
+ // new/changed record data
+ ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
+ }
+
+ /// mark as updated in db
+ iter->second.changed = false;
+ }
+
+ if(need_execute_del) // DELETE ... IN (.... _)_
+ ssdel << ")";
+
+ if(need_execute_del || need_execute_ins)
+ {
+ CharacterDatabase.BeginTransaction ();
+ if(need_execute_del)
+ CharacterDatabase.Execute( ssdel.str().c_str() );
+ if(need_execute_ins)
+ CharacterDatabase.Execute( ssins.str().c_str() );
+ CharacterDatabase.CommitTransaction ();
+ }
+ }
+}
+
+void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult)
+{
+ if(achievementResult)
+ {
+ do
+ {
+ Field *fields = achievementResult->Fetch();
+ CompletedAchievementData& ca = m_completedAchievements[fields[0].GetUInt32()];
+ ca.date = time_t(fields[1].GetUInt64());
+ ca.changed = false;
+ } while(achievementResult->NextRow());
+ delete achievementResult;
+ }
+
+ if(criteriaResult)
+ {
+ do
+ {
+ Field *fields = criteriaResult->Fetch();
+
+ uint32 id = fields[0].GetUInt32();
+ uint32 counter = fields[1].GetUInt32();
+ time_t date = time_t(fields[2].GetUInt64());
+
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id);
+ if (!criteria || (criteria->timeLimit && time_t(date + criteria->timeLimit) < time(NULL)))
+ continue;
+
+ CriteriaProgress& progress = m_criteriaProgress[id];
+ progress.counter = counter;
+ progress.date = date;
+ progress.changed = false;
+ } while(criteriaResult->NextRow());
+ delete criteriaResult;
+ }
+
+}
+
+void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
+{
+ sLog.outDebug("AchievementMgr::SendAchievementEarned(%u)", achievement->ID);
+
+ if(Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId()))
+ {
+ MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID);
+ MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder);
+ guild->BroadcastWorker(say_do,GetPlayer());
+ }
+ if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH))
+ {
+ // broadcast realm first reached
+ WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, strlen(GetPlayer()->GetName())+1+8+4+4);
+ data << GetPlayer()->GetName();
+ data << uint64(GetPlayer()->GetGUID());
+ data << uint32(achievement->ID);
+ data << uint32(0); // 1=link supplied string as player name, 0=display plain string
+ sWorld.SendGlobalMessage(&data);
+ }
+ else
+ {
+ CellPair p = MaNGOS::ComputeCellPair(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
+
+ Cell cell(p);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
+
+ MaNGOS::AchievementChatBuilder say_builder(*GetPlayer(), CHAT_MSG_GUILD_ACHIEVEMENT, LANG_ACHIEVEMENT_EARNED,achievement->ID);
+ MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> say_do(say_builder);
+ MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> > say_worker(GetPlayer(),sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY),say_do);
+ TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::AchievementChatBuilder> >, WorldTypeMapContainer > message(say_worker);
+ CellLock<GridReadGuard> cell_lock(cell, p);
+ cell_lock->Visit(cell_lock, message, *GetPlayer()->GetMap());
+ }
+ WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
+ data.append(GetPlayer()->GetPackGUID());
+ data << uint32(achievement->ID);
+ data << uint32(secsToTimeBitFields(time(NULL)));
+ data << uint32(0);
+ GetPlayer()->SendMessageToSet(&data, true);
+}
+
+void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progress)
+{
+ WorldPacket data(SMSG_CRITERIA_UPDATE, 8+4+8);
+ data << uint32(id);
+
+ // the counter is packed like a packed Guid
+ data.appendPackGUID(progress->counter);
+
+ data.append(GetPlayer()->GetPackGUID());
+ data << uint32(0);
+ data << uint32(secsToTimeBitFields(progress->date));
+ data << uint32(0); // timer 1
+ data << uint32(0); // timer 2
+ GetPlayer()->SendMessageToSet(&data, true);
+}
+
+/**
+ * called at player login. The player might have fulfilled some achievements when the achievement system wasn't working yet
+ */
+void AchievementMgr::CheckAllAchievementCriteria()
+{
+ // suppress sending packets
+ for(uint32 i=0; i<ACHIEVEMENT_CRITERIA_TYPE_TOTAL; ++i)
+ UpdateAchievementCriteria(AchievementCriteriaTypes(i));
+}
+
+/**
+ * this function will be called whenever the user might have done a criteria relevant action
+ */
+void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, Unit *unit, uint32 time)
+{
+ sLog.outDetail("AchievementMgr::UpdateAchievementCriteria(%u, %u, %u, %u)", type, miscvalue1, miscvalue2, time);
+
+ if (!sWorld.getConfig(CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS) && m_player->GetSession()->GetSecurity() > SEC_PLAYER)
+ return;
+
+ AchievementCriteriaEntryList const& achievementCriteriaList = achievementmgr.GetAchievementCriteriaByType(type);
+ for(AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i!=achievementCriteriaList.end(); ++i)
+ {
+ AchievementCriteriaEntry const *achievementCriteria = (*i);
+
+ // don't update already completed criteria
+ if(IsCompletedCriteria(achievementCriteria))
+ continue;
+
+ if(achievementCriteria->groupFlag & ACHIEVEMENT_CRITERIA_GROUP_NOT_IN_GROUP && GetPlayer()->GetGroup())
+ continue;
+
+ AchievementEntry const *achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
+ if(!achievement)
+ continue;
+
+ if ((achievement->factionFlag == ACHIEVEMENT_FACTION_FLAG_HORDE && GetPlayer()->GetTeam() != HORDE) ||
+ (achievement->factionFlag == ACHIEVEMENT_FACTION_FLAG_ALLIANCE && GetPlayer()->GetTeam() != ALLIANCE))
+ continue;
+
+ switch (type)
+ {
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
+ SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
+ SetCriteriaProgress(achievementCriteria, GetPlayer()->GetByteValue(PLAYER_BYTES_2, 2)+1);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ if(achievementCriteria->kill_creature.creatureID != miscvalue1)
+ continue;
+ SetCriteriaProgress(achievementCriteria, miscvalue2, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ if(uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
+ SetCriteriaProgress(achievementCriteria, skillvalue);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
+ {
+ uint32 counter =0;
+ for(QuestStatusMap::iterator itr = GetPlayer()->getQuestStatusMap().begin(); itr!=GetPlayer()->getQuestStatusMap().end(); itr++)
+ if(itr->second.m_rewarded)
+ counter++;
+ SetCriteriaProgress(achievementCriteria, counter);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ {
+ uint32 counter =0;
+ for(QuestStatusMap::iterator itr = GetPlayer()->getQuestStatusMap().begin(); itr!=GetPlayer()->getQuestStatusMap().end(); itr++)
+ {
+ Quest const* quest = objmgr.GetQuestTemplate(itr->first);
+ if(itr->second.m_rewarded && quest->GetZoneOrSort() >= 0 && uint32(quest->GetZoneOrSort()) == achievementCriteria->complete_quests_in_zone.zoneID)
+ counter++;
+ }
+ SetCriteriaProgress(achievementCriteria, counter);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ SetCriteriaProgress(achievementCriteria, miscvalue1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ if(GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID)
+ continue;
+ SetCriteriaProgress(achievementCriteria, miscvalue1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ if(GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
+ SetCriteriaProgress(achievementCriteria, 1);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ if(m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end())
+ SetCriteriaProgress(achievementCriteria, 1);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ if(GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ if(miscvalue1 != achievementCriteria->killed_by_creature.creatureEntry)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
+ {
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ if(achievement->ID == 1260)
+ {
+ if(Player::GetDrunkenstateByValue(GetPlayer()->GetDrunkValue()) != DRUNKEN_SMASHED)
+ continue;
+ // TODO: hardcoding eventid is bad, it can differ from DB to DB - maye implement something using HolidayNames.dbc?
+ if(!gameeventmgr.IsActiveEvent(26))
+ continue;
+ }
+ // miscvalue1 is the ingame fallheight*100 as stored in dbc
+ SetCriteriaProgress(achievementCriteria, miscvalue1);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ if(GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
+ SetCriteriaProgress(achievementCriteria, 1);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if(!miscvalue1)
+ continue;
+ if(achievementCriteria->use_item.itemID != miscvalue1)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ // speedup for non-login case
+ if(miscvalue1 && achievementCriteria->own_item.itemID!=miscvalue1)
+ continue;
+ SetCriteriaProgress(achievementCriteria, GetPlayer()->GetItemCount(achievementCriteria->own_item.itemID, true));
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ // You _have_ to loot that item, just owning it when logging in does _not_ count!
+ if(!miscvalue1)
+ continue;
+ if(miscvalue1 != achievementCriteria->own_item.itemID)
+ continue;
+ SetCriteriaProgress(achievementCriteria, miscvalue2, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ if (!miscvalue1 || miscvalue1 != achievementCriteria->be_spell_target.spellID)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ if (!miscvalue1 || miscvalue1 != achievementCriteria->cast_spell.spellID)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
+ {
+ if (!miscvalue1 || miscvalue1 != achievementCriteria->cast_spell.spellID)
+ continue;
+
+ // those requirements couldn't be found in the dbc
+ if (CriteriaCastSpellRequirement const* requirement = AchievementGlobalMgr::GetCriteriaCastSpellRequirement(achievementCriteria))
+ {
+ if (!unit)
+ continue;
+
+ if (requirement->creatureEntry && unit->GetEntry() != requirement->creatureEntry)
+ continue;
+
+ if (requirement->playerRace && (unit->GetTypeId() != TYPEID_PLAYER || unit->getRace()!=requirement->playerRace))
+ continue;
+
+ if (requirement->playerClass && (unit->GetTypeId() != TYPEID_PLAYER || unit->getClass()!=requirement->playerClass))
+ continue;
+ }
+
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ {
+ uint32 spellCount = 0;
+ for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin();
+ spellIter != GetPlayer()->GetSpellMap().end();
+ spellIter++)
+ {
+ for(SkillLineAbilityMap::const_iterator skillIter = spellmgr.GetBeginSkillLineAbilityMap(spellIter->first);
+ skillIter != spellmgr.GetEndSkillLineAbilityMap(spellIter->first);
+ skillIter++)
+ {
+ if(skillIter->second->skillId == achievementCriteria->learn_skilline_spell.skillLine)
+ spellCount++;
+ }
+ }
+ SetCriteriaProgress(achievementCriteria, spellCount);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
+ {
+ // skip for login case
+ if(!miscvalue1)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
+ {
+ int32 reputation = GetPlayer()->GetReputation(achievementCriteria->gain_reputation.factionID);
+ if (reputation > 0)
+ SetCriteriaProgress(achievementCriteria, reputation);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
+ {
+ uint32 counter = 0;
+ const FactionStateList factionStateList = GetPlayer()->GetFactionStateList();
+ for (FactionStateList::const_iterator iter = factionStateList.begin(); iter!= factionStateList.end(); iter++)
+ {
+ if(GetPlayer()->ReputationToRank(iter->second.Standing) >= REP_EXALTED)
+ ++counter;
+ }
+ SetCriteriaProgress(achievementCriteria, counter);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ {
+ WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference);
+ if(!worldOverlayEntry)
+ break;
+
+ int32 exploreFlag = GetAreaFlagByAreaID(worldOverlayEntry->areatableID);
+ if(exploreFlag < 0)
+ break;
+
+ uint32 playerIndexOffset = uint32(exploreFlag) / 32;
+ uint32 mask = 1<< (uint32(exploreFlag) % 32);
+
+ if(GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask)
+ SetCriteriaProgress(achievementCriteria, 1);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
+ {
+ // miscvalue1 = itemid
+ // miscvalue2 = diced value
+ if(!miscvalue1)
+ continue;
+ if(miscvalue2 != achievementCriteria->roll_greed_on_loot.rollValue)
+ continue;
+ ItemPrototype const *pProto = objmgr.GetItemPrototype( miscvalue1 );
+
+ uint32 requiredItemLevel = 0;
+ if (achievementCriteria->ID == 2412 || achievementCriteria->ID == 2358)
+ requiredItemLevel = 185;
+
+ if(!pProto || pProto->ItemLevel <requiredItemLevel)
+ continue;
+ SetCriteriaProgress(achievementCriteria, 1, true);
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
+ case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
+ case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
+ case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS:
+ case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS:
+ case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
+ case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:
+ case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID:
+ case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED:
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION:
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION:
+ case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED:
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
+ case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
+ case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL:
+ break; // Not implemented yet :(
+ }
+ if(IsCompletedCriteria(achievementCriteria))
+ CompletedCriteria(achievementCriteria);
+ }
+}
+
+bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria)
+{
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
+ if(!achievement)
+ return false;
+
+ // counter can never complete
+ if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
+ return false;
+
+ if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
+ {
+ // someone on this realm has already completed that achievement
+ if(achievementmgr.IsRealmCompleted(achievement))
+ return false;
+ }
+
+ CriteriaProgressMap::const_iterator itr = m_criteriaProgress.find(achievementCriteria->ID);
+ if(itr == m_criteriaProgress.end())
+ return false;
+
+ CriteriaProgress const* progress = &itr->second;
+
+ switch(achievementCriteria->requiredType)
+ {
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
+ if ((achievement->ID == 467 && GetPlayer()->getClass() != CLASS_SHAMAN ) ||
+ (achievement->ID == 466 && GetPlayer()->getClass() != CLASS_DRUID ) ||
+ (achievement->ID == 465 && GetPlayer()->getClass() != CLASS_PALADIN ) ||
+ (achievement->ID == 464 && GetPlayer()->getClass() != CLASS_PRIEST ) ||
+ (achievement->ID == 463 && GetPlayer()->getClass() != CLASS_WARLOCK ) ||
+ (achievement->ID == 462 && GetPlayer()->getClass() != CLASS_HUNTER ) ||
+ (achievement->ID == 461 && GetPlayer()->getClass() != CLASS_DEATH_KNIGHT)||
+ (achievement->ID == 460 && GetPlayer()->getClass() != CLASS_MAGE ) ||
+ (achievement->ID == 459 && GetPlayer()->getClass() != CLASS_WARRIOR ) ||
+ (achievement->ID == 458 && GetPlayer()->getClass() != CLASS_ROGUE ) ||
+
+ (achievement->ID == 1404 && GetPlayer()->getRace() != RACE_GNOME ) ||
+ (achievement->ID == 1405 && GetPlayer()->getRace() != RACE_BLOODELF ) ||
+ (achievement->ID == 1406 && GetPlayer()->getRace() != RACE_DRAENEI ) ||
+ (achievement->ID == 1407 && GetPlayer()->getRace() != RACE_DWARF ) ||
+ (achievement->ID == 1408 && GetPlayer()->getRace() != RACE_HUMAN ) ||
+ (achievement->ID == 1409 && GetPlayer()->getRace() != RACE_NIGHTELF ) ||
+ (achievement->ID == 1410 && GetPlayer()->getRace() != RACE_ORC ) ||
+ (achievement->ID == 1411 && GetPlayer()->getRace() != RACE_TAUREN ) ||
+ (achievement->ID == 1412 && GetPlayer()->getRace() != RACE_TROLL ) ||
+ (achievement->ID == 1413 && GetPlayer()->getRace() != RACE_UNDEAD_PLAYER) )
+ return false;
+ return progress->counter >= achievementCriteria->reach_level.level;
+ case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
+ return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ return progress->counter >= achievementCriteria->kill_creature.creatureCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ return progress->counter >= 1;
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
+ return progress->counter >= achievementCriteria->complete_quest_count.totalQuestCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ return progress->counter >= achievementCriteria->complete_quests_in_zone.questCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
+ return progress->counter >= achievementCriteria->complete_daily_quest.questCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ return progress->counter >= 1;
+ case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
+ return progress->counter >= achievementCriteria->fall_without_dying.fallHeight;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ return progress->counter >= 1;
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ return progress->counter >= achievementCriteria->use_item.itemCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ return progress->counter >= achievementCriteria->own_item.itemCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ return progress->counter >= achievementCriteria->loot_item.itemCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ return progress->counter >= achievementCriteria->be_spell_target.spellCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
+ return progress->counter >= achievementCriteria->cast_spell.castCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ return progress->counter >= achievementCriteria->learn_skilline_spell.spellCount;
+ case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
+ return progress->counter >= achievementCriteria->visit_barber.numberOfVisits;
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
+ return progress->counter >= achievementCriteria->gain_reputation.reputationAmount;
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
+ return progress->counter >= achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions;
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ return progress->counter >= 1;
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
+ return progress->counter >= achievementCriteria->roll_greed_on_loot.count;
+
+ // handle all statistic-only criteria here
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
+ return false;
+ }
+ return false;
+}
+
+void AchievementMgr::CompletedCriteria(AchievementCriteriaEntry const* criteria)
+{
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
+ if(!achievement)
+ return;
+ // counter can never complete
+ if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
+ return;
+
+ if(criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL || GetAchievementCompletionState(achievement)==ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED)
+ {
+ CompletedAchievement(achievement);
+ }
+}
+
+// TODO: achievement 705 requires 4 criteria to be fulfilled
+AchievementCompletionState AchievementMgr::GetAchievementCompletionState(AchievementEntry const* entry)
+{
+ if(m_completedAchievements.find(entry->ID)!=m_completedAchievements.end())
+ return ACHIEVEMENT_COMPLETED_COMPLETED_STORED;
+
+ bool foundOutstanding = false;
+ for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
+ {
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
+ if(!criteria || criteria->referredAchievement!= entry->ID)
+ continue;
+
+ if(IsCompletedCriteria(criteria) && criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL)
+ return ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED;
+
+ // found an umcompleted criteria, but DONT return false yet - there might be a completed criteria with ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL
+ if(!IsCompletedCriteria(criteria))
+ foundOutstanding = true;
+ }
+ if(foundOutstanding)
+ return ACHIEVEMENT_COMPLETED_NONE;
+ else
+ return ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED;
+}
+
+void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative)
+{
+ sLog.outDetail("AchievementMgr::SetCriteriaProgress(%u, %u)", entry->ID, newValue);
+ CriteriaProgress *progress = NULL;
+
+ CriteriaProgressMap::iterator iter = m_criteriaProgress.find(entry->ID);
+
+ if(iter == m_criteriaProgress.end())
+ {
+ // not create record for 0 counter
+ if(newValue == 0)
+ return;
+
+ progress = &m_criteriaProgress[entry->ID];
+ progress->counter = newValue;
+ progress->date = time(NULL);
+ }
+ else
+ {
+ progress = &iter->second;
+ if(relative)
+ newValue += progress->counter;
+
+ // not update (not mark as changed) if counter will have same value
+ if(progress->counter == newValue)
+ return;
+
+ progress->counter = newValue;
+ }
+
+ progress->changed = true;
+
+ if(entry->timeLimit)
+ {
+ time_t now = time(NULL);
+ if(time_t(progress->date + entry->timeLimit) < now)
+ progress->counter = 1;
+
+ // also it seems illogical, the timeframe will be extended at every criteria update
+ progress->date = now;
+ }
+ SendCriteriaUpdate(entry->ID,progress);
+}
+
+void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
+{
+ sLog.outDetail("AchievementMgr::CompletedAchievement(%u)", achievement->ID);
+ if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER || m_completedAchievements.find(achievement->ID)!=m_completedAchievements.end())
+ return;
+
+ SendAchievementEarned(achievement);
+ CompletedAchievementData& ca = m_completedAchievements[achievement->ID];
+ ca.date = time(NULL);
+ ca.changed = true;
+
+ // don't insert for ACHIEVEMENT_FLAG_REALM_FIRST_KILL since otherwise only the first group member would reach that achievement
+ // TODO: where do set this instead?
+ if(!(achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
+ achievementmgr.SetRealmCompleted(achievement);
+
+ UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT);
+
+ // reward items and titles if any
+ AchievementReward const* reward = achievementmgr.GetAchievementReward(achievement);
+
+ // no rewards
+ if(!reward)
+ return;
+
+ // titles
+ if(uint32 titleId = reward->titleId[GetPlayer()->GetTeam() == HORDE?0:1])
+ {
+ if(CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId))
+ GetPlayer()->SetTitle(titleEntry);
+ }
+
+ // mail
+ if(reward->sender)
+ {
+ Item* item = reward->itemId ? Item::CreateItem(reward->itemId,1,GetPlayer ()) : NULL;
+
+ MailItemsInfo mi;
+ if(item)
+ {
+ // save new item before send
+ item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
+
+ // item
+ mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item);
+ }
+
+ int loc_idx = GetPlayer()->GetSession()->GetSessionDbLocaleIndex();
+
+ // subject and text
+ std::string subject = reward->subject;
+ std::string text = reward->text;
+ if ( loc_idx >= 0 )
+ {
+ if(AchievementRewardLocale const* loc = achievementmgr.GetAchievementRewardLocale(achievement))
+ {
+ if (loc->subject.size() > size_t(loc_idx) && !loc->subject[loc_idx].empty())
+ subject = loc->subject[loc_idx];
+ if (loc->text.size() > size_t(loc_idx) && !loc->text[loc_idx].empty())
+ text = loc->text[loc_idx];
+ }
+ }
+
+ uint32 itemTextId = objmgr.CreateItemText( text );
+
+ WorldSession::SendMailTo(GetPlayer(), MAIL_CREATURE, MAIL_STATIONERY_NORMAL, reward->sender, GetPlayer()->GetGUIDLow(), subject, itemTextId , &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ }
+}
+
+void AchievementMgr::SendAllAchievementData()
+{
+ // since we don't know the exact size of the packed GUIDs this is just an approximation
+ WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, 4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4);
+ BuildAllDataPacket(&data);
+ GetPlayer()->GetSession()->SendPacket(&data);
+}
+
+void AchievementMgr::SendRespondInspectAchievements(Player* player)
+{
+ // since we don't know the exact size of the packed GUIDs this is just an approximation
+ WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 4+4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4);
+ data.append(GetPlayer()->GetPackGUID());
+ BuildAllDataPacket(&data);
+ player->GetSession()->SendPacket(&data);
+}
+
+/**
+ * used by both SMSG_ALL_ACHIEVEMENT_DATA and SMSG_RESPOND_INSPECT_ACHIEVEMENT
+ */
+void AchievementMgr::BuildAllDataPacket(WorldPacket *data)
+{
+ for(CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); ++iter)
+ {
+ *data << uint32(iter->first);
+ *data << uint32(secsToTimeBitFields(iter->second.date));
+ }
+ *data << int32(-1);
+
+ for(CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
+ {
+ *data << uint32(iter->first);
+ data->appendPackGUID(iter->second.counter);
+ data->append(GetPlayer()->GetPackGUID());
+ *data << uint32(0);
+ *data << uint32(secsToTimeBitFields(iter->second.date));
+ *data << uint32(0);
+ *data << uint32(0);
+ }
+
+ *data << int32(-1);
+}
+
+//==========================================================
+AchievementCriteriaEntryList const& AchievementGlobalMgr::GetAchievementCriteriaByType(AchievementCriteriaTypes type)
+{
+ return m_AchievementCriteriasByType[type];
+}
+
+void AchievementGlobalMgr::LoadAchievementCriteriaList()
+{
+ if(sAchievementCriteriaStore.GetNumRows()==0)
+ {
+ barGoLink bar(1);
+ bar.step();
+
+ sLog.outString();
+ sLog.outErrorDb(">> Loaded 0 achievement criteria.");
+ return;
+ }
+
+ barGoLink bar( sAchievementCriteriaStore.GetNumRows() );
+ for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
+ {
+ bar.step();
+
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
+ if(!criteria)
+ continue;
+
+ m_AchievementCriteriasByType[criteria->requiredType].push_back(criteria);
+ }
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u achievement criteria.",m_AchievementCriteriasByType->size());
+}
+
+
+void AchievementGlobalMgr::LoadCompletedAchievements()
+{
+ QueryResult *result = CharacterDatabase.Query("SELECT achievement FROM character_achievement GROUP BY achievement");
+
+ if(!result)
+ {
+ barGoLink bar(1);
+ bar.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded 0 realm completed achievements . DB table `character_achievement` is empty.");
+ return;
+ }
+
+ barGoLink bar(result->GetRowCount());
+ do
+ {
+ bar.step();
+ Field *fields = result->Fetch();
+ m_allCompletedAchievements.insert(fields[0].GetUInt32());
+ } while(result->NextRow());
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u realm completed achievements.",m_allCompletedAchievements.size());
+}
+
+void AchievementGlobalMgr::LoadRewards()
+{
+ m_achievementRewards.clear(); // need for reload case
+
+ // 0 1 2 3 4 5 6
+ QueryResult *result = WorldDatabase.Query("SELECT entry, title_A, title_H, item, sender, subject, text FROM achievement_reward");
+
+ if(!result)
+ {
+ barGoLink bar(1);
+
+ bar.step();
+
+ sLog.outString();
+ sLog.outErrorDb(">> Loaded 0 achievement rewards. DB table `achievement_reward` is empty.");
+ return;
+ }
+
+ barGoLink bar(result->GetRowCount());
+
+ do
+ {
+ bar.step();
+
+ Field *fields = result->Fetch();
+ uint32 entry = fields[0].GetUInt32();
+ if (!sAchievementStore.LookupEntry(entry))
+ {
+ sLog.outErrorDb( "Table `achievement_reward` has wrong achievement (Entry: %u), ignore", entry);
+ continue;
+ }
+
+ AchievementReward reward;
+ reward.titleId[0] = fields[1].GetUInt32();
+ reward.titleId[1] = fields[2].GetUInt32();
+ reward.itemId = fields[3].GetUInt32();
+ reward.sender = fields[4].GetUInt32();
+ reward.subject = fields[5].GetCppString();
+ reward.text = fields[6].GetCppString();
+
+ if ((reward.titleId[0]==0)!=(reward.titleId[1]==0))
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) has title (A: %u H: %u) only for one from teams.", entry, reward.titleId[0], reward.titleId[1]);
+
+ // must be title or mail at least
+ if (!reward.titleId[0] && !reward.titleId[1] && !reward.sender)
+ {
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) not have title or item reward data, ignore.", entry);
+ continue;
+ }
+
+ if (reward.titleId[0])
+ {
+ CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[0]);
+ if (!titleEntry)
+ {
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) has invalid title id (%u) in `title_A`, set to 0", entry, reward.titleId[0]);
+ reward.titleId[0] = 0;
+ }
+ }
+
+ if (reward.titleId[1])
+ {
+ CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[1]);
+ if (!titleEntry)
+ {
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) has invalid title id (%u) in `title_A`, set to 0", entry, reward.titleId[1]);
+ reward.titleId[1] = 0;
+ }
+ }
+
+ //check mail data before item for report including wrong item case
+ if (reward.sender)
+ {
+ if (!objmgr.GetCreatureTemplate(reward.sender))
+ {
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) has invalid creature entry %u as sender, mail reward skipped.", entry, reward.sender);
+ reward.sender = 0;
+ }
+ }
+ else
+ {
+ if (reward.itemId)
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) not have sender data but have item reward, item will not rewarded", entry);
+
+ if (!reward.subject.empty())
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) not have sender data but have mail subject.", entry);
+
+ if (!reward.text.empty())
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) not have sender data but have mail text.", entry);
+ }
+
+ if (reward.itemId)
+ {
+ if (!objmgr.GetItemPrototype(reward.itemId))
+ {
+ sLog.outErrorDb( "Table `achievement_reward` (Entry: %u) has invalid item id %u, reward mail will be without item.", entry, reward.itemId);
+ reward.itemId = 0;
+ }
+ }
+
+ m_achievementRewards[entry] = reward;
+
+ } while (result->NextRow());
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u achievement reward locale strings", m_achievementRewardLocales.size() );
+}
+
+void AchievementGlobalMgr::LoadRewardLocales()
+{
+ m_achievementRewardLocales.clear(); // need for reload case
+
+ QueryResult *result = WorldDatabase.Query("SELECT entry,subject_loc1,text_loc1,subject_loc2,text_loc2,subject_loc3,text_loc3,subject_loc4,text_loc4,subject_loc5,text_loc5,subject_loc6,text_loc6,subject_loc7,text_loc7,subject_loc8,text_loc8 FROM locales_achievement_reward");
+
+ if(!result)
+ {
+ barGoLink bar(1);
+
+ bar.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded 0 achievement reward locale strings. DB table `locales_achievement_reward` is empty.");
+ return;
+ }
+
+ barGoLink bar(result->GetRowCount());
+
+ do
+ {
+ Field *fields = result->Fetch();
+ bar.step();
+
+ uint32 entry = fields[0].GetUInt32();
+
+ if(m_achievementRewards.find(entry)==m_achievementRewards.end())
+ {
+ sLog.outErrorDb( "Table `locales_achievement_reward` (Entry: %u) has locale strings for not existed achievement reward .", entry);
+ continue;
+ }
+
+ AchievementRewardLocale& data = m_achievementRewardLocales[entry];
+
+ for(int i = 1; i < MAX_LOCALE; ++i)
+ {
+ std::string str = fields[1+2*(i-1)].GetCppString();
+ if(!str.empty())
+ {
+ int idx = objmgr.GetOrNewIndexForLocale(LocaleConstant(i));
+ if(idx >= 0)
+ {
+ if(data.subject.size() <= size_t(idx))
+ data.subject.resize(idx+1);
+
+ data.subject[idx] = str;
+ }
+ }
+ str = fields[1+2*(i-1)+1].GetCppString();
+ if(!str.empty())
+ {
+ int idx = objmgr.GetOrNewIndexForLocale(LocaleConstant(i));
+ if(idx >= 0)
+ {
+ if(data.text.size() <= size_t(idx))
+ data.text.resize(idx+1);
+
+ data.text[idx] = str;
+ }
+ }
+ }
+ } while (result->NextRow());
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u achievement reward locale strings", m_achievementRewardLocales.size() );
+}
diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h
new file mode 100644
index 00000000000..aadf1f16bd9
--- /dev/null
+++ b/src/game/AchievementMgr.h
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef __MANGOS_ACHIEVEMENTMGR_H
+#define __MANGOS_ACHIEVEMENTMGR_H
+
+#include "Common.h"
+#include "Policies/Singleton.h"
+#include "Database/DBCEnums.h"
+#include "Database/DBCStores.h"
+#include "Database/DatabaseEnv.h"
+
+#include <map>
+#include <string>
+
+#define CRITERIA_CAST_SPELL_REQ_COUNT 46
+#define ACHIEVEMENT_REWARD_COUNT 57
+
+typedef std::list<const AchievementCriteriaEntry*> AchievementCriteriaEntryList;
+
+struct CriteriaProgress
+{
+ uint32 counter;
+ time_t date;
+ bool changed;
+};
+
+struct CriteriaCastSpellRequirement
+{
+ uint32 achievementCriteriaId;
+ uint32 creatureEntry;
+ uint8 playerClass;
+ uint8 playerRace;
+};
+
+struct AchievementReward
+{
+ uint32 titleId[2];
+ uint32 itemId;
+ uint32 sender;
+ std::string subject;
+ std::string text;
+};
+
+typedef std::map<uint32,AchievementReward> AchievementRewards;
+
+struct AchievementRewardLocale
+{
+ std::vector<std::string> subject;
+ std::vector<std::string> text;
+};
+
+typedef std::map<uint32,AchievementRewardLocale> AchievementRewardLocales;
+
+
+struct CompletedAchievementData
+{
+ time_t date;
+ bool changed;
+};
+
+typedef UNORDERED_MAP<uint32, CriteriaProgress> CriteriaProgressMap;
+typedef UNORDERED_MAP<uint32, CompletedAchievementData> CompletedAchievementMap;
+
+class Unit;
+class Player;
+class WorldPacket;
+
+enum AchievementCompletionState
+{
+ ACHIEVEMENT_COMPLETED_NONE,
+ ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED,
+ ACHIEVEMENT_COMPLETED_COMPLETED_STORED,
+};
+
+class AchievementMgr
+{
+ public:
+ AchievementMgr(Player* pl);
+ ~AchievementMgr();
+
+ void Reset();
+ static void DeleteFromDB(uint32 lowguid);
+ void LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult);
+ void SaveToDB();
+ void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0);
+ void CheckAllAchievementCriteria();
+ void SendAllAchievementData();
+ void SendRespondInspectAchievements(Player* player);
+ Player* GetPlayer() { return m_player;}
+
+ private:
+ void SendAchievementEarned(AchievementEntry const* achievement);
+ void SendCriteriaUpdate(uint32 id, CriteriaProgress const* progress);
+ void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative=false);
+ void CompletedCriteria(AchievementCriteriaEntry const* entry);
+ void CompletedAchievement(AchievementEntry const* entry);
+ bool IsCompletedCriteria(AchievementCriteriaEntry const* entry);
+ AchievementCompletionState GetAchievementCompletionState(AchievementEntry const* entry);
+ void BuildAllDataPacket(WorldPacket *data);
+
+ Player* m_player;
+ CriteriaProgressMap m_criteriaProgress;
+ CompletedAchievementMap m_completedAchievements;
+};
+
+class AchievementGlobalMgr
+{
+ public:
+ AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type);
+
+ AchievementReward const* GetAchievementReward(AchievementEntry const* achievement) const
+ {
+ AchievementRewards::const_iterator iter = m_achievementRewards.find(achievement->ID);
+ return iter!=m_achievementRewards.end() ? &iter->second : NULL;
+ }
+
+ AchievementRewardLocale const* GetAchievementRewardLocale(AchievementEntry const* achievement) const
+ {
+ AchievementRewardLocales::const_iterator iter = m_achievementRewardLocales.find(achievement->ID);
+ return iter!=m_achievementRewardLocales.end() ? &iter->second : NULL;
+ }
+
+ static CriteriaCastSpellRequirement const * GetCriteriaCastSpellRequirement(AchievementCriteriaEntry const *achievementCriteria)
+ {
+ for (uint32 i=0; i < CRITERIA_CAST_SPELL_REQ_COUNT; ++i)
+ if (m_criteriaCastSpellRequirements[i].achievementCriteriaId == achievementCriteria->ID)
+ return &m_criteriaCastSpellRequirements[i];
+
+ return NULL;
+ }
+
+ bool IsRealmCompleted(AchievementEntry const* achievement) const
+ {
+ return m_allCompletedAchievements.find(achievement->ID) != m_allCompletedAchievements.end();
+ }
+
+ void SetRealmCompleted(AchievementEntry const* achievement)
+ {
+ m_allCompletedAchievements.insert(achievement->ID);
+ }
+
+ void LoadAchievementCriteriaList();
+ void LoadCompletedAchievements();
+ void LoadRewards();
+ void LoadRewardLocales();
+ private:
+ static const CriteriaCastSpellRequirement m_criteriaCastSpellRequirements[];
+
+ // store achievement criterias by type to speed up lookup
+ AchievementCriteriaEntryList m_AchievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL];
+
+ typedef std::set<uint32> AllCompletedAchievements;
+ AllCompletedAchievements m_allCompletedAchievements;
+
+ AchievementRewards m_achievementRewards;
+ AchievementRewardLocales m_achievementRewardLocales;
+};
+
+#define achievementmgr Trinity::Singleton<AchievementGlobalMgr>::Instance()
+
+#endif
diff --git a/src/game/AddonHandler.cpp b/src/game/AddonHandler.cpp
index 63582113914..4dd25c56b26 100644
--- a/src/game/AddonHandler.cpp
+++ b/src/game/AddonHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -66,63 +66,84 @@ bool AddonHandler::BuildAddonPacket(WorldPacket *Source, WorldPacket *Target)
if (Source->rpos() + 4 > Source->size())
return false;
- *Source >> TempValue; //get real size of the packed structure
+ *Source >> TempValue; // get real size of the packed structure
// empty addon packet, nothing process, can't be received from real client
if(!TempValue)
return false;
- AddonRealSize = TempValue; //temp value because ZLIB only excepts uLongf
+ AddonRealSize = TempValue; // temp value because ZLIB only excepts uLongf
- CurrentPosition = Source->rpos(); //get the position of the pointer in the structure
+ CurrentPosition = Source->rpos(); // get the position of the pointer in the structure
- AddOnPacked.resize(AddonRealSize); //resize target for zlib action
+ AddOnPacked.resize(AddonRealSize); // resize target for zlib action
if (!uncompress(const_cast<uint8*>(AddOnPacked.contents()), &AddonRealSize, const_cast<uint8*>((*Source).contents() + CurrentPosition), (*Source).size() - CurrentPosition)!= Z_OK)
{
Target->Initialize(SMSG_ADDON_INFO);
- while(AddOnPacked.rpos() < AddOnPacked.size())
+ uint32 addonsCount;
+ AddOnPacked >> addonsCount; // addons count?
+
+ for(uint32 i = 0; i < addonsCount; ++i)
{
- std::string AddonNames;
- uint8 unk6;
- uint32 crc, unk7;
+ std::string addonName;
+ uint8 enabled;
+ uint32 crc, unk2;
// check next addon data format correctness
- if(AddOnPacked.rpos()+1+4+4+1 > AddOnPacked.size())
+ if(AddOnPacked.rpos()+1 > AddOnPacked.size())
return false;
- AddOnPacked >> AddonNames;
+ AddOnPacked >> addonName;
// recheck next addon data format correctness
- if(AddOnPacked.rpos()+4+4+1 > AddOnPacked.size())
+ if(AddOnPacked.rpos()+1+4+4 > AddOnPacked.size())
return false;
- AddOnPacked >> crc >> unk7 >> unk6;
+ AddOnPacked >> enabled >> crc >> unk2;
- //sLog.outDebug("ADDON: Name:%s CRC:%x Unknown1 :%x Unknown2 :%x", AddonNames.c_str(), crc, unk7, unk6);
+ sLog.outDebug("ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk2);
- *Target << (uint8)2;
+ uint8 state = (enabled ? 2 : 1);
+ *Target << uint8(state);
- uint8 unk1 = 1;
- *Target << (uint8)unk1;
+ uint8 unk1 = (enabled ? 1 : 0);
+ *Target << uint8(unk1);
if (unk1)
{
- uint8 unk2 = crc != 0x1c776d01LL; //If addon is Standard addon CRC
- *Target << (uint8)unk2;
+ uint8 unk2 = (crc != 0x4c1c776d); // If addon is Standard addon CRC
+ *Target << uint8(unk2);
if (unk2)
Target->append(tdata, sizeof(tdata));
- *Target << (uint32)0;
+ *Target << uint32(0);
}
- uint8 unk3 = 0;
- *Target << (uint8)unk3;
+ uint8 unk3 = (enabled ? 0 : 1);
+ *Target << uint8(unk3);
if (unk3)
{
- // String, 256
+ // String, 256 (null terminated?)
+ *Target << uint8(0);
}
}
+
+ uint32 unk4;
+ AddOnPacked >> unk4;
+
+ uint32 count = 0;
+ *Target << uint32(count);
+ /*for(uint32 i = 0; i < count; ++i)
+ {
+ uint32
+ string (16 bytes)
+ string (16 bytes)
+ uint32
+ }*/
+
+ if(AddOnPacked.rpos() != AddOnPacked.size())
+ sLog.outDebug("packet under read!");
}
else
{
diff --git a/src/game/AddonHandler.h b/src/game/AddonHandler.h
index 6255bd551e2..fd9ad395924 100644
--- a/src/game/AddonHandler.h
+++ b/src/game/AddonHandler.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp
index a001ea5af22..2afe3442a21 100644
--- a/src/game/AggressorAI.cpp
+++ b/src/game/AggressorAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/AggressorAI.h b/src/game/AggressorAI.h
index 97dccbcd329..a2a0230939a 100644
--- a/src/game/AggressorAI.h
+++ b/src/game/AggressorAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/AnimalRandomMovementGenerator.h b/src/game/AnimalRandomMovementGenerator.h
index c24162d2708..9c64edcaa44 100644
--- a/src/game/AnimalRandomMovementGenerator.h
+++ b/src/game/AnimalRandomMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp
index c498ed33be4..a556210d4c5 100644
--- a/src/game/ArenaTeam.cpp
+++ b/src/game/ArenaTeam.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
@@ -297,34 +297,43 @@ void ArenaTeam::Disband(WorldSession *session)
CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", Id); //< this should be alredy done by calling DelMember(memberGuids[j]); for each member
CharacterDatabase.PExecute("DELETE FROM arena_team_stats WHERE arenateamid = '%u'", Id);
CharacterDatabase.CommitTransaction();
- objmgr.RemoveArenaTeam(this);
+ objmgr.RemoveArenaTeam(Id);
}
void ArenaTeam::Roster(WorldSession *session)
{
Player *pl = NULL;
+ uint8 unk308 = 0;
+
WorldPacket data(SMSG_ARENA_TEAM_ROSTER, 100);
data << uint32(GetId()); // arena team id
+ data << uint8(unk308); // 308 unknown value but affect packet structure
data << uint32(GetMembersSize()); // members count
data << uint32(GetType()); // arena team type?
- for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{
pl = objmgr.GetPlayer(itr->guid);
- data << uint64(itr->guid); // guid
- data << uint8((pl ? 1 : 0)); // online flag
- data << itr->name; // member name
+ data << uint64(itr->guid); // guid
+ data << uint8((pl ? 1 : 0)); // online flag
+ data << itr->name; // member name
data << uint32((itr->guid == GetCaptain() ? 0 : 1));// captain flag 0 captain 1 member
- data << uint8((pl ? pl->getLevel() : 0)); // unknown, level?
- data << uint8(itr->Class); // class
- data << uint32(itr->games_week); // played this week
- data << uint32(itr->wins_week); // wins this week
- data << uint32(itr->games_season); // played this season
- data << uint32(itr->wins_season); // wins this season
- data << uint32(itr->personal_rating); // personal rating
+ data << uint8((pl ? pl->getLevel() : 0)); // unknown, level?
+ data << uint8(itr->Class); // class
+ data << uint32(itr->games_week); // played this week
+ data << uint32(itr->wins_week); // wins this week
+ data << uint32(itr->games_season); // played this season
+ data << uint32(itr->wins_season); // wins this season
+ data << uint32(itr->personal_rating); // personal rating
+ if(unk308)
+ {
+ data << float(0.0); // 308 unk
+ data << float(0.0); // 308 unk
+ }
}
+
session->SendPacket(&data);
sLog.outDebug("WORLD: Sent SMSG_ARENA_TEAM_ROSTER");
}
@@ -361,7 +370,7 @@ void ArenaTeam::NotifyStatsChanged()
{
// this is called after a rated match ended
// updates arena team stats for every member of the team (not only the ones who participated!)
- for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{
Player * plr = objmgr.GetPlayer(itr->guid);
if(plr)
@@ -434,7 +443,7 @@ void ArenaTeam::SetStats(uint32 stat_type, uint32 value)
void ArenaTeam::BroadcastPacket(WorldPacket *packet)
{
- for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{
Player *player = objmgr.GetPlayer(itr->guid);
if(player)
@@ -623,11 +632,13 @@ void ArenaTeam::SaveToDB()
{
// save team and member stats to db
// called after a match has ended, or when calculating arena_points
+ CharacterDatabase.BeginTransaction();
CharacterDatabase.PExecute("UPDATE arena_team_stats SET rating = '%u',games = '%u',played = '%u',rank = '%u',wins = '%u',wins2 = '%u' WHERE arenateamid = '%u'", stats.rating, stats.games_week, stats.games_season, stats.rank, stats.wins_week, stats.wins_season, GetId());
for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
{
- CharacterDatabase.PExecute("UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u', personal_rating = '%u' WHERE arenateamid = '%u' AND guid = '%u'", itr->games_week, itr->wins_week, itr->games_season, itr->wins_season, itr->personal_rating, Id, itr->guid);
+ CharacterDatabase.PExecute("UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u', personal_rating = '%u' WHERE arenateamid = '%u' AND guid = '%u'", itr->games_week, itr->wins_week, itr->games_season, itr->wins_season, itr->personal_rating, Id, GUID_LOPART(itr->guid));
}
+ CharacterDatabase.CommitTransaction();
}
void ArenaTeam::FinishWeek()
@@ -641,6 +652,19 @@ void ArenaTeam::FinishWeek()
}
}
+bool ArenaTeam::IsFighting() const
+{
+ for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ if (Player *p = objmgr.GetPlayer(itr->guid))
+ {
+ if (p->GetMap()->IsBattleArena())
+ return true;
+ }
+ }
+ return false;
+}
+
/*
arenateam fields (id from 2.3.3 client):
1414 - arena team id 2v2
diff --git a/src/game/ArenaTeam.h b/src/game/ArenaTeam.h
index 9641c1e5992..eb19c984f05 100644
--- a/src/game/ArenaTeam.h
+++ b/src/game/ArenaTeam.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -98,7 +98,7 @@ struct ArenaTeamMember
void ModifyPersonalRating(Player* plr, int32 mod, uint32 slot)
{
- if (personal_rating + mod < 0)
+ if (int32(personal_rating) + mod < 0)
personal_rating = 0;
else
personal_rating += mod;
@@ -179,18 +179,7 @@ class ArenaTeam
return NULL;
}
- bool IsFighting() const
- {
- for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
- {
- if (Player *p = objmgr.GetPlayer(itr->guid))
- {
- if (p->GetMap()->IsBattleArena())
- return true;
- }
- }
- return false;
- }
+ bool IsFighting() const;
bool LoadArenaTeamFromDB(uint32 ArenaTeamId);
void LoadMembersFromDB(uint32 ArenaTeamId);
diff --git a/src/game/ArenaTeamHandler.cpp b/src/game/ArenaTeamHandler.cpp
index 9ba2e65ec92..e625ca41dca 100644
--- a/src/game/ArenaTeamHandler.cpp
+++ b/src/game/ArenaTeamHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -173,7 +173,7 @@ void WorldSession::HandleArenaTeamInviteAcceptOpcode(WorldPacket & /*recv_data*/
if(!at)
return;
- if(_player->GetArenaTeamIdFromDB(_player->GetGUIDLow(), at->GetType()))
+ if(_player->GetArenaTeamId(at->GetSlot()))
{
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ALREADY_IN_ARENA_TEAM); // already in arena team that size
return;
diff --git a/src/game/AuctionHouseBot.cpp b/src/game/AuctionHouseBot.cpp
index bd3b51af4d2..afdc08ca7cd 100644
--- a/src/game/AuctionHouseBot.cpp
+++ b/src/game/AuctionHouseBot.cpp
@@ -1,4 +1,3 @@
-#include "AuctionHouseBot.h"
#include "Bag.h"
#include "Config/ConfigEnv.h"
#include "Database/DatabaseEnv.h"
@@ -9,6 +8,7 @@
#include "World.h"
#include "WorldSession.h"
#include "time.h"
+#include "AuctionHouseBot.h"
#include <vector>
#include <iostream>
@@ -40,9 +40,9 @@ static bool Bind_When_Equipped = 0;
static bool Bind_When_Use = 0;
static bool Bind_Quest_Item = 0;
-static AHBConfig AllianceConfig = AHBConfig(2);
-static AHBConfig HordeConfig = AHBConfig(6);
-static AHBConfig NeutralConfig = AHBConfig(7);
+static AHBConfig AllianceConfig = AHBConfig(AUCTION_ALLIANCE);
+static AHBConfig HordeConfig = AHBConfig(AUCTION_HORDE);
+static AHBConfig NeutralConfig = AHBConfig(AUCTION_NEUTRAL);
time_t _lastrun_a;
time_t _lastrun_h;
time_t _lastrun_n;
@@ -62,7 +62,7 @@ static void addNewAuctions(Player *AHBplayer, AHBConfig *config)
{
if (!AHBSeller)
return;
- AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(config->GetAHID());
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMapByLocation(config->GetAHID());
uint32 items = 0;
uint32 minItems = config->GetMinItems();
uint32 maxItems = config->GetMaxItems();
@@ -98,7 +98,7 @@ static void addNewAuctions(Player *AHBplayer, AHBConfig *config)
for (AuctionHouseObject::AuctionEntryMap::iterator itr = auctionHouse->GetAuctionsBegin();itr != auctionHouse->GetAuctionsEnd();++itr)
{
AuctionEntry *Aentry = itr->second;
- Item *item = objmgr.GetAItem(Aentry->item_guidlow);
+ Item *item = auctionmgr.GetAItem(Aentry->item_guidlow);
if( item )
{
ItemPrototype const *prototype = item->GetProto();
@@ -328,31 +328,29 @@ static void addNewAuctions(Player *AHBplayer, AHBConfig *config)
auctionEntry->bidder = 0;
auctionEntry->bid = 0;
auctionEntry->deposit = 0;
- auctionEntry->location = config->GetAHID();
- auctionEntry->time = (time_t) (urand(config->GetMinTime(), config->GetMaxTime()) * 60 * 60 + time(NULL));
+ auctionEntry->expire_time = (time_t) (urand(config->GetMinTime(), config->GetMaxTime()) * 60 * 60 + time(NULL));
item->SaveToDB();
item->RemoveFromUpdateQueueOf(AHBplayer);
- objmgr.AddAItem(item);
+ auctionmgr.AddAItem(item);
auctionHouse->AddAuction(auctionEntry);
CharacterDatabase.PExecute("INSERT INTO `auctionhouse` (`id`,"
"`auctioneerguid`,`itemguid`,`item_template`,"
"`itemowner`,`buyoutprice`,`time`,`buyguid`,"
- "`lastbid`,`startbid`,`deposit`,`location`) "
+ "`lastbid`,`startbid`,`deposit`) "
"VALUES ('%u', '%u', '%u', '%u', '%u', '%u', "
- "'" I64FMTD "', '%u', '%u', '%u', '%u', '%u')",
+ "'" I64FMTD "', '%u', '%u', '%u', '%u')",
auctionEntry->Id,
auctionEntry->auctioneer,
auctionEntry->item_guidlow,
auctionEntry->item_template,
auctionEntry->owner,
auctionEntry->buyout,
- (uint64) auctionEntry->time,
+ (uint64) auctionEntry->expire_time,
auctionEntry->bidder,
auctionEntry->bid,
auctionEntry->startbid,
- auctionEntry->deposit,
- auctionEntry->location);
+ auctionEntry->deposit);
}
}
@@ -362,7 +360,7 @@ static void addNewAuctionBuyerBotBid(Player *AHBplayer, AHBConfig *config, World
return;
// Fetches content of selected AH
- AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(config->GetAHID());
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMapByLocation(config->GetAHID());
AuctionHouseObject::AuctionEntryMap::iterator itr;
itr = auctionHouse->GetAuctionsBegin();
@@ -399,7 +397,7 @@ static void addNewAuctionBuyerBotBid(Player *AHBplayer, AHBConfig *config, World
AuctionEntry* auction = auctionHouse->GetAuction(auctionID);
// get exact item information
- Item *pItem = objmgr.GetAItem(auction->item_guidlow);
+ Item *pItem = auctionmgr.GetAItem(auction->item_guidlow);
if (!pItem)
{
sLog.outError("Item doesn't exists, perhaps bought already?");
@@ -564,9 +562,9 @@ static void addNewAuctionBuyerBotBid(Player *AHBplayer, AHBConfig *config, World
{sLog.outError("bidprice: %u", bidprice);}
// Check our bid is high enough to be valid. If not, correct it to minimum.
- if((currentprice + objmgr.GetAuctionOutBid(currentprice)) > bidprice)
+ if((currentprice + auction->GetAuctionOutBid()) > bidprice)
{
- bidprice = currentprice + objmgr.GetAuctionOutBid(currentprice);
+ bidprice = currentprice + auction->GetAuctionOutBid();
if(debug_Out)
{sLog.outError("bidprice(>): %u", bidprice);}
}
@@ -614,11 +612,11 @@ static void addNewAuctionBuyerBotBid(Player *AHBplayer, AHBConfig *config, World
auction->bid = auction->buyout;
// Send mails to buyer & seller
- objmgr.SendAuctionSuccessfulMail( auction );
- objmgr.SendAuctionWonMail( auction );
+ auctionmgr.SendAuctionSuccessfulMail( auction );
+ auctionmgr.SendAuctionWonMail( auction );
// Remove item from auctionhouse
- objmgr.RemoveAItem(auction->item_guidlow);
+ auctionmgr.RemoveAItem(auction->item_guidlow);
// Remove auction
auctionHouse->RemoveAuction(auction->Id);
// Remove from database
@@ -905,18 +903,18 @@ void AuctionHouseBotInit()
sLog.outString("AuctionHouseBot now includes AHBuyer by Kerbe and Paradox");
}
-void AuctionHouseBotCommands(uint32 command, uint32 ahMapID, uint32 col, char* args)
+void AuctionHouseBotCommands(uint32 command, AuctionLocation ahMapID, uint32 col, char* args)
{
AHBConfig *config;
switch (ahMapID)
{
- case 2:
+ case AUCTION_ALLIANCE:
config = &AllianceConfig;
break;
- case 6:
+ case AUCTION_HORDE:
config = &HordeConfig;
break;
- case 7:
+ case AUCTION_NEUTRAL:
config = &NeutralConfig;
break;
}
@@ -945,7 +943,7 @@ void AuctionHouseBotCommands(uint32 command, uint32 ahMapID, uint32 col, char* a
{
case 0: //ahexpire
{
- AuctionHouseObject* auctionHouse = objmgr.GetAuctionsMap(ahMapID);
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMapByLocation(ahMapID);
AuctionHouseObject::AuctionEntryMap::iterator itr;
itr = auctionHouse->GetAuctionsBegin();
@@ -953,7 +951,7 @@ void AuctionHouseBotCommands(uint32 command, uint32 ahMapID, uint32 col, char* a
while (itr != auctionHouse->GetAuctionsEnd())
{
if (itr->second->owner == AHBplayerGUID)
- itr->second->time = sWorld.GetGameTime();
+ itr->second->expire_time = sWorld.GetGameTime();
++itr;
}
diff --git a/src/game/AuctionHouseBot.h b/src/game/AuctionHouseBot.h
index 3a224b8f752..5113089e969 100644
--- a/src/game/AuctionHouseBot.h
+++ b/src/game/AuctionHouseBot.h
@@ -3,6 +3,7 @@
#include "Common.h"
#include "Log.h"
#include "Config/ConfigEnv.h"
+#include "AuctionHouseMgr.h"
#define AHB_GREY 0
#define AHB_WHITE 1
#define AHB_GREEN 2
@@ -27,7 +28,7 @@
class AHBConfig
{
private:
- uint32 AHID;
+ AuctionLocation AHID;
uint32 minItems;
uint32 maxItems;
uint32 minTime;
@@ -78,14 +79,14 @@ class AHBConfig
uint32 bip;
uint32 pip;
public:
- AHBConfig(uint32 ahid)
+ AHBConfig(AuctionLocation ahid)
{
AHID = ahid;
}
AHBConfig()
{
}
- uint32 GetAHID()
+ AuctionLocation GetAHID()
{
return AHID;
}
@@ -683,6 +684,6 @@ class AHBConfig
void AuctionHouseBot();
void AuctionHouseBotInit();
void AuctionHouseBotLoadValues(AHBConfig*);
-void AuctionHouseBotCommands(uint32, uint32, uint32, char*);
+void AuctionHouseBotCommands(uint32, AuctionLocation, uint32, char*);
#endif
diff --git a/src/game/AuctionHouseHandler.cpp b/src/game/AuctionHouseHandler.cpp
new file mode 100644
index 00000000000..175db1022de
--- /dev/null
+++ b/src/game/AuctionHouseHandler.cpp
@@ -0,0 +1,656 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "WorldPacket.h"
+#include "WorldSession.h"
+#include "Opcodes.h"
+#include "Log.h"
+#include "World.h"
+#include "ObjectMgr.h"
+#include "Player.h"
+#include "UpdateMask.h"
+#include "AuctionHouseMgr.h"
+#include "Util.h"
+#include "AuctionHouseBot.h"
+
+//please DO NOT use iterator++, because it is slower than ++iterator!!!
+//post-incrementation is always slower than pre-incrementation !
+
+//void called when player click on auctioneer npc
+void WorldSession::HandleAuctionHelloOpcode( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8);
+
+ uint64 guid; //NPC guid
+ recv_data >> guid;
+
+ Creature *unit = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!unit)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionHelloOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ SendAuctionHello(guid, unit);
+}
+
+//this void causes that auction window is opened
+void WorldSession::SendAuctionHello( uint64 guid, Creature* unit )
+{
+ AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction());
+ if(!ahEntry)
+ return;
+
+ WorldPacket data( MSG_AUCTION_HELLO, 12 );
+ data << (uint64) guid;
+ data << (uint32) ahEntry->houseId;
+ SendPacket( &data );
+}
+
+//call this method when player bids, creates, or deletes auction
+void WorldSession::SendAuctionCommandResult(uint32 auctionId, uint32 Action, uint32 ErrorCode, uint32 bidError )
+{
+ WorldPacket data( SMSG_AUCTION_COMMAND_RESULT, 16 );
+ data << auctionId;
+ data << Action;
+ data << ErrorCode;
+ if ( !ErrorCode && Action )
+ data << bidError; //when bid, then send 0, once...
+ SendPacket(&data);
+}
+
+//this function sends notification, if bidder is online
+void WorldSession::SendAuctionBidderNotification( uint32 location, uint32 auctionId, uint64 bidder, uint32 bidSum, uint32 diff, uint32 item_template)
+{
+ WorldPacket data(SMSG_AUCTION_BIDDER_NOTIFICATION, (8*4));
+ data << uint32(location);
+ data << uint32(auctionId);
+ data << uint64(bidder);
+ data << uint32(bidSum);
+ data << uint32(diff);
+ data << uint32(item_template);
+ data << uint32(0);
+ SendPacket(&data);
+}
+
+//this void causes on client to display: "Your auction sold"
+void WorldSession::SendAuctionOwnerNotification( AuctionEntry* auction)
+{
+ WorldPacket data(SMSG_AUCTION_OWNER_NOTIFICATION, (7*4));
+ data << auction->Id;
+ data << auction->bid;
+ data << (uint32) 0; //unk
+ data << (uint32) 0; //unk
+ data << (uint32) 0; //unk
+ data << auction->item_template;
+ data << (uint32) 0; //unk
+ SendPacket(&data);
+}
+
+//this function sends mail to old bidder
+void WorldSession::SendAuctionOutbiddedMail(AuctionEntry *auction, uint32 newPrice)
+{
+ uint64 oldBidder_guid = MAKE_NEW_GUID(auction->bidder,0, HIGHGUID_PLAYER);
+ Player *oldBidder = objmgr.GetPlayer(oldBidder_guid);
+
+ uint32 oldBidder_accId = 0;
+ if(!oldBidder)
+ oldBidder_accId = objmgr.GetPlayerAccountIdByGUID(oldBidder_guid);
+
+ // old bidder exist
+ if(oldBidder || oldBidder_accId)
+ {
+ std::ostringstream msgAuctionOutbiddedSubject;
+ msgAuctionOutbiddedSubject << auction->item_template << ":0:" << AUCTION_OUTBIDDED;
+
+ if (oldBidder && !_player)
+ oldBidder->GetSession()->SendAuctionBidderNotification( auction->GetHouseId(), auction->Id, AHBplayerGUID, newPrice, auction->GetAuctionOutBid(), auction->item_template);
+
+ if (oldBidder && _player)
+ oldBidder->GetSession()->SendAuctionBidderNotification( auction->GetHouseId(), auction->Id, _player->GetGUID(), newPrice, auction->GetAuctionOutBid(), auction->item_template);
+
+ WorldSession::SendMailTo(oldBidder, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), auction->bidder, msgAuctionOutbiddedSubject.str(), 0, NULL, auction->bid, 0, MAIL_CHECK_MASK_NONE);
+ }
+}
+
+//this function sends mail, when auction is canceled to old bidder
+void WorldSession::SendAuctionCancelledToBidderMail( AuctionEntry* auction )
+{
+ uint64 bidder_guid = MAKE_NEW_GUID(auction->bidder, 0, HIGHGUID_PLAYER);
+ Player *bidder = objmgr.GetPlayer(bidder_guid);
+
+ uint32 bidder_accId = 0;
+ if(!bidder)
+ bidder_accId = objmgr.GetPlayerAccountIdByGUID(bidder_guid);
+
+ // bidder exist
+ if(bidder || bidder_accId)
+ {
+ std::ostringstream msgAuctionCancelledSubject;
+ msgAuctionCancelledSubject << auction->item_template << ":0:" << AUCTION_CANCELLED_TO_BIDDER;
+
+ WorldSession::SendMailTo(bidder, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), auction->bidder, msgAuctionCancelledSubject.str(), 0, NULL, auction->bid, 0, MAIL_CHECK_MASK_NONE);
+ }
+}
+
+//this void creates new auction and adds auction to some auctionhouse
+void WorldSession::HandleAuctionSellItem( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+8+4+4+4);
+
+ uint64 auctioneer, item;
+ uint32 etime, bid, buyout;
+ recv_data >> auctioneer >> item;
+ recv_data >> bid >> buyout >> etime;
+ Player *pl = GetPlayer();
+
+ if (!item || !bid || !etime)
+ return; //check for cheaters
+
+ Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, auctioneer,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!pCreature)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionSellItem - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(auctioneer)) );
+ return;
+ }
+
+ AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(pCreature->getFaction());
+ if(!auctionHouseEntry)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionSellItem - Unit (GUID: %u) has wrong faction.", uint32(GUID_LOPART(auctioneer)) );
+ return;
+ }
+
+
+ // client send time in minutes, convert to common used sec time
+ etime *= MINUTE;
+
+ // client understand only 3 auction time
+ switch(etime)
+ {
+ case 1*MIN_AUCTION_TIME:
+ case 2*MIN_AUCTION_TIME:
+ case 4*MIN_AUCTION_TIME:
+ break;
+ default:
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ Item *it = pl->GetItemByGuid( item );
+ //do not allow to sell already auctioned items
+ if(auctionmgr.GetAItem(GUID_LOPART(item)))
+ {
+ sLog.outError("AuctionError, player %s is sending item id: %u, but item is already in another auction", pl->GetName(), GUID_LOPART(item));
+ SendAuctionCommandResult(0, AUCTION_SELL_ITEM, AUCTION_INTERNAL_ERROR);
+ return;
+ }
+ // prevent sending bag with items (cheat: can be placed in bag after adding equiped empty bag to auction)
+ if(!it)
+ {
+ SendAuctionCommandResult(0, AUCTION_SELL_ITEM, AUCTION_ITEM_NOT_FOUND);
+ return;
+ }
+
+ if(!it->CanBeTraded())
+ {
+ SendAuctionCommandResult(0, AUCTION_SELL_ITEM, AUCTION_INTERNAL_ERROR);
+ return;
+ }
+
+ if (it->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_CONJURED) || it->GetUInt32Value(ITEM_FIELD_DURATION))
+ {
+ SendAuctionCommandResult(0, AUCTION_SELL_ITEM, AUCTION_INTERNAL_ERROR);
+ return;
+ }
+
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMap( pCreature->getFaction() );
+
+ //we have to take deposit :
+ uint32 deposit = auctionmgr.GetAuctionDeposit( auctionHouseEntry, etime, it );
+ if ( pl->GetMoney() < deposit )
+ {
+ SendAuctionCommandResult(0, AUCTION_SELL_ITEM, AUCTION_NOT_ENOUGHT_MONEY);
+ return;
+ }
+
+ if( GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
+ {
+ sLog.outCommand(GetAccountId(),"GM %s (Account: %u) create auction: %s (Entry: %u Count: %u)",
+ GetPlayerName(),GetAccountId(),it->GetProto()->Name1,it->GetEntry(),it->GetCount());
+ }
+
+ pl->ModifyMoney( -int32(deposit) );
+
+ uint32 auction_time = uint32(etime * sWorld.getRate(RATE_AUCTION_TIME));
+
+ AuctionEntry *AH = new AuctionEntry;
+ AH->Id = objmgr.GenerateAuctionID();
+ AH->auctioneer = GUID_LOPART(auctioneer);
+ AH->item_guidlow = GUID_LOPART(item);
+ AH->item_template = it->GetEntry();
+ AH->owner = pl->GetGUIDLow();
+ AH->startbid = bid;
+ AH->bidder = 0;
+ AH->bid = 0;
+ AH->buyout = buyout;
+ AH->expire_time = time(NULL) + auction_time;
+ AH->deposit = deposit;
+ AH->auctionHouseEntry = auctionHouseEntry;
+
+ sLog.outDetail("selling item %u to auctioneer %u with initial bid %u with buyout %u and with time %u (in sec) in auctionhouse %u", GUID_LOPART(item), GUID_LOPART(auctioneer), bid, buyout, auction_time, AH->GetHouseId());
+ auctionHouse->AddAuction(AH);
+
+ auctionmgr.AddAItem(it);
+ pl->MoveItemFromInventory( it->GetBagSlot(), it->GetSlot(), true);
+
+ CharacterDatabase.BeginTransaction();
+ it->DeleteFromInventoryDB();
+ it->SaveToDB(); // recursive and not have transaction guard into self, not in inventiory and can be save standalone
+ AH->SaveToDB();
+ pl->SaveInventoryAndGoldToDB();
+ CharacterDatabase.CommitTransaction();
+
+ SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, AUCTION_OK);
+}
+
+//this function is called when client bids or buys out auction
+void WorldSession::HandleAuctionPlaceBid( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+4+4);
+
+ uint64 auctioneer;
+ uint32 auctionId;
+ uint32 price;
+ recv_data >> auctioneer;
+ recv_data >> auctionId >> price;
+
+ if (!auctionId || !price)
+ return; //check for cheaters
+
+ Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, auctioneer,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!pCreature)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionPlaceBid - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(auctioneer)) );
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMap( pCreature->getFaction() );
+
+ AuctionEntry *auction = auctionHouse->GetAuction(auctionId);
+ Player *pl = GetPlayer();
+
+ if( !auction || auction->owner == pl->GetGUIDLow() )
+ {
+ //you cannot bid your own auction:
+ SendAuctionCommandResult( 0, AUCTION_PLACE_BID, CANNOT_BID_YOUR_AUCTION_ERROR );
+ return;
+ }
+
+ // impossible have online own another character (use this for speedup check in case online owner)
+ Player* auction_owner = objmgr.GetPlayer(MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER));
+ if( !auction_owner && objmgr.GetPlayerAccountIdByGUID(MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER)) == pl->GetSession()->GetAccountId())
+ {
+ //you cannot bid your another character auction:
+ SendAuctionCommandResult( 0, AUCTION_PLACE_BID, CANNOT_BID_YOUR_AUCTION_ERROR );
+ return;
+ }
+
+ // cheating
+ if(price <= auction->bid)
+ return;
+
+ // price too low for next bid if not buyout
+ if ((price < auction->buyout || auction->buyout == 0) &&
+ price < auction->bid + auction->GetAuctionOutBid())
+ {
+ //auction has already higher bid, client tests it!
+ return;
+ }
+
+ if (price > pl->GetMoney())
+ {
+ //you don't have enought money!, client tests!
+ //SendAuctionCommandResult(auction->auctionId, AUCTION_PLACE_BID, ???);
+ return;
+ }
+
+ if ((price < auction->buyout) || (auction->buyout == 0))
+ {
+ if (auction->bidder > 0)
+ {
+ if ( auction->bidder == pl->GetGUIDLow() )
+ {
+ pl->ModifyMoney( -int32(price - auction->bid));
+ }
+ else
+ {
+ // mail to last bidder and return money
+ SendAuctionOutbiddedMail( auction , price );
+ pl->ModifyMoney( -int32(price) );
+ }
+ }
+ else
+ {
+ pl->ModifyMoney( -int32(price) );
+ }
+ auction->bidder = pl->GetGUIDLow();
+ auction->bid = price;
+
+ // after this update we should save player's money ...
+ CharacterDatabase.PExecute("UPDATE auctionhouse SET buyguid = '%u',lastbid = '%u' WHERE id = '%u'", auction->bidder, auction->bid, auction->Id);
+
+ SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, AUCTION_OK, 0 );
+ }
+ else
+ {
+ //buyout:
+ if (pl->GetGUIDLow() == auction->bidder )
+ {
+ pl->ModifyMoney(-int32(auction->buyout - auction->bid));
+ }
+ else
+ {
+ pl->ModifyMoney(-int32(auction->buyout));
+ if ( auction->bidder ) //buyout for bidded auction ..
+ {
+ SendAuctionOutbiddedMail( auction, auction->buyout );
+ }
+ }
+ auction->bidder = pl->GetGUIDLow();
+ auction->bid = auction->buyout;
+
+ auctionmgr.SendAuctionSalePendingMail( auction );
+ auctionmgr.SendAuctionSuccessfulMail( auction );
+ auctionmgr.SendAuctionWonMail( auction );
+
+ SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, AUCTION_OK);
+
+ auctionmgr.RemoveAItem(auction->item_guidlow);
+ auctionHouse->RemoveAuction(auction->Id);
+ auction->DeleteFromDB();
+
+ delete auction;
+ }
+ CharacterDatabase.BeginTransaction();
+ pl->SaveInventoryAndGoldToDB();
+ CharacterDatabase.CommitTransaction();
+}
+
+//this void is called when auction_owner cancels his auction
+void WorldSession::HandleAuctionRemoveItem( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+4);
+
+ uint64 auctioneer;
+ uint32 auctionId;
+ recv_data >> auctioneer;
+ recv_data >> auctionId;
+ //sLog.outDebug( "Cancel AUCTION AuctionID: %u", auctionId);
+
+ Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, auctioneer,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!pCreature)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionRemoveItem - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(auctioneer)) );
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMap( pCreature->getFaction() );
+
+ AuctionEntry *auction = auctionHouse->GetAuction(auctionId);
+ Player *pl = GetPlayer();
+
+ if (auction && auction->owner == pl->GetGUIDLow())
+ {
+ Item *pItem = auctionmgr.GetAItem(auction->item_guidlow);
+ if (pItem)
+ {
+ if (auction->bidder > 0) // If we have a bidder, we have to send him the money he paid
+ {
+ uint32 auctionCut = auction->GetAuctionCut();
+ if ( pl->GetMoney() < auctionCut ) //player doesn't have enough money, maybe message needed
+ return;
+ //some auctionBidderNotification would be needed, but don't know that parts..
+ SendAuctionCancelledToBidderMail( auction );
+ pl->ModifyMoney( -int32(auctionCut) );
+ }
+ // Return the item by mail
+ std::ostringstream msgAuctionCanceledOwner;
+ msgAuctionCanceledOwner << auction->item_template << ":0:" << AUCTION_CANCELED;
+
+ MailItemsInfo mi;
+ mi.AddItem(auction->item_guidlow, auction->item_template, pItem);
+
+ // item will deleted or added to received mail list
+ WorldSession::SendMailTo(pl, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), pl->GetGUIDLow(), msgAuctionCanceledOwner.str(), 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ }
+ else
+ {
+ sLog.outError("Auction id: %u has non-existed item (item guid : %u)!!!", auction->Id, auction->item_guidlow);
+ SendAuctionCommandResult( 0, AUCTION_CANCEL, AUCTION_INTERNAL_ERROR );
+ return;
+ }
+ }
+ else
+ {
+ SendAuctionCommandResult( 0, AUCTION_CANCEL, AUCTION_INTERNAL_ERROR );
+ //this code isn't possible ... maybe there should be assert
+ sLog.outError("CHEATER : %u, he tried to cancel auction (id: %u) of another player, or auction is NULL", pl->GetGUIDLow(), auctionId );
+ return;
+ }
+
+ //inform player, that auction is removed
+ SendAuctionCommandResult( auction->Id, AUCTION_CANCEL, AUCTION_OK );
+ // Now remove the auction
+ CharacterDatabase.BeginTransaction();
+ auction->DeleteFromDB();
+ pl->SaveInventoryAndGoldToDB();
+ CharacterDatabase.CommitTransaction();
+ auctionmgr.RemoveAItem( auction->item_guidlow );
+ auctionHouse->RemoveAuction( auction->Id );
+ delete auction;
+}
+
+//called when player lists his bids
+void WorldSession::HandleAuctionListBidderItems( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+4+4);
+
+ uint64 guid; //NPC guid
+ uint32 listfrom; //page of auctions
+ uint32 outbiddedCount; //count of outbidded auctions
+
+ recv_data >> guid;
+ recv_data >> listfrom; // not used in fact (this list not have page control in client)
+ recv_data >> outbiddedCount;
+ if (recv_data.size() != (16 + outbiddedCount * 4 ))
+ {
+ sLog.outError("Client sent bad opcode!!! with count: %u and size : %d (mustbe: %d", outbiddedCount, recv_data.size(),(16 + outbiddedCount * 4 ));
+ outbiddedCount = 0;
+ }
+
+ Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!pCreature)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionListBidderItems - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMap( pCreature->getFaction() );
+
+ WorldPacket data( SMSG_AUCTION_BIDDER_LIST_RESULT, (4+4+4) );
+ Player *pl = GetPlayer();
+ data << (uint32) 0; //add 0 as count
+ uint32 count = 0;
+ uint32 totalcount = 0;
+ while ( outbiddedCount > 0) //add all data, which client requires
+ {
+ --outbiddedCount;
+ uint32 outbiddedAuctionId;
+ recv_data >> outbiddedAuctionId;
+ AuctionEntry * auction = auctionHouse->GetAuction( outbiddedAuctionId );
+ if ( auction && auction->BuildAuctionInfo(data))
+ {
+ ++totalcount;
+ ++count;
+ }
+ }
+
+ auctionHouse->BuildListBidderItems(data,pl,count,totalcount);
+ data.put<uint32>( 0, count ); // add count to placeholder
+ data << totalcount;
+ data << (uint32)300; //unk 2.3.0
+ SendPacket(&data);
+}
+
+//this void sends player info about his auctions
+void WorldSession::HandleAuctionListOwnerItems( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+4);
+
+ uint32 listfrom;
+ uint64 guid;
+
+ recv_data >> guid;
+ recv_data >> listfrom; // not used in fact (this list not have page control in client)
+
+ Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!pCreature)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionListOwnerItems - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMap( pCreature->getFaction() );
+
+ WorldPacket data( SMSG_AUCTION_OWNER_LIST_RESULT, (4+4+4) );
+ data << (uint32) 0; // amount place holder
+
+ uint32 count = 0;
+ uint32 totalcount = 0;
+
+ auctionHouse->BuildListOwnerItems(data,_player,count,totalcount);
+ data.put<uint32>(0, count);
+ data << (uint32) totalcount;
+ data << (uint32) 0;
+ SendPacket(&data);
+}
+
+//this void is called when player clicks on search button
+void WorldSession::HandleAuctionListItems( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data,8+4+1+1+1+4+4+4+4+1);
+
+ std::string searchedname;
+ uint8 levelmin, levelmax, usable;
+ uint32 listfrom, auctionSlotID, auctionMainCategory, auctionSubCategory, quality;
+ uint64 guid;
+
+ recv_data >> guid;
+ recv_data >> listfrom; // start, used for page control listing by 50 elements
+ recv_data >> searchedname;
+
+ // recheck with known string size
+ CHECK_PACKET_SIZE(recv_data,8+4+(searchedname.size()+1)+1+1+4+4+4+4+1);
+
+ recv_data >> levelmin >> levelmax;
+ recv_data >> auctionSlotID >> auctionMainCategory >> auctionSubCategory;
+ recv_data >> quality >> usable;
+
+ Creature *pCreature = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid,UNIT_NPC_FLAG_AUCTIONEER);
+ if (!pCreature)
+ {
+ sLog.outDebug( "WORLD: HandleAuctionListItems - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
+ return;
+ }
+
+ // remove fake death
+ if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ AuctionHouseObject* auctionHouse = auctionmgr.GetAuctionsMap( pCreature->getFaction() );
+
+ //sLog.outDebug("Auctionhouse search guid: " I64FMTD ", list from: %u, searchedname: %s, levelmin: %u, levelmax: %u, auctionSlotID: %u, auctionMainCategory: %u, auctionSubCategory: %u, quality: %u, usable: %u", guid, listfrom, searchedname.c_str(), levelmin, levelmax, auctionSlotID, auctionMainCategory, auctionSubCategory, quality, usable);
+
+ WorldPacket data( SMSG_AUCTION_LIST_RESULT, (4+4+4) );
+ uint32 count = 0;
+ uint32 totalcount = 0;
+ data << (uint32) 0;
+
+ // converting string that we try to find to lower case
+ std::wstring wsearchedname;
+ if(!Utf8toWStr(searchedname,wsearchedname))
+ return;
+
+ wstrToLower(wsearchedname);
+
+ auctionHouse->BuildListAuctionItems(data,_player,
+ wsearchedname, listfrom, levelmin, levelmax, usable,
+ auctionSlotID, auctionMainCategory, auctionSubCategory, quality,
+ count,totalcount);
+
+ data.put<uint32>(0, count);
+ data << (uint32) totalcount;
+ data << (uint32) 300; // unk 2.3.0 const?
+ SendPacket(&data);
+}
+
+void WorldSession::HandleAuctionListPendingSales( WorldPacket & recv_data )
+{
+ sLog.outDebug("CMSG_AUCTION_LIST_PENDING_SALES");
+ recv_data.hexlike();
+
+ uint32 count = 0;
+
+ WorldPacket data(SMSG_AUCTION_LIST_PENDING_SALES, 4);
+ data << uint32(count); // count
+ /*for(uint32 i = 0; i < count; ++i)
+ {
+ data << ""; // string
+ data << ""; // string
+ data << uint32(0);
+ data << uint32(0);
+ data << float(0);
+ }*/
+ SendPacket(&data);
+}
diff --git a/src/game/AuctionHouseMgr.cpp b/src/game/AuctionHouseMgr.cpp
new file mode 100644
index 00000000000..e3b737c6278
--- /dev/null
+++ b/src/game/AuctionHouseMgr.cpp
@@ -0,0 +1,692 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Common.h"
+#include "Database/DatabaseEnv.h"
+#include "Database/DBCStores.h"
+#include "Database/SQLStorage.h"
+#include "ProgressBar.h"
+
+#include "AccountMgr.h"
+#include "AuctionHouseMgr.h"
+#include "Item.h"
+#include "Language.h"
+#include "Log.h"
+#include "ObjectMgr.h"
+#include "Player.h"
+#include "World.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
+
+#include "Policies/SingletonImp.h"
+
+INSTANTIATE_SINGLETON_1( AuctionHouseMgr );
+
+AuctionHouseMgr::AuctionHouseMgr()
+{
+}
+
+AuctionHouseMgr::~AuctionHouseMgr()
+{
+ for(ItemMap::iterator itr = mAitems.begin(); itr != mAitems.end(); ++itr)
+ delete itr->second;
+}
+
+AuctionHouseObject * AuctionHouseMgr::GetAuctionsMapByLocation( AuctionLocation location )
+{
+ switch(location)
+ {
+ case AUCTION_ALLIANCE: return &mAllianceAuctions;
+ case AUCTION_HORDE: return &mHordeAuctions;
+ default: return &mNeutralAuctions;
+ }
+}
+
+AuctionHouseObject * AuctionHouseMgr::GetAuctionsMap( uint32 factionTemplateId )
+{
+ // team have linked auction houses
+ FactionTemplateEntry const* u_entry = sFactionTemplateStore.LookupEntry(factionTemplateId);
+ if(!u_entry)
+ return &mNeutralAuctions;
+ else if(u_entry->ourMask & FACTION_MASK_ALLIANCE)
+ return &mAllianceAuctions;
+ else if(u_entry->ourMask & FACTION_MASK_HORDE)
+ return &mHordeAuctions;
+ else
+ return &mNeutralAuctions;
+}
+
+uint32 AuctionHouseMgr::GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 time, Item *pItem)
+{
+ uint32 deposit = pItem->GetProto()->SellPrice * pItem->GetCount() * (time / MIN_AUCTION_TIME );
+
+ return uint32(deposit * entry->depositPercent * 3 * sWorld.getRate(RATE_AUCTION_DEPOSIT) / 100.0f );
+}
+
+//does not clear ram
+void AuctionHouseMgr::SendAuctionWonMail( AuctionEntry *auction )
+{
+ Item *pItem = GetAItem(auction->item_guidlow);
+ if(!pItem)
+ return;
+
+ uint64 bidder_guid = MAKE_NEW_GUID(auction->bidder, 0, HIGHGUID_PLAYER);
+ Player *bidder = objmgr.GetPlayer(bidder_guid);
+
+ uint32 bidder_accId = 0;
+
+ // data for gm.log
+ if( sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
+ {
+ uint32 bidder_security = 0;
+ std::string bidder_name;
+ if (bidder)
+ {
+ bidder_accId = bidder->GetSession()->GetAccountId();
+ bidder_security = bidder->GetSession()->GetSecurity();
+ bidder_name = bidder->GetName();
+ }
+ else
+ {
+ bidder_accId = objmgr.GetPlayerAccountIdByGUID(bidder_guid);
+ bidder_security = accmgr.GetSecurity(bidder_accId);
+
+ if(bidder_security > SEC_PLAYER ) // not do redundant DB requests
+ {
+ if(!objmgr.GetPlayerNameByGUID(bidder_guid,bidder_name))
+ bidder_name = objmgr.GetTrinityStringForDBCLocale(LANG_UNKNOWN);
+ }
+ }
+
+ if( bidder_security > SEC_PLAYER )
+ {
+ std::string owner_name;
+ if(!objmgr.GetPlayerNameByGUID(auction->owner,owner_name))
+ owner_name = objmgr.GetTrinityStringForDBCLocale(LANG_UNKNOWN);
+
+ uint32 owner_accid = objmgr.GetPlayerAccountIdByGUID(auction->owner);
+
+ sLog.outCommand(bidder_accId,"GM %s (Account: %u) won item in auction: %s (Entry: %u Count: %u) and pay money: %u. Original owner %s (Account: %u)",
+ bidder_name.c_str(),bidder_accId,pItem->GetProto()->Name1,pItem->GetEntry(),pItem->GetCount(),auction->bid,owner_name.c_str(),owner_accid);
+ }
+ }
+ else if(!bidder)
+ bidder_accId = objmgr.GetPlayerAccountIdByGUID(bidder_guid);
+
+ // receiver exist
+ if(bidder || bidder_accId)
+ {
+ std::ostringstream msgAuctionWonSubject;
+ msgAuctionWonSubject << auction->item_template << ":0:" << AUCTION_WON;
+
+ std::ostringstream msgAuctionWonBody;
+ msgAuctionWonBody.width(16);
+ msgAuctionWonBody << std::right << std::hex << auction->owner;
+ msgAuctionWonBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
+ sLog.outDebug( "AuctionWon body string : %s", msgAuctionWonBody.str().c_str() );
+
+ //prepare mail data... :
+ uint32 itemTextId = objmgr.CreateItemText( msgAuctionWonBody.str() );
+
+ // set owner to bidder (to prevent delete item with sender char deleting)
+ // owner in `data` will set at mail receive and item extracting
+ CharacterDatabase.PExecute("UPDATE item_instance SET owner_guid = '%u' WHERE guid='%u'",auction->bidder,pItem->GetGUIDLow());
+ CharacterDatabase.CommitTransaction();
+
+ MailItemsInfo mi;
+ mi.AddItem(auction->item_guidlow, auction->item_template, pItem);
+
+ if (bidder)
+ bidder->GetSession()->SendAuctionBidderNotification( auction->GetHouseId(), auction->Id, bidder_guid, 0, 0, auction->item_template);
+ else
+ RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
+
+ // will delete item or place to receiver mail list
+ WorldSession::SendMailTo(bidder, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), auction->bidder, msgAuctionWonSubject.str(), itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_AUCTION);
+ }
+ // receiver not exist
+ else
+ {
+ CharacterDatabase.PExecute("DELETE FROM item_instance WHERE guid='%u'", pItem->GetGUIDLow());
+ RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
+ delete pItem;
+ }
+}
+
+void AuctionHouseMgr::SendAuctionSalePendingMail( AuctionEntry * auction )
+{
+ uint64 owner_guid = MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER);
+ Player *owner = objmgr.GetPlayer(owner_guid);
+
+ // owner exist (online or offline)
+ if(owner || objmgr.GetPlayerAccountIdByGUID(owner_guid))
+ {
+ std::ostringstream msgAuctionSalePendingSubject;
+ msgAuctionSalePendingSubject << auction->item_template << ":0:" << AUCTION_SALE_PENDING;
+
+ std::ostringstream msgAuctionSalePendingBody;
+ uint32 auctionCut = auction->GetAuctionCut();
+
+ time_t distrTime = time(NULL) + HOUR;
+
+ msgAuctionSalePendingBody.width(16);
+ msgAuctionSalePendingBody << std::right << std::hex << auction->bidder;
+ msgAuctionSalePendingBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
+ msgAuctionSalePendingBody << ":" << auction->deposit << ":" << auctionCut << ":0:";
+ msgAuctionSalePendingBody << secsToTimeBitFields(distrTime);
+
+ sLog.outDebug("AuctionSalePending body string : %s", msgAuctionSalePendingBody.str().c_str());
+
+ uint32 itemTextId = objmgr.CreateItemText( msgAuctionSalePendingBody.str() );
+
+ WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), auction->owner, msgAuctionSalePendingSubject.str(), itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_AUCTION);
+ }
+}
+
+//call this method to send mail to auction owner, when auction is successful, it does not clear ram
+void AuctionHouseMgr::SendAuctionSuccessfulMail( AuctionEntry * auction )
+{
+ uint64 owner_guid = MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER);
+ Player *owner = objmgr.GetPlayer(owner_guid);
+
+ uint32 owner_accId = 0;
+ if(!owner)
+ owner_accId = objmgr.GetPlayerAccountIdByGUID(owner_guid);
+
+ // owner exist
+ if(owner || owner_accId)
+ {
+ std::ostringstream msgAuctionSuccessfulSubject;
+ msgAuctionSuccessfulSubject << auction->item_template << ":0:" << AUCTION_SUCCESSFUL;
+
+ std::ostringstream auctionSuccessfulBody;
+ uint32 auctionCut = auction->GetAuctionCut();
+
+ auctionSuccessfulBody.width(16);
+ auctionSuccessfulBody << std::right << std::hex << auction->bidder;
+ auctionSuccessfulBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
+ auctionSuccessfulBody << ":" << auction->deposit << ":" << auctionCut;
+
+ sLog.outDebug("AuctionSuccessful body string : %s", auctionSuccessfulBody.str().c_str());
+
+ uint32 itemTextId = objmgr.CreateItemText( auctionSuccessfulBody.str() );
+
+ uint32 profit = auction->bid + auction->deposit - auctionCut;
+
+ if (owner)
+ {
+ //send auction owner notification, bidder must be current!
+ owner->GetSession()->SendAuctionOwnerNotification( auction );
+ }
+
+ WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), auction->owner, msgAuctionSuccessfulSubject.str(), itemTextId, NULL, profit, 0, MAIL_CHECK_MASK_AUCTION, HOUR);
+ }
+}
+
+//does not clear ram
+void AuctionHouseMgr::SendAuctionExpiredMail( AuctionEntry * auction )
+{ //return an item in auction to its owner by mail
+ Item *pItem = GetAItem(auction->item_guidlow);
+ if(!pItem)
+ {
+ sLog.outError("Auction item (GUID: %u) not found, and lost.",auction->item_guidlow);
+ return;
+ }
+
+ uint64 owner_guid = MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER);
+ Player *owner = objmgr.GetPlayer(owner_guid);
+
+ uint32 owner_accId = 0;
+ if(!owner)
+ owner_accId = objmgr.GetPlayerAccountIdByGUID(owner_guid);
+
+ // owner exist
+ if(owner || owner_accId)
+ {
+ std::ostringstream subject;
+ subject << auction->item_template << ":0:" << AUCTION_EXPIRED;
+
+ if ( owner )
+ owner->GetSession()->SendAuctionOwnerNotification( auction );
+ else
+ RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
+
+ MailItemsInfo mi;
+ mi.AddItem(auction->item_guidlow, auction->item_template, pItem);
+
+ // will delete item or place to receiver mail list
+ WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->GetHouseId(), GUID_LOPART(owner_guid), subject.str(), 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
+ }
+ // owner not found
+ else
+ {
+ CharacterDatabase.PExecute("DELETE FROM item_instance WHERE guid='%u'",pItem->GetGUIDLow());
+ RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
+ delete pItem;
+ }
+}
+
+void AuctionHouseMgr::LoadAuctionItems()
+{
+ // data needs to be at first place for Item::LoadFromDB
+ QueryResult *result = CharacterDatabase.Query( "SELECT data,itemguid,item_template FROM auctionhouse JOIN item_instance ON itemguid = guid" );
+
+ if( !result )
+ {
+ barGoLink bar(1);
+ bar.step();
+ sLog.outString();
+ sLog.outString(">> Loaded 0 auction items");
+ return;
+ }
+
+ barGoLink bar( result->GetRowCount() );
+
+ uint32 count = 0;
+
+ Field *fields;
+ do
+ {
+ bar.step();
+
+ fields = result->Fetch();
+ uint32 item_guid = fields[1].GetUInt32();
+ uint32 item_template = fields[2].GetUInt32();
+
+ ItemPrototype const *proto = objmgr.GetItemPrototype(item_template);
+
+ if(!proto)
+ {
+ sLog.outError( "ObjectMgr::LoadAuctionItems: Unknown item (GUID: %u id: #%u) in auction, skipped.", item_guid,item_template);
+ continue;
+ }
+
+ Item *item = NewItemOrBag(proto);
+
+ if(!item->LoadFromDB(item_guid,0, result))
+ {
+ delete item;
+ continue;
+ }
+ AddAItem(item);
+
+ ++count;
+ }
+ while( result->NextRow() );
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u auction items", count );
+}
+
+void AuctionHouseMgr::LoadAuctions()
+{
+ QueryResult *result = CharacterDatabase.Query("SELECT COUNT(*) FROM auctionhouse");
+ if( !result )
+ {
+ barGoLink bar(1);
+ bar.step();
+ sLog.outString();
+ sLog.outString(">> Loaded 0 auctions. DB table `auctionhouse` is empty.");
+ return;
+ }
+
+ Field *fields = result->Fetch();
+ uint32 AuctionCount=fields[0].GetUInt32();
+ delete result;
+
+ if(!AuctionCount)
+ {
+ barGoLink bar(1);
+ bar.step();
+ sLog.outString();
+ sLog.outString(">> Loaded 0 auctions. DB table `auctionhouse` is empty.");
+ return;
+ }
+
+ result = CharacterDatabase.Query( "SELECT id,auctioneerguid,itemguid,item_template,itemowner,buyoutprice,time,buyguid,lastbid,startbid,deposit FROM auctionhouse" );
+ if( !result )
+ {
+ barGoLink bar(1);
+ bar.step();
+ sLog.outString();
+ sLog.outString(">> Loaded 0 auctions. DB table `auctionhouse` is empty.");
+ return;
+ }
+
+ barGoLink bar( AuctionCount );
+
+ AuctionEntry *aItem;
+
+ do
+ {
+ fields = result->Fetch();
+
+ bar.step();
+
+ aItem = new AuctionEntry;
+ aItem->Id = fields[0].GetUInt32();
+ aItem->auctioneer = fields[1].GetUInt32();
+ aItem->item_guidlow = fields[2].GetUInt32();
+ aItem->item_template = fields[3].GetUInt32();
+ aItem->owner = fields[4].GetUInt32();
+ aItem->buyout = fields[5].GetUInt32();
+ aItem->expire_time = fields[6].GetUInt32();
+ aItem->bidder = fields[7].GetUInt32();
+ aItem->bid = fields[8].GetUInt32();
+ aItem->startbid = fields[9].GetUInt32();
+ aItem->deposit = fields[10].GetUInt32();
+
+ CreatureData const* auctioneerData = objmgr.GetCreatureData(aItem->auctioneer);
+ if(!auctioneerData)
+ {
+ aItem->DeleteFromDB();
+ sLog.outError("Auction %u has not a existing auctioneer (GUID : %u)", aItem->Id, aItem->auctioneer);
+ delete aItem;
+ continue;
+ }
+
+ CreatureInfo const* auctioneerInfo = objmgr.GetCreatureTemplate(auctioneerData->id);
+ if(!auctioneerInfo)
+ {
+ aItem->DeleteFromDB();
+ sLog.outError("Auction %u has not a existing auctioneer (GUID : %u Entry: %u)", aItem->Id, aItem->auctioneer,auctioneerData->id);
+ delete aItem;
+ continue;
+ }
+
+ aItem->auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(auctioneerInfo->faction_A);
+ if(!aItem->auctionHouseEntry)
+ {
+ aItem->DeleteFromDB();
+ sLog.outError("Auction %u has auctioneer (GUID : %u Entry: %u) with wrong faction %u",
+ aItem->Id, aItem->auctioneer,auctioneerData->id,auctioneerInfo->faction_A);
+ delete aItem;
+ continue;
+ }
+
+ // check if sold item exists for guid
+ // and item_template in fact (GetAItem will fail if problematic in result check in ObjectMgr::LoadAuctionItems)
+ if ( !GetAItem( aItem->item_guidlow ) )
+ {
+ aItem->DeleteFromDB();
+ sLog.outError("Auction %u has not a existing item : %u", aItem->Id, aItem->item_guidlow);
+ delete aItem;
+ continue;
+ }
+
+ GetAuctionsMap( auctioneerInfo->faction_A )->AddAuction(aItem);
+
+ } while (result->NextRow());
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u auctions", AuctionCount );
+}
+
+void AuctionHouseMgr::AddAItem( Item* it )
+{
+ ASSERT( it );
+ ASSERT( mAitems.find(it->GetGUIDLow()) == mAitems.end());
+ mAitems[it->GetGUIDLow()] = it;
+}
+
+bool AuctionHouseMgr::RemoveAItem( uint32 id )
+{
+ ItemMap::iterator i = mAitems.find(id);
+ if (i == mAitems.end())
+ {
+ return false;
+ }
+ mAitems.erase(i);
+ return true;
+}
+
+void AuctionHouseMgr::Update()
+{
+ mHordeAuctions.Update();
+ mAllianceAuctions.Update();
+ mNeutralAuctions.Update();
+}
+
+AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTemplateId)
+{
+ uint32 houseid = 1; // human auction house
+
+ if(!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
+ {
+ //FIXME: found way for proper auctionhouse selection by another way
+ // AuctionHo use.dbc have faction field with _player_ factions associated with auction house races.
+ // but no easy way convert creature faction to player race faction for specific city
+ switch(factionTemplateId)
+ {
+ case 12: houseid = 1; break; // human
+ case 29: houseid = 6; break; // orc, and generic for horde
+ case 55: houseid = 2; break; // dwarf, and generic for alliance
+ case 68: houseid = 4; break; // undead
+ case 80: houseid = 3; break; // n-elf
+ case 104: houseid = 5; break; // trolls
+ case 120: houseid = 7; break; // booty bay, neutral
+ case 474: houseid = 7; break; // gadgetzan, neutral
+ case 855: houseid = 7; break; // everlook, neutral
+ case 1604: houseid = 6; break; // b-elfs,
+ default: // for unknown case
+ {
+ FactionTemplateEntry const* u_entry = sFactionTemplateStore.LookupEntry(factionTemplateId);
+ if(!u_entry)
+ houseid = 7; // goblin auction house
+ else if(u_entry->ourMask & FACTION_MASK_ALLIANCE)
+ houseid = 1; // human auction house
+ else if(u_entry->ourMask & FACTION_MASK_HORDE)
+ houseid = 6; // orc auction house
+ else
+ houseid = 7; // goblin auction house
+ break;
+ }
+ }
+ }
+
+ return sAuctionHouseStore.LookupEntry(houseid);
+}
+
+void AuctionHouseObject::Update()
+{
+ time_t curTime = sWorld.GetGameTime();
+ ///- Handle expired auctions
+ AuctionEntryMap::iterator next;
+ for (AuctionEntryMap::iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end();itr = next)
+ {
+ next = itr;
+ ++next;
+ if (curTime > (itr->second->expire_time))
+ {
+ ///- Either cancel the auction if there was no bidder
+ if (itr->second->bidder == 0)
+ {
+ auctionmgr.SendAuctionExpiredMail( itr->second );
+ }
+ ///- Or perform the transaction
+ else
+ {
+ //we should send an "item sold" message if the seller is online
+ //we send the item to the winner
+ //we send the money to the seller
+ auctionmgr.SendAuctionSuccessfulMail( itr->second );
+ auctionmgr.SendAuctionWonMail( itr->second );
+ }
+
+ ///- In any case clear the auction
+ itr->second->DeleteFromDB();
+ auctionmgr.RemoveAItem(itr->second->item_guidlow);
+ delete itr->second;
+ RemoveAuction(itr->first);
+ }
+ }
+}
+
+void AuctionHouseObject::BuildListBidderItems(WorldPacket& data, Player* player, uint32& count, uint32& totalcount)
+{
+ for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin();itr != AuctionsMap.end();++itr)
+ {
+ AuctionEntry *Aentry = itr->second;
+ if( Aentry && Aentry->bidder == player->GetGUIDLow() )
+ {
+ if (itr->second->BuildAuctionInfo(data))
+ ++count;
+ ++totalcount;
+ }
+ }
+}
+
+void AuctionHouseObject::BuildListOwnerItems(WorldPacket& data, Player* player, uint32& count, uint32& totalcount)
+{
+ for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin();itr != AuctionsMap.end();++itr)
+ {
+ AuctionEntry *Aentry = itr->second;
+ if( Aentry && Aentry->owner == player->GetGUIDLow() )
+ {
+ if(Aentry->BuildAuctionInfo(data))
+ ++count;
+ ++totalcount;
+ }
+ }
+}
+
+void AuctionHouseObject::BuildListAuctionItems(WorldPacket& data, Player* player,
+ std::wstring const& wsearchedname, uint32 listfrom, uint32 levelmin, uint32 levelmax, uint32 usable,
+ uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality,
+ uint32& count, uint32& totalcount)
+{
+ int loc_idx = player->GetSession()->GetSessionDbLocaleIndex();
+
+ for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin();itr != AuctionsMap.end();++itr)
+ {
+ AuctionEntry *Aentry = itr->second;
+ Item *item = auctionmgr.GetAItem(Aentry->item_guidlow);
+ if (!item)
+ continue;
+
+ ItemPrototype const *proto = item->GetProto();
+
+ if (itemClass != 0xffffffff && proto->Class != itemClass)
+ continue;
+
+ if (itemSubClass != 0xffffffff && proto->SubClass != itemSubClass)
+ continue;
+
+ if (inventoryType != 0xffffffff && proto->InventoryType != inventoryType)
+ continue;
+
+ if (quality != 0xffffffff && proto->Quality != quality)
+ continue;
+
+ if (levelmin != 0x00 && (proto->RequiredLevel < levelmin || (levelmax != 0x00 && proto->RequiredLevel > levelmax)))
+ continue;
+
+ if (usable != 0x00 && player->CanUseItem( item ) != EQUIP_ERR_OK)
+ continue;
+
+ std::string name = proto->Name1;
+ if(name.empty())
+ continue;
+
+ // local name
+ if ( loc_idx >= 0 )
+ {
+ ItemLocale const *il = objmgr.GetItemLocale(proto->ItemId);
+ if (il)
+ {
+ if (il->Name.size() > size_t(loc_idx) && !il->Name[loc_idx].empty())
+ name = il->Name[loc_idx];
+ }
+ }
+
+ if (!wsearchedname.empty() && !Utf8FitTo(name, wsearchedname) )
+ continue;
+
+ if (count < 50 && totalcount >= listfrom)
+ {
+ ++count;
+ Aentry->BuildAuctionInfo(data);
+ }
+ ++totalcount;
+ }
+}
+
+//this function inserts to WorldPacket auction's data
+bool AuctionEntry::BuildAuctionInfo(WorldPacket & data) const
+{
+ Item *pItem = auctionmgr.GetAItem(item_guidlow);
+ if (!pItem)
+ {
+ sLog.outError("auction to item, that doesn't exist !!!!");
+ return false;
+ }
+ data << (uint32) Id;
+ data << (uint32) pItem->GetEntry();
+
+ for (uint8 i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; i++)
+ {
+ data << (uint32) pItem->GetEnchantmentId(EnchantmentSlot(i));
+ data << (uint32) pItem->GetEnchantmentDuration(EnchantmentSlot(i));
+ data << (uint32) pItem->GetEnchantmentCharges(EnchantmentSlot(i));
+ }
+
+ data << (uint32) pItem->GetItemRandomPropertyId(); //random item property id
+ data << (uint32) pItem->GetItemSuffixFactor(); //SuffixFactor
+ data << (uint32) pItem->GetCount(); //item->count
+ data << (uint32) pItem->GetSpellCharges(); //item->charge FFFFFFF
+ data << (uint32) 0; //Unknown
+ data << (uint64) owner; //Auction->owner
+ data << (uint32) startbid; //Auction->startbid (not sure if useful)
+ data << (uint32) (bid ? GetAuctionOutBid() : 0);
+ //minimal outbid
+ data << (uint32) buyout; //auction->buyout
+ data << (uint32) (expire_time - time(NULL))* 1000; //time left
+ data << (uint64) bidder; //auction->bidder current
+ data << (uint32) bid; //current bid
+ return true;
+}
+
+uint32 AuctionEntry::GetAuctionCut() const
+{
+ return uint32(auctionHouseEntry->cutPercent * bid * sWorld.getRate(RATE_AUCTION_CUT) / 100.f);
+}
+
+/// the sum of outbid is (1% from current bid)*5, if bid is very small, it is 1c
+uint32 AuctionEntry::GetAuctionOutBid() const
+{
+ uint32 outbid = (bid / 100) * 5;
+ if (!outbid)
+ outbid = 1;
+ return outbid;
+}
+
+void AuctionEntry::DeleteFromDB() const
+{
+ //No SQL injection (Id is integer)
+ CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE id = '%u'",Id);
+}
+
+void AuctionEntry::SaveToDB() const
+{
+ //No SQL injection (no strings)
+ CharacterDatabase.PExecute("INSERT INTO auctionhouse (id,auctioneerguid,itemguid,item_template,itemowner,buyoutprice,time,buyguid,lastbid,startbid,deposit) "
+ "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '" I64FMTD "', '%u', '%u', '%u', '%u')",
+ Id, auctioneer, item_guidlow, item_template, owner, buyout, (uint64)expire_time, bidder, bid, startbid, deposit);
+}
diff --git a/src/game/AuctionHouseMgr.h b/src/game/AuctionHouseMgr.h
new file mode 100644
index 00000000000..713a9575ade
--- /dev/null
+++ b/src/game/AuctionHouseMgr.h
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _AUCTION_HOUSE_MGR_H
+#define _AUCTION_HOUSE_MGR_H
+
+#include "SharedDefines.h"
+#include "Policies/Singleton.h"
+
+class Item;
+class Player;
+class WorldPacket;
+
+#define MIN_AUCTION_TIME (12*HOUR)
+
+//only used for bot
+enum AuctionLocation
+{
+ AUCTION_ALLIANCE = 2,
+ AUCTION_HORDE = 6,
+ AUCTION_NEUTRAL = 7
+};
+
+enum AuctionError
+{
+ AUCTION_OK = 0,
+ AUCTION_INTERNAL_ERROR = 2,
+ AUCTION_NOT_ENOUGHT_MONEY = 3,
+ AUCTION_ITEM_NOT_FOUND = 4,
+ CANNOT_BID_YOUR_AUCTION_ERROR = 10
+};
+
+enum AuctionAction
+{
+ AUCTION_SELL_ITEM = 0,
+ AUCTION_CANCEL = 1,
+ AUCTION_PLACE_BID = 2
+};
+
+struct AuctionEntry
+{
+ uint32 Id;
+ uint32 auctioneer; // creature low guid
+ uint32 item_guidlow;
+ uint32 item_template;
+ uint32 owner;
+ uint32 startbid; //maybe useless
+ uint32 bid;
+ uint32 buyout;
+ time_t expire_time;
+ uint32 bidder;
+ uint32 deposit; //deposit can be calculated only when creating auction
+ AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc
+
+ // helpers
+ uint32 GetHouseId() const { return auctionHouseEntry->houseId; }
+ uint32 GetHouseFaction() const { return auctionHouseEntry->faction; }
+ uint32 GetAuctionCut() const;
+ uint32 GetAuctionOutBid() const;
+ bool BuildAuctionInfo(WorldPacket & data) const;
+ void DeleteFromDB() const;
+ void SaveToDB() const;
+};
+
+//this class is used as auctionhouse instance
+class AuctionHouseObject
+{
+ public:
+ AuctionHouseObject() {}
+ ~AuctionHouseObject()
+ {
+ for (AuctionEntryMap::iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end(); ++itr)
+ delete itr->second;
+ }
+
+ typedef std::map<uint32, AuctionEntry*> AuctionEntryMap;
+
+ uint32 Getcount() { return AuctionsMap.size(); }
+
+ void AddAuction(AuctionEntry *ah)
+ {
+ ASSERT( ah );
+ AuctionsMap[ah->Id] = ah;
+ }
+
+ AuctionEntry* GetAuction(uint32 id) const
+ {
+ AuctionEntryMap::const_iterator itr = AuctionsMap.find( id );
+ return itr != AuctionsMap.end() ? itr->second : NULL;
+ }
+
+ bool RemoveAuction(uint32 id)
+ {
+ return AuctionsMap.erase(id) ? true : false;
+ }
+
+ // for AHBot
+ AuctionEntryMap::iterator GetAuctionsBegin() {return AuctionsMap.begin();}
+ AuctionEntryMap::iterator GetAuctionsEnd() {return AuctionsMap.end();}
+
+ void Update();
+
+ void BuildListBidderItems(WorldPacket& data, Player* player, uint32& count, uint32& totalcount);
+ void BuildListOwnerItems(WorldPacket& data, Player* player, uint32& count, uint32& totalcount);
+ void BuildListAuctionItems(WorldPacket& data, Player* player,
+ std::wstring const& searchedname, uint32 listfrom, uint32 levelmin, uint32 levelmax, uint32 usable,
+ uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality,
+ uint32& count, uint32& totalcount);
+
+ private:
+ AuctionEntryMap AuctionsMap;
+};
+
+class AuctionHouseMgr
+{
+ public:
+ AuctionHouseMgr();
+ ~AuctionHouseMgr();
+
+ typedef UNORDERED_MAP<uint32, Item*> ItemMap;
+
+ AuctionHouseObject* GetAuctionsMapByLocation( AuctionLocation location );
+ AuctionHouseObject* GetAuctionsMap( uint32 factionTemplateId );
+
+ Item* GetAItem(uint32 id)
+ {
+ ItemMap::const_iterator itr = mAitems.find(id);
+ if (itr != mAitems.end())
+ {
+ return itr->second;
+ }
+ return NULL;
+ }
+
+ //auction messages
+ void SendAuctionWonMail( AuctionEntry * auction );
+ void SendAuctionSalePendingMail( AuctionEntry * auction );
+ void SendAuctionSuccessfulMail( AuctionEntry * auction );
+ void SendAuctionExpiredMail( AuctionEntry * auction );
+ static uint32 GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 time, Item *pItem);
+ static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId);
+
+ public:
+ //load first auction items, because of check if item exists, when loading
+ void LoadAuctionItems();
+ void LoadAuctions();
+
+ void AddAItem(Item* it);
+ bool RemoveAItem(uint32 id);
+
+ void Update();
+
+ private:
+ AuctionHouseObject mHordeAuctions;
+ AuctionHouseObject mAllianceAuctions;
+ AuctionHouseObject mNeutralAuctions;
+
+ ItemMap mAitems;
+};
+
+#define auctionmgr MaNGOS::Singleton<AuctionHouseMgr>::Instance()
+
+#endif
diff --git a/src/game/Bag.cpp b/src/game/Bag.cpp
index 331b12acde5..c3b83a39e2b 100644
--- a/src/game/Bag.cpp
+++ b/src/game/Bag.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -34,7 +34,7 @@ Bag::Bag( ): Item()
m_valuesCount = CONTAINER_END;
- memset(m_bagslot, 0, sizeof(Item *) * MAX_BAG_SIZE); // Maximum 20 Slots
+ memset(m_bagslot, 0, sizeof(Item *) * MAX_BAG_SIZE);
}
Bag::~Bag()
diff --git a/src/game/Bag.h b/src/game/Bag.h
index d930809cf4a..1c341b5611d 100644
--- a/src/game/Bag.h
+++ b/src/game/Bag.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -24,10 +24,7 @@
// Maximum 36 Slots ( (CONTAINER_END - CONTAINER_FIELD_SLOT_1)/2
#define MAX_BAG_SIZE 36 // 2.0.12
-#include "Object.h"
#include "ItemPrototype.h"
-#include "Unit.h"
-#include "Creature.h"
#include "Item.h"
class Bag : public Item
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index ccaab6cf6bc..bdb78552102 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -21,6 +21,7 @@
#include "Object.h"
#include "Player.h"
#include "BattleGround.h"
+#include "BattleGroundMgr.h"
#include "Creature.h"
#include "MapManager.h"
#include "Language.h"
@@ -28,16 +29,19 @@
#include "SpellAuras.h"
#include "ArenaTeam.h"
#include "World.h"
+#include "Group.h"
+#include "ObjectMgr.h"
+#include "WorldPacket.h"
#include "Util.h"
BattleGround::BattleGround()
{
- m_TypeID = 0;
+ m_TypeID = BattleGroundTypeId(0);
m_InstanceID = 0;
m_Status = 0;
m_EndTime = 0;
m_LastResurrectTime = 0;
- m_Queue_type = MAX_BATTLEGROUND_QUEUES;
+ m_QueueId = MAX_BATTLEGROUND_QUEUES;
m_InvitedAlliance = 0;
m_InvitedHorde = 0;
m_ArenaType = 0;
@@ -105,12 +109,16 @@ BattleGround::~BattleGround()
DelObject(i);
}
- // delete creature and go respawn times
- WorldDatabase.PExecute("DELETE FROM creature_respawn WHERE instance = '%u'",GetInstanceID());
- WorldDatabase.PExecute("DELETE FROM gameobject_respawn WHERE instance = '%u'",GetInstanceID());
- // delete instance from db
- CharacterDatabase.PExecute("DELETE FROM instance WHERE id = '%u'",GetInstanceID());
- // remove from battlegrounds
+ if(GetInstanceID()) // not spam by useless queries in case BG templates
+ {
+ // delete creature and go respawn times
+ WorldDatabase.PExecute("DELETE FROM creature_respawn WHERE instance = '%u'",GetInstanceID());
+ WorldDatabase.PExecute("DELETE FROM gameobject_respawn WHERE instance = '%u'",GetInstanceID());
+ // delete instance from db
+ CharacterDatabase.PExecute("DELETE FROM instance WHERE id = '%u'",GetInstanceID());
+ // remove from battlegrounds
+ }
+
sBattleGroundMgr.RemoveBattleGround(GetInstanceID());
// unload map
if(Map * map = MapManager::Instance().FindMap(GetMapId(), GetInstanceID()))
@@ -120,7 +128,7 @@ BattleGround::~BattleGround()
this->RemoveFromBGFreeSlotQueue();
}
-void BattleGround::Update(time_t diff)
+void BattleGround::Update(uint32 diff)
{
if(!GetPlayersSize() && !GetRemovedPlayersSize() && !GetReviveQueueSize())
//BG is empty
@@ -161,8 +169,6 @@ void BattleGround::Update(time_t diff)
m_RemovedPlayers.clear();
}
- // this code isn't efficient and its idea isn't implemented yet
- /* offline players are removed from battleground in worldsession::LogoutPlayer()
// remove offline players from bg after ~5 minutes
if(GetPlayersSize())
{
@@ -177,8 +183,9 @@ void BattleGround::Update(time_t diff)
if(itr->second.LastOnlineTime >= MAX_OFFLINE_TIME) // 5 minutes
m_RemovedPlayers[itr->first] = 1; // add to remove list (BG)
}
- }*/
+ }
+ //this should be handled by spell system:
m_LastResurrectTime += diff;
if (m_LastResurrectTime >= RESURRECTION_INTERVAL)
{
@@ -306,7 +313,7 @@ void BattleGround::SendPacketToTeam(uint32 TeamID, WorldPacket *packet, Player *
if(!self && sender == plr)
continue;
- uint32 team = itr->second.Team;//GetPlayerTeam(plr->GetGUID());
+ uint32 team = itr->second.Team;
if(!team) team = plr->GetTeam();
if(team == TeamID)
@@ -335,7 +342,7 @@ void BattleGround::PlaySoundToTeam(uint32 SoundID, uint32 TeamID)
continue;
}
- uint32 team = itr->second.Team;//GetPlayerTeam(plr->GetGUID());
+ uint32 team = itr->second.Team;
if(!team) team = plr->GetTeam();
if(team == TeamID)
@@ -358,7 +365,7 @@ void BattleGround::CastSpellOnTeam(uint32 SpellID, uint32 TeamID)
continue;
}
- uint32 team = itr->second.Team;//GetPlayerTeam(plr->GetGUID());
+ uint32 team = itr->second.Team;
if(!team) team = plr->GetTeam();
if(team == TeamID)
@@ -395,7 +402,7 @@ void BattleGround::RewardHonorToTeam(uint32 Honor, uint32 TeamID)
continue;
}
- uint32 team = itr->second.Team;//GetPlayerTeam(plr->GetGUID());
+ uint32 team = itr->second.Team;
if(!team) team = plr->GetTeam();
if(team == TeamID)
@@ -420,7 +427,7 @@ void BattleGround::RewardReputationToTeam(uint32 faction_id, uint32 Reputation,
continue;
}
- uint32 team = itr->second.Team;//GetPlayerTeam(plr->GetGUID());
+ uint32 team = itr->second.Team;
if(!team) team = plr->GetTeam();
if(team == TeamID)
@@ -573,9 +580,10 @@ void BattleGround::EndBattleGround(uint32 winner)
sBattleGroundMgr.BuildPvpLogDataPacket(&data, this);
plr->GetSession()->SendPacket(&data);
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetTeam(), plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime());
plr->GetSession()->SendPacket(&data);
+ plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
}
if(isArena() && isRated() && winner_arena_team && loser_arena_team)
@@ -593,7 +601,7 @@ void BattleGround::EndBattleGround(uint32 winner)
}
// inform invited players about the removal
- sBattleGroundMgr.m_BattleGroundQueues[sBattleGroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType())].BGEndedRemoveInvites(this);
+ sBattleGroundMgr.m_BattleGroundQueues[BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType())].BGEndedRemoveInvites(this);
if(Source)
{
@@ -788,8 +796,8 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
{
if(!team) team = plr->GetTeam();
- uint32 bgTypeId = GetTypeID();
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
+ BattleGroundTypeId bgTypeId = GetTypeID();
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
// if arena, remove the specific arena auras
if(isArena())
{
@@ -840,8 +848,8 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
DecreaseInvitedCount(team);
//we should update battleground queue, but only if bg isn't ending
- if (GetQueueType() < MAX_BATTLEGROUND_QUEUES)
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, GetQueueType());
+ if (GetQueueId() < MAX_BATTLEGROUND_QUEUES)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, GetQueueId());
Group * group = plr->GetGroup();
// remove from raid group if exist
@@ -865,9 +873,7 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
plr->SetBGTeam(0);
if(Transport)
- {
- plr->TeleportTo(plr->GetBattleGroundEntryPointMap(), plr->GetBattleGroundEntryPointX(), plr->GetBattleGroundEntryPointY(), plr->GetBattleGroundEntryPointZ(), plr->GetBattleGroundEntryPointO());
- }
+ plr->TeleportTo(plr->GetBattleGroundEntryPoint());
// Log
sLog.outDetail("BATTLEGROUND: Removed player %s from BattleGround.", plr->GetName());
@@ -889,7 +895,7 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
// this method is called when no players remains in battleground
void BattleGround::Reset()
{
- SetQueueType(MAX_BATTLEGROUND_QUEUES);
+ SetQueueId(MAX_BATTLEGROUND_QUEUES);
SetWinner(WINNER_NONE);
SetStatus(STATUS_WAIT_QUEUE);
SetStartTime(0);
@@ -909,9 +915,6 @@ void BattleGround::Reset()
m_Players.clear();
m_PlayerScores.clear();
-
- // reset BGSubclass
- ResetBGSubclass();
}
void BattleGround::StartBattleGround()
@@ -975,7 +978,7 @@ void BattleGround::AddPlayer(Player *plr)
}
(plr)->RemovePet(NULL,PET_SAVE_NOT_IN_SLOT);
}
- else
+ else
(plr)->SetTemporaryUnsummonedPetNumber(0);
if(GetStatus() == STATUS_WAIT_JOIN) // not started yet
@@ -992,10 +995,37 @@ void BattleGround::AddPlayer(Player *plr)
plr->CastSpell(plr, SPELL_PREPARATION, true); // reduces all mana cost of spells.
}
+ // setup BG group membership
+ PlayerRelogin(plr);
+ AddOrSetPlayerToCorrectBgGroup(plr, guid, team);
+
// Log
sLog.outDetail("BATTLEGROUND: Player %s joined the battle.", plr->GetName());
}
+/* this method adds player to his team's bg group, or sets his correct group if player is already in bg group */
+void BattleGround::AddOrSetPlayerToCorrectBgGroup(Player *plr, uint64 plr_guid, uint32 team)
+{
+ Group* group = GetBgRaid(team);
+ if(!group) // first player joined
+ {
+ group = new Group;
+ SetBgRaid(team, group);
+ group->Create(plr_guid, plr->GetName());
+ }
+ else // raid already exist
+ {
+ if(group->IsMember(plr_guid))
+ {
+ uint8 subgroup = group->GetMemberGroup(plr_guid);
+ plr->SetGroup(group, subgroup);
+ }
+ else
+ GetBgRaid(team)->AddMember(plr_guid, plr->GetName());
+ }
+}
+
+
/* This method should be called only once ... it adds pointer to queue */
void BattleGround::AddToBGFreeSlotQueue()
{
@@ -1178,7 +1208,8 @@ bool BattleGround::AddObject(uint32 type, uint32 entry, float x, float y, float
// and when loading it (in go::LoadFromDB()), a new guid would be assigned to the object, and a new object would be created
// so we must create it specific for this instance
GameObject * go = new GameObject;
- if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),entry, map,x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,1))
+ if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),entry, map,
+ PHASEMASK_NORMAL, x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,1))
{
sLog.outErrorDb("Gameobject template %u not found in database! BattleGround not created!", entry);
sLog.outError("Cannot create gameobject template %u! BattleGround not created!", entry);
@@ -1301,7 +1332,7 @@ Creature* BattleGround::AddCreature(uint32 entry, uint32 type, uint32 teamval, f
return NULL;
Creature* pCreature = new Creature;
- if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, entry, teamval))
+ if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, PHASEMASK_NORMAL, entry, teamval))
{
sLog.outError("Can't create creature entry: %u",entry);
delete pCreature;
@@ -1357,6 +1388,9 @@ void BattleGround::SpawnBGCreature(uint32 type, uint32 respawntime)
*/
bool BattleGround::DelCreature(uint32 type)
{
+ if(!m_BgCreatures[type])
+ return true;
+
Creature *cr = HashMapHolder<Creature>::Find(m_BgCreatures[type]);
if(!cr)
{
@@ -1372,6 +1406,9 @@ bool BattleGround::DelCreature(uint32 type)
bool BattleGround::DelObject(uint32 type)
{
+ if(!m_BgObjects[type])
+ return true;
+
GameObject *obj = HashMapHolder<GameObject>::Find(m_BgObjects[type]);
if(!obj)
{
@@ -1405,10 +1442,12 @@ bool BattleGround::AddSpiritGuide(uint32 type, float x, float y, float z, float
pCreature->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, pCreature->GetGUID());
// aura
- pCreature->SetUInt32Value(UNIT_FIELD_AURA, SPELL_SPIRIT_HEAL_CHANNEL);
- pCreature->SetUInt32Value(UNIT_FIELD_AURAFLAGS, 0x00000009);
- pCreature->SetUInt32Value(UNIT_FIELD_AURALEVELS, 0x0000003C);
- pCreature->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS, 0x000000FF);
+ //TODO: Fix display here
+ //pCreature->SetVisibleAura(0, SPELL_SPIRIT_HEAL_CHANNEL);
+
+ //pCreature->SetUInt32Value(UNIT_FIELD_AURAFLAGS, 0x00000009);
+ //pCreature->SetUInt32Value(UNIT_FIELD_AURALEVELS, 0x0000003C);
+ //pCreature->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS, 0x000000FF);
// casting visual effect
pCreature->SetUInt32Value(UNIT_CHANNEL_SPELL, SPELL_SPIRIT_HEAL_CHANNEL);
// correct cast speed
@@ -1440,7 +1479,7 @@ void BattleGround::EndNow()
SetStatus(STATUS_WAIT_LEAVE);
SetEndTime(TIME_TO_AUTOREMOVE);
// inform invited players about the removal
- sBattleGroundMgr.m_BattleGroundQueues[sBattleGroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType())].BGEndedRemoveInvites(this);
+ sBattleGroundMgr.m_BattleGroundQueues[BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType())].BGEndedRemoveInvites(this);
}
// Battleground messages are localized using the dbc lang, they are not client language dependent
@@ -1529,6 +1568,31 @@ uint32 BattleGround::GetPlayerTeam(uint64 guid)
return 0;
}
+bool BattleGround::IsPlayerInBattleGround(uint64 guid)
+{
+ std::map<uint64, BattleGroundPlayer>::const_iterator itr = m_Players.find(guid);
+ if(itr!=m_Players.end())
+ return true;
+ return false;
+}
+
+void BattleGround::PlayerRelogin(Player* plr)
+{
+ if(GetStatus() != STATUS_WAIT_LEAVE)
+ return;
+
+ WorldPacket data;
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
+
+ BlockMovement(plr);
+
+ sBattleGroundMgr.BuildPvpLogDataPacket(&data, this);
+ plr->GetSession()->SendPacket(&data);
+
+ sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetTeam(), plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime());
+ plr->GetSession()->SendPacket(&data);
+}
+
uint32 BattleGround::GetAlivePlayersCountByTeam(uint32 Team) const
{
int count = 0;
@@ -1565,3 +1629,10 @@ void BattleGround::HandleKillUnit(Creature *creature, Player *killer)
{
}
+void BattleGround::SetBgRaid( uint32 TeamID, Group *bg_raid )
+{
+ Group* &old_raid = TeamID == ALLIANCE ? m_BgRaids[BG_TEAM_ALLIANCE] : m_BgRaids[BG_TEAM_HORDE];
+ if(old_raid) old_raid->SetBattlegroundGroup(NULL);
+ if(bg_raid) bg_raid->SetBattlegroundGroup(this);
+ old_raid = bg_raid;
+}
diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h
index b28ce709ada..fd93746ebfc 100644
--- a/src/game/BattleGround.h
+++ b/src/game/BattleGround.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -22,13 +22,16 @@
#define __BATTLEGROUND_H
#include "Common.h"
-#include "WorldPacket.h"
-#include "WorldSession.h"
-#include "Opcodes.h"
-#include "ObjectMgr.h"
-#include "BattleGroundMgr.h"
#include "SharedDefines.h"
+class Creature;
+class GameObject;
+class Group;
+class Player;
+class WorldPacket;
+
+struct WorldSafeLocsEntry;
+
enum BattleGroundSounds
{
SOUND_HORDE_WINS = 8454,
@@ -132,30 +135,18 @@ struct BattleGroundObjectInfo
uint32 spellid;
};
-#define MAX_QUEUED_PLAYERS_MAP 7
-
-enum BattleGroundTypeId
-{
- BATTLEGROUND_AV = 1,
- BATTLEGROUND_WS = 2,
- BATTLEGROUND_AB = 3,
- BATTLEGROUND_NA = 4,
- BATTLEGROUND_BE = 5,
- BATTLEGROUND_AA = 6,
- BATTLEGROUND_EY = 7,
- BATTLEGROUND_RL = 8
-};
-
// handle the queue types and bg types separately to enable joining queue for different sized arenas at the same time
enum BattleGroundQueueTypeId
{
+ BATTLEGROUND_QUEUE_NONE = 0,
BATTLEGROUND_QUEUE_AV = 1,
BATTLEGROUND_QUEUE_WS = 2,
BATTLEGROUND_QUEUE_AB = 3,
BATTLEGROUND_QUEUE_EY = 4,
- BATTLEGROUND_QUEUE_2v2 = 5,
- BATTLEGROUND_QUEUE_3v3 = 6,
- BATTLEGROUND_QUEUE_5v5 = 7,
+ BATTLEGROUND_QUEUE_SA = 5,
+ BATTLEGROUND_QUEUE_2v2 = 6,
+ BATTLEGROUND_QUEUE_3v3 = 7,
+ BATTLEGROUND_QUEUE_5v5 = 8,
};
enum ScoreType
@@ -227,10 +218,11 @@ enum BattleGroundJoinError
class BattleGroundScore
{
public:
- BattleGroundScore() : KillingBlows(0), HonorableKills(0), Deaths(0), DamageDone(0), HealingDone(0), BonusHonor(0) {};
- virtual ~BattleGroundScore() //virtual destructor is used when deleting score from scores map
- {
- };
+ BattleGroundScore() : KillingBlows(0), Deaths(0), HonorableKills(0),
+ BonusHonor(0), DamageDone(0), HealingDone(0)
+ {}
+ virtual ~BattleGroundScore() {} //virtual destructor is used when deleting score from scores map
+
uint32 KillingBlows;
uint32 Deaths;
uint32 HonorableKills;
@@ -262,21 +254,18 @@ class BattleGround
BattleGround();
/*BattleGround(const BattleGround& bg);*/
virtual ~BattleGround();
- virtual void Update(time_t diff); // must be implemented in BG subclass of BG specific update code, but must in begginning call parent version
+ virtual void Update(uint32 diff); // must be implemented in BG subclass of BG specific update code, but must in begginning call parent version
virtual bool SetupBattleGround() // must be implemented in BG subclass
{
return true;
}
- void Reset(); // resets all common properties for battlegrounds
- virtual void ResetBGSubclass() // must be implemented in BG subclass
- {
- }
+ virtual void Reset(); // resets all common properties for battlegrounds, must be implemented and called in BG subclass
/* Battleground */
// Get methods:
char const* GetName() const { return m_Name; }
- uint32 GetTypeID() const { return m_TypeID; }
- uint32 GetQueueType() const { return m_Queue_type; }
+ BattleGroundTypeId GetTypeID() const { return m_TypeID; }
+ uint32 GetQueueId() const { return m_QueueId; }
uint32 GetInstanceID() const { return m_InstanceID; }
uint32 GetStatus() const { return m_Status; }
uint32 GetStartTime() const { return m_StartTime; }
@@ -298,8 +287,8 @@ class BattleGround
// Set methods:
void SetName(char const* Name) { m_Name = Name; }
- void SetTypeID(uint32 TypeID) { m_TypeID = TypeID; }
- void SetQueueType(uint32 ID) { m_Queue_type = ID; }
+ void SetTypeID(BattleGroundTypeId TypeID) { m_TypeID = TypeID; }
+ void SetQueueId(uint32 ID) { m_QueueId = ID; }
void SetInstanceID(uint32 InstanceID) { m_InstanceID = InstanceID; }
void SetStatus(uint32 Status) { m_Status = Status; }
void SetStartTime(uint32 Time) { m_StartTime = Time; }
@@ -395,13 +384,7 @@ class BattleGround
/* Raid Group */
Group *GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[BG_TEAM_ALLIANCE] : m_BgRaids[BG_TEAM_HORDE]; }
- void SetBgRaid(uint32 TeamID, Group *bg_raid)
- {
- Group* &old_raid = TeamID == ALLIANCE ? m_BgRaids[BG_TEAM_ALLIANCE] : m_BgRaids[BG_TEAM_HORDE];
- if(old_raid) old_raid->SetBattlegroundGroup(NULL);
- if(bg_raid) bg_raid->SetBattlegroundGroup(this);
- old_raid = bg_raid;
- }
+ void SetBgRaid(uint32 TeamID, Group *bg_raid);
virtual void UpdatePlayerScore(Player *Source, uint32 type, uint32 value);
@@ -440,6 +423,8 @@ class BattleGround
virtual void AddPlayer(Player *plr); // must be implemented in BG subclass
+ void AddOrSetPlayerToCorrectBgGroup(Player *plr, uint64 plr_guid, uint32 team);
+
virtual void RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPacket);
// can be extended in in BG subclass
@@ -464,10 +449,12 @@ class BattleGround
void DoorClose(uint32 type);
const char *GetTrinityString(int32 entry);
- virtual bool HandlePlayerUnderMap(Player * plr) {return false;}
+ virtual bool HandlePlayerUnderMap(Player * /*plr*/) { return false; }
// since arenas can be AvA or Hvh, we have to get the "temporary" team of a player
uint32 GetPlayerTeam(uint64 guid);
+ bool IsPlayerInBattleGround(uint64 guid);
+ void PlayerRelogin(Player* plr);
void SetDeleteThis() {m_SetDeleteThis = true;}
@@ -496,13 +483,13 @@ class BattleGround
BGHonorMode m_HonorMode;
private:
/* Battleground */
- uint32 m_TypeID; //Battleground type, defined in enum BattleGroundTypeId
+ BattleGroundTypeId m_TypeID;
uint32 m_InstanceID; //BattleGround Instance's GUID!
uint32 m_Status;
uint32 m_StartTime;
uint32 m_EndTime;
uint32 m_LastResurrectTime;
- uint32 m_Queue_type;
+ uint32 m_QueueId;
uint8 m_ArenaType; // 2=2v2, 3=3v3, 5=5v5
bool m_InBGFreeSlotQueue; // used to make sure that BG is only once inserted into the BattleGroundMgr.BGFreeSlotQueue[bgTypeId] deque
bool m_SetDeleteThis; // used for safe deletion of the bg after end / all players leave
diff --git a/src/game/BattleGroundAA.cpp b/src/game/BattleGroundAA.cpp
index ad9720ad5fe..ca52e4ddaf2 100644
--- a/src/game/BattleGroundAA.cpp
+++ b/src/game/BattleGroundAA.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -32,7 +32,7 @@ BattleGroundAA::~BattleGroundAA()
}
-void BattleGroundAA::Update(time_t diff)
+void BattleGroundAA::Update(uint32 diff)
{
BattleGround::Update(diff);
}
diff --git a/src/game/BattleGroundAA.h b/src/game/BattleGroundAA.h
index 8a07831eb38..4f073b21da4 100644
--- a/src/game/BattleGroundAA.h
+++ b/src/game/BattleGroundAA.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -37,7 +37,7 @@ class BattleGroundAA : public BattleGround
public:
BattleGroundAA();
~BattleGroundAA();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
diff --git a/src/game/BattleGroundAB.cpp b/src/game/BattleGroundAB.cpp
index 501ac8eef33..7aecb33af8e 100644
--- a/src/game/BattleGroundAB.cpp
+++ b/src/game/BattleGroundAB.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -29,6 +29,7 @@
#include "Language.h"
#include "World.h"
#include "Util.h"
+#include "WorldPacket.h"
// these variables aren't used outside of this file, so declare them only here
uint32 BG_AB_HonorScoreTicks[BG_HONOR_MODE_NUM] = {
@@ -52,7 +53,7 @@ BattleGroundAB::~BattleGroundAB()
{
}
-void BattleGroundAB::Update(time_t diff)
+void BattleGroundAB::Update(uint32 diff)
{
BattleGround::Update(diff);
@@ -425,9 +426,9 @@ void BattleGroundAB::_NodeDeOccupied(uint8 node)
{
WorldSafeLocsEntry const *ClosestGrave = NULL;
Player *plr;
- for (std::vector<uint64>::iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr)
+ for (std::vector<uint64>::const_iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr)
{
- plr = objmgr.GetPlayer(*ghost_list.begin());
+ plr = objmgr.GetPlayer(*itr);
if( !plr )
continue;
if( !ClosestGrave )
@@ -591,8 +592,11 @@ bool BattleGroundAB::SetupBattleGround()
return true;
}
-void BattleGroundAB::ResetBGSubclass()
+void BattleGroundAB::Reset()
{
+ //call parent's class reset
+ BattleGround::Reset();
+
m_TeamScores[BG_TEAM_ALLIANCE] = 0;
m_TeamScores[BG_TEAM_HORDE] = 0;
m_lastTick[BG_TEAM_ALLIANCE] = 0;
diff --git a/src/game/BattleGroundAB.h b/src/game/BattleGroundAB.h
index 3fcea59c8e8..5f05d182bee 100644
--- a/src/game/BattleGroundAB.h
+++ b/src/game/BattleGroundAB.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -238,12 +238,12 @@ class BattleGroundAB : public BattleGround
BattleGroundAB();
~BattleGroundAB();
- void Update(time_t diff);
+ void Update(uint32 diff);
void AddPlayer(Player *plr);
void RemovePlayer(Player *plr,uint64 guid);
void HandleAreaTrigger(Player *Source, uint32 Trigger);
virtual bool SetupBattleGround();
- virtual void ResetBGSubclass();
+ virtual void Reset();
virtual WorldSafeLocsEntry const* GetClosestGraveYard(float x, float y, float z, uint32 team);
/* Scorekeeping */
diff --git a/src/game/BattleGroundAV.cpp b/src/game/BattleGroundAV.cpp
index 9eced355ba3..972c24a8f4d 100644
--- a/src/game/BattleGroundAV.cpp
+++ b/src/game/BattleGroundAV.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -30,6 +30,7 @@
#include "Language.h"
#include "SpellAuras.h"
#include "Formulas.h"
+#include "WorldPacket.h"
BattleGroundAV::BattleGroundAV()
{
@@ -294,7 +295,7 @@ Creature* BattleGroundAV::AddAVCreature(uint16 cinfoid, uint16 type )
return creature;
}
-void BattleGroundAV::Update(time_t diff)
+void BattleGroundAV::Update(uint32 diff)
{
BattleGround::Update(diff);
if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize())
diff --git a/src/game/BattleGroundAV.h b/src/game/BattleGroundAV.h
index 310635b995f..ef6731b5e73 100644
--- a/src/game/BattleGroundAV.h
+++ b/src/game/BattleGroundAV.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -1500,7 +1500,7 @@ class BattleGroundAV : public BattleGround
public:
BattleGroundAV();
~BattleGroundAV();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
diff --git a/src/game/BattleGroundBE.cpp b/src/game/BattleGroundBE.cpp
index a010bb166ac..c23fae887a1 100644
--- a/src/game/BattleGroundBE.cpp
+++ b/src/game/BattleGroundBE.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -25,6 +25,7 @@
#include "Creature.h"
#include "ObjectMgr.h"
#include "MapManager.h"
+#include "WorldPacket.h"
#include "Language.h"
BattleGroundBE::BattleGroundBE()
@@ -37,7 +38,7 @@ BattleGroundBE::~BattleGroundBE()
}
-void BattleGroundBE::Update(time_t diff)
+void BattleGroundBE::Update(uint32 diff)
{
BattleGround::Update(diff);
@@ -201,9 +202,10 @@ void BattleGroundBE::FillInitialWorldStates(WorldPacket &data)
data << uint32(0x9f3) << uint32(1); // 9
}
-void BattleGroundBE::ResetBGSubclass()
+void BattleGroundBE::Reset()
{
-
+ //call parent's class reset
+ BattleGround::Reset();
}
bool BattleGroundBE::SetupBattleGround()
diff --git a/src/game/BattleGroundBE.h b/src/game/BattleGroundBE.h
index 00f826f8207..b8922e8f983 100644
--- a/src/game/BattleGroundBE.h
+++ b/src/game/BattleGroundBE.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -57,7 +57,7 @@ class BattleGroundBE : public BattleGround
public:
BattleGroundBE();
~BattleGroundBE();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
@@ -65,7 +65,7 @@ class BattleGroundBE : public BattleGround
void RemovePlayer(Player *plr, uint64 guid);
void HandleAreaTrigger(Player *Source, uint32 Trigger);
bool SetupBattleGround();
- void ResetBGSubclass();
+ virtual void Reset();
virtual void FillInitialWorldStates(WorldPacket &d);
void HandleKillPlayer(Player* player, Player *killer);
bool HandlePlayerUnderMap(Player * plr);
diff --git a/src/game/BattleGroundDS.cpp b/src/game/BattleGroundDS.cpp
new file mode 100644
index 00000000000..825a52967b6
--- /dev/null
+++ b/src/game/BattleGroundDS.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Player.h"
+#include "BattleGround.h"
+#include "BattleGroundDS.h"
+
+BattleGroundDS::BattleGroundDS()
+{
+
+}
+
+BattleGroundDS::~BattleGroundDS()
+{
+
+}
+
+void BattleGroundDS::Update(uint32 diff)
+{
+ BattleGround::Update(diff);
+}
+
+void BattleGroundDS::AddPlayer(Player *plr)
+{
+ BattleGround::AddPlayer(plr);
+ //create score and add it to map, default values are set in constructor
+ BattleGroundDSScore* sc = new BattleGroundDSScore;
+
+ m_PlayerScores[plr->GetGUID()] = sc;
+}
+
+void BattleGroundDS::RemovePlayer(Player * /*plr*/, uint64 /*guid*/)
+{
+}
+
+void BattleGroundDS::HandleKillPlayer(Player* player, Player* killer)
+{
+ BattleGround::HandleKillPlayer(player, killer);
+}
+
+void BattleGroundDS::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/)
+{
+}
+
+bool BattleGroundDS::SetupBattleGround()
+{
+ return true;
+}
diff --git a/src/game/BattleGroundDS.h b/src/game/BattleGroundDS.h
new file mode 100644
index 00000000000..7f9de8ca7de
--- /dev/null
+++ b/src/game/BattleGroundDS.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef __BATTLEGROUNDDS_H
+#define __BATTLEGROUNDDS_H
+
+class BattleGround;
+
+class BattleGroundDSScore : public BattleGroundScore
+{
+ public:
+ BattleGroundDSScore() {};
+ virtual ~BattleGroundDSScore() {};
+ //TODO fix me
+};
+
+class BattleGroundDS : public BattleGround
+{
+ friend class BattleGroundMgr;
+
+ public:
+ BattleGroundDS();
+ ~BattleGroundDS();
+ void Update(uint32 diff);
+
+ /* inherited from BattlegroundClass */
+ virtual void AddPlayer(Player *plr);
+ void RemovePlayer(Player *plr, uint64 guid);
+ void HandleAreaTrigger(Player *Source, uint32 Trigger);
+ bool SetupBattleGround();
+ void HandleKillPlayer(Player* player, Player *killer);
+};
+#endif
diff --git a/src/game/BattleGroundEY.cpp b/src/game/BattleGroundEY.cpp
index e9eba524349..40d55ea6f18 100644
--- a/src/game/BattleGroundEY.cpp
+++ b/src/game/BattleGroundEY.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -27,7 +27,8 @@
#include "ObjectMgr.h"
#include "MapManager.h"
#include "Language.h"
-#include "World.h"
+#include "World.h" //music
+#include "WorldPacket.h"
#include "Util.h"
// these variables aren't used outside of this file, so declare them only here
@@ -51,7 +52,7 @@ BattleGroundEY::~BattleGroundEY()
{
}
-void BattleGroundEY::Update(time_t diff)
+void BattleGroundEY::Update(uint32 diff)
{
BattleGround::Update(diff);
// after bg start we get there (once)
@@ -523,8 +524,11 @@ bool BattleGroundEY::SetupBattleGround()
return true;
}
-void BattleGroundEY::ResetBGSubclass()
+void BattleGroundEY::Reset()
{
+ //call parent's class reset
+ BattleGround::Reset();
+
m_TeamScores[BG_TEAM_ALLIANCE] = 0;
m_TeamScores[BG_TEAM_HORDE] = 0;
m_TeamPointsCount[BG_TEAM_ALLIANCE] = 0;
diff --git a/src/game/BattleGroundEY.h b/src/game/BattleGroundEY.h
index 30ff2b3e584..52106461e5a 100644
--- a/src/game/BattleGroundEY.h
+++ b/src/game/BattleGroundEY.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -300,7 +300,7 @@ class BattleGroundEY : public BattleGround
public:
BattleGroundEY();
~BattleGroundEY();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
@@ -319,7 +319,7 @@ class BattleGroundEY : public BattleGround
void HandleKillPlayer(Player *player, Player *killer);
virtual WorldSafeLocsEntry const* GetClosestGraveYard(float x, float y, float z, uint32 team);
virtual bool SetupBattleGround();
- virtual void ResetBGSubclass();
+ virtual void Reset();
void UpdateTeamScore(uint32 Team);
void UpdatePlayerScore(Player *Source, uint32 type, uint32 value);
virtual void FillInitialWorldStates(WorldPacket& data);
diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp
index b1522c939f7..7d5a2f503bf 100644
--- a/src/game/BattleGroundHandler.cpp
+++ b/src/game/BattleGroundHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -53,7 +53,7 @@ void WorldSession::HandleBattleGroundHelloOpcode( WorldPacket & recv_data )
// Stop the npc if moving
unit->StopMoving();
- uint32 bgTypeId = objmgr.GetBattleMasterBG(unit->GetEntry());
+ BattleGroundTypeId bgTypeId = sBattleGroundMgr.GetBattleMasterBG(unit->GetEntry());
if(!_player->GetBGAccessByLevel(bgTypeId))
{
@@ -65,7 +65,7 @@ void WorldSession::HandleBattleGroundHelloOpcode( WorldPacket & recv_data )
SendBattlegGroundList(guid, bgTypeId);
}
-void WorldSession::SendBattlegGroundList( uint64 guid, uint32 bgTypeId )
+void WorldSession::SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId )
{
WorldPacket data;
sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId);
@@ -77,26 +77,28 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )
CHECK_PACKET_SIZE(recv_data, 8+4+4+1);
uint64 guid;
- uint32 bgTypeId;
+ uint32 bgTypeId_;
uint32 instanceId;
uint8 joinAsGroup;
Group * grp;
recv_data >> guid; // battlemaster guid
- recv_data >> bgTypeId; // battleground type id (DBC id)
+ recv_data >> bgTypeId_; // battleground type id (DBC id)
recv_data >> instanceId; // instance id, 0 if First Available selected
recv_data >> joinAsGroup; // join as group
- if(bgTypeId >= MAX_BATTLEGROUND_TYPES)
+ if(!sBattlemasterListStore.LookupEntry(bgTypeId_))
{
- sLog.outError("Battleground: invalid bgtype received. possible cheater? player guid %u",_player->GetGUIDLow());
+ sLog.outError("Battleground: invalid bgtype (%u) received. possible cheater? player guid %u",bgTypeId_,_player->GetGUIDLow());
return;
}
+ BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_);
+
sLog.outDebug( "WORLD: Recvd CMSG_BATTLEMASTER_JOIN Message from: " I64FMT, guid);
// can do this, since it's battleground, not arena
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId, 0);
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, 0);
// ignore if player is already in BG
if(_player->InBattleGround())
@@ -179,7 +181,9 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
}
sLog.outDebug("Battleground: group end");
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId));
+ if(!ginfo->IsInvitedToBGInstanceGUID)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
}
else
{
@@ -195,7 +199,9 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )
GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, 0);
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId));
+ if(!ginfo->IsInvitedToBGInstanceGUID)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
}
}
@@ -270,19 +276,15 @@ void WorldSession::HandleBattleGroundListOpcode( WorldPacket &recv_data )
uint32 bgTypeId;
recv_data >> bgTypeId; // id from DBC
- if(bgTypeId >= MAX_BATTLEGROUND_TYPES)
+ BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
+ if(!bl)
{
sLog.outError("Battleground: invalid bgtype received.");
return;
}
- BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
-
- if(!bl)
- return;
-
WorldPacket data;
- sBattleGroundMgr.BuildBattleGroundListPacket(&data, _player->GetGUID(), _player, bgTypeId);
+ sBattleGroundMgr.BuildBattleGroundListPacket(&data, _player->GetGUID(), _player, BattleGroundTypeId(bgTypeId));
SendPacket( &data );
}
@@ -295,15 +297,15 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
uint8 type; // arenatype if arena
uint8 unk2; // unk, can be 0x0 (may be if was invited?) and 0x1
uint32 instanceId;
- uint32 bgTypeId; // type id from dbc
+ uint32 bgTypeId_; // type id from dbc
uint16 unk; // 0x1F90 constant?
uint8 action; // enter battle 0x1, leave queue 0x0
- recv_data >> type >> unk2 >> bgTypeId >> unk >> action;
+ recv_data >> type >> unk2 >> bgTypeId_ >> unk >> action;
- if(bgTypeId >= MAX_BATTLEGROUND_TYPES)
+ if(!sBattlemasterListStore.LookupEntry(bgTypeId_))
{
- sLog.outError("Battleground: invalid bgtype received.");
+ sLog.outError("Battleground: invalid bgtype (%u) received.",bgTypeId_);
// update battleground slots for the player to fix his UI and sent data.
// this is a HACK, I don't know why the client starts sending invalid packets in the first place.
// it usually happens with extremely high latency (if debugging / stepping in the code for example)
@@ -312,12 +314,15 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
// update all queues, send invitation info if player is invited, queue info if queued
for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
{
- uint32 queue_id = _player->GetBattleGroundQueueId(i);
- if(!queue_id)
+ BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i);
+ if(!bgQueueTypeId)
continue;
- BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID());
- // if the player is not in queue, contine
- if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end())
+ BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
+ uint32 queue_id = _player->GetBattleGroundQueueIdFromLevel(bgTypeId);
+ BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[queue_id];
+ BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
+ // if the player is not in queue, continue
+ if(itrPlayerStatus == qpMap.end())
continue;
// no group information, this should never happen
@@ -327,7 +332,6 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
BattleGround * bg = NULL;
// get possibly needed data from groupinfo
- bgTypeId = itrPlayerStatus->second.GroupInfo->BgTypeId;
uint8 arenatype = itrPlayerStatus->second.GroupInfo->ArenaType;
uint8 israted = itrPlayerStatus->second.GroupInfo->IsRated;
uint8 status = 0;
@@ -363,13 +367,14 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
return;
}
- uint32 bgQueueTypeId = 0;
- // get the bg what we were invited to
- BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus;
- bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId,type);
- itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID());
+ BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_);
- if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end())
+ BattleGroundQueueTypeId bgQueueTypeId = BATTLEGROUND_QUEUE_NONE;
+ // get the bg what we were invited to
+ bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId,type);
+ BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel(bgTypeId)];
+ BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
+ if(itrPlayerStatus == qpMap.end())
{
sLog.outError("Battleground: itrplayerstatus not found.");
return;
@@ -391,7 +396,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
if(!bg)
{
- sLog.outError("Battleground: bg not found.");
+ sLog.outError("Battleground: bg not found for type id %u.",bgTypeId);
return;
}
@@ -406,9 +411,10 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
uint32 rating = 0;
uint32 opponentsRating = 0;
// get the team info from the queue
- BattleGroundQueue::QueuedPlayersMap::iterator pitr = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID());
- if(pitr !=sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end()
- && pitr->second.GroupInfo )
+
+ BattleGroundQueue::QueuedPlayersMap& qpMap2 = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel(bgTypeId)];
+ BattleGroundQueue::QueuedPlayersMap::iterator pitr = qpMap2.find(_player->GetGUID());
+ if (pitr !=qpMap2.end() && pitr->second.GroupInfo)
{
team = pitr->second.GroupInfo->Team;
arenatype = pitr->second.GroupInfo->ArenaType;
@@ -460,7 +466,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
// bg->AddPlayer(_player,team);
sLog.outDebug("Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.",_player->GetName(),_player->GetGUIDLow(),bg->GetInstanceID(),bg->GetTypeID(),bgQueueTypeId);
break;
- case 0: // leave queue
+ case 0: // leave queue
queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId);
/*
if player leaves rated arena match before match start, it is counted as he played but he lost
@@ -479,7 +485,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_NONE, 0, 0);
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player->GetGUID(), true);
// player left queue, we should update it, maybe now his group fits in
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId,_player->GetBattleGroundQueueIdFromLevel(),arenatype,israted,rating);
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId,_player->GetBattleGroundQueueIdFromLevel(bgTypeId),arenatype,israted,rating);
SendPacket(&data);
sLog.outDebug("Battleground: player %s (%u) left queue for bgtype %u, queue type %u.",_player->GetName(),_player->GetGUIDLow(),bg->GetTypeID(),bgQueueTypeId);
break;
@@ -527,8 +533,8 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket & /*recv_data*/ )
BattleGround *bg = _player->GetBattleGround();
if(bg)
{
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
- uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId);
+ BattleGroundQueueTypeId bgQueueTypeId_tmp = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
+ uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId_tmp);
if((bg->GetStatus() <= STATUS_IN_PROGRESS))
{
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime());
@@ -536,20 +542,23 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket & /*recv_data*/ )
}
for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
{
- uint32 queue_id = _player->GetBattleGroundQueueId(i); // battlegroundqueueid stores the type id, not the instance id, so this is definitely wrong
- uint8 arenatype = sBattleGroundMgr.BGArenaType(queue_id);
- uint8 isRated = 0;
- if (i == queueSlot || !queue_id) // we need to get the instance ids
+ BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i);
+ if (i == queueSlot || !bgQueueTypeId)
continue;
- BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID());
- if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end())
+ BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
+ uint8 arenatype = BattleGroundMgr::BGArenaType(bgQueueTypeId);
+ uint8 isRated = 0;
+ uint32 queue_id = _player->GetBattleGroundQueueIdFromLevel(bgTypeId);
+ BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[queue_id];
+ BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
+ if(itrPlayerStatus == qpMap.end())
continue;
if(itrPlayerStatus->second.GroupInfo)
{
arenatype = itrPlayerStatus->second.GroupInfo->ArenaType;
isRated = itrPlayerStatus->second.GroupInfo->IsRated;
}
- BattleGround *bg2 = sBattleGroundMgr.GetBattleGroundTemplate(sBattleGroundMgr.BGTemplateId(queue_id)); // try this
+ BattleGround *bg2 = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
if(bg2)
{
//in this call is small bug, this call should be filled by player's waiting time in queue
@@ -565,22 +574,24 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket & /*recv_data*/ )
// we should update all queues? .. i'm not sure if this code is correct
for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
{
- uint32 queue_id = _player->GetBattleGroundQueueId(i);
- if(!queue_id)
+ BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i);
+ if(!bgQueueTypeId)
continue;
- uint32 bgTypeId = sBattleGroundMgr.BGTemplateId(queue_id);
- uint8 arenatype = sBattleGroundMgr.BGArenaType(queue_id);
+ BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
+ uint8 arenatype = BattleGroundMgr::BGArenaType(bgQueueTypeId);
uint8 isRated = 0;
+ uint32 queue_id = _player->GetBattleGroundQueueIdFromLevel(bgTypeId);
BattleGround *bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
- BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID());
- if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end())
+ BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[queue_id];
+ BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID());
+ if(itrPlayerStatus == qpMap.end())
continue;
if(itrPlayerStatus->second.GroupInfo)
{
arenatype = itrPlayerStatus->second.GroupInfo->ArenaType;
isRated = itrPlayerStatus->second.GroupInfo->IsRated;
}
- if(bg && queue_id)
+ if(bg)
{
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), i, STATUS_WAIT_QUEUE, 0, 0, arenatype, isRated);
SendPacket(&data);
@@ -655,12 +666,12 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
return;
uint64 guid; // arena Battlemaster guid
- uint8 type; // 2v2, 3v3 or 5v5
+ uint8 arenaslot; // 2v2, 3v3 or 5v5
uint8 asGroup; // asGroup
uint8 isRated; // isRated
Group * grp;
- recv_data >> guid >> type >> asGroup >> isRated;
+ recv_data >> guid >> arenaslot >> asGroup >> isRated;
Creature *unit = ObjectAccessor::GetCreature(*_player, guid);
if(!unit)
@@ -672,7 +683,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
uint8 arenatype = 0;
uint32 arenaRating = 0;
- switch(type)
+ switch(arenaslot)
{
case 0:
arenatype = ARENA_TYPE_2v2;
@@ -684,7 +695,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
arenatype = ARENA_TYPE_5v5;
break;
default:
- sLog.outError("Unknown arena type %u at HandleBattleGroundArenaJoin()", type);
+ sLog.outError("Unknown arena slot %u at HandleBattleGroundArenaJoin()", arenaslot);
return;
}
@@ -696,8 +707,8 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
return;
}
- uint8 bgTypeId = bg->GetTypeID();
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId, arenatype);
+ BattleGroundTypeId bgTypeId = bg->GetTypeID();
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, arenatype);
// check queueing conditions
if(!asGroup)
@@ -716,7 +727,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
// no group found, error
if(!grp)
return;
- uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, arenatype, arenatype, (bool)isRated, type);
+ uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, arenatype, arenatype, (bool)isRated, arenaslot);
if (err != BG_JOIN_ERR_OK)
{
SendBattleGroundOrArenaJoinError(err);
@@ -728,7 +739,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
if(isRated)
{
- ateamId = _player->GetArenaTeamId(type);
+ ateamId = _player->GetArenaTeamId(arenaslot);
// check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice)
ArenaTeam * at = objmgr.GetArenaTeamById(ateamId);
if(!at)
@@ -746,7 +757,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
Player *member = itr->getSource();
// calc avg personal rating
- avg_pers_rating += member->GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (type*6) + 5);
+ avg_pers_rating += member->GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (arenaslot*6) + 5);
}
if( arenatype )
@@ -762,7 +773,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, arenaRating, ateamId);
sLog.outDebug("Battleground: arena join as group start");
if(isRated)
- sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(type),_player->GetName(),arenaRating,arenatype);
+ sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);
for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player *member = itr->getSource();
@@ -783,7 +794,9 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
sLog.outDebug("Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
}
sLog.outDebug("Battleground: arena join as group end");
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating);
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId), arenatype, isRated, arenaRating);
+ if(isRated)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
}
else
{
@@ -798,7 +811,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
SendPacket(&data);
GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, arenaRating);
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating);
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId), arenatype, isRated, arenaRating);
sLog.outDebug("Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
}
}
diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp
index 259ee1fed13..d151f3bc232 100644
--- a/src/game/BattleGroundMgr.cpp
+++ b/src/game/BattleGroundMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -19,6 +19,7 @@
*/
#include "Common.h"
+#include "SharedDefines.h"
#include "Player.h"
#include "BattleGroundMgr.h"
#include "BattleGroundAV.h"
@@ -29,16 +30,21 @@
#include "BattleGroundBE.h"
#include "BattleGroundAA.h"
#include "BattleGroundRL.h"
-#include "SharedDefines.h"
-#include "Policies/SingletonImp.h"
+#include "BattleGroundSA.h"
+#include "BattleGroundDS.h"
+#include "BattleGroundRV.h"
#include "MapManager.h"
#include "Map.h"
#include "MapInstanced.h"
#include "ObjectMgr.h"
#include "ProgressBar.h"
-#include "World.h"
#include "Chat.h"
#include "ArenaTeam.h"
+#include "World.h"
+#include "WorldPacket.h"
+#include "ProgressBar.h"
+
+#include "Policies/SingletonImp.h"
INSTANTIATE_SINGLETON_1( BattleGroundMgr );
@@ -49,12 +55,6 @@ INSTANTIATE_SINGLETON_1( BattleGroundMgr );
BattleGroundQueue::BattleGroundQueue()
{
//queues are empty, we don't have to call clear()
-/* for (int i = 0; i < MAX_BATTLEGROUND_QUEUES; i++)
- {
- //m_QueuedPlayers[i].Horde = 0;
- //m_QueuedPlayers[i].Alliance = 0;
- //m_QueuedPlayers[i].AverageTime = 0;
- }*/
}
BattleGroundQueue::~BattleGroundQueue()
@@ -71,7 +71,7 @@ BattleGroundQueue::~BattleGroundQueue()
}
// initialize eligible groups from the given source matching the given specifications
-void BattleGroundQueue::EligibleGroups::Init(BattleGroundQueue::QueuedGroupsList *source, uint32 BgTypeId, uint32 side, uint32 MaxPlayers, uint8 ArenaType, bool IsRated, uint32 MinRating, uint32 MaxRating, uint32 DisregardTime, uint32 excludeTeam)
+void BattleGroundQueue::EligibleGroups::Init(BattleGroundQueue::QueuedGroupsList *source, BattleGroundTypeId BgTypeId, uint32 side, uint32 MaxPlayers, uint8 ArenaType, bool IsRated, uint32 MinRating, uint32 MaxRating, uint32 DisregardTime, uint32 excludeTeam)
{
// clear from prev initialization
clear();
@@ -81,17 +81,17 @@ void BattleGroundQueue::EligibleGroups::Init(BattleGroundQueue::QueuedGroupsList
{
next = itr;
++next;
- if( (*itr)->BgTypeId == BgTypeId && // bg type must match
- (*itr)->ArenaType == ArenaType && // arena type must match
- (*itr)->IsRated == IsRated && // israted must match
- (*itr)->IsInvitedToBGInstanceGUID == 0 && // leave out already invited groups
- (*itr)->Team == side && // match side
- (*itr)->Players.size() <= MaxPlayers && // the group must fit in the bg
+ if( (*itr)->BgTypeId == BgTypeId && // bg type must match
+ (*itr)->ArenaType == ArenaType && // arena type must match
+ (*itr)->IsRated == IsRated && // israted must match
+ (*itr)->IsInvitedToBGInstanceGUID == 0 && // leave out already invited groups
+ (*itr)->Team == side && // match side
+ (*itr)->Players.size() <= MaxPlayers && // the group must fit in the bg
( !excludeTeam || (*itr)->ArenaTeamId != excludeTeam ) && // if excludeTeam is specified, leave out those arena team ids
( !IsRated || (*itr)->Players.size() == MaxPlayers ) && // if rated, then pass only if the player count is exact NEEDS TESTING! (but now this should never happen)
- ( !DisregardTime || (*itr)->JoinTime <= DisregardTime // pass if disregard time is greater than join time
- || (*itr)->ArenaTeamRating == 0 // pass if no rating info
- || ( (*itr)->ArenaTeamRating >= MinRating // pass if matches the rating range
+ ( !DisregardTime || (*itr)->JoinTime <= DisregardTime // pass if disregard time is greater than join time
+ || (*itr)->ArenaTeamRating == 0 // pass if no rating info
+ || ( (*itr)->ArenaTeamRating >= MinRating // pass if matches the rating range
&& (*itr)->ArenaTeamRating <= MaxRating ) ) )
{
// the group matches the conditions
@@ -136,9 +136,9 @@ void BattleGroundQueue::SelectionPool::AddGroup(GroupQueueInfo * ginfo)
}
// add group to bg queue with the given leader and bg specifications
-GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, uint32 BgTypeId, uint8 ArenaType, bool isRated, uint32 arenaRating, uint32 arenateamid)
+GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, BattleGroundTypeId BgTypeId, uint8 ArenaType, bool isRated, uint32 arenaRating, uint32 arenateamid)
{
- uint32 queue_id = leader->GetBattleGroundQueueIdFromLevel();
+ uint32 queue_id = leader->GetBattleGroundQueueIdFromLevel(BgTypeId);
// create new ginfo
// cannot use the method like in addplayer, because that could modify an in-queue group's stats
@@ -164,7 +164,7 @@ GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, uint32 BgTypeId, ui
void BattleGroundQueue::AddPlayer(Player *plr, GroupQueueInfo *ginfo)
{
- uint32 queue_id = plr->GetBattleGroundQueueIdFromLevel();
+ uint32 queue_id = plr->GetBattleGroundQueueIdFromLevel(ginfo->BgTypeId);
//if player isn't in queue, he is added, if already is, then values are overwritten, no memory leak
PlayerQueueInfo& info = m_QueuedPlayers[queue_id][plr->GetGUID()];
@@ -177,56 +177,40 @@ void BattleGroundQueue::AddPlayer(Player *plr, GroupQueueInfo *ginfo)
ginfo->Players[plr->GetGUID()] = &info;
}
-void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
+void BattleGroundQueue::RemovePlayer(const uint64& guid, bool decreaseInvitedCount)
{
Player *plr = objmgr.GetPlayer(guid);
- uint32 queue_id = 0;
+ int32 queue_id = 0; // signed for proper for-loop finish
QueuedPlayersMap::iterator itr;
- GroupQueueInfo * group;
- QueuedGroupsList::iterator group_itr;
- bool IsSet = false;
- if(plr)
- {
- queue_id = plr->GetBattleGroundQueueIdFromLevel();
+ // mostly people with the highest levels are in battlegrounds, thats why
+ // we count from MAX_BATTLEGROUND_QUEUES to 0
+ for (queue_id = MAX_BATTLEGROUND_QUEUES-1; queue_id >= 0; queue_id--)
+ {
itr = m_QueuedPlayers[queue_id].find(guid);
if(itr != m_QueuedPlayers[queue_id].end())
- IsSet = true;
- }
-
- if(!IsSet)
- {
- // either player is offline, or he levelled up to another queue category
- // sLog.outError("Battleground: removing offline player from BG queue - this might not happen, but it should not cause crash");
- for (uint32 i = 0; i < MAX_BATTLEGROUND_QUEUES; i++)
- {
- itr = m_QueuedPlayers[i].find(guid);
- if(itr != m_QueuedPlayers[i].end())
- {
- queue_id = i;
- IsSet = true;
- break;
- }
- }
+ break;
}
// couldn't find the player in bg queue, return
- if(!IsSet)
+ if(queue_id == -1)
{
sLog.outError("Battleground: couldn't find player to remove.");
return;
}
- group = itr->second.GroupInfo;
+ GroupQueueInfo* group = itr->second.GroupInfo;
- for(group_itr=m_QueuedGroups[queue_id].begin(); group_itr != m_QueuedGroups[queue_id].end(); ++group_itr)
+ QueuedGroupsList::iterator group_itr = m_QueuedGroups[queue_id].begin();
+ for(; group_itr != m_QueuedGroups[queue_id].end(); ++group_itr)
{
- if(group == (GroupQueueInfo*)(*group_itr))
+ if(group == *group_itr)
break;
}
- // variables are set (what about leveling up when in queue????)
+ // variables are set (what about leveling up when in queue????
+ // iterate through all queue_ids this isn't bad for us)
// remove player from group
// if only player there, remove group
@@ -260,6 +244,11 @@ void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
// remove player queue info
m_QueuedPlayers[queue_id].erase(itr);
// remove group queue info if needed
+
+ //if we left BG queue(not porting) OR if arena team left queue for rated match
+ if((decreaseInvitedCount && !group->ArenaType) || (group->ArenaType && group->IsRated && group->Players.empty()))
+ AnnounceWorld(group, guid, false);
+
if(group->Players.empty())
{
m_QueuedGroups[queue_id].erase(group_itr);
@@ -275,7 +264,7 @@ void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
if(Player *plr2 = objmgr.GetPlayer(group->Players.begin()->first))
{
BattleGround * bg = sBattleGroundMgr.GetBattleGroundTemplate(group->BgTypeId);
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(group->BgTypeId,group->ArenaType);
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(group->BgTypeId,group->ArenaType);
uint32 queueSlot = plr2->GetBattleGroundQueueIndex(bgQueueTypeId);
plr2->RemoveBattleGroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs
WorldPacket data;
@@ -288,6 +277,85 @@ void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
}
}
+void BattleGroundQueue::AnnounceWorld(GroupQueueInfo *ginfo, const uint64& playerGUID, bool isAddedToQueue)
+{
+
+ if(ginfo->ArenaType) //if Arena
+ {
+ if( sWorld.getConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE) && ginfo->IsRated)
+ {
+ BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
+ if(!bg)
+ return;
+
+ char const* bgName = bg->GetName();
+ if(isAddedToQueue)
+ sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, bgName, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
+ else
+ sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, bgName, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
+ }
+ }
+ else //if BG
+ {
+ if( sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE) )
+ {
+ Player *plr = objmgr.GetPlayer(playerGUID);
+ if(!plr)
+ return;
+
+ BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
+ if(!bg)
+ return;
+
+ uint32 queue_id = plr->GetBattleGroundQueueIdFromLevel(bg->GetTypeID());
+ char const* bgName = bg->GetName();
+
+ uint32 q_min_level = Player::GetMinLevelForBattleGroundQueueId(queue_id, ginfo->BgTypeId);
+ uint32 q_max_level = Player::GetMaxLevelForBattleGroundQueueId(queue_id, ginfo->BgTypeId);
+
+ // replace hardcoded max level by player max level for nice output
+ if(q_max_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
+ q_max_level = sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL);
+
+ int8 MinPlayers = bg->GetMinPlayersPerTeam();
+
+ uint8 qHorde = 0;
+ uint8 qAlliance = 0;
+
+ BattleGroundTypeId bgTypeId = ginfo->BgTypeId;
+ QueuedPlayersMap::iterator itr;
+ for(itr = m_QueuedPlayers[queue_id].begin(); itr!= m_QueuedPlayers[queue_id].end(); ++itr)
+ {
+ if(itr->second.GroupInfo->BgTypeId == bgTypeId)
+ {
+ switch(itr->second.GroupInfo->Team)
+ {
+ case HORDE:
+ qHorde++; break;
+ case ALLIANCE:
+ qAlliance++; break;
+ default:
+ break;
+ }
+ }
+ }
+
+ // Show queue status to player only (when joining queue)
+ if(sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
+ {
+ ChatHandler(plr).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF,
+ bgName, q_min_level, q_max_level, qAlliance, MinPlayers, qHorde, MinPlayers);
+ }
+ // System message
+ else
+ {
+ sWorld.SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD,
+ bgName, q_min_level, q_max_level, qAlliance, MinPlayers, qHorde, MinPlayers);
+ }
+ }
+ }
+}
+
bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side)
{
// set side if needed
@@ -299,7 +367,7 @@ bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * b
// not yet invited
// set invitation
ginfo->IsInvitedToBGInstanceGUID = bg->GetInstanceID();
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
// loop through the players
for(std::map<uint64,PlayerQueueInfo*>::iterator itr = ginfo->Players.begin(); itr != ginfo->Players.end(); ++itr)
{
@@ -362,26 +430,25 @@ bool BattleGroundQueue::SelectionPool::Build(uint32 MinPlayers, uint32 MaxPlayer
}
// this function is responsible for the selection of queued groups when trying to create new battlegrounds
-bool BattleGroundQueue::BuildSelectionPool(uint32 bgTypeId, uint32 queue_id, uint32 MinPlayers, uint32 MaxPlayers, SelectionPoolBuildMode mode, uint8 ArenaType, bool isRated, uint32 MinRating, uint32 MaxRating, uint32 DisregardTime, uint32 excludeTeam)
+bool BattleGroundQueue::BuildSelectionPool(BattleGroundTypeId bgTypeId, uint32 queue_id, uint32 MinPlayers, uint32 MaxPlayers, SelectionPoolBuildMode mode, uint8 ArenaType, bool isRated, uint32 MinRating, uint32 MaxRating, uint32 DisregardTime, uint32 excludeTeam)
{
uint32 side;
switch(mode)
{
- case NORMAL_ALLIANCE:
- case ONESIDE_ALLIANCE_TEAM1:
- case ONESIDE_ALLIANCE_TEAM2:
- side = ALLIANCE;
- break;
- case NORMAL_HORDE:
- case ONESIDE_HORDE_TEAM1:
- case ONESIDE_HORDE_TEAM2:
- side = HORDE;
- break;
- default:
- //unknown mode, return false
- sLog.outDebug("Battleground: unknown selection pool build mode, returning...");
- return false;
- break;
+ case NORMAL_ALLIANCE:
+ case ONESIDE_ALLIANCE_TEAM1:
+ case ONESIDE_ALLIANCE_TEAM2:
+ side = ALLIANCE;
+ break;
+ case NORMAL_HORDE:
+ case ONESIDE_HORDE_TEAM1:
+ case ONESIDE_HORDE_TEAM2:
+ side = HORDE;
+ break;
+ default:
+ //unknown mode, return false
+ sLog.outDebug("Battleground: unknown selection pool build mode, returning...");
+ return false;
}
// initiate the groups eligible to create the bg
@@ -412,9 +479,9 @@ bool BattleGroundQueue::BuildSelectionPool(uint32 bgTypeId, uint32 queue_id, uin
// (this can happen in arenas mainly, since the preparation is shorter than the timer for the bgqueueremove event
void BattleGroundQueue::BGEndedRemoveInvites(BattleGround *bg)
{
- uint32 queue_id = bg->GetQueueType();
+ uint32 queue_id = bg->GetQueueId();
uint32 bgInstanceId = bg->GetInstanceID();
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
QueuedGroupsList::iterator itr, next;
for(itr = m_QueuedGroups[queue_id].begin(); itr != m_QueuedGroups[queue_id].end(); itr = next)
{
@@ -454,8 +521,8 @@ void BattleGroundQueue::BGEndedRemoveInvites(BattleGround *bg)
// remove player from queue, this might delete the ginfo as well! don't use that pointer after this!
RemovePlayer(itr2->first, true);
// this is probably unneeded, since this player was already invited -> does not fit when initing eligible groups
- // but updating the queue can't hurt
- Update(bgQueueTypeId, bg->GetQueueType());
+ // but updateing the queue can't hurt
+ Update(bg->GetTypeID(), bg->GetQueueId());
// send info to client
WorldPacket data;
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, team, queueSlot, STATUS_NONE, 0, 0);
@@ -471,7 +538,7 @@ this method is called when group is inserted, or player / group is removed from
it must be called after fully adding the members of a group to ensure group joining
should be called after removeplayer functions in some cases
*/
-void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype, bool isRated, uint32 arenaRating)
+void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, uint32 queue_id, uint8 arenatype, bool isRated, uint32 arenaRating)
{
if (queue_id >= MAX_BATTLEGROUND_QUEUES)
{
@@ -484,7 +551,7 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
if (m_QueuedGroups[queue_id].empty())
return;
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId, arenatype);
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, arenatype);
//battleground with free slot for player should be always the last in this queue
BGFreeSlotQueueType::iterator itr, next;
@@ -494,7 +561,7 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
++next;
// battleground is running, so if:
// DO NOT allow queue manager to invite new player to running arena
- if ((*itr)->isBattleGround() && (*itr)->GetTypeID() == bgTypeId && (*itr)->GetQueueType() == queue_id && (*itr)->GetStatus() > STATUS_WAIT_QUEUE && (*itr)->GetStatus() < STATUS_WAIT_LEAVE)
+ if ((*itr)->isBattleGround() && (*itr)->GetTypeID() == bgTypeId && (*itr)->GetQueueId() == queue_id && (*itr)->GetStatus() > STATUS_WAIT_QUEUE && (*itr)->GetStatus() < STATUS_WAIT_LEAVE)
{
//we must check both teams
BattleGround* bg = *itr; //we have to store battleground pointer here, because when battleground is full, it is removed from free queue (not yet implemented!!)
@@ -559,6 +626,14 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
}
}
}
+ // BG case
+ else
+ {
+ if(sBattleGroundMgr.isTesting())
+ {
+ MinPlayersPerTeam = 1;
+ }
+ }
// found out the minimum and maximum ratings the newly added team should battle against
// arenaRating is the rating of the latest joined team
@@ -586,14 +661,14 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
sLog.outDebug("Battleground: horde pool wasn't created");
// if selection pools are ready, create the new bg
- if (bAllyOK && bHordeOK)
+ if ((bAllyOK && bHordeOK) || ( sBattleGroundMgr.isTesting() && (bAllyOK || bHordeOK)))
{
BattleGround * bg2 = 0;
// special handling for arenas
if(bg_template->isArena())
{
// Find a random arena, that can be created
- uint8 arenas[] = {BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL};
+ BattleGroundTypeId arenas[] = {BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL};
uint32 arena_num = urand(0,2);
if( !(bg2 = sBattleGroundMgr.CreateNewBattleGround(arenas[arena_num%3])) &&
!(bg2 = sBattleGroundMgr.CreateNewBattleGround(arenas[(arena_num+1)%3])) &&
@@ -635,6 +710,15 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
{
// create new battleground
bg2 = sBattleGroundMgr.CreateNewBattleGround(bgTypeId);
+ if( sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE) )
+ {
+ char const* bgName = bg2->GetName();
+ uint32 q_min_level = Player::GetMinLevelForBattleGroundQueueId(queue_id, bgTypeId);
+ uint32 q_max_level = Player::GetMaxLevelForBattleGroundQueueId(queue_id, bgTypeId);
+ if(q_max_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
+ q_max_level = sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL);
+ sWorld.SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, bgName, q_min_level, q_max_level);
+ }
}
if(!bg2)
@@ -645,7 +729,7 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
// start the joining of the bg
bg2->SetStatus(STATUS_WAIT_JOIN);
- bg2->SetQueueType(queue_id);
+ bg2->SetQueueId(queue_id);
// initialize arena / rating info
bg2->SetArenaType(arenatype);
// set rating
@@ -748,7 +832,7 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
}
// create random arena
- uint8 arenas[] = {BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL};
+ BattleGroundTypeId arenas[] = {BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL};
uint32 arena_num = urand(0,2);
BattleGround* bg2 = NULL;
if( !(bg2 = sBattleGroundMgr.CreateNewBattleGround(arenas[arena_num%3])) &&
@@ -798,7 +882,7 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
// start the joining of the bg
bg2->SetStatus(STATUS_WAIT_JOIN);
- bg2->SetQueueType(queue_id);
+ bg2->SetQueueId(queue_id);
// initialize arena / rating info
bg2->SetArenaType(arenatype);
@@ -850,22 +934,19 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
if (!bg)
return true;
- uint32 queueSlot = plr->GetBattleGroundQueueIndex(bg->GetTypeID());
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
+ BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
+ uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue
{
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
- uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
- if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue
+ // check if player is invited to this bg ... this check must be here, because when player leaves queue and joins another, it would cause a problems
+ BattleGroundQueue::QueuedPlayersMap const& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[plr->GetBattleGroundQueueIdFromLevel(bgTypeId)];
+ BattleGroundQueue::QueuedPlayersMap::const_iterator qItr = qpMap.find(m_PlayerGuid);
+ if (qItr != qpMap.end() && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == m_BgInstanceGUID)
{
- // check if player is invited to this bg ... this check must be here, because when player leaves queue and joins another, it would cause a problems
- BattleGroundQueue::QueuedPlayersMap const& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[plr->GetBattleGroundQueueIdFromLevel()];
- BattleGroundQueue::QueuedPlayersMap::const_iterator qItr = qpMap.find(m_PlayerGuid);
- if (qItr != qpMap.end() && qItr->second.GroupInfo->IsInvitedToBGInstanceGUID == m_BgInstanceGUID)
- {
- WorldPacket data;
- sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, qItr->second.GroupInfo->Team, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME/2, 0);
- plr->GetSession()->SendPacket(&data);
- }
+ WorldPacket data;
+ sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, qItr->second.GroupInfo->Team, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME/2, 0);
+ plr->GetSession()->SendPacket(&data);
}
}
return true; //event will be deleted
@@ -890,13 +971,15 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
sLog.outDebug("Battleground: removing player %u from bg queue for instance %u because of not pressing enter battle in time.",plr->GetGUIDLow(),m_BgInstanceGUID);
- uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
+ BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue
{
// check if player is invited to this bg ... this check must be here, because when player leaves queue and joins another, it would cause a problems
- BattleGroundQueue::QueuedPlayersMap::iterator qMapItr = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[plr->GetBattleGroundQueueIdFromLevel()].find(m_PlayerGuid);
- if (qMapItr != sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[plr->GetBattleGroundQueueIdFromLevel()].end() && qMapItr->second.GroupInfo && qMapItr->second.GroupInfo->IsInvitedToBGInstanceGUID == m_BgInstanceGUID)
+ uint32 queue_id=plr->GetBattleGroundQueueIdFromLevel(bg->GetTypeID());
+ BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[queue_id];
+ BattleGroundQueue::QueuedPlayersMap::iterator qMapItr = qpMap.find(m_PlayerGuid);
+ if (qMapItr != qpMap.end() && qMapItr->second.GroupInfo && qMapItr->second.GroupInfo->IsInvitedToBGInstanceGUID == m_BgInstanceGUID)
{
if (qMapItr->second.GroupInfo->IsRated)
{
@@ -910,7 +993,7 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
}
plr->RemoveBattleGroundQueueId(bgQueueTypeId);
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(m_PlayerGuid, true);
- sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgQueueTypeId, bg->GetQueueType());
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bg->GetTypeID(),bg->GetQueueId());
WorldPacket data;
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, m_PlayersTeam, queueSlot, STATUS_NONE, 0, 0);
plr->GetSession()->SendPacket(&data);
@@ -933,34 +1016,38 @@ void BGQueueRemoveEvent::Abort(uint64 /*e_time*/)
/*** BATTLEGROUND MANAGER ***/
/*********************************************************/
-BattleGroundMgr::BattleGroundMgr()
+BattleGroundMgr::BattleGroundMgr() : m_AutoDistributionTimeChecker(0), m_ArenaTesting(false)
{
m_BattleGrounds.clear();
- m_AutoDistributePoints = (bool)sWorld.getConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS);
- m_MaxRatingDifference = sWorld.getConfig(CONFIG_ARENA_MAX_RATING_DIFFERENCE);
- m_RatingDiscardTimer = sWorld.getConfig(CONFIG_ARENA_RATING_DISCARD_TIMER);
- m_PrematureFinishTimer = sWorld.getConfig(CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER);
- m_NextRatingDiscardUpdate = m_RatingDiscardTimer;
- m_AutoDistributionTimeChecker = 0;
- m_ArenaTesting = false;
+ m_NextRatingDiscardUpdate = sWorld.getConfig(CONFIG_ARENA_RATING_DISCARD_TIMER);
+ m_Testing=false;
}
BattleGroundMgr::~BattleGroundMgr()
{
- BattleGroundSet::iterator itr, next;
- for(itr = m_BattleGrounds.begin(); itr != m_BattleGrounds.end(); itr = next)
+ DeleteAlllBattleGrounds();
+}
+
+void BattleGroundMgr::DeleteAlllBattleGrounds()
+{
+ for(BattleGroundSet::iterator itr = m_BattleGrounds.begin(); itr != m_BattleGrounds.end();)
{
- next = itr;
- ++next;
BattleGround * bg = itr->second;
- m_BattleGrounds.erase(itr);
+ m_BattleGrounds.erase(itr++);
delete bg;
}
- m_BattleGrounds.clear();
+
+ // destroy template battlegrounds that listed only in queues (other already terminated)
+ for(uint32 bgTypeId = 0; bgTypeId < MAX_BATTLEGROUND_TYPE_ID; ++bgTypeId)
+ {
+ // ~BattleGround call unregistring BG from queue
+ while(!BGFreeSlotQueue[bgTypeId].empty())
+ delete BGFreeSlotQueue[bgTypeId].front();
+ }
}
// used to update running battlegrounds, and delete finished ones
-void BattleGroundMgr::Update(time_t diff)
+void BattleGroundMgr::Update(uint32 diff)
{
BattleGroundSet::iterator itr, next;
for(itr = m_BattleGrounds.begin(); itr != m_BattleGrounds.end(); itr = next)
@@ -978,7 +1065,7 @@ void BattleGroundMgr::Update(time_t diff)
}
}
// if rating difference counts, maybe force-update queues
- if(m_MaxRatingDifference)
+ if(sWorld.getConfig(CONFIG_ARENA_MAX_RATING_DIFFERENCE))
{
// it's time to force update
if(m_NextRatingDiscardUpdate < diff)
@@ -987,12 +1074,12 @@ void BattleGroundMgr::Update(time_t diff)
m_BattleGroundQueues[BATTLEGROUND_QUEUE_2v2].Update(BATTLEGROUND_AA,6,ARENA_TYPE_2v2,true,0);
m_BattleGroundQueues[BATTLEGROUND_QUEUE_3v3].Update(BATTLEGROUND_AA,6,ARENA_TYPE_3v3,true,0);
m_BattleGroundQueues[BATTLEGROUND_QUEUE_5v5].Update(BATTLEGROUND_AA,6,ARENA_TYPE_5v5,true,0);
- m_NextRatingDiscardUpdate = m_RatingDiscardTimer;
+ m_NextRatingDiscardUpdate = sWorld.getConfig(CONFIG_ARENA_RATING_DISCARD_TIMER);
}
else
m_NextRatingDiscardUpdate -= diff;
}
- if(m_AutoDistributePoints)
+ if(sWorld.getConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS))
{
if(m_AutoDistributionTimeChecker < diff)
{
@@ -1054,6 +1141,15 @@ void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket *data, BattleGro
case BATTLEGROUND_RL:
*data << uint8(8);
break;
+ case BATTLEGROUND_SA:
+ *data << uint8(9);
+ break;
+ case BATTLEGROUND_DS:
+ *data << uint8(10);
+ break;
+ case BATTLEGROUND_RV:
+ *data << uint8(11);
+ break;
default: // unknown
*data << uint8(0);
break;
@@ -1098,16 +1194,16 @@ void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket *data, BattleGro
void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
{
uint8 type = (bg->isArena() ? 1 : 0);
- // last check on 2.4.1
+ // last check on 3.0.3
data->Initialize(MSG_PVP_LOG_DATA, (1+1+4+40*bg->GetPlayerScoresSize()));
- *data << uint8(type); // seems to be type (battleground=0/arena=1)
+ *data << uint8(type); // type (battleground=0/arena=1)
if(type) // arena
{
// it seems this must be according to BG_WINNER_A/H and _NOT_ BG_TEAM_A/H
for(int i = 1; i >= 0; --i)
{
- *data << uint32(3000-bg->m_ArenaTeamRatingChanges[i]); // rating change: showed value - 3000
+ *data << uint32(bg->m_ArenaTeamRatingChanges[i]);
*data << uint32(3999); // huge thanks for TOM_RUS for this!
sLog.outDebug("rating change: %d", bg->m_ArenaTeamRatingChanges[i]);
}
@@ -1117,14 +1213,14 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
if(at)
*data << at->GetName();
- else//*/
+ else
*data << (uint8)0;
}
}
- if(bg->GetWinner() == 2)
+ if(bg->GetStatus() != STATUS_WAIT_LEAVE)
{
- *data << uint8(0); // bg in progress
+ *data << uint8(0); // bg not ended
}
else
{
@@ -1138,9 +1234,6 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
{
*data << (uint64)itr->first;
*data << (int32)itr->second->KillingBlows;
- Player *plr = objmgr.GetPlayer(itr->first);
- uint32 team = bg->GetPlayerTeam(itr->first);
- if(!team && plr) team = plr->GetTeam();
if(type == 0)
{
*data << (int32)itr->second->HonorableKills;
@@ -1149,18 +1242,12 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
}
else
{
- // that part probably wrong
- if(plr)
- {
- if(team == HORDE)
- *data << uint8(0);
- else if(team == ALLIANCE)
- {
- *data << uint8(1);
- }
- else
- *data << uint8(0);
- }
+ Player *plr = objmgr.GetPlayer(itr->first);
+ uint32 team = bg->GetPlayerTeam(itr->first);
+ if(!team && plr)
+ team = plr->GetTeam();
+ if( ( bg->GetWinner()==0 && team == ALLIANCE ) || ( bg->GetWinner()==1 && team==HORDE ) )
+ *data << uint8(1);
else
*data << uint8(0);
}
@@ -1187,13 +1274,16 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
*data << (uint32)((BattleGroundABScore*)itr->second)->BasesDefended; // bases defended
break;
case BATTLEGROUND_EY:
- *data << (uint32)0x00000001; // count of next fields
+ *data << (uint32)0x00000001; // count of next fields
*data << (uint32)((BattleGroundEYScore*)itr->second)->FlagCaptures; // flag captures
break;
case BATTLEGROUND_NA:
case BATTLEGROUND_BE:
case BATTLEGROUND_AA:
case BATTLEGROUND_RL:
+ case BATTLEGROUND_SA: // wotlk
+ case BATTLEGROUND_DS: // wotlk
+ case BATTLEGROUND_RV: // wotlk
*data << (int32)0; // 0
break;
default:
@@ -1204,7 +1294,7 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
}
}
-void BattleGroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket *data, uint32 bgTypeId)
+void BattleGroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket *data, BattleGroundTypeId bgTypeId)
{
/*bgTypeId is:
0 - Your group has joined a battleground queue, but you are not eligible
@@ -1281,25 +1371,24 @@ void BattleGroundMgr::InvitePlayer(Player* plr, uint32 bgInstanceGUID, uint32 te
plr->m_Events.AddEvent(removeEvent, plr->m_Events.CalculateTime(INVITE_ACCEPT_WAIT_TIME));
}
-BattleGround * BattleGroundMgr::GetBattleGroundTemplate(uint32 bgTypeId)
+BattleGround * BattleGroundMgr::GetBattleGroundTemplate(BattleGroundTypeId bgTypeId)
{
return BGFreeSlotQueue[bgTypeId].empty() ? NULL : BGFreeSlotQueue[bgTypeId].back();
}
// create a new battleground that will really be used to play
-BattleGround * BattleGroundMgr::CreateNewBattleGround(uint32 bgTypeId)
+BattleGround * BattleGroundMgr::CreateNewBattleGround(BattleGroundTypeId bgTypeId)
{
- BattleGround *bg = NULL;
-
// get the template BG
BattleGround *bg_template = GetBattleGroundTemplate(bgTypeId);
-
if(!bg_template)
{
sLog.outError("BattleGround: CreateNewBattleGround - bg template not found for %u", bgTypeId);
- return 0;
+ return NULL;
}
+ BattleGround *bg = NULL;
+
// create a copy of the BG template
switch(bgTypeId)
{
@@ -1327,10 +1416,18 @@ BattleGround * BattleGroundMgr::CreateNewBattleGround(uint32 bgTypeId)
case BATTLEGROUND_RL:
bg = new BattleGroundRL(*(BattleGroundRL*)bg_template);
break;
+ case BATTLEGROUND_SA:
+ bg = new BattleGroundSA(*(BattleGroundSA*)bg_template);
+ break;
+ case BATTLEGROUND_DS:
+ bg = new BattleGroundDS(*(BattleGroundDS*)bg_template);
+ break;
+ case BATTLEGROUND_RV:
+ bg = new BattleGroundRV(*(BattleGroundRV*)bg_template);
+ break;
default:
- //bg = new BattleGround;
+ //error, but it is handled few lines above
return 0;
- break; // placeholder for non implemented BG
}
// generate a new instance id
@@ -1358,11 +1455,10 @@ BattleGround * BattleGroundMgr::CreateNewBattleGround(uint32 bgTypeId)
}
// used to create the BG templates
-uint32 BattleGroundMgr::CreateBattleGround(uint32 bgTypeId, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO)
+uint32 BattleGroundMgr::CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO)
{
// Create the BG
BattleGround *bg = NULL;
-
switch(bgTypeId)
{
case BATTLEGROUND_AV: bg = new BattleGroundAV; break;
@@ -1373,6 +1469,9 @@ uint32 BattleGroundMgr::CreateBattleGround(uint32 bgTypeId, uint32 MinPlayersPer
case BATTLEGROUND_AA: bg = new BattleGroundAA; break;
case BATTLEGROUND_EY: bg = new BattleGroundEY; break;
case BATTLEGROUND_RL: bg = new BattleGroundRL; break;
+ case BATTLEGROUND_SA: bg = new BattleGroundSA; break;
+ case BATTLEGROUND_DS: bg = new BattleGroundDS; break;
+ case BATTLEGROUND_RV: bg = new BattleGroundRV; break;
default:bg = new BattleGround; break; // placeholder for non implemented BG
}
@@ -1380,19 +1479,13 @@ uint32 BattleGroundMgr::CreateBattleGround(uint32 bgTypeId, uint32 MinPlayersPer
bg->Reset();
- BattlemasterListEntry const *bl = sBattlemasterListStore.LookupEntry(bgTypeId);
- //in previous method is checked if exists entry in sBattlemasterListStore, so no check needed
- if (bl)
- {
- bg->SetArenaorBGType(bl->type == TYPE_ARENA);
- }
-
bg->SetTypeID(bgTypeId);
- bg->SetInstanceID(0); // template bg, instance id is 0
+ bg->SetInstanceID(0);
+ bg->SetArenaorBGType(IsArena);
bg->SetMinPlayersPerTeam(MinPlayersPerTeam);
bg->SetMaxPlayersPerTeam(MaxPlayersPerTeam);
- bg->SetMinPlayers(MinPlayersPerTeam*2);
- bg->SetMaxPlayers(MaxPlayersPerTeam*2);
+ bg->SetMinPlayers(MinPlayersPerTeam * 2);
+ bg->SetMaxPlayers(MaxPlayersPerTeam * 2);
bg->SetName(BattleGroundName);
bg->SetTeamStartLoc(ALLIANCE, Team1StartLocX, Team1StartLocY, Team1StartLocZ, Team1StartLocO);
bg->SetTeamStartLoc(HORDE, Team2StartLocX, Team2StartLocY, Team2StartLocZ, Team2StartLocO);
@@ -1414,6 +1507,7 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
uint32 MaxPlayersPerTeam, MinPlayersPerTeam, MinLvl, MaxLvl, start1, start2;
BattlemasterListEntry const *bl;
WorldSafeLocsEntry const *start;
+ bool IsArena;
uint32 count = 0;
@@ -1438,32 +1532,34 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
Field *fields = result->Fetch();
bar.step();
- uint32 bgTypeID = fields[0].GetUInt32();
+ uint32 bgTypeID_ = fields[0].GetUInt32();
- // can be overwrited by values from DB
- bl = sBattlemasterListStore.LookupEntry(bgTypeID);
+ // can be overwrite by values from DB
+ bl = sBattlemasterListStore.LookupEntry(bgTypeID_);
if(!bl)
{
- sLog.outError("Battleground ID %u not found in BattlemasterList.dbc. Battleground not created.",bgTypeID);
+ sLog.outError("Battleground ID %u not found in BattlemasterList.dbc. Battleground not created.", bgTypeID_);
continue;
}
- MaxPlayersPerTeam = bl->maxplayersperteam;
- MinPlayersPerTeam = bl->maxplayersperteam/2;
- MinLvl = bl->minlvl;
- MaxLvl = bl->maxlvl;
-
- if(fields[1].GetUInt32())
- MinPlayersPerTeam = fields[1].GetUInt32();
-
- if(fields[2].GetUInt32())
- MaxPlayersPerTeam = fields[2].GetUInt32();
+ BattleGroundTypeId bgTypeID = BattleGroundTypeId(bgTypeID_);
- if(fields[3].GetUInt32())
- MinLvl = fields[3].GetUInt32();
-
- if(fields[4].GetUInt32())
- MaxLvl = fields[4].GetUInt32();
+ IsArena = (bl->type == TYPE_ARENA);
+ MinPlayersPerTeam = fields[1].GetUInt32();
+ MaxPlayersPerTeam = fields[2].GetUInt32();
+ MinLvl = fields[3].GetUInt32();
+ MaxLvl = fields[4].GetUInt32();
+ //check values from DB
+ if( MaxPlayersPerTeam == 0 || MinPlayersPerTeam == 0 || MinPlayersPerTeam > MaxPlayersPerTeam )
+ {
+ MaxPlayersPerTeam = bl->maxplayersperteam;
+ MinPlayersPerTeam = bl->maxplayersperteam / 2;
+ }
+ if( MinLvl == 0 || MaxLvl == 0 || MinLvl > MaxLvl )
+ {
+ MinLvl = bl->minlvl;
+ MaxLvl = bl->maxlvl;
+ }
start1 = fields[5].GetUInt32();
@@ -1484,7 +1580,7 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
}
else
{
- sLog.outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.",bgTypeID,start1);
+ sLog.outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", bgTypeID, start1);
continue;
}
@@ -1507,12 +1603,12 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
}
else
{
- sLog.outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.",bgTypeID,start2);
+ sLog.outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", bgTypeID, start2);
continue;
}
//sLog.outDetail("Creating battleground %s, %u-%u", bl->name[sWorld.GetDBClang()], MinLvl, MaxLvl);
- if(!CreateBattleGround(bgTypeID, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, bl->name[sWorld.GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]))
+ if(!CreateBattleGround(bgTypeID, IsArena, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, bl->name[sWorld.GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]))
continue;
++count;
@@ -1526,7 +1622,7 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
void BattleGroundMgr::InitAutomaticArenaPointDistribution()
{
- if(m_AutoDistributePoints)
+ if(sWorld.getConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS))
{
sLog.outDebug("Initializing Automatic Arena Point Distribution");
QueryResult * result = CharacterDatabase.Query("SELECT NextArenaPointDistributionTime FROM saved_variables");
@@ -1548,9 +1644,9 @@ void BattleGroundMgr::InitAutomaticArenaPointDistribution()
void BattleGroundMgr::DistributeArenaPoints()
{
// used to distribute arena points based on last week's stats
- sWorld.SendGlobalText("Flushing Arena points based on team ratings, this may take a few minutes. Please stand by...", NULL);
+ sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_START);
- sWorld.SendGlobalText("Distributing arena points to players...", NULL);
+ sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_START);
//temporary structure for storing maximum points to add values for all players
std::map<uint32, uint32> PlayerPoints;
@@ -1577,9 +1673,9 @@ void BattleGroundMgr::DistributeArenaPoints()
PlayerPoints.clear();
- sWorld.SendGlobalText("Finished setting arena points for online players.", NULL);
+ sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_END);
- sWorld.SendGlobalText("Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...", NULL);
+ sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_START);
for(ObjectMgr::ArenaTeamMap::iterator titr = objmgr.GetArenaTeamMapBegin(); titr != objmgr.GetArenaTeamMapEnd(); ++titr)
{
if(ArenaTeam * at = titr->second)
@@ -1590,12 +1686,12 @@ void BattleGroundMgr::DistributeArenaPoints()
}
}
- sWorld.SendGlobalText("Modification done.", NULL);
+ sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_TEAM_END);
- sWorld.SendGlobalText("Done flushing Arena points.", NULL);
+ sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_END);
}
-void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, uint64 guid, Player* plr, uint32 bgTypeId)
+void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player* plr, BattleGroundTypeId bgTypeId)
{
uint32 PlayerLevel = 10;
@@ -1651,7 +1747,7 @@ void BattleGroundMgr::SendToBattleGround(Player *pl, uint32 instanceId)
}
}
-void BattleGroundMgr::SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, uint64 guid)
+void BattleGroundMgr::SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, const uint64& guid)
{
WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12);
uint32 time_ = 30000 - bg->GetLastResurrectTime(); // resurrect every 30 seconds
@@ -1661,14 +1757,7 @@ void BattleGroundMgr::SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *
pl->GetSession()->SendPacket(&data);
}
-void BattleGroundMgr::RemoveBattleGround(uint32 instanceID)
-{
- BattleGroundSet::iterator itr = m_BattleGrounds.find(instanceID);
- if(itr!=m_BattleGrounds.end())
- m_BattleGrounds.erase(itr);
-}
-
-bool BattleGroundMgr::IsArenaType(uint32 bgTypeId) const
+bool BattleGroundMgr::IsArenaType(BattleGroundTypeId bgTypeId)
{
return ( bgTypeId == BATTLEGROUND_AA ||
bgTypeId == BATTLEGROUND_BE ||
@@ -1676,96 +1765,165 @@ bool BattleGroundMgr::IsArenaType(uint32 bgTypeId) const
bgTypeId == BATTLEGROUND_RL );
}
-bool BattleGroundMgr::IsBattleGroundType(uint32 bgTypeId) const
-{
- return !IsArenaType(bgTypeId);
-}
-
-uint32 BattleGroundMgr::BGQueueTypeId(uint32 bgTypeId, uint8 arenaType) const
+BattleGroundQueueTypeId BattleGroundMgr::BGQueueTypeId(BattleGroundTypeId bgTypeId, uint8 arenaType)
{
switch(bgTypeId)
{
- case BATTLEGROUND_WS:
- return BATTLEGROUND_QUEUE_WS;
- case BATTLEGROUND_AB:
- return BATTLEGROUND_QUEUE_AB;
- case BATTLEGROUND_AV:
- return BATTLEGROUND_QUEUE_AV;
- case BATTLEGROUND_EY:
- return BATTLEGROUND_QUEUE_EY;
- case BATTLEGROUND_AA:
- case BATTLEGROUND_NA:
- case BATTLEGROUND_RL:
- case BATTLEGROUND_BE:
- switch(arenaType)
- {
- case ARENA_TYPE_2v2:
- return BATTLEGROUND_QUEUE_2v2;
- case ARENA_TYPE_3v3:
- return BATTLEGROUND_QUEUE_3v3;
- case ARENA_TYPE_5v5:
- return BATTLEGROUND_QUEUE_5v5;
+ case BATTLEGROUND_WS:
+ return BATTLEGROUND_QUEUE_WS;
+ case BATTLEGROUND_AB:
+ return BATTLEGROUND_QUEUE_AB;
+ case BATTLEGROUND_AV:
+ return BATTLEGROUND_QUEUE_AV;
+ case BATTLEGROUND_EY:
+ return BATTLEGROUND_QUEUE_EY;
+ case BATTLEGROUND_SA:
+ return BATTLEGROUND_QUEUE_SA;
+ case BATTLEGROUND_AA:
+ case BATTLEGROUND_NA:
+ case BATTLEGROUND_RL:
+ case BATTLEGROUND_BE:
+ case BATTLEGROUND_DS:
+ case BATTLEGROUND_RV:
+ switch(arenaType)
+ {
+ case ARENA_TYPE_2v2:
+ return BATTLEGROUND_QUEUE_2v2;
+ case ARENA_TYPE_3v3:
+ return BATTLEGROUND_QUEUE_3v3;
+ case ARENA_TYPE_5v5:
+ return BATTLEGROUND_QUEUE_5v5;
+ default:
+ return BATTLEGROUND_QUEUE_NONE;
+ }
default:
- return 0;
- }
- default:
- return 0;
+ return BATTLEGROUND_QUEUE_NONE;
}
}
-uint32 BattleGroundMgr::BGTemplateId(uint32 bgQueueTypeId) const
+BattleGroundTypeId BattleGroundMgr::BGTemplateId(BattleGroundQueueTypeId bgQueueTypeId)
{
switch(bgQueueTypeId)
{
- case BATTLEGROUND_QUEUE_WS:
- return BATTLEGROUND_WS;
- case BATTLEGROUND_QUEUE_AB:
- return BATTLEGROUND_AB;
- case BATTLEGROUND_QUEUE_AV:
- return BATTLEGROUND_AV;
- case BATTLEGROUND_QUEUE_EY:
- return BATTLEGROUND_EY;
- case BATTLEGROUND_QUEUE_2v2:
- case BATTLEGROUND_QUEUE_3v3:
- case BATTLEGROUND_QUEUE_5v5:
- return BATTLEGROUND_AA;
- default:
- return 0;
+ case BATTLEGROUND_QUEUE_WS:
+ return BATTLEGROUND_WS;
+ case BATTLEGROUND_QUEUE_AB:
+ return BATTLEGROUND_AB;
+ case BATTLEGROUND_QUEUE_AV:
+ return BATTLEGROUND_AV;
+ case BATTLEGROUND_QUEUE_EY:
+ return BATTLEGROUND_EY;
+ case BATTLEGROUND_QUEUE_SA:
+ return BATTLEGROUND_SA;
+ case BATTLEGROUND_QUEUE_2v2:
+ case BATTLEGROUND_QUEUE_3v3:
+ case BATTLEGROUND_QUEUE_5v5:
+ return BATTLEGROUND_AA;
+ default:
+ return BattleGroundTypeId(0); // used for unknown template (it existed and do nothing)
}
}
-uint8 BattleGroundMgr::BGArenaType(uint32 bgQueueTypeId) const
+uint8 BattleGroundMgr::BGArenaType(BattleGroundQueueTypeId bgQueueTypeId)
{
switch(bgQueueTypeId)
{
- case BATTLEGROUND_QUEUE_2v2:
- return ARENA_TYPE_2v2;
- case BATTLEGROUND_QUEUE_3v3:
- return ARENA_TYPE_3v3;
- case BATTLEGROUND_QUEUE_5v5:
- return ARENA_TYPE_5v5;
- default:
- return 0;
+ case BATTLEGROUND_QUEUE_2v2:
+ return ARENA_TYPE_2v2;
+ case BATTLEGROUND_QUEUE_3v3:
+ return ARENA_TYPE_3v3;
+ case BATTLEGROUND_QUEUE_5v5:
+ return ARENA_TYPE_5v5;
+ default:
+ return 0;
}
}
+void BattleGroundMgr::ToggleTesting()
+{
+ m_Testing = !m_Testing;
+ if(m_Testing)
+ sWorld.SendWorldText(LANG_DEBUG_BG_ON);
+ else
+ sWorld.SendWorldText(LANG_DEBUG_BG_OFF);
+}
+
void BattleGroundMgr::ToggleArenaTesting()
{
m_ArenaTesting = !m_ArenaTesting;
if(m_ArenaTesting)
- sWorld.SendGlobalText("Arenas are set to 1v1 for debugging. So, don't join as group.", NULL);
+ sWorld.SendWorldText(LANG_DEBUG_ARENA_ON);
else
- sWorld.SendGlobalText("Arenas are set to normal playercount.", NULL);
+ sWorld.SendWorldText(LANG_DEBUG_ARENA_OFF);
}
void BattleGroundMgr::SetHolidayWeekends(uint32 mask)
{
- for(uint32 bgtype = 1; bgtype <= 8; ++bgtype)
+ for(uint32 bgtype = 1; bgtype < MAX_BATTLEGROUND_TYPE_ID; ++bgtype)
{
- if(BattleGround * bg = GetBattleGroundTemplate(bgtype))
+ if(BattleGround * bg = GetBattleGroundTemplate(BattleGroundTypeId(bgtype)))
{
bg->SetHoliday(mask & (1 << bgtype));
}
}
}
+uint32 BattleGroundMgr::GetMaxRatingDifference() const
+{
+ return sWorld.getConfig(CONFIG_ARENA_MAX_RATING_DIFFERENCE);
+}
+
+uint32 BattleGroundMgr::GetRatingDiscardTimer() const
+{
+ return sWorld.getConfig(CONFIG_ARENA_RATING_DISCARD_TIMER);
+}
+
+uint32 BattleGroundMgr::GetPrematureFinishTime() const
+{
+ return sWorld.getConfig(CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER);
+}
+
+void BattleGroundMgr::LoadBattleMastersEntry()
+{
+ mBattleMastersMap.clear(); // need for reload case
+
+ QueryResult *result = WorldDatabase.Query( "SELECT entry,bg_template FROM battlemaster_entry" );
+
+ uint32 count = 0;
+
+ if( !result )
+ {
+ barGoLink bar( 1 );
+ bar.step();
+
+ sLog.outString();
+ sLog.outString( ">> Loaded 0 battlemaster entries - table is empty!" );
+ return;
+ }
+
+ barGoLink bar( result->GetRowCount() );
+
+ do
+ {
+ ++count;
+ bar.step();
+
+ Field *fields = result->Fetch();
+
+ uint32 entry = fields[0].GetUInt32();
+ uint32 bgTypeId = fields[1].GetUInt32();
+ if (!sBattlemasterListStore.LookupEntry(bgTypeId))
+ {
+ sLog.outErrorDb("Table `battlemaster_entry` contain entry %u for not existed battleground type %u, ignored.",entry,bgTypeId);
+ continue;
+ }
+
+ mBattleMastersMap[entry] = BattleGroundTypeId(bgTypeId);
+
+ } while( result->NextRow() );
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u battlemaster entries", count );
+}
diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h
index 5edcc1457d3..11ff62ab37f 100644
--- a/src/game/BattleGroundMgr.h
+++ b/src/game/BattleGroundMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -21,10 +21,8 @@
#ifndef __BATTLEGROUNDMGR_H
#define __BATTLEGROUNDMGR_H
+#include "Common.h"
#include "BattleGround.h"
-#include "Policies/Singleton.h"
-
-class BattleGround;
//TODO it is not possible to have this structure, because we should have BattlegroundSet for each queue
//so i propose to change this type to array 1..MAX_BATTLEGROUND_TYPES of sets or maps..
@@ -32,13 +30,13 @@ typedef std::map<uint32, BattleGround*> BattleGroundSet;
//typedef std::map<uint32, BattleGroundQueue*> BattleGroundQueueSet;
typedef std::deque<BattleGround*> BGFreeSlotQueueType;
-#define MAX_BATTLEGROUND_QUEUES 7 // for level ranges 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70+
+typedef UNORDERED_MAP<uint32, BattleGroundTypeId> BattleMastersMap;
-#define MAX_BATTLEGROUND_TYPES 9 // each BG type will be in array
+#define MAX_BATTLEGROUND_QUEUES 8 // for level ranges 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80+
-#define MAX_BATTLEGROUND_QUEUE_TYPES 8
+#define MAX_BATTLEGROUND_QUEUE_TYPES 9
-#define BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY 86400 // seconds in a day
+#define BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY 86400 // seconds in a day
struct GroupQueueInfo; // type predefinition
struct PlayerQueueInfo // stores information for players in queue
@@ -53,7 +51,7 @@ struct GroupQueueInfo // stores informatio
{
std::map<uint64, PlayerQueueInfo*> Players; // player queue info map
uint32 Team; // Player team (ALLIANCE/HORDE)
- uint32 BgTypeId; // battleground type id
+ BattleGroundTypeId BgTypeId; // battleground type id
bool IsRated; // rated
uint8 ArenaType; // 2v2, 3v3, 5v5 or 0 when BG
uint32 ArenaTeamId; // team id if rated match
@@ -70,13 +68,14 @@ class BattleGroundQueue
BattleGroundQueue();
~BattleGroundQueue();
- void Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype = 0, bool isRated = false, uint32 minRating = 0);
+ void Update(BattleGroundTypeId bgTypeId, uint32 queue_id, uint8 arenatype = 0, bool isRated = false, uint32 minRating = 0);
- GroupQueueInfo * AddGroup(Player * leader, uint32 BgTypeId, uint8 ArenaType, bool isRated, uint32 ArenaRating, uint32 ArenaTeamId = 0);
+ GroupQueueInfo * AddGroup(Player * leader, BattleGroundTypeId bgTypeId, uint8 ArenaType, bool isRated, uint32 ArenaRating, uint32 ArenaTeamId = 0);
void AddPlayer(Player *plr, GroupQueueInfo *ginfo);
- void RemovePlayer(uint64 guid, bool decreaseInvitedCount);
+ void RemovePlayer(const uint64& guid, bool decreaseInvitedCount);
void DecreaseGroupLength(uint32 queueId, uint32 AsGroup);
void BGEndedRemoveInvites(BattleGround * bg);
+ void AnnounceWorld(GroupQueueInfo *ginfo, const uint64& playerGUID, bool isAddedToQueue);
typedef std::map<uint64, PlayerQueueInfo> QueuedPlayersMap;
QueuedPlayersMap m_QueuedPlayers[MAX_BATTLEGROUND_QUEUES];
@@ -88,7 +87,7 @@ class BattleGroundQueue
class EligibleGroups : public std::list<GroupQueueInfo *>
{
public:
- void Init(QueuedGroupsList * source, uint32 BgTypeId, uint32 side, uint32 MaxPlayers, uint8 ArenaType = 0, bool IsRated = false, uint32 MinRating = 0, uint32 MaxRating = 0, uint32 DisregardTime = 0, uint32 excludeTeam = 0);
+ void Init(QueuedGroupsList * source, BattleGroundTypeId BgTypeId, uint32 side, uint32 MaxPlayers, uint8 ArenaType = 0, bool IsRated = false, uint32 MinRating = 0, uint32 MaxRating = 0, uint32 DisregardTime = 0, uint32 excludeTeam = 0);
};
EligibleGroups m_EligibleGroups;
@@ -123,7 +122,7 @@ class BattleGroundQueue
SelectionPool m_SelectionPools[NUM_SELECTION_POOL_TYPES];
- bool BuildSelectionPool(uint32 bgTypeId, uint32 queue_id, uint32 MinPlayers, uint32 MaxPlayers, SelectionPoolBuildMode mode, uint8 ArenaType = 0, bool isRated = false, uint32 MinRating = 0, uint32 MaxRating = 0, uint32 DisregardTime = 0, uint32 excludeTeam = 0);
+ bool BuildSelectionPool(BattleGroundTypeId bgTypeId, uint32 queue_id, uint32 MinPlayers, uint32 MaxPlayers, SelectionPoolBuildMode mode, uint8 ArenaType = 0, bool isRated = false, uint32 MinRating = 0, uint32 MaxRating = 0, uint32 DisregardTime = 0, uint32 excludeTeam = 0);
private:
@@ -137,7 +136,7 @@ class BattleGroundQueue
class BGQueueInviteEvent : public BasicEvent
{
public:
- BGQueueInviteEvent(uint64 pl_guid, uint32 BgInstanceGUID) : m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID) {};
+ BGQueueInviteEvent(const uint64& pl_guid, uint32 BgInstanceGUID) : m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID) {};
virtual ~BGQueueInviteEvent() {};
virtual bool Execute(uint64 e_time, uint32 p_time);
@@ -153,7 +152,10 @@ class BGQueueInviteEvent : public BasicEvent
class BGQueueRemoveEvent : public BasicEvent
{
public:
- BGQueueRemoveEvent(uint64 pl_guid, uint32 bgInstanceGUID, uint32 playersTeam) : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_PlayersTeam(playersTeam) {};
+ BGQueueRemoveEvent(const uint64& pl_guid, uint32 bgInstanceGUID, uint32 playersTeam) :
+ m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_PlayersTeam(playersTeam)
+ {
+ };
virtual ~BGQueueRemoveEvent() {};
virtual bool Execute(uint64 e_time, uint32 p_time);
@@ -170,83 +172,89 @@ class BattleGroundMgr
/* Construction */
BattleGroundMgr();
~BattleGroundMgr();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* Packet Building */
void BuildPlayerJoinedBattleGroundPacket(WorldPacket *data, Player *plr);
void BuildPlayerLeftBattleGroundPacket(WorldPacket *data, Player *plr);
- void BuildBattleGroundListPacket(WorldPacket *data, uint64 guid, Player *plr, uint32 bgTypeId);
- void BuildGroupJoinedBattlegroundPacket(WorldPacket *data, uint32 bgTypeId);
+ void BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player *plr, BattleGroundTypeId bgTypeId);
+ void BuildGroupJoinedBattlegroundPacket(WorldPacket *data, BattleGroundTypeId bgTypeId);
void BuildUpdateWorldStatePacket(WorldPacket *data, uint32 field, uint32 value);
void BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg);
void BuildBattleGroundStatusPacket(WorldPacket *data, BattleGround *bg, uint32 team, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint32 arenatype = 0, uint8 israted = 0);
void BuildPlaySoundPacket(WorldPacket *data, uint32 soundid);
+ void SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, const uint64& guid);
/* Player invitation */
// called from Queue update, or from Addplayer to queue
void InvitePlayer(Player* plr, uint32 bgInstanceGUID, uint32 team);
/* Battlegrounds */
BattleGroundSet::iterator GetBattleGroundsBegin() { return m_BattleGrounds.begin(); };
- BattleGroundSet::iterator GetBattleGroundsEnd() { return m_BattleGrounds.end(); };
+ BattleGroundSet::iterator GetBattleGroundsEnd() { return m_BattleGrounds.end(); };
- BattleGround* GetBattleGround(uint32 ID)
+ BattleGround* GetBattleGround(uint32 InstanceID)
{
- BattleGroundSet::iterator i = m_BattleGrounds.find(ID);
- if(i != m_BattleGrounds.end())
- return i->second;
- else
- return NULL;
+ BattleGroundSet::iterator i = m_BattleGrounds.find(InstanceID);
+ return ( (i != m_BattleGrounds.end()) ? i->second : NULL );
};
- BattleGround * GetBattleGroundTemplate(uint32 bgTypeId);
- BattleGround * CreateNewBattleGround(uint32 bgTypeId);
+ BattleGround * GetBattleGroundTemplate(BattleGroundTypeId bgTypeId);
+ BattleGround * CreateNewBattleGround(BattleGroundTypeId bgTypeId);
- uint32 CreateBattleGround(uint32 bgTypeId, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO);
+ uint32 CreateBattleGround(BattleGroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char* BattleGroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO);
- inline void AddBattleGround(uint32 ID, BattleGround* BG) { m_BattleGrounds[ID] = BG; };
- void RemoveBattleGround(uint32 instanceID);
+ void AddBattleGround(uint32 InstanceID, BattleGround* BG) { m_BattleGrounds[InstanceID] = BG; };
+ void RemoveBattleGround(uint32 instanceID) { m_BattleGrounds.erase(instanceID); }
void CreateInitialBattleGrounds();
+ void DeleteAlllBattleGrounds();
- void SendToBattleGround(Player *pl, uint32 bgTypeId);
+ void SendToBattleGround(Player *pl, uint32 InstanceID);
/* Battleground queues */
//these queues are instantiated when creating BattlegroundMrg
BattleGroundQueue m_BattleGroundQueues[MAX_BATTLEGROUND_QUEUE_TYPES]; // public, because we need to access them in BG handler code
- BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPES];
-
- void SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, uint64 guid);
+ BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPE_ID];
- bool IsArenaType(uint32 bgTypeId) const;
- bool IsBattleGroundType(uint32 bgTypeId) const;
- uint32 BGQueueTypeId(uint32 bgTypeId, uint8 arenaType) const;
- uint32 BGTemplateId(uint32 bgQueueTypeId) const;
- uint8 BGArenaType(uint32 bgQueueTypeId) const;
-
- uint32 GetMaxRatingDifference() const {return m_MaxRatingDifference;}
- uint32 GetRatingDiscardTimer() const {return m_RatingDiscardTimer;}
+ uint32 GetMaxRatingDifference() const;
+ uint32 GetRatingDiscardTimer() const;
+ uint32 GetPrematureFinishTime() const;
void InitAutomaticArenaPointDistribution();
void DistributeArenaPoints();
- uint32 GetPrematureFinishTime() const {return m_PrematureFinishTimer;}
void ToggleArenaTesting();
- const bool isArenaTesting() const { return m_ArenaTesting; }
+ void ToggleTesting();
void SetHolidayWeekends(uint32 mask);
+ void LoadBattleMastersEntry();
+ BattleGroundTypeId GetBattleMasterBG(uint32 entry) const
+ {
+ BattleMastersMap::const_iterator itr = mBattleMastersMap.find(entry);
+ if(itr != mBattleMastersMap.end())
+ return itr->second;
+ return BATTLEGROUND_WS;
+ }
+
+ bool isArenaTesting() const { return m_ArenaTesting; }
+ bool isTesting() const { return m_Testing; }
+
+ static bool IsArenaType(BattleGroundTypeId bgTypeId);
+ static bool IsBattleGroundType(BattleGroundTypeId bgTypeId) { return !BattleGroundMgr::IsArenaType(bgTypeId); }
+ static BattleGroundQueueTypeId BGQueueTypeId(BattleGroundTypeId bgTypeId, uint8 arenaType);
+ static BattleGroundTypeId BGTemplateId(BattleGroundQueueTypeId bgQueueTypeId);
+ static uint8 BGArenaType(BattleGroundQueueTypeId bgQueueTypeId);
private:
+ BattleMastersMap mBattleMastersMap;
/* Battlegrounds */
BattleGroundSet m_BattleGrounds;
- uint32 m_MaxRatingDifference;
- uint32 m_RatingDiscardTimer;
uint32 m_NextRatingDiscardUpdate;
- bool m_AutoDistributePoints;
uint64 m_NextAutoDistributionTime;
uint32 m_AutoDistributionTimeChecker;
- uint32 m_PrematureFinishTimer;
bool m_ArenaTesting;
+ bool m_Testing;
};
#define sBattleGroundMgr Trinity::Singleton<BattleGroundMgr>::Instance()
diff --git a/src/game/BattleGroundNA.cpp b/src/game/BattleGroundNA.cpp
index 5debaa3c6a5..007ff659020 100644
--- a/src/game/BattleGroundNA.cpp
+++ b/src/game/BattleGroundNA.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -25,6 +25,7 @@
#include "Creature.h"
#include "ObjectMgr.h"
#include "MapManager.h"
+#include "WorldPacket.h"
#include "Language.h"
BattleGroundNA::BattleGroundNA()
@@ -37,7 +38,7 @@ BattleGroundNA::~BattleGroundNA()
}
-void BattleGroundNA::Update(time_t diff)
+void BattleGroundNA::Update(uint32 diff)
{
BattleGround::Update(diff);
@@ -194,9 +195,10 @@ void BattleGroundNA::FillInitialWorldStates(WorldPacket &data)
data << uint32(0xa11) << uint32(1); // 9
}
-void BattleGroundNA::ResetBGSubclass()
+void BattleGroundNA::Reset()
{
-
+ //call parent's class reset
+ BattleGround::Reset();
}
bool BattleGroundNA::SetupBattleGround()
diff --git a/src/game/BattleGroundNA.h b/src/game/BattleGroundNA.h
index ae419b9fc44..8adef0a131b 100644
--- a/src/game/BattleGroundNA.h
+++ b/src/game/BattleGroundNA.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -58,7 +58,7 @@ class BattleGroundNA : public BattleGround
public:
BattleGroundNA();
~BattleGroundNA();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
@@ -66,7 +66,7 @@ class BattleGroundNA : public BattleGround
void RemovePlayer(Player *plr, uint64 guid);
void HandleAreaTrigger(Player *Source, uint32 Trigger);
bool SetupBattleGround();
- virtual void ResetBGSubclass();
+ virtual void Reset();
virtual void FillInitialWorldStates(WorldPacket &d);
void HandleKillPlayer(Player* player, Player *killer);
bool HandlePlayerUnderMap(Player * plr);
diff --git a/src/game/BattleGroundRL.cpp b/src/game/BattleGroundRL.cpp
index 6d68403fe4c..501ee704948 100644
--- a/src/game/BattleGroundRL.cpp
+++ b/src/game/BattleGroundRL.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -26,6 +26,7 @@
#include "ObjectMgr.h"
#include "MapManager.h"
#include "Language.h"
+#include "WorldPacket.h"
BattleGroundRL::BattleGroundRL()
{
@@ -37,7 +38,7 @@ BattleGroundRL::~BattleGroundRL()
}
-void BattleGroundRL::Update(time_t diff)
+void BattleGroundRL::Update(uint32 diff)
{
BattleGround::Update(diff);
@@ -196,9 +197,10 @@ void BattleGroundRL::FillInitialWorldStates(WorldPacket &data)
data << uint32(0xbba) << uint32(1); // 9
}
-void BattleGroundRL::ResetBGSubclass()
+void BattleGroundRL::Reset()
{
-
+ //call parent's reset
+ BattleGround::Reset();
}
bool BattleGroundRL::SetupBattleGround()
diff --git a/src/game/BattleGroundRL.h b/src/game/BattleGroundRL.h
index 599cb53dc63..abb6b25d4ff 100644
--- a/src/game/BattleGroundRL.h
+++ b/src/game/BattleGroundRL.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -54,16 +54,16 @@ class BattleGroundRL : public BattleGround
public:
BattleGroundRL();
~BattleGroundRL();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
+ virtual void Reset();
+ virtual void FillInitialWorldStates(WorldPacket &d);
void RemovePlayer(Player *plr, uint64 guid);
void HandleAreaTrigger(Player *Source, uint32 Trigger);
bool SetupBattleGround();
- virtual void ResetBGSubclass();
- virtual void FillInitialWorldStates(WorldPacket &d);
void HandleKillPlayer(Player* player, Player *killer);
bool HandlePlayerUnderMap(Player * plr);
};
diff --git a/src/game/BattleGroundRV.cpp b/src/game/BattleGroundRV.cpp
new file mode 100644
index 00000000000..a66f0ce30e2
--- /dev/null
+++ b/src/game/BattleGroundRV.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Player.h"
+#include "BattleGround.h"
+#include "BattleGroundRV.h"
+
+BattleGroundRV::BattleGroundRV()
+{
+
+}
+
+BattleGroundRV::~BattleGroundRV()
+{
+
+}
+
+void BattleGroundRV::Update(uint32 diff)
+{
+ BattleGround::Update(diff);
+}
+
+void BattleGroundRV::AddPlayer(Player *plr)
+{
+ BattleGround::AddPlayer(plr);
+ //create score and add it to map, default values are set in constructor
+ BattleGroundRVScore* sc = new BattleGroundRVScore;
+
+ m_PlayerScores[plr->GetGUID()] = sc;
+}
+
+void BattleGroundRV::RemovePlayer(Player * /*plr*/, uint64 /*guid*/)
+{
+}
+
+void BattleGroundRV::HandleKillPlayer(Player* player, Player* killer)
+{
+ BattleGround::HandleKillPlayer(player, killer);
+}
+
+void BattleGroundRV::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/)
+{
+}
+
+bool BattleGroundRV::SetupBattleGround()
+{
+ return true;
+}
diff --git a/src/game/BattleGroundRV.h b/src/game/BattleGroundRV.h
new file mode 100644
index 00000000000..2d2ad12c941
--- /dev/null
+++ b/src/game/BattleGroundRV.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef __BATTLEGROUNDRV_H
+#define __BATTLEGROUNDRV_H
+
+class BattleGround;
+
+class BattleGroundRVScore : public BattleGroundScore
+{
+ public:
+ BattleGroundRVScore() {};
+ virtual ~BattleGroundRVScore() {};
+ //TODO fix me
+};
+
+class BattleGroundRV : public BattleGround
+{
+ friend class BattleGroundMgr;
+
+ public:
+ BattleGroundRV();
+ ~BattleGroundRV();
+ void Update(uint32 diff);
+
+ /* inherited from BattlegroundClass */
+ virtual void AddPlayer(Player *plr);
+ void RemovePlayer(Player *plr, uint64 guid);
+ void HandleAreaTrigger(Player *Source, uint32 Trigger);
+ bool SetupBattleGround();
+ void HandleKillPlayer(Player* player, Player *killer);
+};
+#endif
diff --git a/src/game/BattleGroundSA.cpp b/src/game/BattleGroundSA.cpp
new file mode 100644
index 00000000000..d5585fd93e9
--- /dev/null
+++ b/src/game/BattleGroundSA.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "BattleGround.h"
+#include "BattleGroundSA.h"
+#include "Player.h"
+
+BattleGroundSA::BattleGroundSA()
+{
+
+}
+
+BattleGroundSA::~BattleGroundSA()
+{
+
+}
+
+void BattleGroundSA::Update(uint32 diff)
+{
+ BattleGround::Update(diff);
+}
+
+void BattleGroundSA::AddPlayer(Player *plr)
+{
+ BattleGround::AddPlayer(plr);
+ //create score and add it to map, default values are set in constructor
+ BattleGroundSAScore* sc = new BattleGroundSAScore;
+
+ m_PlayerScores[plr->GetGUID()] = sc;
+}
+
+void BattleGroundSA::RemovePlayer(Player* /*plr*/,uint64 /*guid*/)
+{
+
+}
+
+void BattleGroundSA::HandleAreaTrigger(Player *Source, uint32 Trigger)
+{
+ // this is wrong way to implement these things. On official it done by gameobject spell cast.
+ if(GetStatus() != STATUS_IN_PROGRESS)
+ return;
+}
+
+void BattleGroundSA::UpdatePlayerScore(Player* Source, uint32 type, uint32 value)
+{
+
+ std::map<uint64, BattleGroundScore*>::iterator itr = m_PlayerScores.find(Source->GetGUID());
+
+ if(itr == m_PlayerScores.end()) // player not found...
+ return;
+
+ BattleGround::UpdatePlayerScore(Source,type,value);
+}
diff --git a/src/game/BattleGroundSA.h b/src/game/BattleGroundSA.h
new file mode 100644
index 00000000000..331a41455fd
--- /dev/null
+++ b/src/game/BattleGroundSA.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __BATTLEGROUNDSA_H
+#define __BATTLEGROUNDSA_H
+
+class BattleGround;
+
+class BattleGroundSAScore : public BattleGroundScore
+{
+ public:
+ BattleGroundSAScore() {};
+ virtual ~BattleGroundSAScore() {};
+};
+
+class BattleGroundSA : public BattleGround
+{
+ friend class BattleGroundMgr;
+
+ public:
+ BattleGroundSA();
+ ~BattleGroundSA();
+ void Update(uint32 diff);
+
+ /* inherited from BattlegroundClass */
+ virtual void AddPlayer(Player *plr);
+
+ void RemovePlayer(Player *plr,uint64 guid);
+ void HandleAreaTrigger(Player *Source, uint32 Trigger);
+ //bool SetupBattleGround();
+
+ /* Scorekeeping */
+ void UpdatePlayerScore(Player *Source, uint32 type, uint32 value);
+
+ private:
+};
+#endif
diff --git a/src/game/BattleGroundWS.cpp b/src/game/BattleGroundWS.cpp
index 500b00feb46..93b5659a0b9 100644
--- a/src/game/BattleGroundWS.cpp
+++ b/src/game/BattleGroundWS.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -26,6 +26,8 @@
#include "GameObject.h"
#include "Chat.h"
#include "MapManager.h"
+#include "ObjectMgr.h"
+#include "WorldPacket.h"
#include "Language.h"
#include "World.h"
@@ -58,7 +60,7 @@ BattleGroundWS::~BattleGroundWS()
{
}
-void BattleGroundWS::Update(time_t diff)
+void BattleGroundWS::Update(uint32 diff)
{
BattleGround::Update(diff);
@@ -652,8 +654,11 @@ bool BattleGroundWS::SetupBattleGround()
return true;
}
-void BattleGroundWS::ResetBGSubclass()
+void BattleGroundWS::Reset()
{
+ //call parent's class reset
+ BattleGround::Reset();
+
m_FlagKeepers[BG_TEAM_ALLIANCE] = 0;
m_FlagKeepers[BG_TEAM_HORDE] = 0;
m_DroppedFlagGUID[BG_TEAM_ALLIANCE] = 0;
diff --git a/src/game/BattleGroundWS.h b/src/game/BattleGroundWS.h
index 61898f92255..732c078d2f3 100644
--- a/src/game/BattleGroundWS.h
+++ b/src/game/BattleGroundWS.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -136,7 +136,7 @@ class BattleGroundWS : public BattleGround
/* Construction */
BattleGroundWS();
~BattleGroundWS();
- void Update(time_t diff);
+ void Update(uint32 diff);
/* inherited from BattlegroundClass */
virtual void AddPlayer(Player *plr);
@@ -161,7 +161,7 @@ class BattleGroundWS : public BattleGround
void HandleAreaTrigger(Player *Source, uint32 Trigger);
void HandleKillPlayer(Player *player, Player *killer);
bool SetupBattleGround();
- virtual void ResetBGSubclass();
+ virtual void Reset();
void UpdateFlagState(uint32 team, uint32 value);
void UpdateTeamScore(uint32 team);
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt
index bcd85792b04..7d2d60fa28a 100644
--- a/src/game/CMakeLists.txt
+++ b/src/game/CMakeLists.txt
@@ -4,6 +4,8 @@
SET(game_STAT_SRCS
AccountMgr.cpp
AccountMgr.h
+ AchievementMgr.h
+ AchievementMgr.cpp
AddonHandler.cpp
AddonHandler.h
AggressorAI.cpp
@@ -12,10 +14,11 @@ SET(game_STAT_SRCS
ArenaTeam.cpp
ArenaTeam.h
ArenaTeamHandler.cpp
- AuctionHouse.cpp
+ AuctionHouseHandler.cpp
AuctionHouseBot.cpp
AuctionHouseBot.h
- AuctionHouseObject.h
+ AuctionHouseMgr.cpp
+ AuctionHouseMgr.h
Bag.cpp
Bag.h
BattleGround.cpp
@@ -23,22 +26,31 @@ SET(game_STAT_SRCS
BattleGroundAB.cpp
BattleGroundAV.cpp
BattleGroundBE.cpp
+ BattleGroundDS.cpp
BattleGroundEY.cpp
BattleGroundNA.cpp
BattleGroundRL.cpp
+ BattleGroundRV.cpp
+ BattleGroundSA.cpp
BattleGroundWS.cpp
BattleGround.h
BattleGroundAA.h
BattleGroundAB.h
BattleGroundAV.h
BattleGroundBE.h
+ BattleGroundDS.h
BattleGroundEY.h
BattleGroundNA.h
BattleGroundRL.h
+ BattleGroundRV.h
+ BattleGroundSA.h
BattleGroundWS.h
BattleGroundHandler.cpp
BattleGroundMgr.cpp
BattleGroundMgr.h
+ Calendar.cpp
+ Calendar.h
+ CalendarHandler.cpp
Cell.h
CellImpl.h
Channel.cpp
@@ -130,6 +142,8 @@ SET(game_STAT_SRCS
MapInstanced.h
MapManager.cpp
MapManager.h
+ MapReference.h
+ MapRefManager.h
MiscHandler.cpp
MotionMaster.cpp
MotionMaster.h
@@ -150,6 +164,8 @@ SET(game_STAT_SRCS
Object.h
ObjectMgr.cpp
ObjectMgr.h
+ ObjectPosSelector.cpp
+ ObjectPosSelector.h
Opcodes.cpp
Opcodes.h
OutdoorPvP.cpp
@@ -183,6 +199,8 @@ SET(game_STAT_SRCS
PlayerDump.h
PointMovementGenerator.cpp
PointMovementGenerator.h
+ PoolHandler.cpp
+ PoolHandler.h
PossessedAI.cpp
PossessedAI.h
QueryHandler.cpp
@@ -240,6 +258,8 @@ SET(game_STAT_SRCS
UpdateData.h
UpdateFields.h
UpdateMask.h
+ Vehicle.cpp
+ Vehicle.h
VoiceChatHandler.cpp
WaypointManager.cpp
WaypointManager.h
diff --git a/src/game/Calendar.cpp b/src/game/Calendar.cpp
new file mode 100644
index 00000000000..0c1efb20f87
--- /dev/null
+++ b/src/game/Calendar.cpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
diff --git a/src/game/Calendar.h b/src/game/Calendar.h
new file mode 100644
index 00000000000..7a86afa7db7
--- /dev/null
+++ b/src/game/Calendar.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef MANGOS_CALENDAR_H
+#define MANGOS_CALENDAR_H
+
+class Calendar
+{
+
+};
+#endif
diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp
new file mode 100644
index 00000000000..e9946e1a05e
--- /dev/null
+++ b/src/game/CalendarHandler.cpp
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Common.h"
+#include "Log.h"
+#include "Player.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
+#include "Opcodes.h"
+#include "InstanceSaveMgr.h"
+
+void WorldSession::HandleCalendarGetCalendar(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_GET_CALENDAR");
+ recv_data.hexlike();
+
+ time_t cur_time = time(NULL);
+
+ WorldPacket data(SMSG_CALENDAR_SEND_CALENDAR,4+4*0+4+4*0+4+4);
+
+ // TODO: calendar invite event output
+ data << (uint32) 0; //invite node count
+ // TODO: calendar event output
+ data << (uint32) 0; //event count
+
+ data << (uint32) 0; //wtf??
+ data << (uint32) secsToTimeBitFields(cur_time); // current time
+
+ uint32 counter = 0;
+ size_t p_counter = data.wpos();
+ data << uint32(counter); // instance save count
+
+ for(int i = 0; i < TOTAL_DIFFICULTIES; ++i)
+ {
+ for (Player::BoundInstancesMap::iterator itr = _player->m_boundInstances[i].begin(); itr != _player->m_boundInstances[i].end(); ++itr)
+ {
+ if(itr->second.perm)
+ {
+ InstanceSave *save = itr->second.save;
+ data << uint32(save->GetMapId());
+ data << uint32(save->GetDifficulty());
+ data << uint32(save->GetResetTime() - cur_time);
+ data << uint64(save->GetInstanceId()); // instance save id as unique instance copy id
+ ++counter;
+ }
+ }
+ }
+ data.put<uint32>(p_counter,counter);
+
+ data << (uint32) 1135753200; //wtf?? (28.12.2005 12:00)
+ data << (uint32) 0; // unk counter 4
+ data << (uint32) 0; // unk counter 5
+ //sLog.outDebug("Sending calendar");
+ //data.hexlike();
+ SendPacket(&data);
+}
+
+void WorldSession::HandleCalendarGetEvent(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_GET_EVENT");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarGuildFilter(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_GUILD_FILTER");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarArenaTeam(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_ARENA_TEAM");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarAddEvent(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_ADD_EVENT");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarUpdateEvent(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_UPDATE_EVENT");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarRemoveEvent(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_REMOVE_EVENT");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarCopyEvent(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_COPY_EVENT");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarEventInvite(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_INVITE");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarEventRsvp(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_RSVP");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarEventStatus(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_STATUS");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarComplain(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN");
+ recv_data.hexlike();
+}
+
+void WorldSession::HandleCalendarGetNumPending(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: CMSG_CALENDAR_GET_NUM_PENDING");
+ recv_data.hexlike();
+
+ WorldPacket data(SMSG_CALENDAR_SEND_NUM_PENDING, 4);
+ data << uint32(0); // 0 - no pending invites, 1 - some pending invites
+ SendPacket(&data);
+}
diff --git a/src/game/Cell.h b/src/game/Cell.h
index 160e037bcfb..7e66d5d9f73 100644
--- a/src/game/Cell.h
+++ b/src/game/Cell.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -93,13 +93,13 @@ struct TRINITY_DLL_DECL Cell
y = data.Part.grid_y*MAX_NUMBER_OF_CELLS + data.Part.cell_y;
}
- inline bool DiffCell(const Cell &cell) const
+ bool DiffCell(const Cell &cell) const
{
return( data.Part.cell_x != cell.data.Part.cell_x ||
data.Part.cell_y != cell.data.Part.cell_y );
}
- inline bool DiffGrid(const Cell &cell) const
+ bool DiffGrid(const Cell &cell) const
{
return( data.Part.grid_x != cell.data.Part.grid_x ||
data.Part.grid_y != cell.data.Part.grid_y );
diff --git a/src/game/CellImpl.h b/src/game/CellImpl.h
index 463b051f7ac..e74e0013a19 100644
--- a/src/game/CellImpl.h
+++ b/src/game/CellImpl.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Channel.cpp b/src/game/Channel.cpp
index bf787d7d25d..8d61dd733ea 100644
--- a/src/game/Channel.cpp
+++ b/src/game/Channel.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -24,7 +24,7 @@
#include "SocialMgr.h"
Channel::Channel(const std::string& name, uint32 channel_id)
-: m_name(name), m_announce(true), m_moderate(false), m_channelId(channel_id), m_ownerGUID(0), m_password(""), m_flags(0)
+: m_announce(true), m_moderate(false), m_name(name), m_flags(0), m_channelId(channel_id), m_ownerGUID(0)
{
// set special flags if built-in channel
ChatChannelsEntry const* ch = GetChannelEntryFor(channel_id);
@@ -455,7 +455,7 @@ void Channel::List(Player* player)
// PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
// MODERATOR, GAME MASTER, ADMINISTRATOR can see all
- if( plr && ( plr->GetSession()->GetSecurity() == SEC_PLAYER || gmInWhoList && plr->IsVisibleGloballyFor(player) ) )
+ if (plr && ( plr->GetSession()->GetSecurity() == SEC_PLAYER || (gmInWhoList && plr->IsVisibleGloballyFor(player))))
{
data << uint64(i->first);
data << uint8(i->second.flags); // flags seems to be changed...
@@ -693,12 +693,12 @@ void Channel::SendToOne(WorldPacket *data, uint64 who)
plr->GetSession()->SendPacket(data);
}
-void Channel::Voice(uint64 guid1, uint64 guid2)
+void Channel::Voice(uint64 /*guid1*/, uint64 /*guid2*/)
{
}
-void Channel::DeVoice(uint64 guid1, uint64 guid2)
+void Channel::DeVoice(uint64 /*guid1*/, uint64 /*guid2*/)
{
}
diff --git a/src/game/Channel.h b/src/game/Channel.h
index 82b62df12c4..1e2ecafdc89 100644
--- a/src/game/Channel.h
+++ b/src/game/Channel.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -204,11 +204,8 @@ class Channel
void SendToAllButOne(WorldPacket *data, uint64 who);
void SendToOne(WorldPacket *data, uint64 who);
- bool IsOn(uint64 who) const { return players.count(who) != 0; }
-
- bool IsBanned(const uint64 guid) const {return banned.count(guid) != 0; }
-
- bool IsFirst() const { return !(players.size() > 1); }
+ bool IsOn(uint64 who) const { return players.find(who) != players.end(); }
+ bool IsBanned(uint64 guid) const { return banned.find(guid) != banned.end(); }
uint8 GetPlayerFlags(uint64 p) const
{
diff --git a/src/game/ChannelHandler.cpp b/src/game/ChannelHandler.cpp
index 71e7ea365c2..9b06693c589 100644
--- a/src/game/ChannelHandler.cpp
+++ b/src/game/ChannelHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ChannelMgr.h b/src/game/ChannelMgr.h
index 453ee144d86..66f692ef69c 100644
--- a/src/game/ChannelMgr.h
+++ b/src/game/ChannelMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -40,7 +40,7 @@ class ChannelMgr
}
Channel *GetJoinChannel(const std::string& name, uint32 channel_id)
{
- if(channels.count(name) == 0)
+ if (channels.find(name) == channels.end())
{
Channel *nchan = new Channel(name,channel_id);
channels[name] = nchan;
diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp
index 4aef21df530..d6f2cf0888d 100644
--- a/src/game/CharacterHandler.cpp
+++ b/src/game/CharacterHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -64,11 +64,11 @@ bool LoginQueryHolder::Initialize()
// NOTE: all fields in `characters` must be read to prevent lost character data at next save in case wrong DB structure.
// !!! NOTE: including unused `zone`,`online`
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADFROM, "SELECT guid, account, data, name, race, class, position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeon_difficulty, arena_pending_points FROM characters WHERE guid = '%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADFROM, "SELECT guid, account, data, name, race, class, position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeon_difficulty, arena_pending_points,bgid,bgteam,bgmap,bgx,bgy,bgz,bgo FROM characters WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADGROUP, "SELECT leaderGuid FROM group_member WHERE memberGuid ='%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADBOUNDINSTANCES, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADAURAS, "SELECT caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges FROM character_aura WHERE guid = '%u'", GUID_LOPART(m_guid));
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,slot,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS,"SELECT quest,time FROM character_queststatus_daily WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADTUTORIALS, "SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetAccountId(), realmID);
@@ -85,6 +85,8 @@ bool LoginQueryHolder::Initialize()
// in other case still be dummy query
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADGUILD, "SELECT guildid,rank FROM guild_member WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid));
return res;
}
@@ -234,17 +236,16 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
if (raceEntry->addon > Expansion())
{
data << (uint8)CHAR_CREATE_EXPANSION;
- sLog.outError("Not Expansion 1 account:[%d] but tried to Create character with expansion 1 race (%u)",GetAccountId(),race_);
+ sLog.outError("Expansion %u account:[%d] tried to Create character with expansion %u race (%u)",Expansion(),GetAccountId(),raceEntry->addon,race_);
SendPacket( &data );
return;
}
// prevent character creating Expansion class without Expansion account
- // TODO: use possible addon field in ChrClassesEntry in next dbc version
- if (Expansion() < 2 && class_ == CLASS_DEATH_KNIGHT)
+ if (classEntry->addon > Expansion())
{
- data << (uint8)CHAR_CREATE_EXPANSION;
- sLog.outError("Not Expansion 2 account:[%d] but tried to Create character with expansion 2 class (%u)",GetAccountId(),class_);
+ data << (uint8)CHAR_CREATE_EXPANSION_CLASS;
+ sLog.outError("Expansion %u account:[%d] tried to Create character with expansion %u class (%u)",Expansion(),GetAccountId(),classEntry->addon,class_);
SendPacket( &data );
return;
}
@@ -311,29 +312,77 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
}
}
+ // speedup check for heroic class disabled case
+ uint32 heroic_free_slots = sWorld.getConfig(CONFIG_HEROIC_CHARACTERS_PER_REALM);
+ if(heroic_free_slots==0 && GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)
+ {
+ data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT;
+ SendPacket( &data );
+ return;
+ }
+
+ // speedup check for heroic class disabled case
+ uint32 req_level_for_heroic = sWorld.getConfig(CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING);
+ if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && req_level_for_heroic > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
+ {
+ data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT;
+ SendPacket( &data );
+ return;
+ }
+
bool AllowTwoSideAccounts = !sWorld.IsPvPRealm() || sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS) || GetSecurity() > SEC_PLAYER;
uint32 skipCinematics = sWorld.getConfig(CONFIG_SKIP_CINEMATICS);
bool have_same_race = false;
- if(!AllowTwoSideAccounts || skipCinematics == 1)
+
+ // if 0 then allowed creating without any characters
+ bool have_req_level_for_heroic = (req_level_for_heroic==0);
+
+ if(!AllowTwoSideAccounts || skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT)
{
- QueryResult *result2 = CharacterDatabase.PQuery("SELECT DISTINCT race FROM characters WHERE account = '%u' %s", GetAccountId(),skipCinematics == 1 ? "" : "LIMIT 1");
+ QueryResult *result2 = CharacterDatabase.PQuery("SELECT guid,race,class FROM characters WHERE account = '%u' %s",
+ GetAccountId(), (skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT) ? "" : "LIMIT 1");
if(result2)
{
uint32 team_= Player::TeamForRace(race_);
Field* field = result2->Fetch();
- uint8 race = field[0].GetUInt32();
+ uint8 acc_race = field[1].GetUInt32();
+
+ if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)
+ {
+ uint8 acc_class = field[2].GetUInt32();
+ if(acc_class == CLASS_DEATH_KNIGHT)
+ {
+ if(heroic_free_slots > 0)
+ --heroic_free_slots;
+
+ if(heroic_free_slots==0)
+ {
+ data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT;
+ SendPacket( &data );
+ return;
+ }
+ }
+
+ if(!have_req_level_for_heroic)
+ {
+ uint32 acc_guid = field[0].GetUInt32();
+ uint32 acc_level = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,acc_guid);
+ if(acc_level >= req_level_for_heroic)
+ have_req_level_for_heroic = true;
+ }
+ }
// need to check team only for first character
// TODO: what to if account already has characters of both races?
if (!AllowTwoSideAccounts)
{
- uint32 team=0;
- if(race > 0)
- team = Player::TeamForRace(race);
+ uint32 acc_team=0;
+ if(acc_race > 0)
+ acc_team = Player::TeamForRace(acc_race);
- if(team != team_)
+ if(acc_team != team_)
{
data << (uint8)CHAR_CREATE_PVP_TEAMS_VIOLATION;
SendPacket( &data );
@@ -342,20 +391,55 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
}
}
- if (skipCinematics == 1)
+ // search same race for cinematic or same class if need
+ // TODO: check if cinematic already shown? (already logged in?; cinematic field)
+ while ((skipCinematics == 1 && !have_same_race) || class_ == CLASS_DEATH_KNIGHT)
{
- // TODO: check if cinematic already shown? (already logged in?; cinematic field)
- while (race_ != race && result2->NextRow())
+ if(!result2->NextRow())
+ break;
+
+ field = result2->Fetch();
+ acc_race = field[1].GetUInt32();
+
+ if(!have_same_race)
+ have_same_race = race_ == acc_race;
+
+ if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)
{
- field = result2->Fetch();
- race = field[0].GetUInt32();
+ uint8 acc_class = field[2].GetUInt32();
+ if(acc_class == CLASS_DEATH_KNIGHT)
+ {
+ if(heroic_free_slots > 0)
+ --heroic_free_slots;
+
+ if(heroic_free_slots==0)
+ {
+ data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT;
+ SendPacket( &data );
+ return;
+ }
+ }
+
+ if(!have_req_level_for_heroic)
+ {
+ uint32 acc_guid = field[0].GetUInt32();
+ uint32 acc_level = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,acc_guid);
+ if(acc_level >= req_level_for_heroic)
+ have_req_level_for_heroic = true;
+ }
}
- have_same_race = race_ == race;
}
delete result2;
}
}
+ if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && !have_req_level_for_heroic)
+ {
+ data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT;
+ SendPacket( &data );
+ return;
+ }
+
// extract other data required for player creating
uint8 gender, skin, face, hairStyle, hairColor, facialHair, outfitId;
recv_data >> gender >> skin >> face;
@@ -373,7 +457,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
return;
}
- if(have_same_race && skipCinematics == 1 || skipCinematics == 2)
+ if ((have_same_race && skipCinematics == 1) || skipCinematics == 2)
pNewChar->setCinematic(1); // not show intro
// Player created, save it now
@@ -514,9 +598,11 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
data << pCurrChar->GetOrientation();
SendPacket(&data);
- data.Initialize( SMSG_ACCOUNT_DATA_TIMES, 128 );
- for(int i = 0; i < 32; i++)
- data << uint32(0);
+ data.Initialize( SMSG_ACCOUNT_DATA_TIMES, 4+1+8*4 ); // changed in WotLK
+ data << uint32(time(NULL)); // unix time of something
+ data << uint8(1);
+ for(int i = 0; i < NUM_ACCOUNT_DATA_TYPES; i++)
+ data << uint32(GetAccountData(i)->Time); // also unix time
SendPacket(&data);
data.Initialize(SMSG_FEATURE_SYSTEM_STATUS, 2); // added in 2.2.0
@@ -619,17 +705,25 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
{
pCurrChar->setCinematic(1);
- ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace());
- if(rEntry)
+ if(ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(pCurrChar->getClass()))
{
- data.Initialize( SMSG_TRIGGER_CINEMATIC,4 );
- data << uint32(rEntry->startmovie);
- SendPacket( &data );
-
+ if(cEntry->CinematicSequence)
+ {
+ data.Initialize(SMSG_TRIGGER_CINEMATIC, 4);
+ data << uint32(cEntry->CinematicSequence);
+ SendPacket( &data );
+ }
+ else if(ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace()))
+ {
+ data.Initialize(SMSG_TRIGGER_CINEMATIC, 4);
+ data << uint32(rEntry->CinematicSequence);
+ SendPacket( &data );
+ }
+
// send new char string if not empty
if (!sWorld.GetNewCharString().empty())
chH.PSendSysMessage(sWorld.GetNewCharString().c_str());
- }
+ }
}
if (!pCurrChar->GetMap()->Add(pCurrChar))
@@ -672,22 +766,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
pCurrChar->CastSpell(pCurrChar, 20584, true, 0);// auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form)
pCurrChar->CastSpell(pCurrChar, 8326, true, 0); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?)
- //pCurrChar->SetUInt32Value(UNIT_FIELD_AURA+41, 8326);
- //pCurrChar->SetUInt32Value(UNIT_FIELD_AURA+42, 20584);
- //pCurrChar->SetUInt32Value(UNIT_FIELD_AURAFLAGS+6, 238);
- //pCurrChar->SetUInt32Value(UNIT_FIELD_AURALEVELS+11, 514);
- //pCurrChar->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS+11, 65535);
- //pCurrChar->SetUInt32Value(UNIT_FIELD_DISPLAYID, 1825);
- //if (pCurrChar->getRace() == RACE_NIGHTELF)
- //{
- // pCurrChar->SetSpeed(MOVE_RUN, 1.5f*1.2f, true);
- // pCurrChar->SetSpeed(MOVE_SWIM, 1.5f*1.2f, true);
- //}
- //else
- //{
- // pCurrChar->SetSpeed(MOVE_RUN, 1.5f, true);
- // pCurrChar->SetSpeed(MOVE_SWIM, 1.5f, true);
- //}
pCurrChar->SetMovement(MOVE_WATER_WALK);
}
@@ -747,7 +825,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
// Set FFA PvP for non GM in non-rest mode
if(sWorld.IsFFAPvPRealm() && !pCurrChar->isGameMaster() && !pCurrChar->HasFlag(PLAYER_FLAGS,PLAYER_FLAGS_RESTING) )
- pCurrChar->SetFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ pCurrChar->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
if(pCurrChar->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP))
pCurrChar->SetContestedPvP();
@@ -917,11 +995,11 @@ void WorldSession::HandleToggleCloakOpcode( WorldPacket & /*recv_data*/ )
void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data)
{
+ CHECK_PACKET_SIZE(recv_data, 8+1);
+
uint64 guid;
std::string newname;
- CHECK_PACKET_SIZE(recv_data, 8+1);
-
recv_data >> guid;
recv_data >> newname;
@@ -929,15 +1007,15 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data)
if(!normalizePlayerName(newname))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << (uint8)CHAR_NAME_NO_NAME;
+ data << uint8(CHAR_NAME_NO_NAME);
SendPacket( &data );
return;
}
- if(!ObjectMgr::IsValidName(newname,true))
+ if(!ObjectMgr::IsValidName(newname, true))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << (uint8)CHAR_NAME_INVALID_CHARACTER;
+ data << uint8(CHAR_NAME_INVALID_CHARACTER);
SendPacket( &data );
return;
}
@@ -946,7 +1024,7 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data)
if(GetSecurity() == SEC_PLAYER && objmgr.IsReservedName(newname))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << (uint8)CHAR_NAME_RESERVED;
+ data << uint8(CHAR_NAME_RESERVED);
SendPacket( &data );
return;
}
@@ -975,7 +1053,7 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uin
if (!result)
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << (uint8)CHAR_CREATE_ERROR;
+ data << uint8(CHAR_CREATE_ERROR);
session->SendPacket( &data );
return;
}
@@ -989,11 +1067,11 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uin
CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME), guidLow);
CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", guidLow);
- sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s",session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str());
+ sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str());
- WorldPacket data(SMSG_CHAR_RENAME,1+8+(newname.size()+1));
- data << (uint8)RESPONSE_SUCCESS;
- data << guid;
+ WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newname.size()+1));
+ data << uint8(RESPONSE_SUCCESS);
+ data << uint64(guid);
data << newname;
session->SendPacket(&data);
}
@@ -1088,3 +1166,169 @@ void WorldSession::HandleDeclinedPlayerNameOpcode(WorldPacket& recv_data)
SendPacket(&data);
}
+void WorldSession::HandleAlterAppearance( WorldPacket & recv_data )
+{
+ sLog.outDebug("CMSG_ALTER_APPEARANCE");
+
+ CHECK_PACKET_SIZE(recv_data, 4+4+4);
+
+ uint32 Hair, Color, FacialHair;
+ recv_data >> Hair >> Color >> FacialHair;
+
+ BarberShopStyleEntry const* bs_hair = sBarberShopStyleStore.LookupEntry(Hair);
+
+ if(!bs_hair || bs_hair->type != 0 || bs_hair->race != _player->getRace() || bs_hair->gender != _player->getGender())
+ return;
+
+ BarberShopStyleEntry const* bs_facialHair = sBarberShopStyleStore.LookupEntry(FacialHair);
+
+ if(!bs_facialHair || bs_facialHair->type != 2 || bs_facialHair->race != _player->getRace() || bs_facialHair->gender != _player->getGender())
+ return;
+
+ uint32 Cost = _player->GetBarberShopCost(bs_hair->hair_id, Color, bs_facialHair->hair_id);
+
+ // 0 - ok
+ // 1,3 - not enough money
+ // 2 - you have to seat on barber chair
+ if(_player->GetMoney() < Cost)
+ {
+ WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
+ data << uint32(1); // no money
+ SendPacket(&data);
+ return;
+ }
+ else
+ {
+ WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
+ data << uint32(0); // ok
+ SendPacket(&data);
+ }
+
+ _player->SetMoney(_player->GetMoney() - Cost); // it isn't free
+
+ _player->SetByteValue(PLAYER_BYTES, 2, uint8(bs_hair->hair_id));
+ _player->SetByteValue(PLAYER_BYTES, 3, uint8(Color));
+ _player->SetByteValue(PLAYER_BYTES_2, 0, uint8(bs_facialHair->hair_id));
+
+ _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, 1);
+
+ _player->SetStandState(0); // stand up
+}
+
+void WorldSession::HandleRemoveGlyph( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data, 4);
+
+ uint32 slot;
+ recv_data >> slot;
+
+ if(slot > MAX_GLYPH_SLOT_INDEX)
+ {
+ sLog.outDebug("Client sent wrong glyph slot number in opcode CMSG_REMOVE_GLYPH %u", slot);
+ return;
+ }
+
+ if(uint32 glyph = _player->GetGlyph(slot))
+ {
+ if(GlyphPropertiesEntry const *gp = sGlyphPropertiesStore.LookupEntry(glyph))
+ {
+ _player->RemoveAurasDueToSpell(gp->SpellId);
+ _player->SetGlyph(slot, 0);
+ }
+ }
+}
+
+void WorldSession::HandleCharCustomize(WorldPacket& recv_data)
+{
+ CHECK_PACKET_SIZE(recv_data, 8+1);
+
+ uint64 guid;
+ std::string newname;
+
+ recv_data >> guid;
+ recv_data >> newname;
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1+1+1+1+1);
+
+ uint8 gender, skin, face, hairStyle, hairColor, facialHair;
+ recv_data >> gender >> skin >> face >> hairStyle >> hairColor >> facialHair;
+
+ QueryResult *result = CharacterDatabase.PQuery("SELECT at_login FROM characters WHERE guid ='%u'", GUID_LOPART(guid));
+ if (!result)
+ {
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
+ data << uint8(CHAR_CREATE_ERROR);
+ SendPacket( &data );
+ return;
+ }
+
+ Field *fields = result->Fetch();
+ uint32 at_loginFlags = fields[0].GetUInt32();
+ delete result;
+
+ if (!(at_loginFlags & AT_LOGIN_CUSTOMIZE))
+ {
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
+ data << uint8(CHAR_CREATE_ERROR);
+ SendPacket( &data );
+ return;
+ }
+
+ // prevent character rename to invalid name
+ if(!normalizePlayerName(newname))
+ {
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
+ data << uint8(CHAR_NAME_NO_NAME);
+ SendPacket( &data );
+ return;
+ }
+
+ if(!ObjectMgr::IsValidName(newname,true))
+ {
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
+ data << uint8(CHAR_NAME_INVALID_CHARACTER);
+ SendPacket( &data );
+ return;
+ }
+
+ // check name limitations
+ if(GetSecurity() == SEC_PLAYER && objmgr.IsReservedName(newname))
+ {
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
+ data << uint8(CHAR_NAME_RESERVED);
+ SendPacket( &data );
+ return;
+ }
+
+ // character with this name already exist
+ if(uint64 newguid = objmgr.GetPlayerGUIDByName(newname))
+ {
+ if(newguid != guid)
+ {
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
+ data << uint8(CHAR_CREATE_NAME_IN_USE);
+ SendPacket( &data );
+ return;
+ }
+ }
+
+ CharacterDatabase.escape_string(newname);
+ Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair);
+ CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_CUSTOMIZE), GUID_LOPART(guid));
+ CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", GUID_LOPART(guid));
+
+ std::string IP_str = GetRemoteAddress();
+ sLog.outChar("Account: %d (IP: %s), Character guid: %u Customized to: %s", GetAccountId(), IP_str.c_str(), GUID_LOPART(guid), newname.c_str());
+
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1+8+(newname.size()+1)+6);
+ data << uint8(RESPONSE_SUCCESS);
+ data << uint64(guid);
+ data << newname;
+ data << uint8(gender);
+ data << uint8(skin);
+ data << uint8(face);
+ data << uint8(hairStyle);
+ data << uint8(hairColor);
+ data << uint8(facialHair);
+ SendPacket(&data);
+}
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index f64877095ed..a028fdc860f 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -33,8 +33,26 @@
#include "MapManager.h"
#include "GridNotifiersImpl.h"
#include "CellImpl.h"
+#include "AccountMgr.h"
#include "TicketMgr.h"
+// Supported shift-links (client generated and server side)
+// |color|Harea:area_id|h[name]|h|r
+// |color|Hcreature:creature_guid|h[name]|h|r
+// |color|Hcreature_entry:creature_id|h[name]|h|r
+// |color|Hgameevent:id|h[name]|h|r
+// |color|Hgameobject:go_guid|h[name]|h|r
+// |color|Hgameobject_entry:go_id|h[name]|h|r
+// |color|Hitem:item_id:perm_ench_id:0:0|h[name]|h|r
+// |color|Hitemset:itemset_id|h[name]|h|r
+// |color|Hplayer:name|h[name]|h|r - client, in some messages, at click copy only name instead link
+// |color|Hquest:quest_id|h[name]|h|r
+// |color|Hskill:skill_id|h[name]|h|r
+// |color|Hspell:spell_id|h[name]|h|r - client, spellbook spell icon shift-click
+// |color|Htalent:talent_id,rank|h[name]|h|r - client, talent icon shift-click
+// |color|Htele:id|h[name]|h|r
+// |color|Htrade:spell_id,cur_value,max_value,unk3int,unk3str|h[name]|h|r - client, spellbook profession icon shift-click
+
bool ChatHandler::load_command_table = true;
ChatCommand * ChatHandler::getCommandTable()
@@ -112,6 +130,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "hp", SEC_MODERATOR, false, &ChatHandler::HandleModifyHPCommand, "", NULL },
{ "mana", SEC_MODERATOR, false, &ChatHandler::HandleModifyManaCommand, "", NULL },
{ "rage", SEC_MODERATOR, false, &ChatHandler::HandleModifyRageCommand, "", NULL },
+ { "runicpower", SEC_MODERATOR, false, &ChatHandler::HandleModifyRunicPowerCommand, "", NULL },
{ "energy", SEC_MODERATOR, false, &ChatHandler::HandleModifyEnergyCommand, "", NULL },
{ "money", SEC_MODERATOR, false, &ChatHandler::HandleModifyMoneyCommand, "", NULL },
{ "speed", SEC_MODERATOR, false, &ChatHandler::HandleModifySpeedCommand, "", NULL },
@@ -132,6 +151,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "drunk", SEC_MODERATOR, false, &ChatHandler::HandleDrunkCommand, "", NULL },
{ "standstate", SEC_GAMEMASTER, false, &ChatHandler::HandleStandStateCommand, "", NULL },
{ "morph", SEC_GAMEMASTER, false, &ChatHandler::HandleMorphCommand, "", NULL },
+ { "phase", SEC_GAMEMASTER, false, &ChatHandler::HandleModifyPhaseCommand, "", NULL },
{ "gender", SEC_ADMINISTRATOR, false, &ChatHandler::HandleModifyGenderCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -192,10 +212,12 @@ ChatCommand * ChatHandler::getCommandTable()
{ "sellerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSellErrorCommand, "", NULL },
{ "buyerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBuyErrorCommand, "", NULL },
{ "sendopcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendOpcodeCommand, "", NULL },
+ { "spawnvehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSpawnVehicle, "", NULL },
{ "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL },
{ "ps", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlaySound2Command, "", NULL },
{ "scn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL },
{ "scm", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChatMsgCommand, "", NULL },
+ { "sps", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendSetPhaseShiftCommand, "", NULL },
{ "getitemstate", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetItemState, "", NULL },
{ "playsound", SEC_MODERATOR, false, &ChatHandler::HandlePlaySoundCommand, "", NULL },
{ "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdate, "", NULL },
@@ -205,6 +227,8 @@ ChatCommand * ChatHandler::getCommandTable()
{ "anim", SEC_GAMEMASTER, false, &ChatHandler::HandleAnimCommand, "", NULL },
{ "lootrecipient", SEC_GAMEMASTER, false, &ChatHandler::HandleGetLootRecipient, "", NULL },
{ "arena", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugArenaCommand, "", NULL },
+ { "bg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugBattlegroundCommand, "", NULL },
+ { "sendlargepacket",SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendLargePacketCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -265,12 +289,21 @@ ChatCommand * ChatHandler::getCommandTable()
{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
{ "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
{ "trinity_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL },
+ { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
+ { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
+ { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
+ { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
+ { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
+ { "locales_points_of_interest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPointsOfInterestCommand, "", NULL },
+ { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
+ { "milling_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesMillingCommand, "", NULL },
{ "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
{ "npc_option", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcOptionCommand, "", NULL },
{ "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
{ "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
{ "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
{ "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
+ { "points_of_interest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPointsOfInterestCommand, "",NULL},
{ "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
{ "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
{ "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
@@ -286,23 +319,18 @@ ChatCommand * ChatHandler::getCommandTable()
{ "spell_required", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellRequiredCommand, "", NULL },
{ "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
{ "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
+ { "spell_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSpellCommand, "", NULL },
{ "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
{ "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
+ { "spell_bonus_data", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellBonusesCommand, "", NULL },
{ "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
{ "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
{ "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
{ "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
{ "spell_disabled", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellDisabledCommand, "", NULL },
- { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
- { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
- { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
- { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
- { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
- { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
{ "waypoint_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadWpScriptsCommand, "", NULL },
{ "gm_tickets", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMTicketReloadCommand, "", NULL },
- { "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -369,6 +397,7 @@ ChatCommand * ChatHandler::getCommandTable()
static ChatCommand resetCommandTable[] =
{
+ { "achievements", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAchievementsCommand, "", NULL },
{ "honor", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetHonorCommand, "", NULL },
{ "level", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetLevelCommand, "", NULL },
{ "spells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetSpellsCommand, "", NULL },
@@ -435,11 +464,14 @@ ChatCommand * ChatHandler::getCommandTable()
{ "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL },
{ "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcPlayEmoteCommand, "", NULL },
{ "follow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFollowCommand, "", NULL },
+ { "setphase", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetPhaseCommand, "", NULL },
{ "unfollow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcUnFollowCommand, "", NULL },
{ "whisper", SEC_MODERATOR, false, &ChatHandler::HandleNpcWhisperCommand, "", NULL },
{ "yell", SEC_MODERATOR, false, &ChatHandler::HandleNpcYellCommand, "", NULL },
{ "addtemp", SEC_GAMEMASTER, false, &ChatHandler::HandleTempAddSpwCommand, "", NULL },
{ "addformation", SEC_MODERATOR, false, &ChatHandler::HandleNpcAddFormationCommand, "", NULL },
+ { "tame", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcTameCommand, "", NULL },
+ { "setdeathstate", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetDeathStateCommand, "", NULL },
//{ TODO: fix or remove this commands
{ "name", SEC_GAMEMASTER, false, &ChatHandler::HandleNameCommand, "", NULL },
@@ -468,12 +500,13 @@ ChatCommand * ChatHandler::getCommandTable()
{
{ "add", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectCommand, "", NULL },
{ "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelObjectCommand, "", NULL },
- { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL },
- { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL },
{ "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveObjectCommand, "", NULL },
{ "near", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearObjectCommand, "", NULL },
{ "activate", SEC_GAMEMASTER, false, &ChatHandler::HandleActivateObjectCommand, "", NULL },
{ "addtemp", SEC_GAMEMASTER, false, &ChatHandler::HandleTempGameObjectCommand, "", NULL },
+ { "setphase", SEC_GAMEMASTER, false, &ChatHandler::HandleGOPhaseCommand, "", NULL },
+ { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL },
+ { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -609,6 +642,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "sendmail", SEC_MODERATOR, true, &ChatHandler::HandleSendMailCommand, "", NULL },
{ "sendmoney", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMoneyCommand, "", NULL },
{ "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL },
+ { "customize", SEC_GAMEMASTER, true, &ChatHandler::HandleCustomizeCommand, "", NULL },
{ "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL },
{ "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL },
{ "unmute", SEC_GAMEMASTER, true, &ChatHandler::HandleUnmuteCommand, "", NULL },
@@ -686,6 +720,55 @@ bool ChatHandler::isAvailable(ChatCommand const& cmd) const
return m_session->GetSecurity() >= cmd.SecurityLevel;
}
+bool ChatHandler::HasLowerSecurity(Player* target, uint64 guid, bool strong)
+{
+ WorldSession* target_session = NULL;
+ uint32 target_account = 0;
+
+ if (target)
+ target_session = target->GetSession();
+ else if (guid)
+ target_account = objmgr.GetPlayerAccountIdByGUID(guid);
+
+ if(!target_session && !target_account)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return true;
+ }
+
+ return HasLowerSecurityAccount(target_session,target_account,strong);
+}
+
+bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_account, bool strong)
+{
+ uint32 target_sec;
+
+ // allow everything from console and RA console
+ if (!m_session)
+ return false;
+
+ // ignore only for non-players for non strong checks (when allow apply command at least to same sec level)
+ if (m_session->GetSecurity() > SEC_PLAYER && !strong && !sWorld.getConfig(CONFIG_GM_LOWER_SECURITY))
+ return false;
+
+ if (target)
+ target_sec = target->GetSecurity();
+ else if (target_account)
+ target_sec = accmgr.GetSecurity(target_account);
+ else
+ return true; // caller must report error for (target==NULL && target_account==0)
+
+ if (m_session->GetSecurity() < target_sec || strong && m_session->GetSecurity() <= target_sec)
+ {
+ SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
+ SetSentErrorMessage(true);
+ return true;
+ }
+
+ return false;
+}
+
bool ChatHandler::hasStringAbbr(const char* name, const char* part)
{
// non "" command
@@ -771,9 +854,9 @@ void ChatHandler::PSendSysMessage(int32 entry, ...)
{
const char *format = GetTrinityString(entry);
va_list ap;
- char str [1024];
+ char str [2048];
va_start(ap, entry);
- vsnprintf(str,1024,format, ap );
+ vsnprintf(str,2048,format, ap );
va_end(ap);
SendSysMessage(str);
}
@@ -781,9 +864,9 @@ void ChatHandler::PSendSysMessage(int32 entry, ...)
void ChatHandler::PSendSysMessage(const char *format, ...)
{
va_list ap;
- char str [1024];
+ char str [2048];
va_start(ap, format);
- vsnprintf(str,1024,format, ap );
+ vsnprintf(str,2048,format, ap );
va_end(ap);
SendSysMessage(str);
}
@@ -1099,7 +1182,7 @@ Creature* ChatHandler::getSelectedCreature()
if(!m_session)
return NULL;
- return ObjectAccessor::GetCreatureOrPet(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
+ return ObjectAccessor::GetCreatureOrPetOrVehicle(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
}
char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1)
@@ -1170,12 +1253,23 @@ char* ChatHandler::extractKeyFromLink(char* text, char const* const* linkTypes,
// [name] Shift-click form |color|linkType:key|h[name]|h|r
// or
// [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
+ // or
+ // [name] Shift-click form |linkType:key|h[name]|h|r
- char* check = strtok(text, "|"); // skip color
- if(!check)
- return NULL; // end of data
+ char* tail;
- char* cLinkType = strtok(NULL, ":"); // linktype
+ if(text[1]=='c')
+ {
+ char* check = strtok(text, "|"); // skip color
+ if(!check)
+ return NULL; // end of data
+
+ tail = strtok(NULL, ""); // tail
+ }
+ else
+ tail = text+1; // skip first |
+
+ char* cLinkType = strtok(tail, ":"); // linktype
if(!cLinkType)
return NULL; // end of data
@@ -1251,8 +1345,8 @@ GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
- Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(obj,go_check);
+ MaNGOS::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
+ MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(pl,obj,go_check);
TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -1262,9 +1356,18 @@ GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid
return obj;
}
-static char const* const spellTalentKeys[] = {
- "Hspell",
- "Htalent",
+enum SpellLinkType
+{
+ SPELL_LINK_SPELL = 0,
+ SPELL_LINK_TALENT = 1,
+ SPELL_LINK_TRADE = 2
+};
+
+static char const* const spellKeys[] =
+{
+ "Hspell", // normal spell
+ "Htalent", // talent spell
+ "Htrade", // profession/skill spell
0
};
@@ -1272,31 +1375,41 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text)
{
// number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
// number or [name] Shift-click form |color|Htalent:talent_id,rank|h[name]|h|r
+ // number or [name] Shift-click form |color|Htrade:spell_id,skill_id,max_value,cur_value|h[name]|h|r
int type = 0;
- char* rankS = NULL;
- char* idS = extractKeyFromLink(text,spellTalentKeys,&type,&rankS);
+ char* param1_str = NULL;
+ char* idS = extractKeyFromLink(text,spellKeys,&type,&param1_str);
if(!idS)
return 0;
uint32 id = (uint32)atol(idS);
- // spell
- if(type==0)
- return id;
+ switch(type)
+ {
+ case SPELL_LINK_SPELL:
+ return id;
+ case SPELL_LINK_TALENT:
+ {
+ // talent
+ TalentEntry const* talentEntry = sTalentStore.LookupEntry(id);
+ if(!talentEntry)
+ return 0;
- // talent
- TalentEntry const* talentEntry = sTalentStore.LookupEntry(id);
- if(!talentEntry)
- return 0;
+ int32 rank = param1_str ? (uint32)atol(param1_str) : 0;
+ if(rank >= 5)
+ return 0;
- int32 rank = rankS ? (uint32)atol(rankS) : 0;
- if(rank >= 5)
- return 0;
+ if(rank < 0)
+ rank = 0;
- if(rank < 0)
- rank = 0;
+ return talentEntry->RankID[rank];
+ }
+ case SPELL_LINK_TRADE:
+ return id;
+ }
- return talentEntry->RankID[rank];
+ // unknown type?
+ return 0;
}
GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
@@ -1314,9 +1427,84 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
return objmgr.GetGameTele(cId);
}
-const char *ChatHandler::GetName() const
+enum GuidLinkType
{
- return m_session->GetPlayer()->GetName();
+ SPELL_LINK_PLAYER = 0, // must be first for selection in not link case
+ SPELL_LINK_CREATURE = 1,
+ SPELL_LINK_GAMEOBJECT = 2
+};
+
+static char const* const guidKeys[] =
+{
+ "Hplayer",
+ "Hcreature",
+ "Hgameobject",
+ 0
+};
+
+uint64 ChatHandler::extractGuidFromLink(char* text)
+{
+ int type = 0;
+
+ // |color|Hcreature:creature_guid|h[name]|h|r
+ // |color|Hgameobject:go_guid|h[name]|h|r
+ // |color|Hplayer:name|h[name]|h|r
+ char* idS = extractKeyFromLink(text,guidKeys,&type);
+ if(!idS)
+ return 0;
+
+ switch(type)
+ {
+ case SPELL_LINK_PLAYER:
+ {
+ std::string name = idS;
+ if(!normalizePlayerName(name))
+ return 0;
+
+ if(Player* player = objmgr.GetPlayer(name.c_str()))
+ return player->GetGUID();
+
+ if(uint64 guid = objmgr.GetPlayerGUIDByName(name))
+ return guid;
+
+ return 0;
+ }
+ case SPELL_LINK_CREATURE:
+ {
+ uint32 lowguid = (uint32)atol(idS);
+
+ if(CreatureData const* data = objmgr.GetCreatureData(lowguid) )
+ return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_UNIT);
+ else
+ return 0;
+ }
+ case SPELL_LINK_GAMEOBJECT:
+ {
+ uint32 lowguid = (uint32)atol(idS);
+
+ if(GameObjectData const* data = objmgr.GetGOData(lowguid) )
+ return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_GAMEOBJECT);
+ else
+ return 0;
+ }
+ }
+
+ // unknown type?
+ return 0;
+}
+
+std::string ChatHandler::extractPlayerNameFromLink(char* text)
+{
+ // |color|Hplayer:name|h[name]|h|r
+ char* name_str = extractKeyFromLink(text,"Hplayer");
+ if(!name_str)
+ return "";
+
+ std::string name = name_str;
+ if(!normalizePlayerName(name))
+ return "";
+
+ return name;
}
bool ChatHandler::needReportToTarget(Player* chr) const
@@ -1342,7 +1530,7 @@ void CliHandler::SendSysMessage(const char *str)
m_print("\r\n");
}
-const char *CliHandler::GetName() const
+std::string CliHandler::GetNameLink() const
{
return GetTrinityString(LANG_CONSOLE_COMMAND);
}
diff --git a/src/game/Chat.h b/src/game/Chat.h
index e6474968606..6303a37c773 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -72,8 +72,6 @@ class ChatHandler
int ParseCommands(const char* text);
- virtual char const* GetName() const;
-
protected:
explicit ChatHandler() : m_session(NULL) {} // for CLI subclass
@@ -81,6 +79,8 @@ class ChatHandler
virtual bool isAvailable(ChatCommand const& cmd) const;
virtual bool needReportToTarget(Player* chr) const;
+ bool HasLowerSecurity(Player* target, uint64 guid, bool strong = false);
+ bool HasLowerSecurityAccount(WorldSession* target, uint32 account, bool strong = false);
void SendGlobalSysMessage(const char *str);
void SendGlobalGMSysMessage(const char *str);
@@ -166,6 +166,7 @@ class ChatHandler
bool HandleModifyHPCommand(const char* args);
bool HandleModifyManaCommand(const char* args);
bool HandleModifyRageCommand(const char* args);
+ bool HandleModifyRunicPowerCommand(const char* args);
bool HandleModifyEnergyCommand(const char* args);
bool HandleModifyMoneyCommand(const char* args);
bool HandleModifyASpeedCommand(const char* args);
@@ -182,6 +183,7 @@ class ChatHandler
bool HandleModifyHonorCommand (const char* args);
bool HandleModifyRepCommand(const char* args);
bool HandleModifyArenaCommand(const char* args);
+ bool HandleModifyPhaseCommand(const char* args);
bool HandleModifyGenderCommand(const char* args);
bool HandleNpcAddCommand(const char* args);
@@ -197,6 +199,7 @@ class ChatHandler
bool HandleNpcSayCommand(const char* args);
bool HandleNpcSetModelCommand(const char* args);
bool HandleNpcSetMoveTypeCommand(const char* args);
+ bool HandleNpcSetPhaseCommand(const char* args);
bool HandleNpcSpawnDistCommand(const char* args);
bool HandleNpcSpawnTimeCommand(const char* args);
bool HandleNpcTameCommand(const char* args);
@@ -205,8 +208,8 @@ class ChatHandler
bool HandleNpcWhisperCommand(const char* args);
bool HandleNpcYellCommand(const char* args);
bool HandleNpcAddFormationCommand(const char* args);
+ bool HandleNpcSetDeathStateCommand(const char* args);
- bool HandleReloadCommand(const char* args);
bool HandleReloadAllCommand(const char* args);
bool HandleReloadAllAreaCommand(const char* args);
bool HandleReloadAllItemCommand(const char* args);
@@ -232,21 +235,33 @@ class ChatHandler
bool HandleReloadGameTeleCommand(const char* args);
bool HandleReloadGOQuestRelationsCommand(const char* args);
bool HandleReloadGOQuestInvRelationsCommand(const char* args);
+ bool HandleReloadItemEnchantementsCommand(const char* args);
+ bool HandleReloadLocalesCreatureCommand(const char* args);
+ bool HandleReloadLocalesGameobjectCommand(const char* args);
+ bool HandleReloadLocalesItemCommand(const char* args);
+ bool HandleReloadLocalesNpcTextCommand(const char* args);
+ bool HandleReloadLocalesPageTextCommand(const char* args);
+ bool HandleReloadLocalesPointsOfInterestCommand(const char* args);
+ bool HandleReloadLocalesQuestCommand(const char* args);
bool HandleReloadLootTemplatesCreatureCommand(const char* args);
bool HandleReloadLootTemplatesDisenchantCommand(const char* args);
bool HandleReloadLootTemplatesFishingCommand(const char* args);
bool HandleReloadLootTemplatesGameobjectCommand(const char* args);
bool HandleReloadLootTemplatesItemCommand(const char* args);
+ bool HandleReloadLootTemplatesMillingCommand(const char* args);
bool HandleReloadLootTemplatesPickpocketingCommand(const char* args);
bool HandleReloadLootTemplatesProspectingCommand(const char* args);
bool HandleReloadLootTemplatesReferenceCommand(const char* args);
bool HandleReloadLootTemplatesQuestMailCommand(const char* args);
bool HandleReloadLootTemplatesSkinningCommand(const char* args);
+ bool HandleReloadLootTemplatesSpellCommand(const char* args);
bool HandleReloadTrinityStringCommand(const char* args);
bool HandleReloadNpcGossipCommand(const char* args);
bool HandleReloadNpcOptionCommand(const char* args);
bool HandleReloadNpcTrainerCommand(const char* args);
bool HandleReloadNpcVendorCommand(const char* args);
+ bool HandleReloadPageTextsCommand(const char* args);
+ bool HandleReloadPointsOfInterestCommand(const char* args);
bool HandleReloadQuestAreaTriggersCommand(const char* args);
bool HandleReloadQuestEndScriptsCommand(const char* args);
bool HandleReloadQuestStartScriptsCommand(const char* args);
@@ -260,20 +275,13 @@ class ChatHandler
bool HandleReloadSpellElixirCommand(const char* args);
bool HandleReloadSpellLearnSpellCommand(const char* args);
bool HandleReloadSpellProcEventCommand(const char* args);
+ bool HandleReloadSpellBonusesCommand(const char* args);
bool HandleReloadSpellScriptTargetCommand(const char* args);
bool HandleReloadSpellScriptsCommand(const char* args);
bool HandleReloadSpellTargetPositionCommand(const char* args);
bool HandleReloadSpellThreatsCommand(const char* args);
bool HandleReloadSpellPetAurasCommand(const char* args);
bool HandleReloadSpellDisabledCommand(const char* args);
- bool HandleReloadPageTextsCommand(const char* args);
- bool HandleReloadItemEnchantementsCommand(const char* args);
- bool HandleReloadLocalesCreatureCommand(const char* args);
- bool HandleReloadLocalesGameobjectCommand(const char* args);
- bool HandleReloadLocalesItemCommand(const char* args);
- bool HandleReloadLocalesNpcTextCommand(const char* args);
- bool HandleReloadLocalesPageTextCommand(const char* args);
- bool HandleReloadLocalesQuestCommand(const char* args);
bool HandleInstanceListBindsCommand(const char* args);
bool HandleInstanceUnbindCommand(const char* args);
@@ -321,6 +329,7 @@ class ChatHandler
bool HandleTargetObjectCommand(const char* args);
bool HandleDelObjectCommand(const char* args);
bool HandleMoveObjectCommand(const char* args);
+ bool HandleGOPhaseCommand(const char* args);
bool HandleTurnObjectCommand(const char* args);
bool HandleObjectStateCommand(const char* args);
bool HandlePInfoCommand(const char* args);
@@ -401,6 +410,7 @@ class ChatHandler
bool HandleDelTeleCommand(const char * args);
bool HandleListAurasCommand(const char * args);
+ bool HandleResetAchievementsCommand(const char * args);
bool HandleResetHonorCommand(const char * args);
bool HandleResetLevelCommand(const char * args);
bool HandleResetSpellsCommand(const char * args);
@@ -452,6 +462,7 @@ class ChatHandler
bool HandleSendChannelNotifyCommand(const char* args);
bool HandleSendChatMsgCommand(const char* args);
bool HandleRenameCommand(const char * args);
+ bool HandleCustomizeCommand(const char * args);
bool HandleLoadPDumpCommand(const char *args);
bool HandleWritePDumpCommand(const char *args);
bool HandleCastCommand(const char *args);
@@ -488,15 +499,27 @@ class ChatHandler
bool HandleUnPossessCommand(const char* args);
bool HandleBindSightCommand(const char* args);
bool HandleUnbindSightCommand(const char* args);
+ bool HandleDebugBattlegroundCommand(const char * args);
+ bool HandleSpawnVehicle(const char * args);
+ bool HandleSendLargePacketCommand(const char * args);
+ bool HandleSendSetPhaseShiftCommand(const char * args);
Player* getSelectedPlayer();
Creature* getSelectedCreature();
Unit* getSelectedUnit();
+
char* extractKeyFromLink(char* text, char const* linkType, char** something1 = NULL);
char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = NULL);
+
uint32 extractSpellIdFromLink(char* text);
+ uint64 extractGuidFromLink(char* text);
GameTele const* extractGameTeleFromLink(char* text);
bool GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline = false);
+ std::string extractPlayerNameFromLink(char* text);
+
+ std::string playerLink(std::string const& name) const { return m_session ? "|cffffffff|Hplayer:"+name+"|h["+name+"]|h|r" : name; }
+ virtual std::string GetNameLink() const { return GetNameLink(m_session->GetPlayer()); }
+ std::string GetNameLink(Player* chr) const { return playerLink(chr->GetName()); }
GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry);
@@ -527,7 +550,7 @@ class CliHandler : public ChatHandler
const char *GetTrinityString(int32 entry) const;
bool isAvailable(ChatCommand const& cmd) const;
void SendSysMessage(const char *str);
- char const* GetName() const;
+ std::string GetNameLink() const;
bool needReportToTarget(Player* chr) const;
private:
diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp
index 22b58cccdf3..97b980eea61 100644
--- a/src/game/ChatHandler.cpp
+++ b/src/game/ChatHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -192,7 +192,7 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
Player *player = objmgr.GetPlayer(to.c_str());
uint32 tSecurity = GetSecurity();
- uint32 pSecurity = player ? player->GetSession()->GetSecurity() : 0;
+ uint32 pSecurity = player ? player->GetSession()->GetSecurity() : SEC_PLAYER;
if(!player || tSecurity == SEC_PLAYER && pSecurity > SEC_PLAYER && !player->isAcceptWhispers())
{
WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1));
diff --git a/src/game/CombatHandler.cpp b/src/game/CombatHandler.cpp
index fb212870822..0c8e5e6bde9 100644
--- a/src/game/CombatHandler.cpp
+++ b/src/game/CombatHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ConfusedMovementGenerator.cpp b/src/game/ConfusedMovementGenerator.cpp
index bb7b56fdca7..06871ecdfa4 100644
--- a/src/game/ConfusedMovementGenerator.cpp
+++ b/src/game/ConfusedMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ConfusedMovementGenerator.h b/src/game/ConfusedMovementGenerator.h
index 4940c4bcaea..ad47b13cb39 100644
--- a/src/game/ConfusedMovementGenerator.h
+++ b/src/game/ConfusedMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp
index fe4794dea41..6f4b0191bb4 100644
--- a/src/game/Corpse.cpp
+++ b/src/game/Corpse.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -36,7 +36,7 @@ Corpse::Corpse(CorpseType type) : WorldObject()
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
// 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = CORPSE_END;
@@ -71,26 +71,26 @@ bool Corpse::Create( uint32 guidlow )
return true;
}
-bool Corpse::Create( uint32 guidlow, Player *owner, uint32 mapid, float x, float y, float z, float ang )
+bool Corpse::Create( uint32 guidlow, Player *owner)
{
SetInstanceId(owner->GetInstanceId());
- WorldObject::_Create(guidlow, HIGHGUID_CORPSE, mapid);
+ WorldObject::_Create(guidlow, HIGHGUID_CORPSE, owner->GetMapId(), owner->GetPhaseMask());
- Relocate(x,y,z,ang);
+ Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation());
if(!IsPositionValid())
{
sLog.outError("ERROR: Corpse (guidlow %d, owner %s) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
- guidlow,owner->GetName(),x,y);
+ guidlow,owner->GetName(),owner->GetPositionX(), owner->GetPositionY());
return false;
}
SetFloatValue( OBJECT_FIELD_SCALE_X, 1 );
- SetFloatValue( CORPSE_FIELD_POS_X, x );
- SetFloatValue( CORPSE_FIELD_POS_Y, y );
- SetFloatValue( CORPSE_FIELD_POS_Z, z );
- SetFloatValue( CORPSE_FIELD_FACING, ang );
+ SetFloatValue( CORPSE_FIELD_POS_X, GetPositionX() );
+ SetFloatValue( CORPSE_FIELD_POS_Y, GetPositionY() );
+ SetFloatValue( CORPSE_FIELD_POS_Z, GetPositionZ() );
+ SetFloatValue( CORPSE_FIELD_FACING, GetOrientation() );
SetUInt64Value( CORPSE_FIELD_OWNER, owner->GetGUID() );
m_grid = Trinity::ComputeGridPair(GetPositionX(), GetPositionY());
@@ -100,17 +100,18 @@ bool Corpse::Create( uint32 guidlow, Player *owner, uint32 mapid, float x, float
void Corpse::SaveToDB()
{
- // prevent DB data inconsistance problems and duplicates
+ // prevent DB data inconsistence problems and duplicates
CharacterDatabase.BeginTransaction();
DeleteFromDB();
std::ostringstream ss;
- ss << "INSERT INTO corpse (guid,player,position_x,position_y,position_z,orientation,zone,map,data,time,corpse_type,instance) VALUES ("
+ ss << "INSERT INTO corpse (guid,player,position_x,position_y,position_z,orientation,zone,map,data,time,corpse_type,instance,phaseMask) VALUES ("
<< GetGUIDLow() << ", " << GUID_LOPART(GetOwnerGUID()) << ", " << GetPositionX() << ", " << GetPositionY() << ", " << GetPositionZ() << ", "
<< GetOrientation() << ", " << GetZoneId() << ", " << GetMapId() << ", '";
for(uint16 i = 0; i < m_valuesCount; i++ )
ss << GetUInt32Value(i) << " ";
- ss << "'," << uint64(m_time) <<", " << uint32(GetType()) << ", " << int(GetInstanceId()) << ")";
+ ss << "'," << uint64(m_time) <<", " << uint32(GetType())
+ << ", " << int(GetInstanceId()) << ", " << int(GetPhaseMask()) << ")";
CharacterDatabase.Execute( ss.str().c_str() );
CharacterDatabase.CommitTransaction();
}
@@ -143,8 +144,8 @@ bool Corpse::LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId)
{
bool external = (result != NULL);
if (!external)
- // 0 1 2 3 4 5 6 7 8
- result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance FROM corpse WHERE guid = '%u'",guid);
+ // 0 1 2 3 4 5 6 7 8 9
+ result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance,phaseMask FROM corpse WHERE guid = '%u'",guid);
if( ! result )
{
@@ -166,8 +167,8 @@ bool Corpse::LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId)
bool Corpse::LoadFromDB(uint32 guid, Field *fields)
{
- // 0 1 2 3 4 5 6 7 8
- //result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance FROM corpse WHERE guid = '%u'",guid);
+ // 0 1 2 3 4 5 6 7 8 9
+ //result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance,phaseMask FROM corpse WHERE guid = '%u'",guid);
float positionX = fields[0].GetFloat();
float positionY = fields[1].GetFloat();
float positionZ = fields[2].GetFloat();
@@ -188,6 +189,7 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields)
return false;
}
uint32 instanceid = fields[8].GetUInt32();
+ uint32 phaseMask = fields[9].GetUInt32();
// overwrite possible wrong/corrupted guid
SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_CORPSE));
@@ -195,6 +197,7 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields)
// place
SetInstanceId(instanceid);
SetMapId(mapid);
+ SetPhaseMask(phaseMask,false);
Relocate(positionX,positionY,positionZ,ort);
if(!IsPositionValid())
diff --git a/src/game/Corpse.h b/src/game/Corpse.h
index 91131c1cb85..4b0c6e7007c 100644
--- a/src/game/Corpse.h
+++ b/src/game/Corpse.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -58,7 +58,7 @@ class Corpse : public WorldObject
void RemoveFromWorld();
bool Create( uint32 guidlow );
- bool Create( uint32 guidlow, Player *owner, uint32 mapid, float x, float y, float z, float ang );
+ bool Create( uint32 guidlow, Player *owner );
void SaveToDB();
bool LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId);
@@ -82,10 +82,6 @@ class Corpse : public WorldObject
Player* lootRecipient;
bool lootForBody;
- void Say(const char* text, uint32 language, uint64 TargetGuid) { MonsterSay(text,language,TargetGuid); }
- void Yell(const char* text, uint32 language, uint64 TargetGuid) { MonsterYell(text,language,TargetGuid); }
- void TextEmote(const char* text, uint64 TargetGuid) { MonsterTextEmote(text,TargetGuid); }
- void Whisper(const char* text, uint64 receiver) { MonsterWhisper(text,receiver); }
void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 23ae8229251..bc8105abcc1 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -29,6 +29,7 @@
#include "QuestDef.h"
#include "GossipDef.h"
#include "Player.h"
+#include "PoolHandler.h"
#include "Opcodes.h"
#include "Log.h"
#include "LootMgr.h"
@@ -39,7 +40,7 @@
#include "SpellAuras.h"
#include "WaypointMovementGenerator.h"
#include "InstanceData.h"
-#include "BattleGround.h"
+#include "BattleGroundMgr.h"
#include "Util.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
@@ -51,18 +52,11 @@
// apply implementation of the singletons
#include "Policies/SingletonImp.h"
-void TrainerSpellData::Clear()
-{
- for (TrainerSpellList::iterator itr = spellList.begin(); itr != spellList.end(); ++itr)
- delete (*itr);
- spellList.empty();
-}
-
TrainerSpell const* TrainerSpellData::Find(uint32 spell_id) const
{
- for(TrainerSpellList::const_iterator itr = spellList.begin(); itr != spellList.end(); ++itr)
- if((*itr)->spell == spell_id)
- return *itr;
+ TrainerSpellMap::const_iterator itr = spellList.find(spell_id);
+ if (itr != spellList.end())
+ return &itr->second;
return NULL;
}
@@ -145,14 +139,15 @@ Unit(), i_AI(NULL), i_AI_possessed(NULL),
lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGroupLeaderGUID(0),
m_lootMoney(0), m_lootRecipient(0),
m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_respawnradius(0.0f),
-m_gossipOptionLoaded(false), m_emoteState(0), m_isPet(false), m_isTotem(false), m_reactState(REACT_AGGRESSIVE),
-m_regenTimer(2000), m_defaultMovementType(IDLE_MOTION_TYPE), m_equipmentId(0),
-m_AlreadyCallAssistance(false), m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false),
-m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),m_creatureInfo(NULL), m_DBTableGuid(0), m_formationID(0)
+m_gossipOptionLoaded(false), m_emoteState(0), m_isPet(false), m_isVehicle(false), m_isTotem(false),
+m_defaultMovementType(IDLE_MOTION_TYPE), m_DBTableGuid(0), m_equipmentId(0), m_AlreadyCallAssistance(false),
+m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),
+m_creatureInfo(NULL), m_reactState(REACT_AGGRESSIVE), m_formationID(0)
{
+ m_regenTimer = 200;
m_valuesCount = UNIT_END;
- for(int i =0; i<4; ++i)
+ for(int i =0; i<CREATURE_MAX_SPELLS; ++i)
m_spells[i] = 0;
m_CreatureSpellCooldowns.clear();
@@ -316,7 +311,6 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data )
// creatures always have melee weapon ready if any
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_AURAS );
SelectLevel(GetCreatureInfo());
if (team == HORDE)
@@ -360,10 +354,8 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data )
SetPvP(true);
}
- m_spells[0] = GetCreatureInfo()->spell1;
- m_spells[1] = GetCreatureInfo()->spell2;
- m_spells[2] = GetCreatureInfo()->spell3;
- m_spells[3] = GetCreatureInfo()->spell4;
+ for(int i=0; i < CREATURE_MAX_SPELLS; ++i)
+ m_spells[i] = GetCreatureInfo()->spells[i];
// HACK: trigger creature is always not selectable
if(isTrigger())
@@ -432,7 +424,11 @@ void Creature::Update(uint32 diff)
//Call AI respawn virtual function
i_AI->JustRespawned();
- GetMap()->Add(this);
+ uint16 poolid = poolhandler.IsPartOfAPool(GetGUIDLow(), GetTypeId());
+ if (poolid)
+ poolhandler.UpdatePool(poolid, GetGUIDLow(), GetTypeId());
+ else
+ GetMap()->Add(this);
}
break;
}
@@ -637,11 +633,11 @@ void Creature::DisablePossessedAI()
m_AI_enabled = true;
}
-bool Creature::Create (uint32 guidlow, Map *map, uint32 Entry, uint32 team, const CreatureData *data)
+bool Creature::Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 team, const CreatureData *data)
{
SetMapId(map->GetId());
SetInstanceId(map->GetInstanceId());
- //m_DBTableGuid = guidlow;
+ SetPhaseMask(phaseMask,false);
//oX = x; oY = y; dX = x; dY = y; m_moveTime = 0; m_startMove = 0;
const bool bResult = CreateFromProto(guidlow, Entry, team, data);
@@ -762,7 +758,7 @@ bool Creature::isCanInteractWithBattleMaster(Player* pPlayer, bool msg) const
if(!isBattleMaster())
return false;
- uint32 bgTypeId = objmgr.GetBattleMasterBG(GetEntry());
+ BattleGroundTypeId bgTypeId = sBattleGroundMgr.GetBattleMasterBG(GetEntry());
if(!msg)
return pPlayer->GetBGAccessByLevel(bgTypeId);
@@ -778,8 +774,11 @@ bool Creature::isCanInteractWithBattleMaster(Player* pPlayer, bool msg) const
case BATTLEGROUND_NA:
case BATTLEGROUND_BE:
case BATTLEGROUND_AA:
- case BATTLEGROUND_RL: pPlayer->PlayerTalkClass->SendGossipMenu(10024,GetGUID()); break;
- break;
+ case BATTLEGROUND_RL:
+ case BATTLEGROUND_SA:
+ case BATTLEGROUND_DS:
+ case BATTLEGROUND_RV: pPlayer->PlayerTalkClass->SendGossipMenu(10024,GetGUID()); break;
+ default: break;
}
return false;
}
@@ -815,7 +814,7 @@ void Creature::prepareGossipMenu( Player *pPlayer,uint32 gossipid )
if(gso->Id==1)
{
uint32 textid=GetNpcTextId();
- GossipText * gossiptext=objmgr.GetGossipText(textid);
+ GossipText const* gossiptext=objmgr.GetGossipText(textid);
if(!gossiptext)
cantalking=false;
}
@@ -926,13 +925,11 @@ void Creature::sendPreparedGossip(Player* player)
if(!player)
return;
- GossipMenu& gossipmenu = player->PlayerTalkClass->GetGossipMenu();
-
if(GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_WORLDEVENT) // if world event npc then
gameeventmgr.HandleWorldEventGossip(player, this); // update world state with progress
- // in case empty gossip menu open quest menu if any
- if (gossipmenu.Empty() && GetNpcTextId() == 0)
+ // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
+ if (!HasFlag(UNIT_NPC_FLAGS,UNIT_NPC_FLAG_GOSSIP) && !player->PlayerTalkClass->GetQuestMenu().Empty())
{
player->SendPreparedQuest(GetGUID());
return;
@@ -1033,7 +1030,7 @@ void Creature::OnGossipSelect(Player* player, uint32 option)
break;
case GOSSIP_OPTION_BATTLEFIELD:
{
- uint32 bgTypeId = objmgr.GetBattleMasterBG(GetEntry());
+ BattleGroundTypeId bgTypeId = sBattleGroundMgr.GetBattleMasterBG(GetEntry());
player->GetSession()->SendBattlegGroundList( GetGUID(), bgTypeId );
break;
}
@@ -1048,12 +1045,12 @@ void Creature::OnPoiSelect(Player* player, GossipOption const *gossip)
{
if(gossip->GossipId==GOSSIP_GUARD_SPELLTRAINER || gossip->GossipId==GOSSIP_GUARD_SKILLTRAINER)
{
- Poi_Icon icon = ICON_POI_0;
+ Poi_Icon icon = ICON_POI_BLANK;
//need add more case.
switch(gossip->Action)
{
case GOSSIP_GUARD_BANK:
- icon=ICON_POI_HOUSE;
+ icon=ICON_POI_SMALL_HOUSE;
break;
case GOSSIP_GUARD_RIDE:
icon=ICON_POI_RWHORSE;
@@ -1062,7 +1059,7 @@ void Creature::OnPoiSelect(Player* player, GossipOption const *gossip)
icon=ICON_POI_BLUETOWER;
break;
default:
- icon=ICON_POI_TOWER;
+ icon=ICON_POI_GREYTOWER;
break;
}
uint32 textid = GetGossipTextId( gossip->Action, GetZoneId() );
@@ -1196,10 +1193,10 @@ void Creature::SaveToDB()
return;
}
- SaveToDB(GetMapId(), data->spawnMask);
+ SaveToDB(GetMapId(), data->spawnMask,GetPhaseMask());
}
-void Creature::SaveToDB(uint32 mapid, uint8 spawnMask)
+void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
{
// update in loaded data
if (!m_DBTableGuid)
@@ -1219,6 +1216,7 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask)
// data->guid = guid don't must be update at save
data.id = GetEntry();
data.mapid = mapid;
+ data.phaseMask = phaseMask;
data.displayid = displayId;
data.equipmentId = GetEquipmentId();
data.posX = GetPositionX();
@@ -1248,6 +1246,7 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask)
<< GetEntry() << ","
<< mapid <<","
<< (uint32)spawnMask << ","
+ << (uint32)GetPhaseMask() << ","
<< displayId <<","
<< GetEquipmentId() <<","
<< GetPositionX() << ","
@@ -1417,7 +1416,7 @@ bool Creature::LoadFromDB(uint32 guid, Map *map)
if (map->GetInstanceId() != 0) guid = objmgr.GenerateLowGuid(HIGHGUID_UNIT);
uint16 team = 0;
- if(!Create(guid,map,data->id,team,data))
+ if(!Create(guid,map,data->phaseMask,data->id,team,data))
return false;
Relocate(data->posX,data->posY,data->posZ,data->orientation);
@@ -1478,11 +1477,7 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force)
if (force)
{
for (uint8 i = 0; i < 3; i++)
- {
- SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + i, 0);
- SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2), 0);
- SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2) + 1, 0);
- }
+ SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, 0);
m_equipmentId = 0;
}
return;
@@ -1494,11 +1489,7 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force)
m_equipmentId = equip_entry;
for (uint8 i = 0; i < 3; i++)
- {
- SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + i, einfo->equipmodel[i]);
- SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2), einfo->equipinfo[i]);
- SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2) + 1, einfo->equipslot[i]);
- }
+ SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->equipentry[i]);
}
bool Creature::hasQuest(uint32 quest_id) const
@@ -1556,6 +1547,10 @@ bool Creature::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bo
if (u == this)
return true;
+ // phased visibility (both must phased in same way)
+ if(!InSamePhase(u))
+ return false;
+
// always seen by owner
if(GetGUID() == u->GetCharmerOrOwnerGUID())
return true;
@@ -1729,7 +1724,7 @@ void Creature::Respawn()
}
}
-bool Creature::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
+bool Creature::IsImmunedToSpell(SpellEntry const* spellInfo)
{
if (!spellInfo)
return false;
@@ -1737,15 +1732,15 @@ bool Creature::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
return true;
- return Unit::IsImmunedToSpell(spellInfo, useCharges);
+ return Unit::IsImmunedToSpell(spellInfo);
}
-bool Creature::IsImmunedToSpellEffect(uint32 effect, uint32 mechanic) const
+bool Creature::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const
{
- if (GetCreatureInfo()->MechanicImmuneMask & (1 << (mechanic-1)))
+ if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->EffectMechanic[index] - 1)))
return true;
- return Unit::IsImmunedToSpellEffect(effect, mechanic);
+ return Unit::IsImmunedToSpellEffect(spellInfo, index);
}
SpellEntry const *Creature::reachWithSpellAttack(Unit *pVictim)
@@ -1782,14 +1777,16 @@ SpellEntry const *Creature::reachWithSpellAttack(Unit *pVictim)
if(spellInfo->manaCost > GetPower(POWER_MANA))
continue;
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
- float range = GetSpellMaxRange(srange);
- float minrange = GetSpellMinRange(srange);
+ float range = GetSpellMaxRangeForHostile(srange);
+ float minrange = GetSpellMinRangeForHostile(srange);
float dist = GetDistance(pVictim);
//if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
// continue;
if( dist > range || dist < minrange )
continue;
- if(HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
+ if(spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
+ continue;
+ if(spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
continue;
return spellInfo;
}
@@ -1826,14 +1823,16 @@ SpellEntry const *Creature::reachWithSpellCure(Unit *pVictim)
if(spellInfo->manaCost > GetPower(POWER_MANA))
continue;
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
- float range = GetSpellMaxRange(srange);
- float minrange = GetSpellMinRange(srange);
+ float range = GetSpellMaxRangeForFriend(srange);
+ float minrange = GetSpellMinRangeForFriend( srange);
float dist = GetDistance(pVictim);
//if(!isInFront( pVictim, range ) && spellInfo->AttributesEx )
// continue;
if( dist > range || dist < minrange )
continue;
- if(HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
+ if(spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
+ continue;
+ if(spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
continue;
return spellInfo;
}
@@ -1881,7 +1880,7 @@ void Creature::DoFleeToGetAssistance(float radius) // Optional parameter
Creature* pCreature = NULL;
Trinity::NearestAssistCreatureInCreatureRangeCheck u_check(this,getVictim(),radius);
- Trinity::CreatureLastSearcher<Trinity::NearestAssistCreatureInCreatureRangeCheck> searcher(pCreature, u_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestAssistCreatureInCreatureRangeCheck> searcher(this, pCreature, u_check);
VisitNearbyGridObject(radius, searcher);
if(!pCreature)
@@ -1901,7 +1900,7 @@ Unit* Creature::SelectNearestTarget(float dist) const
{
Trinity::NearestHostileUnitInAttackDistanceCheck u_check(this, dist);
- Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck> searcher(target, u_check);
+ Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck> searcher(this, target, u_check);
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
@@ -1931,8 +1930,8 @@ void Creature::CallAssistance()
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Trinity::AnyAssistCreatureInRangeCheck u_check(this, getVictim(), radius);
- Trinity::CreatureListSearcher<Trinity::AnyAssistCreatureInRangeCheck> searcher(assistList, u_check);
+ MaNGOS::AnyAssistCreatureInRangeCheck u_check(this, getVictim(), radius);
+ MaNGOS::CreatureListSearcher<MaNGOS::AnyAssistCreatureInRangeCheck> searcher(this, assistList, u_check);
TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AnyAssistCreatureInRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
diff --git a/src/game/Creature.h b/src/game/Creature.h
index ea81053aab3..df37caa1ef2 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -176,7 +176,7 @@ struct CreatureInfo
uint32 rangeattacktime;
uint32 unit_flags; // enum UnitFlags mask values
uint32 dynamicflags;
- uint32 family; // enum CreatureFamily values for type==CREATURE_TYPE_BEAST, or 0 in another cases
+ uint32 family; // enum CreatureFamily values (optional)
uint32 trainer_type;
uint32 trainer_spell;
uint32 classNum;
@@ -195,10 +195,7 @@ struct CreatureInfo
int32 resistance4;
int32 resistance5;
int32 resistance6;
- uint32 spell1;
- uint32 spell2;
- uint32 spell3;
- uint32 spell4;
+ uint32 spells[CREATURE_MAX_SPELLS];
uint32 PetSpellDataId;
uint32 mingold;
uint32 maxgold;
@@ -221,6 +218,8 @@ struct CreatureInfo
return SKILL_HERBALISM;
else if(type_flags & CREATURE_TYPEFLAGS_MININGLOOT)
return SKILL_MINING;
+ else if(type_flags & CREATURE_TYPEFLAGS_ENGINEERLOOT)
+ return SKILL_ENGINERING;
else
return SKILL_SKINNING; // normal case
}
@@ -243,12 +242,15 @@ struct NpcOptionLocale
std::vector<std::string> BoxText;
};
+struct PointOfInterestLocale
+{
+ std::vector<std::string> IconName;
+};
+
struct EquipmentInfo
{
uint32 entry;
- uint32 equipmodel[3];
- uint32 equipinfo[3];
- uint32 equipslot[3];
+ uint32 equipentry[3];
};
// from `creature` table
@@ -256,6 +258,7 @@ struct CreatureData
{
uint32 id; // entry in creature_template
uint16 mapid;
+ uint16 phaseMask;
uint32 displayid;
int32 equipmentId;
float posX;
@@ -352,6 +355,7 @@ struct VendorItemData
{
for (VendorItemList::iterator itr = m_items.begin(); itr != m_items.end(); ++itr)
delete (*itr);
+ m_items.clear();
}
};
@@ -369,25 +373,34 @@ typedef std::list<VendorItemCount> VendorItemCounts;
struct TrainerSpell
{
+ TrainerSpell() : spell(0), spellCost(0), reqSkill(0), reqSkillValue(0), reqLevel(0), learnedSpell(0) {}
+
+ TrainerSpell(uint32 _spell, uint32 _spellCost, uint32 _reqSkill, uint32 _reqSkillValue, uint32 _reqLevel, uint32 _learnedspell)
+ : spell(_spell), spellCost(_spellCost), reqSkill(_reqSkill), reqSkillValue(_reqSkillValue), reqLevel(_reqLevel), learnedSpell(_learnedspell)
+ {}
+
uint32 spell;
- uint32 spellcost;
- uint32 reqskill;
- uint32 reqskillvalue;
- uint32 reqlevel;
+ uint32 spellCost;
+ uint32 reqSkill;
+ uint32 reqSkillValue;
+ uint32 reqLevel;
+ uint32 learnedSpell;
+
+ // helpers
+ bool IsCastable() const { return learnedSpell != spell; }
};
-typedef std::vector<TrainerSpell*> TrainerSpellList;
+typedef UNORDERED_MAP<uint32 /*spellid*/, TrainerSpell> TrainerSpellMap;
struct TrainerSpellData
{
TrainerSpellData() : trainerType(0) {}
- TrainerSpellList spellList;
+ TrainerSpellMap spellList;
uint32 trainerType; // trainer type based at trainer spells, can be different from creature_template value.
// req. for correct show non-prof. trainers like weaponmaster, allowed values 0 and 2.
-
- void Clear();
TrainerSpell const* Find(uint32 spell_id) const;
+ void Clear() { spellList.clear(); }
};
typedef std::list<GossipOption> GossipOptionList;
@@ -412,7 +425,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
void AddToWorld();
void RemoveFromWorld();
- bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 team, const CreatureData *data = NULL);
+ bool Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 team, const CreatureData *data = NULL);
bool LoadCreaturesAddon(bool reload = false);
void SelectLevel(const CreatureInfo *cinfo);
void LoadEquipment(uint32 equip_entry, bool force=false);
@@ -425,6 +438,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint32 GetEquipmentId() const { return m_equipmentId; }
bool isPet() const { return m_isPet; }
+ bool isVehicle() const { return m_isVehicle; }
void SetCorpseDelay(uint32 delay) { m_corpseDelay = delay; }
bool isTotem() const { return m_isTotem; }
bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; }
@@ -441,9 +455,9 @@ class TRINITY_DLL_SPEC Creature : public Unit
bool isCanInteractWithBattleMaster(Player* player, bool msg) const;
bool isCanTrainingAndResetTalentsOf(Player* pPlayer) const;
bool IsOutOfThreatArea(Unit* pVictim) const;
- bool IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges = false);
+ bool IsImmunedToSpell(SpellEntry const* spellInfo);
// redefine Unit::IsImmunedToSpell
- bool IsImmunedToSpellEffect(uint32 effect, uint32 mechanic) const;
+ bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
// redefine Unit::IsImmunedToSpellEffect
bool isElite() const
{
@@ -526,10 +540,6 @@ class TRINITY_DLL_SPEC Creature : public Unit
void addGossipOption(GossipOption const& gso) { m_goptions.push_back(gso); }
void setEmoteState(uint8 emote) { m_emoteState = emote; };
- void Say(const char* text, uint32 language, uint64 TargetGuid) { MonsterSay(text,language,TargetGuid); }
- void Yell(const char* text, uint32 language, uint64 TargetGuid) { MonsterYell(text,language,TargetGuid); }
- void TextEmote(const char* text, uint64 TargetGuid, bool IsBossEmote = false) { MonsterTextEmote(text,TargetGuid,IsBossEmote); }
- void Whisper(const char* text, uint64 receiver, bool IsBossWhisper = false) { MonsterWhisper(text,receiver,IsBossWhisper); }
void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
void TextEmote(int32 textId, uint64 TargetGuid, bool IsBossEmote = false) { MonsterTextEmote(textId,TargetGuid,IsBossEmote); }
@@ -544,7 +554,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
bool LoadFromDB(uint32 guid, Map *map);
void SaveToDB();
// overwrited in Pet
- virtual void SaveToDB(uint32 mapid, uint8 spawnMask);
+ virtual void SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask);
virtual void DeleteFromDB(); // overwrited in Pet
Loot loot;
@@ -633,6 +643,8 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint32 GetFormationID(){return m_formationID;}
Unit *SelectVictim();
+ void SetDeadByDefault (bool death_state) {m_isDeadByDefault = death_state;}
+
protected:
bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL);
bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL);
@@ -660,11 +672,11 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint8 m_emoteState;
bool m_isPet; // set only in Pet::Pet
+ bool m_isVehicle; // set only in Vehicle::Vehicle
bool m_isTotem; // set only in Totem::Totem
ReactStates m_reactState; // for AI, not charmInfo
void RegenerateMana();
void RegenerateHealth();
- uint32 m_regenTimer;
MovementGeneratorType m_defaultMovementType;
Cell m_currentCell; // store current cell where creature listed
uint32 m_DBTableGuid; ///< For new or temporary creatures is 0 for saved it is lowguid
diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp
index 409463b0052..880522c20d2 100644
--- a/src/game/CreatureAI.cpp
+++ b/src/game/CreatureAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h
index a259475b543..6e291e2a604 100644
--- a/src/game/CreatureAI.h
+++ b/src/game/CreatureAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -142,6 +142,9 @@ class TRINITY_DLL_SPEC CreatureAI : public UnitAI
// Called when AI is temporarily replaced or put back when possess is applied or removed
virtual void OnPossess(bool apply) {}
+
+ // Called at reaching home after evade
+ virtual void JustReachedHome() {}
};
struct SelectableAI : public FactoryHolder<CreatureAI>, public Permissible<Creature>
diff --git a/src/game/CreatureAIImpl.h b/src/game/CreatureAIImpl.h
index 2f82522f426..a8b8271c5ff 100644
--- a/src/game/CreatureAIImpl.h
+++ b/src/game/CreatureAIImpl.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureAIRegistry.cpp b/src/game/CreatureAIRegistry.cpp
index 2ac73da702b..2964508af89 100644
--- a/src/game/CreatureAIRegistry.cpp
+++ b/src/game/CreatureAIRegistry.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureAIRegistry.h b/src/game/CreatureAIRegistry.h
index b4155403e9b..2b92a096731 100644
--- a/src/game/CreatureAIRegistry.h
+++ b/src/game/CreatureAIRegistry.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureAISelector.cpp b/src/game/CreatureAISelector.cpp
index a2f3d39fcc7..40b9f0c0c07 100644
--- a/src/game/CreatureAISelector.cpp
+++ b/src/game/CreatureAISelector.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureAISelector.h b/src/game/CreatureAISelector.h
index c7b4e541f3c..436233b5b21 100644
--- a/src/game/CreatureAISelector.h
+++ b/src/game/CreatureAISelector.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureGroups.cpp b/src/game/CreatureGroups.cpp
index 6b69a9102dd..215bca059e8 100644
--- a/src/game/CreatureGroups.cpp
+++ b/src/game/CreatureGroups.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/CreatureGroups.h b/src/game/CreatureGroups.h
index dbf8dcec645..11d45167fd9 100644
--- a/src/game/CreatureGroups.h
+++ b/src/game/CreatureGroups.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Debugcmds.cpp b/src/game/Debugcmds.cpp
index 3bf64188e34..6033a49e5ec 100644
--- a/src/game/Debugcmds.cpp
+++ b/src/game/Debugcmds.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -63,6 +63,7 @@ bool ChatHandler::HandleDebugSpellFailCommand(const char* args)
uint8 failnum = (uint8)atoi(px);
WorldPacket data(SMSG_CAST_FAILED, 5);
+ data << uint8(0);
data << uint32(133);
data << uint8(failnum);
m_session->SendPacket(&data);
@@ -89,9 +90,6 @@ bool ChatHandler::HandleSetPoiCommand(const char* args)
return false;
uint32 icon = atol(icon_text);
- if ( icon < 0 )
- icon = 0;
-
uint32 flags = atol(flags_text);
sLog.outDetail("Command : POI, NPC = %u, icon = %u flags = %u", target->GetGUIDLow(), icon,flags);
@@ -221,7 +219,7 @@ bool ChatHandler::HandleSendOpcodeCommand(const char* /*args*/)
ifs.close();
sLog.outDebug("Sending opcode %u", data.GetOpcode());
data.hexlike();
- ((Player*)unit)->GetSession()->SendPacket(&data);
+ player->GetSession()->SendPacket(&data);
PSendSysMessage(LANG_COMMAND_OPCODESENT, data.GetOpcode(), unit->GetName());
return true;
}
@@ -285,8 +283,7 @@ bool ChatHandler::HandleSendChatMsgCommand(const char* args)
bool ChatHandler::HandleSendQuestPartyMsgCommand(const char* args)
{
uint32 msg = atol((char*)args);
- if (msg >= 0)
- m_session->GetPlayer()->SendPushToPartyResponse(m_session->GetPlayer(), msg);
+ m_session->GetPlayer()->SendPushToPartyResponse(m_session->GetPlayer(), msg);
return true;
}
@@ -303,8 +300,7 @@ bool ChatHandler::HandleGetLootRecipient(const char* /*args*/)
bool ChatHandler::HandleSendQuestInvalidMsgCommand(const char* args)
{
uint32 msg = atol((char*)args);
- if (msg >= 0)
- m_session->GetPlayer()->SendCanTakeQuestResponse(msg);
+ m_session->GetPlayer()->SendCanTakeQuestResponse(msg);
return true;
}
@@ -542,6 +538,12 @@ bool ChatHandler::HandleGetItemState(const char* args)
return true;
}
+bool ChatHandler::HandleDebugBattlegroundCommand(const char * /*args*/)
+{
+ sBattleGroundMgr.ToggleTesting();
+ return true;
+}
+
bool ChatHandler::HandleDebugArenaCommand(const char * /*args*/)
{
sBattleGroundMgr.ToggleArenaTesting();
@@ -591,3 +593,72 @@ bool ChatHandler::HandleDebugHostilRefList(const char * /*args*/)
return true;
}
+bool ChatHandler::HandleSpawnVehicle(const char* args)
+{
+ if(!args)
+ return false;
+
+ char* e = strtok((char*)args, " ");
+ char* i = strtok(NULL, " ");
+
+ if (!e || !i)
+ return false;
+
+ uint32 entry = (uint32)atoi(e);
+ uint32 id = (uint32)atoi(i);
+
+ CreatureInfo const *ci = objmgr.GetCreatureTemplate(entry);
+
+ if(!ci)
+ return false;
+
+ VehicleEntry const *ve = sVehicleStore.LookupEntry(id);
+
+ if(!ve)
+ return false;
+
+ Vehicle *v = new Vehicle;
+ Map *map = m_session->GetPlayer()->GetMap();
+ if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, entry, id, m_session->GetPlayer()->GetTeam()))
+ {
+ delete v;
+ return false;
+ }
+
+ float px, py, pz;
+ m_session->GetPlayer()->GetClosePoint(px, py, pz, m_session->GetPlayer()->GetObjectSize());
+
+ v->Relocate(px, py, pz, m_session->GetPlayer()->GetOrientation());
+
+ if(!v->IsPositionValid())
+ {
+ sLog.outError("ERROR: Vehicle (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
+ v->GetGUIDLow(), v->GetEntry(), v->GetPositionX(), v->GetPositionY());
+ delete v;
+ return false;
+ }
+
+ map->Add((Creature*)v);
+
+ return true;
+}
+
+bool ChatHandler::HandleSendLargePacketCommand(const char* /*args*/)
+{
+ const char* stuffingString = "This is a dummy string to push the packet's size beyond 128000 bytes. ";
+ std::ostringstream ss;
+ while(ss.str().size() < 128000)
+ ss << stuffingString;
+ SendSysMessage(ss.str().c_str());
+ return true;
+}
+
+bool ChatHandler::HandleSendSetPhaseShiftCommand(const char* args)
+{
+ if(!args)
+ return false;
+
+ uint32 PhaseShift = atoi(args);
+ m_session->SendSetPhaseShift(PhaseShift);
+ return true;
+}
diff --git a/src/game/DestinationHolder.cpp b/src/game/DestinationHolder.cpp
index 904509aeef4..f2158e3b5be 100644
--- a/src/game/DestinationHolder.cpp
+++ b/src/game/DestinationHolder.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/DestinationHolder.h b/src/game/DestinationHolder.h
index 4c259d0dfde..94e12a1757d 100644
--- a/src/game/DestinationHolder.h
+++ b/src/game/DestinationHolder.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/DestinationHolderImp.h b/src/game/DestinationHolderImp.h
index fcc2d946de8..c61dadba263 100644
--- a/src/game/DestinationHolderImp.h
+++ b/src/game/DestinationHolderImp.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -85,24 +85,7 @@ DestinationHolder<TRAVELLER>::StartTravel(TRAVELLER &traveller, bool sendMove)
i_fromY = traveller.GetPositionY();
i_fromZ = traveller.GetPositionZ();
- float dx = i_destX - i_fromX;
- float dy = i_destY - i_fromY;
- float dz = i_destZ - i_fromZ;
-
- float dist;
- //Should be for Creature Flying and Swimming.
- if(traveller.GetTraveller().hasUnitState(UNIT_STAT_IN_FLIGHT))
- dist = sqrt((dx*dx) + (dy*dy) + (dz*dz));
- else //Walking on the ground
- dist = sqrt((dx*dx) + (dy*dy));
-
- float speed;
- if(traveller.GetTraveller().hasUnitState(UNIT_STAT_CHARGING))
- speed = SPEED_CHARGE * 0.001f;
- else
- speed = traveller.Speed() * 0.001f; // speed is in seconds so convert from second to millisecond
- i_totalTravelTime = static_cast<uint32>(dist/speed);
-
+ i_totalTravelTime = traveller.GetTotalTrevelTimeTo(i_destX,i_destY,i_destZ);
i_timeElapsed = 0;
if(sendMove)
traveller.MoveTo(i_destX, i_destY, i_destZ, i_totalTravelTime);
diff --git a/src/game/DuelHandler.cpp b/src/game/DuelHandler.cpp
index 58506f949e9..f0b7980821d 100644
--- a/src/game/DuelHandler.cpp
+++ b/src/game/DuelHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp
index 0ae3656fc9d..d14b213d9fa 100644
--- a/src/game/DynamicObject.cpp
+++ b/src/game/DynamicObject.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -38,7 +38,7 @@ DynamicObject::DynamicObject() : WorldObject()
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
// 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = DYNAMICOBJECT_END;
}
@@ -61,7 +61,7 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32
{
SetInstanceId(caster->GetInstanceId());
- WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetMapId());
+ WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetMapId(), caster->GetPhaseMask());
Relocate(x,y,z,0);
if(!IsPositionValid())
diff --git a/src/game/DynamicObject.h b/src/game/DynamicObject.h
index 1bcd29998f8..ccf9d47a455 100644
--- a/src/game/DynamicObject.h
+++ b/src/game/DynamicObject.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -50,10 +50,6 @@ class DynamicObject : public WorldObject
void Delay(int32 delaytime);
bool isVisibleForInState(Player const* u, bool inVisibleList) const;
- void Say(const char* text, uint32 language, uint64 TargetGuid) { MonsterSay(text,language,TargetGuid); }
- void Yell(const char* text, uint32 language, uint64 TargetGuid) { MonsterYell(text,language,TargetGuid); }
- void TextEmote(const char* text, uint64 TargetGuid) { MonsterTextEmote(text,TargetGuid); }
- void Whisper(const char* text, uint64 receiver) { MonsterWhisper(text,receiver); }
void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
diff --git a/src/game/FleeingMovementGenerator.cpp b/src/game/FleeingMovementGenerator.cpp
index 87800d2edc1..8f9eb6073d5 100644
--- a/src/game/FleeingMovementGenerator.cpp
+++ b/src/game/FleeingMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -301,19 +301,26 @@ FleeingMovementGenerator<T>::Initialize(T &owner)
if(!&owner)
return;
- Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID);
- if(!fright)
- return;
-
_Init(owner);
owner.CastStop();
owner.addUnitState(UNIT_STAT_FLEEING);
owner.SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING);
owner.SetUInt64Value(UNIT_FIELD_TARGET, 0);
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
- i_caster_x = fright->GetPositionX();
- i_caster_y = fright->GetPositionY();
- i_caster_z = fright->GetPositionZ();
+
+ if(Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID))
+ {
+ i_caster_x = fright->GetPositionX();
+ i_caster_y = fright->GetPositionY();
+ i_caster_z = fright->GetPositionZ();
+ }
+ else
+ {
+ i_caster_x = owner.GetPositionX();
+ i_caster_y = owner.GetPositionY();
+ i_caster_z = owner.GetPositionZ();
+ }
+
i_only_forward = true;
i_cur_angle = 0.0f;
i_last_distance_from_caster = 0.0f;
diff --git a/src/game/FleeingMovementGenerator.h b/src/game/FleeingMovementGenerator.h
index 6a4f3593370..ec110b62b92 100644
--- a/src/game/FleeingMovementGenerator.h
+++ b/src/game/FleeingMovementGenerator.h
@@ -1,7 +1,7 @@
/*
-* Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
-* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+* Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/FollowerRefManager.h b/src/game/FollowerRefManager.h
index 136fdbfeadb..093c85adcee 100644
--- a/src/game/FollowerRefManager.h
+++ b/src/game/FollowerRefManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/FollowerReference.cpp b/src/game/FollowerReference.cpp
index 44c8e8d55de..173f9881c54 100644
--- a/src/game/FollowerReference.cpp
+++ b/src/game/FollowerReference.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/FollowerReference.h b/src/game/FollowerReference.h
index 16fa880bcfe..3c0b3dc9e7c 100644
--- a/src/game/FollowerReference.h
+++ b/src/game/FollowerReference.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Formulas.h b/src/game/Formulas.h
index f54917be6f3..041c0621c74 100644
--- a/src/game/Formulas.h
+++ b/src/game/Formulas.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -34,7 +34,7 @@ namespace Trinity
}
namespace XP
{
- typedef enum XPColorChar { RED, ORANGE, YELLOW, GREEN, GRAY };
+ enum XPColorChar { RED, ORANGE, YELLOW, GREEN, GRAY };
inline uint32 GetGrayLevel(uint32 pl_level)
{
@@ -80,8 +80,17 @@ namespace Trinity
inline uint32 BaseGain(uint32 pl_level, uint32 mob_level, ContentLevels content)
{
- //TODO: need modifier for CONTENT_71_80 different from CONTENT_61_70?
- const uint32 nBaseExp = content == CONTENT_1_60 ? 45 : 235;
+ uint32 nBaseExp;
+ switch(content)
+ {
+ case CONTENT_1_60: nBaseExp = 45; break;
+ case CONTENT_61_70: nBaseExp = 235; break;
+ case CONTENT_71_80: nBaseExp = 580; break;
+ default:
+ sLog.outError("BaseGain: Unsupported content level %u",content);
+ nBaseExp = 45; break;
+ }
+
if( mob_level >= pl_level )
{
uint32 nLevelDiff = mob_level - pl_level;
@@ -118,66 +127,6 @@ namespace Trinity
return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
}
- inline uint32 xp_Diff(uint32 lvl)
- {
- if( lvl < 29 )
- return 0;
- if( lvl == 29 )
- return 1;
- if( lvl == 30 )
- return 3;
- if( lvl == 31 )
- return 6;
- else
- return (5*(lvl-30));
- }
-
- inline uint32 mxp(uint32 lvl)
- {
- if (lvl < 60)
- {
- return (45 + (5*lvl));
- }
- else
- {
- return (235 + (5*lvl));
- }
- }
-
- inline uint32 xp_to_level(uint32 lvl)
- {
- uint32 xp = 0;
- if (lvl < 60)
- {
- xp = (8*lvl + xp_Diff(lvl)) * mxp(lvl);
- }
- else if (lvl == 60)
- {
- xp = (155 + mxp(lvl) * (1344 - 70 - ((69 - lvl) * (7 + (69 - lvl) * 8 - 1)/2)));
- }
- else if (lvl < 70)
- {
- xp = (155 + mxp(lvl) * (1344 - ((69-lvl) * (7 + (69 - lvl) * 8 - 1)/2)));
- }else
- {
- // level higher than 70 is not supported
- xp = (uint32)(779700 * (pow(sWorld.getRate(RATE_XP_PAST_70), (int32)lvl - 69)));
- return ((xp < 0x7fffffff) ? xp : 0x7fffffff);
- }
-
- // The XP to Level is always rounded to the nearest 100 points (50 rounded to high).
- xp = ((xp + 50) / 100) * 100; // use additional () for prevent free association operations in C++
-
- if ((lvl > 10) && (lvl < 60)) // compute discount added in 2.3.x
- {
- uint32 discount = (lvl < 28) ? (lvl - 10) : 18;
- xp = (xp * (100 - discount)) / 100; // apply discount
- xp = (xp / 100) * 100; // floor to hundreds
- }
-
- return xp;
- }
-
inline float xp_in_group_rate(uint32 count, bool isRaid)
{
if(isRaid)
diff --git a/src/game/GameEvent.cpp b/src/game/GameEvent.cpp
index ae2dc488b86..49b55f727e6 100644
--- a/src/game/GameEvent.cpp
+++ b/src/game/GameEvent.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -21,6 +21,7 @@
#include "GameEvent.h"
#include "World.h"
#include "ObjectMgr.h"
+#include "PoolHandler.h"
#include "ProgressBar.h"
#include "Language.h"
#include "Log.h"
@@ -190,50 +191,52 @@ void GameEvent::LoadFromDB()
if( !result )
{
mGameEvent.clear();
- sLog.outString(">> Table game_event is empty:");
+ sLog.outString(">> Table game_event is empty!");
sLog.outString();
return;
}
uint32 count = 0;
- barGoLink bar( result->GetRowCount() );
- do
{
- ++count;
- Field *fields = result->Fetch();
+ barGoLink bar( result->GetRowCount() );
+ do
+ {
+ ++count;
+ Field *fields = result->Fetch();
- bar.step();
+ bar.step();
- uint16 event_id = fields[0].GetUInt16();
- if(event_id==0)
- {
- sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id);
- continue;
- }
+ uint16 event_id = fields[0].GetUInt16();
+ if(event_id==0)
+ {
+ sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id);
+ continue;
+ }
- GameEventData& pGameEvent = mGameEvent[event_id];
- uint64 starttime = fields[1].GetUInt64();
- pGameEvent.start = time_t(starttime);
- uint64 endtime = fields[2].GetUInt64();
- pGameEvent.end = time_t(endtime);
- pGameEvent.occurence = fields[3].GetUInt32();
- pGameEvent.length = fields[4].GetUInt32();
- pGameEvent.description = fields[5].GetCppString();
- pGameEvent.state = (GameEventState)(fields[6].GetUInt8());
- pGameEvent.nextstart = 0;
-
- if(pGameEvent.length==0 && pGameEvent.state == GAMEEVENT_NORMAL) // length>0 is validity check
- {
- sLog.outErrorDb("`game_event` game event id (%i) isn't a world event and has length = 0, thus it can't be used.",event_id);
- continue;
- }
+ GameEventData& pGameEvent = mGameEvent[event_id];
+ uint64 starttime = fields[1].GetUInt64();
+ pGameEvent.start = time_t(starttime);
+ uint64 endtime = fields[2].GetUInt64();
+ pGameEvent.end = time_t(endtime);
+ pGameEvent.occurence = fields[3].GetUInt32();
+ pGameEvent.length = fields[4].GetUInt32();
+ pGameEvent.description = fields[5].GetCppString();
+ pGameEvent.state = (GameEventState)(fields[6].GetUInt8());
+ pGameEvent.nextstart = 0;
+
+ if(pGameEvent.length==0 && pGameEvent.state == GAMEEVENT_NORMAL) // length>0 is validity check
+ {
+ sLog.outErrorDb("`game_event` game event id (%i) isn't a world event and has length = 0, thus it can't be used.",event_id);
+ continue;
+ }
- } while( result->NextRow() );
+ } while( result->NextRow() );
+ delete result;
- sLog.outString();
- sLog.outString( ">> Loaded %u game events", count );
- delete result;
+ sLog.outString();
+ sLog.outString( ">> Loaded %u game events", count );
+ }
// load game event saves
// 0 1 2
@@ -346,8 +349,8 @@ void GameEvent::LoadFromDB()
count = 0;
if( !result )
{
- barGoLink bar2(1);
- bar2.step();
+ barGoLink bar(1);
+ bar.step();
sLog.outString();
sLog.outString(">> Loaded %u creatures in game events", count );
@@ -355,12 +358,12 @@ void GameEvent::LoadFromDB()
else
{
- barGoLink bar2( result->GetRowCount() );
+ barGoLink bar( result->GetRowCount() );
do
{
Field *fields = result->Fetch();
- bar2.step();
+ bar.step();
uint32 guid = fields[0].GetUInt32();
int16 event_id = fields[1].GetInt16();
@@ -378,9 +381,10 @@ void GameEvent::LoadFromDB()
crelist.push_back(guid);
} while( result->NextRow() );
+ delete result;
+
sLog.outString();
sLog.outString( ">> Loaded %u creatures in game events", count );
- delete result;
}
mGameEventGameobjectGuids.resize(mGameEvent.size()*2-1);
@@ -391,8 +395,8 @@ void GameEvent::LoadFromDB()
count = 0;
if( !result )
{
- barGoLink bar3(1);
- bar3.step();
+ barGoLink bar(1);
+ bar.step();
sLog.outString();
sLog.outString(">> Loaded %u gameobjects in game events", count );
@@ -400,12 +404,12 @@ void GameEvent::LoadFromDB()
else
{
- barGoLink bar3( result->GetRowCount() );
+ barGoLink bar( result->GetRowCount() );
do
{
Field *fields = result->Fetch();
- bar3.step();
+ bar.step();
uint32 guid = fields[0].GetUInt32();
int16 event_id = fields[1].GetInt16();
@@ -423,10 +427,10 @@ void GameEvent::LoadFromDB()
golist.push_back(guid);
} while( result->NextRow() );
+ delete result;
+
sLog.outString();
sLog.outString( ">> Loaded %u gameobjects in game events", count );
-
- delete result;
}
mGameEventModelEquip.resize(mGameEvent.size());
@@ -439,8 +443,8 @@ void GameEvent::LoadFromDB()
count = 0;
if( !result )
{
- barGoLink bar3(1);
- bar3.step();
+ barGoLink bar(1);
+ bar.step();
sLog.outString();
sLog.outString(">> Loaded %u model/equipment changes in game events", count );
@@ -448,12 +452,12 @@ void GameEvent::LoadFromDB()
else
{
- barGoLink bar3( result->GetRowCount() );
+ barGoLink bar( result->GetRowCount() );
do
{
Field *fields = result->Fetch();
- bar3.step();
+ bar.step();
uint32 guid = fields[0].GetUInt32();
uint16 event_id = fields[1].GetUInt16();
@@ -483,10 +487,10 @@ void GameEvent::LoadFromDB()
equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet));
} while( result->NextRow() );
+ delete result;
+
sLog.outString();
sLog.outString( ">> Loaded %u model/equipment changes in game events", count );
-
- delete result;
}
mGameEventCreatureQuests.resize(mGameEvent.size());
@@ -496,8 +500,8 @@ void GameEvent::LoadFromDB()
count = 0;
if( !result )
{
- barGoLink bar3(1);
- bar3.step();
+ barGoLink bar(1);
+ bar.step();
sLog.outString();
sLog.outString(">> Loaded %u quests additions in game events", count );
@@ -505,12 +509,12 @@ void GameEvent::LoadFromDB()
else
{
- barGoLink bar3( result->GetRowCount() );
+ barGoLink bar( result->GetRowCount() );
do
{
Field *fields = result->Fetch();
- bar3.step();
+ bar.step();
uint32 id = fields[0].GetUInt32();
uint32 quest = fields[1].GetUInt32();
uint16 event_id = fields[2].GetUInt16();
@@ -569,10 +573,10 @@ void GameEvent::LoadFromDB()
questlist.push_back(QuestRelation(id, quest));
} while( result->NextRow() );
+ delete result;
+
sLog.outString();
sLog.outString( ">> Loaded %u quests additions in game events", count );
-
- delete result;
}
// Load quest to (event,condition) mapping
@@ -913,6 +917,61 @@ void GameEvent::LoadFromDB()
delete result;
}
+
+ ////////////////////////
+ // GameEventPool
+ ////////////////////////
+
+ mGameEventPoolIds.resize(mGameEvent.size()*2-1);
+ // 1 2
+ result = WorldDatabase.Query("SELECT pool_template.entry, game_event_pool.event "
+ "FROM pool_template JOIN game_event_pool ON pool_template.entry = game_event_pool.pool_entry");
+
+ count = 0;
+ if( !result )
+ {
+ barGoLink bar2(1);
+ bar2.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u pools in game events", count );
+ }
+ else
+ {
+
+ barGoLink bar2( result->GetRowCount() );
+ do
+ {
+ Field *fields = result->Fetch();
+
+ bar2.step();
+
+ uint32 entry = fields[0].GetUInt16();
+ int16 event_id = fields[1].GetInt16();
+
+ int32 internal_event_id = mGameEvent.size() + event_id - 1;
+
+ if(internal_event_id < 0 || internal_event_id >= mGameEventPoolIds.size())
+ {
+ sLog.outErrorDb("`game_event_pool` game event id (%i) is out of range compared to max event id in `game_event`",event_id);
+ continue;
+ }
+
+ if (!poolhandler.CheckPool(entry))
+ {
+ sLog.outErrorDb("Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry);
+ continue;
+ }
+
+ ++count;
+ IdList& poollist = mGameEventPoolIds[internal_event_id];
+ poollist.push_back(entry);
+
+ } while( result->NextRow() );
+ sLog.outString();
+ sLog.outString( ">> Loaded %u pools in game events", count );
+ delete result;
+ }
}
uint32 GameEvent::GetNPCFlag(Creature * cr)
@@ -1185,6 +1244,17 @@ void GameEvent::GameEventSpawn(int16 event_id)
}
}
}
+
+ if(internal_event_id < 0 || internal_event_id >= mGameEventPoolIds.size())
+ {
+ sLog.outError("GameEvent::GameEventSpawn attempt access to out of range mGameEventPoolIds element %i (size: %u)",internal_event_id,mGameEventPoolIds.size());
+ return;
+ }
+
+ for (IdList::iterator itr = mGameEventPoolIds[internal_event_id].begin();itr != mGameEventPoolIds[internal_event_id].end();++itr)
+ {
+ poolhandler.SpawnPool(*itr);
+ }
}
void GameEvent::GameEventUnspawn(int16 event_id)
@@ -1235,6 +1305,16 @@ void GameEvent::GameEventUnspawn(int16 event_id)
pGameobject->AddObjectToRemoveList();
}
}
+ if(internal_event_id < 0 || internal_event_id >= mGameEventPoolIds.size())
+ {
+ sLog.outError("GameEvent::GameEventUnspawn attempt access to out of range mGameEventPoolIds element %i (size: %u)",internal_event_id,mGameEventPoolIds.size());
+ return;
+ }
+
+ for (IdList::iterator itr = mGameEventPoolIds[internal_event_id].begin();itr != mGameEventPoolIds[internal_event_id].end();++itr)
+ {
+ poolhandler.DespawnPool(*itr);
+ }
}
void GameEvent::ChangeEquipOrModel(int16 event_id, bool activate)
diff --git a/src/game/GameEvent.h b/src/game/GameEvent.h
index 9f69aa9e6ea..184f4934b5d 100644
--- a/src/game/GameEvent.h
+++ b/src/game/GameEvent.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -127,7 +127,9 @@ class GameEvent
bool hasGameObjectActiveEventExcept(uint32 go_guid, uint16 event_id);
protected:
typedef std::list<uint32> GuidList;
+ typedef std::list<uint16> IdList;
typedef std::vector<GuidList> GameEventGuidMap;
+ typedef std::vector<IdList> GameEventIdMap;
typedef std::pair<uint32, ModelEquip> ModelEquipPair;
typedef std::list<ModelEquipPair> ModelEquipList;
typedef std::vector<ModelEquipList> GameEventModelEquipMap;
@@ -149,6 +151,7 @@ class GameEvent
GameEventModelEquipMap mGameEventModelEquip;
GameEventGuidMap mGameEventCreatureGuids;
GameEventGuidMap mGameEventGameobjectGuids;
+ GameEventIdMap mGameEventPoolIds;
GameEventDataMap mGameEvent;
GameEventBitmask mGameEventBattleGroundHolidays;
QuestIdToEventConditionMap mQuestToEventConditions;
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 9338ee17079..9f1c938ddd3 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -22,6 +22,7 @@
#include "QuestDef.h"
#include "GameObject.h"
#include "ObjectMgr.h"
+#include "PoolHandler.h"
#include "SpellMgr.h"
#include "Spell.h"
#include "UpdateMask.h"
@@ -46,7 +47,7 @@ GameObject::GameObject() : WorldObject()
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
// 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = GAMEOBJECT_END;
m_respawnTime = 0;
@@ -66,7 +67,7 @@ GameObject::~GameObject()
{
if(m_uint32Values) // field array can be not exist if GameOBject not loaded
{
- // crash possible at access to deleted GO in Unit::m_gameobj
+ // Possible crash at access to deleted GO in Unit::m_gameobj
uint64 owner_guid = GetOwnerGUID();
if(owner_guid)
{
@@ -93,11 +94,12 @@ void GameObject::RemoveFromWorld()
WorldObject::RemoveFromWorld();
}
-bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, uint32 go_state, uint32 ArtKit)
+bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, uint32 go_state, uint32 ArtKit)
{
Relocate(x,y,z,ang);
SetMapId(map->GetId());
SetInstanceId(map->GetInstanceId());
+ SetPhaseMask(phaseMask,false);
if(!IsPositionValid())
{
@@ -127,17 +129,33 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, float x, float
SetFloatValue(GAMEOBJECT_POS_Z, z);
SetFloatValue(GAMEOBJECT_FACING, ang); //this is not facing angle
- SetFloatValue (GAMEOBJECT_ROTATION, rotation0);
- SetFloatValue (GAMEOBJECT_ROTATION+1, rotation1);
- SetFloatValue (GAMEOBJECT_ROTATION+2, rotation2);
- SetFloatValue (GAMEOBJECT_ROTATION+3, rotation3);
+ int64 rotation = 0;
+
+ float f_rot1 = sin(ang / 2.0f);
+ int64 i_rot1 = f_rot1 / atan(pow(2.0f, -20.0f));
+ rotation |= (i_rot1 << 43 >> 43) & 0x00000000001FFFFF;
+
+ //float f_rot2 = sin(0.0f / 2.0f);
+ //int64 i_rot2 = f_rot2 / atan(pow(2.0f, -20.0f));
+ //rotation |= (((i_rot2 << 22) >> 32) >> 11) & 0x000003FFFFE00000;
+
+ //float f_rot3 = sin(0.0f / 2.0f);
+ //int64 i_rot3 = f_rot3 / atan(pow(2.0f, -21.0f));
+ //rotation |= (i_rot3 >> 42) & 0x7FFFFC0000000000;
+
+ SetUInt64Value(GAMEOBJECT_ROTATION, rotation);
+
+ SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0);
+ SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1);
+ SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2);
+ SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rotation3);
SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size);
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
- SetUInt32Value(OBJECT_FIELD_ENTRY, goinfo->id);
+ SetEntry(goinfo->id);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -146,7 +164,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, float x, float
SetGoAnimProgress(animprogress);
- SetUInt32Value (GAMEOBJECT_ARTKIT, ArtKit);
+ SetByteValue(GAMEOBJECT_BYTES_1, 2, ArtKit);
// Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22)
if (goinfo->type == GAMEOBJECT_TYPE_SPELLCASTER)
@@ -264,7 +282,11 @@ void GameObject::Update(uint32 /*p_time*/)
return;
}
// respawn timer
- MapManager::Instance().GetMap(GetMapId(), this)->Add(this);
+ uint16 poolid = poolhandler.IsPartOfAPool(GetGUIDLow(), TYPEID_GAMEOBJECT);
+ if (poolid)
+ poolhandler.UpdatePool(poolid, GetGUIDLow(), TYPEID_GAMEOBJECT);
+ else
+ GetMap()->Add(this);
break;
}
}
@@ -310,7 +332,7 @@ void GameObject::Update(uint32 /*p_time*/)
if(owner && NeedDespawn) // hunter trap
{
Trinity::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, owner, radius);
- Trinity::UnitSearcher<Trinity::AnyUnfriendlyNoTotemUnitInObjectRangeCheck> checker(ok, u_check);
+ Trinity::UnitSearcher<Trinity::AnyUnfriendlyNoTotemUnitInObjectRangeCheck> checker(this, ok, u_check);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -330,8 +352,8 @@ void GameObject::Update(uint32 /*p_time*/)
// affect only players
Player* p_ok = NULL;
- Trinity::AnyPlayerInObjectRangeCheck p_check(this, radius);
- Trinity::PlayerSearcher<Trinity::AnyPlayerInObjectRangeCheck> checker(p_ok, p_check);
+ MaNGOS::AnyPlayerInObjectRangeCheck p_check(this, radius);
+ MaNGOS::PlayerSearcher<MaNGOS::AnyPlayerInObjectRangeCheck> checker(this,p_ok, p_check);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -344,8 +366,8 @@ void GameObject::Update(uint32 /*p_time*/)
{
//Unit *caster = owner ? owner : ok;
- //caster->CastSpell(ok, goInfo->trap.spellId, true);
CastSpell(ok, goInfo->trap.spellId);
+ //caster->CastSpell(ok, goInfo->trap.spellId, true, 0, 0, GetGUID());
m_cooldownTime = time(NULL) + 4; // 4 seconds
if(NeedDespawn)
@@ -395,7 +417,7 @@ void GameObject::Update(uint32 /*p_time*/)
for (; it != end; it++)
{
Unit* owner = Unit::GetUnit(*this, uint64(*it));
- if (owner) owner->CastSpell(owner, spellId, false);
+ if (owner) owner->CastSpell(owner, spellId, false, 0, 0, GetGUID());
}
m_unique_users.clear();
@@ -414,7 +436,7 @@ void GameObject::Update(uint32 /*p_time*/)
//burning flags in some battlegrounds, if you find better condition, just add it
if (GetGoAnimProgress() > 0)
{
- SendObjectDeSpawnAnim(this->GetGUID());
+ SendObjectDeSpawnAnim(GetGUID());
//reset flags
SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags);
}
@@ -451,7 +473,7 @@ void GameObject::Refresh()
return;
if(isSpawned())
- MapManager::Instance().GetMap(GetMapId(), this)->Add(this);
+ GetMap()->Add(this);
}
void GameObject::AddUniqueUse(Player* player)
@@ -467,10 +489,14 @@ void GameObject::Delete()
SetGoState(1);
SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags);
- AddObjectToRemoveList();
+ uint16 poolid = poolhandler.IsPartOfAPool(GetGUIDLow(), TYPEID_GAMEOBJECT);
+ if (poolid)
+ poolhandler.UpdatePool(poolid, GetGUIDLow(), TYPEID_GAMEOBJECT);
+ else
+ AddObjectToRemoveList();
}
-void GameObject::getFishLoot(Loot *fishloot)
+void GameObject::getFishLoot(Loot *fishloot, Player* loot_owner)
{
fishloot->clear();
@@ -478,10 +504,10 @@ void GameObject::getFishLoot(Loot *fishloot)
// if subzone loot exist use it
if(LootTemplates_Fishing.HaveLootFor(subzone))
- fishloot->FillLoot(subzone, LootTemplates_Fishing, NULL);
+ fishloot->FillLoot(subzone, LootTemplates_Fishing, loot_owner,true);
// else use zone loot
else
- fishloot->FillLoot(GetZoneId(), LootTemplates_Fishing, NULL);
+ fishloot->FillLoot(GetZoneId(), LootTemplates_Fishing, loot_owner,true);
}
void GameObject::SaveToDB()
@@ -495,10 +521,10 @@ void GameObject::SaveToDB()
return;
}
- SaveToDB(GetMapId(), data->spawnMask);
+ SaveToDB(GetMapId(), data->spawnMask, data->phaseMask);
}
-void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask)
+void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
{
const GameObjectInfo *goI = GetGOInfo();
@@ -513,38 +539,40 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask)
// data->guid = guid don't must be update at save
data.id = GetEntry();
data.mapid = mapid;
+ data.phaseMask = phaseMask;
data.posX = GetFloatValue(GAMEOBJECT_POS_X);
data.posY = GetFloatValue(GAMEOBJECT_POS_Y);
data.posZ = GetFloatValue(GAMEOBJECT_POS_Z);
data.orientation = GetFloatValue(GAMEOBJECT_FACING);
- data.rotation0 = GetFloatValue(GAMEOBJECT_ROTATION+0);
- data.rotation1 = GetFloatValue(GAMEOBJECT_ROTATION+1);
- data.rotation2 = GetFloatValue(GAMEOBJECT_ROTATION+2);
- data.rotation3 = GetFloatValue(GAMEOBJECT_ROTATION+3);
+ data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0);
+ data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1);
+ data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2);
+ data.rotation3 = GetFloatValue(GAMEOBJECT_PARENTROTATION+3);
data.spawntimesecs = m_spawnedByDefault ? m_respawnDelayTime : -(int32)m_respawnDelayTime;
data.animprogress = GetGoAnimProgress();
data.go_state = GetGoState();
data.spawnMask = spawnMask;
- data.ArtKit = GetUInt32Value (GAMEOBJECT_ARTKIT);
+ data.ArtKit = GetGoArtKit();
// updated in DB
std::ostringstream ss;
ss << "INSERT INTO gameobject VALUES ( "
<< m_DBTableGuid << ", "
- << GetUInt32Value (OBJECT_FIELD_ENTRY) << ", "
+ << GetEntry() << ", "
<< mapid << ", "
<< (uint32)spawnMask << ", "
+ << (uint32)GetPhaseMask() << ","
<< GetFloatValue(GAMEOBJECT_POS_X) << ", "
<< GetFloatValue(GAMEOBJECT_POS_Y) << ", "
<< GetFloatValue(GAMEOBJECT_POS_Z) << ", "
<< GetFloatValue(GAMEOBJECT_FACING) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION+1) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION+2) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION+3) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION+3) << ", "
<< m_respawnDelayTime << ", "
- << GetGoAnimProgress() << ", "
- << GetGoState() << ")";
+ << (uint32)GetGoAnimProgress() << ", "
+ << (uint32)GetGoState() << ")";
WorldDatabase.BeginTransaction();
WorldDatabase.PExecuteLog("DELETE FROM gameobject WHERE guid = '%u'", m_DBTableGuid);
@@ -563,7 +591,8 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
}
uint32 entry = data->id;
- uint32 map_id = data->mapid;
+ //uint32 map_id = data->mapid; // already used before call
+ uint32 phaseMask = data->phaseMask;
float x = data->posX;
float y = data->posY;
float z = data->posZ;
@@ -581,7 +610,7 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
m_DBTableGuid = guid;
if (map->GetInstanceId() != 0) guid = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
- if (!Create(guid,entry, map, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state, ArtKit) )
+ if (!Create(guid,entry, map, phaseMask, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state, ArtKit) )
return false;
switch(GetGOInfo()->type)
@@ -724,10 +753,6 @@ bool GameObject::isVisibleForInState(Player const* u, bool inVisibleList) const
if(owner && u->IsHostileTo(owner) && !canDetectTrap(u, GetDistance(u)))
return false;
}
-
- // Smuggled Mana Cell required 10 invisibility type detection/state
- if(GetEntry()==187039 && ((u->m_detectInvisibilityMask | u->m_invisibilityMask) & (1<<10))==0)
- return false;
}
// check distance
@@ -810,7 +835,20 @@ void GameObject::TriggeringLinkedGameObject( uint32 trapEntry, Unit* target)
if(!trapSpell) // checked at load already
return;
- float range = GetSpellMaxRange(sSpellRangeStore.LookupEntry(trapSpell->rangeIndex));
+ float range;
+ SpellRangeEntry const * srentry = sSpellRangeStore.LookupEntry(trapSpell->rangeIndex);
+ //get owner to check hostility of GameObject
+ if (GetSpellMaxRangeForHostile(srentry) == GetSpellMaxRangeForHostile(srentry))
+ range = GetSpellMaxRangeForHostile(srentry);
+ else
+ {
+ Unit * owner=GetOwner();
+ if (owner)
+ range = owner->GetSpellMaxRangeForTarget(target, srentry);
+ else
+ //if no owner assume that object is hostile to target
+ range = GetSpellMaxRangeForHostile(srentry);
+ }
// search nearest linked GO
GameObject* trapGO = NULL;
@@ -820,8 +858,8 @@ void GameObject::TriggeringLinkedGameObject( uint32 trapEntry, Unit* target)
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::NearestGameObjectEntryInObjectRangeCheck go_check(*target,trapEntry,range);
- Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> checker(trapGO,go_check);
+ MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*target,trapEntry,range);
+ MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(this, trapGO,go_check);
TypeContainerVisitor<Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -831,7 +869,7 @@ void GameObject::TriggeringLinkedGameObject( uint32 trapEntry, Unit* target)
// found correct GO
// FIXME: when GO casting will be implemented trap must cast spell to target
if(trapGO)
- target->CastSpell(target,trapSpell,true);
+ target->CastSpell(target,trapSpell,true, 0, 0, GetGUID());
}
GameObject* GameObject::LookupFishingHoleAround(float range)
@@ -841,8 +879,8 @@ GameObject* GameObject::LookupFishingHoleAround(float range)
CellPair p(Trinity::ComputeCellPair(GetPositionX(),GetPositionY()));
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::NearestGameObjectFishingHole u_check(*this, range);
- Trinity::GameObjectSearcher<Trinity::NearestGameObjectFishingHole> checker(ok, u_check);
+ MaNGOS::NearestGameObjectFishingHole u_check(*this, range);
+ MaNGOS::GameObjectSearcher<MaNGOS::NearestGameObjectFishingHole> checker(this, ok, u_check);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -867,9 +905,9 @@ void GameObject::UseDoorOrButton(uint32 time_to_restore)
}
-void GameObject::SetGoArtKit(uint32 kit)
+void GameObject::SetGoArtKit(uint8 kit)
{
- SetUInt32Value(GAMEOBJECT_ARTKIT, kit);
+ SetByteValue(GAMEOBJECT_BYTES_1, 2, kit);
GameObjectData *data = const_cast<GameObjectData*>(objmgr.GetGOData(m_DBTableGuid));
if(data)
data->ArtKit = kit;
@@ -893,6 +931,7 @@ void GameObject::Use(Unit* user)
// by default spell caster is user
Unit* spellCaster = user;
uint32 spellId = 0;
+ bool triggered = false;
switch(GetGoType())
{
@@ -974,7 +1013,7 @@ void GameObject::Use(Unit* user)
// fallback, will always work
player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
}
- player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR+info->chair.height);
+ player->SetStandState(UNIT_STAND_STATE_SIT_LOW_CHAIR+info->chair.height);
return;
}
//big gun, its a spell/aura
@@ -1136,6 +1175,13 @@ void GameObject::Use(Unit* user)
return;
spellId = info->summoningRitual.spellId;
+ if(spellId==62330) // GO store not existed spell, replace by expected
+ {
+ // spell have reagent and mana cost but it not expected use its
+ // it triggered spell in fact casted at currently channeled GO
+ spellId = 61993;
+ triggered = true;
+ }
// finish spell
caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->SendChannelUpdate(0);
@@ -1193,7 +1239,10 @@ void GameObject::Use(Unit* user)
if (level < info->meetingstone.minLevel || level > info->meetingstone.maxLevel)
return;
- spellId = 23598;
+ if(info->id==194097)
+ spellId = 61994; // Ritual of Summoning
+ else
+ spellId = 59782; // Summoning Stone Effect
break;
}
@@ -1268,6 +1317,26 @@ void GameObject::Use(Unit* user)
}
break;
}
+ case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
+ {
+ GameObjectInfo const* info = GetGOInfo();
+ if(!info)
+ return;
+
+ if(user->GetTypeId()!=TYPEID_PLAYER)
+ return;
+
+ Player* player = (Player*)user;
+
+ // fallback, will always work
+ player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
+
+ WorldPacket data(SMSG_ENABLE_BARBER_SHOP, 0);
+ player->GetSession()->SendPacket(&data);
+
+ player->SetStandState(UNIT_STAND_STATE_SIT_LOW_CHAIR+info->barberChair.chairheight);
+ return;
+ }
default:
sLog.outDebug("Unknown Object Type %u", GetGoType());
break;
@@ -1286,7 +1355,7 @@ void GameObject::Use(Unit* user)
return;
}
- Spell *spell = new Spell(spellCaster, spellInfo, false);
+ Spell *spell = new Spell(spellCaster, spellInfo, triggered);
// spell target is user of GO
SpellCastTargets targets;
diff --git a/src/game/GameObject.h b/src/game/GameObject.h
index 2eb51a6fbe4..07f6c5a4362 100644
--- a/src/game/GameObject.h
+++ b/src/game/GameObject.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -336,12 +336,12 @@ struct GameObjectInfo
uint32 mapID; //0
uint32 difficulty; //1
} dungeonDifficulty;
- //32 GAMEOBJECT_TYPE_DO_NOT_USE_YET
+ //32 GAMEOBJECT_TYPE_BARBER_CHAIR
struct
{
- uint32 mapID; //0
- uint32 difficulty; //1
- } doNotUseYet;
+ uint32 chairheight; //0
+ uint32 heightOffset; //1
+ } barberChair;
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
{
@@ -350,6 +350,13 @@ struct GameObjectInfo
uint32 state1Name; //2
uint32 state2Name; //3
} destructibleBuilding;
+ //34 GAMEOBJECT_TYPE_TRAPDOOR
+ struct
+ {
+ uint32 whenToPause; // 0
+ uint32 startOpen; // 1
+ uint32 autoClose; // 2
+ } trapDoor;
// not use for specific field access (only for output with loop by all filed), also this determinate max union size
struct // GAMEOBJECT_TYPE_SPELLCASTER
@@ -370,7 +377,8 @@ struct GameObjectLocale
struct GameObjectData
{
uint32 id; // entry in gamobject_template
- uint32 mapid;
+ uint16 mapid;
+ uint16 phaseMask;
float posX;
float posY;
float posZ;
@@ -419,7 +427,7 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
void AddToWorld();
void RemoveFromWorld();
- bool Create(uint32 guidlow, uint32 name_id, Map *map, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, uint32 go_state, uint32 ArtKit = 0);
+ bool Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, uint32 go_state, uint32 ArtKit = 0);
void Update(uint32 p_time);
static GameObject* GetGameObject(WorldObject& object, uint64 guid);
GameObjectInfo const* GetGOInfo() const;
@@ -436,10 +444,6 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; }
- void Say(const char* text, uint32 language, uint64 TargetGuid) { MonsterSay(text,language,TargetGuid); }
- void Yell(const char* text, uint32 language, uint64 TargetGuid) { MonsterYell(text,language,TargetGuid); }
- void TextEmote(const char* text, uint64 TargetGuid) { MonsterTextEmote(text,TargetGuid); }
- void Whisper(const char* text,uint64 receiver) { MonsterWhisper(text,receiver); }
void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
@@ -449,7 +453,7 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
const char* GetNameForLocaleIdx(int32 locale_idx) const;
void SaveToDB();
- void SaveToDB(uint32 mapid, uint8 spawnMask);
+ void SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask);
bool LoadFromDB(uint32 guid, Map *map);
void DeleteFromDB();
void SetLootState(LootState s) { m_lootState = s; }
@@ -503,15 +507,15 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
void Delete();
void SetSpellId(uint32 id) { m_spellId = id;}
uint32 GetSpellId() const { return m_spellId;}
- void getFishLoot(Loot *loot);
- GameobjectTypes GetGoType() const { return GameobjectTypes(GetUInt32Value(GAMEOBJECT_TYPE_ID)); }
- void SetGoType(GameobjectTypes type) { SetUInt32Value(GAMEOBJECT_TYPE_ID, type); }
- uint32 GetGoState() const { return GetUInt32Value(GAMEOBJECT_STATE); }
- void SetGoState(uint32 state) { SetUInt32Value(GAMEOBJECT_STATE, state); }
- uint32 GetGoArtKit() const { return GetUInt32Value(GAMEOBJECT_ARTKIT); }
- void SetGoArtKit(uint32 artkit);
- uint32 GetGoAnimProgress() const { return GetUInt32Value(GAMEOBJECT_ANIMPROGRESS); }
- void SetGoAnimProgress(uint32 animprogress) { SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, animprogress); }
+ void getFishLoot(Loot *loot, Player* loot_owner);
+ GameobjectTypes GetGoType() const { return GameobjectTypes(GetByteValue(GAMEOBJECT_BYTES_1, 1)); }
+ void SetGoType(GameobjectTypes type) { SetByteValue(GAMEOBJECT_BYTES_1, 1, type); }
+ uint8 GetGoState() const { return GetByteValue(GAMEOBJECT_BYTES_1, 0); }
+ void SetGoState(uint8 state) { SetByteValue(GAMEOBJECT_BYTES_1, 0, state); }
+ uint8 GetGoArtKit() const { return GetByteValue(GAMEOBJECT_BYTES_1, 2); }
+ void SetGoArtKit(uint8 artkit);
+ uint8 GetGoAnimProgress() const { return GetByteValue(GAMEOBJECT_BYTES_1, 3); }
+ void SetGoAnimProgress(uint8 animprogress) { SetByteValue(GAMEOBJECT_BYTES_1, 3, animprogress); }
void Use(Unit* user);
diff --git a/src/game/GlobalEvents.cpp b/src/game/GlobalEvents.cpp
index a2dd89d34c0..a544113f5c8 100644
--- a/src/game/GlobalEvents.cpp
+++ b/src/game/GlobalEvents.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -55,7 +55,7 @@ static void CorpsesEraseCallBack(QueryResult *result, bool bones)
{
if(!ObjectAccessor::Instance().ConvertCorpseForPlayer(player_guid))
{
- sLog.outDebug("Corpse %u not found in world. Delete from DB.",guidlow);
+ sLog.outDebug("Corpse %u not found in world or bones creating forbidden. Delete from DB.",guidlow);
CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow);
}
}
diff --git a/src/game/GlobalEvents.h b/src/game/GlobalEvents.h
index 6ec6e6b60b1..aa99c47985e 100644
--- a/src/game/GlobalEvents.h
+++ b/src/game/GlobalEvents.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp
index b0f717eea9e..e0aff678fa6 100644
--- a/src/game/GossipDef.cpp
+++ b/src/game/GossipDef.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -127,7 +127,7 @@ bool PlayerMenu::GossipOptionCoded( unsigned int Selection )
void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )
{
WorldPacket data( SMSG_GOSSIP_MESSAGE, (100) ); // guess size
- data << npcGUID;
+ data << uint64(npcGUID);
data << uint32(0); // new 2.4.0
data << uint32( TitleTextId );
data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x0F
@@ -153,7 +153,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )
data << uint32(questID);
data << uint32( qItem.m_qIcon );
- data << uint32( pQuest ? pQuest->GetQuestLevel() : 0 );
+ data << uint32(pQuest && pQuest->GetQuestLevel() ? pQuest->GetQuestLevel() : pSession->GetPlayer()->getLevel());
std::string Title = pQuest->GetTitle();
int loc_idx = pSession->GetSessionDbLocaleIndex();
@@ -181,6 +181,7 @@ void PlayerMenu::CloseGossip()
//sLog.outDebug( "WORLD: Sent SMSG_GOSSIP_COMPLETE" );
}
+// Outdated
void PlayerMenu::SendPointOfInterest( float X, float Y, uint32 Icon, uint32 Flags, uint32 Data, char const * locName )
{
WorldPacket data( SMSG_GOSSIP_POI, (4+4+4+4+4+10) ); // guess size
@@ -194,12 +195,43 @@ void PlayerMenu::SendPointOfInterest( float X, float Y, uint32 Icon, uint32 Flag
//sLog.outDebug("WORLD: Sent SMSG_GOSSIP_POI");
}
-void PlayerMenu::SendTalking( uint32 textID )
+void PlayerMenu::SendPointOfInterest( uint32 poi_id )
{
- GossipText *pGossip;
- std::string GossipStr;
+ PointOfInterest const* poi = objmgr.GetPointOfInterest(poi_id);
+ if(!poi)
+ {
+ sLog.outErrorDb("Requested send not existed POI (Id: %u), ignore.",poi_id);
+ return;
+ }
+
+ std::string icon_name = poi->icon_name;
+
+ int loc_idx = pSession->GetSessionDbLocaleIndex();
+ if (loc_idx >= 0)
+ {
+ PointOfInterestLocale const *pl = objmgr.GetPointOfInterestLocale(poi_id);
+ if (pl)
+ {
+ if (pl->IconName.size() > size_t(loc_idx) && !pl->IconName[loc_idx].empty())
+ icon_name = pl->IconName[loc_idx];
+ }
+ }
+
+ WorldPacket data( SMSG_GOSSIP_POI, (4+4+4+4+4+10) ); // guess size
+ data << uint32(poi->flags);
+ data << float(poi->x);
+ data << float(poi->y);
+ data << uint32(poi->icon);
+ data << uint32(poi->data);
+ data << icon_name;
+
+ pSession->SendPacket( &data );
+ //sLog.outDebug("WORLD: Sent SMSG_GOSSIP_POI");
+}
- pGossip = objmgr.GetGossipText(textID);
+void PlayerMenu::SendTalking( uint32 textID )
+{
+ GossipText const* pGossip = objmgr.GetGossipText(textID);
WorldPacket data( SMSG_NPC_TEXT_UPDATE, 100 ); // guess size
data << textID; // can be < 0
@@ -259,14 +291,11 @@ void PlayerMenu::SendTalking( uint32 textID )
data << pGossip->Options[i].Language;
- data << pGossip->Options[i].Emotes[0]._Delay;
- data << pGossip->Options[i].Emotes[0]._Emote;
-
- data << pGossip->Options[i].Emotes[1]._Delay;
- data << pGossip->Options[i].Emotes[1]._Emote;
-
- data << pGossip->Options[i].Emotes[2]._Delay;
- data << pGossip->Options[i].Emotes[2]._Emote;
+ for(int j = 0; j < 3; ++j)
+ {
+ data << pGossip->Options[i].Emotes[j]._Delay;
+ data << pGossip->Options[i].Emotes[j]._Emote;
+ }
}
}
pSession->SendPacket( &data );
@@ -373,7 +402,7 @@ void PlayerMenu::SendQuestGiverQuestList( QEmote eEmote, const std::string& Titl
data << uint32(questID);
data << uint32(qmi.m_qIcon);
- data << uint32(pQuest ? pQuest->GetQuestLevel() : 0);
+ data << uint32(pQuest && pQuest->GetQuestLevel() ? pQuest->GetQuestLevel() : pSession->GetPlayer()->getLevel());
data << title;
}
pSession->SendPacket( &data );
@@ -417,10 +446,14 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
}
data << uint64(npcGUID);
+ data << uint64(0); // wotlk, something todo with quest sharing?
data << uint32(pQuest->GetQuestId());
- data << Title << Details << Objectives;
+ data << Title;
+ data << Details;
+ data << Objectives;
data << uint32(ActivateAccept);
data << uint32(pQuest->GetSuggestedPlayers());
+ data << uint8(0); // new wotlk
if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{
@@ -466,6 +499,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
data << uint32(pQuest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast==0)
data << uint32(pQuest->GetRewSpellCast()); // casted spell
data << uint32(pQuest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
+ data << uint32(pQuest->GetBonusTalents()); // bonus talents
data << uint32(QUEST_EMOTE_COUNT);
for (uint32 i=0; i < QUEST_EMOTE_COUNT; i++)
@@ -542,6 +576,8 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
data << uint32(pQuest->GetSrcItemId());
data << uint32(pQuest->GetFlags() & 0xFFFF);
data << uint32(pQuest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
+ data << uint32(pQuest->GetPlayersSlain()); // players slain
+ data << uint32(pQuest->GetBonusTalents()); // bonus talents
int iI;
@@ -588,15 +624,23 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
data << uint32(pQuest->ReqCreatureOrGOId[iI]);
}
data << uint32(pQuest->ReqCreatureOrGOCount[iI]);
+ data << uint32(pQuest->ReqSourceId[iI]);
+ }
+
+ for (iI = 0; iI < QUEST_OBJECTIVES_COUNT; ++iI)
+ {
data << uint32(pQuest->ReqItemId[iI]);
data << uint32(pQuest->ReqItemCount[iI]);
}
+ data << uint32(0); // TODO: 5 item objective
+ data << uint32(0);
+
for (iI = 0; iI < QUEST_OBJECTIVES_COUNT; iI++)
data << ObjectiveText[iI];
pSession->SendPacket( &data );
- sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u",pQuest->GetQuestId() );
+ sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", pQuest->GetQuestId() );
}
void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID, bool EnbleNext )
@@ -678,9 +722,10 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID,
data << uint32(0x08); // unused by client?
data << uint32(pQuest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast==0)
data << uint32(pQuest->GetRewSpellCast()); // casted spell
- data << uint32(0x00); // unk, NOT honor
+ data << uint32(0); // unknown
+ data << uint32(pQuest->GetBonusTalents()); // bonus talents
pSession->SendPacket( &data );
- sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() );
+ sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() );
}
void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID, bool Completable, bool CloseOnCancel )
@@ -688,16 +733,8 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID
// We can always call to RequestItems, but this packet only goes out if there are actually
// items. Otherwise, we'll skip straight to the OfferReward
- // We may wish a better check, perhaps checking the real quest requirements
- if (pQuest->GetRequestItemsText().empty())
- {
- SendQuestGiverOfferReward(pQuest, npcGUID, true);
- return;
- }
-
- std::string Title,RequestItemsText;
- Title = pQuest->GetTitle();
- RequestItemsText = pQuest->GetRequestItemsText();
+ std::string Title = pQuest->GetTitle();
+ std::string RequestItemsText = pQuest->GetRequestItemsText();
int loc_idx = pSession->GetSessionDbLocaleIndex();
if (loc_idx >= 0)
@@ -712,6 +749,13 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID
}
}
+ // We may wish a better check, perhaps checking the real quest requirements
+ if (RequestItemsText.empty())
+ {
+ SendQuestGiverOfferReward(pQuest, npcGUID, true);
+ return;
+ }
+
WorldPacket data( SMSG_QUESTGIVER_REQUEST_ITEMS, 50 ); // guess size
data << npcGUID;
data << pQuest->GetQuestId();
diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h
index e2279550528..102a34b5913 100644
--- a/src/game/GossipDef.h
+++ b/src/game/GossipDef.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -30,27 +30,27 @@ class WorldSession;
#define GOSSIP_MAX_MENU_ITEMS 64 // client supported items unknown, but provided number must be enough
#define DEFAULT_GOSSIP_MESSAGE 0xffffff
-//POI defines
+//POI icons. Many more exist, list not complete.
enum Poi_Icon
{
- ICON_POI_0 = 0, // Grey ?
- ICON_POI_1 = 1, // Red ?
- ICON_POI_2 = 2, // Blue ?
- ICON_POI_BWTOMB = 3, // Blue and White Tomb Stone
- ICON_POI_HOUSE = 4, // House
- ICON_POI_TOWER = 5, // Tower
- ICON_POI_REDFLAG = 6, // Red Flag with Yellow !
- ICON_POI_TOMB = 7, // Tomb Stone
- ICON_POI_BWTOWER = 8, // Blue and White Tower
- ICON_POI_REDTOWER = 9, // Red Tower
- ICON_POI_BLUETOWER = 10, // Blue Tower
- ICON_POI_RWTOWER = 11, // Red and White Tower
- ICON_POI_REDTOMB = 12, // Red Tomb Stone
- ICON_POI_RWTOMB = 13, // Red and White Tomb Stone
- ICON_POI_BLUETOMB = 14, // Blue Tomb Stone
- ICON_POI_NOTHING = 15, // NOTHING
- ICON_POI_16 = 16, // Red ?
- ICON_POI_17 = 17, // Grey ?
+ ICON_POI_BLANK = 0, // Blank (not visible)
+ ICON_POI_GREY_AV_MINE = 1, // Grey mine lorry
+ ICON_POI_RED_AV_MINE = 2, // Red mine lorry
+ ICON_POI_BLUE_AV_MINE = 3, // Blue mine lorry
+ ICON_POI_BWTOMB = 4, // Blue and White Tomb Stone
+ ICON_POI_SMALL_HOUSE = 5, // Small house
+ ICON_POI_GREYTOWER = 6, // Grey Tower
+ ICON_POI_REDFLAG = 7, // Red Flag w/Yellow !
+ ICON_POI_TOMBSTONE = 8, // Normal tomb stone (brown)
+ ICON_POI_BWTOWER = 9, // Blue and White Tower
+ ICON_POI_REDTOWER = 10, // Red Tower
+ ICON_POI_BLUETOWER = 11, // Blue Tower
+ ICON_POI_RWTOWER = 12, // Red and White Tower
+ ICON_POI_REDTOMB = 13, // Red Tomb Stone
+ ICON_POI_RWTOMB = 14, // Red and White Tomb Stone
+ ICON_POI_BLUETOMB = 15, // Blue Tomb Stone
+ ICON_POI_16 = 16, // Grey ?
+ ICON_POI_17 = 17, // Blue/White ?
ICON_POI_18 = 18, // Blue ?
ICON_POI_19 = 19, // Red and White ?
ICON_POI_20 = 20, // Red ?
@@ -189,6 +189,7 @@ class TRINITY_DLL_SPEC PlayerMenu
void SendGossipMenu( uint32 TitleTextId, uint64 npcGUID );
void CloseGossip();
void SendPointOfInterest( float X, float Y, uint32 Icon, uint32 Flags, uint32 Data, const char * locName );
+ void SendPointOfInterest( uint32 poi_id );
void SendTalking( uint32 textID );
void SendTalking( char const * title, char const * text );
diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h
index cb67897329f..b6623942676 100644
--- a/src/game/GridDefines.h
+++ b/src/game/GridDefines.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -57,7 +57,7 @@ class Player;
#define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS)
-#define MAP_RESOLUTION 256
+#define MAP_RESOLUTION 128
#define MAP_SIZE (SIZE_OF_GRIDS*MAX_NUMBER_OF_GRIDS)
#define MAP_HALFSIZE (MAP_SIZE/2)
diff --git a/src/game/GridNotifiers.cpp b/src/game/GridNotifiers.cpp
index f516035ea16..c6119617f33 100644
--- a/src/game/GridNotifiers.cpp
+++ b/src/game/GridNotifiers.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -142,11 +142,17 @@ VisibleNotifier::Notify()
// Now do operations that required done at object visibility change to visible
- // target aura duration for caster show only if target exist at caster client
// send data at target visibility change (adding to client)
for(std::set<WorldObject*>::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr)
+ {
+ // target aura duration for caster show only if target exist at caster client
if((*vItr)!=&i_player && (*vItr)->isType(TYPEMASK_UNIT))
- i_player.SendAuraDurationsForTarget((Unit*)(*vItr));
+ i_player.SendAurasForTarget((Unit*)(*vItr));
+
+ // non finished movements show to player
+ if((*vItr)->GetTypeId()==TYPEID_UNIT && ((Creature*)(*vItr))->isAlive())
+ ((Creature*)(*vItr))->SendMonsterMoveWithSpeedToCurrentDestination(&i_player);
+ }
}
void
@@ -154,6 +160,11 @@ Deliverer::Visit(PlayerMapType &m)
{
for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
{
+ //if (!i_source.InSamePhase(iter->getSource()))
+ // continue;
+ if(!iter->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if (!i_dist || iter->getSource()->GetDistance(&i_source) <= i_dist)
{
// Send packet to all who are sharing the player's vision
@@ -174,6 +185,9 @@ Deliverer::Visit(CreatureMapType &m)
{
for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
{
+ if(!iter->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if (!i_dist || iter->getSource()->GetDistance(&i_source) <= i_dist)
{
// Send packet to all who are sharing the creature's vision
@@ -192,6 +206,9 @@ Deliverer::Visit(DynamicObjectMapType &m)
{
for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
{
+ if(!iter->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if (IS_PLAYER_GUID(iter->getSource()->GetCasterGUID()))
{
// Send packet back to the caster if the caster has vision of dynamic object
@@ -249,9 +266,6 @@ ObjectUpdater::Visit(GridRefManager<T> &m)
}
}
-template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &);
-template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType &);
-
bool CannibalizeObjectCheck::operator()(Corpse* u)
{
// ignore bones
@@ -269,3 +283,5 @@ bool CannibalizeObjectCheck::operator()(Corpse* u)
return false;
}
+template void ObjectUpdater::Visit<GameObject>(GameObjectMapType &);
+template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType &);
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index b7b0a9d4292..db1e700fe55 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -96,8 +96,10 @@ namespace Trinity
std::set<uint64> plr_list;
bool i_toPossessor;
bool i_toSelf;
+ uint32 i_phaseMask;
float i_dist;
- Deliverer(WorldObject &src, WorldPacket *msg, bool to_possessor, bool to_self, float dist = 0.0f) : i_source(src), i_message(msg), i_toPossessor(to_possessor), i_toSelf(to_self), i_dist(dist) {}
+ Deliverer(WorldObject &src, WorldPacket *msg, bool to_possessor, bool to_self, float dist = 0.0f)
+ : i_source(src), i_message(msg), i_toPossessor(to_possessor), i_toSelf(to_self), i_dist(dist), i_phaseMask(src.GetPhaseMask()) {}
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
void Visit(DynamicObjectMapType &m);
@@ -215,10 +217,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL WorldObjectSearcher
{
+ uint32 i_phaseMask;
WorldObject* &i_object;
Check &i_check;
- WorldObjectSearcher(WorldObject* & result, Check& check) : i_object(result),i_check(check) {}
+ WorldObjectSearcher(WorldObject const* searcher, WorldObject* & result, Check& check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(GameObjectMapType &m);
void Visit(PlayerMapType &m);
@@ -232,10 +236,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL WorldObjectListSearcher
{
+ uint32 i_phaseMask;
std::list<WorldObject*> &i_objects;
Check& i_check;
- WorldObjectListSearcher(std::list<WorldObject*> &objects, Check & check) : i_objects(objects),i_check(check) {}
+ WorldObjectListSearcher(WorldObject const* searcher, std::list<WorldObject*> &objects, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
@@ -249,37 +255,44 @@ namespace Trinity
template<class Do>
struct TRINITY_DLL_DECL WorldObjectWorker
{
+ uint32 i_phaseMask;
Do const& i_do;
- explicit WorldObjectWorker(Do const& _do) : i_do(_do) {}
+ WorldObjectWorker(WorldObject const* searcher, Do const& _do)
+ : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}
void Visit(GameObjectMapType &m)
{
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- i_do(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
}
void Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- i_do(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
}
void Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- i_do(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
}
void Visit(CorpseMapType &m)
{
for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- i_do(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
}
void Visit(DynamicObjectMapType &m)
{
for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- i_do(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
}
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
@@ -290,10 +303,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL GameObjectSearcher
{
+ uint32 i_phaseMask;
GameObject* &i_object;
Check &i_check;
- GameObjectSearcher(GameObject* & result, Check& check) : i_object(result),i_check(check) {}
+ GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(GameObjectMapType &m);
@@ -304,10 +319,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL GameObjectLastSearcher
{
+ uint32 i_phaseMask;
GameObject* &i_object;
Check& i_check;
- GameObjectLastSearcher(GameObject* & result, Check& check) : i_object(result),i_check(check) {}
+ GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {}
void Visit(GameObjectMapType &m);
@@ -317,10 +334,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL GameObjectListSearcher
{
+ uint32 i_phaseMask;
std::list<GameObject*> &i_objects;
Check& i_check;
- GameObjectListSearcher(std::list<GameObject*> &objects, Check & check) : i_objects(objects),i_check(check) {}
+ GameObjectListSearcher(WorldObject const* searcher, std::list<GameObject*> &objects, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {}
void Visit(GameObjectMapType &m);
@@ -333,10 +352,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL UnitSearcher
{
+ uint32 i_phaseMask;
Unit* &i_object;
Check & i_check;
- UnitSearcher(Unit* & result, Check & check) : i_object(result),i_check(check) {}
+ UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(CreatureMapType &m);
void Visit(PlayerMapType &m);
@@ -348,10 +369,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL UnitLastSearcher
{
+ uint32 i_phaseMask;
Unit* &i_object;
Check & i_check;
- UnitLastSearcher(Unit* & result, Check & check) : i_object(result),i_check(check) {}
+ UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(CreatureMapType &m);
void Visit(PlayerMapType &m);
@@ -363,10 +386,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL UnitListSearcher
{
+ uint32 i_phaseMask;
std::list<Unit*> &i_objects;
Check& i_check;
- UnitListSearcher(std::list<Unit*> &objects, Check & check) : i_objects(objects),i_check(check) {}
+ UnitListSearcher(WorldObject const* searcher, std::list<Unit*> &objects, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
@@ -379,10 +404,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL CreatureSearcher
{
+ uint32 i_phaseMask;
Creature* &i_object;
Check & i_check;
- CreatureSearcher(Creature* & result, Check & check) : i_object(result),i_check(check) {}
+ CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(CreatureMapType &m);
@@ -393,10 +420,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL CreatureLastSearcher
{
+ uint32 i_phaseMask;
Creature* &i_object;
Check & i_check;
- CreatureLastSearcher(Creature* & result, Check & check) : i_object(result),i_check(check) {}
+ CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(CreatureMapType &m);
@@ -406,10 +435,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL CreatureListSearcher
{
+ uint32 i_phaseMask;
std::list<Creature*> &i_objects;
Check& i_check;
- CreatureListSearcher(std::list<Creature*> &objects, Check & check) : i_objects(objects),i_check(check) {}
+ CreatureListSearcher(WorldObject const* searcher, std::list<Creature*> &objects, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}
void Visit(CreatureMapType &m);
@@ -421,10 +452,12 @@ namespace Trinity
template<class Check>
struct TRINITY_DLL_DECL PlayerSearcher
{
+ uint32 i_phaseMask;
Player* &i_object;
Check & i_check;
- PlayerSearcher(Player* & result, Check & check) : i_object(result),i_check(check) {}
+ PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check)
+ : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}
void Visit(PlayerMapType &m);
@@ -434,14 +467,37 @@ namespace Trinity
template<class Do>
struct TRINITY_DLL_DECL PlayerWorker
{
+ uint32 i_phaseMask;
Do& i_do;
- explicit PlayerWorker(Do& _do) : i_do(_do) {}
+ PlayerWorker(WorldObject const* searcher, Do& _do)
+ : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}
void Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- i_do(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ i_do(itr->getSource());
+ }
+
+ template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
+ };
+
+ template<class Do>
+ struct TRINITY_DLL_DECL PlayerDistWorker
+ {
+ WorldObject const* i_searcher;
+ float i_dist;
+ Do& i_do;
+
+ PlayerDistWorker(WorldObject const* searcher, float _dist, Do& _do)
+ : i_searcher(searcher), i_dist(_dist), i_do(_do) {}
+
+ void Visit(PlayerMapType &m)
+ {
+ for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
+ if(itr->getSource()->InSamePhase(i_searcher) && itr->getSource()->GetDistance(i_searcher) <= i_dist)
+ i_do(itr->getSource());
}
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
@@ -967,6 +1023,27 @@ namespace Trinity
float range;
};
+ // Player checks and do
+
+ // Prepare using Builder localized packets with caching and send to player
+ template<class Builder>
+ class LocalizedPacketDo
+ {
+ public:
+ explicit LocalizedPacketDo(Builder& builder) : i_builder(builder) {}
+
+ ~LocalizedPacketDo()
+ {
+ for(size_t i = 0; i < i_data_cache.size(); ++i)
+ delete i_data_cache[i];
+ }
+ void operator()( Player* p );
+
+ private:
+ Builder& i_builder;
+ std::vector<WorldPacket*> i_data_cache; // 0 = default, i => i-1 locale index
+ };
+
#ifndef WIN32
template<> void PlayerRelocationNotifier::Visit<Creature>(CreatureMapType &);
template<> void PlayerRelocationNotifier::Visit<Player>(PlayerMapType &);
diff --git a/src/game/GridNotifiersImpl.h b/src/game/GridNotifiersImpl.h
index 57fde9423d5..525402f0a1c 100644
--- a/src/game/GridNotifiersImpl.h
+++ b/src/game/GridNotifiersImpl.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -155,7 +155,7 @@ inline void Trinity::DynamicObjectUpdater::VisitHelper(Unit* target)
if( target->GetTypeId()==TYPEID_PLAYER && target != i_check && (((Player*)target)->isGameMaster() || ((Player*)target)->GetVisibility()==VISIBILITY_OFF) )
return;
- if( i_check->GetTypeId()==TYPEID_PLAYER )
+ if (i_check->GetTypeId()==TYPEID_PLAYER )
{
if (i_check->IsFriendlyTo( target ))
return;
@@ -172,7 +172,7 @@ inline void Trinity::DynamicObjectUpdater::VisitHelper(Unit* target)
SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_dynobject.GetSpellId());
uint32 eff_index = i_dynobject.GetEffIndex();
// Check target immune to spell or aura
- if (target->IsImmunedToSpell(spellInfo) || target->IsImmunedToSpellEffect(spellInfo->Effect[eff_index], spellInfo->EffectMechanic[eff_index]))
+ if (target->IsImmunedToSpell(spellInfo) || target->IsImmunedToSpellEffect(spellInfo, eff_index))
return;
// Apply PersistentAreaAura on target
PersistentAreaAura* Aur = new PersistentAreaAura(spellInfo, eff_index, NULL, target, i_dynobject.GetCaster());
@@ -209,7 +209,10 @@ void Trinity::WorldObjectSearcher<Check>::Visit(GameObjectMapType &m)
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
- if(i_check(itr->getSource()))
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
+ if (i_check(itr->getSource()))
{
i_object = itr->getSource();
return;
@@ -226,6 +229,9 @@ void Trinity::WorldObjectSearcher<Check>::Visit(PlayerMapType &m)
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -243,6 +249,9 @@ void Trinity::WorldObjectSearcher<Check>::Visit(CreatureMapType &m)
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -260,6 +269,9 @@ void Trinity::WorldObjectSearcher<Check>::Visit(CorpseMapType &m)
for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -277,6 +289,9 @@ void Trinity::WorldObjectSearcher<Check>::Visit(DynamicObjectMapType &m)
for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -289,40 +304,45 @@ template<class Check>
void Trinity::WorldObjectListSearcher<Check>::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
template<class Check>
void Trinity::WorldObjectListSearcher<Check>::Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
template<class Check>
void Trinity::WorldObjectListSearcher<Check>::Visit(CorpseMapType &m)
{
for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
template<class Check>
void Trinity::WorldObjectListSearcher<Check>::Visit(GameObjectMapType &m)
{
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
template<class Check>
void Trinity::WorldObjectListSearcher<Check>::Visit(DynamicObjectMapType &m)
{
for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
// Gameobject searchers
@@ -336,6 +356,9 @@ void Trinity::GameObjectSearcher<Check>::Visit(GameObjectMapType &m)
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -349,6 +372,9 @@ void Trinity::GameObjectLastSearcher<Check>::Visit(GameObjectMapType &m)
{
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
i_object = itr->getSource();
}
@@ -358,8 +384,9 @@ template<class Check>
void Trinity::GameObjectListSearcher<Check>::Visit(GameObjectMapType &m)
{
for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
// Unit searchers
@@ -373,6 +400,9 @@ void Trinity::UnitSearcher<Check>::Visit(CreatureMapType &m)
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -390,6 +420,9 @@ void Trinity::UnitSearcher<Check>::Visit(PlayerMapType &m)
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -403,6 +436,9 @@ void Trinity::UnitLastSearcher<Check>::Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
i_object = itr->getSource();
}
@@ -413,6 +449,9 @@ void Trinity::UnitLastSearcher<Check>::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
i_object = itr->getSource();
}
@@ -422,16 +461,18 @@ template<class Check>
void Trinity::UnitListSearcher<Check>::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
template<class Check>
void Trinity::UnitListSearcher<Check>::Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if(i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
// Creature searchers
@@ -445,6 +486,9 @@ void Trinity::CreatureSearcher<Check>::Visit(CreatureMapType &m)
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -458,6 +502,9 @@ void Trinity::CreatureLastSearcher<Check>::Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
i_object = itr->getSource();
}
@@ -467,8 +514,9 @@ template<class Check>
void Trinity::CreatureListSearcher<Check>::Visit(CreatureMapType &m)
{
for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if(i_check(itr->getSource()))
- i_objects.push_back(itr->getSource());
+ if(itr->getSource()->InSamePhase(i_phaseMask))
+ if( i_check(itr->getSource()))
+ i_objects.push_back(itr->getSource());
}
template<class Check>
@@ -480,6 +528,9 @@ void Trinity::PlayerSearcher<Check>::Visit(PlayerMapType &m)
for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
{
+ if(!itr->getSource()->InSamePhase(i_phaseMask))
+ continue;
+
if(i_check(itr->getSource()))
{
i_object = itr->getSource();
@@ -488,5 +539,30 @@ void Trinity::PlayerSearcher<Check>::Visit(PlayerMapType &m)
}
}
+template<class Builder>
+void MaNGOS::LocalizedPacketDo<Builder>::operator()( Player* p )
+{
+ uint32 loc_idx = p->GetSession()->GetSessionDbLocaleIndex();
+ uint32 cache_idx = loc_idx+1;
+ WorldPacket* data;
+
+ // create if not cached yet
+ if(i_data_cache.size() < cache_idx+1 || !i_data_cache[cache_idx])
+ {
+ if(i_data_cache.size() < cache_idx+1)
+ i_data_cache.resize(cache_idx+1);
+
+ data = new WorldPacket(SMSG_MESSAGECHAT, 200);
+
+ i_builder(*data,loc_idx);
+
+ i_data_cache[cache_idx] = data;
+ }
+ else
+ data = i_data_cache[cache_idx];
+
+ p->SendDirectMessage(data);
+}
+
#endif // TRINITY_GRIDNOTIFIERSIMPL_H
diff --git a/src/game/GridStates.cpp b/src/game/GridStates.cpp
index bb47428553c..92054e5948a 100644
--- a/src/game/GridStates.cpp
+++ b/src/game/GridStates.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/GridStates.h b/src/game/GridStates.h
index 167f30b8371..12d64ad58ca 100644
--- a/src/game/GridStates.h
+++ b/src/game/GridStates.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Group.cpp b/src/game/Group.cpp
index f0a9ce5add8..33dc3226ec2 100644
--- a/src/game/Group.cpp
+++ b/src/game/Group.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -10,12 +10,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Common.h"
@@ -74,6 +74,8 @@ Group::~Group()
for(uint8 i = 0; i < TOTAL_DIFFICULTIES; i++)
for(BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr)
itr->second.save->RemoveGroup(this);
+
+ // Sub group counters clean up
if (m_subGroupsCounts)
delete[] m_subGroupsCounts;
}
@@ -203,6 +205,11 @@ void Group::ConvertToRaid()
if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET isRaid = 1 WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid));
SendUpdate();
+
+ // update quest related GO states (quest activity dependent from raid membership)
+ for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
+ if(Player* player = objmgr.GetPlayer(citr->guid))
+ player->UpdateForQuestsGO();
}
bool Group::AddInvite(Player *player)
@@ -288,6 +295,10 @@ bool Group::AddMember(const uint64 &guid, const char* name)
}
player->SetGroupUpdateFlag(GROUP_UPDATE_FULL);
UpdatePlayerOutOfRange(player);
+
+ // quest related GO state dependent from raid memebership
+ if(isRaidGroup())
+ player->UpdateForQuestsGO();
}
return true;
@@ -302,9 +313,12 @@ uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method)
{
bool leaderChanged = _removeMember(guid);
- Player *player = objmgr.GetPlayer( guid ); // FG: TODO: could be removed, its just here for consistency
- if (player)
+ if(Player *player = objmgr.GetPlayer( guid ))
{
+ // quest related GO state dependent from raid membership
+ if(isRaidGroup())
+ player->UpdateForQuestsGO();
+
WorldPacket data;
if(method == 1)
@@ -363,6 +377,11 @@ void Group::Disband(bool hideDestroy)
player->SetGroup(NULL);
+ // quest related GO state dependent from raid membership
+ if(isRaidGroup())
+ player->UpdateForQuestsGO();
+
+
if(!player->GetSession())
continue;
@@ -729,6 +748,8 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers)
if(player && player->GetSession())
{
+ player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, roll->itemid, maxresul);
+
ItemPosCountVec dest;
LootItem *item = &(roll->getLoot()->items[roll->itemSlot]);
uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count );
@@ -774,6 +795,8 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers)
if(player && player->GetSession())
{
+ player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, roll->itemid, maxresul);
+
ItemPosCountVec dest;
LootItem *item = &(roll->getLoot()->items[roll->itemSlot]);
uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count );
@@ -835,13 +858,10 @@ void Group::GetDataForXPAtKill(Unit const* victim, uint32& count,uint32& sum_lev
++count;
sum_level += member->getLevel();
- // store maximum member level
if(!member_with_max_level || member_with_max_level->getLevel() < member->getLevel())
member_with_max_level = member;
- uint32 gray_level = Trinity::XP::GetGrayLevel(member->getLevel());
- // if the victim is higher level than the gray level of the currently examined group member,
- // then set not_gray_member_with_max_level if needed.
+ uint32 gray_level = MaNGOS::XP::GetGrayLevel(member->getLevel());
if( victim->getLevel() > gray_level && (!not_gray_member_with_max_level
|| not_gray_member_with_max_level->getLevel() < member->getLevel()))
not_gray_member_with_max_level = member;
@@ -905,7 +925,6 @@ void Group::SendUpdate()
data << (uint64)m_looterGuid; // looter guid
data << (uint8)m_lootThreshold; // loot threshold
data << (uint8)m_difficulty; // Heroic Mod Group
-
}
player->GetSession()->SendPacket( &data );
}
@@ -984,7 +1003,7 @@ bool Group::_addMember(const uint64 &guid, const char* name, bool isAssistant)
}
// We are raid group and no one slot is free
if (!groupFound)
- return false;
+ return false;
}
return _addMember(guid, name, isAssistant, groupid);
@@ -1048,6 +1067,7 @@ bool Group::_removeMember(const uint64 &guid)
if (slot != m_memberSlots.end())
{
SubGroupCounterDecrease(slot->group);
+
m_memberSlots.erase(slot);
}
@@ -1207,6 +1227,7 @@ void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group)
if(!isRaidGroup())
return;
Player *player = objmgr.GetPlayer(guid);
+
if (!player)
{
uint8 prevSubGroup;
@@ -1218,6 +1239,7 @@ void Group::ChangeMembersGroup(const uint64 &guid, const uint8 &group)
SendUpdate();
}
else
+ // This methods handles itself groupcounter decrease
ChangeMembersGroup(player, group);
}
@@ -1311,7 +1333,7 @@ void Group::UpdateLooterGuid( Creature* creature, bool ifneed )
SendUpdate();
}
-uint32 Group::CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot)
+uint32 Group::CanJoinBattleGroundQueue(BattleGroundTypeId bgTypeId, BattleGroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot)
{
// check for min / max count
uint32 memberscount = GetMembersCount();
@@ -1326,7 +1348,7 @@ uint32 Group::CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint
if(!reference)
return BG_JOIN_ERR_OFFLINE_MEMBER;
- uint32 bgQueueId = reference->GetBattleGroundQueueIdFromLevel();
+ uint32 queue_id = reference->GetBattleGroundQueueIdFromLevel(bgTypeId);
uint32 arenaTeamId = reference->GetArenaTeamId(arenaSlot);
uint32 team = reference->GetTeam();
@@ -1341,13 +1363,13 @@ uint32 Group::CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint
if(member->GetTeam() != team)
return BG_JOIN_ERR_MIXED_FACTION;
// not in the same battleground level braket, don't let join
- if(member->GetBattleGroundQueueIdFromLevel() != bgQueueId)
+ if(member->GetBattleGroundQueueIdFromLevel(bgTypeId) != queue_id)
return BG_JOIN_ERR_MIXED_LEVELS;
// don't let join rated matches if the arena team id doesn't match
if(isRated && member->GetArenaTeamId(arenaSlot) != arenaTeamId)
return BG_JOIN_ERR_MIXED_ARENATEAM;
// don't let join if someone from the group is already in that bg queue
- if(member->InBattleGroundQueueForBattleGroundQueueType(bgQueueType))
+ if(member->InBattleGroundQueueForBattleGroundQueueType(bgQueueTypeId))
return BG_JOIN_ERR_GROUP_MEMBER_ALREADY_IN_QUEUE;
// check for deserter debuff in case not arena queue
if(bgTypeId != BATTLEGROUND_AA && !member->CanJoinToBattleground())
@@ -1366,7 +1388,7 @@ uint32 Group::CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint
void Roll::targetObjectBuildLink()
{
// called from link()
- this->getTarget()->addLootValidatorRef(this);
+ getTarget()->addLootValidatorRef(this);
}
void Group::SetDifficulty(uint8 difficulty)
@@ -1476,7 +1498,7 @@ InstanceGroupBind* Group::BindToInstance(InstanceSave *save, bool permanent, boo
InstanceGroupBind& bind = m_boundInstances[save->GetDifficulty()][save->GetMapId()];
if(bind.save)
{
- // when a boss is killed or when copying the player's binds to the group
+ // when a boss is killed or when copying the players's binds to the group
if(permanent != bind.perm || save != bind.save)
if(!load) CharacterDatabase.PExecute("UPDATE group_instance SET instance = '%u', permanent = '%u' WHERE leaderGuid = '%u' AND instance = '%u'", save->GetInstanceId(), permanent, GUID_LOPART(GetLeaderGUID()), bind.save->GetInstanceId());
}
diff --git a/src/game/Group.h b/src/game/Group.h
index 76543dd4873..939f240a7e2 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -23,6 +23,7 @@
#include "GroupReference.h"
#include "GroupRefManager.h"
+#include "BattleGround.h"
#include "LootMgr.h"
#include <map>
@@ -66,24 +67,25 @@ enum GroupUpdateFlags
{
GROUP_UPDATE_FLAG_NONE = 0x00000000, // nothing
GROUP_UPDATE_FLAG_STATUS = 0x00000001, // uint16, flags
- GROUP_UPDATE_FLAG_CUR_HP = 0x00000002, // uint16
- GROUP_UPDATE_FLAG_MAX_HP = 0x00000004, // uint16
+ GROUP_UPDATE_FLAG_CUR_HP = 0x00000002, // uint32
+ GROUP_UPDATE_FLAG_MAX_HP = 0x00000004, // uint32
GROUP_UPDATE_FLAG_POWER_TYPE = 0x00000008, // uint8
GROUP_UPDATE_FLAG_CUR_POWER = 0x00000010, // uint16
GROUP_UPDATE_FLAG_MAX_POWER = 0x00000020, // uint16
GROUP_UPDATE_FLAG_LEVEL = 0x00000040, // uint16
GROUP_UPDATE_FLAG_ZONE = 0x00000080, // uint16
GROUP_UPDATE_FLAG_POSITION = 0x00000100, // uint16, uint16
- GROUP_UPDATE_FLAG_AURAS = 0x00000200, // uint64 mask, for each bit set uint16 spellid + uint8 unk
+ GROUP_UPDATE_FLAG_AURAS = 0x00000200, // uint64 mask, for each bit set uint32 spellid + uint8 unk
GROUP_UPDATE_FLAG_PET_GUID = 0x00000400, // uint64 pet guid
GROUP_UPDATE_FLAG_PET_NAME = 0x00000800, // pet name, NULL terminated string
GROUP_UPDATE_FLAG_PET_MODEL_ID = 0x00001000, // uint16, model id
- GROUP_UPDATE_FLAG_PET_CUR_HP = 0x00002000, // uint16 pet cur health
- GROUP_UPDATE_FLAG_PET_MAX_HP = 0x00004000, // uint16 pet max health
+ GROUP_UPDATE_FLAG_PET_CUR_HP = 0x00002000, // uint32 pet cur health
+ GROUP_UPDATE_FLAG_PET_MAX_HP = 0x00004000, // uint32 pet max health
GROUP_UPDATE_FLAG_PET_POWER_TYPE = 0x00008000, // uint8 pet power type
GROUP_UPDATE_FLAG_PET_CUR_POWER = 0x00010000, // uint16 pet cur power
GROUP_UPDATE_FLAG_PET_MAX_POWER = 0x00020000, // uint16 pet max power
- GROUP_UPDATE_FLAG_PET_AURAS = 0x00040000, // uint64 mask, for each bit set uint16 spellid + uint8 unk, pet auras...
+ GROUP_UPDATE_FLAG_PET_AURAS = 0x00040000, // uint64 mask, for each bit set uint32 spellid + uint8 unk, pet auras...
+ GROUP_UPDATE_FLAG_VEHICLE_SEAT = 0x00080000, // uint32 vehicle_seat_id (index from VehicleSeat.dbc)
GROUP_UPDATE_PET = 0x0007FC00, // all pet flags
GROUP_UPDATE_FULL = 0x0007FFFF, // all known flags
};
@@ -249,7 +251,7 @@ class TRINITY_DLL_SPEC Group
void ConvertToRaid();
void SetBattlegroundGroup(BattleGround *bg) { m_bgGroup = bg; }
- uint32 CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot);
+ uint32 CanJoinBattleGroundQueue(BattleGroundTypeId bgTypeId, BattleGroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot);
void ChangeMembersGroup(const uint64 &guid, const uint8 &group);
void ChangeMembersGroup(Player *player, const uint8 &group);
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp
index f35c60aa81c..a072b92a0d4 100644
--- a/src/game/GroupHandler.cpp
+++ b/src/game/GroupHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -162,6 +162,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )
// ok, we do it
WorldPacket data(SMSG_GROUP_INVITE, 10); // guess size
+ data << uint8(1); // ok
data << GetPlayer()->GetName();
player->GetSession()->SendPacket(&data);
@@ -554,8 +555,20 @@ void WorldSession::HandleGroupChangeSubGroupOpcode( WorldPacket & recv_data )
return;
/********************/
+ Player *movedPlayer=objmgr.GetPlayer(name.c_str());
+ if(!movedPlayer)
+ return;
+
+ //Do not allow leader to change group of player in combat
+ if (movedPlayer->isInCombat())
+ {
+ WorldPacket data(SMSG_GROUP_SWAP_FAILED, (0));
+ SendPacket(&data);
+ return;
+ }
+
// everything's fine, do it
- group->ChangeMembersGroup(objmgr.GetPlayer(name.c_str()), groupNr);
+ group->ChangeMembersGroup(movedPlayer, groupNr);
}
void WorldSession::HandleGroupAssistantOpcode( WorldPacket & recv_data )
@@ -690,10 +703,10 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
}
if (mask & GROUP_UPDATE_FLAG_CUR_HP)
- *data << (uint16) player->GetHealth();
+ *data << (uint32) player->GetHealth();
if (mask & GROUP_UPDATE_FLAG_MAX_HP)
- *data << (uint16) player->GetMaxHealth();
+ *data << (uint32) player->GetMaxHealth();
Powers powerType = player->getPowerType();
if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)
@@ -716,18 +729,15 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_AURAS)
{
- uint64 auramask = player->GetAuraUpdateMask();
+ const uint64& auramask = player->GetAuraUpdateMaskForRaid();
*data << uint64(auramask);
for(uint32 i = 0; i < MAX_AURAS; ++i)
{
if(auramask & (uint64(1) << i))
{
- uint32 updatedAura=player->GetUInt32Value(uint16(UNIT_FIELD_AURA + i));
- *data << uint16(updatedAura);
+ AuraSlotEntry * pAura = player->GetVisibleAura(i);
+ *data << uint32(pAura ? pAura->m_spellId : 0);
*data << uint8(1);
- //TODO: find a safe place to do this cleanup
- //if(!updatedAura)
- //player->UnsetAuraUpdateMask(i);
}
}
}
@@ -760,17 +770,17 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)
{
if(pet)
- *data << (uint16) pet->GetHealth();
+ *data << (uint32) pet->GetHealth();
else
- *data << (uint16) 0;
+ *data << (uint32) 0;
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)
{
if(pet)
- *data << (uint16) pet->GetMaxHealth();
+ *data << (uint32) pet->GetMaxHealth();
else
- *data << (uint16) 0;
+ *data << (uint32) 0;
}
if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)
@@ -801,18 +811,15 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
{
if(pet)
{
- uint64 auramask = pet->GetAuraUpdateMask();
+ const uint64& auramask = pet->GetAuraUpdateMaskForRaid();
*data << uint64(auramask);
for(uint32 i = 0; i < MAX_AURAS; ++i)
{
if(auramask & (uint64(1) << i))
{
- uint32 updatedAura=pet->GetUInt32Value(uint16(UNIT_FIELD_AURA + i));
- *data << uint16(updatedAura);
+ AuraSlotEntry * pAura = pet->GetVisibleAura(i);
+ *data << uint32(pAura ? pAura->m_spellId : 0);
*data << uint8(1);
- //TODO: find a safe place to do this cleanup
- //if(!updatedAura)
- //pet->UnsetAuraUpdateMask(i);
}
}
}
@@ -834,6 +841,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
if(!player)
{
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2);
+ data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
data.appendPackGUID(Guid);
data << (uint32) GROUP_UPDATE_FLAG_STATUS;
data << (uint16) MEMBER_STATUS_OFFLINE;
@@ -844,6 +852,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
Pet *pet = player->GetPet();
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8);
+ data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
data.append(player->GetPackGUID());
uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF
@@ -853,8 +862,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
Powers powerType = player->getPowerType();
data << (uint32) mask1; // group update mask
data << (uint16) MEMBER_STATUS_ONLINE; // member's online status
- data << (uint16) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
- data << (uint16) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP
+ data << (uint32) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
+ data << (uint32) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP
data << (uint8) powerType; // GROUP_UPDATE_FLAG_POWER_TYPE
data << (uint16) player->GetPower(powerType); // GROUP_UPDATE_FLAG_CUR_POWER
data << (uint16) player->GetMaxPower(powerType); // GROUP_UPDATE_FLAG_MAX_POWER
@@ -868,11 +877,11 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) auramask; // placeholder
for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- if(uint32 aura = player->GetUInt32Value(UNIT_FIELD_AURA + i))
+ if(AuraSlotEntry * pAura = player->GetVisibleAura(i))
{
auramask |= (uint64(1) << i);
- data << uint16(aura);
- data << uint8(1);
+ data << (uint32) pAura->m_spellId;
+ data << (uint8) 1;
}
}
data.put<uint64>(maskPos,auramask); // GROUP_UPDATE_FLAG_AURAS
@@ -883,8 +892,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) pet->GetGUID(); // GROUP_UPDATE_FLAG_PET_GUID
data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME
data << (uint16) pet->GetDisplayId(); // GROUP_UPDATE_FLAG_PET_MODEL_ID
- data << (uint16) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
- data << (uint16) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP
+ data << (uint32) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
+ data << (uint32) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP
data << (uint8) petpowertype; // GROUP_UPDATE_FLAG_PET_POWER_TYPE
data << (uint16) pet->GetPower(petpowertype); // GROUP_UPDATE_FLAG_PET_CUR_POWER
data << (uint16) pet->GetMaxPower(petpowertype); // GROUP_UPDATE_FLAG_PET_MAX_POWER
@@ -894,10 +903,10 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) petauramask; // placeholder
for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- if(uint32 petaura = pet->GetUInt32Value(UNIT_FIELD_AURA + i))
+ if(AuraSlotEntry * pAura = pet->GetVisibleAura(i))
{
petauramask |= (uint64(1) << i);
- data << (uint16) petaura;
+ data << (uint32) pAura->m_spellId;
data << (uint8) 1;
}
}
diff --git a/src/game/GroupRefManager.h b/src/game/GroupRefManager.h
index 94741c30279..ab3b6417611 100644
--- a/src/game/GroupRefManager.h
+++ b/src/game/GroupRefManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/GroupReference.cpp b/src/game/GroupReference.cpp
index 24646e3059a..a09fc769dad 100644
--- a/src/game/GroupReference.cpp
+++ b/src/game/GroupReference.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/GroupReference.h b/src/game/GroupReference.h
index 0b338991109..da896cf02dd 100644
--- a/src/game/GroupReference.h
+++ b/src/game/GroupReference.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/GuardAI.cpp b/src/game/GuardAI.cpp
index 0a892961f4d..8fc8e3e143f 100644
--- a/src/game/GuardAI.cpp
+++ b/src/game/GuardAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/GuardAI.h b/src/game/GuardAI.h
index b7b3c79607b..3bc7ac35f8e 100644
--- a/src/game/GuardAI.h
+++ b/src/game/GuardAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp
index ec14ca04192..5c773c14c88 100644
--- a/src/game/Guild.cpp
+++ b/src/game/Guild.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -709,7 +709,7 @@ void Guild::Disband()
CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid = '%u'",Id);
CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE guildid = '%u'",Id);
CharacterDatabase.CommitTransaction();
- objmgr.RemoveGuild(this);
+ objmgr.RemoveGuild(Id);
}
void Guild::Roster(WorldSession *session)
@@ -721,7 +721,7 @@ void Guild::Roster(WorldSession *session)
data << GINFO;
data << (uint32)m_ranks.size();
- for (RankList::iterator ritr = m_ranks.begin(); ritr != m_ranks.end();++ritr)
+ for (RankList::const_iterator ritr = m_ranks.begin(); ritr != m_ranks.end(); ++ritr)
{
data << (uint32)ritr->rights;
data << (uint32)ritr->BankMoneyPerDay; // count of: withdraw gold(gold/day) Note: in game set gold, in packet set bronze.
@@ -731,7 +731,7 @@ void Guild::Roster(WorldSession *session)
data << (uint32)ritr->TabSlotPerDay[i]; // for TAB_i count of: withdraw items(stack/day)
}
}
- for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{
if (Player *pl = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)))
{
@@ -771,7 +771,7 @@ void Guild::Query(WorldSession *session)
data << Id;
data << name;
- RankList::iterator itr;
+
for (size_t i = 0 ; i < 10; ++i) // show always 10 ranks
{
if(i < m_ranks.size())
@@ -785,6 +785,7 @@ void Guild::Query(WorldSession *session)
data << uint32(BorderStyle);
data << uint32(BorderColor);
data << uint32(BackgroundColor);
+ data << uint32(0); // something new in WotLK
session->SendPacket( &data );
sLog.outDebug( "WORLD: Sent (SMSG_GUILD_QUERY_RESPONSE)" );
@@ -1022,7 +1023,7 @@ void Guild::DisplayGuildBankContentUpdate(uint8 TabId, int32 slot1, int32 slot2)
AppendDisplayGuildBankSlot(data, tab, slot2);
}
- for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{
Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER));
if(!player)
@@ -1060,7 +1061,7 @@ void Guild::DisplayGuildBankContentUpdate(uint8 TabId, GuildItemPosCountVec cons
for(GuildItemPosCountVec::const_iterator itr = slots.begin(); itr != slots.end(); ++itr)
AppendDisplayGuildBankSlot(data, tab, itr->slot);
- for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{
Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER));
if(!player)
@@ -1212,18 +1213,19 @@ void Guild::LoadGuildBankFromDB()
delete result;
- // 0 1 2 3
- result = CharacterDatabase.PQuery("SELECT TabId, SlotId, item_guid, item_entry FROM guild_bank_item WHERE guildid='%u' ORDER BY TabId", Id);
+ // data needs to be at first place for Item::LoadFromDB
+ // 0 1 2 3 4
+ result = CharacterDatabase.PQuery("SELECT data, TabId, SlotId, item_guid, item_entry FROM guild_bank_item JOIN item_instance ON item_guid = guid WHERE guildid='%u' ORDER BY TabId", Id);
if(!result)
return;
do
{
Field *fields = result->Fetch();
- uint8 TabId = fields[0].GetUInt8();
- uint8 SlotId = fields[1].GetUInt8();
- uint32 ItemGuid = fields[2].GetUInt32();
- uint32 ItemEntry = fields[3].GetUInt32();
+ uint8 TabId = fields[1].GetUInt8();
+ uint8 SlotId = fields[2].GetUInt8();
+ uint32 ItemGuid = fields[3].GetUInt32();
+ uint32 ItemEntry = fields[4].GetUInt32();
if (TabId >= purchased_tabs || TabId >= GUILD_BANK_MAX_TABS)
{
@@ -1246,7 +1248,7 @@ void Guild::LoadGuildBankFromDB()
}
Item *pItem = NewItemOrBag(proto);
- if(!pItem->LoadFromDB(ItemGuid, 0))
+ if(!pItem->LoadFromDB(ItemGuid, 0, result))
{
CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid='%u' AND TabId='%u' AND SlotId='%u'", Id, uint32(TabId), uint32(SlotId));
sLog.outError("Item GUID %u not found in item_instance, deleting from Guild Bank!", ItemGuid);
@@ -1602,7 +1604,21 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint8((*itr)->LogEntry);
data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER));
- data << uint32((*itr)->ItemOrMoney);
+ if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_UNK1 ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_UNK2)
+ {
+ data << uint32((*itr)->ItemOrMoney);
+ }
+ else
+ {
+ data << uint32((*itr)->ItemOrMoney);
+ data << uint32((*itr)->ItemStackCount);
+ if ((*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || (*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
+ data << uint8((*itr)->DestTabId); // moved tab
+ }
data << uint32(time(NULL)-(*itr)->TimeStamp);
}
session->SendPacket(&data);
@@ -1618,10 +1634,21 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint8((*itr)->LogEntry);
data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER));
- data << uint32((*itr)->ItemOrMoney);
- data << uint8((*itr)->ItemStackCount);
- if ((*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || (*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
- data << uint8((*itr)->DestTabId); // moved tab
+ if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_UNK1 ||
+ (*itr)->LogEntry == GUILD_BANK_LOG_UNK2)
+ {
+ data << uint32((*itr)->ItemOrMoney);
+ }
+ else
+ {
+ data << uint32((*itr)->ItemOrMoney);
+ data << uint32((*itr)->ItemStackCount);
+ if ((*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || (*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
+ data << uint8((*itr)->DestTabId); // moved tab
+ }
data << uint32(time(NULL)-(*itr)->TimeStamp);
}
session->SendPacket(&data);
@@ -1703,7 +1730,7 @@ void Guild::AppendDisplayGuildBankSlot( WorldPacket& data, GuildBankTab const *t
// SuffixFactor +4
data << (uint32) pItem->GetItemSuffixFactor();
// +12 // ITEM_FIELD_STACK_COUNT
- data << uint8(pItem->GetCount());
+ data << uint32(pItem->GetCount());
data << uint32(0); // +16 // Unknown value
data << uint8(0); // unknown 2.4.2
if (uint32 Enchant0 = pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT))
@@ -1960,6 +1987,9 @@ void Guild::SetGuildBankTabText(uint8 TabId, std::string text)
CharacterDatabase.escape_string(text);
CharacterDatabase.PExecute("UPDATE guild_bank_tab SET TabText='%s' WHERE guildid='%u' AND TabId='%u'", text.c_str(), Id, uint32(TabId));
+
+ // announce
+ SendGuildBankTabText(NULL,TabId);
}
void Guild::SendGuildBankTabText(WorldSession *session, uint8 TabId)
@@ -1974,7 +2004,12 @@ void Guild::SendGuildBankTabText(WorldSession *session, uint8 TabId)
WorldPacket data(MSG_QUERY_GUILD_BANK_TEXT, 1+tab->Text.size()+1);
data << uint8(TabId);
data << tab->Text;
- session->SendPacket(&data);
+
+ if(session)
+ session->SendPacket(&data);
+ else
+ BroadcastPacket(&data);
+
}
bool GuildItemPosCount::isContainedIn(GuildItemPosCountVec const &vec) const
diff --git a/src/game/Guild.h b/src/game/Guild.h
index 5dc6c00111d..fb124bbc8e4 100644
--- a/src/game/Guild.h
+++ b/src/game/Guild.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -53,10 +53,11 @@ enum GuildRankRights
GR_RIGHT_VIEWOFFNOTE = 0x00004040,
GR_RIGHT_EOFFNOTE = 0x00008040,
GR_RIGHT_MODIFY_GUILD_INFO = 0x00010040,
- GR_RIGHT_REPAIR_FROM_GUILD = 0x00020000, // unused in 2.4.x?, Remove money withdraw capacity
+ GR_RIGHT_WITHDRAW_GOLD_LOCK = 0x00020000, // remove money withdraw capacity
GR_RIGHT_WITHDRAW_REPAIR = 0x00040000, // withdraw for repair
GR_RIGHT_WITHDRAW_GOLD = 0x00080000, // withdraw gold
- GR_RIGHT_ALL = 0x000FF1FF
+ GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
+ GR_RIGHT_ALL = 0x001DF1FF
};
enum Typecommand
@@ -156,6 +157,8 @@ enum GuildBankLogEntries
GUILD_BANK_LOG_WITHDRAW_MONEY = 5,
GUILD_BANK_LOG_REPAIR_MONEY = 6,
GUILD_BANK_LOG_MOVE_ITEM2 = 7,
+ GUILD_BANK_LOG_UNK1 = 8,
+ GUILD_BANK_LOG_UNK2 = 9,
};
enum GuildEventLogEntryTypes
@@ -217,12 +220,12 @@ struct GuildBankTab
struct GuildItemPosCount
{
- GuildItemPosCount(uint8 _slot, uint8 _count) : slot(_slot), count(_count) {}
+ GuildItemPosCount(uint8 _slot, uint32 _count) : slot(_slot), count(_count) {}
bool isContainedIn(std::vector<GuildItemPosCount> const& vec) const;
uint8 slot;
- uint8 count;
+ uint32 count;
};
typedef std::vector<GuildItemPosCount> GuildItemPosCountVec;
@@ -314,6 +317,15 @@ class Guild
void BroadcastPacketToRank(WorldPacket *packet, uint32 rankId);
void BroadcastPacket(WorldPacket *packet);
+ template<class Do>
+ void BroadcastWorker(Do& _do, Player* except = NULL)
+ {
+ for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
+ if(Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)))
+ if(player != except)
+ _do(player);
+ }
+
void CreateRank(std::string name,uint32 rights);
void DelRank();
std::string GetRankName(uint32 rankId);
diff --git a/src/game/GuildHandler.cpp b/src/game/GuildHandler.cpp
index 77e9af49ed3..1a8e5e54f15 100644
--- a/src/game/GuildHandler.cpp
+++ b/src/game/GuildHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -375,7 +375,7 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
guild->ChangeRank(plGuid, (slot->RankId+1));
// Put record into guildlog
- guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), (slot->RankId));
+ guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), slot->RankId);
WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size
data << (uint8)GE_DEMOTION;
@@ -663,7 +663,7 @@ void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
guild->SetRankName(rankId, rankname);
if(rankId==GR_GUILDMASTER) // prevent loss leader rights
- rights |= GR_RIGHT_ALL;
+ rights = GR_RIGHT_ALL;
guild->SetRankRights(rankId, rights);
diff --git a/src/game/HomeMovementGenerator.cpp b/src/game/HomeMovementGenerator.cpp
index ddf66ad220c..1a3adef9419 100644
--- a/src/game/HomeMovementGenerator.cpp
+++ b/src/game/HomeMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -20,6 +20,7 @@
#include "HomeMovementGenerator.h"
#include "Creature.h"
+#include "CreatureAI.h"
#include "Traveller.h"
#include "MapManager.h"
#include "ObjectAccessor.h"
@@ -75,6 +76,8 @@ HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff
owner.BuildHeartBeatMsg(&packet);
owner.SendMessageToSet(&packet, false);
}
+
+ owner.AI()->JustReachedHome();
return false;
}
diff --git a/src/game/HomeMovementGenerator.h b/src/game/HomeMovementGenerator.h
index 12d5f150405..3e3a59456cd 100644
--- a/src/game/HomeMovementGenerator.h
+++ b/src/game/HomeMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/HostilRefManager.cpp b/src/game/HostilRefManager.cpp
index f1cb465520e..aee035ded49 100644
--- a/src/game/HostilRefManager.cpp
+++ b/src/game/HostilRefManager.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/HostilRefManager.h b/src/game/HostilRefManager.h
index e7addd5479b..316509e3908 100644
--- a/src/game/HostilRefManager.h
+++ b/src/game/HostilRefManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/IdleMovementGenerator.cpp b/src/game/IdleMovementGenerator.cpp
index ff21643c2b0..10cca1d85ff 100644
--- a/src/game/IdleMovementGenerator.cpp
+++ b/src/game/IdleMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/IdleMovementGenerator.h b/src/game/IdleMovementGenerator.h
index 3719f7bc7d7..7f1f41f9166 100644
--- a/src/game/IdleMovementGenerator.h
+++ b/src/game/IdleMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp
index 28145973bc0..473d8433395 100644
--- a/src/game/InstanceData.cpp
+++ b/src/game/InstanceData.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h
index cd3a50787ef..0b7c1f7faf3 100644
--- a/src/game/InstanceData.h
+++ b/src/game/InstanceData.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/InstanceSaveMgr.cpp b/src/game/InstanceSaveMgr.cpp
index 21d806db921..bd1b1c610a6 100644
--- a/src/game/InstanceSaveMgr.cpp
+++ b/src/game/InstanceSaveMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
*
* This program is free software; you can redistribute it and/or modify
@@ -142,9 +142,8 @@ void InstanceSaveManager::RemoveInstanceSave(uint32 InstanceId)
}
}
-InstanceSave::InstanceSave(uint16 MapId, uint32 InstanceId, uint8 difficulty,
- time_t resetTime, bool canReset)
-: m_mapid(MapId), m_instanceid(InstanceId), m_resetTime(resetTime),
+InstanceSave::InstanceSave(uint16 MapId, uint32 InstanceId, uint8 difficulty, time_t resetTime, bool canReset)
+: m_resetTime(resetTime), m_instanceid(InstanceId), m_mapid(MapId),
m_difficulty(difficulty), m_canReset(canReset)
{
}
@@ -270,7 +269,7 @@ void InstanceSaveManager::CleanupInstances()
// creature_respawn and gameobject_respawn are in another database
// first, obtain total instance set
- std::set< uint32 > InstanceSet;
+ std::set<uint32> InstanceSet;
QueryResult *result = CharacterDatabase.Query("SELECT id FROM instance");
if( result )
{
@@ -322,7 +321,7 @@ void InstanceSaveManager::PackInstances()
// TODO: this can be done a LOT more efficiently
// obtain set of all associations
- std::set< uint32 > InstanceSet;
+ std::set<uint32> InstanceSet;
// all valid ids are in the instance table
// any associations to ids not in this table are assumed to be
@@ -344,7 +343,7 @@ void InstanceSaveManager::PackInstances()
uint32 InstanceNumber = 1;
// we do assume std::set is sorted properly on integer value
- for (std::set< uint32 >::iterator i = InstanceSet.begin(); i != InstanceSet.end(); ++i)
+ for (std::set<uint32>::iterator i = InstanceSet.begin(); i != InstanceSet.end(); ++i)
{
if (*i != InstanceNumber)
{
@@ -361,8 +360,8 @@ void InstanceSaveManager::PackInstances()
bar.step();
}
- sLog.outString();
sLog.outString( ">> Instance numbers remapped, next instance id is %u", InstanceNumber );
+ sLog.outString();
}
void InstanceSaveManager::LoadResetTimes()
@@ -375,14 +374,14 @@ void InstanceSaveManager::LoadResetTimes()
// get the current reset times for normal instances (these may need to be updated)
// these are only kept in memory for InstanceSaves that are loaded later
// resettime = 0 in the DB for raid/heroic instances so those are skipped
- typedef std::map<uint32, std::pair<uint32, uint64> > ResetTimeMapType;
+ typedef std::map<uint32, std::pair<uint32, time_t> > ResetTimeMapType;
ResetTimeMapType InstResetTime;
QueryResult *result = CharacterDatabase.Query("SELECT id, map, resettime FROM instance WHERE resettime > 0");
if( result )
{
do
{
- if(uint64 resettime = (*result)[2].GetUInt64())
+ if(time_t resettime = time_t((*result)[2].GetUInt64()))
{
uint32 id = (*result)[0].GetUInt32();
uint32 mapid = (*result)[1].GetUInt32();
@@ -400,11 +399,11 @@ void InstanceSaveManager::LoadResetTimes()
{
Field *fields = result->Fetch();
uint32 instance = fields[1].GetUInt32();
- uint64 resettime = fields[0].GetUInt64() + 2 * HOUR;
+ time_t resettime = time_t(fields[0].GetUInt64() + 2 * HOUR);
ResetTimeMapType::iterator itr = InstResetTime.find(instance);
if(itr != InstResetTime.end() && itr->second.second != resettime)
{
- CharacterDatabase.DirectPExecute("UPDATE instance SET resettime = '"I64FMTD"' WHERE id = '%u'", resettime, instance);
+ CharacterDatabase.DirectPExecute("UPDATE instance SET resettime = '"I64FMTD"' WHERE id = '%u'", uint64(resettime), instance);
itr->second.second = resettime;
}
}
@@ -454,7 +453,7 @@ void InstanceSaveManager::LoadResetTimes()
// add the global reset times to the priority queue
for(uint32 i = 0; i < sInstanceTemplate.MaxEntry; i++)
{
- InstanceTemplate* temp = (InstanceTemplate*)objmgr.GetInstanceTemplate(i);
+ InstanceTemplate const* temp = objmgr.GetInstanceTemplate(i);
if(!temp) continue;
// only raid/heroic maps have a global reset time
const MapEntry* entry = sMapStore.LookupEntry(temp->map);
@@ -583,7 +582,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, bool warn, uint32 timeLe
{
// global reset for all instances of the given map
// note: this isn't fast but it's meant to be executed very rarely
- Map *map = (MapInstanced*)MapManager::Instance().GetBaseMap(mapid);
+ Map const *map = MapManager::Instance().GetBaseMap(mapid);
if(!map->Instanceable())
return;
uint64 now = (uint64)time(NULL);
@@ -591,7 +590,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, bool warn, uint32 timeLe
if(!warn)
{
// this is called one minute before the reset time
- InstanceTemplate* temp = (InstanceTemplate*)objmgr.GetInstanceTemplate(mapid);
+ InstanceTemplate const* temp = objmgr.GetInstanceTemplate(mapid);
if(!temp || !temp->reset_delay)
{
sLog.outError("InstanceSaveManager::ResetOrWarnAll: no instance template or reset delay for map %d", mapid);
diff --git a/src/game/InstanceSaveMgr.h b/src/game/InstanceSaveMgr.h
index 58b891b3a9f..2a913e5cedf 100644
--- a/src/game/InstanceSaveMgr.h
+++ b/src/game/InstanceSaveMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
*
* This program is free software; you can redistribute it and/or modify
diff --git a/src/game/Item.cpp b/src/game/Item.cpp
index 766bd81d640..ea8d77076eb 100644
--- a/src/game/Item.cpp
+++ b/src/game/Item.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -206,6 +206,10 @@ bool ItemCanGoIntoBag(ItemPrototype const *pProto, ItemPrototype const *pBagProt
if(!(pProto->BagFamily & BAG_FAMILY_MASK_LEATHERWORKING_SUPP))
return false;
return true;
+ case ITEM_SUBCLASS_INSCRIPTION_CONTAINER:
+ if(!(pProto->BagFamily & BAG_FAMILY_MASK_INSCRIPTION_SUPP))
+ return false;
+ return true;
default:
return false;
}
@@ -284,7 +288,7 @@ void Item::UpdateDuration(Player* owner, uint32 diff)
}
SetUInt32Value(ITEM_FIELD_DURATION, GetUInt32Value(ITEM_FIELD_DURATION) - diff);
- SetState(ITEM_CHANGED); // save new time in database
+ SetState(ITEM_CHANGED, owner); // save new time in database
}
void Item::SaveToDB()
@@ -450,7 +454,7 @@ uint32 Item::GetSkill()
const static uint32 item_armor_skills[MAX_ITEM_SUBCLASS_ARMOR] =
{
- 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0
+ 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0,0
};
ItemPrototype const* proto = GetProto();
@@ -752,7 +756,12 @@ bool Item::IsFitToSpellRequirements(SpellEntry const* spellInfo) const
if(spellInfo->EquippedItemInventoryTypeMask != 0) // 0 == any inventory type
{
- if((spellInfo->EquippedItemInventoryTypeMask & (1 << proto->InventoryType)) == 0)
+ // Special case - accept weapon type for main and offhand requirements
+ if(proto->InventoryType == INVTYPE_WEAPON &&
+ (spellInfo->EquippedItemInventoryTypeMask & (1 << INVTYPE_WEAPONMAINHAND) ||
+ spellInfo->EquippedItemInventoryTypeMask & (1 << INVTYPE_WEAPONOFFHAND)))
+ return true;
+ else if ((spellInfo->EquippedItemInventoryTypeMask & (1 << proto->InventoryType)) == 0)
return false; // inventory type not present in mask
}
@@ -765,9 +774,9 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint
if((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges))
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id);
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED);
}
@@ -776,7 +785,7 @@ void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration)
if(GetEnchantmentDuration(slot) == duration)
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
SetState(ITEM_CHANGED);
}
@@ -785,7 +794,7 @@ void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
if(GetEnchantmentCharges(slot) == charges)
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED);
}
@@ -795,14 +804,14 @@ void Item::ClearEnchantment(EnchantmentSlot slot)
return;
for(uint8 x = 0; x < 3; ++x)
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
SetState(ITEM_CHANGED);
}
bool Item::GemsFitSockets() const
{
bool fits = true;
- for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
+ for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot)
{
uint8 SocketColor = GetProto()->Socket[enchant_slot-SOCK_ENCHANTMENT_SLOT].Color;
@@ -842,7 +851,7 @@ bool Item::GemsFitSockets() const
uint8 Item::GetGemCountWithID(uint32 GemID) const
{
uint8 count = 0;
- for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
+ for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot)
{
uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot));
if(!enchant_id)
@@ -858,6 +867,29 @@ uint8 Item::GetGemCountWithID(uint32 GemID) const
return count;
}
+uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const
+{
+ uint8 count = 0;
+ for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot)
+ {
+ uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot));
+ if(!enchant_id)
+ continue;
+
+ SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
+ if(!enchantEntry)
+ continue;
+
+ ItemPrototype const* gemProto = ObjectMgr::GetItemPrototype(enchantEntry->GemID);
+ if(!gemProto)
+ continue;
+
+ if(gemProto->ItemLimitCategory==limitCategory)
+ ++count;
+ }
+ return count;
+}
+
bool Item::IsLimitedToAnotherMapOrZone( uint32 cur_mapId, uint32 cur_zoneId) const
{
ItemPrototype const* proto = GetProto();
@@ -886,8 +918,8 @@ Item* Item::CreateItem( uint32 item, uint32 count, Player const* player )
ItemPrototype const *pProto = objmgr.GetItemPrototype( item );
if( pProto )
{
- if ( count > pProto->Stackable )
- count = pProto->Stackable;
+ if ( count > pProto->GetMaxStackSize())
+ count = pProto->GetMaxStackSize();
assert(count !=0 && "pProto->Stackable==0 but checked at loading already");
diff --git a/src/game/Item.h b/src/game/Item.h
index 3417f2fcc6d..8e4fc410531 100644
--- a/src/game/Item.h
+++ b/src/game/Item.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -148,29 +148,32 @@ enum SellFailure
// -1 from client enchantment slot number
enum EnchantmentSlot
{
- PERM_ENCHANTMENT_SLOT = 0,
- TEMP_ENCHANTMENT_SLOT = 1,
- SOCK_ENCHANTMENT_SLOT = 2,
- SOCK_ENCHANTMENT_SLOT_2 = 3,
- SOCK_ENCHANTMENT_SLOT_3 = 4,
- BONUS_ENCHANTMENT_SLOT = 5,
- MAX_INSPECTED_ENCHANTMENT_SLOT = 6,
-
- PROP_ENCHANTMENT_SLOT_0 = 6, // used with RandomSuffix
- PROP_ENCHANTMENT_SLOT_1 = 7, // used with RandomSuffix
- PROP_ENCHANTMENT_SLOT_2 = 8, // used with RandomSuffix and RandomProperty
- PROP_ENCHANTMENT_SLOT_3 = 9, // used with RandomProperty
- PROP_ENCHANTMENT_SLOT_4 = 10, // used with RandomProperty
- MAX_ENCHANTMENT_SLOT = 11
+ PERM_ENCHANTMENT_SLOT = 0,
+ TEMP_ENCHANTMENT_SLOT = 1,
+ SOCK_ENCHANTMENT_SLOT = 2,
+ SOCK_ENCHANTMENT_SLOT_2 = 3,
+ SOCK_ENCHANTMENT_SLOT_3 = 4,
+ BONUS_ENCHANTMENT_SLOT = 5,
+ PRISMATIC_ENCHANTMENT_SLOT = 6, // added at apply special permanent enchantment
+ MAX_INSPECTED_ENCHANTMENT_SLOT = 7,
+
+ PROP_ENCHANTMENT_SLOT_0 = 7, // used with RandomSuffix
+ PROP_ENCHANTMENT_SLOT_1 = 8, // used with RandomSuffix
+ PROP_ENCHANTMENT_SLOT_2 = 9, // used with RandomSuffix and RandomProperty
+ PROP_ENCHANTMENT_SLOT_3 = 10, // used with RandomProperty
+ PROP_ENCHANTMENT_SLOT_4 = 11, // used with RandomProperty
+ MAX_ENCHANTMENT_SLOT = 12
};
-#define MAX_VISIBLE_ITEM_OFFSET 16 // 16 fields per visible item (creator(2) + enchantments(12) + properties(1) + pad(1))
+#define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1))
+
+#define MAX_GEM_SOCKETS 3 // (BONUS_ENCHANTMENT_SLOT-SOCK_ENCHANTMENT_SLOT)
enum EnchantmentOffset
{
ENCHANTMENT_ID_OFFSET = 0,
ENCHANTMENT_DURATION_OFFSET = 1,
- ENCHANTMENT_CHARGES_OFFSET = 2
+ ENCHANTMENT_CHARGES_OFFSET = 2 // now here not only charges, but something new in wotlk
};
#define MAX_ENCHANTMENT_OFFSET 3
@@ -211,6 +214,7 @@ class TRINITY_DLL_SPEC Item : public Object
void SetBinding(bool val) { ApplyModFlag(ITEM_FIELD_FLAGS,ITEM_FLAGS_BINDED,val); }
bool IsSoulBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_BINDED); }
+ bool IsAccountBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_BOA); }
bool IsBindedNotWith(uint64 guid) const { return IsSoulBound() && GetOwnerGUID()!= guid; }
bool IsBoundByEnchant() const;
virtual void SaveToDB();
@@ -230,8 +234,9 @@ class TRINITY_DLL_SPEC Item : public Object
uint32 GetCount() const { return GetUInt32Value (ITEM_FIELD_STACK_COUNT); }
void SetCount(uint32 value) { SetUInt32Value (ITEM_FIELD_STACK_COUNT, value); }
- uint32 GetMaxStackCount() const { return GetProto()->Stackable; }
+ uint32 GetMaxStackCount() const { return GetProto()->GetMaxStackSize(); }
uint8 GetGemCountWithID(uint32 GemID) const;
+ uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const;
uint8 GetSlot() const {return m_slot;}
Bag *GetContainer() { return m_container; }
@@ -256,9 +261,9 @@ class TRINITY_DLL_SPEC Item : public Object
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration);
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges);
void ClearEnchantment(EnchantmentSlot slot);
- uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);}
- uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);}
- uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);}
+ uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);}
+ uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);}
+ uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);}
void SendTimeUpdate(Player* owner);
void UpdateDuration(Player* owner, uint32 diff);
diff --git a/src/game/ItemEnchantmentMgr.cpp b/src/game/ItemEnchantmentMgr.cpp
index 3326fb56e96..e4b2d809582 100644
--- a/src/game/ItemEnchantmentMgr.cpp
+++ b/src/game/ItemEnchantmentMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ItemEnchantmentMgr.h b/src/game/ItemEnchantmentMgr.h
index 17cf634860e..ce627515aee 100644
--- a/src/game/ItemEnchantmentMgr.h
+++ b/src/game/ItemEnchantmentMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp
index 0e46115de08..a845ce29b50 100644
--- a/src/game/ItemHandler.cpp
+++ b/src/game/ItemHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -324,7 +324,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->ItemId;
data << pProto->Class;
data << pProto->SubClass;
- data << uint32(-1); // new 2.0.3, not exist in wdb cache?
+ data << int32(pProto->Unk0); // new 2.0.3, not exist in wdb cache?
data << Name;
data << uint8(0x00); //pProto->Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name...
data << uint8(0x00); //pProto->Name3; // blizz not send name there, just uint8(0x00);
@@ -346,15 +346,18 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->RequiredCityRank;
data << pProto->RequiredReputationFaction;
data << pProto->RequiredReputationRank;
- data << pProto->MaxCount;
- data << pProto->Stackable;
+ data << int32(pProto->MaxCount);
+ data << int32(pProto->Stackable);
data << pProto->ContainerSlots;
- for(int i = 0; i < 10; i++)
+ data << pProto->StatsCount; // item stats count
+ for(uint32 i = 0; i < pProto->StatsCount; ++i)
{
data << pProto->ItemStat[i].ItemStatType;
data << pProto->ItemStat[i].ItemStatValue;
}
- for(int i = 0; i < 5; i++)
+ data << pProto->ScalingStatDistribution; // scaling stats distribution
+ data << pProto->ScalingStatValue; // some kind of flags used to determine stat values column
+ for(int i = 0; i < 5; ++i)
{
data << pProto->Damage[i].DamageMin;
data << pProto->Damage[i].DamageMax;
@@ -417,7 +420,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->PageMaterial;
data << pProto->StartQuest;
data << pProto->LockID;
- data << pProto->Material;
+ data << int32(pProto->Material);
data << pProto->Sheath;
data << pProto->RandomProperty;
data << pProto->RandomSuffix;
@@ -437,7 +440,8 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->GemProperties;
data << pProto->RequiredDisenchantSkill;
data << pProto->ArmorDamageModifier;
- data << uint32(0); // added in 2.4.2.8209, duration (seconds)
+ data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
+ data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
SendPacket( &data );
}
else
@@ -738,7 +742,7 @@ void WorldSession::SendListInventory( uint64 vendorguid )
float discountMod = _player->GetReputationPriceDiscount(pCreature);
- for(int i = 0; i < numitems; i++ )
+ for(int i = 0; i < numitems; ++i )
{
if(VendorItem const* crItem = vItems->GetItem(i))
{
@@ -845,6 +849,7 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& /*recvPacket*/)
if (_player->GetMoney() < price)
return;
+ _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT, slot);
_player->SetByteValue(PLAYER_BYTES_2, 2, slot);
_player->ModifyMoney(-int32(price));
}
@@ -1106,120 +1111,193 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data)
{
sLog.outDebug("WORLD: CMSG_SOCKET_GEMS");
- CHECK_PACKET_SIZE(recv_data,8*4);
+ CHECK_PACKET_SIZE(recv_data,8+8*MAX_GEM_SOCKETS);
- uint64 guids[4];
- uint32 GemEnchants[3], OldEnchants[3];
- Item *Gems[3];
- bool SocketBonusActivated, SocketBonusToBeActivated;
+ uint64 item_guid;
+ uint64 gem_guids[MAX_GEM_SOCKETS];
- for(int i = 0; i < 4; i++)
- recv_data >> guids[i];
-
- if(!guids[0])
+ recv_data >> item_guid;
+ if(!item_guid)
return;
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i)
+ recv_data >> gem_guids[i];
+
//cheat -> tried to socket same gem multiple times
- if((guids[1] && (guids[1] == guids[2] || guids[1] == guids[3])) || (guids[2] && (guids[2] == guids[3])))
+ if ((gem_guids[0] && (gem_guids[0] == gem_guids[1] || gem_guids[0] == gem_guids[2])) ||
+ (gem_guids[1] && (gem_guids[1] == gem_guids[2])))
return;
- Item *itemTarget = _player->GetItemByGuid(guids[0]);
+ Item *itemTarget = _player->GetItemByGuid(item_guid);
if(!itemTarget) //missing item to socket
return;
+ ItemPrototype const* itemProto = itemTarget->GetProto();
+ if(!itemProto)
+ return;
+
//this slot is excepted when applying / removing meta gem bonus
- uint8 slot = itemTarget->IsEquipped() ? itemTarget->GetSlot() : NULL_SLOT;
+ uint8 slot = itemTarget->IsEquipped() ? itemTarget->GetSlot() : uint8(NULL_SLOT);
- for(int i = 0; i < 3; i++)
- Gems[i] = guids[i + 1] ? _player->GetItemByGuid(guids[i + 1]) : NULL;
+ Item *Gems[MAX_GEM_SOCKETS];
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i)
+ Gems[i] = gem_guids[i] ? _player->GetItemByGuid(gem_guids[i]) : NULL;
- GemPropertiesEntry const *GemProps[3];
- for(int i = 0; i < 3; ++i) //get geminfo from dbc storage
- {
+ GemPropertiesEntry const *GemProps[MAX_GEM_SOCKETS];
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i) //get geminfo from dbc storage
GemProps[i] = (Gems[i]) ? sGemPropertiesStore.LookupEntry(Gems[i]->GetProto()->GemProperties) : NULL;
- }
- for(int i = 0; i < 3; ++i) //check for hack maybe
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i) //check for hack maybe
{
- // tried to put gem in socket where no socket exists / tried to put normal gem in meta socket
+ if (!GemProps[i])
+ continue;
+
+ // tried to put gem in socket where no socket exists (take care about prismatic sockets)
+ if (!itemProto->Socket[i].Color)
+ {
+ // no prismatic socket
+ if(!itemTarget->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT))
+ return;
+
+ // not first not-colored (not normaly used) socket
+ if(i!=0 && !itemProto->Socket[i-1].Color && (i+1 >= MAX_GEM_SOCKETS || itemProto->Socket[i+1].Color))
+ return;
+
+ // ok, this is first not colored socket for item with prismatic socket
+ }
+
+ // tried to put normal gem in meta socket
+ if (itemProto->Socket[i].Color == SOCKET_COLOR_META && GemProps[i]->color != SOCKET_COLOR_META)
+ return;
+
// tried to put meta gem in normal socket
- if( GemProps[i] && ( !itemTarget->GetProto()->Socket[i].Color ||
- itemTarget->GetProto()->Socket[i].Color == SOCKET_COLOR_META && GemProps[i]->color != SOCKET_COLOR_META ||
- itemTarget->GetProto()->Socket[i].Color != SOCKET_COLOR_META && GemProps[i]->color == SOCKET_COLOR_META ) )
+ if (itemProto->Socket[i].Color != SOCKET_COLOR_META && GemProps[i]->color == SOCKET_COLOR_META)
return;
}
- for(int i = 0; i < 3; ++i) //get new and old enchantments
+ uint32 GemEnchants[MAX_GEM_SOCKETS];
+ uint32 OldEnchants[MAX_GEM_SOCKETS];
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i) //get new and old enchantments
{
GemEnchants[i] = (GemProps[i]) ? GemProps[i]->spellitemenchantement : 0;
OldEnchants[i] = itemTarget->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i));
}
// check unique-equipped conditions
- for(int i = 0; i < 3; ++i)
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i)
{
- if (Gems[i] && (Gems[i]->GetProto()->Flags & ITEM_FLAGS_UNIQUE_EQUIPPED))
+ if(!Gems[i])
+ continue;
+
+ // continue check for case when attempt add 2 similar unique equipped gems in one item.
+ ItemPrototype const* iGemProto = Gems[i]->GetProto();
+
+ // unique item (for new and already placed bit removed enchantments
+ if (iGemProto->Flags & ITEM_FLAGS_UNIQUE_EQUIPPED)
{
- // for equipped item check all equipment for duplicate equipped gems
- if(itemTarget->IsEquipped())
+ for (int j = 0; j < MAX_GEM_SOCKETS; ++j)
{
- if(GetPlayer()->GetItemOrItemWithGemEquipped(Gems[i]->GetEntry()))
+ if(i==j) // skip self
+ continue;
+
+ if (Gems[j])
{
- _player->SendEquipError( EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE, itemTarget, NULL );
- return;
+ if (iGemProto->ItemId == Gems[j]->GetEntry())
+ {
+ _player->SendEquipError( EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL );
+ return;
+ }
}
+ else if(OldEnchants[j])
+ {
+ if(SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j]))
+ {
+ if (iGemProto->ItemId == enchantEntry->GemID)
+ {
+ _player->SendEquipError( EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL );
+ return;
+ }
+ }
+ }
+
}
+ }
- // continue check for case when attempt add 2 similar unique equipped gems in one item.
- for (int j = 0; j < 3; ++j)
+ // unique limit type item
+ int32 limit_newcount = 0;
+ if (iGemProto->ItemLimitCategory)
+ {
+ if(ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(iGemProto->ItemLimitCategory))
{
- if ((i != j) && (Gems[j]) && (Gems[i]->GetProto()->ItemId == Gems[j]->GetProto()->ItemId))
+ for (int j = 0; j < MAX_GEM_SOCKETS; ++j)
+ {
+ if (Gems[j])
+ {
+ // destroyed gem
+ if (OldEnchants[j])
+ {
+ if(SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j]))
+ if(ItemPrototype const* jProto = ObjectMgr::GetItemPrototype(enchantEntry->GemID))
+ if (iGemProto->ItemLimitCategory == jProto->ItemLimitCategory)
+ --limit_newcount;
+ }
+
+ // new gem
+ if (iGemProto->ItemLimitCategory == Gems[j]->GetProto()->ItemLimitCategory)
+ ++limit_newcount;
+ }
+ // existed gem
+ else if(OldEnchants[j])
+ {
+ if(SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j]))
+ if(ItemPrototype const* jProto = ObjectMgr::GetItemPrototype(enchantEntry->GemID))
+ if (iGemProto->ItemLimitCategory == jProto->ItemLimitCategory)
+ ++limit_newcount;
+ }
+ }
+
+ if(limit_newcount > 0 && uint32(limit_newcount) > limitEntry->maxCount)
{
_player->SendEquipError( EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL );
return;
}
}
- for (int j = 0; j < 3; ++j)
- {
- if (OldEnchants[j])
- {
- SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j]);
- if(!enchantEntry)
- continue;
+ }
- if ((enchantEntry->GemID == Gems[i]->GetProto()->ItemId) && (i != j))
- {
- _player->SendEquipError( EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL );
- return;
- }
- }
+ // for equipped item check all equipment for duplicate equipped gems
+ if(itemTarget->IsEquipped())
+ {
+ if(uint8 res = _player->CanEquipUniqueItem(Gems[i],slot,limit_newcount >= 0 ? limit_newcount : 0))
+ {
+ _player->SendEquipError( res, itemTarget, NULL );
+ return;
}
}
}
- SocketBonusActivated = itemTarget->GemsFitSockets(); //save state of socketbonus
+ bool SocketBonusActivated = itemTarget->GemsFitSockets(); //save state of socketbonus
_player->ToggleMetaGemsActive(slot, false); //turn off all metagems (except for the target item)
//if a meta gem is being equipped, all information has to be written to the item before testing if the conditions for the gem are met
//remove ALL enchants
- for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
+ for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot)
_player->ApplyEnchantment(itemTarget,EnchantmentSlot(enchant_slot),false);
- for(int i = 0; i < 3; ++i)
+ for(int i = 0; i < MAX_GEM_SOCKETS; ++i)
{
if(GemEnchants[i])
{
itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i],0,0);
- if(Item* guidItem = _player->GetItemByGuid(guids[i + 1]))
+ if(Item* guidItem = _player->GetItemByGuid(gem_guids[i]))
_player->DestroyItem(guidItem->GetBagSlot(), guidItem->GetSlot(), true );
}
}
- for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
+ for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot)
_player->ApplyEnchantment(itemTarget,EnchantmentSlot(enchant_slot),true);
- SocketBonusToBeActivated = itemTarget->GemsFitSockets();//current socketbonus state
+ bool SocketBonusToBeActivated = itemTarget->GemsFitSockets();//current socketbonus state
if(SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change...
{
_player->ApplyEnchantment(itemTarget,BONUS_ENCHANTMENT_SLOT,false);
diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h
index 15b01faf5a2..1087154c5e7 100644
--- a/src/game/ItemPrototype.h
+++ b/src/game/ItemPrototype.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -57,10 +57,18 @@ enum ItemModType
ITEM_MOD_CRIT_TAKEN_RATING = 34,
ITEM_MOD_RESILIENCE_RATING = 35,
ITEM_MOD_HASTE_RATING = 36,
- ITEM_MOD_EXPERTISE_RATING = 37
+ ITEM_MOD_EXPERTISE_RATING = 37,
+ ITEM_MOD_ATTACK_POWER = 38,
+ ITEM_MOD_RANGED_ATTACK_POWER = 39,
+ ITEM_MOD_FERAL_ATTACK_POWER = 40,
+ ITEM_MOD_SPELL_HEALING_DONE = 41,
+ ITEM_MOD_SPELL_DAMAGE_DONE = 42,
+ ITEM_MOD_MANA_REGENERATION = 43,
+ ITEM_MOD_ARMOR_PENETRATION_RATING = 44,
+ ITEM_MOD_SPELL_POWER = 45
};
-#define MAX_ITEM_MOD 38
+#define MAX_ITEM_MOD 46
enum ItemSpelltriggerType
{
@@ -68,6 +76,12 @@ enum ItemSpelltriggerType
ITEM_SPELLTRIGGER_ON_EQUIP = 1,
ITEM_SPELLTRIGGER_CHANCE_ON_HIT = 2,
ITEM_SPELLTRIGGER_SOULSTONE = 4,
+ /*
+ * ItemSpelltriggerType 5 might have changed on 2.4.3/3.0.3: Such auras
+ * will be applied on item pickup and removed on item loss - maybe on the
+ * other hand the item is destroyed if the aura is removed ("removed on
+ * death" of spell 57348 makes me think so)
+ */
ITEM_SPELLTRIGGER_ON_NO_DELAY_USE = 5, // no equip cooldown
ITEM_SPELLTRIGGER_LEARN_SPELL_ID = 6 // used in item_template.spell_2 with spell_id with SPELL_GENERIC_LEARN in spell_1
};
@@ -96,6 +110,7 @@ enum ITEM_FLAGS
ITEM_FLAGS_WRAPPER = 0x00000200, // used or not used wrapper
ITEM_FLAGS_PARTY_LOOT = 0x00000800, // determines if item is party loot or not
ITEM_FLAGS_CHARTER = 0x00002000, // arena/guild charter
+ ITEM_FLAGS_PROSPECTABLE = 0x00040000,
ITEM_FLAGS_UNIQUE_EQUIPPED = 0x00080000,
ITEM_FLAGS_USEABLE_IN_ARENA = 0x00200000,
ITEM_FLAGS_THROWABLE = 0x00400000, // not used in game for check trow possibility, only for item in game tooltip
@@ -185,10 +200,11 @@ enum ItemClass
ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14,
- ITEM_CLASS_JUNK = 15
+ ITEM_CLASS_MISC = 15,
+ ITEM_CLASS_GLYPH = 16
};
-#define MAX_ITEM_CLASS 16
+#define MAX_ITEM_CLASS 17
enum ItemSubclassConsumable
{
@@ -214,10 +230,11 @@ enum ItemSubclassContainer
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4,
ITEM_SUBCLASS_GEM_CONTAINER = 5,
ITEM_SUBCLASS_MINING_CONTAINER = 6,
- ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7
+ ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
+ ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8
};
-#define MAX_ITEM_SUBCLASS_CONTAINER 8
+#define MAX_ITEM_SUBCLASS_CONTAINER 9
enum ItemSubclassWeapon
{
@@ -272,10 +289,11 @@ enum ItemSubclassArmor
ITEM_SUBCLASS_ARMOR_SHIELD = 6,
ITEM_SUBCLASS_ARMOR_LIBRAM = 7,
ITEM_SUBCLASS_ARMOR_IDOL = 8,
- ITEM_SUBCLASS_ARMOR_TOTEM = 9
+ ITEM_SUBCLASS_ARMOR_TOTEM = 9,
+ ITEM_SUBCLASS_ARMOR_SIGIL = 10
};
-#define MAX_ITEM_SUBCLASS_ARMOR 10
+#define MAX_ITEM_SUBCLASS_ARMOR 11
enum ItemSubclassReagent
{
@@ -310,10 +328,12 @@ enum ItemSubclassTradeGoods
ITEM_SUBCLASS_ELEMENTAL = 10,
ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11,
ITEM_SUBCLASS_ENCHANTING = 12,
- ITEM_SUBCLASS_MATERIAL = 13 // Added in 2.4.2
+ ITEM_SUBCLASS_MATERIAL = 13,
+ ITEM_SUBCLASS_ARMOR_ENCHANTMENT = 14,
+ ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15
};
-#define MAX_ITEM_SUBCLASS_TRADE_GOODS 14
+#define MAX_ITEM_SUBCLASS_TRADE_GOODS 16
enum ItemSubclassGeneric
{
@@ -423,7 +443,8 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
MAX_ITEM_SUBCLASS_QUEST,
MAX_ITEM_SUBCLASS_KEY,
MAX_ITEM_SUBCLASS_PERMANENT,
- MAX_ITEM_SUBCLASS_JUNK
+ MAX_ITEM_SUBCLASS_JUNK,
+ MAX_ITEM_SUBCLASS_GLYPH
};
inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
@@ -477,7 +498,7 @@ struct ItemPrototype
uint32 ItemId;
uint32 Class; // id from ItemClass.dbc
uint32 SubClass; // id from ItemSubClass.dbc
- uint32 Unk0;
+ int32 Unk0;
char* Name1;
uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc
uint32 Quality;
@@ -497,10 +518,13 @@ struct ItemPrototype
uint32 RequiredCityRank;
uint32 RequiredReputationFaction; // id from Faction.dbc
uint32 RequiredReputationRank;
- uint32 MaxCount;
- uint32 Stackable;
+ int32 MaxCount; // <=0: no limit
+ int32 Stackable; // 0: not allowed, -1: put in player coin info tab and don't limit stacking (so 1 slot)
uint32 ContainerSlots;
+ uint32 StatsCount;
_ItemStat ItemStat[10];
+ uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc
+ uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc
_Damage Damage[5];
uint32 Armor;
uint32 HolyRes;
@@ -520,7 +544,7 @@ struct ItemPrototype
uint32 PageMaterial;
uint32 StartQuest; // id from QuestCache.wdb
uint32 LockID;
- uint32 Material; // id from Material.dbc
+ int32 Material; // id from Material.dbc
uint32 Sheath;
uint32 RandomProperty; // id from ItemRandomProperties.dbc
uint32 RandomSuffix; // id from ItemRandomSuffix.dbc
@@ -536,12 +560,13 @@ struct ItemPrototype
uint32 GemProperties; // id from GemProperties.dbc
uint32 RequiredDisenchantSkill;
float ArmorDamageModifier;
+ int32 Duration; // negative = realtime, positive = ingame time
+ uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
uint32 ScriptId;
uint32 DisenchantID;
uint32 FoodType;
uint32 MinMoneyLoot;
uint32 MaxMoneyLoot;
- int32 Duration; // negative = realtime, positive = ingame time
// helpers
bool CanChangeEquipStateInCombat() const
@@ -563,6 +588,71 @@ struct ItemPrototype
return false;
}
+
+ uint32 GetScalingStatValuesColumn() const
+ {
+ if(ScalingStatValue & 0x00000001) // stat mod
+ return 0;
+ if(ScalingStatValue & 0x00000002) // stat mod
+ return 1;
+ if(ScalingStatValue & 0x00000004) // stat mod
+ return 2;
+ if(ScalingStatValue & 0x00000008) // stat mod
+ return 3;
+ if(ScalingStatValue & 0x00000010) // stat mod
+ return 4;
+ if(ScalingStatValue & 0x00000020) // armor mod
+ return 5;
+ if(ScalingStatValue & 0x00000040) // armor mod
+ return 6;
+ if(ScalingStatValue & 0x00000080) // armor mod
+ return 7;
+ if(ScalingStatValue & 0x00000100) // armor mod
+ return 8;
+ if(ScalingStatValue & 0x00000200) // damage mod
+ return 9;
+ if(ScalingStatValue & 0x00000400) // damage mod
+ return 10;
+ if(ScalingStatValue & 0x00000800) // damage mod
+ return 11;
+ if(ScalingStatValue & 0x00001000) // damage mod
+ return 12;
+ if(ScalingStatValue & 0x00002000) // damage mod
+ return 13;
+ if(ScalingStatValue & 0x00004000) // damage mod
+ return 14;
+ if(ScalingStatValue & 0x00008000) // spell power
+ return 15;
+ if(ScalingStatValue & 0x00020000) // feral AP
+ return 16;
+
+ return 0;
+ }
+
+ uint32 GetMaxStackSize() const { return Stackable > 0 ? uint32(Stackable) : uint32(0x7FFFFFFF-1); }
+
+ float getDPS() const
+ {
+ if (Delay == 0)
+ return 0;
+ float temp = 0;
+ for (int i=0;i<5;++i)
+ temp+=Damage[i].DamageMin + Damage[i].DamageMax;
+ return temp*500/Delay;
+ }
+
+ int32 getFeralBonus() const
+ {
+ // 0x02A5F3 - is mask for Melee weapon from ItemSubClassMask.dbc
+ if (Class == ITEM_CLASS_WEAPON && (1<<SubClass)&0x02A5F3)
+ {
+ int32 bonus = int32(getDPS()*14.0f) - 767;
+ if (bonus < 0)
+ return 0;
+ return bonus;
+ }
+ return 0;
+ }
};
struct ItemLocale
diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp
index 667b65327d5..85c196a9346 100644
--- a/src/game/LFGHandler.cpp
+++ b/src/game/LFGHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Language.h b/src/game/Language.h
index f19ffe3fe15..327eef25ead 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -170,7 +170,9 @@ enum TrinityStrings
LANG_SOUND_NOT_EXIST = 170,
LANG_TELEPORTED_TO_BY_CONSOLE = 171,
LANG_CONSOLE_COMMAND = 172,
- // Room for more level 1 173-199 not used
+ LANG_YOU_CHANGE_RUNIC_POWER = 173,
+ LANG_YOURS_RUNIC_POWER_CHANGED = 174,
+ // Room for more level 1 175-199 not used
// level 2 chat
LANG_NO_SELECTION = 200,
@@ -269,9 +271,9 @@ enum TrinityStrings
LANG_COMMAND_WHISPERON = 285,
LANG_COMMAND_WHISPEROFF = 286,
LANG_COMMAND_CREATGUIDNOTFOUND = 287,
- // TICKET STRINGS NEED REWRITE // 288-296 FREE
+ // TICKET STRINGS NEED REWRITE // 288-296 FREE
- // END
+ // END
LANG_COMMAND_SPAWNDIST = 297,
LANG_COMMAND_SPAWNTIME = 298,
LANG_COMMAND_MODIFY_HONOR = 299,
@@ -322,6 +324,8 @@ enum TrinityStrings
LANG_CREATURE_NOT_FOLLOW_YOU_NOW = 342,
LANG_CREATURE_NON_TAMEABLE = 343,
LANG_YOU_ALREADY_HAVE_PET = 344,
+ LANG_CUSTOMIZE_PLAYER = 345,
+ LANG_CUSTOMIZE_PLAYER_GUID = 346,
// Room for more level 2 345-399 not used
// level 3 chat
@@ -529,9 +533,9 @@ enum TrinityStrings
LANG_CHANGE_32BIT = 575, //log
LANG_CHANGE_32BIT_FIELD = 576,
- LANG_INVISIBLE_INVISIBLE = 577,
- LANG_INVISIBLE_VISIBLE = 578,
- LANG_SELECTED_TARGET_NOT_HAVE_VICTIM = 579,
+ LANG_INVISIBLE_INVISIBLE = 577,
+ LANG_INVISIBLE_VISIBLE = 578,
+ LANG_SELECTED_TARGET_NOT_HAVE_VICTIM = 579,
LANG_COMMAND_LEARN_ALL_DEFAULT_AND_QUEST = 580,
LANG_COMMAND_NEAROBJMESSAGE = 581,
@@ -636,76 +640,50 @@ enum TrinityStrings
LANG_BG_QUEUE_ANNOUNCE_SELF = 711,
LANG_BG_QUEUE_ANNOUNCE_WORLD = 712,
-
-
LANG_YOUR_ARENA_LEVEL_REQ_ERROR = 713,
-// LANG_HIS_ARENA_LEVEL_REQ_ERROR = 714, an opcode exists for this
+ // = 714, not used
LANG_YOUR_BG_LEVEL_REQ_ERROR = 715,
-// LANG_YOUR_ARENA_TEAM_FULL = 716, an opcode exists for this
-
- LANG_BG_AV_ALLY = 717,
- LANG_BG_AV_HORDE = 718,
- LANG_BG_AV_TOWER_TAKEN = 719,
- LANG_BG_AV_TOWER_ASSAULTED = 720,
- LANG_BG_AV_TOWER_DEFENDED = 721,
- LANG_BG_AV_GRAVE_TAKEN = 722,
- LANG_BG_AV_GRAVE_DEFENDED = 723,
- LANG_BG_AV_GRAVE_ASSAULTED = 724,
-
- LANG_BG_AV_MINE_TAKEN = 725,
- LANG_BG_AV_MINE_NORTH = 726,
- LANG_BG_AV_MINE_SOUTH = 727,
-
- LANG_BG_AV_NODE_GRAVE_STORM_AID = 728,
- LANG_BG_AV_NODE_TOWER_DUN_S = 729,
- LANG_BG_AV_NODE_TOWER_DUN_N = 730,
- LANG_BG_AV_NODE_GRAVE_STORMPIKE = 731,
- LANG_BG_AV_NODE_TOWER_ICEWING = 732,
- LANG_BG_AV_NODE_GRAVE_STONE = 733,
- LANG_BG_AV_NODE_TOWER_STONE = 734,
- LANG_BG_AV_NODE_GRAVE_SNOW = 735,
- LANG_BG_AV_NODE_TOWER_ICE = 736,
- LANG_BG_AV_NODE_GRAVE_ICE = 737,
- LANG_BG_AV_NODE_TOWER_POINT = 738,
- LANG_BG_AV_NODE_GRAVE_FROST = 739,
- LANG_BG_AV_NODE_TOWER_FROST_E = 740,
- LANG_BG_AV_NODE_TOWER_FROST_W = 741,
- LANG_BG_AV_NODE_GRAVE_FROST_HUT = 742,
-
- LANG_BG_AV_ONEMINTOSTART = 743,
- LANG_BG_AV_HALFMINTOSTART = 744,
- LANG_BG_AV_STARTED = 745,
- LANG_BG_AV_A_NEAR_LOSE = 746,
- LANG_BG_AV_H_NEAR_LOSE = 747,
- LANG_BG_AV_H_CAPTAIN_DEAD = 748,
- LANG_BG_AV_A_CAPTAIN_DEAD = 749,
+ // LANG_YOUR_ARENA_TEAM_FULL = 716, an opcode exists for this
+ LANG_BG_STARTED_ANNOUNCE_WORLD = 717,
+ LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN= 718,
+ LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT= 719,
+
+ LANG_BG_GROUP_TOO_LARGE = 720, // "Your group is too large for this battleground. Please regroup to join."
+ LANG_ARENA_GROUP_TOO_LARGE = 721, // "Your group is too large for this arena. Please regroup to join."
+ LANG_ARENA_YOUR_TEAM_ONLY = 722, // "Your group has members not in your arena team. Please regroup to join."
+ LANG_ARENA_NOT_ENOUGH_PLAYERS = 723, // "Your group does not have enough players to join this match."
+ LANG_ARENA_GOLD_WINS = 724, // "The Gold Team wins!"
+ LANG_ARENA_GREEN_WINS = 725, // "The Green Team wins!"
+ LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 726, // The battleground will end soon, because there aren't enough players. Get more ppl or win already!
+ LANG_BG_GROUP_OFFLINE_MEMBER = 727, // "Your group has an offline member. Please remove him before joining."
+ LANG_BG_GROUP_MIXED_FACTION = 728, // "Your group has players from the opposing faction. You can't join the battleground as a group."
+ LANG_BG_GROUP_MIXED_LEVELS = 729, // "Your group has players from different battleground brakets. You can't join as group."
+ LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE = 730, // "Someone in your party is already in this battleground queue. (S)he must leave it before joining as group."
+ LANG_BG_GROUP_MEMBER_DESERTER = 731, // "Someone in your party is Deserter. You can't join as group."
+ LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS = 732, // "Someone in your party is already in three battleground queues. You cannot join as group."
+
+ LANG_CANNOT_TELE_TO_BG = 733, // "You cannot teleport to a battleground or arena map."
+ LANG_CANNOT_SUMMON_TO_BG = 734, // "You cannot summon players to a battleground or arena map."
+ LANG_CANNOT_GO_TO_BG_GM = 735, // "You must be in GM mode to teleport to a player in a battleground."
+ LANG_CANNOT_GO_TO_BG_FROM_BG = 736, // "You cannot teleport to a battleground from another battleground. Please leave the current battleground first."
+ LANG_DEBUG_ARENA_ON = 737,
+ LANG_DEBUG_ARENA_OFF = 738,
+ LANG_DEBUG_BG_ON = 739,
+ LANG_DEBUG_BG_OFF = 740,
+ LANG_DIST_ARENA_POINTS_START = 741,
+ LANG_DIST_ARENA_POINTS_ONLINE_START = 742,
+ LANG_DIST_ARENA_POINTS_ONLINE_END = 743,
+ LANG_DIST_ARENA_POINTS_TEAM_START = 744,
+ LANG_DIST_ARENA_POINTS_TEAM_END = 745,
+ LANG_DIST_ARENA_POINTS_END = 746,
+ // Room for batleground/arena strings 747-799 not used
// Room for BG/ARENA 750-769 not used
LANG_ARENA_TESTING = 785,
-
LANG_AUTO_ANN = 786,
LANG_ANNOUNCE_COLOR = 787,
- LANG_BG_GROUP_TOO_LARGE = 1122, // "Your group is too large for this battleground. Please regroup to join."
- LANG_ARENA_GROUP_TOO_LARGE = 1123, // "Your group is too large for this arena. Please regroup to join."
- LANG_ARENA_YOUR_TEAM_ONLY = 1124, // "Your group has members not in your arena team. Please regroup to join."
- LANG_ARENA_NOT_ENOUGH_PLAYERS = 1125, // "Your group does not have enough players to join this match."
- LANG_ARENA_GOLD_WINS = 1126, // "The Gold Team wins!"
- LANG_ARENA_GREEN_WINS = 1127, // "The Green Team wins!"
- LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 1128, // The battleground will end soon, because there aren't enough players. Get more ppl or win already!
- LANG_BG_GROUP_OFFLINE_MEMBER = 1129, // "Your group has an offline member. Please remove him before joining."
- LANG_BG_GROUP_MIXED_FACTION = 1130, // "Your group has players from the opposing faction. You can't join the battleground as a group."
- LANG_BG_GROUP_MIXED_LEVELS = 1131, // "Your group has players from different battleground brakets. You can't join as group."
- LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE = 1132, // "Someone in your party is already in this battleground queue. (S)he must leave it before joining as group."
- LANG_BG_GROUP_MEMBER_DESERTER = 1133, // "Someone in your party is Deserter. You can't join as group."
- LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS = 1134, // "Someone in your party is already in three battleground queues. You cannot join as group."
-
- LANG_CANNOT_TELE_TO_BG = 1135, // "You cannot teleport to a battleground or arena map."
- LANG_CANNOT_SUMMON_TO_BG = 1136, // "You cannot summon players to a battleground or arena map."
- LANG_CANNOT_GO_TO_BG_GM = 1137, // "You must be in GM mode to teleport to a player in a battleground."
- LANG_CANNOT_GO_TO_BG_FROM_BG = 1138, // "You cannot teleport to a battleground from another battleground. Please leave the current battleground first."
-
// in game strings
LANG_PET_INVALID_NAME = 800,
LANG_NOT_ENOUGH_GOLD = 801,
@@ -717,7 +695,8 @@ enum TrinityStrings
LANG_NEED_CHARACTER_NAME = 807,
LANG_PLAYER_NOT_EXIST_OR_OFFLINE = 808,
LANG_ACCOUNT_FOR_PLAYER_NOT_FOUND = 809,
- // Room for in-game strings 810-999 not used
+ LANG_ACHIEVEMENT_EARNED = 810,
+ // Room for in-game strings 811-999 not used
// Level 4 (CLI only commands)
LANG_COMMAND_EXIT = 1000,
@@ -757,25 +736,66 @@ enum TrinityStrings
LANG_MUST_MALE_OR_FEMALE = 1119,
LANG_YOU_CHANGE_GENDER = 1120,
LANG_YOUR_GENDER_CHANGED = 1121,
-
- // Ticket Strings 2000-2029
- LANG_COMMAND_TICKETNEW = 2000,
+ LANG_SKILL_VALUES = 1122,
+ // Room for more level 3 1123-1199 not used
+
+ // AV
+ LANG_BG_AV_ALLY = 1200,
+ LANG_BG_AV_HORDE = 1201,
+ LANG_BG_AV_TOWER_TAKEN = 1202,
+ LANG_BG_AV_TOWER_ASSAULTED = 1203,
+ LANG_BG_AV_TOWER_DEFENDED = 1204,
+ LANG_BG_AV_GRAVE_TAKEN = 1205,
+ LANG_BG_AV_GRAVE_DEFENDED = 1206,
+ LANG_BG_AV_GRAVE_ASSAULTED = 1207,
+
+ LANG_BG_AV_MINE_TAKEN = 1208,
+ LANG_BG_AV_MINE_NORTH = 1209,
+ LANG_BG_AV_MINE_SOUTH = 1210,
+
+ LANG_BG_AV_NODE_GRAVE_STORM_AID = 1211,
+ LANG_BG_AV_NODE_TOWER_DUN_S = 1212,
+ LANG_BG_AV_NODE_TOWER_DUN_N = 1213,
+ LANG_BG_AV_NODE_GRAVE_STORMPIKE = 1214,
+ LANG_BG_AV_NODE_TOWER_ICEWING = 1215,
+ LANG_BG_AV_NODE_GRAVE_STONE = 1216,
+ LANG_BG_AV_NODE_TOWER_STONE = 1217,
+ LANG_BG_AV_NODE_GRAVE_SNOW = 1218,
+ LANG_BG_AV_NODE_TOWER_ICE = 1219,
+ LANG_BG_AV_NODE_GRAVE_ICE = 1220,
+ LANG_BG_AV_NODE_TOWER_POINT = 1221,
+ LANG_BG_AV_NODE_GRAVE_FROST = 1222,
+ LANG_BG_AV_NODE_TOWER_FROST_E = 1223,
+ LANG_BG_AV_NODE_TOWER_FROST_W = 1224,
+ LANG_BG_AV_NODE_GRAVE_FROST_HUT = 1225,
+
+ LANG_BG_AV_ONEMINTOSTART = 1226,
+ LANG_BG_AV_HALFMINTOSTART = 1227,
+ LANG_BG_AV_STARTED = 1228,
+ LANG_BG_AV_A_NEAR_LOSE = 1229,
+ LANG_BG_AV_H_NEAR_LOSE = 1230,
+ LANG_BG_AV_H_CAPTAIN_DEAD = 1231,
+ LANG_BG_AV_A_CAPTAIN_DEAD = 1232,
+ // FREE IDS 1233-9999
+
+ // Ticket Strings 2000-2029
+ LANG_COMMAND_TICKETNEW = 2000,
LANG_COMMAND_TICKETUPDATED = 2001,
- LANG_COMMAND_TICKETPLAYERABANDON = 2002,
- LANG_COMMAND_TICKETCLOSED = 2003,
- LANG_COMMAND_TICKETDELETED = 2004,
- LANG_COMMAND_TICKETNOTEXIST = 2005,
- LANG_COMMAND_TICKETCLOSEFIRST = 2006,
- LANG_COMMAND_TICKETALREADYASSIGNED = 2007,
- LANG_COMMAND_TICKETRELOAD = 2008,
- LANG_COMMAND_TICKETSHOWLIST = 2009,
- LANG_COMMAND_TICKETSHOWONLINELIST = 2010,
- LANG_COMMAND_TICKETSHOWCLOSEDLIST = 2011,
- LANG_COMMAND_TICKETASSIGNERROR_A = 2012,
- LANG_COMMAND_TICKETASSIGNERROR_B = 2013,
- LANG_COMMAND_TICKETNOTASSIGNED = 2014,
- LANG_COMMAND_TICKETUNASSIGNSECURITY = 2015,
- LANG_COMMAND_TICKETCANNOTCLOSE = 2016,
+ LANG_COMMAND_TICKETPLAYERABANDON = 2002,
+ LANG_COMMAND_TICKETCLOSED = 2003,
+ LANG_COMMAND_TICKETDELETED = 2004,
+ LANG_COMMAND_TICKETNOTEXIST = 2005,
+ LANG_COMMAND_TICKETCLOSEFIRST = 2006,
+ LANG_COMMAND_TICKETALREADYASSIGNED = 2007,
+ LANG_COMMAND_TICKETRELOAD = 2008,
+ LANG_COMMAND_TICKETSHOWLIST = 2009,
+ LANG_COMMAND_TICKETSHOWONLINELIST = 2010,
+ LANG_COMMAND_TICKETSHOWCLOSEDLIST = 2011,
+ LANG_COMMAND_TICKETASSIGNERROR_A = 2012,
+ LANG_COMMAND_TICKETASSIGNERROR_B = 2013,
+ LANG_COMMAND_TICKETNOTASSIGNED = 2014,
+ LANG_COMMAND_TICKETUNASSIGNSECURITY = 2015,
+ LANG_COMMAND_TICKETCANNOTCLOSE = 2016,
LANG_COMMAND_TICKETLISTGUID = 2017,
LANG_COMMAND_TICKETLISTNAME = 2018,
LANG_COMMAND_TICKETLISTAGE = 2019,
@@ -786,7 +806,7 @@ enum TrinityStrings
LANG_COMMAND_TICKETLISTADDCOMMENT = 2024,
- // Trinity strings 5000-9999
+ // Trinity strings 5000-9999
LANG_COMMAND_FREEZE = 5000,
LANG_COMMAND_FREEZE_ERROR = 5001,
LANG_COMMAND_FREEZE_WRONG = 5002,
@@ -794,8 +814,8 @@ enum TrinityStrings
LANG_COMMAND_NO_FROZEN_PLAYERS = 5004,
LANG_COMMAND_LIST_FREEZE = 5005,
LANG_COMMAND_FROZEN_PLAYERS = 5006,
- LANG_INSTANCE_MUST_RAID_GRP = 5007,
- LANG_INSTANCE_NOT_AS_GHOST = 5008,
+ //LANG_INSTANCE_MUST_RAID_GRP = 5007,
+ //LANG_INSTANCE_NOT_AS_GHOST = 5008,
LANG_COMMAND_PLAYED_TO_ALL = 5009,
// Room for more Trinity strings 5010-9999
// Used for GM Announcements
@@ -867,8 +887,10 @@ enum TrinityStrings
LANG_OPVP_EP_FLIGHT_CGT = 10053,
LANG_OPVP_ZM_GOSSIP_ALLIANCE = 10054,
LANG_OPVP_ZM_GOSSIP_HORDE = 10055,
- LANG_NO_ENTER_HALL_OF_LEGENDS = 10056,
- LANG_NO_ENTER_CHAMPIONS_HALL = 10057,
+ LANG_NO_ENTER_HALL_OF_LEGENDS = 10056,
+ LANG_NO_ENTER_CHAMPIONS_HALL = 10057,
+
+
// Use for custom patches 11000-11999
diff --git a/src/game/Level0.cpp b/src/game/Level0.cpp
index 62aa5d41709..fcd40455072 100644
--- a/src/game/Level0.cpp
+++ b/src/game/Level0.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -172,7 +172,7 @@ bool ChatHandler::HandleGMListIngameCommand(const char* /*args*/)
first = false;
}
- SendSysMessage(itr->second->GetName());
+ SendSysMessage(GetNameLink(itr->second).c_str());
}
}
diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp
index 489cc656243..062f262a826 100644
--- a/src/game/Level1.cpp
+++ b/src/game/Level1.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -53,7 +53,7 @@ bool ChatHandler::HandleNpcSayCommand(const char* args)
return false;
}
- pCreature->Say(args, LANG_UNIVERSAL, 0);
+ pCreature->MonsterSay(args, LANG_UNIVERSAL, 0);
return true;
}
@@ -71,7 +71,7 @@ bool ChatHandler::HandleNpcYellCommand(const char* args)
return false;
}
- pCreature->Yell(args, LANG_UNIVERSAL, 0);
+ pCreature->MonsterYell(args, LANG_UNIVERSAL, 0);
return true;
}
@@ -91,7 +91,7 @@ bool ChatHandler::HandleNpcTextEmoteCommand(const char* args)
return false;
}
- pCreature->TextEmote(args, 0);
+ pCreature->MonsterTextEmote(args, 0);
return true;
}
@@ -115,7 +115,11 @@ bool ChatHandler::HandleNpcWhisperCommand(const char* args)
uint64 receiver_guid= atol(receiver_str);
- pCreature->Whisper(text,receiver_guid);
+ // check online security
+ if (HasLowerSecurity(objmgr.GetPlayer(receiver_guid), 0))
+ return false;
+
+ pCreature->MonsterWhisper(text,receiver_guid);
return true;
}
@@ -125,8 +129,7 @@ bool ChatHandler::HandleNameAnnounceCommand(const char* args)
WorldPacket data;
if(!*args)
return false;
- //char str[1024];
- //sprintf(str, GetTrinityString(LANG_ANNOUNCE_COLOR), m_session->GetPlayer()->GetName(), args);
+
sWorld.SendWorldText(LANG_ANNOUNCE_COLOR, m_session->GetPlayer()->GetName(), args);
return true;
}
@@ -650,14 +653,16 @@ bool ChatHandler::HandleVisibleCommand(const char* args)
return false;
}
+
+
bool ChatHandler::HandleGPSCommand(const char* args)
{
WorldObject *obj = NULL;
if (*args)
{
- std::string name = args;
- if(normalizePlayerName(name))
- obj = objmgr.GetPlayer(name.c_str());
+ uint64 guid = extractGuidFromLink((char*)args);
+ if(guid)
+ obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(),guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
if(!obj)
{
@@ -708,18 +713,20 @@ bool ChatHandler::HandleGPSCommand(const char* args)
obj->GetMapId(), (mapEntry ? mapEntry->name[m_session->GetSessionDbcLocale()] : "<unknown>" ),
zone_id, (zoneEntry ? zoneEntry->area_name[m_session->GetSessionDbcLocale()] : "<unknown>" ),
area_id, (areaEntry ? areaEntry->area_name[m_session->GetSessionDbcLocale()] : "<unknown>" ),
+ obj->GetPhaseMask(),
obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(),
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), obj->GetInstanceId(),
zone_x, zone_y, ground_z, floor_z, have_map, have_vmap );
sLog.outDebug("Player %s GPS call for %s '%s' (%s: %u):",
- GetName(),
+ m_session ? GetNameLink().c_str() : GetMangosString(LANG_CONSOLE_COMMAND),
(obj->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), obj->GetName(),
(obj->GetTypeId() == TYPEID_PLAYER ? "GUID" : "Entry"), (obj->GetTypeId() == TYPEID_PLAYER ? obj->GetGUIDLow(): obj->GetEntry()) );
sLog.outDebug(GetTrinityString(LANG_MAP_POSITION),
obj->GetMapId(), (mapEntry ? mapEntry->name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ),
zone_id, (zoneEntry ? zoneEntry->area_name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ),
area_id, (areaEntry ? areaEntry->area_name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ),
+ obj->GetPhaseMask(),
obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(),
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), obj->GetInstanceId(),
zone_x, zone_y, ground_z, floor_z, have_map, have_vmap );
@@ -733,9 +740,8 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
if(!*args)
return false;
- std::string name = args;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -745,9 +751,14 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
Player *chr = objmgr.GetPlayer(name.c_str());
if (chr)
{
+ std::string nameLink = playerLink(name);
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
if(chr->IsBeingTeleported()==true)
{
- PSendSysMessage(LANG_IS_TELEPORTED, chr->GetName());
+ PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
@@ -756,10 +767,25 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
if(pMap->IsBattleGroundOrArena())
{
- // cannot summon to bg
- PSendSysMessage(LANG_CANNOT_SUMMON_TO_BG,chr->GetName());
- SetSentErrorMessage(true);
- return false;
+ // only allow if gm mode is on
+ if (!chr->isGameMaster())
+ {
+ PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM,chr->GetName());
+ SetSentErrorMessage(true);
+ return false;
+ }
+ // if both players are in different bgs
+ else if (chr->GetBattleGroundId() && m_session->GetPlayer()->GetBattleGroundId() != chr->GetBattleGroundId())
+ {
+ PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG,chr->GetName());
+ SetSentErrorMessage(true);
+ return false;
+ }
+ // all's well, set bg id
+ // when porting out from the bg, it will be reset to 0
+ chr->SetBattleGroundId(m_session->GetPlayer()->GetBattleGroundId());
+ // remember current position as entry point for return at bg end teleportation
+ chr->SetBattleGroundEntryPoint(chr->GetMapId(),chr->GetPositionX(),chr->GetPositionY(),chr->GetPositionZ(),chr->GetOrientation());
}
else if(pMap->IsDungeon())
{
@@ -767,7 +793,7 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
if( cMap->Instanceable() && cMap->GetInstanceId() != pMap->GetInstanceId() )
{
// cannot summon from instance to instance
- PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,chr->GetName());
+ PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
@@ -778,15 +804,15 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
(m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) )
// the last check is a bit excessive, but let it be, just in case
{
- PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,chr->GetName());
+ PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
}
- PSendSysMessage(LANG_SUMMONING, chr->GetName(),"");
+ PSendSysMessage(LANG_SUMMONING, nameLink.c_str(),"");
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_SUMMONED_BY, GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_SUMMONED_BY, nameLink.c_str());
// stop flight if need
if(chr->isInFlight())
@@ -805,7 +831,13 @@ bool ChatHandler::HandleNamegoCommand(const char* args)
}
else if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
{
- PSendSysMessage(LANG_SUMMONING, name.c_str(),GetTrinityString(LANG_OFFLINE));
+ // check offline security
+ if (HasLowerSecurity(NULL, guid))
+ return false;
+
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_SUMMONING, nameLink.c_str(),GetMangosString(LANG_OFFLINE));
// in point where GM stay
Player::SavePositionInDB(m_session->GetPlayer()->GetMapId(),
@@ -833,9 +865,8 @@ bool ChatHandler::HandleGonameCommand(const char* args)
Player* _player = m_session->GetPlayer();
- std::string name = args;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -845,28 +876,36 @@ bool ChatHandler::HandleGonameCommand(const char* args)
Player *chr = objmgr.GetPlayer(name.c_str());
if (chr)
{
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ std::string chrNameLink = playerLink(name);
+
Map* cMap = chr->GetMap();
if(cMap->IsBattleGroundOrArena())
{
// only allow if gm mode is on
if (!_player->isGameMaster())
{
- PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM,chr->GetName());
+ PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- // if already in a bg, don't let port to other
- else if (_player->GetBattleGroundId())
+ // if both players are in different bgs
+ else if (_player->GetBattleGroundId() && _player->GetBattleGroundId() != chr->GetBattleGroundId())
{
- PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG,chr->GetName());
+ PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
// all's well, set bg id
// when porting out from the bg, it will be reset to 0
_player->SetBattleGroundId(chr->GetBattleGroundId());
+ // remember current position as entry point for return at bg end teleportation
+ _player->SetBattleGroundEntryPoint(_player->GetMapId(),_player->GetPositionX(),_player->GetPositionY(),_player->GetPositionZ(),_player->GetOrientation());
}
- else if(cMap->IsDungeon())
+ else if(cMap->IsDungeon() && cMap->Instanceable())
{
Map* pMap = MapManager::Instance().GetMap(_player->GetMapId(),_player);
@@ -878,7 +917,7 @@ bool ChatHandler::HandleGonameCommand(const char* args)
// we are in group, we can go only if we are in the player group
if (_player->GetGroup() != chr->GetGroup())
{
- PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY,chr->GetName());
+ PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
@@ -888,7 +927,7 @@ bool ChatHandler::HandleGonameCommand(const char* args)
// we are not in group, let's verify our GM mode
if (!_player->isGameMaster())
{
- PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM,chr->GetName());
+ PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
@@ -912,10 +951,9 @@ bool ChatHandler::HandleGonameCommand(const char* args)
_player->SetDifficulty(chr->GetDifficulty());
}
- PSendSysMessage(LANG_APPEARING_AT, chr->GetName());
-
+ PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str());
if (_player->IsVisibleGloballyFor(chr))
- ChatHandler(chr).PSendSysMessage(LANG_APPEARING_TO, _player->GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_APPEARING_TO, GetNameLink().c_str());
// stop flight if need
if(_player->isInFlight())
@@ -938,7 +976,13 @@ bool ChatHandler::HandleGonameCommand(const char* args)
if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
{
- PSendSysMessage(LANG_APPEARING_AT, name.c_str());
+ // check offline security
+ if (HasLowerSecurity(NULL, guid))
+ return false;
+
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str());
// to point where player stay (if loaded)
float x,y,z,o;
@@ -977,12 +1021,15 @@ bool ChatHandler::HandleRecallCommand(const char* args)
chr = getSelectedPlayer();
if(!chr)
chr = m_session->GetPlayer();
+
+ // check online security
+ else if (HasLowerSecurity(chr, 0))
+ return false;
}
else
{
- std::string name = args;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -997,11 +1044,15 @@ bool ChatHandler::HandleRecallCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
}
if(chr->IsBeingTeleported())
{
- PSendSysMessage(LANG_IS_TELEPORTED, chr->GetName());
+ PSendSysMessage(LANG_IS_TELEPORTED, GetNameLink(chr).c_str());
SetSentErrorMessage(true);
return false;
}
@@ -1035,6 +1086,10 @@ bool ChatHandler::HandleModifyKnownTitlesCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
uint64 titles2 = titles;
for(int i=1; i < sCharTitlesStore.GetNumRows(); ++i)
@@ -1084,9 +1139,13 @@ bool ChatHandler::HandleModifyHPCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_HP, chr->GetName(), hp, hpm);
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_HP, GetNameLink(chr).c_str(), hp, hpm);
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, GetName(), hp, hpm);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, GetNameLink().c_str(), hp, hpm);
chr->SetMaxHealth( hpm );
chr->SetHealth( hp );
@@ -1128,9 +1187,13 @@ bool ChatHandler::HandleModifyManaCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_MANA, chr->GetName(), mana, manam);
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_MANA, GetNameLink(chr).c_str(), mana, manam);
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, GetName(), mana, manam);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, GetNameLink().c_str(), mana, manam);
chr->SetMaxPower(POWER_MANA,manam );
chr->SetPower(POWER_MANA, mana );
@@ -1173,9 +1236,13 @@ bool ChatHandler::HandleModifyEnergyCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_ENERGY, chr->GetName(), energy/10, energym/10);
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_ENERGY, GetNameLink(chr).c_str(), energy/10, energym/10);
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, GetName(), energy/10, energym/10);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, GetNameLink().c_str(), energy/10, energym/10);
chr->SetMaxPower(POWER_ENERGY,energym );
chr->SetPower(POWER_ENERGY, energy );
@@ -1220,9 +1287,13 @@ bool ChatHandler::HandleModifyRageCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_RAGE, chr->GetName(), rage/10, ragem/10);
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_RAGE, GetNameLink(chr).c_str(), rage/10, ragem/10);
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, GetName(), rage/10, ragem/10);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, GetNameLink().c_str(), rage/10, ragem/10);
chr->SetMaxPower(POWER_RAGE,ragem );
chr->SetPower(POWER_RAGE, rage );
@@ -1230,6 +1301,40 @@ bool ChatHandler::HandleModifyRageCommand(const char* args)
return true;
}
+// Edit Player Runic Power
+bool ChatHandler::HandleModifyRunicPowerCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ int32 rune = atoi((char*)args)*10;
+ int32 runem = atoi((char*)args)*10;
+
+ if (rune <= 0 || runem <= 0 || runem < rune)
+ {
+ SendSysMessage(LANG_BAD_VALUE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player *chr = getSelectedPlayer();
+ if (chr == NULL)
+ {
+ SendSysMessage(LANG_NO_CHAR_SELECTED);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, GetNameLink(chr).c_str(), rune/10, runem/10);
+ if (needReportToTarget(chr))
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, GetNameLink().c_str(), rune/10, runem/10);
+
+ chr->SetMaxPower(POWER_RUNIC_POWER,runem );
+ chr->SetPower(POWER_RUNIC_POWER, rune );
+
+ return true;
+}
+
//Edit Player Faction
bool ChatHandler::HandleModifyFactionCommand(const char* args)
{
@@ -1344,9 +1449,13 @@ bool ChatHandler::HandleModifySpellCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, chr->GetName());
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, GetName(), spellflatid, val, mark);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, GetNameLink().c_str(), spellflatid, val, mark);
WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1+1+2+2));
data << uint8(spellflatid);
@@ -1374,6 +1483,11 @@ bool ChatHandler::HandleModifyTalentCommand (const char* args)
SetSentErrorMessage(true);
return false;
}
+
+ // check online security
+ if (HasLowerSecurity(player, 0))
+ return false;
+
player->SetFreeTalentPoints(tp);
return true;
}
@@ -1398,21 +1512,25 @@ bool ChatHandler::HandleTaxiCheatCommand(const char* args)
chr=m_session->GetPlayer();
}
+ // check online security
+ else if (HasLowerSecurity(chr, 0))
+ return false;
+
if (argstr == "on")
{
chr->SetTaxiCheater(true);
- PSendSysMessage(LANG_YOU_GIVE_TAXIS, chr->GetName());
+ PSendSysMessage(LANG_YOU_GIVE_TAXIS, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetNameLink().c_str());
return true;
}
if (argstr == "off")
{
chr->SetTaxiCheater(false);
- PSendSysMessage(LANG_YOU_REMOVE_TAXIS, chr->GetName());
+ PSendSysMessage(LANG_YOU_REMOVE_TAXIS, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetNameLink().c_str());
return true;
}
@@ -1445,16 +1563,22 @@ bool ChatHandler::HandleModifyASpeedCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ std::string chrNameLink = GetNameLink(chr);
+
if(chr->isInFlight())
{
- PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
+ PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, chr->GetName());
+ PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, chrNameLink.c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetName(), ASpeed);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetNameLink().c_str(), ASpeed);
chr->SetSpeed(MOVE_WALK, ASpeed,true);
chr->SetSpeed(MOVE_RUN, ASpeed,true);
@@ -1487,16 +1611,22 @@ bool ChatHandler::HandleModifySpeedCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ std::string chrNameLink = GetNameLink(chr);
+
if(chr->isInFlight())
{
- PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
+ PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, chr->GetName());
+ PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, chrNameLink.c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetName(), Speed);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetNameLink().c_str(), Speed);
chr->SetSpeed(MOVE_RUN,Speed,true);
@@ -1526,16 +1656,22 @@ bool ChatHandler::HandleModifySwimCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ std::string chrNameLink = GetNameLink(chr);
+
if(chr->isInFlight())
{
- PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
+ PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, chr->GetName());
+ PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, chrNameLink.c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetName(), Swim);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetNameLink().c_str(), Swim);
chr->SetSpeed(MOVE_SWIM,Swim,true);
@@ -1565,16 +1701,22 @@ bool ChatHandler::HandleModifyBWalkCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ std::string chrNameLink = GetNameLink(chr);
+
if(chr->isInFlight())
{
- PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
+ PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, chr->GetName());
+ PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, chrNameLink.c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetName(), BSpeed);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetNameLink().c_str(), BSpeed);
chr->SetSpeed(MOVE_RUN_BACK,BSpeed,true);
@@ -1604,9 +1746,13 @@ bool ChatHandler::HandleModifyFlyCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, chr->GetName());
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetName(), FSpeed);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetNameLink().c_str(), FSpeed);
chr->SetSpeed(MOVE_FLIGHT,FSpeed,true);
@@ -1635,9 +1781,13 @@ bool ChatHandler::HandleModifyScaleCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, chr->GetName());
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, GetName(), Scale);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, GetNameLink().c_str(), Scale);
chr->SetFloatValue(OBJECT_FIELD_SCALE_X, Scale);
@@ -1878,9 +2028,13 @@ bool ChatHandler::HandleModifyMountCommand(const char* args)
return false;
}
- PSendSysMessage(LANG_YOU_GIVE_MOUNT, chr->GetName());
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ PSendSysMessage(LANG_YOU_GIVE_MOUNT, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_MOUNT_GIVED, GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_MOUNT_GIVED, GetNameLink().c_str());
chr->SetUInt32Value( UNIT_FIELD_FLAGS , 0x001000 );
chr->Mount(mId);
@@ -1915,6 +2069,10 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
int32 addmoney = atoi((char*)args);
uint32 moneyuser = chr->GetMoney();
@@ -1926,25 +2084,25 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args)
sLog.outDetail(GetTrinityString(LANG_CURRENT_MONEY), moneyuser, addmoney, newmoney);
if(newmoney <= 0 )
{
- PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, chr->GetName());
+ PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, GetNameLink().c_str());
chr->SetMoney(0);
}
else
{
- PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), chr->GetName());
+ PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, GetName(), abs(addmoney));
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, GetNameLink().c_str(), abs(addmoney));
chr->SetMoney( newmoney );
}
}
else
{
- PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, chr->GetName());
+ PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, GetName(), addmoney);
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, GetNameLink().c_str(), addmoney);
chr->ModifyMoney( addmoney );
}
@@ -1953,20 +2111,24 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args)
return true;
}
-//Edit Player field
+//Edit Unit field
bool ChatHandler::HandleModifyBitCommand(const char* args)
{
if( !*args )
return false;
- Player *chr = getSelectedPlayer();
- if (chr == NULL)
+ Unit *unit = getSelectedUnit();
+ if (!unit)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
+ // check online security
+ if (unit->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player *)unit, 0))
+ return false;
+
char* pField = strtok((char*)args, " ");
if (!pField)
return false;
@@ -1978,13 +2140,12 @@ bool ChatHandler::HandleModifyBitCommand(const char* args)
uint16 field = atoi(pField);
uint32 bit = atoi(pBit);
- if (field < 1 || field >= PLAYER_END)
+ if (field < OBJECT_END || field >= unit->GetValuesCount())
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
-
if (bit < 1 || bit > 32)
{
SendSysMessage(LANG_BAD_VALUE);
@@ -1992,17 +2153,16 @@ bool ChatHandler::HandleModifyBitCommand(const char* args)
return false;
}
- if ( chr->HasFlag( field, (1<<(bit-1)) ) )
+ if ( unit->HasFlag( field, (1<<(bit-1)) ) )
{
- chr->RemoveFlag( field, (1<<(bit-1)) );
+ unit->RemoveFlag( field, (1<<(bit-1)) );
PSendSysMessage(LANG_REMOVE_BIT, bit, field);
}
else
{
- chr->SetFlag( field, (1<<(bit-1)) );
+ unit->SetFlag( field, (1<<(bit-1)) );
PSendSysMessage(LANG_SET_BIT, bit, field);
}
-
return true;
}
@@ -2019,11 +2179,15 @@ bool ChatHandler::HandleModifyHonorCommand (const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
int32 amount = (uint32)atoi(args);
target->ModifyHonorPoints(amount);
- PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, target->GetName(), target->GetHonorPoints());
+ PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, GetNameLink(target).c_str(), target->GetHonorPoints());
return true;
}
@@ -2126,8 +2290,10 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args)
}
}
}
+
if (counter == 0) // if counter == 0 then we found nth
SendSysMessage (LANG_COMMAND_NOAREAFOUND);
+
return true;
}
@@ -2254,9 +2420,13 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
// format: name "subject text" "mail text"
- char* pName = strtok((char*)args, " ");
- if(!pName)
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
+ }
char* tail1 = strtok(NULL, "");
if(!tail1)
@@ -2294,18 +2464,10 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
if (!msgText)
return false;
- // pName, msgSubject, msgText isn't NUL after prev. check
- std::string name = pName;
+ // msgSubject, msgText isn't NUL after prev. check
std::string subject = msgSubject;
std::string text = msgText;
- if(!normalizePlayerName(name))
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
if(!receiver_guid)
{
@@ -2314,7 +2476,6 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
return false;
}
- uint32 mailId = objmgr.GenerateMailID();
// from console show not existed sender
uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
@@ -2326,7 +2487,8 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_NONE);
- PSendSysMessage(LANG_MAIL_SENT, name.c_str());
+ std::string nameLink = playerLink(name);
+ PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
return true;
}
@@ -2336,14 +2498,8 @@ bool ChatHandler::HandleNameTeleCommand(const char * args)
if(!*args)
return false;
- char* pName = strtok((char*)args, " ");
-
- if(!pName)
- return false;
-
- std::string name = pName;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -2374,17 +2530,22 @@ bool ChatHandler::HandleNameTeleCommand(const char * args)
Player *chr = objmgr.GetPlayer(name.c_str());
if (chr)
{
+ // check online security
+ if (HasLowerSecurity(chr, 0))
+ return false;
+
+ std::string chrNameLink = playerLink(name);
if(chr->IsBeingTeleported()==true)
{
- PSendSysMessage(LANG_IS_TELEPORTED, chr->GetName());
+ PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- PSendSysMessage(LANG_TELEPORTING_TO, chr->GetName(),"", tele->name.c_str());
+ PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(),"", tele->name.c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetNameLink().c_str());
// stop flight if need
if(chr->isInFlight())
@@ -2398,10 +2559,17 @@ bool ChatHandler::HandleNameTeleCommand(const char * args)
chr->TeleportTo(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation);
}
- else if (uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str()))
+ else if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
{
- PSendSysMessage(LANG_TELEPORTING_TO, name.c_str(), GetTrinityString(LANG_OFFLINE), tele->name.c_str());
- Player::SavePositionInDB(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation,MapManager::Instance().GetZoneId(tele->mapId,tele->position_x,tele->position_y),guid);
+ // check offline security
+ if (HasLowerSecurity(NULL, guid))
+ return false;
+
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), GetMangosString(LANG_OFFLINE), tele->name.c_str());
+ Player::SavePositionInDB(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation,
+ MapManager::Instance().GetZoneId(tele->mapId,tele->position_x,tele->position_y,tele->position_z),guid);
}
else
PSendSysMessage(LANG_NO_PLAYER, name.c_str());
@@ -2423,6 +2591,10 @@ bool ChatHandler::HandleGroupTeleCommand(const char * args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(player, 0))
+ return false;
+
// id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
GameTele const* tele = extractGameTeleFromLink((char*)args);
if(!tele)
@@ -2439,10 +2611,13 @@ bool ChatHandler::HandleGroupTeleCommand(const char * args)
SetSentErrorMessage(true);
return false;
}
+
+ std::string nameLink = GetNameLink(player);
+
Group *grp = player->GetGroup();
if(!grp)
{
- PSendSysMessage(LANG_NOT_IN_GROUP,player->GetName());
+ PSendSysMessage(LANG_NOT_IN_GROUP,nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
@@ -2454,15 +2629,21 @@ bool ChatHandler::HandleGroupTeleCommand(const char * args)
if(!pl || !pl->GetSession() )
continue;
+ // check online security
+ if (HasLowerSecurity(pl, 0))
+ return false;
+
+ std::string plNameLink = GetNameLink(pl);
+
if(pl->IsBeingTeleported())
{
- PSendSysMessage(LANG_IS_TELEPORTED, pl->GetName());
+ PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
continue;
}
- PSendSysMessage(LANG_TELEPORTING_TO, pl->GetName(),"", tele->name.c_str());
+ PSendSysMessage(LANG_TELEPORTING_TO, plNameLink.c_str(),"", tele->name.c_str());
if (needReportToTarget(pl))
- ChatHandler(pl).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetName());
+ ChatHandler(pl).PSendSysMessage(LANG_TELEPORTED_TO_BY, nameLink.c_str());
// stop flight if need
if(pl->isInFlight())
@@ -2486,9 +2667,8 @@ bool ChatHandler::HandleGroupgoCommand(const char* args)
if(!*args)
return false;
- std::string name = args;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -2503,16 +2683,22 @@ bool ChatHandler::HandleGroupgoCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(player, 0))
+ return false;
+
Group *grp = player->GetGroup();
+ std::string nameLink = playerLink(name);
+
if(!grp)
{
- PSendSysMessage(LANG_NOT_IN_GROUP,player->GetName());
+ PSendSysMessage(LANG_NOT_IN_GROUP,nameLink.c_str());
SetSentErrorMessage(true);
return false;
}
- Map* gmMap = MapManager::Instance().GetMap(m_session->GetPlayer()->GetMapId(),m_session->GetPlayer());
+ Map* gmMap = m_session->GetPlayer()->GetMap();
bool to_instance = gmMap->Instanceable();
// we are in instance, and can summon only player in our group with us as lead
@@ -2533,29 +2719,35 @@ bool ChatHandler::HandleGroupgoCommand(const char* args)
if(!pl || pl==m_session->GetPlayer() || !pl->GetSession() )
continue;
+ // check online security
+ if (HasLowerSecurity(pl, 0))
+ return false;
+
+ std::string plNameLink = playerLink(name);
+
if(pl->IsBeingTeleported()==true)
{
- PSendSysMessage(LANG_IS_TELEPORTED, pl->GetName());
+ PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
if (to_instance)
{
- Map* plMap = MapManager::Instance().GetMap(pl->GetMapId(),pl);
+ Map* plMap = pl->GetMap();
if ( plMap->Instanceable() && plMap->GetInstanceId() != gmMap->GetInstanceId() )
{
// cannot summon from instance to instance
- PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,pl->GetName());
+ PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,plNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
}
- PSendSysMessage(LANG_SUMMONING, pl->GetName(),"");
+ PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(),"");
if (needReportToTarget(pl))
- ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, GetName());
+ ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, nameLink.c_str());
// stop flight if need
if(pl->isInFlight())
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index c4dd39b8be7..7d8a5fecf1a 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -10,12 +10,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Common.h"
@@ -35,7 +35,9 @@
#include "World.h"
#include "GameEvent.h"
#include "SpellMgr.h"
+#include "PoolHandler.h"
#include "AccountMgr.h"
+//#include "GMTicketMgr.h"
#include "WaypointManager.h"
#include "Util.h"
#include <cctype>
@@ -58,11 +60,13 @@ bool ChatHandler::HandleMuteCommand(const char* args)
if (!*args)
return false;
- char *charname = strtok((char*)args, " ");
- if (!charname)
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
-
- std::string cname = charname;
+ }
char *timetonotspeak = strtok(NULL, " ");
if(!timetonotspeak)
@@ -70,14 +74,7 @@ bool ChatHandler::HandleMuteCommand(const char* args)
uint32 notspeaktime = (uint32) atoi(timetonotspeak);
- if(!normalizePlayerName(cname))
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- uint64 guid = objmgr.GetPlayerGUIDByName(cname.c_str());
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
if(!guid)
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
@@ -87,27 +84,11 @@ bool ChatHandler::HandleMuteCommand(const char* args)
Player *chr = objmgr.GetPlayer(guid);
- // check security
- uint32 account_id = 0;
- uint32 security = 0;
-
- if (chr)
- {
- account_id = chr->GetSession()->GetAccountId();
- security = chr->GetSession()->GetSecurity();
- }
- else
- {
- account_id = objmgr.GetPlayerAccountIdByGUID(guid);
- security = accmgr.GetSecurity(account_id);
- }
-
- if(m_session && security >= m_session->GetSecurity())
- {
- SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
- SetSentErrorMessage(true);
+ // must have strong lesser security level
+ if(HasLowerSecurity (chr,guid,true))
return false;
- }
+
+ uint32 account_id = chr ? chr->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(guid);
time_t mutetime = time(NULL) + notspeaktime*60;
@@ -119,7 +100,9 @@ bool ChatHandler::HandleMuteCommand(const char* args)
if(chr)
ChatHandler(chr).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notspeaktime);
- PSendSysMessage(LANG_YOU_DISABLE_CHAT, cname.c_str(), notspeaktime);
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_YOU_DISABLE_CHAT, nameLink.c_str(), notspeaktime);
return true;
}
@@ -130,20 +113,15 @@ bool ChatHandler::HandleUnmuteCommand(const char* args)
if (!*args)
return false;
- char *charname = strtok((char*)args, " ");
- if (!charname)
- return false;
-
- std::string cname = charname;
-
- if(!normalizePlayerName(cname))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
- uint64 guid = objmgr.GetPlayerGUIDByName(cname.c_str());
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
if(!guid)
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
@@ -153,27 +131,11 @@ bool ChatHandler::HandleUnmuteCommand(const char* args)
Player *chr = objmgr.GetPlayer(guid);
- // check security
- uint32 account_id = 0;
- uint32 security = 0;
-
- if (chr)
- {
- account_id = chr->GetSession()->GetAccountId();
- security = chr->GetSession()->GetSecurity();
- }
- else
- {
- account_id = objmgr.GetPlayerAccountIdByGUID(guid);
- security = accmgr.GetSecurity(account_id);
- }
-
- if(m_session && security >= m_session->GetSecurity())
- {
- SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
- SetSentErrorMessage(true);
+ // must have strong lesser security level
+ if(HasLowerSecurity (chr,guid,true))
return false;
- }
+
+ uint32 account_id = chr ? chr->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(guid);
if (chr)
{
@@ -192,7 +154,9 @@ bool ChatHandler::HandleUnmuteCommand(const char* args)
if(chr)
ChatHandler(chr).PSendSysMessage(LANG_YOUR_CHAT_ENABLED);
- PSendSysMessage(LANG_YOU_ENABLE_CHAT, cname.c_str());
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str());
return true;
}
@@ -241,7 +205,7 @@ bool ChatHandler::HandleTargetObjectCommand(const char* args)
result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, "
"(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject "
- "LEFT OUTER JOIN game_event_gameobject on gameobject.guid=game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 1",
+ "LEFT OUTER JOIN game_event_gameobject on gameobject.guid=game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10",
m_session->GetPlayer()->GetPositionX(), m_session->GetPlayer()->GetPositionY(), m_session->GetPlayer()->GetPositionZ(), m_session->GetPlayer()->GetMapId(),eventFilter.str().c_str());
}
@@ -251,16 +215,34 @@ bool ChatHandler::HandleTargetObjectCommand(const char* args)
return true;
}
- Field *fields = result->Fetch();
- uint32 lowguid = fields[0].GetUInt32();
- uint32 id = fields[1].GetUInt32();
- float x = fields[2].GetFloat();
- float y = fields[3].GetFloat();
- float z = fields[4].GetFloat();
- float o = fields[5].GetFloat();
- int mapid = fields[6].GetUInt16();
+ bool found = false;
+ float x, y, z, o;
+ uint32 lowguid, id;
+ uint16 mapid, pool_id;
+
+ do
+ {
+ Field *fields = result->Fetch();
+ lowguid = fields[0].GetUInt32();
+ id = fields[1].GetUInt32();
+ x = fields[2].GetFloat();
+ y = fields[3].GetFloat();
+ z = fields[4].GetFloat();
+ o = fields[5].GetFloat();
+ mapid = fields[6].GetUInt16();
+ pool_id = poolhandler.IsPartOfAPool(lowguid, TYPEID_GAMEOBJECT);
+ if (!pool_id || (pool_id && poolhandler.IsSpawnedObject(pool_id, lowguid, TYPEID_GAMEOBJECT)))
+ found = true;
+ } while( result->NextRow() && (!found) );
+
delete result;
+ if (!found)
+ {
+ PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST,id);
+ return false;
+ }
+
GameObjectInfo const* goI = objmgr.GetGameObjectInfo(id);
if (!goI)
@@ -588,6 +570,7 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args)
repState = &repItr->second;
}
+
int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
std::string name = factionEntry->name[loc];
if(name.empty())
@@ -668,6 +651,10 @@ bool ChatHandler::HandleModifyRepCommand(const char * args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
char* factionTxt = extractKeyFromLink((char*)args,"Hfaction");
if(!factionTxt)
return false;
@@ -745,11 +732,11 @@ bool ChatHandler::HandleModifyRepCommand(const char * args)
}
target->SetFactionReputation(factionEntry,amount);
- PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[m_session->GetSessionDbcLocale()], factionId, target->GetName(), target->GetReputation(factionId));
+ PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[m_session->GetSessionDbcLocale()], factionId, GetNameLink(target).c_str(), target->GetReputation(factionId));
return true;
}
-bool ChatHandler::HandleNameCommand(const char* args)
+bool ChatHandler::HandleNameCommand(const char* /*args*/)
{
/* Temp. disabled
if(!*args)
@@ -882,8 +869,8 @@ bool ChatHandler::HandleNpcAddCommand(const char* args)
{
if(!*args)
return false;
- char* charID = strtok((char*)args, " ");
- if (!charID)
+ char* charID = extractKeyFromLink((char*)args,"Hcreature_entry");
+ if(!charID)
return false;
char* team = strtok(NULL, " ");
@@ -901,7 +888,7 @@ bool ChatHandler::HandleNpcAddCommand(const char* args)
Map *map = chr->GetMap();
Creature* pCreature = new Creature;
- if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, id, (uint32)teamval))
+ if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, (uint32)teamval))
{
delete pCreature;
return false;
@@ -916,7 +903,7 @@ bool ChatHandler::HandleNpcAddCommand(const char* args)
return false;
}
- pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()));
+ pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
uint32 db_guid = pCreature->GetDBTableGUIDLow();
@@ -949,7 +936,7 @@ bool ChatHandler::HandleNpcDeleteCommand(const char* args)
else
unit = getSelectedCreature();
- if(!unit || unit->isPet() || unit->isTotem())
+ if(!unit || unit->isPet() || unit->isTotem() || unit->isVehicle())
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
@@ -1056,14 +1043,14 @@ bool ChatHandler::HandleTurnObjectCommand(const char* args)
float rot2 = sin(o/2);
float rot3 = cos(o/2);
- Map* map = MapManager::Instance().GetMap(obj->GetMapId(),obj);
+ Map* map = obj->GetMap();
map->Remove(obj,false);
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
obj->SetFloatValue(GAMEOBJECT_FACING, o);
- obj->SetFloatValue(GAMEOBJECT_ROTATION+2, rot2);
- obj->SetFloatValue(GAMEOBJECT_ROTATION+3, rot3);
+ obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2);
+ obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3);
map->Add(obj);
@@ -1140,7 +1127,7 @@ bool ChatHandler::HandleNpcMoveCommand(const char* args)
const_cast<CreatureData*>(data)->posZ = z;
const_cast<CreatureData*>(data)->orientation = o;
}
- MapManager::Instance().GetMap(pCreature->GetMapId(),pCreature)->CreatureRelocation(pCreature,x, y, z,o);
+ pCreature->GetMap()->CreatureRelocation(pCreature,x, y, z,o);
pCreature->GetMotionMaster()->Initialize();
if(pCreature->isAlive()) // dead creature will reset movement generator at respawn
{
@@ -1187,7 +1174,7 @@ bool ChatHandler::HandleMoveObjectCommand(const char* args)
{
Player *chr = m_session->GetPlayer();
- Map* map = MapManager::Instance().GetMap(obj->GetMapId(),obj);
+ Map* map = obj->GetMap();
map->Remove(obj,false);
obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation());
@@ -1213,7 +1200,7 @@ bool ChatHandler::HandleMoveObjectCommand(const char* args)
return false;
}
- Map* map = MapManager::Instance().GetMap(obj->GetMapId(),obj);
+ Map* map = obj->GetMap();
map->Remove(obj,false);
obj->Relocate(x, y, z, obj->GetOrientation());
@@ -1239,6 +1226,11 @@ bool ChatHandler::HandleDeMorphCommand(const char* /*args*/)
if(!target)
target = m_session->GetPlayer();
+
+ // check online security
+ else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
+ return false;
+
target->DeMorph();
return true;
@@ -1314,7 +1306,6 @@ bool ChatHandler::HandleDelVendorItemCommand(const char* args)
}
uint32 itemId = atol(pitem);
-
if(!objmgr.RemoveVendorItem(vendor->GetEntry(),itemId))
{
PSendSysMessage(LANG_ITEM_NOT_IN_LIST,itemId);
@@ -1629,6 +1620,10 @@ bool ChatHandler::HandleMorphCommand(const char* args)
if(!target)
target = m_session->GetPlayer();
+ // check online security
+ else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
+ return false;
+
target->SetDisplayId(display_id);
return true;
@@ -1688,7 +1683,7 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
kicker = m_session->GetPlayer()->GetName();
if(!kickName)
- {
+ {
Player* player = getSelectedPlayer();
if(!player)
{
@@ -1704,14 +1699,16 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(player, 0))
+ return false;
+
if(sWorld.getConfig(CONFIG_SHOW_KICK_IN_WORLD) == 1)
{
-
sWorld.SendWorldText(LANG_COMMAND_KICKMESSAGE, player->GetName(), kicker.c_str(), reason.c_str());
}
else
{
-
PSendSysMessage(LANG_COMMAND_KICKMESSAGE, player->GetName(), kicker.c_str(), reason.c_str());
}
@@ -1719,8 +1716,8 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
}
else
{
- std::string name = kickName;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)kickName);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -1742,34 +1739,56 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
return false;
}
- if(m_session && player->GetSession()->GetSecurity() > m_session->GetSecurity())
+ if(HasLowerSecurity(player, 0))
{
SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); //maybe replacement string for this later on
SetSentErrorMessage(true);
return false;
}
- if(sWorld.KickPlayer(name.c_str()))
+ std::string nameLink = playerLink(name);
+
+ if(sWorld.KickPlayer(name))
{
if(sWorld.getConfig(CONFIG_SHOW_KICK_IN_WORLD) == 1)
{
-
- sWorld.SendWorldText(LANG_COMMAND_KICKMESSAGE, name.c_str(), kicker.c_str(), reason.c_str());
+ sWorld.SendWorldText(LANG_COMMAND_KICKMESSAGE, nameLink.c_str(), kicker.c_str(), reason.c_str());
}
else
{
- PSendSysMessage(LANG_COMMAND_KICKMESSAGE, name.c_str(), kicker.c_str(), reason.c_str());
+ PSendSysMessage(LANG_COMMAND_KICKMESSAGE,nameLink.c_str());
}
}
else
{
- PSendSysMessage(LANG_COMMAND_KICKNOTFOUNDPLAYER, name.c_str());
+ PSendSysMessage(LANG_COMMAND_KICKNOTFOUNDPLAYER,nameLink.c_str());
return false;
}
}
return true;
}
+//set temporary phase mask for player
+bool ChatHandler::HandleModifyPhaseCommand(const char* args)
+{
+ if (!*args)
+ return false;
+
+ uint32 phasemask = (uint32)atoi((char*)args);
+
+ Unit *target = getSelectedUnit();
+ if(!target)
+ target = m_session->GetPlayer();
+
+ // check online security
+ else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
+ return false;
+
+ target->SetPhaseMask(phasemask,true);
+
+ return true;
+}
+
//show info of player
bool ChatHandler::HandlePInfoCommand(const char* args)
{
@@ -1783,12 +1802,8 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
if (px)
{
- name = px;
-
+ name = extractPlayerNameFromLink(px);
if(name.empty())
- return false;
-
- if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -1829,6 +1844,10 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
// get additional information from Player object
if(target)
{
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
targetGUID = target->GetGUID();
name = target->GetName(); // re-read for case getSelectedPlayer() target
accId = target->GetSession()->GetAccountId();
@@ -1840,6 +1859,11 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
// get additional information from DB
else
{
+ // check offline security
+ if (HasLowerSecurity(NULL, targetGUID))
+ return false;
+
+ // 0
QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime FROM characters WHERE guid = '%u'", GUID_LOPART(targetGUID));
if (!result)
{
@@ -1890,7 +1914,9 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
delete result;
}
- PSendSysMessage(LANG_PINFO_ACCOUNT, (target?"":GetTrinityString(LANG_OFFLINE)), name.c_str(), GUID_LOPART(targetGUID), username.c_str(), accId, security, last_ip.c_str(), last_login.c_str(), latency);
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_PINFO_ACCOUNT, (target?"":GetMangosString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(targetGUID), username.c_str(), accId, security, last_ip.c_str(), last_login.c_str(), latency);
std::string timeStr = secsToTimeString(total_player_time,true,true);
uint32 gold = money /GOLD;
@@ -1908,18 +1934,14 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
return false;
}
- char* FactionName;
for(FactionStateList::const_iterator itr = target->m_factions.begin(); itr != target->m_factions.end(); ++itr)
{
FactionEntry const *factionEntry = sFactionStore.LookupEntry(itr->second.ID);
- if (factionEntry)
- FactionName = factionEntry->name[m_session->GetSessionDbcLocale()];
- else
- FactionName = "#Not found#";
+ char const* factionName = factionEntry ? factionEntry->name[m_session->GetSessionDbcLocale()] : "#Not found#";
ReputationRank rank = target->GetReputationRank(factionEntry);
std::string rankName = GetTrinityString(ReputationRankStrIndex[rank]);
std::ostringstream ss;
- ss << itr->second.ID << ": |cffffffff|Hfaction:" << itr->second.ID << "|h[" << FactionName << "]|h|r " << rankName << "|h|r (" << target->GetReputation(factionEntry) << ")";
+ ss << itr->second.ID << ": |cffffffff|Hfaction:" << itr->second.ID << "|h[" << factionName << "]|h|r " << rankName << "|h|r (" << target->GetReputation(factionEntry) << ")";
if(itr->second.Flags & FACTION_FLAG_VISIBLE)
ss << GetTrinityString(LANG_FACTION_VISIBLE);
@@ -1940,6 +1962,191 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
return true;
}
+/*//show tickets
+void ChatHandler::ShowTicket(uint64 guid, char const* text, char const* time)
+{
+ std::string name;
+ if(!objmgr.GetPlayerNameByGUID(guid,name))
+ name = GetTrinityString(LANG_UNKNOWN);
+
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_COMMAND_TICKETVIEW, nameLink.c_str(),time,text);
+}
+
+//ticket commands
+bool ChatHandler::HandleTicketCommand(const char* args)
+{
+ char* px = strtok((char*)args, " ");
+
+ // ticket<end>
+ if (!px)
+ {
+ if(!m_session)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ size_t count = ticketmgr.GetTicketCount();
+
+ bool accept = m_session->GetPlayer()->isAcceptTickets();
+
+ PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, accept ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF));
+ return true;
+ }
+
+ // ticket on
+ if(strncmp(px,"on",3) == 0)
+ {
+ if(!m_session)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ m_session->GetPlayer()->SetAcceptTicket(true);
+ SendSysMessage(LANG_COMMAND_TICKETON);
+ return true;
+ }
+
+ // ticket off
+ if(strncmp(px,"off",4) == 0)
+ {
+ if(!m_session)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ m_session->GetPlayer()->SetAcceptTicket(false);
+ SendSysMessage(LANG_COMMAND_TICKETOFF);
+ return true;
+ }
+
+ // ticket #num
+ int num = atoi(px);
+ if(num > 0)
+ {
+ QueryResult *result = CharacterDatabase.PQuery("SELECT guid,ticket_text,ticket_lastchange FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_, num-1);
+
+ if(!result)
+ {
+ PSendSysMessage(LANG_COMMAND_TICKENOTEXIST, num);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ Field* fields = result->Fetch();
+
+ uint32 guid = fields[0].GetUInt32();
+ char const* text = fields[1].GetString();
+ char const* time = fields[2].GetString();
+
+ ShowTicket(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER),text,time);
+ delete result;
+ return true;
+ }
+
+ std::string name = extractPlayerNameFromLink(px);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
+
+ if(!guid)
+ return false;
+
+ // ticket $char_name
+ GMTicket* ticket = ticketmgr.GetGMTicket(GUID_LOPART(guid));
+ if(!ticket)
+ return false;
+
+ std::string time = TimeToTimestampStr(ticket->GetLastUpdate());
+
+ ShowTicket(guid, ticket->GetText(), time.c_str());
+
+ return true;
+}
+
+//dell all tickets
+bool ChatHandler::HandleDelTicketCommand(const char *args)
+{
+ char* px = strtok((char*)args, " ");
+ if (!px)
+ return false;
+
+ // delticket all
+ if(strncmp(px,"all",4) == 0)
+ {
+ ticketmgr.DeleteAll();
+ SendSysMessage(LANG_COMMAND_ALLTICKETDELETED);
+ return true;
+ }
+
+ int num = (uint32)atoi(px);
+
+ // delticket #num
+ if(num > 0)
+ {
+ QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_,num-1);
+ if(!result)
+ {
+ PSendSysMessage(LANG_COMMAND_TICKENOTEXIST, num);
+ SetSentErrorMessage(true);
+ return false;
+ }
+ Field* fields = result->Fetch();
+ uint32 guid = fields[0].GetUInt32();
+ delete result;
+
+ ticketmgr.Delete(guid);
+
+ //notify player
+ if(Player* pl = objmgr.GetPlayer(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)))
+ {
+ pl->GetSession()->SendGMTicketGetTicket(0x0A, 0);
+ PSendSysMessage(LANG_COMMAND_TICKETPLAYERDEL, GetNameLink(pl).c_str());
+ }
+ else
+ PSendSysMessage(LANG_COMMAND_TICKETDEL);
+
+ return true;
+ }
+
+ std::string name = extractPlayerNameFromLink(px);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
+
+ if(!guid)
+ return false;
+
+ // delticket $char_name
+ ticketmgr.Delete(GUID_LOPART(guid));
+
+ // notify players about ticket deleting
+ if(Player* sender = objmgr.GetPlayer(guid))
+ sender->GetSession()->SendGMTicketGetTicket(0x0A,0);
+
+ std::string nameLink = playerLink(name);
+
+ PSendSysMessage(LANG_COMMAND_TICKETPLAYERDEL,nameLink.c_str());
+ return true;
+}*/
+
//set spawn dist of creature
bool ChatHandler::HandleNpcSpawnDistCommand(const char* args)
{
@@ -2134,7 +2341,7 @@ bool ChatHandler::HandleWpLoadPathCommand(const char *args)
target->LoadPath(pathid);
target->SetDefaultMovementType(WAYPOINT_MOTION_TYPE);
target->GetMotionMaster()->Initialize();
- target->Say("Path loaded.",0,0);
+ target->MonsterSay("Path loaded.",0,0);
return true;
}
@@ -2177,7 +2384,7 @@ bool ChatHandler::HandleWpUnLoadPathCommand(const char *args)
target->SetDefaultMovementType(IDLE_MOTION_TYPE);
target->GetMotionMaster()->MoveTargetedHome();
target->GetMotionMaster()->Initialize();
- target->Say("Path unloaded.",0,0);
+ target->MonsterSay("Path unloaded.",0,0);
return true;
}
PSendSysMessage("%s%s|r", "|cffff33ff", "Target have no loaded path.");
@@ -2569,7 +2776,7 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
wpCreature->AddObjectToRemoveList();
// re-create
Creature* wpCreature2 = new Creature;
- if (!wpCreature2->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, VISUAL_WAYPOINT, 0))
+ if (!wpCreature2->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0))
{
PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);
delete wpCreature2;
@@ -2584,7 +2791,7 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
return false;
}
- wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()));
+ wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
wpCreature2->LoadFromDB(wpCreature2->GetDBTableGUIDLow(), map);
map->Add(wpCreature2);
@@ -2618,7 +2825,6 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
}
PSendSysMessage(LANG_WAYPOINT_CHANGED_NO, show_str);
-
return true;
}
@@ -2800,7 +3006,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
float o = chr->GetOrientation();
Creature* wpCreature = new Creature;
- if (!wpCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, id, 0))
+ if (!wpCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0))
{
PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
delete wpCreature;
@@ -2822,7 +3028,8 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
// set "wpguid" column to the visual waypoint
WorldDatabase.PExecuteLog("UPDATE waypoint_data SET wpguid = '%u' WHERE id = '%u' and point = '%u'", wpCreature->GetGUIDLow(), pathid, point);
- wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()));
+ wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+ // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
wpCreature->LoadFromDB(wpCreature->GetDBTableGUIDLow(),map);
map->Add(wpCreature);
@@ -2863,7 +3070,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
Map *map = chr->GetMap();
Creature* pCreature = new Creature;
- if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT),map, id, 0))
+ if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT),map, chr->GetPhaseMaskForSpawn(), id, 0))
{
PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
delete pCreature;
@@ -2881,7 +3088,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
return false;
}
- pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()));
+ pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map);
map->Add(pCreature);
@@ -2928,7 +3135,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
Map *map = chr->GetMap();
Creature* pCreature = new Creature;
- if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, id, 0))
+ if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0))
{
PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);
delete pCreature;
@@ -2946,7 +3153,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
return false;
}
- pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()));
+ pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map);
map->Add(pCreature);
@@ -3028,9 +3235,8 @@ bool ChatHandler::HandleRenameCommand(const char* args)
if(px)
{
- oldname = px;
-
- if(!normalizePlayerName(oldname))
+ oldname = extractPlayerNameFromLink(px);
+ if(oldname.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -3057,19 +3263,83 @@ bool ChatHandler::HandleRenameCommand(const char* args)
if(target)
{
- PSendSysMessage(LANG_RENAME_PLAYER, target->GetName());
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
+ PSendSysMessage(LANG_RENAME_PLAYER, GetNameLink(target).c_str());
target->SetAtLoginFlag(AT_LOGIN_RENAME);
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", target->GetGUIDLow());
}
else
{
- PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldname.c_str(), GUID_LOPART(targetGUID));
+ // check offline security
+ if (HasLowerSecurity(NULL, targetGUID))
+ return false;
+
+ std::string oldNameLink = playerLink(oldname);
+
+ PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(targetGUID));
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", GUID_LOPART(targetGUID));
}
return true;
}
+// customize characters
+bool ChatHandler::HandleCustomizeCommand(const char* args)
+{
+ Player* target = NULL;
+ uint64 targetGUID = 0;
+ std::string oldname;
+
+ char* px = strtok((char*)args, " ");
+
+ if(px)
+ {
+ oldname = extractPlayerNameFromLink(px);
+ if(oldname.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ target = objmgr.GetPlayer(oldname.c_str());
+
+ if (!target)
+ targetGUID = objmgr.GetPlayerGUIDByName(oldname);
+ }
+
+ if(!target && !targetGUID)
+ {
+ target = getSelectedPlayer();
+ }
+
+ if(!target && !targetGUID)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ if(target)
+ {
+ PSendSysMessage(LANG_CUSTOMIZE_PLAYER, GetNameLink(target).c_str());
+ target->SetAtLoginFlag(AT_LOGIN_CUSTOMIZE);
+ CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", target->GetGUIDLow());
+ }
+ else
+ {
+ std::string oldNameLink = playerLink(oldname);
+
+ PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(targetGUID));
+ CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", GUID_LOPART(targetGUID));
+ }
+
+ return true;
+}
+
//spawn go
bool ChatHandler::HandleGameObjectCommand(const char* args)
{
@@ -3108,7 +3378,7 @@ bool ChatHandler::HandleGameObjectCommand(const char* args)
GameObject* pGameObj = new GameObject;
uint32 db_lowGUID = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
- if(!pGameObj->Create(db_lowGUID, goI->id, map, x, y, z, o, 0, 0, rot2, rot3, 0, 1))
+ if(!pGameObj->Create(db_lowGUID, goI->id, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0, 0, rot2, rot3, 0, 1))
{
delete pGameObj;
return false;
@@ -3122,7 +3392,7 @@ bool ChatHandler::HandleGameObjectCommand(const char* args)
}
// fill the gameobject data and save to the db
- pGameObj->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()));
+ pGameObj->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()),chr->GetPhaseMaskForSpawn());
// this will generate a new guid if the object is in an instance
if(!pGameObj->LoadFromDB(db_lowGUID, map))
@@ -3178,6 +3448,10 @@ bool ChatHandler::HandleAddHonorCommand(const char* args)
return false;
}
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
uint32 amount = (uint32)atoi(args);
target->RewardHonor(NULL, 1, amount);
return true;
@@ -3193,6 +3467,10 @@ bool ChatHandler::HandleHonorAddKillCommand(const char* /*args*/)
return false;
}
+ // check online security
+ if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
+ return false;
+
m_session->GetPlayer()->RewardHonor(target, 1);
return true;
}
@@ -3207,6 +3485,10 @@ bool ChatHandler::HandleUpdateHonorFieldsCommand(const char* /*args*/)
return false;
}
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
target->UpdateHonorFields();
return true;
}
@@ -3423,9 +3705,8 @@ bool ChatHandler::HandleCombatStopCommand(const char* args)
if(*args)
{
- std::string playername = args;
-
- if(!normalizePlayerName(playername))
+ std::string playername = extractPlayerNameFromLink((char*)args);
+ if(playername.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -3449,6 +3730,10 @@ bool ChatHandler::HandleCombatStopCommand(const char* args)
player = m_session->GetPlayer();
}
+ // check online security
+ if (HasLowerSecurity(player, 0))
+ return false;
+
player->CombatStop();
player->getHostilRefManager().deleteReferences();
return true;
@@ -3487,7 +3772,7 @@ bool ChatHandler::HandleLearnAllCraftsCommand(const char* /*args*/)
if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer(),false))
continue;
- m_session->GetPlayer()->learnSpell(skillLine->spellId);
+ m_session->GetPlayer()->learnSpell(skillLine->spellId,false);
}
}
}
@@ -3560,7 +3845,7 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args)
continue;
if( !target->HasSpell(spellInfo->Id) )
- m_session->GetPlayer()->learnSpell(skillLine->spellId);
+ m_session->GetPlayer()->learnSpell(skillLine->spellId,false);
}
uint16 maxLevel = target->GetPureMaxSkillValue(skillInfo->id);
@@ -3688,12 +3973,50 @@ bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/)
return false;
}
+ // check online security
+ if (HasLowerSecurity(target, 0))
+ return false;
+
// Repair items
target->DurabilityRepairAll(false, 0, false);
- PSendSysMessage(LANG_YOU_REPAIR_ITEMS, target->GetName());
+ PSendSysMessage(LANG_YOU_REPAIR_ITEMS, GetNameLink(target).c_str());
if(needReportToTarget(target))
- ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, GetName());
+ ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, GetNameLink().c_str());
+ return true;
+}
+
+bool ChatHandler::HandleWaterwalkCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ Player *player = getSelectedPlayer();
+
+ if(!player)
+ {
+ PSendSysMessage(LANG_NO_CHAR_SELECTED);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ // check online security
+ if (HasLowerSecurity(player, 0))
+ return false;
+
+ if (strncmp(args, "on", 3) == 0)
+ player->SetMovement(MOVE_WATER_WALK); // ON
+ else if (strncmp(args, "off", 4) == 0)
+ player->SetMovement(MOVE_LAND_WALK); // OFF
+ else
+ {
+ SendSysMessage(LANG_USE_BOL);
+ return false;
+ }
+
+ PSendSysMessage(LANG_YOU_SET_WATERWALK, args, GetNameLink(player).c_str());
+ if(needReportToTarget(player))
+ ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetNameLink().c_str());
return true;
}
@@ -3753,6 +4076,72 @@ bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/)
return true;
}
+bool ChatHandler::HandleNpcTameCommand(const char* /*args*/)
+{
+ Creature *creatureTarget = getSelectedCreature ();
+ if (!creatureTarget || creatureTarget->isPet ())
+ {
+ PSendSysMessage (LANG_SELECT_CREATURE);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ Player *player = m_session->GetPlayer ();
+
+ if(player->GetPetGUID ())
+ {
+ SendSysMessage (LANG_YOU_ALREADY_HAVE_PET);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo();
+
+ if (!cInfo->isTameable ())
+ {
+ PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ // Everything looks OK, create new pet
+ Pet* pet = player->CreateTamedPetFrom (creatureTarget);
+ if (!pet)
+ {
+ PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ // place pet before player
+ float x,y,z;
+ player->GetClosePoint (x,y,z,creatureTarget->GetObjectSize (),CONTACT_DISTANCE);
+ pet->Relocate (x,y,z,M_PI-player->GetOrientation ());
+
+ // set pet to defensive mode by default (some classes can't control controlled pets in fact).
+ pet->GetCharmInfo()->SetReactState(REACT_DEFENSIVE);
+
+ // calculate proper level
+ uint32 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : creatureTarget->getLevel();
+
+ // prepare visual effect for levelup
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
+
+ // add to world
+ pet->GetMap()->Add((Creature*)pet);
+
+ // visual effect for levelup
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
+
+ // caster have pet now
+ player->SetPet(pet);
+
+ pet->SavePetToDB(PET_SAVE_AS_CURRENT);
+ player->PetSpellInitialize();
+
+ return true;
+}
+
bool ChatHandler::HandleCreatePetCommand(const char* args)
{
Player *player = m_session->GetPlayer();
@@ -3912,7 +4301,7 @@ bool ChatHandler::HandlePetTpCommand(const char *args)
uint32 tp = atol(args);
- pet->SetTP(tp);
+ //pet->SetTP(tp);
PSendSysMessage("Pet's tp changed to %u", tp);
return true;
@@ -4054,3 +4443,101 @@ bool ChatHandler::HandleNpcAddFormationCommand(const char* args)
return true;
}
+//change phasemask of creature or pet
+bool ChatHandler::HandleNpcSetPhaseCommand(const char* args)
+{
+ if (!*args)
+ return false;
+
+ uint32 phasemask = (uint32) atoi((char*)args);
+ if ( phasemask == 0 )
+ {
+ SendSysMessage(LANG_BAD_VALUE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ Creature* pCreature = getSelectedCreature();
+ if(!pCreature)
+ {
+ SendSysMessage(LANG_SELECT_CREATURE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ pCreature->SetPhaseMask(phasemask,true);
+
+ if(!pCreature->isPet())
+ pCreature->SaveToDB();
+
+ return true;
+}
+
+//set pahsemask for selected object
+bool ChatHandler::HandleGOPhaseCommand(const char* args)
+{
+ // number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r
+ char* cId = extractKeyFromLink((char*)args,"Hgameobject");
+ if(!cId)
+ return false;
+
+ uint32 lowguid = atoi(cId);
+ if(!lowguid)
+ return false;
+
+ GameObject* obj = NULL;
+ // by DB guid
+ if (GameObjectData const* go_data = objmgr.GetGOData(lowguid))
+ obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id);
+
+ if(!obj)
+ {
+ PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ char* phaseStr = strtok (NULL, " ");
+ uint32 phasemask = phaseStr? atoi(phaseStr) : 0;
+ if ( phasemask == 0 )
+ {
+ SendSysMessage(LANG_BAD_VALUE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ obj->SetPhaseMask(phasemask,true);
+ obj->SaveToDB();
+ return true;
+}
+
+bool ChatHandler::HandleNpcSetDeathStateCommand(const char* args)
+{
+ if (!*args)
+ return false;
+
+ Creature* pCreature = getSelectedCreature();
+ if(!pCreature || pCreature->isPet())
+ {
+ SendSysMessage(LANG_SELECT_CREATURE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (strncmp(args, "on", 3) == 0)
+ pCreature->SetDeadByDefault(true);
+ else if (strncmp(args, "off", 4) == 0)
+ pCreature->SetDeadByDefault(false);
+ else
+ {
+ SendSysMessage(LANG_USE_BOL);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ pCreature->SaveToDB();
+ pCreature->Respawn();
+
+ return true;
+}
+
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 0dd5c7a176d..b00ef1764d2 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -1,7 +1,7 @@
/*
-* Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
-* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+* Copyright (C) 2008-2009 Trinity <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
@@ -56,12 +56,12 @@
bool ChatHandler::HandleAHBotOptionsCommand(const char* args)
{
- uint32 ahMapID = 0;
+ AuctionLocation ahMapID = AUCTION_NEUTRAL;
char * opt = strtok((char*)args, " ");
char * ahMapIdStr = strtok(NULL, " ");
if (ahMapIdStr)
{
- ahMapID = (uint32) strtoul(ahMapIdStr, NULL, 0);
+ ahMapID = (AuctionLocation) strtoul(ahMapIdStr, NULL, 0);
}
if (!opt)
{
@@ -427,17 +427,8 @@ bool ChatHandler::HandleAHBotOptionsCommand(const char* args)
}
//reload commands
-bool ChatHandler::HandleReloadCommand(const char* arg)
-{
- // this is error catcher for wrong table name in .reload commands
- PSendSysMessage("Db table with name starting from '%s' not found and can't be reloaded.",arg);
- SetSentErrorMessage(true);
- return false;
-}
-
bool ChatHandler::HandleReloadAllCommand(const char*)
{
- HandleReloadAreaTriggerTeleportCommand("");
HandleReloadSkillFishingBaseLevelCommand("");
HandleReloadAllAreaCommand("");
@@ -478,6 +469,7 @@ bool ChatHandler::HandleReloadAllNpcCommand(const char* /*args*/)
HandleReloadNpcOptionCommand("a");
HandleReloadNpcTrainerCommand("a");
HandleReloadNpcVendorCommand("a");
+ HandleReloadPointsOfInterestCommand("a");
return true;
}
@@ -522,6 +514,7 @@ bool ChatHandler::HandleReloadAllSpellCommand(const char*)
HandleReloadSpellElixirCommand("a");
HandleReloadSpellLearnSpellCommand("a");
HandleReloadSpellProcEventCommand("a");
+ HandleReloadSpellBonusesCommand("a");
HandleReloadSpellScriptTargetCommand("a");
HandleReloadSpellTargetPositionCommand("a");
HandleReloadSpellThreatsCommand("a");
@@ -544,6 +537,7 @@ bool ChatHandler::HandleReloadAllLocalesCommand(const char* /*args*/)
HandleReloadLocalesItemCommand("a");
HandleReloadLocalesNpcTextCommand("a");
HandleReloadLocalesPageTextCommand("a");
+ HandleReloadLocalesPointsOfInterestCommand("a");
HandleReloadLocalesQuestCommand("a");
return true;
}
@@ -624,6 +618,11 @@ bool ChatHandler::HandleReloadQuestTemplateCommand(const char*)
sLog.outString( "Re-Loading Quest Templates..." );
objmgr.LoadQuests();
SendGlobalGMSysMessage("DB table `quest_template` (quest definitions) reloaded.");
+
+ /// dependent also from `gameobject` but this table not reloaded anyway
+ sLog.outString( "Re-Loading GameObjects for quests..." );
+ objmgr.LoadGameObjectForQuests();
+ SendGlobalGMSysMessage("Data GameObjects for quests reloaded.");
return true;
}
@@ -672,6 +671,15 @@ bool ChatHandler::HandleReloadLootTemplatesItemCommand(const char*)
return true;
}
+bool ChatHandler::HandleReloadLootTemplatesMillingCommand(const char*)
+{
+ sLog.outString( "Re-Loading Loot Tables... (`milling_loot_template`)" );
+ LoadLootTemplates_Milling();
+ LootTemplates_Milling.CheckLootRefs();
+ SendGlobalSysMessage("DB table `milling_loot_template` reloaded.");
+ return true;
+}
+
bool ChatHandler::HandleReloadLootTemplatesPickpocketingCommand(const char*)
{
sLog.outString( "Re-Loading Loot Tables... (`pickpocketing_loot_template`)" );
@@ -716,6 +724,15 @@ bool ChatHandler::HandleReloadLootTemplatesSkinningCommand(const char*)
return true;
}
+bool ChatHandler::HandleReloadLootTemplatesSpellCommand(const char*)
+{
+ sLog.outString( "Re-Loading Loot Tables... (`spell_loot_template`)" );
+ LoadLootTemplates_Spell();
+ LootTemplates_Spell.CheckLootRefs();
+ SendGlobalSysMessage("DB table `spell_loot_template` reloaded.");
+ return true;
+}
+
bool ChatHandler::HandleReloadTrinityStringCommand(const char*)
{
sLog.outString( "Re-Loading trinity_string Table!" );
@@ -756,6 +773,14 @@ bool ChatHandler::HandleReloadNpcVendorCommand(const char*)
return true;
}
+bool ChatHandler::HandleReloadPointsOfInterestCommand(const char*)
+{
+ sLog.outString( "Re-Loading `points_of_interest` Table!" );
+ objmgr.LoadPointsOfInterest();
+ SendGlobalSysMessage("DB table `points_of_interest` reloaded.");
+ return true;
+}
+
bool ChatHandler::HandleReloadReservedNameCommand(const char*)
{
sLog.outString( "Loading ReservedNames... (`reserved_name`)" );
@@ -828,6 +853,14 @@ bool ChatHandler::HandleReloadSpellProcEventCommand(const char*)
return true;
}
+bool ChatHandler::HandleReloadSpellBonusesCommand(const char*)
+{
+ sLog.outString( "Re-Loading Spell Bonus Data..." );
+ spellmgr.LoadSpellBonusess();
+ SendGlobalSysMessage("DB table `spell_bonus_data` (spell damage/healing coefficients) reloaded.");
+ return true;
+}
+
bool ChatHandler::HandleReloadSpellScriptTargetCommand(const char*)
{
sLog.outString( "Re-Loading SpellsScriptTarget..." );
@@ -1077,6 +1110,14 @@ bool ChatHandler::HandleReloadLocalesPageTextCommand(const char* /*arg*/)
return true;
}
+bool ChatHandler::HandleReloadLocalesPointsOfInterestCommand(const char* /*arg*/)
+{
+ sLog.outString( "Re-Loading Locales Points Of Interest ... ");
+ objmgr.LoadPointOfInterestLocales();
+ SendGlobalSysMessage("DB table `locales_points_of_interest` reloaded.");
+ return true;
+}
+
bool ChatHandler::HandleReloadLocalesQuestCommand(const char* /*arg*/)
{
sLog.outString( "Re-Loading Locales Quest ... ");
@@ -1213,19 +1254,10 @@ bool ChatHandler::HandleAccountSetPasswordCommand(const char* args)
return false;
}
- uint32 targetSecurity = accmgr.GetSecurity(targetAccountId);
-
- /// m_session==NULL only for console
- uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE;
-
/// can set password only for target with less security
/// This is also reject self apply in fact
- if (targetSecurity >= plSecurity)
- {
- SendSysMessage (LANG_YOURS_SECURITY_IS_LOW);
- SetSentErrorMessage (true);
+ if(HasLowerSecurityAccount (NULL,targetAccountId,true))
return false;
- }
if (strcmp(szPassword1,szPassword2))
{
@@ -1303,7 +1335,6 @@ bool ChatHandler::HandleSetSkillCommand(const char* args)
char *max_p = strtok (NULL, " ");
int32 skill = atoi(skill_p);
-
if (skill <= 0)
{
PSendSysMessage(LANG_INVALID_SKILL_ID, skill);
@@ -1329,9 +1360,11 @@ bool ChatHandler::HandleSetSkillCommand(const char* args)
return false;
}
+ std::string tNameLink = GetNameLink(target);
+
if(!target->GetSkillValue(skill))
{
- PSendSysMessage(LANG_SET_SKILL_ERROR, target->GetName(), skill, sl->name[0]);
+ PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, sl->name[0]);
SetSentErrorMessage(true);
return false;
}
@@ -1342,7 +1375,7 @@ bool ChatHandler::HandleSetSkillCommand(const char* args)
return false;
target->SetSkill(skill, level, max);
- PSendSysMessage(LANG_SET_SKILL, skill, sl->name[0], target->GetName(), level, max);
+ PSendSysMessage(LANG_SET_SKILL, skill, sl->name[0], tNameLink.c_str(), level, max);
return true;
}
@@ -1353,27 +1386,12 @@ bool ChatHandler::HandleUnLearnCommand(const char* args)
return false;
// number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
- uint32 min_id = extractSpellIdFromLink((char*)args);
- if(!min_id)
+ uint32 spell_id = extractSpellIdFromLink((char*)args);
+ if(!spell_id)
return false;
- // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
- char* tail = strtok(NULL,"");
-
- uint32 max_id = extractSpellIdFromLink(tail);
-
- if (!max_id)
- {
- // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
- max_id = min_id+1;
- }
- else
- {
- if (max_id < min_id)
- std::swap(min_id,max_id);
-
- max_id=max_id+1;
- }
+ char const* allStr = strtok(NULL," ");
+ bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false;
Player* target = getSelectedPlayer();
if(!target)
@@ -1383,13 +1401,13 @@ bool ChatHandler::HandleUnLearnCommand(const char* args)
return false;
}
- for(uint32 spell=min_id;spell<max_id;spell++)
- {
- if (target->HasSpell(spell))
- target->removeSpell(spell);
- else
- SendSysMessage(LANG_FORGET_SPELL);
- }
+ if(allRanks)
+ spell_id = spellmgr.GetFirstSpellInChain (spell_id);
+
+ if (target->HasSpell(spell_id))
+ target->removeSpell(spell_id,false,!allRanks);
+ else
+ SendSysMessage(LANG_FORGET_SPELL);
return true;
}
@@ -1404,10 +1422,12 @@ bool ChatHandler::HandleCooldownCommand(const char* args)
return false;
}
+ std::string tNameLink = GetNameLink(target);
+
if (!*args)
{
target->RemoveAllSpellCooldown();
- PSendSysMessage(LANG_REMOVEALL_COOLDOWN, target->GetName());
+ PSendSysMessage(LANG_REMOVEALL_COOLDOWN, tNameLink.c_str());
}
else
{
@@ -1418,7 +1438,7 @@ bool ChatHandler::HandleCooldownCommand(const char* args)
if(!sSpellStore.LookupEntry(spell_id))
{
- PSendSysMessage(LANG_UNKNOWN_SPELL, target==m_session->GetPlayer() ? GetTrinityString(LANG_YOU) : target->GetName());
+ PSendSysMessage(LANG_UNKNOWN_SPELL, target==m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str());
SetSentErrorMessage(true);
return false;
}
@@ -1428,8 +1448,8 @@ bool ChatHandler::HandleCooldownCommand(const char* args)
data << uint64(target->GetGUID());
target->GetSession()->SendPacket(&data);
target->RemoveSpellCooldown(spell_id);
- PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target==m_session->GetPlayer() ? GetTrinityString(LANG_YOU) : target->GetName());
- }
+ PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target==m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str());
+ }
return true;
}
@@ -2054,7 +2074,7 @@ bool ChatHandler::HandleLearnAllCommand(const char* /*args*/)
continue;
}
- m_session->GetPlayer()->learnSpell(spell);
+ m_session->GetPlayer()->learnSpell(spell,false);
}
SendSysMessage(LANG_COMMAND_LEARN_MANY_SPELLS);
@@ -2094,7 +2114,7 @@ bool ChatHandler::HandleLearnAllGMCommand(const char* /*args*/)
continue;
}
- m_session->GetPlayer()->learnSpell(spell);
+ m_session->GetPlayer()->learnSpell(spell,false);
}
SendSysMessage(LANG_LEARNING_GM_SKILLS);
@@ -2121,6 +2141,10 @@ bool ChatHandler::HandleLearnAllMySpellsCommand(const char* /*args*/)
if(!spellInfo)
continue;
+ // skip server-side/triggered spells
+ if(spellInfo->spellLevel==0)
+ continue;
+
// skip wrong class/race skills
if(!m_session->GetPlayer()->IsSpellFitByClassAndRace(spellInfo->Id))
continue;
@@ -2129,8 +2153,6 @@ bool ChatHandler::HandleLearnAllMySpellsCommand(const char* /*args*/)
if( spellInfo->SpellFamilyName != family)
continue;
- //TODO: skip triggered spells
-
// skip spells with first rank learned as talent (and all talents then also)
uint32 first_rank = spellmgr.GetFirstSpellInChain(spellInfo->Id);
if(GetTalentSpellCost(first_rank) > 0 )
@@ -2140,27 +2162,13 @@ bool ChatHandler::HandleLearnAllMySpellsCommand(const char* /*args*/)
if(!SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer(),false))
continue;
- m_session->GetPlayer()->learnSpell(i);
+ m_session->GetPlayer()->learnSpell(i,false);
}
SendSysMessage(LANG_COMMAND_LEARN_CLASS_SPELLS);
return true;
}
-static void learnAllHighRanks(Player* player, uint32 spellid)
-{
- SpellChainNode const* node;
- do
- {
- node = spellmgr.GetSpellChainNode(spellid);
- player->learnSpell(spellid);
- if (!node)
- break;
- spellid=node->next;
- }
- while (node->next);
-}
-
bool ChatHandler::HandleLearnAllMyTalentsCommand(const char* /*args*/)
{
Player* player = m_session->GetPlayer();
@@ -2198,11 +2206,8 @@ bool ChatHandler::HandleLearnAllMyTalentsCommand(const char* /*args*/)
if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer(),false))
continue;
- // learn highest rank of talent
- player->learnSpell(spellid);
-
- // and learn all non-talent spell ranks (recursive by tree)
- learnAllHighRanks(player,spellid);
+ // learn highest rank of talent and learn all non-talent spell ranks (recursive by tree)
+ player->learnSpellHighRank(spellid);
}
SendSysMessage(LANG_COMMAND_LEARN_CLASS_TALENTS);
@@ -2213,7 +2218,7 @@ bool ChatHandler::HandleLearnAllLangCommand(const char* /*args*/)
{
// skipping UNIVERSAL language (0)
for(int i = 1; i < LANGUAGES_COUNT; ++i)
- m_session->GetPlayer()->learnSpell(lang_description[i].spell_id);
+ m_session->GetPlayer()->learnSpell(lang_description[i].spell_id,false);
SendSysMessage(LANG_COMMAND_LEARN_ALL_LANG);
return true;
@@ -2221,13 +2226,11 @@ bool ChatHandler::HandleLearnAllLangCommand(const char* /*args*/)
bool ChatHandler::HandleLearnAllDefaultCommand(const char* args)
{
- char* pName = strtok((char*)args, "");
Player *player = NULL;
- if (pName)
+ if (*args)
{
- std::string name = pName;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -2249,7 +2252,7 @@ bool ChatHandler::HandleLearnAllDefaultCommand(const char* args)
player->learnDefaultSpells();
player->learnQuestRewardedSpells();
- PSendSysMessage(LANG_COMMAND_LEARN_ALL_DEFAULT_AND_QUEST,player->GetName());
+ PSendSysMessage(LANG_COMMAND_LEARN_ALL_DEFAULT_AND_QUEST,GetNameLink(player).c_str());
return true;
}
@@ -2269,25 +2272,31 @@ bool ChatHandler::HandleLearnCommand(const char* args)
if(!spell || !sSpellStore.LookupEntry(spell))
return false;
- if (targetPlayer->HasSpell(spell))
+ char const* allStr = strtok(NULL," ");
+ bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false;
+
+ SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell);
+ if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer()))
{
- if(targetPlayer == m_session->GetPlayer())
- SendSysMessage(LANG_YOU_KNOWN_SPELL);
- else
- PSendSysMessage(LANG_TARGET_KNOWN_SPELL,targetPlayer->GetName());
+ PSendSysMessage(LANG_COMMAND_SPELL_BROKEN,spell);
SetSentErrorMessage(true);
return false;
}
- SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell);
- if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer()))
+ if (!allRanks && targetPlayer->HasSpell(spell))
{
- PSendSysMessage(LANG_COMMAND_SPELL_BROKEN,spell);
+ if(targetPlayer == m_session->GetPlayer())
+ SendSysMessage(LANG_YOU_KNOWN_SPELL);
+ else
+ PSendSysMessage(LANG_TARGET_KNOWN_SPELL,GetNameLink(targetPlayer).c_str());
SetSentErrorMessage(true);
return false;
}
- targetPlayer->learnSpell(spell);
+ if(allRanks)
+ targetPlayer->learnSpellHighRank(spell);
+ else
+ targetPlayer->learnSpell(spell,false);
return true;
}
@@ -2357,7 +2366,7 @@ bool ChatHandler::HandleAddItemCommand(const char* args)
if (count < 0)
{
plTarget->DestroyItemCount(itemId, -count, true, false);
- PSendSysMessage(LANG_REMOVEITEM, itemId, -count, plTarget->GetName());
+ PSendSysMessage(LANG_REMOVEITEM, itemId, -count, GetNameLink(plTarget).c_str());
return true;
}
@@ -3097,15 +3106,25 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args)
if(loc < MAX_LOCALE)
{
+ char valStr[50] = "";
char const* knownStr = "";
if(target && target->HasSkill(id))
+ {
knownStr = GetTrinityString(LANG_KNOWN);
+ uint32 curValue = target->GetPureSkillValue(id);
+ uint32 maxValue = target->GetPureMaxSkillValue(id);
+ uint32 permValue = target->GetSkillPermBonusValue(id);
+ uint32 tempValue = target->GetSkillTempBonusValue(id);
+
+ char const* valFormat = GetTrinityString(LANG_SKILL_VALUES);
+ snprintf(valStr,50,valFormat,curValue,maxValue,permValue,tempValue);
+ }
// send skill in "id - [namedlink locale]" format
if (m_session)
- PSendSysMessage(LANG_SKILL_LIST_CHAT,id,id,name.c_str(),localeNames[loc],knownStr);
+ PSendSysMessage(LANG_SKILL_LIST_CHAT,id,id,name.c_str(),localeNames[loc],knownStr,valStr);
else
- PSendSysMessage(LANG_SKILL_LIST_CONSOLE,id,name.c_str(),localeNames[loc],knownStr);
+ PSendSysMessage(LANG_SKILL_LIST_CONSOLE,id,name.c_str(),localeNames[loc],knownStr,valStr);
++counter;
}
@@ -3172,7 +3191,7 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args)
bool talent = (talentCost > 0);
bool passive = IsPassiveSpell(id);
- bool active = target && (target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2));
+ bool active = target && target->HasAura(id);
// unit32 used to prevent interpreting uint8 as char at output
// find rank of learned spell for learning spell, or talent rank
@@ -3519,11 +3538,11 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args)
if (!targetGuild)
return false;
- std::string plName = par1;
- if (!normalizePlayerName (plName))
+ std::string plName = extractPlayerNameFromLink(par1);
+ if(plName.empty())
{
- SendSysMessage (LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage (true);
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
}
@@ -3531,10 +3550,10 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args)
if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
plGuid = targetPlayer->GetGUID ();
else
- plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+ plGuid = objmgr.GetPlayerGUIDByName (plName);
if (!plGuid)
- false;
+ return false;
// player's guild membership checked in AddMember before add
if (!targetGuild->AddMember (plGuid,targetGuild->GetLowestRank ()))
@@ -3552,11 +3571,11 @@ bool ChatHandler::HandleGuildUninviteCommand(const char *args)
if(!par1)
return false;
- std::string plName = par1;
- if (!normalizePlayerName (plName))
+ std::string plName = extractPlayerNameFromLink(par1);
+ if(plName.empty())
{
- SendSysMessage (LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage (true);
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
}
@@ -3569,7 +3588,7 @@ bool ChatHandler::HandleGuildUninviteCommand(const char *args)
}
else
{
- plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+ plGuid = objmgr.GetPlayerGUIDByName (plName);
glId = Player::GetGuildIdFromDB (plGuid);
}
@@ -3594,14 +3613,16 @@ bool ChatHandler::HandleGuildRankCommand(const char *args)
char* par2 = strtok (NULL, " ");
if (!par1 || !par2)
return false;
- std::string plName = par1;
- if (!normalizePlayerName (plName))
+
+ std::string plName = extractPlayerNameFromLink(par1);
+ if(plName.empty())
{
- SendSysMessage (LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage (true);
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
}
+
uint64 plGuid = 0;
uint32 glId = 0;
if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
@@ -3611,7 +3632,7 @@ bool ChatHandler::HandleGuildRankCommand(const char *args)
}
else
{
- plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+ plGuid = objmgr.GetPlayerGUIDByName (plName);
glId = Player::GetGuildIdFromDB (plGuid);
}
@@ -3651,18 +3672,36 @@ bool ChatHandler::HandleGuildDeleteCommand(const char* args)
return true;
}
-bool ChatHandler::HandleGetDistanceCommand(const char* /*args*/)
+bool ChatHandler::HandleGetDistanceCommand(const char* args)
{
- Unit* pUnit = getSelectedUnit();
+ WorldObject* obj;
- if(!pUnit)
+ if (*args)
{
- SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
- SetSentErrorMessage(true);
- return false;
+ uint64 guid = extractGuidFromLink((char*)args);
+ if(guid)
+ obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(),guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
+
+ if(!obj)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
}
+ else
+ {
+ obj = getSelectedUnit();
- PSendSysMessage(LANG_DISTANCE, m_session->GetPlayer()->GetDistance(pUnit),m_session->GetPlayer()->GetDistance2d(pUnit));
+ if(!obj)
+ {
+ SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ PSendSysMessage(LANG_DISTANCE, m_session->GetPlayer()->GetDistance(obj),m_session->GetPlayer()->GetDistance2d(obj));
return true;
}
@@ -3749,6 +3788,12 @@ bool ChatHandler::HandleDieCommand(const char* /*args*/)
return false;
}
+ if(target->GetTypeId()==TYPEID_PLAYER)
+ {
+ if(HasLowerSecurity((Player*)target,0,false))
+ return false;
+ }
+
if( target->isAlive() )
{
//m_session->GetPlayer()->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
@@ -3800,7 +3845,7 @@ bool ChatHandler::HandleDamageCommand(const char * args)
SpellSchoolMask schoolmask = SpellSchoolMask(1 << school);
if ( schoolmask & SPELL_SCHOOL_MASK_NORMAL )
- damage = m_session->GetPlayer()->CalcArmorReducedDamage(target, damage);
+ damage = m_session->GetPlayer()->CalcArmorReducedDamage(target, damage, NULL, BASE_ATTACK);
char* spellStr = strtok((char*)NULL, " ");
@@ -3850,7 +3895,7 @@ bool ChatHandler::HandleModifyArenaCommand(const char * args)
target->ModifyArenaPoints(amount);
- PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, target->GetName(), target->GetArenaPoints());
+ PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, GetNameLink(target).c_str(), target->GetArenaPoints());
return true;
}
@@ -3861,8 +3906,8 @@ bool ChatHandler::HandleReviveCommand(const char* args)
if (*args)
{
- std::string name = args;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -3889,10 +3934,6 @@ bool ChatHandler::HandleReviveCommand(const char* args)
bool ChatHandler::HandleAuraCommand(const char* args)
{
- char* px = strtok((char*)args, " ");
- if (!px)
- return false;
-
Unit *target = getSelectedUnit();
if(!target)
{
@@ -3901,7 +3942,9 @@ bool ChatHandler::HandleAuraCommand(const char* args)
return false;
}
- uint32 spellID = (uint32)atoi(px);
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spellID = extractSpellIdFromLink((char*)args);
+
SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellID );
if(spellInfo)
{
@@ -3925,10 +3968,6 @@ bool ChatHandler::HandleAuraCommand(const char* args)
bool ChatHandler::HandleUnAuraCommand(const char* args)
{
- char* px = strtok((char*)args, " ");
- if (!px)
- return false;
-
Unit *target = getSelectedUnit();
if(!target)
{
@@ -3944,7 +3983,11 @@ bool ChatHandler::HandleUnAuraCommand(const char* args)
return true;
}
- uint32 spellID = (uint32)atoi(px);
+ // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
+ uint32 spellID = extractSpellIdFromLink((char*)args);
+ if(!spellID)
+ return false;
+
target->RemoveAurasDueToSpell(spellID);
return true;
@@ -4148,15 +4191,15 @@ bool ChatHandler::HandleExploreCheatCommand(const char* args)
if (flag != 0)
{
- PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, chr->GetName());
+ PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL,GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL,GetNameLink().c_str());
}
else
{
- PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, chr->GetName());
+ PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, GetNameLink(chr).c_str());
if (needReportToTarget(chr))
- ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING,GetName());
+ ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING,GetNameLink().c_str());
}
for (uint8 i=0; i<128; i++)
@@ -4193,36 +4236,6 @@ bool ChatHandler::HandleHoverCommand(const char* args)
return true;
}
-bool ChatHandler::HandleWaterwalkCommand(const char* args)
-{
- if(!args)
- return false;
-
- Player *player = getSelectedPlayer();
- if(!player)
- {
- PSendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
-
- if (strncmp(args, "on", 3) == 0)
- player->SetMovement(MOVE_WATER_WALK); // ON
- else if (strncmp(args, "off", 4) == 0)
- player->SetMovement(MOVE_LAND_WALK); // OFF
- else
- {
- SendSysMessage(LANG_USE_BOL);
- return false;
- }
-
- PSendSysMessage(LANG_YOU_SET_WATERWALK, args, player->GetName());
- if(needReportToTarget(player))
- ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetName());
- return true;
-
-}
-
bool ChatHandler::HandleLevelUpCommand(const char* args)
{
char* px = strtok((char*)args, " ");
@@ -4254,8 +4267,8 @@ bool ChatHandler::HandleLevelUpCommand(const char* args)
if(pname) // player by name
{
- name = pname;
- if(!normalizePlayerName(name))
+ name = extractPlayerNameFromLink(pname);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -4285,7 +4298,7 @@ bool ChatHandler::HandleLevelUpCommand(const char* args)
return false;
}
- name = chr->GetName();
+ name = GetNameLink(chr);
}
assert(chr || chr_guid);
@@ -4323,7 +4336,10 @@ bool ChatHandler::HandleLevelUpCommand(const char* args)
}
if(m_session->GetPlayer() != chr) // including chr==NULL
- PSendSysMessage(LANG_YOU_CHANGE_LVL,name.c_str(),newlevel);
+ {
+ std::string nameLink = playerLink(name);
+ PSendSysMessage(LANG_YOU_CHANGE_LVL,nameLink.c_str(),newlevel);
+ }
return true;
}
@@ -4332,8 +4348,6 @@ bool ChatHandler::HandleShowAreaCommand(const char* args)
if (!*args)
return false;
- int area = atoi((char*)args);
-
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
@@ -4342,10 +4356,11 @@ bool ChatHandler::HandleShowAreaCommand(const char* args)
return false;
}
+ int area = GetAreaFlagByAreaID(atoi((char*)args));
int offset = area / 32;
uint32 val = (uint32)(1 << (area % 32));
- if(offset >= 128)
+ if(area<0 || offset >= 128)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
@@ -4364,8 +4379,6 @@ bool ChatHandler::HandleHideAreaCommand(const char* args)
if (!*args)
return false;
- int area = atoi((char*)args);
-
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
@@ -4374,10 +4387,11 @@ bool ChatHandler::HandleHideAreaCommand(const char* args)
return false;
}
+ int area = GetAreaFlagByAreaID(atoi((char*)args));
int offset = area / 32;
uint32 val = (uint32)(1 << (area % 32));
- if(offset >= 128)
+ if(area<0 || offset >= 128)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
@@ -4723,11 +4737,28 @@ bool ChatHandler::HandleListAurasCommand (const char * /*args*/)
for (Unit::AuraMap::const_iterator itr = uAuras.begin(); itr != uAuras.end(); ++itr)
{
bool talent = GetTalentSpellCost(itr->second->GetId()) > 0;
- PSendSysMessage(LANG_COMMAND_TARGET_AURADETAIL, itr->second->GetId(), itr->second->GetEffIndex(),
- itr->second->GetModifier()->m_auraname, itr->second->GetAuraDuration(), itr->second->GetAuraMaxDuration(),
- itr->second->GetSpellProto()->SpellName[m_session->GetSessionDbcLocale()],
- (itr->second->IsPassive() ? passiveStr : ""),(talent ? talentStr : ""),
- IS_PLAYER_GUID(itr->second->GetCasterGUID()) ? "player" : "creature",GUID_LOPART(itr->second->GetCasterGUID()));
+
+ char const* name = itr->second->GetSpellProto()->SpellName[m_session->GetSessionDbcLocale()];
+
+ if (m_session)
+ {
+ std::ostringstream ss_name;
+ ss_name << "|cffffffff|Hspell:" << itr->second->GetId() << "|h[" << name << "]|h|r";
+
+ PSendSysMessage(LANG_COMMAND_TARGET_AURADETAIL, itr->second->GetId(), itr->second->GetEffIndex(),
+ itr->second->GetModifier()->m_auraname, itr->second->GetAuraDuration(), itr->second->GetAuraMaxDuration(),
+ ss_name.str().c_str(),
+ (itr->second->IsPassive() ? passiveStr : ""),(talent ? talentStr : ""),
+ IS_PLAYER_GUID(itr->second->GetCasterGUID()) ? "player" : "creature",GUID_LOPART(itr->second->GetCasterGUID()));
+ }
+ else
+ {
+ PSendSysMessage(LANG_COMMAND_TARGET_AURADETAIL, itr->second->GetId(), itr->second->GetEffIndex(),
+ itr->second->GetModifier()->m_auraname, itr->second->GetAuraDuration(), itr->second->GetAuraMaxDuration(),
+ name,
+ (itr->second->IsPassive() ? passiveStr : ""),(talent ? talentStr : ""),
+ IS_PLAYER_GUID(itr->second->GetCasterGUID()) ? "player" : "creature",GUID_LOPART(itr->second->GetCasterGUID()));
+ }
}
for (int i = 0; i < TOTAL_AURAS; i++)
{
@@ -4737,29 +4768,83 @@ bool ChatHandler::HandleListAurasCommand (const char * /*args*/)
for (Unit::AuraList::const_iterator itr = uAuraList.begin(); itr != uAuraList.end(); ++itr)
{
bool talent = GetTalentSpellCost((*itr)->GetId()) > 0;
- PSendSysMessage(LANG_COMMAND_TARGET_AURASIMPLE, (*itr)->GetId(), (*itr)->GetEffIndex(),
- (*itr)->GetSpellProto()->SpellName[m_session->GetSessionDbcLocale()],((*itr)->IsPassive() ? passiveStr : ""),(talent ? talentStr : ""),
- IS_PLAYER_GUID((*itr)->GetCasterGUID()) ? "player" : "creature",GUID_LOPART((*itr)->GetCasterGUID()));
+
+ char const* name = (*itr)->GetSpellProto()->SpellName[m_session->GetSessionDbcLocale()];
+
+ if (m_session)
+ {
+ std::ostringstream ss_name;
+ ss_name << "|cffffffff|Hspell:" << (*itr)->GetId() << "|h[" << name << "]|h|r";
+
+ PSendSysMessage(LANG_COMMAND_TARGET_AURASIMPLE, (*itr)->GetId(), (*itr)->GetEffIndex(),
+ ss_name.str().c_str(),((*itr)->IsPassive() ? passiveStr : ""),(talent ? talentStr : ""),
+ IS_PLAYER_GUID((*itr)->GetCasterGUID()) ? "player" : "creature",GUID_LOPART((*itr)->GetCasterGUID()));
+ }
+ else
+ {
+ PSendSysMessage(LANG_COMMAND_TARGET_AURASIMPLE, (*itr)->GetId(), (*itr)->GetEffIndex(),
+ name,((*itr)->IsPassive() ? passiveStr : ""),(talent ? talentStr : ""),
+ IS_PLAYER_GUID((*itr)->GetCasterGUID()) ? "player" : "creature",GUID_LOPART((*itr)->GetCasterGUID()));
+ }
}
}
return true;
}
+bool ChatHandler::HandleResetAchievementsCommand (const char * args)
+{
+ char* pName = strtok((char*)args, "");
+ Player *player = NULL;
+ uint64 guid = 0;
+ if (pName)
+ {
+ std::string name = extractPlayerNameFromLink(pName);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ guid = objmgr.GetPlayerGUIDByName(name);
+ player = objmgr.GetPlayer(guid);
+ }
+ else
+ {
+ player = getSelectedPlayer();
+ if(player)
+ guid = player->GetGUID();
+ }
+
+ if(!player && !guid)
+ {
+ SendSysMessage(LANG_NO_CHAR_SELECTED);
+ return true;
+ }
+
+ if(player)
+ player->GetAchievementMgr().Reset();
+ else if(guid)
+ AchievementMgr::DeleteFromDB(GUID_LOPART(guid));
+
+ return true;
+}
+
bool ChatHandler::HandleResetHonorCommand (const char * args)
{
char* pName = strtok((char*)args, "");
Player *player = NULL;
if (pName)
{
- std::string name = pName;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink(pName);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
- uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str());
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
player = objmgr.GetPlayer(guid);
}
else
@@ -4794,19 +4879,6 @@ static bool HandleResetStatsOrLevelHelper(Player* player)
uint8 powertype = cEntry->powerType;
- uint32 unitfield;
- if(powertype == POWER_RAGE)
- unitfield = 0x1100EE00;
- else if(powertype == POWER_ENERGY)
- unitfield = 0x00000000;
- else if(powertype == POWER_MANA)
- unitfield = 0x0000EE00;
- else
- {
- sLog.outError("Invalid default powertype %u for player (class %u)",powertype,player->getClass());
- return false;
- }
-
// reset m_form if no aura
if(!player->HasAuraType(SPELL_AURA_MOD_SHAPESHIFT))
player->m_form = FORM_NONE;
@@ -4836,9 +4908,7 @@ static bool HandleResetStatsOrLevelHelper(Player* player)
}
}
- // set UNIT_FIELD_BYTES_1 to init state but preserve m_form value
- player->SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
- player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_UNK5 );
+ player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP );
player->SetByteValue(UNIT_FIELD_BYTES_2, 3, player->m_form);
player->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
@@ -4856,15 +4926,15 @@ bool ChatHandler::HandleResetLevelCommand(const char * args)
Player *player = NULL;
if (pName)
{
- std::string name = pName;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink(pName);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
- uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str());
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
player = objmgr.GetPlayer(guid);
}
else
@@ -4880,17 +4950,26 @@ bool ChatHandler::HandleResetLevelCommand(const char * args)
if(!HandleResetStatsOrLevelHelper(player))
return false;
- player->SetLevel(1);
+ // set starting level
+ uint32 start_level = player->getClass() != CLASS_DEATH_KNIGHT
+ ? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)
+ : sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
+
+ player->SetLevel(start_level);
+ player->InitRunes();
player->InitStatsForLevel(true);
player->InitTaxiNodesForLevel();
+ player->InitGlyphsForLevel();
player->InitTalentForLevel();
player->SetUInt32Value(PLAYER_XP,0);
// reset level to summoned pet
Pet* pet = player->GetPet();
if(pet && pet->getPetType()==SUMMON_PET)
+ {
pet->InitStatsForLevel(1);
-
+ pet->InitTalentForLevel();
+ }
return true;
}
@@ -4900,15 +4979,15 @@ bool ChatHandler::HandleResetStatsCommand(const char * args)
Player *player = NULL;
if (pName)
{
- std::string name = pName;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink(pName);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
- uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str());
+ uint64 guid = objmgr.GetPlayerGUIDByName(name);
player = objmgr.GetPlayer(guid);
}
else
@@ -4924,8 +5003,10 @@ bool ChatHandler::HandleResetStatsCommand(const char * args)
if(!HandleResetStatsOrLevelHelper(player))
return false;
+ player->InitRunes();
player->InitStatsForLevel(true);
player->InitTaxiNodesForLevel();
+ player->InitGlyphsForLevel();
player->InitTalentForLevel();
return true;
@@ -4938,9 +5019,8 @@ bool ChatHandler::HandleResetSpellsCommand(const char * args)
uint64 playerGUID = 0;
if (pName)
{
- std::string name = pName;
-
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink(pName);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -4949,7 +5029,7 @@ bool ChatHandler::HandleResetSpellsCommand(const char * args)
player = objmgr.GetPlayer(name.c_str());
if(!player)
- playerGUID = objmgr.GetPlayerGUIDByName(name.c_str());
+ playerGUID = objmgr.GetPlayerGUIDByName(name);
}
else
player = getSelectedPlayer();
@@ -4966,9 +5046,8 @@ bool ChatHandler::HandleResetSpellsCommand(const char * args)
player->resetSpells();
ChatHandler(player).SendSysMessage(LANG_RESET_SPELLS);
-
if(m_session->GetPlayer()!=player)
- PSendSysMessage(LANG_RESET_SPELLS_ONLINE,player->GetName());
+ PSendSysMessage(LANG_RESET_SPELLS_ONLINE,GetNameLink(player).c_str());
}
else
{
@@ -4986,8 +5065,8 @@ bool ChatHandler::HandleResetTalentsCommand(const char * args)
uint64 playerGUID = 0;
if (pName)
{
- std::string name = pName;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink(pName);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -4996,34 +5075,47 @@ bool ChatHandler::HandleResetTalentsCommand(const char * args)
player = objmgr.GetPlayer(name.c_str());
if(!player)
- playerGUID = objmgr.GetPlayerGUIDByName(name.c_str());
+ playerGUID = objmgr.GetPlayerGUIDByName(name);
}
else
player = getSelectedPlayer();
- if(!player && !playerGUID)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
-
if(player)
{
player->resetTalents(true);
ChatHandler(player).SendSysMessage(LANG_RESET_TALENTS);
-
if(m_session->GetPlayer()!=player)
- PSendSysMessage(LANG_RESET_TALENTS_ONLINE,player->GetName());
+ PSendSysMessage(LANG_RESET_TALENTS_ONLINE,GetNameLink(player).c_str());
+
+ return true;
}
- else
+ else if (playerGUID)
{
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_TALENTS), GUID_LOPART(playerGUID) );
- PSendSysMessage(LANG_RESET_TALENTS_OFFLINE,pName);
+ std::string nameLink = playerLink(pName);
+ PSendSysMessage(LANG_RESET_TALENTS_OFFLINE,nameLink.c_str());
+ return true;
+ }
+ // Try reset talenents as Hunter Pet
+ Creature* creature = getSelectedCreature();
+ if (creature && creature->isPet() && ((Pet *)creature)->getPetType() == HUNTER_PET)
+ {
+ ((Pet *)creature)->resetTalents(true);
+ Unit *owner = creature->GetOwner();
+ if (owner && owner->GetTypeId() == TYPEID_PLAYER)
+ {
+ player = (Player *)owner;
+ ChatHandler(player).SendSysMessage(LANG_RESET_TALENTS);
+ if(m_session->GetPlayer()!=player)
+ PSendSysMessage(LANG_RESET_TALENTS_ONLINE,GetNameLink(player).c_str());
+ }
+ return true;
}
- return true;
+ SendSysMessage(LANG_NO_CHAR_SELECTED);
+ SetSentErrorMessage(true);
+ return false;
}
bool ChatHandler::HandleResetAllCommand(const char * args)
@@ -5580,12 +5672,8 @@ bool ChatHandler::HandleBanInfoCharacterCommand(const char* args)
if(!args)
return false;
- char* cname = strtok ((char*)args, "");
- if(!cname)
- return false;
-
- std::string name = cname;
- if(!normalizePlayerName(name))
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
@@ -5897,8 +5985,8 @@ bool ChatHandler::HandleRespawnCommand(const char* /*args*/)
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Trinity::RespawnDo u_do;
- Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(u_do);
+ MaNGOS::RespawnDo u_do;
+ MaNGOS::WorldObjectWorker<MaNGOS::RespawnDo> worker(pl,u_do);
TypeContainerVisitor<Trinity::WorldObjectWorker<Trinity::RespawnDo>, GridTypeMapContainer > obj_worker(worker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -5912,9 +6000,9 @@ bool ChatHandler::HandleFlyModeCommand(const char* args)
if(!args)
return false;
- Unit *unit = getSelectedUnit();
- if (!unit || (unit->GetTypeId() != TYPEID_PLAYER))
- unit = m_session->GetPlayer();
+ Player *target = getSelectedPlayer();
+ if (!target)
+ target = m_session->GetPlayer();
WorldPacket data(12);
if (strncmp(args, "on", 3) == 0)
@@ -5926,10 +6014,10 @@ bool ChatHandler::HandleFlyModeCommand(const char* args)
SendSysMessage(LANG_USE_BOL);
return false;
}
- data.append(unit->GetPackGUID());
+ data.append(target->GetPackGUID());
data << uint32(0); // unknown
- unit->SendMessageToSet(&data, true);
- PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, unit->GetName(), args);
+ target->SendMessageToSet(&data, true);
+ PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, GetNameLink(target).c_str(), args);
return true;
}
@@ -6085,12 +6173,11 @@ bool ChatHandler::HandleWritePDumpCommand(const char *args)
guid = atoi(p2);
else
{
- std::string name = p2;
-
- if (!normalizePlayerName (name))
+ std::string name = extractPlayerNameFromLink(p2);
+ if(name.empty())
{
- SendSysMessage (LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage (true);
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
}
@@ -6682,8 +6769,15 @@ bool ChatHandler::HandleAccountSetAddonCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
}
+ // Let set addon state only for lesser (strong) security level
+ // or to self account
+ if (m_session && m_session->GetAccountId () != account_id &&
+ HasLowerSecurityAccount (NULL,account_id,true))
+ return false;
+
int lev=atoi(szExp); //get int anyway (0 if error)
if(lev < 0)
return false;
@@ -6702,9 +6796,13 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
// format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12]
- char* pName = strtok((char*)args, " ");
- if(!pName)
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
+ }
char* tail1 = strtok(NULL, "");
if(!tail1)
@@ -6742,8 +6840,7 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
if (!msgText)
return false;
- // pName, msgSubject, msgText isn't NUL after prev. check
- std::string name = pName;
+ // msgSubject, msgText isn't NUL after prev. check
std::string subject = msgSubject;
std::string text = msgText;
@@ -6778,17 +6875,17 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
}
uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1;
- if(item_count < 1 || item_proto->MaxCount && item_count > item_proto->MaxCount)
+ if(item_count < 1 || item_proto->MaxCount > 0 && item_count > uint32(item_proto->MaxCount))
{
PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, item_count,item_id);
SetSentErrorMessage(true);
return false;
}
- while(item_count > item_proto->Stackable)
+ while(item_count > item_proto->GetMaxStackSize())
{
- items.push_back(ItemPair(item_id,item_proto->Stackable));
- item_count -= item_proto->Stackable;
+ items.push_back(ItemPair(item_id,item_proto->GetMaxStackSize()));
+ item_count -= item_proto->GetMaxStackSize();
}
items.push_back(ItemPair(item_id,item_count));
@@ -6801,13 +6898,6 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
}
}
- if(!normalizePlayerName(name))
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
if(!receiver_guid)
{
@@ -6839,7 +6929,8 @@ bool ChatHandler::HandleSendItemsCommand(const char* args)
WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
- PSendSysMessage(LANG_MAIL_SENT, name.c_str());
+ std::string nameLink = playerLink(name);
+ PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
return true;
}
@@ -6851,9 +6942,13 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
/// format: name "subject text" "mail text" money
- char* pName = strtok((char*)args, " ");
- if (!pName)
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
+ }
char* tail1 = strtok(NULL, "");
if (!tail1)
@@ -6896,18 +6991,10 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
if (money <= 0)
return false;
- // pName, msgSubject, msgText isn't NUL after prev. check
- std::string name = pName;
+ // msgSubject, msgText isn't NUL after prev. check
std::string subject = msgSubject;
std::string text = msgText;
- if (!normalizePlayerName(name))
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
if (!receiver_guid)
{
@@ -6916,8 +7003,6 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
return false;
}
- uint32 mailId = objmgr.GenerateMailID();
-
// from console show not existed sender
uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
@@ -6929,7 +7014,8 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, money, 0, MAIL_CHECK_MASK_NONE);
- PSendSysMessage(LANG_MAIL_SENT, name.c_str());
+ std::string nameLink = playerLink(name);
+ PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
return true;
}
@@ -6937,15 +7023,16 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args)
bool ChatHandler::HandleSendMessageCommand(const char* args)
{
///- Get the command line arguments
- char* name_str = strtok((char*)args, " ");
- char* msg_str = strtok(NULL, "");
-
- if(!name_str || !msg_str)
+ std::string name = extractPlayerNameFromLink((char*)args);
+ if(name.empty())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
return false;
+ }
- std::string name = name_str;
-
- if(!normalizePlayerName(name))
+ char* msg_str = strtok(NULL, "");
+ if(!msg_str)
return false;
///- Find the player and check that he is not logging out.
@@ -6970,7 +7057,8 @@ bool ChatHandler::HandleSendMessageCommand(const char* args)
rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
//Confirmation message
- PSendSysMessage(LANG_SENDMESSAGE,name.c_str(),msg_str);
+ std::string nameLink = playerLink(name);
+ PSendSysMessage(LANG_SENDMESSAGE,nameLink.c_str(),msg_str);
return true;
}
@@ -6994,30 +7082,27 @@ bool ChatHandler::HandleModifyGenderCommand(const char *args)
return false;
}
+ PlayerInfo const* info = objmgr.GetPlayerInfo(player->getRace(), player->getClass());
+ if(!info)
+ return false;
+
char const* gender_str = (char*)args;
int gender_len = strlen(gender_str);
- uint32 displayId = player->GetNativeDisplayId();
- char const* gender_full = NULL;
- uint32 new_displayId = displayId;
Gender gender;
- if(!strncmp(gender_str,"male",gender_len)) // MALE
+ if(!strncmp(gender_str, "male", gender_len)) // MALE
{
if(player->getGender() == GENDER_MALE)
return true;
- gender_full = "male";
- new_displayId = player->getRace() == RACE_BLOODELF ? displayId+1 : displayId-1;
gender = GENDER_MALE;
}
- else if (!strncmp(gender_str,"female",gender_len)) // FEMALE
+ else if (!strncmp(gender_str, "female", gender_len)) // FEMALE
{
if(player->getGender() == GENDER_FEMALE)
return true;
- gender_full = "female";
- new_displayId = player->getRace() == RACE_BLOODELF ? displayId-1 : displayId+1;
gender = GENDER_FEMALE;
}
else
@@ -7029,14 +7114,19 @@ bool ChatHandler::HandleModifyGenderCommand(const char *args)
// Set gender
player->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender);
+ player->SetByteValue(PLAYER_BYTES_3, 0, gender);
// Change display ID
- player->SetDisplayId(new_displayId);
- player->SetNativeDisplayId(new_displayId);
+ player->SetDisplayId(gender ? info->displayId_f : info->displayId_m);
+ player->SetNativeDisplayId(gender ? info->displayId_f : info->displayId_m);
+
+ char const* gender_full = gender ? "female" : "male";
+
+ PSendSysMessage(LANG_YOU_CHANGE_GENDER, GetNameLink(player).c_str(), gender_full);
- PSendSysMessage(LANG_YOU_CHANGE_GENDER, player->GetName(),gender_full);
if (needReportToTarget(player))
- ChatHandler(player).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full,GetName());
+ ChatHandler(player).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, GetNameLink().c_str());
+
return true;
}
diff --git a/src/game/LootHandler.cpp b/src/game/LootHandler.cpp
index 6ca7ae1c535..9c04baa6716 100644
--- a/src/game/LootHandler.cpp
+++ b/src/game/LootHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -154,6 +154,7 @@ void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data )
--loot->unlootedCount;
player->SendNewItem(newitem, uint32(item->count), false, false, true);
+ player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
}
else
player->SendEquipError( msg, NULL, NULL );
@@ -326,7 +327,7 @@ void WorldSession::DoLootRelease( uint64 lguid )
int32 ReqValue = 175;
LockEntry const *lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->chest.lockId);
if(lockInfo)
- ReqValue = lockInfo->requiredminingskill;
+ ReqValue = lockInfo->Skill[0];
float skill = float(player->GetSkillValue(SKILL_MINING))/(ReqValue+25);
double chance = pow(0.8*chance_rate,4*(1/double(max_amount))*double(uses));
if(roll_chance_f(100*chance+skill))
@@ -383,14 +384,22 @@ void WorldSession::DoLootRelease( uint64 lguid )
Item *pItem = player->GetItemByGuid(lguid );
if(!pItem)
return;
- if( (pItem->GetProto()->BagFamily & BAG_FAMILY_MASK_MINING_SUPP) &&
- pItem->GetProto()->Class == ITEM_CLASS_TRADE_GOODS &&
- pItem->GetCount() >= 5)
+
+ ItemPrototype const* proto = pItem->GetProto();
+
+ // destroy only 5 items from stack in case prospecting and milling
+ if( (proto->BagFamily & (BAG_FAMILY_MASK_MINING_SUPP|BAG_FAMILY_MASK_HERBS)) &&
+ proto->Class == ITEM_CLASS_TRADE_GOODS)
{
pItem->m_lootGenerated = false;
pItem->loot.clear();
- uint32 count = 5;
+ uint32 count = pItem->GetCount();
+
+ // >=5 checked in spell code, but will work for cheating cases also with removing from another stacks.
+ if(count > 5)
+ count = 5;
+
player->DestroyItemCount(pItem, count, true);
}
else
@@ -495,6 +504,7 @@ void WorldSession::HandleLootMasterGiveOpcode( WorldPacket & recv_data )
// not move item from loot to target inventory
Item * newitem = target->StoreNewItem( dest, item.itemid, true, item.randomPropertyId );
target->SendNewItem(newitem, uint32(item.count), false, false, true );
+ target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
// mark as looted
item.count=0;
diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp
index c8511c3deeb..95a641862c4 100644
--- a/src/game/LootMgr.cpp
+++ b/src/game/LootMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -25,6 +25,7 @@
#include "World.h"
#include "Util.h"
#include "SharedDefines.h"
+#include "SpellMgr.h"
static Rates const qualityToRate[MAX_ITEM_QUALITY] = {
RATE_DROP_ITEM_POOR, // ITEM_QUALITY_POOR
@@ -36,16 +37,18 @@ static Rates const qualityToRate[MAX_ITEM_QUALITY] = {
RATE_DROP_ITEM_ARTIFACT, // ITEM_QUALITY_ARTIFACT
};
-LootStore LootTemplates_Creature( "creature_loot_template", "creature entry");
-LootStore LootTemplates_Disenchant( "disenchant_loot_template", "item disenchant id");
-LootStore LootTemplates_Fishing( "fishing_loot_template", "area id");
-LootStore LootTemplates_Gameobject( "gameobject_loot_template", "gameobject entry");
-LootStore LootTemplates_Item( "item_loot_template", "item entry");
-LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template","creature pickpocket lootid");
-LootStore LootTemplates_Prospecting( "prospecting_loot_template", "item entry");
-LootStore LootTemplates_QuestMail( "quest_mail_loot_template", "quest id");
-LootStore LootTemplates_Reference( "reference_loot_template", "reference id");
-LootStore LootTemplates_Skinning( "skinning_loot_template", "creature skinning id");
+LootStore LootTemplates_Creature( "creature_loot_template", "creature entry", true);
+LootStore LootTemplates_Disenchant( "disenchant_loot_template", "item disenchant id", true);
+LootStore LootTemplates_Fishing( "fishing_loot_template", "area id", true);
+LootStore LootTemplates_Gameobject( "gameobject_loot_template", "gameobject entry", true);
+LootStore LootTemplates_Item( "item_loot_template", "item entry", true);
+LootStore LootTemplates_Milling( "milling_loot_template", "item entry (herb)", true);
+LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template","creature pickpocket lootid", true);
+LootStore LootTemplates_Prospecting( "prospecting_loot_template", "item entry (ore)", true);
+LootStore LootTemplates_QuestMail( "quest_mail_loot_template", "quest id (with mail template)",false);
+LootStore LootTemplates_Reference( "reference_loot_template", "reference id", false);
+LootStore LootTemplates_Skinning( "skinning_loot_template", "creature skinning id", true);
+LootStore LootTemplates_Spell( "spell_loot_template", "spell id (explicitly discovering ability)",false);
class LootTemplate::LootGroup // A set of loot definitions for items (refs are not allowed)
@@ -55,7 +58,7 @@ class LootTemplate::LootGroup // A set of loot def
bool HasQuestDrop() const; // True if group includes at least 1 quest drop entry
bool HasQuestDropForPlayer(Player const * player) const;
// The same for active quests of the player
- void Process(Loot& loot) const; // Rolls an item from the group (if any) and adds the item to the loot
+ void Process(Loot& loot, bool rate) const; // Rolls an item from the group (if any) and adds the item to the loot
float RawTotalChance() const; // Overall chance for the group (without equal chanced items)
float TotalChance() const; // Overall chance for the group
@@ -66,7 +69,7 @@ class LootTemplate::LootGroup // A set of loot def
LootStoreItemList ExplicitlyChanced; // Entries with chances defined in DB
LootStoreItemList EqualChanced; // Zero chances - every entry takes the same chance
- LootStoreItem const * Roll() const; // Rolls an item from the group, returns NULL if all miss their chances
+ LootStoreItem const * Roll(bool rate) const; // Rolls an item from the group, returns NULL if all miss their chances
};
//Remove all data and free all memory
@@ -230,17 +233,17 @@ void LootStore::ReportNotExistedId(uint32 id) const
// Checks if the entry (quest, non-quest, reference) takes it's chance (at loot generation)
// RATE_DROP_ITEMS is no longer used for all types of entries
-bool LootStoreItem::Roll() const
+bool LootStoreItem::Roll(bool rate) const
{
if(chance>=100.f)
return true;
if(mincountOrRef < 0) // reference case
- return roll_chance_f(chance*sWorld.getRate(RATE_DROP_ITEM_REFERENCED));
+ return roll_chance_f(chance* (rate ? sWorld.getRate(RATE_DROP_ITEM_REFERENCED) : 1.0f));
ItemPrototype const *pProto = objmgr.GetItemPrototype(itemid);
- float qualityModifier = pProto ? sWorld.getRate(qualityToRate[pProto->Quality]) : 1.0f;
+ float qualityModifier = pProto && rate ? sWorld.getRate(qualityToRate[pProto->Quality]) : 1.0f;
return roll_chance_f(chance*qualityModifier);
}
@@ -366,8 +369,12 @@ void Loot::AddItem(LootStoreItem const & item)
}
// Calls processor of corresponding LootTemplate (which handles everything including references)
-void Loot::FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner)
+void Loot::FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner, bool personal)
{
+ // Must be provided
+ if(!loot_owner)
+ return;
+
LootTemplate const* tab = store.GetLootFor(loot_id);
if (!tab)
@@ -379,37 +386,36 @@ void Loot::FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner)
items.reserve(MAX_NR_LOOT_ITEMS);
quest_items.reserve(MAX_NR_QUEST_ITEMS);
- tab->Process(*this, store); // Processing is done there, callback via Loot::AddItem()
+ tab->Process(*this, store,store.IsRatesAllowed ()); // Processing is done there, callback via Loot::AddItem()
- // Setting access rights fow group-looting case
- if(!loot_owner)
- return;
+ // Setting access rights for group loot case
Group * pGroup=loot_owner->GetGroup();
- if(!pGroup)
- return;
- for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+ if(!personal && pGroup)
{
- //fill the quest item map for every player in the recipient's group
- Player* pl = itr->getSource();
- if(!pl)
- continue;
- uint32 plguid = pl->GetGUIDLow();
- QuestItemMap::iterator qmapitr = PlayerQuestItems.find(plguid);
- if (qmapitr == PlayerQuestItems.end())
- {
- FillQuestLoot(pl);
- }
- qmapitr = PlayerFFAItems.find(plguid);
- if (qmapitr == PlayerFFAItems.end())
- {
- FillFFALoot(pl);
- }
- qmapitr = PlayerNonQuestNonFFAConditionalItems.find(plguid);
- if (qmapitr == PlayerNonQuestNonFFAConditionalItems.end())
- {
- FillNonQuestNonFFAConditionalLoot(pl);
- }
+ for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+ if(Player* pl = itr->getSource())
+ FillNotNormalLootFor(pl);
}
+ // ... for personal loot
+ else
+ FillNotNormalLootFor(loot_owner);
+}
+
+void Loot::FillNotNormalLootFor(Player* pl)
+{
+ uint32 plguid = pl->GetGUIDLow();
+
+ QuestItemMap::iterator qmapitr = PlayerQuestItems.find(plguid);
+ if (qmapitr == PlayerQuestItems.end())
+ FillQuestLoot(pl);
+
+ qmapitr = PlayerFFAItems.find(plguid);
+ if (qmapitr == PlayerFFAItems.end())
+ FillFFALoot(pl);
+
+ qmapitr = PlayerNonQuestNonFFAConditionalItems.find(plguid);
+ if (qmapitr == PlayerNonQuestNonFFAConditionalItems.end())
+ FillNonQuestNonFFAConditionalLoot(pl);
}
QuestItemList* Loot::FillFFALoot(Player* player)
@@ -640,6 +646,12 @@ LootItem* Loot::LootItemInSlot(uint32 lootSlot, Player* player, QuestItem **qite
return item;
}
+uint32 Loot::GetMaxSlotInLootFor(Player* player) const
+{
+ QuestItemMap::const_iterator itr = PlayerQuestItems.find(player->GetGUIDLow());
+ return items.size() + (itr != PlayerQuestItems.end() ? itr->second->size() : 0);
+}
+
ByteBuffer& operator<<(ByteBuffer& b, LootItem const& li)
{
b << uint32(li.itemid);
@@ -653,12 +665,19 @@ ByteBuffer& operator<<(ByteBuffer& b, LootItem const& li)
ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
{
+ if (lv.permission == NONE_PERMISSION)
+ {
+ b << uint32(0); //gold
+ b << uint8(0); // item count
+ return b; // nothing output more
+ }
+
Loot &l = lv.loot;
uint8 itemsShown = 0;
//gold
- b << uint32(lv.permission!=NONE_PERMISSION ? l.gold : 0);
+ b << uint32(l.gold);
size_t count_pos = b.wpos(); // pos of item count byte
b << uint8(0); // item count placeholder
@@ -697,19 +716,21 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
}
break;
}
- case NONE_PERMISSION:
default:
return b; // nothing output more
}
- if (lv.qlist)
+ QuestItemMap const& lootPlayerQuestItems = l.GetPlayerQuestItems();
+ QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(lv.viewer->GetGUIDLow());
+ if (q_itr != lootPlayerQuestItems.end())
{
- for (QuestItemList::iterator qi = lv.qlist->begin() ; qi != lv.qlist->end(); ++qi)
+ QuestItemList *q_list = q_itr->second;
+ for (QuestItemList::iterator qi = q_list->begin() ; qi != q_list->end(); ++qi)
{
LootItem &item = l.quest_items[qi->index];
if (!qi->is_looted && !item.is_looted)
{
- b << uint8(l.items.size() + (qi - lv.qlist->begin()));
+ b << uint8(l.items.size() + (qi - q_list->begin()));
b << item;
b << uint8(0); // allow loot
++itemsShown;
@@ -717,9 +738,12 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
}
}
- if (lv.ffalist)
+ QuestItemMap const& lootPlayerFFAItems = l.GetPlayerFFAItems();
+ QuestItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(lv.viewer->GetGUIDLow());
+ if (ffa_itr != lootPlayerFFAItems.end())
{
- for (QuestItemList::iterator fi = lv.ffalist->begin() ; fi != lv.ffalist->end(); ++fi)
+ QuestItemList *ffa_list = ffa_itr->second;
+ for (QuestItemList::iterator fi = ffa_list->begin() ; fi != ffa_list->end(); ++fi)
{
LootItem &item = l.items[fi->index];
if (!fi->is_looted && !item.is_looted)
@@ -731,9 +755,12 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
}
}
- if (lv.conditionallist)
+ QuestItemMap const& lootPlayerNonQuestNonFFAConditionalItems = l.GetPlayerNonQuestNonFFAConditionalItems();
+ QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(lv.viewer->GetGUIDLow());
+ if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
{
- for (QuestItemList::iterator ci = lv.conditionallist->begin() ; ci != lv.conditionallist->end(); ++ci)
+ QuestItemList *conditional_list = nn_itr->second;
+ for (QuestItemList::iterator ci = conditional_list->begin() ; ci != conditional_list->end(); ++ci)
{
LootItem &item = l.items[ci->index];
if (!ci->is_looted && !item.is_looted)
@@ -765,7 +792,7 @@ void LootTemplate::LootGroup::AddEntry(LootStoreItem& item)
}
// Rolls an item from the group, returns NULL if all miss their chances
-LootStoreItem const * LootTemplate::LootGroup::Roll() const
+LootStoreItem const * LootTemplate::LootGroup::Roll(bool rate) const
{
if (!ExplicitlyChanced.empty()) // First explicitly chanced entries are checked
{
@@ -777,7 +804,8 @@ LootStoreItem const * LootTemplate::LootGroup::Roll() const
return &ExplicitlyChanced[i];
ItemPrototype const *pProto = objmgr.GetItemPrototype(ExplicitlyChanced[i].itemid);
- Roll -= ExplicitlyChanced[i].chance;
+ //float qualityMultiplier = pProto && rate ? sWorld.getRate(qualityToRate[pProto->Quality]) : 1.0f;
+ Roll -= ExplicitlyChanced[i].chance;// * qualityMultiplier;
if (Roll < 0)
return &ExplicitlyChanced[i];
}
@@ -813,9 +841,9 @@ bool LootTemplate::LootGroup::HasQuestDropForPlayer(Player const * player) const
}
// Rolls an item from the group (if any takes its chance) and adds the item to the loot
-void LootTemplate::LootGroup::Process(Loot& loot) const
+void LootTemplate::LootGroup::Process(Loot& loot, bool rate) const
{
- LootStoreItem const * item = Roll();
+ LootStoreItem const * item = Roll(rate);
if (item != NULL)
loot.AddItem(*item);
}
@@ -900,21 +928,21 @@ void LootTemplate::AddEntry(LootStoreItem& item)
}
// Rolls for every item in the template and adds the rolled items the the loot
-void LootTemplate::Process(Loot& loot, LootStore const& store, uint8 groupId) const
+void LootTemplate::Process(Loot& loot, LootStore const& store, bool rate, uint8 groupId) const
{
if (groupId) // Group reference uses own processing of the group
{
if (groupId > Groups.size())
return; // Error message already printed at loading stage
- Groups[groupId-1].Process(loot);
+ Groups[groupId-1].Process(loot,rate);
return;
}
// Rolling non-grouped items
for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; ++i )
{
- if ( !i->Roll() )
+ if (!i->Roll(rate))
continue; // Bad luck for the entry
if (i->mincountOrRef < 0) // References processing
@@ -925,7 +953,7 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint8 groupId) co
continue; // Error message already printed at loading stage
for (uint32 loop=0; loop < i->maxcount; ++loop )// Ref multiplicator
- Referenced->Process(loot, store, i->group); // Ref processing
+ Referenced->Process(loot, store, rate, i->group);
}
else // Plain entries (not a reference, not grouped)
loot.AddItem(*i); // Chance is already checked, just add
@@ -933,7 +961,7 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint8 groupId) co
// Now processing groups
for (LootGroups::const_iterator i = Groups.begin( ) ; i != Groups.end( ) ; ++i )
- i->Process(loot);
+ i->Process(loot,rate);
}
// True if template includes at least 1 quest drop entry
@@ -995,7 +1023,7 @@ bool LootTemplate::HasQuestDropForPlayer(LootTemplateMap const& store, Player co
// Now checking groups
for (LootGroups::const_iterator i = Groups.begin(); i != Groups.end(); ++i )
- if (i->HasQuestDrop())
+ if (i->HasQuestDropForPlayer(player))
return true;
return false;
@@ -1137,6 +1165,29 @@ void LoadLootTemplates_Item()
LootTemplates_Item.ReportUnusedIds(ids_set);
}
+void LoadLootTemplates_Milling()
+{
+ LootIdSet ids_set;
+ LootTemplates_Milling.LoadAndCollectLootIds(ids_set);
+
+ // remove real entries and check existence loot
+ for(uint32 i = 1; i < sItemStorage.MaxEntry; ++i )
+ {
+ ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype>(i);
+ if(!proto)
+ continue;
+
+ if((proto->BagFamily & BAG_FAMILY_MASK_HERBS)==0)
+ continue;
+
+ if(ids_set.count(proto->ItemId))
+ ids_set.erase(proto->ItemId);
+ }
+
+ // output error for any still listed (not referenced from appropriate table) ids
+ LootTemplates_Milling.ReportUnusedIds(ids_set);
+}
+
void LoadLootTemplates_Pickpocketing()
{
LootIdSet ids_set, ids_setUsed;
@@ -1170,9 +1221,17 @@ void LoadLootTemplates_Prospecting()
// remove real entries and check existence loot
for(uint32 i = 1; i < sItemStorage.MaxEntry; ++i )
- if(ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype>(i))
- if(ids_set.count(proto->ItemId))
- ids_set.erase(proto->ItemId);
+ {
+ ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype>(i);
+ if(!proto)
+ continue;
+
+ if((proto->BagFamily & BAG_FAMILY_MASK_MINING_SUPP)==0)
+ continue;
+
+ if(ids_set.count(proto->ItemId))
+ ids_set.erase(proto->ItemId);
+ }
// output error for any still listed (not referenced from appropriate table) ids
LootTemplates_Prospecting.ReportUnusedIds(ids_set);
@@ -1186,8 +1245,17 @@ void LoadLootTemplates_QuestMail()
// remove real entries and check existence loot
ObjectMgr::QuestMap const& questMap = objmgr.GetQuestTemplates();
for(ObjectMgr::QuestMap::const_iterator itr = questMap.begin(); itr != questMap.end(); ++itr )
+ {
+ if(!itr->second->GetRewMailTemplateId())
+ continue;
+
if(ids_set.count(itr->first))
ids_set.erase(itr->first);
+ /* disabled reporting: some quest mails not include items
+ else
+ LootTemplates_QuestMail.ReportNotExistedId(itr->first);
+ */
+ }
// output error for any still listed (not referenced from appropriate table) ids
LootTemplates_QuestMail.ReportUnusedIds(ids_set);
@@ -1219,6 +1287,37 @@ void LoadLootTemplates_Skinning()
LootTemplates_Skinning.ReportUnusedIds(ids_set);
}
+void LoadLootTemplates_Spell()
+{
+ LootIdSet ids_set;
+ LootTemplates_Spell.LoadAndCollectLootIds(ids_set);
+
+ // remove real entries and check existence loot
+ for(uint32 spell_id = 1; spell_id < sSpellStore.GetNumRows(); ++spell_id)
+ {
+ SpellEntry const* spellInfo = sSpellStore.LookupEntry (spell_id);
+ if(!spellInfo)
+ continue;
+
+ // possible cases
+ if( !IsLootCraftingSpell(spellInfo))
+ continue;
+
+ if(!ids_set.count(spell_id))
+ {
+ // not report about not trainable spells (optionally supported by DB) except with SPELL_ATTR_EX2_UNK14 (clams)
+ // 61756 (Northrend Inscription Research (FAST QA VERSION) for example
+ if ((spellInfo->Attributes & SPELL_ATTR_UNK5) || (spellInfo->AttributesEx2 & SPELL_ATTR_EX2_UNK14))
+ LootTemplates_Spell.ReportNotExistedId(spell_id);
+ }
+ else
+ ids_set.erase(spell_id);
+ }
+
+ // output error for any still listed (not referenced from appropriate table) ids
+ LootTemplates_QuestMail.ReportUnusedIds(ids_set);
+}
+
void LoadLootTemplates_Reference()
{
LootIdSet ids_set;
@@ -1229,6 +1328,7 @@ void LoadLootTemplates_Reference()
LootTemplates_Fishing.CheckLootRefs(&ids_set);
LootTemplates_Gameobject.CheckLootRefs(&ids_set);
LootTemplates_Item.CheckLootRefs(&ids_set);
+ LootTemplates_Milling.CheckLootRefs(&ids_set);
LootTemplates_Pickpocketing.CheckLootRefs(&ids_set);
LootTemplates_Skinning.CheckLootRefs(&ids_set);
LootTemplates_Disenchant.CheckLootRefs(&ids_set);
diff --git a/src/game/LootMgr.h b/src/game/LootMgr.h
index 8c64531bf4a..7841a2e0d3b 100644
--- a/src/game/LootMgr.h
+++ b/src/game/LootMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -77,7 +77,7 @@ struct LootStoreItem
group(_group), maxcount(_maxcount), conditionId(_conditionId),
needs_quest(_chanceOrQuestChance < 0) {}
- bool Roll() const; // Checks if the entry takes it's chance (at loot generation)
+ bool Roll(bool rate) const; // Checks if the entry takes it's chance (at loot generation)
bool IsValid(LootStore const& store, uint32 entry) const;
// Checks correctness of values
};
@@ -129,7 +129,8 @@ typedef std::set<uint32> LootIdSet;
class LootStore
{
public:
- explicit LootStore(char const* name, char const* entryName) : m_name(name), m_entryName(entryName) {}
+ explicit LootStore(char const* name, char const* entryName, bool ratesAllowed)
+ : m_name(name), m_entryName(entryName), m_ratesAllowed(ratesAllowed) {}
virtual ~LootStore() { Clear(); }
void Verify() const;
@@ -147,6 +148,7 @@ class LootStore
char const* GetName() const { return m_name; }
char const* GetEntryName() const { return m_entryName; }
+ bool IsRatesAllowed() const { return m_ratesAllowed; }
protected:
void LoadLootTable();
void Clear();
@@ -154,6 +156,7 @@ class LootStore
LootTemplateMap m_LootTemplates;
char const* m_name;
char const* m_entryName;
+ bool m_ratesAllowed;
};
class LootTemplate
@@ -165,7 +168,7 @@ class LootTemplate
// Adds an entry to the group (at loading stage)
void AddEntry(LootStoreItem& item);
// Rolls for every item in the template and adds the rolled items the the loot
- void Process(Loot& loot, LootStore const& store, uint8 GroupId = 0) const;
+ void Process(Loot& loot, LootStore const& store, bool rate, uint8 GroupId = 0) const;
// True if template includes at least 1 quest drop entry
bool HasQuestDrop(LootTemplateMap const& store, uint8 GroupId = 0) const;
@@ -207,19 +210,20 @@ class LootValidatorRefManager : public RefManager<Loot, LootValidatorRef>
};
//=====================================================
+struct LootView;
+
+ByteBuffer& operator<<(ByteBuffer& b, LootItem const& li);
+ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv);
struct Loot
{
+ friend ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv);
+
QuestItemMap const& GetPlayerQuestItems() const { return PlayerQuestItems; }
QuestItemMap const& GetPlayerFFAItems() const { return PlayerFFAItems; }
QuestItemMap const& GetPlayerNonQuestNonFFAConditionalItems() const { return PlayerNonQuestNonFFAConditionalItems; }
- QuestItemList* FillFFALoot(Player* player);
- QuestItemList* FillQuestLoot(Player* player);
- QuestItemList* FillNonQuestNonFFAConditionalLoot(Player* player);
-
std::vector<LootItem> items;
- std::vector<LootItem> quest_items;
uint32 gold;
uint8 unlootedCount;
@@ -235,18 +239,19 @@ struct Loot
// void clear();
void clear()
{
- items.clear(); gold = 0; PlayersLooting.clear();
for (QuestItemMap::iterator itr = PlayerQuestItems.begin(); itr != PlayerQuestItems.end(); ++itr)
delete itr->second;
+ PlayerQuestItems.clear();
+
for (QuestItemMap::iterator itr = PlayerFFAItems.begin(); itr != PlayerFFAItems.end(); ++itr)
delete itr->second;
+ PlayerFFAItems.clear();
+
for (QuestItemMap::iterator itr = PlayerNonQuestNonFFAConditionalItems.begin(); itr != PlayerNonQuestNonFFAConditionalItems.end(); ++itr)
delete itr->second;
-
- PlayerQuestItems.clear();
- PlayerFFAItems.clear();
PlayerNonQuestNonFFAConditionalItems.clear();
+ PlayersLooting.clear();
items.clear();
quest_items.clear();
gold = 0;
@@ -264,13 +269,21 @@ struct Loot
void RemoveLooter(uint64 GUID) { PlayersLooting.erase(GUID); }
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount);
- void FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner);
+ void FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner, bool personal);
// Inserts the item into the loot (called by LootTemplate processors)
void AddItem(LootStoreItem const & item);
LootItem* LootItemInSlot(uint32 lootslot, Player* player, QuestItem** qitem = NULL, QuestItem** ffaitem = NULL, QuestItem** conditem = NULL);
+ uint32 GetMaxSlotInLootFor(Player* player) const;
+
private:
+ void FillNotNormalLootFor(Player* player);
+ QuestItemList* FillFFALoot(Player* player);
+ QuestItemList* FillQuestLoot(Player* player);
+ QuestItemList* FillNonQuestNonFFAConditionalLoot(Player* player);
+
+ std::vector<LootItem> quest_items;
std::set<uint64> PlayersLooting;
QuestItemMap PlayerQuestItems;
QuestItemMap PlayerFFAItems;
@@ -278,40 +291,41 @@ struct Loot
// All rolls are registered here. They need to know, when the loot is not valid anymore
LootValidatorRefManager i_LootValidatorRefManager;
-
};
struct LootView
{
Loot &loot;
- QuestItemList *qlist;
- QuestItemList *ffalist;
- QuestItemList *conditionallist;
Player *viewer;
PermissionTypes permission;
- LootView(Loot &_loot, QuestItemList *_qlist, QuestItemList *_ffalist, QuestItemList *_conditionallist, Player *_viewer,PermissionTypes _permission = ALL_PERMISSION)
- : loot(_loot), qlist(_qlist), ffalist(_ffalist), conditionallist(_conditionallist), viewer(_viewer), permission(_permission) {}
+ LootView(Loot &_loot, Player *_viewer,PermissionTypes _permission = ALL_PERMISSION)
+ : loot(_loot), viewer(_viewer), permission(_permission) {}
};
extern LootStore LootTemplates_Creature;
extern LootStore LootTemplates_Fishing;
extern LootStore LootTemplates_Gameobject;
extern LootStore LootTemplates_Item;
+extern LootStore LootTemplates_Milling;
extern LootStore LootTemplates_Pickpocketing;
extern LootStore LootTemplates_Skinning;
extern LootStore LootTemplates_Disenchant;
extern LootStore LootTemplates_Prospecting;
extern LootStore LootTemplates_QuestMail;
+extern LootStore LootTemplates_Spell;
void LoadLootTemplates_Creature();
void LoadLootTemplates_Fishing();
void LoadLootTemplates_Gameobject();
void LoadLootTemplates_Item();
+void LoadLootTemplates_Milling();
void LoadLootTemplates_Pickpocketing();
void LoadLootTemplates_Skinning();
void LoadLootTemplates_Disenchant();
void LoadLootTemplates_Prospecting();
void LoadLootTemplates_QuestMail();
+
+void LoadLootTemplates_Spell();
void LoadLootTemplates_Reference();
inline void LoadLootTables()
@@ -320,15 +334,16 @@ inline void LoadLootTables()
LoadLootTemplates_Fishing();
LoadLootTemplates_Gameobject();
LoadLootTemplates_Item();
+ LoadLootTemplates_Milling();
LoadLootTemplates_Pickpocketing();
LoadLootTemplates_Skinning();
LoadLootTemplates_Disenchant();
LoadLootTemplates_Prospecting();
LoadLootTemplates_QuestMail();
+ LoadLootTemplates_Spell();
+
LoadLootTemplates_Reference();
}
-ByteBuffer& operator<<(ByteBuffer& b, LootItem const& li);
-ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv);
#endif
diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp
index 5698fdf03f2..62327ccdc6e 100644
--- a/src/game/Mail.cpp
+++ b/src/game/Mail.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -601,7 +601,7 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
data << (uint32) (*itr)->mailTemplateId; // mail template (MailTemplate.dbc)
data << (*itr)->subject; // Subject string - once 00, when mail type = 3
- data << (uint8) item_count;
+ data << (uint8) item_count; // client limit is 0x10
for(uint8 i = 0; i < item_count; ++i)
{
@@ -612,7 +612,7 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
data << (uint32) (item ? item->GetGUIDLow() : 0);
// entry
data << (uint32) (item ? item->GetEntry() : 0);
- for(uint8 j = 0; j < 6; ++j)
+ for(uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; ++j)
{
// unsure
data << (uint32) (item ? item->GetEnchantmentCharges((EnchantmentSlot)j) : 0);
@@ -626,13 +626,15 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
// unk
data << (uint32) (item ? item->GetItemSuffixFactor() : 0);
// stack count
- data << (uint8) (item ? item->GetCount() : 0);
+ data << (uint32) (item ? item->GetCount() : 0);
// charges
data << (uint32) (item ? item->GetSpellCharges() : 0);
// durability
data << (uint32) (item ? item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY) : 0);
// durability
data << (uint32) (item ? item->GetUInt32Value(ITEM_FIELD_DURABILITY) : 0);
+ // unknown wotlk
+ data << (uint8) 0;
}
mails_count += 1;
diff --git a/src/game/Mail.h b/src/game/Mail.h
index 784028e6d5d..acf0d9346fe 100644
--- a/src/game/Mail.h
+++ b/src/game/Mail.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Makefile.am b/src/game/Makefile.am
index ec9cbab40cb..256d24ada5b 100644
--- a/src/game/Makefile.am
+++ b/src/game/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,297 +9,307 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
## CPP flags for includes, defines, etc.
-AM_CPPFLAGS =
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/../shared/vmap -I$(srcdir)/../realmd -DSYSCONFDIR=\"$(sysconfdir)/\"
## Build MaNGOS game library as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
# later.
-noinst_LIBRARIES = libgame.a
-
-libgame_a_CPPFLAGS = \
-$(MYSQL_INCLUDES) \
-$(POSTGRE_INCLUDES) \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/src/framework \
--I$(top_srcdir)/src/shared \
--I$(top_srcdir)/src/shared/vmap
+noinst_LIBRARIES = libmangosgame.a
# libmangossgame library will later be reused by ...
-libgame_a_SOURCES = \
-$(srcdir)/AccountMgr.cpp \
-$(srcdir)/AccountMgr.h \
-$(srcdir)/AddonHandler.cpp \
-$(srcdir)/AddonHandler.h \
-$(srcdir)/AggressorAI.cpp \
-$(srcdir)/AggressorAI.h \
-$(srcdir)/AnimalRandomMovementGenerator.h \
-$(srcdir)/ArenaTeam.cpp \
-$(srcdir)/ArenaTeam.h \
-$(srcdir)/ArenaTeamHandler.cpp \
-$(srcdir)/AuctionHouse.cpp \
-$(srcdir)/AuctionHouseBot.cpp \
-$(srcdir)/AuctionHouseBot.h \
-$(srcdir)/AuctionHouseObject.h \
-$(srcdir)/Bag.cpp \
-$(srcdir)/Bag.h \
-$(srcdir)/BattleGround.cpp \
-$(srcdir)/BattleGroundAA.cpp \
-$(srcdir)/BattleGroundAB.cpp \
-$(srcdir)/BattleGroundAV.cpp \
-$(srcdir)/BattleGroundBE.cpp \
-$(srcdir)/BattleGroundEY.cpp \
-$(srcdir)/BattleGroundNA.cpp \
-$(srcdir)/BattleGroundRL.cpp \
-$(srcdir)/BattleGroundWS.cpp \
-$(srcdir)/BattleGround.h \
-$(srcdir)/BattleGroundAA.h \
-$(srcdir)/BattleGroundAB.h \
-$(srcdir)/BattleGroundAV.h \
-$(srcdir)/BattleGroundBE.h \
-$(srcdir)/BattleGroundEY.h \
-$(srcdir)/BattleGroundNA.h \
-$(srcdir)/BattleGroundRL.h \
-$(srcdir)/BattleGroundWS.h \
-$(srcdir)/BattleGroundHandler.cpp \
-$(srcdir)/BattleGroundMgr.cpp \
-$(srcdir)/BattleGroundMgr.h \
-$(srcdir)/Cell.h \
-$(srcdir)/CellImpl.h \
-$(srcdir)/Channel.cpp \
-$(srcdir)/Channel.h \
-$(srcdir)/ChannelHandler.cpp \
-$(srcdir)/ChannelMgr.h \
-$(srcdir)/CharacterHandler.cpp \
-$(srcdir)/Chat.cpp \
-$(srcdir)/Chat.h \
-$(srcdir)/ChatHandler.cpp \
-$(srcdir)/CombatHandler.cpp \
-$(srcdir)/ConfusedMovementGenerator.cpp \
-$(srcdir)/ConfusedMovementGenerator.h \
-$(srcdir)/Corpse.cpp \
-$(srcdir)/Corpse.h \
-$(srcdir)/CreatureAI.cpp \
-$(srcdir)/CreatureAI.h \
-$(srcdir)/CreatureAIImpl.h \
-$(srcdir)/CreatureAIRegistry.cpp \
-$(srcdir)/CreatureAIRegistry.h \
-$(srcdir)/CreatureAISelector.cpp \
-$(srcdir)/CreatureAISelector.h \
-$(srcdir)/CreatureGroups.cpp \
-$(srcdir)/CreatureGroups.h \
-$(srcdir)/Creature.cpp \
-$(srcdir)/Creature.h \
-$(srcdir)/Debugcmds.cpp \
-$(srcdir)/DestinationHolder.cpp \
-$(srcdir)/DestinationHolder.h \
-$(srcdir)/DestinationHolderImp.h \
-$(srcdir)/DuelHandler.cpp \
-$(srcdir)/DynamicObject.cpp \
-$(srcdir)/DynamicObject.h \
-$(srcdir)/FleeingMovementGenerator.cpp \
-$(srcdir)/FleeingMovementGenerator.h \
-$(srcdir)/Formulas.h \
-$(srcdir)/GameEvent.cpp \
-$(srcdir)/GameEvent.h \
-$(srcdir)/GameObject.cpp \
-$(srcdir)/GameObject.h \
-$(srcdir)/GlobalEvents.cpp \
-$(srcdir)/GlobalEvents.h \
-$(srcdir)/GossipDef.cpp \
-$(srcdir)/GossipDef.h \
-$(srcdir)/GridDefines.h \
-$(srcdir)/GridNotifiers.cpp \
-$(srcdir)/GridNotifiers.h \
-$(srcdir)/GridNotifiersImpl.h \
-$(srcdir)/GridStates.cpp \
-$(srcdir)/GridStates.h \
-$(srcdir)/Group.cpp \
-$(srcdir)/Group.h \
-$(srcdir)/GroupHandler.cpp \
-$(srcdir)/GuardAI.cpp \
-$(srcdir)/GuardAI.h \
-$(srcdir)/Guild.cpp \
-$(srcdir)/Guild.h \
-$(srcdir)/GuildHandler.cpp \
-$(srcdir)/HomeMovementGenerator.cpp \
-$(srcdir)/HomeMovementGenerator.h \
-$(srcdir)/HostilRefManager.cpp \
-$(srcdir)/HostilRefManager.h \
-$(srcdir)/IdleMovementGenerator.cpp \
-$(srcdir)/IdleMovementGenerator.h \
-$(srcdir)/InstanceData.cpp \
-$(srcdir)/InstanceData.h \
-$(srcdir)/InstanceSaveMgr.cpp \
-$(srcdir)/InstanceSaveMgr.h \
-$(srcdir)/Item.cpp \
-$(srcdir)/Item.h \
-$(srcdir)/ItemEnchantmentMgr.cpp \
-$(srcdir)/ItemEnchantmentMgr.h \
-$(srcdir)/ItemHandler.cpp \
-$(srcdir)/ItemPrototype.h \
-$(srcdir)/Language.h \
-$(srcdir)/Level0.cpp \
-$(srcdir)/Level1.cpp \
-$(srcdir)/Level2.cpp \
-$(srcdir)/Level3.cpp \
-$(srcdir)/LFGHandler.cpp \
-$(srcdir)/LootHandler.cpp \
-$(srcdir)/LootMgr.cpp \
-$(srcdir)/LootMgr.h \
-$(srcdir)/Mail.cpp \
-$(srcdir)/Mail.h \
-$(srcdir)/Map.cpp \
-$(srcdir)/Map.h \
-$(srcdir)/MapInstanced.cpp \
-$(srcdir)/MapInstanced.h \
-$(srcdir)/MapManager.cpp \
-$(srcdir)/MapManager.h \
-$(srcdir)/MiscHandler.cpp \
-$(srcdir)/MotionMaster.cpp \
-$(srcdir)/MotionMaster.h \
-$(srcdir)/MovementGenerator.cpp \
-$(srcdir)/MovementGenerator.h \
-$(srcdir)/MovementGeneratorImpl.h \
-$(srcdir)/MovementHandler.cpp \
-$(srcdir)/NPCHandler.cpp \
-$(srcdir)/NPCHandler.h \
-$(srcdir)/NullCreatureAI.cpp \
-$(srcdir)/NullCreatureAI.h \
-$(srcdir)/ObjectAccessor.cpp \
-$(srcdir)/ObjectAccessor.h \
-$(srcdir)/Object.cpp \
-$(srcdir)/ObjectDefines.h \
-$(srcdir)/ObjectGridLoader.cpp \
-$(srcdir)/ObjectGridLoader.h \
-$(srcdir)/Object.h \
-$(srcdir)/ObjectMgr.cpp \
-$(srcdir)/ObjectMgr.h \
-$(srcdir)/Opcodes.cpp \
-$(srcdir)/Opcodes.h \
-$(srcdir)/OutdoorPvP.cpp \
-$(srcdir)/OutdoorPvP.h \
-$(srcdir)/OutdoorPvPEP.cpp \
-$(srcdir)/OutdoorPvPEP.h \
-$(srcdir)/OutdoorPvPHP.cpp \
-$(srcdir)/OutdoorPvPHP.h \
-$(srcdir)/OutdoorPvPMgr.cpp \
-$(srcdir)/OutdoorPvPMgr.h \
-$(srcdir)/OutdoorPvPNA.cpp \
-$(srcdir)/OutdoorPvPNA.h \
-$(srcdir)/OutdoorPvPObjectiveAI.cpp \
-$(srcdir)/OutdoorPvPObjectiveAI.h \
-$(srcdir)/OutdoorPvPSI.cpp \
-$(srcdir)/OutdoorPvPSI.h \
-$(srcdir)/OutdoorPvPTF.cpp \
-$(srcdir)/OutdoorPvPTF.h \
-$(srcdir)/OutdoorPvPZM.cpp \
-$(srcdir)/OutdoorPvPZM.h \
-$(srcdir)/Path.h \
-$(srcdir)/PetAI.cpp \
-$(srcdir)/PetAI.h \
-$(srcdir)/Pet.cpp \
-$(srcdir)/Pet.h \
-$(srcdir)/PetHandler.cpp \
-$(srcdir)/PetitionsHandler.cpp \
-$(srcdir)/Player.cpp \
-$(srcdir)/Player.h \
-$(srcdir)/PlayerDump.cpp \
-$(srcdir)/PlayerDump.h \
-$(srcdir)/PointMovementGenerator.cpp \
-$(srcdir)/PointMovementGenerator.h \
-$(srcdir)/PossessedAI.cpp \
-$(srcdir)/PossessedAI.h \
-$(srcdir)/QueryHandler.cpp \
-$(srcdir)/QuestDef.cpp \
-$(srcdir)/QuestDef.h \
-$(srcdir)/QuestHandler.cpp \
-$(srcdir)/RandomMovementGenerator.cpp \
-$(srcdir)/RandomMovementGenerator.h \
-$(srcdir)/ReactorAI.cpp \
-$(srcdir)/ReactorAI.h \
-$(srcdir)/ScriptCalls.cpp \
-$(srcdir)/ScriptCalls.h \
-$(srcdir)/SharedDefines.h \
-$(srcdir)/SkillHandler.cpp \
-$(srcdir)/SpellAuraDefines.h \
-$(srcdir)/SpellAuras.cpp \
-$(srcdir)/SpellAuras.h \
-$(srcdir)/Spell.cpp \
-$(srcdir)/SpellEffects.cpp \
-$(srcdir)/Spell.h \
-$(srcdir)/SkillDiscovery.cpp \
-$(srcdir)/SkillDiscovery.h \
-$(srcdir)/SkillExtraItems.cpp \
-$(srcdir)/SkillExtraItems.h \
-$(srcdir)/SpellHandler.cpp \
-$(srcdir)/SocialMgr.cpp \
-$(srcdir)/SocialMgr.h \
-$(srcdir)/SpellMgr.cpp \
-$(srcdir)/SpellMgr.h \
-$(srcdir)/StatSystem.cpp \
-$(srcdir)/TargetedMovementGenerator.cpp \
-$(srcdir)/TargetedMovementGenerator.h \
-$(srcdir)/TaxiHandler.cpp \
-$(srcdir)/TemporarySummon.cpp \
-$(srcdir)/TemporarySummon.h \
-$(srcdir)/TicketHandler.cpp \
-$(srcdir)/TicketMgr.cpp \
-$(srcdir)/TicketMgr.h \
-$(srcdir)/Tools.cpp \
-$(srcdir)/Tools.h \
-$(srcdir)/TotemAI.cpp \
-$(srcdir)/TotemAI.h \
-$(srcdir)/Totem.cpp \
-$(srcdir)/Totem.h \
-$(srcdir)/TradeHandler.cpp \
-$(srcdir)/Transports.cpp \
-$(srcdir)/Transports.h \
-$(srcdir)/ThreatManager.cpp \
-$(srcdir)/ThreatManager.h \
-$(srcdir)/Traveller.h \
-$(srcdir)/Unit.cpp \
-$(srcdir)/Unit.h \
-$(srcdir)/UnitEvents.h \
-$(srcdir)/UpdateData.cpp \
-$(srcdir)/UpdateData.h \
-$(srcdir)/UpdateFields.h \
-$(srcdir)/UpdateMask.h \
-$(srcdir)/VoiceChatHandler.cpp \
-$(srcdir)/WaypointManager.cpp \
-$(srcdir)/WaypointManager.h \
-$(srcdir)/WaypointMovementGenerator.cpp \
-$(srcdir)/WaypointMovementGenerator.h \
-$(srcdir)/Weather.cpp \
-$(srcdir)/Weather.h \
-$(srcdir)/World.cpp \
-$(srcdir)/World.h \
-$(srcdir)/WorldLog.cpp \
-$(srcdir)/WorldLog.h \
-$(srcdir)/WorldSession.cpp \
-$(srcdir)/WorldSession.h \
-$(srcdir)/WorldSocket.cpp \
-$(srcdir)/WorldSocket.h \
-$(srcdir)/WorldSocketMgr.cpp \
-$(srcdir)/WorldSocketMgr.h \
-$(srcdir)/FollowerReference.cpp \
-$(srcdir)/FollowerReference.h \
-$(srcdir)/FollowerRefManager.h \
-$(srcdir)/GroupReference.cpp \
-$(srcdir)/GroupReference.h \
-$(srcdir)/GroupRefManager.h
+libmangosgame_a_SOURCES = \
+ AccountMgr.cpp \
+ AccountMgr.h \
+ AchievementMgr.h \
+ AchievementMgr.cpp \
+ AddonHandler.cpp \
+ AddonHandler.h \
+ AggressorAI.cpp \
+ AggressorAI.h \
+ AnimalRandomMovementGenerator.h \
+ ArenaTeam.cpp \
+ ArenaTeam.h \
+ ArenaTeamHandler.cpp \
+ AuctionHouseHandler.cpp \
+ AuctionHouseMgr.cpp \
+ AuctionHouseMgr.h \
+ Bag.cpp \
+ Bag.h \
+ BattleGround.cpp \
+ BattleGroundAA.cpp \
+ BattleGroundAB.cpp \
+ BattleGroundAV.cpp \
+ BattleGroundBE.cpp \
+ BattleGroundDS.cpp \
+ BattleGroundEY.cpp \
+ BattleGroundNA.cpp \
+ BattleGroundRL.cpp \
+ BattleGroundRV.cpp \
+ BattleGroundSA.cpp \
+ BattleGroundWS.cpp \
+ BattleGround.h \
+ BattleGroundAA.h \
+ BattleGroundAB.h \
+ BattleGroundAV.h \
+ BattleGroundBE.h \
+ BattleGroundDS.h \
+ BattleGroundEY.h \
+ BattleGroundNA.h \
+ BattleGroundRL.h \
+ BattleGroundRV.h \
+ BattleGroundSA.h \
+ BattleGroundWS.h \
+ BattleGroundHandler.cpp \
+ BattleGroundMgr.cpp \
+ BattleGroundMgr.h \
+ Calendar.cpp \
+ Calendar.h \
+ CalendarHandler.cpp \
+ Cell.h \
+ CellImpl.h \
+ Channel.cpp \
+ Channel.h \
+ ChannelHandler.cpp \
+ ChannelMgr.h \
+ CharacterHandler.cpp \
+ Chat.cpp \
+ Chat.h \
+ ChatHandler.cpp \
+ CombatHandler.cpp \
+ ConfusedMovementGenerator.cpp \
+ ConfusedMovementGenerator.h \
+ Corpse.cpp \
+ Corpse.h \
+ CreatureAI.cpp \
+ CreatureAI.h \
+ CreatureAIImpl.h \
+ CreatureAIRegistry.cpp \
+ CreatureAIRegistry.h \
+ CreatureAISelector.cpp \
+ CreatureAISelector.h \
+ CreatureGroups.cpp \
+ CreatureGroups.h \
+ Creature.cpp \
+ Creature.h \
+ debugcmds.cpp \
+ DestinationHolder.cpp \
+ DestinationHolder.h \
+ DestinationHolderImp.h \
+ DuelHandler.cpp \
+ DynamicObject.cpp \
+ DynamicObject.h \
+ FleeingMovementGenerator.cpp \
+ FleeingMovementGenerator.h \
+ Formulas.h \
+ GameEvent.cpp \
+ GameEvent.h \
+ GameObject.cpp \
+ GameObject.h \
+ GlobalEvents.cpp \
+ GlobalEvents.h \
+ GossipDef.cpp \
+ GossipDef.h \
+ GridDefines.h \
+ GridNotifiers.cpp \
+ GridNotifiers.h \
+ GridNotifiersImpl.h \
+ GridStates.cpp \
+ GridStates.h \
+ Group.cpp \
+ Group.h \
+ GroupHandler.cpp \
+ GuardAI.cpp \
+ GuardAI.h \
+ Guild.cpp \
+ Guild.h \
+ GuildHandler.cpp \
+ HomeMovementGenerator.cpp \
+ HomeMovementGenerator.h \
+ HostilRefManager.cpp \
+ HostilRefManager.h \
+ IdleMovementGenerator.cpp \
+ IdleMovementGenerator.h \
+ InstanceData.cpp \
+ InstanceData.h \
+ InstanceSaveMgr.cpp \
+ InstanceSaveMgr.h \
+ Item.cpp \
+ Item.h \
+ ItemEnchantmentMgr.cpp \
+ ItemEnchantmentMgr.h \
+ ItemHandler.cpp \
+ ItemPrototype.h \
+ Language.h \
+ Level0.cpp \
+ Level1.cpp \
+ Level2.cpp \
+ Level3.cpp \
+ LFGHandler.cpp \
+ LootHandler.cpp \
+ LootMgr.cpp \
+ LootMgr.h \
+ Mail.cpp \
+ Mail.h \
+ Map.cpp \
+ Map.h \
+ MapInstanced.cpp \
+ MapInstanced.h \
+ MapManager.cpp \
+ MapManager.h \
+ MapReference.h \
+ MapRefManager.h \
+ MiscHandler.cpp \
+ MotionMaster.cpp \
+ MotionMaster.h \
+ MovementGenerator.cpp \
+ MovementGenerator.h \
+ MovementGeneratorImpl.h \
+ MovementHandler.cpp \
+ NPCHandler.cpp \
+ NPCHandler.h \
+ NullCreatureAI.cpp \
+ NullCreatureAI.h \
+ ObjectAccessor.cpp \
+ ObjectAccessor.h \
+ Object.cpp \
+ ObjectDefines.h \
+ ObjectGridLoader.cpp \
+ ObjectGridLoader.h \
+ Object.h \
+ ObjectMgr.cpp \
+ ObjectMgr.h \
+ ObjectPosSelector.cpp \
+ ObjectPosSelector.h \
+ Opcodes.cpp \
+ Opcodes.h \
+ OutdoorPvP.cpp \
+ OutdoorPvP.h \
+ OutdoorPvPEP.cpp \
+ OutdoorPvPEP.h \
+ OutdoorPvPHP.cpp \
+ OutdoorPvPHP.h \
+ OutdoorPvPMgr.cpp \
+ OutdoorPvPMgr.h \
+ OutdoorPvPNA.cpp \
+ OutdoorPvPNA.h \
+ OutdoorPvPObjectiveAI.cpp \
+ OutdoorPvPObjectiveAI.h \
+ OutdoorPvPSI.cpp \
+ OutdoorPvPSI.h \
+ OutdoorPvPTF.cpp \
+ OutdoorPvPTF.h \
+ OutdoorPvPZM.cpp \
+ OutdoorPvPZM.h \
+ Path.h \
+ PetAI.cpp \
+ PetAI.h \
+ Pet.cpp \
+ Pet.h \
+ PetHandler.cpp \
+ PetitionsHandler.cpp \
+ Player.cpp \
+ Player.h \
+ PlayerDump.cpp \
+ PlayerDump.h \
+ PossessedAI.cpp \
+ PossessedAI.h \
+ PointMovementGenerator.cpp \
+ PointMovementGenerator.h \
+ PoolHandler.cpp \
+ PoolHandler.h \
+ QueryHandler.cpp \
+ QuestDef.cpp \
+ QuestDef.h \
+ QuestHandler.cpp \
+ RandomMovementGenerator.cpp \
+ RandomMovementGenerator.h \
+ ReactorAI.cpp \
+ ReactorAI.h \
+ ScriptCalls.cpp \
+ ScriptCalls.h \
+ SharedDefines.h \
+ SkillHandler.cpp \
+ SpellAuraDefines.h \
+ SpellAuras.cpp \
+ SpellAuras.h \
+ Spell.cpp \
+ SpellEffects.cpp \
+ Spell.h \
+ SkillDiscovery.cpp \
+ SkillDiscovery.h \
+ SkillExtraItems.cpp \
+ SkillExtraItems.h \
+ SpellHandler.cpp \
+ SocialMgr.cpp \
+ SocialMgr.h \
+ SpellMgr.cpp \
+ SpellMgr.h \
+ StatSystem.cpp \
+ TargetedMovementGenerator.cpp \
+ TargetedMovementGenerator.h \
+ TaxiHandler.cpp \
+ TemporarySummon.cpp \
+ TemporarySummon.h \
+ TotemAI.cpp \
+ TotemAI.h \
+ Totem.cpp \
+ Totem.h \
+ TradeHandler.cpp \
+ Transports.cpp \
+ Transports.h \
+ ThreatManager.cpp \
+ ThreatManager.h \
+ TicketHandler.cpp \
+ TicketMgr.cpp \
+ TicketMgr.h \
+ Traveller.h \
+ Unit.cpp \
+ Unit.h \
+ UnitEvents.h \
+ UpdateData.cpp \
+ UpdateData.h \
+ UpdateFields.h \
+ UpdateMask.h \
+ Vehicle.cpp \
+ Vehicle.h \
+ VoiceChatHandler.cpp \
+ WaypointManager.cpp \
+ WaypointManager.h \
+ WaypointMovementGenerator.cpp \
+ WaypointMovementGenerator.h \
+ Weather.cpp \
+ Weather.h \
+ World.cpp \
+ World.h \
+ WorldLog.cpp \
+ WorldLog.h \
+ WorldSession.cpp \
+ WorldSession.h \
+ WorldSocket.cpp \
+ WorldSocket.h \
+ WorldSocketMgr.cpp \
+ WorldSocketMgr.h \
+ FollowerReference.cpp \
+ FollowerReference.h \
+ FollowerRefManager.h \
+ GroupReference.cpp \
+ GroupReference.h \
+ GroupRefManager.h
+
+## Link against shared library
+libmangosgame_a_LIBADD = ../shared/libmangosshared.a ../shared/Auth/libmangosauth.a ../shared/Config/libmangosconfig.a ../shared/Database/libmangosdatabase.a ../shared/vmap/libmangosvmaps.a
## Additional files to include when running 'make dist'
# Nothing yet.
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index c6b0739b6bd..493e5b4b112 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 Trinity <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -45,7 +45,7 @@
#define MAX_GRID_LOAD_TIME 50
// magic *.map header
-const char MAP_MAGIC[] = "MAP_2.50";
+const char MAP_MAGIC[] = "MAP_3.00";
GridState* si_GridStates[MAX_GRID_STATE];
@@ -257,7 +257,7 @@ template<>
void Map::AddToGrid(Creature* obj, NGridType *grid, Cell const& cell)
{
// add to world object registry in grid
- if(obj->isPet() || obj->HasSharedVision())
+ if(obj->isPet() || obj->HasSharedVision() || obj->isVehicle())
{
(*grid)(cell.CellX(), cell.CellY()).AddWorldObject<Creature>(obj, obj->GetGUID());
}
@@ -309,7 +309,7 @@ template<>
void Map::RemoveFromGrid(Creature* obj, NGridType *grid, Cell const& cell)
{
// remove from world object registry in grid
- if(obj->isPet() || obj->HasSharedVision())
+ if(obj->isPet() || obj->HasSharedVision() || obj->isVehicle())
{
(*grid)(cell.CellX(), cell.CellY()).RemoveWorldObject<Creature>(obj, obj->GetGUID());
}
@@ -1168,8 +1168,8 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
int gx=(int)(32-x/SIZE_OF_GRIDS); //grid x
int gy=(int)(32-y/SIZE_OF_GRIDS); //grid y
- float lx=128*(32 -x/SIZE_OF_GRIDS - gx);
- float ly=128*(32 -y/SIZE_OF_GRIDS - gy);
+ float lx=MAP_RESOLUTION*(32 -x/SIZE_OF_GRIDS - gx);
+ float ly=MAP_RESOLUTION*(32 -y/SIZE_OF_GRIDS - gy);
// ensure GridMap is loaded
const_cast<Map*>(this)->EnsureGridCreated(GridPair(63-gx,63-gy));
@@ -1181,15 +1181,35 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
int lx_int = (int)lx;
int ly_int = (int)ly;
+ // In some very rare case this will happen. Need find a better way.
+ //if(lx_int == MAP_RESOLUTION) --lx_int;
+ //if(ly_int == MAP_RESOLUTION) --ly_int;
+
lx -= lx_int;
ly -= ly_int;
+ // Height stored as: h5 - its v8 grid, h1-h4 - its v9 grid
+ // +--------------> X
+ // | h1-------h2 Coordinates is:
+ // | | \ 1 / | h1 0,0
+ // | | \ / | h2 0,1
+ // | | 2 h5 3 | h3 1,0
+ // | | / \ | h4 1,1
+ // | | / 4 \ | h5 1/2,1/2
+ // | h3-------h4
+ // V Y
+ // For find height need
+ // 1 - detect triangle
+ // 2 - solve linear equation from triangle points
+
+ // Calculate coefficients for solve h = a*x + b*y + c
float a,b,c;
+ // Select triangle:
if (lx+ly < 1)
{
if (lx > ly)
{
- // 1
+ // 1 triangle (h1, h2, h5 points)
float h1 = gmap->v9[lx_int][ly_int];
float h2 = gmap->v9[lx_int+1][ly_int];
float h5 = 2 * gmap->v8[lx_int][ly_int];
@@ -1199,7 +1219,7 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
}
else
{
- // 2
+ // 2 triangle (h1, h3, h5 points)
float h1 = gmap->v9[lx_int][ly_int];
float h3 = gmap->v9[lx_int][ly_int+1];
float h5 = 2 * gmap->v8[lx_int][ly_int];
@@ -1212,7 +1232,7 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
{
if (lx > ly)
{
- // 3
+ // 3 triangle (h2, h4, h5 points)
float h2 = gmap->v9[lx_int+1][ly_int];
float h4 = gmap->v9[lx_int+1][ly_int+1];
float h5 = 2 * gmap->v8[lx_int][ly_int];
@@ -1222,7 +1242,7 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
}
else
{
- // 4
+ // 4 triangle (h3, h4, h5 points)
float h3 = gmap->v9[lx_int][ly_int+1];
float h4 = gmap->v9[lx_int+1][ly_int+1];
float h5 = 2 * gmap->v8[lx_int][ly_int];
@@ -1231,32 +1251,9 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const
c = h5 - h4;
}
}
+ // Calculate height
float _mapheight = a * lx + b * ly + c;
- // In some very rare case this will happen. Need find a better way.
- if(lx_int == MAP_RESOLUTION) --lx_int;
- if(ly_int == MAP_RESOLUTION) --ly_int;
-
- /*
- float zi[4];
- // Probe 4 nearest points (except border cases)
- zi[0] = gmap->Z[lx_int][ly_int];
- zi[1] = lx < MAP_RESOLUTION-1 ? gmap->Z[lx_int+1][ly_int] : zi[0];
- zi[2] = ly < MAP_RESOLUTION-1 ? gmap->Z[lx_int][ly_int+1] : zi[0];
- zi[3] = lx < MAP_RESOLUTION-1 && ly < MAP_RESOLUTION-1 ? gmap->Z[lx_int+1][ly_int+1] : zi[0];
- // Recalculate them like if their x,y positions were in the range 0,1
- float b[4];
- b[0] = zi[0];
- b[1] = zi[1]-zi[0];
- b[2] = zi[2]-zi[0];
- b[3] = zi[0]-zi[1]-zi[2]+zi[3];
- // Normalize the dx and dy to be in range 0..1
- float fact_x = lx - lx_int;
- float fact_y = ly - ly_int;
- // Use the simplified bilinear equation, as described in [url="http://en.wikipedia.org/wiki/Bilinear_interpolation"]http://en.wikipedia.org/wiki/Bilinear_interpolation[/url]
- float _mapheight = b[0] + (b[1]*fact_x) + (b[2]*fact_y) + (b[3]*fact_x*fact_y);
-
- */
// look from a bit higher pos to find the floor, ignore under surface case
if(z + 2.0f > _mapheight)
mapHeight = _mapheight;
@@ -1332,7 +1329,7 @@ float Map::GetVmapHeight(float x, float y, float z, bool useMaps) const
return vmapHeight;
}
-uint16 Map::GetAreaFlag(float x, float y ) const
+uint16 Map::GetAreaFlag(float x, float y, float z) const
{
//local x,y coords
float lx,ly;
@@ -1350,11 +1347,30 @@ uint16 Map::GetAreaFlag(float x, float y ) const
// ensure GridMap is loaded
const_cast<Map*>(this)->EnsureGridCreated(GridPair(63-gx,63-gy));
+ uint16 areaflag;
if(GridMaps[gx][gy])
- return GridMaps[gx][gy]->area_flag[(int)(lx)][(int)(ly)];
+ areaflag = GridMaps[gx][gy]->area_flag[(int)(lx)][(int)(ly)];
// this used while not all *.map files generated (instances)
else
- return GetAreaFlagByMapId(i_id);
+ areaflag = GetAreaFlagByMapId(i_id);
+
+ //FIXME: some hacks for areas above or underground for ground area
+ // required for area specific spells/etc, until map/vmap data
+ // not provided correct areaflag with this hacks
+ switch(areaflag)
+ {
+ // Acherus: The Ebon Hold (Plaguelands: The Scarlet Enclave)
+ case 1984: // Plaguelands: The Scarlet Enclave
+ case 2076: // Death's Breach (Plaguelands: The Scarlet Enclave)
+ case 2745: // The Noxious Pass (Plaguelands: The Scarlet Enclave)
+ if(z > 350.0f) areaflag = 2048; break;
+ // Acherus: The Ebon Hold (Eastern Plaguelands)
+ case 856: // The Noxious Glade (Eastern Plaguelands)
+ case 2456: // Death's Breach (Eastern Plaguelands)
+ if(z > 350.0f) areaflag = 1950; break;
+ }
+
+ return areaflag;
}
uint8 Map::GetTerrainType(float x, float y ) const
@@ -1614,7 +1630,7 @@ void Map::RemoveAllObjectsInRemoveList()
switch(obj->GetTypeId())
{
case TYPEID_UNIT:
- if(!((Creature*)obj)->isPet())
+ if(!((Creature*)obj)->isPet() && !((Creature*)obj)->isVehicle())
SwitchGridContainers((Creature*)obj, on);
break;
}
@@ -1759,8 +1775,9 @@ template void Map::Remove(DynamicObject *, bool);
/* ******* Dungeon Instance Maps ******* */
InstanceMap::InstanceMap(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode)
- : Map(id, expiry, InstanceId, SpawnMode), i_data(NULL),
- m_resetAfterUnload(false), m_unloadWhenEmpty(false)
+ : Map(id, expiry, InstanceId, SpawnMode),
+ m_resetAfterUnload(false), m_unloadWhenEmpty(false),
+ i_data(NULL), i_script_id(0)
{
// the timer is started by default, and stopped when the first player joins
// this make sure it gets unloaded if for some reason no player joins
@@ -1789,10 +1806,10 @@ bool InstanceMap::CanEnter(Player *player)
}
// cannot enter if the instance is full (player cap), GMs don't count
- InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId());
- if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers)
+ uint32 maxPlayers = GetMaxPlayers();
+ if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= maxPlayers)
{
- sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName());
+ sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName());
player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
return false;
}
@@ -2102,6 +2119,14 @@ void InstanceMap::SetResetSchedule(bool on)
}
}
+uint32 InstanceMap::GetMaxPlayers() const
+{
+ InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId());
+ if(!iTemplate)
+ return 0;
+ return IsHeroic() ? iTemplate->maxPlayersHeroic : iTemplate->maxPlayers;
+}
+
/* ******* Battleground Instance Maps ******* */
BattleGroundMap::BattleGroundMap(uint32 id, time_t expiry, uint32 InstanceId)
@@ -2157,12 +2182,14 @@ void BattleGroundMap::UnloadAll()
{
while(HavePlayers())
{
- Player * plr = m_mapRefManager.getFirst()->getSource();
- if(plr) (plr)->TeleportTo(plr->m_homebindMapId, plr->m_homebindX, plr->m_homebindY, plr->m_homebindZ, plr->GetOrientation());
- // TeleportTo removes the player from this map (if the map exists) -> calls BattleGroundMap::Remove -> invalidates the iterator.
- // just in case, remove the player from the list explicitly here as well to prevent a possible infinite loop
- // note that this remove is not needed if the code works well in other places
- plr->GetMapRef().unlink();
+ if(Player * plr = m_mapRefManager.getFirst()->getSource())
+ {
+ plr->TeleportTo(plr->GetBattleGroundEntryPoint());
+ // TeleportTo removes the player from this map (if the map exists) -> calls BattleGroundMap::Remove -> invalidates the iterator.
+ // just in case, remove the player from the list explicitly here as well to prevent a possible infinite loop
+ // note that this remove is not needed if the code works well in other places
+ plr->GetMapRef().unlink();
+ }
}
Map::UnloadAll();
diff --git a/src/game/Map.h b/src/game/Map.h
index 42e66996d3b..731b5a76fcc 100644
--- a/src/game/Map.h
+++ b/src/game/Map.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -75,9 +75,8 @@ typedef struct
uint16 area_flag[16][16];
uint8 terrain_type[16][16];
float liquid_level[128][128];
- float v9[16 * 8 + 1][16 * 8 + 1];
- float v8[16 * 8][16 * 8];
- //float Z[MAP_RESOLUTION][MAP_RESOLUTION];
+ float v9[MAP_RESOLUTION + 1][MAP_RESOLUTION + 1];
+ float v8[MAP_RESOLUTION][MAP_RESOLUTION];
}GridMap;
struct CreatureMover
@@ -102,7 +101,8 @@ struct InstanceTemplate
uint32 levelMin;
uint32 levelMax;
uint32 maxPlayers;
- uint32 reset_delay;
+ uint32 maxPlayersHeroic;
+ uint32 reset_delay; // FIX ME: now exist normal/heroic raids with possible different time of reset.
float startLocX;
float startLocY;
float startLocZ;
@@ -137,10 +137,8 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
// currently unused for normal maps
bool CanUnload(uint32 diff)
{
- if(!m_unloadTimer)
- return false;
- if(m_unloadTimer <= diff)
- return true;
+ if(!m_unloadTimer) return false;
+ if(m_unloadTimer <= diff) return true;
m_unloadTimer -= diff;
return false;
}
@@ -162,7 +160,7 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
template<class LOCK_TYPE, class T, class CONTAINER> void Visit(const CellLock<LOCK_TYPE> &cell, TypeContainerVisitor<T, CONTAINER> &visitor);
- inline bool IsRemovalGrid(float x, float y) const
+ bool IsRemovalGrid(float x, float y) const
{
GridPair p = Trinity::ComputeGridPair(x, y);
return( !getNGrid(p.x_coord, p.y_coord) || getNGrid(p.x_coord, p.y_coord)->GetGridState() == GRID_STATE_REMOVAL );
@@ -195,7 +193,7 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
float GetVmapHeight(float x, float y, float z, bool useMaps) const;
bool IsInWater(float x, float y, float z) const; // does not use z pos. This is for future use
- uint16 GetAreaFlag(float x, float y ) const;
+ uint16 GetAreaFlag(float x, float y, float z) const;
uint8 GetTerrainType(float x, float y ) const;
float GetWaterLevel(float x, float y ) const;
bool IsUnderWater(float x, float y, float z) const;
@@ -203,14 +201,14 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
static uint32 GetAreaId(uint16 areaflag,uint32 map_id);
static uint32 GetZoneId(uint16 areaflag,uint32 map_id);
- uint32 GetAreaId(float x, float y) const
+ uint32 GetAreaId(float x, float y, float z) const
{
- return GetAreaId(GetAreaFlag(x,y),i_id);
+ return GetAreaId(GetAreaFlag(x,y,z),i_id);
}
- uint32 GetZoneId(float x, float y) const
+ uint32 GetZoneId(float x, float y, float z) const
{
- return GetZoneId(GetAreaFlag(x,y),i_id);
+ return GetZoneId(GetAreaFlag(x,y,z),i_id);
}
virtual void MoveAllCreaturesInMoveList();
@@ -234,6 +232,17 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
bool IsBattleGround() const { return i_mapEntry && i_mapEntry->IsBattleGround(); }
bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); }
bool IsBattleGroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattleGroundOrArena(); }
+ bool GetEntrancePos(int32 &mapid, float &x, float &y)
+ {
+ if(!i_mapEntry)
+ return false;
+ if(i_mapEntry->entrance_map < 0)
+ return false;
+ mapid = i_mapEntry->entrance_map;
+ x = i_mapEntry->entrance_x;
+ y = i_mapEntry->entrance_y;
+ return true;
+ }
void AddObjectToRemoveList(WorldObject *obj);
void AddObjectToSwitchList(WorldObject *obj, bool on);
@@ -311,7 +320,7 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
bool isGridObjectDataLoaded(uint32 x, uint32 y) const { return getNGrid(x,y)->isGridObjectDataLoaded(); }
void setGridObjectDataLoaded(bool pLoaded, uint32 x, uint32 y) { getNGrid(x,y)->setGridObjectDataLoaded(pLoaded); }
- inline void setNGrid(NGridType* grid, uint32 x, uint32 y);
+ void setNGrid(NGridType* grid, uint32 x, uint32 y);
void UpdateActiveCells(const float &x, const float &y, const uint32 &t_diff);
protected:
@@ -409,6 +418,7 @@ class TRINITY_DLL_SPEC InstanceMap : public Map
bool CanEnter(Player* player);
void SendResetWarnings(uint32 timeLeft) const;
void SetResetSchedule(bool on);
+ uint32 GetMaxPlayers() const;
private:
bool m_resetAfterUnload;
bool m_unloadWhenEmpty;
diff --git a/src/game/MapInstanced.cpp b/src/game/MapInstanced.cpp
index fcdc2f76c11..99d677afffa 100644
--- a/src/game/MapInstanced.cpp
+++ b/src/game/MapInstanced.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/MapInstanced.h b/src/game/MapInstanced.h
index d34a5cf2dfb..391e99f9632 100644
--- a/src/game/MapInstanced.h
+++ b/src/game/MapInstanced.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp
index 4b736f83b2e..df8521be7d0 100644
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -175,7 +175,8 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player)
//The player has a heroic mode and tries to enter into instance which has no a heroic mode
if (!entry->SupportsHeroicMode() && player->GetDifficulty() == DIFFICULTY_HEROIC)
{
- player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY2); //Send aborted message
+ //Send aborted message
+ player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, DIFFICULTY_HEROIC);
return false;
}
@@ -240,7 +241,7 @@ void MapManager::RemoveBonesFromMap(uint32 mapid, uint64 guid, float x, float y)
}
void
-MapManager::Update(time_t diff)
+MapManager::Update(uint32 diff)
{
i_timer.Update(diff);
if( !i_timer.Passed() )
@@ -286,7 +287,8 @@ bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y)
bool MapManager::IsValidMAP(uint32 mapid)
{
MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
- return mEntry && (!mEntry->Instanceable() || objmgr.GetInstanceTemplate(mapid));
+ return mEntry && (!mEntry->IsDungeon() || objmgr.GetInstanceTemplate(mapid));
+ // TODO: add check for battleground template
}
/*void MapManager::LoadGrid(int mapid, float x, float y, const WorldObject* obj, bool no_unload)
diff --git a/src/game/MapManager.h b/src/game/MapManager.h
index ce2e9ab012b..6ca9305711d 100644
--- a/src/game/MapManager.h
+++ b/src/game/MapManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -47,18 +47,18 @@ class TRINITY_DLL_DECL MapManager : public Trinity::Singleton<MapManager, Trinit
Map const* GetBaseMap(uint32 id) const { return const_cast<MapManager*>(this)->_GetBaseMap(id); }
void DeleteInstance(uint32 mapid, uint32 instanceId);
- inline uint16 GetAreaFlag(uint32 mapid, float x, float y) const
+ uint16 GetAreaFlag(uint32 mapid, float x, float y, float z) const
{
Map const* m = GetBaseMap(mapid);
- return m->GetAreaFlag(x, y);
+ return m->GetAreaFlag(x, y, z);
}
- inline uint32 GetAreaId(uint32 mapid, float x, float y) { return Map::GetAreaId(GetAreaFlag(mapid, x, y),mapid); }
- inline uint32 GetZoneId(uint32 mapid, float x, float y) { return Map::GetZoneId(GetAreaFlag(mapid, x, y),mapid); }
+ uint32 GetAreaId(uint32 mapid, float x, float y, float z) const { return Map::GetAreaId(GetAreaFlag(mapid, x, y, z),mapid); }
+ uint32 GetZoneId(uint32 mapid, float x, float y, float z) const { return Map::GetZoneId(GetAreaFlag(mapid, x, y, z),mapid); }
void Initialize(void);
- void Update(time_t);
+ void Update(uint32);
- inline void SetGridCleanUpDelay(uint32 t)
+ void SetGridCleanUpDelay(uint32 t)
{
if( t < MIN_GRID_DELAY )
i_gridCleanUpDelay = MIN_GRID_DELAY;
@@ -66,7 +66,7 @@ class TRINITY_DLL_DECL MapManager : public Trinity::Singleton<MapManager, Trinit
i_gridCleanUpDelay = t;
}
- inline void SetMapUpdateInterval(uint32 t)
+ void SetMapUpdateInterval(uint32 t)
{
if( t > MIN_MAP_UPDATE_DELAY )
t = MIN_MAP_UPDATE_DELAY;
@@ -96,6 +96,11 @@ class TRINITY_DLL_DECL MapManager : public Trinity::Singleton<MapManager, Trinit
return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x,y,z,o);
}
+ static bool IsValidMapCoord(WorldLocation const& loc)
+ {
+ return IsValidMapCoord(loc.mapid,loc.x,loc.y,loc.z,loc.o);
+ }
+
void DoDelayedMovesAndRemoves();
void LoadTransports();
@@ -108,7 +113,7 @@ class TRINITY_DLL_DECL MapManager : public Trinity::Singleton<MapManager, Trinit
bool CanPlayerEnter(uint32 mapid, Player* player);
void RemoveBonesFromMap(uint32 mapid, uint64 guid, float x, float y);
- inline uint32 GenerateInstanceId() { return ++i_MaxInstanceId; }
+ uint32 GenerateInstanceId() { return ++i_MaxInstanceId; }
void InitMaxInstanceId();
/* statistics */
diff --git a/src/game/MapRefManager.h b/src/game/MapRefManager.h
index cf8170a7bb3..4337aa75fd9 100644
--- a/src/game/MapRefManager.h
+++ b/src/game/MapRefManager.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/game/MapReference.h b/src/game/MapReference.h
index 50a7dcea5a4..ae485af7487 100644
--- a/src/game/MapReference.h
+++ b/src/game/MapReference.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 742cc69ff25..fe3ff829ccd 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -306,13 +306,13 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
// not set flags if player can't free move to prevent lost state at logout cancel
if(GetPlayer()->CanFreeMove())
{
- GetPlayer()->SetStandState(PLAYER_STATE_SIT);
+ GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT);
WorldPacket data( SMSG_FORCE_MOVE_ROOT, (8+4) ); // guess size
data.append(GetPlayer()->GetPackGUID());
data << (uint32)2;
SendPacket( &data );
- GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
WorldPacket data( SMSG_LOGOUT_RESPONSE, 5 );
@@ -346,10 +346,10 @@ void WorldSession::HandleLogoutCancelOpcode( WorldPacket & /*recv_data*/ )
SendPacket( &data );
//! Stand Up
- GetPlayer()->SetStandState(PLAYER_STATE_NONE);
+ GetPlayer()->SetStandState(UNIT_STAND_STATE_STAND);
//! DISABLE_ROTATE
- GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
sLog.outDebug( "WORLD: sent SMSG_LOGOUT_CANCEL_ACK Message" );
@@ -363,10 +363,12 @@ void WorldSession::HandleTogglePvP( WorldPacket & recv_data )
bool newPvPStatus;
recv_data >> newPvPStatus;
GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP, newPvPStatus);
+ GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER, !newPvPStatus);
}
else
{
GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP);
+ GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER);
}
if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP))
@@ -816,7 +818,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
GetPlayer()->SetRestType(REST_TYPE_IN_TAVERN);
if(sWorld.IsFFAPvPRealm())
- GetPlayer()->RemoveFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ GetPlayer()->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
return;
}
@@ -886,7 +888,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
if(missingItem)
SendAreaTriggerMessage(GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), at->requiredLevel, objmgr.GetItemPrototype(missingItem)->Name1);
else if(missingKey)
- GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY2);
+ GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY, DIFFICULTY_HEROIC);
else if(missingHeroicQuest)
SendAreaTriggerMessage(at->heroicQuestFailedText.c_str());
else if(missingQuest)
@@ -900,16 +902,96 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
GetPlayer()->TeleportTo(at->target_mapId,at->target_X,at->target_Y,at->target_Z,at->target_Orientation,TELE_TO_NOT_LEAVE_TRANSPORT);
}
-void WorldSession::HandleUpdateAccountData(WorldPacket &/*recv_data*/)
+void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data)
{
sLog.outDetail("WORLD: Received CMSG_UPDATE_ACCOUNT_DATA");
- //recv_data.hexlike();
+
+ CHECK_PACKET_SIZE(recv_data, 4+4+4);
+
+ uint32 type, timestamp, decompressedSize;
+ recv_data >> type >> timestamp >> decompressedSize;
+
+ sLog.outDebug("UAD: type %u, time %u, decompressedSize %u", type, timestamp, decompressedSize);
+
+ if(type > NUM_ACCOUNT_DATA_TYPES)
+ return;
+
+ if(decompressedSize == 0) // erase
+ {
+ SetAccountData(type, timestamp, "");
+
+ WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
+ data << uint32(type);
+ data << uint32(0);
+ SendPacket(&data);
+
+ return;
+ }
+
+ if(decompressedSize > 0xFFFF)
+ {
+ sLog.outError("UAD: Account data packet too big, size %u", decompressedSize);
+ return;
+ }
+
+ ByteBuffer dest;
+ dest.resize(decompressedSize);
+
+ uLongf realSize = decompressedSize;
+ if(uncompress(const_cast<uint8*>(dest.contents()), &realSize, const_cast<uint8*>(recv_data.contents() + recv_data.rpos()), recv_data.size() - recv_data.rpos()) != Z_OK)
+ {
+ sLog.outError("UAD: Failed to decompress account data");
+ return;
+ }
+
+ std::string adata;
+ dest >> adata;
+
+ SetAccountData(type, timestamp, adata);
+
+ WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
+ data << uint32(type);
+ data << uint32(0);
+ SendPacket(&data);
}
-void WorldSession::HandleRequestAccountData(WorldPacket& /*recv_data*/)
+void WorldSession::HandleRequestAccountData(WorldPacket& recv_data)
{
sLog.outDetail("WORLD: Received CMSG_REQUEST_ACCOUNT_DATA");
- //recv_data.hexlike();
+
+ CHECK_PACKET_SIZE(recv_data, 4);
+
+ uint32 type;
+ recv_data >> type;
+
+ sLog.outDebug("RAD: type %u", type);
+
+ if(type > NUM_ACCOUNT_DATA_TYPES)
+ return;
+
+ AccountData *adata = GetAccountData(type);
+
+ uint32 size = adata->Data.size();
+
+ ByteBuffer dest;
+ dest.resize(size);
+
+ uLongf destSize = size;
+ if(size && compress(const_cast<uint8*>(dest.contents()), &destSize, (uint8*)adata->Data.c_str(), size) != Z_OK)
+ {
+ sLog.outDebug("RAD: Failed to compress account data");
+ return;
+ }
+
+ dest.resize(destSize);
+
+ WorldPacket data (SMSG_UPDATE_ACCOUNT_DATA, 8+4+4+4+destSize);
+ data << uint64(_player->GetGUID()); // player guid
+ data << uint32(type); // type (0-7)
+ data << uint32(adata->Time); // unix time
+ data << uint32(size); // decompressed length
+ data.append(dest); // compressed data
+ SendPacket(&data);
}
void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data)
@@ -1408,7 +1490,7 @@ void WorldSession::HandleFarSightOpcode( WorldPacket & recv_data )
pair = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
else
return;
- sLog.outDebug("Added FarSight " I64FMT " to player %u", _player->GetFarSight(), _player->GetGUIDLow());
+ sLog.outDebug("Added FarSight " I64FMT " to player %u", _player->GetFarSightGUID(), _player->GetGUIDLow());
break;
default:
sLog.outDebug("Unhandled mode in CMSG_FAR_SIGHT: %u", apply);
@@ -1441,11 +1523,11 @@ void WorldSession::HandleChooseTitleOpcode( WorldPacket & recv_data )
GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title);
}
-void WorldSession::HandleAllowMoveAckOpcode( WorldPacket & recv_data )
+void WorldSession::HandleTimeSyncResp( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data, 4+4);
- sLog.outDebug("CMSG_ALLOW_MOVE_ACK");
+ sLog.outDebug("CMSG_TIME_SYNC_RESP");
uint32 counter, time_;
recv_data >> counter >> time_;
@@ -1515,26 +1597,6 @@ void WorldSession::HandleDungeonDifficultyOpcode( WorldPacket & recv_data )
}
}
-void WorldSession::HandleNewUnknownOpcode( WorldPacket & recv_data )
-{
- sLog.outDebug("New Unknown Opcode %u", recv_data.GetOpcode());
- recv_data.hexlike();
- /*
- New Unknown Opcode 837
- STORAGE_SIZE: 60
- 02 00 00 00 00 00 00 00 | 00 00 00 00 01 20 00 00
- 89 EB 33 01 71 5C 24 C4 | 15 03 35 45 74 47 8B 42
- BA B8 1B 40 00 00 00 00 | 00 00 00 00 77 66 42 BF
- 23 91 26 3F 00 00 60 41 | 00 00 00 00
-
- New Unknown Opcode 837
- STORAGE_SIZE: 44
- 02 00 00 00 00 00 00 00 | 00 00 00 00 00 00 80 00
- 7B 80 34 01 84 EA 2B C4 | 5F A1 36 45 C9 39 1C 42
- BA B8 1B 40 CE 06 00 00 | 00 00 80 3F
- */
-}
-
void WorldSession::HandleDismountOpcode( WorldPacket & /*recv_data*/ )
{
sLog.outDebug("WORLD: CMSG_CANCEL_MOUNT_AURA");
@@ -1602,3 +1664,31 @@ void WorldSession::HandleSetTaxiBenchmarkOpcode( WorldPacket & recv_data )
sLog.outDebug("Client used \"/timetest %d\" command", mode);
}
+void WorldSession::HandleSpellClick( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data, 8);
+
+ uint64 guid;
+ recv_data >> guid;
+
+ Vehicle *vehicle = ObjectAccessor::GetVehicle(guid);
+
+ if(!vehicle)
+ return;
+
+ _player->EnterVehicle(vehicle);
+}
+
+void WorldSession::HandleInspectAchievements( WorldPacket & recv_data )
+{
+ CHECK_PACKET_SIZE(recv_data, 1);
+ uint64 guid;
+ if(!recv_data.readPackGUID(guid))
+ return;
+
+ Player *player = objmgr.GetPlayer(guid);
+ if(!player)
+ return;
+
+ player->GetAchievementMgr().SendRespondInspectAchievements(_player);
+}
diff --git a/src/game/MovementGenerator.cpp b/src/game/MovementGenerator.cpp
index ee314ffae3f..7784df315c9 100644
--- a/src/game/MovementGenerator.cpp
+++ b/src/game/MovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/MovementGenerator.h b/src/game/MovementGenerator.h
index 49d0ce8798a..cb352b7f1c6 100644
--- a/src/game/MovementGenerator.h
+++ b/src/game/MovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/MovementGeneratorImpl.h b/src/game/MovementGeneratorImpl.h
index 7197adb5dfe..fc676704d3a 100644
--- a/src/game/MovementGeneratorImpl.h
+++ b/src/game/MovementGeneratorImpl.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index 2eb3bab12e7..8ada92957ec 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -31,6 +31,7 @@
#include "BattleGround.h"
#include "WaypointMovementGenerator.h"
#include "InstanceSaveMgr.h"
+#include "ObjectMgr.h"
void WorldSession::HandleMoveWorldportAckOpcode( WorldPacket & /*recv_data*/ )
{
@@ -87,6 +88,27 @@ void WorldSession::HandleMoveWorldportAckOpcode()
}
return;
}
+
+ //this will set player's team ... so IT MUST BE CALLED BEFORE SendInitialPacketsAfterAddToMap()
+ // battleground state prepare (in case join to BG), at relogin/tele player not invited
+ // only add to bg group and object, if the player was invited (else he entered through command)
+ if(_player->InBattleGround())
+ {
+ // cleanup seting if outdated
+ if(!mEntry->IsBattleGroundOrArena())
+ {
+ _player->SetBattleGroundId(0); // We're not in BG.
+ // reset destination bg team
+ _player->SetBGTeam(0);
+ }
+ // join to bg case
+ else if(BattleGround *bg = _player->GetBattleGround())
+ {
+ if(_player->IsInvitedForBattleGroundInstance(_player->GetBattleGroundId()))
+ bg->AddPlayer(_player);
+ }
+ }
+
GetPlayer()->SendInitialPacketsAfterAddToMap();
// flight fast teleport case
@@ -131,34 +153,6 @@ void WorldSession::HandleMoveWorldportAckOpcode()
if(!mEntry->IsMountAllowed())
_player->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
- // battleground state prepare
- // only add to bg group and object, if the player was invited (else he entered through command)
- if(_player->InBattleGround() && _player->IsInvitedForBattleGroundInstance(_player->GetBattleGroundId()))
- {
- BattleGround *bg = _player->GetBattleGround();
- if(bg)
- {
- bg->AddPlayer(_player);
- if(bg->GetMapId() == _player->GetMapId()) // we teleported to bg
- {
- // get the team this way, because arenas might 'override' the teams.
- uint32 team = bg->GetPlayerTeam(_player->GetGUID());
- if(!team)
- team = _player->GetTeam();
- if(!bg->GetBgRaid(team)) // first player joined
- {
- Group *group = new Group;
- bg->SetBgRaid(team, group);
- group->Create(_player->GetGUIDLow(), _player->GetName());
- }
- else // raid already exist
- {
- bg->GetBgRaid(team)->AddMember(_player->GetGUID(), _player->GetName());
- }
- }
- }
- }
-
// honorless target
if(GetPlayer()->pvpInfo.inHostileArea)
GetPlayer()->CastSpell(GetPlayer(), 2479, true);
@@ -178,64 +172,15 @@ void WorldSession::HandleMoveWorldportAckOpcode()
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data, 4+1+4+4+4+4+4);
+ uint32 opcode = recv_data.GetOpcode();
+ sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode);
+
+ if(GetPlayer()->GetDontMove())
+ return;
/* extract packet */
MovementInfo movementInfo;
- uint32 MovementFlags;
-
- recv_data >> MovementFlags;
- recv_data >> movementInfo.unk1;
- recv_data >> movementInfo.time;
- recv_data >> movementInfo.x;
- recv_data >> movementInfo.y;
- recv_data >> movementInfo.z;
- recv_data >> movementInfo.o;
-
- if(MovementFlags & MOVEMENTFLAG_ONTRANSPORT)
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4+4+4+4+4);
-
- recv_data >> movementInfo.t_guid;
- recv_data >> movementInfo.t_x;
- recv_data >> movementInfo.t_y;
- recv_data >> movementInfo.t_z;
- recv_data >> movementInfo.t_o;
- recv_data >> movementInfo.t_time;
- }
-
- if(MovementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
-
- recv_data >> movementInfo.s_pitch; // pitch, -1.55=looking down, 0=looking straight forward, +1.55=looking up
- }
-
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
-
- recv_data >> movementInfo.fallTime; // duration of last jump (when in jump duration from jump begin to now)
-
- if(MovementFlags & MOVEMENTFLAG_JUMPING)
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4+4+4+4);
-
- recv_data >> movementInfo.j_unk; // constant, but different when jumping in water and on land?
- recv_data >> movementInfo.j_sinAngle; // sin of angle between orientation0 and players orientation
- recv_data >> movementInfo.j_cosAngle; // cos of angle between orientation0 and players orientation
- recv_data >> movementInfo.j_xyspeed; // speed of xy movement
- }
-
- if(MovementFlags & MOVEMENTFLAG_SPLINE)
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
-
- recv_data >> movementInfo.u_unk1; // unknown
- }
+ ReadMovementInfo(recv_data, &movementInfo);
/*----------------*/
if(recv_data.size() != recv_data.rpos())
@@ -248,22 +193,8 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
if (!Trinity::IsValidMapCoord(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o))
return;
- // Handle possessed unit movement separately
- Unit* pos_unit = GetPlayer()->GetCharm();
- if (pos_unit && pos_unit->isPossessed()) // can be charmed but not possessed
- {
- HandlePossessedMovement(recv_data, movementInfo, MovementFlags);
- return;
- }
-
- if (GetPlayer()->GetDontMove())
- return;
-
- //Save movement flags
- GetPlayer()->SetUnitMovementFlags(MovementFlags);
-
/* handle special cases */
- if (MovementFlags & MOVEMENTFLAG_ONTRANSPORT)
+ if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT)
{
// transports size limited
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
@@ -282,9 +213,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{
if ((*iter)->GetGUID() == movementInfo.t_guid)
{
- // unmount before boarding
- GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
-
GetPlayer()->m_transport = (*iter);
(*iter)->AddPassenger(GetPlayer());
break;
@@ -301,13 +229,14 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
movementInfo.t_z = 0.0f;
movementInfo.t_o = 0.0f;
movementInfo.t_time = 0;
+ movementInfo.t_seat = -1;
}
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
- if (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight())
+ if (opcode == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight())
GetPlayer()->HandleFallDamage(movementInfo);
- if(((MovementFlags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater())
+ if(((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater())
{
// now client not include swimming flag in case jumping under water
GetPlayer()->SetInWater( !GetPlayer()->IsInWater() || GetPlayer()->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) );
@@ -316,100 +245,54 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
/*----------------------*/
/* process position-change */
- recv_data.put<uint32>(5, getMSTime()); // offset flags(4) + unk(1)
- WorldPacket data(recv_data.GetOpcode(), (GetPlayer()->GetPackGUID().size()+recv_data.size()));
- data.append(GetPlayer()->GetPackGUID());
+ Unit *mover = _player->m_mover;
+ recv_data.put<uint32>(6, getMSTime()); // fix time, offset flags(4) + unk(2)
+ WorldPacket data(recv_data.GetOpcode(), (mover->GetPackGUID().size()+recv_data.size()));
+ data.append(_player->m_mover->GetPackGUID()); // use mover guid
data.append(recv_data.contents(), recv_data.size());
GetPlayer()->SendMessageToSet(&data, false);
- GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
- GetPlayer()->m_movementInfo = movementInfo;
- if (GetPlayer()->m_lastFallTime >= movementInfo.fallTime || GetPlayer()->m_lastFallZ <=movementInfo.z || recv_data.GetOpcode() == MSG_MOVE_FALL_LAND)
- GetPlayer()->SetFallInformation(movementInfo.fallTime, movementInfo.z);
-
- if(GetPlayer()->isMovingOrTurning())
- GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
-
- if(movementInfo.z < -500.0f)
- GetPlayer()->HandleFallUnderMap();
-}
-
-void WorldSession::HandlePossessedMovement(WorldPacket& recv_data, MovementInfo& movementInfo, uint32& MovementFlags)
-{
- // Whatever the client is controlling, it will send the GUID of the original player.
- // If current player is controlling, it must be handled like the controlled player sent these opcodes
-
- Unit* pos_unit = GetPlayer()->GetCharm();
-
- if (pos_unit->GetTypeId() == TYPEID_PLAYER && ((Player*)pos_unit)->GetDontMove())
- return;
-
- //Save movement flags
- pos_unit->SetUnitMovementFlags(MovementFlags);
-
- // Remove possession if possessed unit enters a transport
- if (MovementFlags & MOVEMENTFLAG_ONTRANSPORT)
+ if(!_player->GetCharmGUID()) // nothing is charmed
{
- GetPlayer()->Uncharm();
- return;
+ _player->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
+ _player->m_movementInfo = movementInfo;
+ _player->SetUnitMovementFlags(movementInfo.flags);
}
-
- recv_data.put<uint32>(5, getMSTime());
- WorldPacket data(recv_data.GetOpcode(), pos_unit->GetPackGUID().size()+recv_data.size());
- data.append(pos_unit->GetPackGUID());
- data.append(recv_data.contents(), recv_data.size());
- // Send the packet to self but not to the possessed player; for creatures the first bool is irrelevant
- pos_unit->SendMessageToSet(&data, true, false);
-
- // Possessed is a player
- if (pos_unit->GetTypeId() == TYPEID_PLAYER)
+ else
{
- Player* plr = (Player*)pos_unit;
-
- if (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND)
- plr->HandleFallDamage(movementInfo);
-
- if(((MovementFlags & MOVEMENTFLAG_SWIMMING) != 0) != plr->IsInWater())
+ if(mover->GetTypeId() != TYPEID_PLAYER) // unit, creature, pet, vehicle...
{
- // Now client not include swimming flag in case jumping under water
- plr->SetInWater( !plr->IsInWater() || plr->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) );
+ if(Map *map = mover->GetMap())
+ map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
+ mover->SetUnitMovementFlags(movementInfo.flags);
}
-
- plr->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o, false);
- plr->m_movementInfo = movementInfo;
-
- if(plr->isMovingOrTurning())
- plr->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
-
- if(movementInfo.z < -500.0f)
+ else // player
{
- GetPlayer()->Uncharm();
- plr->HandleFallUnderMap();
+ ((Player*)mover)->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
+ ((Player*)mover)->m_movementInfo = movementInfo;
+ ((Player*)mover)->SetUnitMovementFlags(movementInfo.flags);
}
}
- else // Possessed unit is a creature
- {
- Map* map = MapManager::Instance().GetMap(pos_unit->GetMapId(), pos_unit);
- map->CreatureRelocation((Creature*)pos_unit, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
- }
+
+ if (GetPlayer()->m_lastFallTime >= movementInfo.fallTime || GetPlayer()->m_lastFallZ <=movementInfo.z || recv_data.GetOpcode() == MSG_MOVE_FALL_LAND)
+ GetPlayer()->SetFallInformation(movementInfo.fallTime, movementInfo.z);
+
+ if(GetPlayer()->isMovingOrTurning())
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+
+ if(movementInfo.z < -500.0f)
+ GetPlayer()->HandleFallUnderMap();
}
void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
{
- CHECK_PACKET_SIZE(recv_data, 8+4+4+1+4+4+4+4+4);
+ sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(recv_data.GetOpcode()), recv_data.GetOpcode(), recv_data.GetOpcode());
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4);
/* extract packet */
uint64 guid;
- uint8 unkB;
- uint32 unk1, flags, time, fallTime;
- float x, y, z, orientation;
-
- uint64 t_GUID;
- float t_x, t_y, t_z, t_o;
- uint32 t_time;
- float s_pitch;
- float j_unk1, j_sinAngle, j_cosAngle, j_xyspeed;
- float u_unk1;
+ uint32 unk1;
float newspeed;
recv_data >> guid;
@@ -420,47 +303,10 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
// continue parse packet
- recv_data >> unk1;
- recv_data >> flags >> unkB >> time;
- recv_data >> x >> y >> z >> orientation;
- if (flags & MOVEMENTFLAG_ONTRANSPORT)
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4+4+4+4+4);
-
- recv_data >> t_GUID;
- recv_data >> t_x >> t_y >> t_z >> t_o >> t_time;
- }
- if (flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
-
- recv_data >> s_pitch; // pitch, -1.55=looking down, 0=looking straight forward, +1.55=looking up
- }
-
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
-
- recv_data >> fallTime; // duration of last jump (when in jump duration from jump begin to now)
-
- if ((flags & MOVEMENTFLAG_JUMPING) || (flags & MOVEMENTFLAG_FALLING))
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4+4+4+4);
-
- recv_data >> j_unk1; // ?constant, but different when jumping in water and on land?
- recv_data >> j_sinAngle >> j_cosAngle; // sin + cos of angle between orientation0 and players orientation
- recv_data >> j_xyspeed; // speed of xy movement
- }
-
- if(flags & MOVEMENTFLAG_SPLINE)
- {
- // recheck
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+ recv_data >> unk1; // counter or moveEvent
- recv_data >> u_unk1; // unknown
- }
+ MovementInfo movementInfo;
+ ReadMovementInfo(recv_data, &movementInfo);
// recheck
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
@@ -473,7 +319,7 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
UnitMoveType move_type;
UnitMoveType force_move_type;
- static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack" };
+ static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack", "PitchRate" };
uint16 opcode = recv_data.GetOpcode();
switch(opcode)
@@ -486,6 +332,7 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break;
case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break;
case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break;
+ case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break;
default:
sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode);
return;
@@ -520,20 +367,61 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: Recvd CMSG_SET_ACTIVE_MOVER");
+ recv_data.hexlike();
- CHECK_PACKET_SIZE(recv_data,8);
+ CHECK_PACKET_SIZE(recv_data, 8);
uint64 guid;
recv_data >> guid;
- WorldPacket data(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
- data << uint32(0x00000000); // on blizz it increments periodically
- SendPacket(&data);
+ if(_player->m_mover->GetGUID() != guid)
+ {
+ sLog.outError("HandleSetActiveMoverOpcode: incorrect mover guid: mover is " I64FMT " and should be " I64FMT, _player->m_mover->GetGUID(), guid);
+ return;
+ }
}
-void WorldSession::HandleNotActiveMoverOpcode(WorldPacket& /*recv_data*/)
+void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER");
+ recv_data.hexlike();
+
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8);
+
+ uint64 old_mover_guid;
+ recv_data >> old_mover_guid;
+
+ if(_player->m_mover->GetGUID() == old_mover_guid)
+ {
+ sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is " I64FMT " and should be " I64FMT " instead of " I64FMT, _player->m_mover->GetGUID(), _player->GetGUID(), old_mover_guid);
+ return;
+ }
+
+ MovementInfo mi;
+ ReadMovementInfo(recv_data, &mi);
+ _player->m_movementInfo = mi;
+}
+
+void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data)
+{
+ sLog.outDebug("WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE");
+ recv_data.hexlike();
+
+ uint64 vehicleGUID = _player->GetCharmGUID();
+
+ if(!vehicleGUID) // something wrong here...
+ return;
+
+ MovementInfo mi;
+ ReadMovementInfo(recv_data, &mi);
+ _player->m_movementInfo = mi;
+
+ // using charm guid, because we don't have vehicle guid...
+ if(Vehicle *vehicle = ObjectAccessor::GetVehicle(vehicleGUID))
+ {
+ _player->ExitVehicle(vehicle);
+ vehicle->Dismiss();
+ }
}
void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recvdata*/)
diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp
index 23077ec36be..8ab1844fab7 100644
--- a/src/game/NPCHandler.cpp
+++ b/src/game/NPCHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -162,29 +162,29 @@ void WorldSession::SendTrainerList( uint64 guid, const std::string& strTitle )
float fDiscountMod = _player->GetReputationPriceDiscount(unit);
uint32 count = 0;
- for(TrainerSpellList::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr)
+ for(TrainerSpellMap::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr)
{
- TrainerSpell const* tSpell = *itr;
+ TrainerSpell const* tSpell = &itr->second;
- if(!_player->IsSpellFitByClassAndRace(tSpell->spell))
+ if(!_player->IsSpellFitByClassAndRace(tSpell->learnedSpell))
continue;
++count;
- bool primary_prof_first_rank = spellmgr.IsPrimaryProfessionFirstRankSpell(tSpell->spell);
+ bool primary_prof_first_rank = spellmgr.IsPrimaryProfessionFirstRankSpell(tSpell->learnedSpell);
- SpellChainNode const* chain_node = spellmgr.GetSpellChainNode(tSpell->spell);
+ SpellChainNode const* chain_node = spellmgr.GetSpellChainNode(tSpell->learnedSpell);
uint32 req_spell = spellmgr.GetSpellRequired(tSpell->spell);
- data << uint32(tSpell->spell);
+ data << uint32(tSpell->spell); // learned spell (or cast-spell in profession case)
data << uint8(_player->GetTrainerSpellState(tSpell));
- data << uint32(floor(tSpell->spellcost * fDiscountMod));
+ data << uint32(floor(tSpell->spellCost * fDiscountMod));
data << uint32(primary_prof_first_rank ? 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
- data << uint8(tSpell->reqlevel);
- data << uint32(tSpell->reqskill);
- data << uint32(tSpell->reqskillvalue);
+ data << uint8(tSpell->reqLevel);
+ data << uint32(tSpell->reqSkill);
+ data << uint32(tSpell->reqSkillValue);
data << uint32(chain_node && chain_node->prev ? chain_node->prev : req_spell);
data << uint32(chain_node && chain_node->prev ? req_spell : 0);
data << uint32(0);
@@ -235,12 +235,14 @@ void WorldSession::HandleTrainerBuySpellOpcode( WorldPacket & recv_data )
return;
// apply reputation discount
- uint32 nSpellCost = uint32(floor(trainer_spell->spellcost * _player->GetReputationPriceDiscount(unit)));
+ uint32 nSpellCost = uint32(floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit)));
// check money requirement
if(_player->GetMoney() < nSpellCost )
return;
+ _player->ModifyMoney( -int32(nSpellCost) );
+
WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); // visual effect on trainer
data << uint64(guid) << uint32(0xB3);
SendPacket(&data);
@@ -249,13 +251,15 @@ void WorldSession::HandleTrainerBuySpellOpcode( WorldPacket & recv_data )
data << uint64(_player->GetGUID()) << uint32(0x016A);
SendPacket(&data);
- _player->ModifyMoney( -int32(nSpellCost) );
-
- // learn explicitly to prevent lost money at lags, learning spell will be only show spell animation
- _player->learnSpell(trainer_spell->spell);
+ // learn explicitly or cast explicitly
+ if(trainer_spell->IsCastable ())
+ //FIXME: prof. spell entry in trainer list not marked gray until list re-open.
+ _player->CastSpell(_player,trainer_spell->spell,true);
+ else
+ _player->learnSpell(spellId,false);
data.Initialize(SMSG_TRAINER_BUY_SUCCEEDED, 12);
- data << uint64(guid) << uint32(spellId);
+ data << uint64(guid) << uint32(trainer_spell->spell);
SendPacket(&data);
}
@@ -528,13 +532,12 @@ void WorldSession::SendStablePet(uint64 guid )
data << uint32(pet->GetEntry());
data << uint32(pet->getLevel());
data << pet->GetName(); // petname
- data << uint32(pet->GetLoyaltyLevel()); // loyalty
- data << uint8(0x01); // client slot 1 == current pet (0)
+ data << uint8(0x01); // flags?, client slot 1 == current pet (0)
++num;
}
- // 0 1 2 3 4 5 6
- QueryResult* result = CharacterDatabase.PQuery("SELECT owner, slot, id, entry, level, loyalty, name FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 3",_player->GetGUIDLow());
+ // 0 1 2 3 4 5
+ QueryResult* result = CharacterDatabase.PQuery("SELECT owner, slot, id, entry, level, name FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow());
if(result)
{
@@ -545,8 +548,7 @@ void WorldSession::SendStablePet(uint64 guid )
data << uint32(fields[2].GetUInt32()); // petnumber
data << uint32(fields[3].GetUInt32()); // creature entry
data << uint32(fields[4].GetUInt32()); // level
- data << fields[6].GetString(); // name
- data << uint32(fields[5].GetUInt32()); // loyalty
+ data << fields[5].GetString(); // name
data << uint8(fields[1].GetUInt32()+1); // slot
++num;
@@ -596,7 +598,7 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data )
uint32 free_slot = 1;
- QueryResult *result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 3 ORDER BY slot ",_player->GetGUIDLow());
+ QueryResult *result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 5 ORDER BY slot ",_player->GetGUIDLow());
if(result)
{
do
@@ -660,7 +662,7 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data )
Pet *newpet = NULL;
- QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot > 0 AND slot < 3",_player->GetGUIDLow(),petnumber);
+ QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow(),petnumber);
if(result)
{
Field *fields = result->Fetch();
@@ -704,7 +706,7 @@ void WorldSession::HandleBuyStableSlot( WorldPacket & recv_data )
WorldPacket data(SMSG_STABLE_RESULT, 200);
- if(GetPlayer()->m_stableSlots < 2) // max slots amount = 2
+ if(GetPlayer()->m_stableSlots < 4) // max slots amount = 4
{
StableSlotPricesEntry const *SlotPrice = sStableSlotPricesStore.LookupEntry(GetPlayer()->m_stableSlots+1);
if(_player->GetMoney() >= SlotPrice->Price)
diff --git a/src/game/NPCHandler.h b/src/game/NPCHandler.h
index e359878173f..4d0395a0c87 100644
--- a/src/game/NPCHandler.h
+++ b/src/game/NPCHandler.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -60,7 +60,6 @@ struct GossipTextOption
struct GossipText
{
- uint32 Text_ID;
GossipTextOption Options[8];
};
diff --git a/src/game/NullCreatureAI.cpp b/src/game/NullCreatureAI.cpp
index 0814e348a80..33218251718 100644
--- a/src/game/NullCreatureAI.cpp
+++ b/src/game/NullCreatureAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/NullCreatureAI.h b/src/game/NullCreatureAI.h
index 3c9c35cdc9d..671e9ea63ab 100644
--- a/src/game/NullCreatureAI.h
+++ b/src/game/NullCreatureAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 62ad688e52e..080a6af41de 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -58,8 +58,9 @@ uint32 GuidHigh2TypeId(uint32 guid_hi)
case HIGHGUID_DYNAMICOBJECT:return TYPEID_DYNAMICOBJECT;
case HIGHGUID_CORPSE: return TYPEID_CORPSE;
case HIGHGUID_MO_TRANSPORT: return TYPEID_GAMEOBJECT;
+ case HIGHGUID_VEHICLE: return TYPEID_UNIT;
}
- return 10; // unknown
+ return MAX_TYPEID; // unknown
}
Object::Object( )
@@ -146,15 +147,9 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
/** lower flag1 **/
if(target == this) // building packet for oneself
- {
flags |= UPDATEFLAG_SELF;
- /*** temporary reverted - until real source of stack corruption will not found
- updatetype = UPDATETYPE_CREATE_OBJECT2;
- ****/
- }
-
- if(flags & UPDATEFLAG_HASPOSITION)
+ if(flags & UPDATEFLAG_HAS_POSITION)
{
// UPDATETYPE_CREATE_OBJECT2 dynamic objects, corpses...
if(isType(TYPEMASK_DYNAMICOBJECT) || isType(TYPEMASK_CORPSE) || isType(TYPEMASK_PLAYER))
@@ -180,6 +175,12 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
break;
}
}
+
+ if(isType(TYPEMASK_UNIT))
+ {
+ if(((Unit*)this)->getVictim())
+ flags |= UPDATEFLAG_HAS_TARGET;
+ }
}
//sLog.outDebug("BuildCreateUpdate: update-type: %u, object-type: %u got flags: %X, flags2: %X", updatetype, m_objectTypeId, flags, flags2);
@@ -251,11 +252,18 @@ void Object::DestroyForPlayer(Player *target) const
WorldPacket data(SMSG_DESTROY_OBJECT, 8);
data << GetGUID();
+ data << uint8(0); // WotLK (bool)
target->GetSession()->SendPacket( &data );
}
-void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2 ) const
+void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) const
{
+ uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0);
+
+ if(GetTypeId() == TYPEID_UNIT)
+ if(((Creature*)this)->isVehicle())
+ unk_flags |= 0x20; // always allow pitch
+
*data << (uint8)flags; // update flags
// 0x20
@@ -292,12 +300,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
}
*data << uint32(flags2); // movement flags
- *data << uint8(0); // unk 2.3.0
+ *data << uint16(unk_flags); // unknown 2.3.0
*data << uint32(getMSTime()); // time (in milliseconds)
}
// 0x40
- if (flags & UPDATEFLAG_HASPOSITION)
+ if (flags & UPDATEFLAG_HAS_POSITION)
{
// 0x02
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT)
@@ -330,12 +338,13 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
*data << (float)((Player*)this)->GetTransOffsetZ();
*data << (float)((Player*)this)->GetTransOffsetO();
*data << (uint32)((Player*)this)->GetTransTime();
+ *data << (int8)((Player*)this)->GetTransSeat();
}
//TrinIty currently not have support for other than player on transport
}
// 0x02200000
- if(flags2 & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))
+ if((flags2 & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (unk_flags & 0x20))
{
if(GetTypeId() == TYPEID_PLAYER)
*data << (float)((Player*)this)->m_movementInfo.s_pitch;
@@ -384,6 +393,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
*data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT );
*data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT_BACK );
*data << ((Unit*)this)->GetSpeed( MOVE_TURN_RATE );
+ *data << ((Unit*)this)->GetSpeed( MOVE_PITCH_RATE );
// 0x08000000
if(flags2 & MOVEMENTFLAG_SPLINE2)
@@ -448,6 +458,8 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
*data << path.GetNodes()[i].z;
}
+ *data << uint8(0); // added in 3.0.8
+
/*for(uint32 i = 0; i < poscount; i++)
{
// path points
@@ -485,7 +497,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
break;
case TYPEID_PLAYER:
if(flags & UPDATEFLAG_SELF)
- *data << uint32(0x00000015); // unk, can be 0x15 or 0x22
+ *data << uint32(0x0000002F); // unk, can be 0x15 or 0x22
else
*data << uint32(0x00000008); // unk, can be 0x7 or 0x8
break;
@@ -508,6 +520,15 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
case TYPEID_CORPSE:
*data << uint32(GetGUIDHigh()); // GetGUIDHigh()
break;
+ case TYPEID_UNIT:
+ *data << uint32(0x0000000B); // unk, can be 0xB or 0xC
+ break;
+ case TYPEID_PLAYER:
+ if(flags & UPDATEFLAG_SELF)
+ *data << uint32(0x0000002F); // unk, can be 0x15 or 0x22
+ else
+ *data << uint32(0x00000008); // unk, can be 0x7 or 0x8
+ break;
default:
*data << uint32(0x00000000); // unk
break;
@@ -515,9 +536,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
}
// 0x4
- if(flags & UPDATEFLAG_FULLGUID)
+ if(flags & UPDATEFLAG_HAS_TARGET) // packed guid (current target guid)
{
- *data << uint8(0); // packed guid (probably target guid)
+ if(Unit *victim = ((Unit*)this)->getVictim())
+ data->append(victim->GetPackGUID());
+ else
+ *data << uint8(0);
}
// 0x2
@@ -525,6 +549,13 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
{
*data << uint32(getMSTime()); // ms time
}
+
+ // 0x80
+ if(flags & UPDATEFLAG_VEHICLE) // unused for now
+ {
+ *data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id
+ *data << float(0); // facing adjustment
+ }
}
void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const
@@ -540,10 +571,10 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if ( ((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
{
IsActivateToQuest = true;
- updateMask->SetBit(GAMEOBJECT_DYN_FLAGS);
+ updateMask->SetBit(GAMEOBJECT_DYNAMIC);
}
- if (GetUInt32Value(GAMEOBJECT_ARTKIT))
- updateMask->SetBit(GAMEOBJECT_ARTKIT);
+ if (((GameObject*)this)->GetGoArtKit())
+ updateMask->SetBit(GAMEOBJECT_BYTES_1);
}
}
else //case UPDATETYPE_VALUES
@@ -554,8 +585,8 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
{
IsActivateToQuest = true;
}
- updateMask->SetBit(GAMEOBJECT_DYN_FLAGS);
- updateMask->SetBit(GAMEOBJECT_ANIMPROGRESS);
+ updateMask->SetBit(GAMEOBJECT_DYNAMIC);
+ updateMask->SetBit(GAMEOBJECT_BYTES_1);
}
}
@@ -572,7 +603,6 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if( updateMask->GetBit( index ) )
{
// remove custom flag before send
-
if( index == UNIT_NPC_FLAGS )
*data << uint32(m_uint32Values[ index ] & ~(UNIT_NPC_FLAG_GUARD + UNIT_NPC_FLAG_OUTDOORPVP));
// FIXME: Some values at server stored in float format but must be sent to client in uint32 format
@@ -673,7 +703,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if( updateMask->GetBit( index ) )
{
// send in current format (float as float, uint32 as uint32)
- if ( index == GAMEOBJECT_DYN_FLAGS )
+ if ( index == GAMEOBJECT_DYNAMIC )
{
if(IsActivateToQuest )
{
@@ -1054,6 +1084,9 @@ bool Object::PrintIndexError(uint32 index, bool set) const
}
WorldObject::WorldObject()
+ : m_mapId(0), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL),
+ m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f),
+ mSemaphoreTeleport(false)
{
m_positionX = 0.0f;
m_positionY = 0.0f;
@@ -1109,26 +1142,27 @@ void WorldObject::setActive( bool on )
}
}
-void WorldObject::_Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid )
+void WorldObject::_Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask )
{
Object::_Create(guidlow, 0, guidhigh);
m_mapId = mapid;
+ m_phaseMask = phaseMask;
}
uint32 WorldObject::GetZoneId() const
{
- return MapManager::Instance().GetBaseMap(m_mapId)->GetZoneId(m_positionX,m_positionY);
+ return MapManager::Instance().GetBaseMap(m_mapId)->GetZoneId(m_positionX,m_positionY,m_positionZ);
}
uint32 WorldObject::GetAreaId() const
{
- return MapManager::Instance().GetBaseMap(m_mapId)->GetAreaId(m_positionX,m_positionY);
+ return MapManager::Instance().GetBaseMap(m_mapId)->GetAreaId(m_positionX,m_positionY,m_positionZ);
}
InstanceData* WorldObject::GetInstanceData()
{
- Map *map = MapManager::Instance().GetMap(m_mapId, this);
+ Map *map = GetMap();
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL;
}
@@ -1355,50 +1389,17 @@ void Object::ForceValuesUpdateAtIndex(uint32 i)
namespace Trinity
{
- class MessageChatLocaleCacheDo
+ class MonsterChatBuilder
{
public:
- MessageChatLocaleCacheDo(WorldObject const& obj, ChatMsg msgtype, int32 textId, uint32 language, uint64 targetGUID, float dist)
- : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(language),
- i_targetGUID(targetGUID), i_dist(dist)
+ MonsterChatBuilder(WorldObject const& obj, ChatMsg msgtype, int32 textId, uint32 language, uint64 targetGUID)
+ : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(language), i_targetGUID(targetGUID) {}
+ void operator()(WorldPacket& data, int32 loc_idx)
{
- }
+ char const* text = objmgr.GetMangosString(i_textId,loc_idx);
- ~MessageChatLocaleCacheDo()
- {
- for(int i = 0; i < i_data_cache.size(); ++i)
- delete i_data_cache[i];
- }
-
- void operator()(Player* p)
- {
- // skip far away players
- if(p->GetDistance(&i_object) > i_dist)
- return;
-
- uint32 loc_idx = p->GetSession()->GetSessionDbLocaleIndex();
- uint32 cache_idx = loc_idx+1;
- WorldPacket* data;
-
- // create if not cached yet
- if(i_data_cache.size() < cache_idx+1 || !i_data_cache[cache_idx])
- {
- if(i_data_cache.size() < cache_idx+1)
- i_data_cache.resize(cache_idx+1);
-
- char const* text = objmgr.GetTrinityString(i_textId,loc_idx);
-
- data = new WorldPacket(SMSG_MESSAGECHAT, 200);
-
- // TODO: i_object.GetName() also must be localized?
- i_object.BuildMonsterChat(data,i_msgtype,text,i_language,i_object.GetNameForLocaleIdx(loc_idx),i_targetGUID);
-
- i_data_cache[cache_idx] = data;
- }
- else
- data = i_data_cache[cache_idx];
-
- p->SendDirectMessage(data);
+ // TODO: i_object.GetName() also must be localized?
+ i_object.BuildMonsterChat(&data,i_msgtype,text,i_language,i_object.GetNameForLocaleIdx(loc_idx),i_targetGUID);
}
private:
@@ -1407,8 +1408,6 @@ namespace Trinity
int32 i_textId;
uint32 i_language;
uint64 i_targetGUID;
- float i_dist;
- std::vector<WorldPacket*> i_data_cache; // 0 = default, i => i-1 locale index
};
} // namespace Trinity
@@ -1420,9 +1419,10 @@ void WorldObject::MonsterSay(int32 textId, uint32 language, uint64 TargetGuid)
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Trinity::MessageChatLocaleCacheDo say_do(*this, CHAT_MSG_MONSTER_SAY, textId,language,TargetGuid,sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY));
- Trinity::PlayerWorker<Trinity::MessageChatLocaleCacheDo> say_worker(say_do);
- TypeContainerVisitor<Trinity::PlayerWorker<Trinity::MessageChatLocaleCacheDo>, WorldTypeMapContainer > message(say_worker);
+ MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_SAY, textId,language,TargetGuid);
+ MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
+ MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,sWorld.getConfig(CONFIG_LISTEN_RANGE_SAY),say_do);
+ TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
CellLock<GridReadGuard> cell_lock(cell, p);
cell_lock->Visit(cell_lock, message, *GetMap());
}
@@ -1435,9 +1435,10 @@ void WorldObject::MonsterYell(int32 textId, uint32 language, uint64 TargetGuid)
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Trinity::MessageChatLocaleCacheDo say_do(*this, CHAT_MSG_MONSTER_YELL, textId,language,TargetGuid,sWorld.getConfig(CONFIG_LISTEN_RANGE_YELL));
- Trinity::PlayerWorker<Trinity::MessageChatLocaleCacheDo> say_worker(say_do);
- TypeContainerVisitor<Trinity::PlayerWorker<Trinity::MessageChatLocaleCacheDo>, WorldTypeMapContainer > message(say_worker);
+ MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_YELL, textId,language,TargetGuid);
+ MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
+ MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,sWorld.getConfig(CONFIG_LISTEN_RANGE_YELL),say_do);
+ TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
CellLock<GridReadGuard> cell_lock(cell, p);
cell_lock->Visit(cell_lock, message, *GetMap());
}
@@ -1450,9 +1451,10 @@ void WorldObject::MonsterTextEmote(int32 textId, uint64 TargetGuid, bool IsBossE
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
- Trinity::MessageChatLocaleCacheDo say_do(*this, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, textId,LANG_UNIVERSAL,TargetGuid,sWorld.getConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
- Trinity::PlayerWorker<Trinity::MessageChatLocaleCacheDo> say_worker(say_do);
- TypeContainerVisitor<Trinity::PlayerWorker<Trinity::MessageChatLocaleCacheDo>, WorldTypeMapContainer > message(say_worker);
+ MaNGOS::MonsterChatBuilder say_build(*this, IsBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, textId,LANG_UNIVERSAL,TargetGuid);
+ MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
+ MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> > say_worker(this,sWorld.getConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE),say_do);
+ TypeContainerVisitor<MaNGOS::PlayerDistWorker<MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> >, WorldTypeMapContainer > message(say_worker);
CellLock<GridReadGuard> cell_lock(cell, p);
cell_lock->Visit(cell_lock, message, *GetMap());
}
@@ -1467,7 +1469,7 @@ void WorldObject::MonsterWhisper(int32 textId, uint64 receiver, bool IsBossWhisp
char const* text = objmgr.GetTrinityString(textId,loc_idx);
WorldPacket data(SMSG_MESSAGECHAT, 200);
- BuildMonsterChat(&data,IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER,text,LANG_UNIVERSAL,GetName(),receiver);
+ BuildMonsterChat(&data,IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER,text,LANG_UNIVERSAL,GetNameForLocaleIdx(loc_idx),receiver);
player->GetSession()->SendPacket(&data);
}
@@ -1504,7 +1506,7 @@ void WorldObject::BuildHeartBeatMsg(WorldPacket *data) const
data->Initialize(MSG_MOVE_HEARTBEAT, 32);
data->append(GetPackGUID());
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint8(0); // 2.3.0
+ *data << uint16(0); // 2.3.0
*data << getMSTime(); // time
*data << m_positionX;
*data << m_positionY;
@@ -1523,7 +1525,7 @@ void WorldObject::BuildTeleportAckMsg(WorldPacket *data, float x, float y, float
data->append(GetPackGUID());
*data << uint32(0); // this value increments every time
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint8(0); // 2.3.0
+ *data << uint16(0); // 2.3.0
*data << getMSTime(); // time
*data << x;
*data << y;
@@ -1579,7 +1581,7 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa
if (GetTypeId()==TYPEID_PLAYER)
team = ((Player*)this)->GetTeam();
- if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), GetMap(), id, team))
+ if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), GetMap(), GetPhaseMask(), id, team))
{
delete pCreature;
return NULL;
@@ -1648,7 +1650,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy
Map *map = GetMap();
uint32 pet_number = objmgr.GeneratePetNumber();
- if(!pet->Create(objmgr.GenerateLowGuid(HIGHGUID_PET), map, entry, pet_number))
+ if(!pet->Create(objmgr.GenerateLowGuid(HIGHGUID_PET), map, GetPhaseMask(), entry, pet_number))
{
sLog.outError("no such creature entry %u", entry);
delete pet;
@@ -1726,17 +1728,16 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float
{
if(!IsInWorld())
return NULL;
- Map * map = GetMap();
- if(!map)
- return NULL;
+
GameObjectInfo const* goinfo = objmgr.GetGameObjectInfo(entry);
if(!goinfo)
{
sLog.outErrorDb("Gameobject template %u not found in database!", entry);
return NULL;
}
+ Map *map = GetMap();
GameObject *go = new GameObject();
- if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),entry,map,x,y,z,ang,rotation0,rotation1,rotation2,rotation3,100,1))
+ if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), entry, map, GetPhaseMask(), x,y,z,ang,rotation0,rotation1,rotation2,rotation3,100,1))
return NULL;
go->SetRespawnTime(respawnTime);
if(GetTypeId()==TYPEID_PLAYER || GetTypeId()==TYPEID_UNIT) //not sure how to handle this
@@ -1795,5 +1796,10 @@ void WorldObject::GetGroundPoint(float &x, float &y, float &z, float dist, float
UpdateGroundPositionZ(x, y, z);
}
+void WorldObject::SetPhaseMask(uint32 newPhaseMask, bool update)
+{
+ m_phaseMask = newPhaseMask;
-
+ if(update && IsInWorld())
+ ObjectAccessor::UpdateObjectVisibility(this);
+}
diff --git a/src/game/Object.h b/src/game/Object.h
index c6d5f73f3ed..bf88c4dd2dc 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -56,7 +56,8 @@ enum TypeMask
TYPEMASK_DYNAMICOBJECT = 0x0040,
TYPEMASK_CORPSE = 0x0080,
TYPEMASK_AIGROUP = 0x0100,
- TYPEMASK_AREATRIGGER = 0x0200
+ TYPEMASK_AREATRIGGER = 0x0200,
+ TYPEMASK_FARSIGHTOBJ = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
};
enum TypeID
@@ -72,6 +73,7 @@ enum TypeID
TYPEID_AIGROUP = 8,
TYPEID_AREATRIGGER = 9
};
+#define MAX_TYPEID 10
uint32 GuidHigh2TypeId(uint32 guid_hi);
@@ -87,6 +89,12 @@ enum TempSummonType
TEMPSUMMON_MANUAL_DESPAWN = 8 // despawns when UnSummon() is called
};
+enum PhaseMasks
+{
+ PHASEMASK_NORMAL = 0x00000001,
+ PHASEMASK_ANYWHERE = 0xFFFFFFFF
+};
+
class WorldPacket;
class UpdateData;
class ByteBuffer;
@@ -354,7 +362,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object
virtual void Update ( uint32 /*time_diff*/ ) { }
- void _Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid );
+ void _Create( uint32 guidlow, HighGuid guidhigh, uint32 mapid, uint32 phaseMask);
void Relocate(float x, float y, float z, float orientation)
{
@@ -416,9 +424,13 @@ class TRINITY_DLL_SPEC WorldObject : public Object
void GetRandomPoint( float x, float y, float z, float distance, float &rand_x, float &rand_y, float &rand_z ) const;
void SetMapId(uint32 newMap) { m_mapId = newMap; }
-
uint32 GetMapId() const { return m_mapId; }
+ virtual void SetPhaseMask(uint32 newPhaseMask, bool update);
+ uint32 GetPhaseMask() const { return m_phaseMask; }
+ bool InSamePhase(WorldObject const* obj) const { return InSamePhase(obj->GetPhaseMask()); }
+ bool InSamePhase(uint32 phasemask) const { return (GetPhaseMask() & phasemask); }
+
uint32 GetZoneId() const;
uint32 GetAreaId() const;
@@ -435,7 +447,11 @@ class TRINITY_DLL_SPEC WorldObject : public Object
float GetDistance2d(const WorldObject* obj) const;
float GetDistance2d(const float x, const float y) const;
float GetDistanceZ(const WorldObject* obj) const;
- bool IsInMap(const WorldObject* obj) const { return GetMapId()==obj->GetMapId() && GetInstanceId()==obj->GetInstanceId(); }
+ bool IsInMap(const WorldObject* obj) const
+ {
+ return IsInWorld() && obj->IsInWorld() && GetMapId()==obj->GetMapId() &&
+ GetInstanceId()==obj->GetInstanceId() && InSamePhase(obj);
+ }
bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare, const bool is3D = true) const;
bool IsWithinLOS(const float x, const float y, const float z ) const;
bool IsWithinLOSInMap(const WorldObject* obj) const;
@@ -496,7 +512,9 @@ class TRINITY_DLL_SPEC WorldObject : public Object
bool m_isActive;
private:
- uint32 m_mapId;
+ uint32 m_mapId; // object at map with map_id
+ uint32 m_InstanceId; // in map copy with instance id
+ uint32 m_phaseMask; // in area phase state
float m_positionX;
float m_positionY;
@@ -504,8 +522,6 @@ class TRINITY_DLL_SPEC WorldObject : public Object
float m_orientation;
bool mSemaphoreTeleport;
-
- uint32 m_InstanceId;
};
#endif
diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp
index 5ad5f036813..e832aec0c57 100644
--- a/src/game/ObjectAccessor.cpp
+++ b/src/game/ObjectAccessor.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -38,6 +38,7 @@
#include "Opcodes.h"
#include "ObjectDefines.h"
#include "MapInstanced.h"
+#include "World.h"
#include <cmath>
@@ -45,38 +46,6 @@
INSTANTIATE_SINGLETON_2(ObjectAccessor, CLASS_LOCK);
INSTANTIATE_CLASS_MUTEX(ObjectAccessor, ZThread::FastMutex);
-namespace Trinity
-{
- struct TRINITY_DLL_DECL BuildUpdateForPlayer
- {
- Player &i_player;
- UpdateDataMapType &i_updatePlayers;
-
- BuildUpdateForPlayer(Player &player, UpdateDataMapType &data_map) : i_player(player), i_updatePlayers(data_map) {}
-
- void Visit(PlayerMapType &m)
- {
- for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
- {
- if( iter->getSource() == &i_player )
- continue;
-
- UpdateDataMapType::iterator iter2 = i_updatePlayers.find(iter->getSource());
- if( iter2 == i_updatePlayers.end() )
- {
- std::pair<UpdateDataMapType::iterator, bool> p = i_updatePlayers.insert( ObjectAccessor::UpdateDataValueType(iter->getSource(), UpdateData()) );
- assert(p.second);
- iter2 = p.first;
- }
-
- i_player.BuildValuesUpdateBlockForPlayer(&iter2->second, iter2->first);
- }
- }
-
- template<class SKIP> void Visit(GridRefManager<SKIP> &) {}
- };
-}
-
ObjectAccessor::ObjectAccessor() {}
ObjectAccessor::~ObjectAccessor() {}
@@ -129,11 +98,14 @@ ObjectAccessor::GetNPCIfCanInteractWith(Player const &player, uint64 guid, uint3
}
Creature*
-ObjectAccessor::GetCreatureOrPet(WorldObject const &u, uint64 guid)
+ObjectAccessor::GetCreatureOrPetOrVehicle(WorldObject const &u, uint64 guid)
{
if(Creature *unit = GetPet(guid))
return unit;
+ if(Creature *unit = GetVehicle(guid))
+ return unit;
+
return GetCreature(u, guid);
}
@@ -162,18 +134,23 @@ ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid)
if(IS_PLAYER_GUID(guid))
return FindPlayer(guid);
- return GetCreatureOrPet(u, guid);
+ return GetCreatureOrPetOrVehicle(u, guid);
}
Corpse*
ObjectAccessor::GetCorpse(WorldObject const &u, uint64 guid)
{
Corpse * ret = GetObjectInWorld(guid, (Corpse*)NULL);
- if(ret && ret->GetMapId() != u.GetMapId()) ret = NULL;
+ if(!ret)
+ return NULL;
+ if(ret->GetMapId() != u.GetMapId())
+ return NULL;
+ if(ret->GetInstanceId() != u.GetInstanceId())
+ return NULL;
return ret;
}
-Object* ObjectAccessor::GetObjectByTypeMask(Player const &p, uint64 guid, uint32 typemask)
+Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const &p, uint64 guid, uint32 typemask)
{
Object *obj = NULL;
@@ -185,7 +162,7 @@ Object* ObjectAccessor::GetObjectByTypeMask(Player const &p, uint64 guid, uint32
if(typemask & TYPEMASK_UNIT)
{
- obj = GetCreatureOrPet(p,guid);
+ obj = GetCreatureOrPetOrVehicle(p,guid);
if(obj) return obj;
}
@@ -201,9 +178,9 @@ Object* ObjectAccessor::GetObjectByTypeMask(Player const &p, uint64 guid, uint32
if(obj) return obj;
}
- if(typemask & TYPEMASK_ITEM)
+ if(typemask & TYPEMASK_ITEM && p.GetTypeId() == TYPEID_PLAYER)
{
- obj = p.GetItemByGuid( guid );
+ obj = ((Player const &)p).GetItemByGuid( guid );
if(obj) return obj;
}
@@ -214,15 +191,25 @@ GameObject*
ObjectAccessor::GetGameObject(WorldObject const &u, uint64 guid)
{
GameObject * ret = GetObjectInWorld(guid, (GameObject*)NULL);
- if(ret && ret->GetMapId() != u.GetMapId()) ret = NULL;
+ if(!ret)
+ return NULL;
+ if(ret->GetMapId() != u.GetMapId())
+ return NULL;
+ if(ret->GetInstanceId() != u.GetInstanceId())
+ return NULL;
return ret;
}
DynamicObject*
-ObjectAccessor::GetDynamicObject(Unit const &u, uint64 guid)
+ObjectAccessor::GetDynamicObject(WorldObject const &u, uint64 guid)
{
DynamicObject * ret = GetObjectInWorld(guid, (DynamicObject*)NULL);
- if(ret && ret->GetMapId() != u.GetMapId()) ret = NULL;
+ if(!ret)
+ return NULL;
+ if(ret->GetMapId() != u.GetMapId())
+ return NULL;
+ if(ret->GetInstanceId() != u.GetInstanceId())
+ return NULL;
return ret;
}
@@ -273,22 +260,6 @@ ObjectAccessor::UpdateObject(Object* obj, Player* exceptPlayer)
}
void
-ObjectAccessor::AddUpdateObject(Object *obj)
-{
- Guard guard(i_updateGuard);
- i_objects.insert(obj);
-}
-
-void
-ObjectAccessor::RemoveUpdateObject(Object *obj)
-{
- Guard guard(i_updateGuard);
- std::set<Object *>::iterator iter = i_objects.find(obj);
- if( iter != i_objects.end() )
- i_objects.erase( iter );
-}
-
-void
ObjectAccessor::_buildUpdateObject(Object *obj, UpdateDataMapType &update_players)
{
bool build_for_all = true;
@@ -351,6 +322,12 @@ ObjectAccessor::GetPet(uint64 guid)
return GetObjectInWorld(guid, (Pet*)NULL);
}
+Vehicle*
+ObjectAccessor::GetVehicle(uint64 guid)
+{
+ return GetObjectInWorld(guid, (Vehicle*)NULL);
+}
+
Corpse*
ObjectAccessor::GetCorpseForPlayerGUID(uint64 guid)
{
@@ -423,7 +400,7 @@ ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* ma
}
Corpse*
-ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid)
+ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
{
Corpse *corpse = GetCorpseForPlayerGUID(player_guid);
if(!corpse)
@@ -449,7 +426,10 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid)
Corpse *bones = NULL;
// create the bones only if the map and the grid is loaded at the corpse's location
- if(map && !map->IsRemovalGrid(corpse->GetPositionX(), corpse->GetPositionY()))
+ // ignore bones creating option in case insignia
+ if (map && (insignia ||
+ (map->IsBattleGroundOrArena() ? sWorld.getConfig(CONFIG_DEATH_BONES_BG_OR_ARENA) : sWorld.getConfig(CONFIG_DEATH_BONES_WORLD))) &&
+ !map->IsRemovalGrid(corpse->GetPositionX(), corpse->GetPositionY()))
{
// Create bones, don't change Corpse
bones = new Corpse;
@@ -465,6 +445,7 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid)
bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());
bones->SetMapId(corpse->GetMapId());
bones->SetInstanceId(corpse->GetInstanceId());
+ bones->SetPhaseMask(corpse->GetPhaseMask(),false);
bones->SetUInt32Value(CORPSE_FIELD_FLAGS, CORPSE_FLAG_UNK2 | CORPSE_FLAG_BONES);
bones->SetUInt64Value(CORPSE_FIELD_OWNER, 0);
@@ -602,6 +583,7 @@ template <class T> ZThread::FastMutex HashMapHolder<T>::i_lock;
template class HashMapHolder<Player>;
template class HashMapHolder<Pet>;
+template class HashMapHolder<Vehicle>;
template class HashMapHolder<GameObject>;
template class HashMapHolder<DynamicObject>;
template class HashMapHolder<Creature>;
@@ -609,6 +591,7 @@ template class HashMapHolder<Corpse>;
template Player* ObjectAccessor::GetObjectInWorld<Player>(uint32 mapid, float x, float y, uint64 guid, Player* /*fake*/);
template Pet* ObjectAccessor::GetObjectInWorld<Pet>(uint32 mapid, float x, float y, uint64 guid, Pet* /*fake*/);
+template Vehicle* ObjectAccessor::GetObjectInWorld<Vehicle>(uint32 mapid, float x, float y, uint64 guid, Vehicle* /*fake*/);
template Creature* ObjectAccessor::GetObjectInWorld<Creature>(uint32 mapid, float x, float y, uint64 guid, Creature* /*fake*/);
template Corpse* ObjectAccessor::GetObjectInWorld<Corpse>(uint32 mapid, float x, float y, uint64 guid, Corpse* /*fake*/);
template GameObject* ObjectAccessor::GetObjectInWorld<GameObject>(uint32 mapid, float x, float y, uint64 guid, GameObject* /*fake*/);
diff --git a/src/game/ObjectAccessor.h b/src/game/ObjectAccessor.h
index bbfc06b78b6..c6144ec4d5b 100644
--- a/src/game/ObjectAccessor.h
+++ b/src/game/ObjectAccessor.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -33,6 +33,7 @@
#include "GridDefines.h"
#include "Object.h"
#include "Player.h"
+#include "Vehicle.h"
#include <set>
@@ -58,9 +59,7 @@ class HashMapHolder
static void Remove(T* o)
{
Guard guard(i_lock);
- typename MapType::iterator itr = m_objectMap.find(o->GetGUID());
- if (itr != m_objectMap.end())
- m_objectMap.erase(itr);
+ m_objectMap.erase(o->GetGUID());
}
static T* Find(uint64 guid)
@@ -139,17 +138,18 @@ class TRINITY_DLL_DECL ObjectAccessor : public Trinity::Singleton<ObjectAccessor
else return NULL;
}
- static Object* GetObjectByTypeMask(Player const &, uint64, uint32 typemask);
+ static Object* GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask);
static Creature* GetNPCIfCanInteractWith(Player const &player, uint64 guid, uint32 npcflagmask);
static Creature* GetCreature(WorldObject const &, uint64);
- static Creature* GetCreatureOrPet(WorldObject const &, uint64);
+ static Creature* GetCreatureOrPetOrVehicle(WorldObject const &, uint64);
static Unit* GetUnit(WorldObject const &, uint64);
static Pet* GetPet(Unit const &, uint64 guid) { return GetPet(guid); }
static Player* GetPlayer(Unit const &, uint64 guid) { return FindPlayer(guid); }
static GameObject* GetGameObject(WorldObject const &, uint64);
- static DynamicObject* GetDynamicObject(Unit const &, uint64);
+ static DynamicObject* GetDynamicObject(WorldObject const &, uint64);
static Corpse* GetCorpse(WorldObject const &u, uint64 guid);
static Pet* GetPet(uint64 guid);
+ static Vehicle* GetVehicle(uint64 guid);
static Player* FindPlayer(uint64);
Player* FindPlayerByName(const char *name) ;
@@ -174,16 +174,22 @@ class TRINITY_DLL_DECL ObjectAccessor : public Trinity::Singleton<ObjectAccessor
HashMapHolder<Player>::Remove(pl);
Guard guard(i_updateGuard);
-
- std::set<Object *>::iterator iter2 = std::find(i_objects.begin(), i_objects.end(), (Object *)pl);
- if( iter2 != i_objects.end() )
- i_objects.erase(iter2);
+ i_objects.erase((Object *)pl);
}
void SaveAllPlayers();
- void AddUpdateObject(Object *obj);
- void RemoveUpdateObject(Object *obj);
+ void AddUpdateObject(Object *obj)
+ {
+ Guard guard(i_updateGuard);
+ i_objects.insert(obj);
+ }
+
+ void RemoveUpdateObject(Object *obj)
+ {
+ Guard guard(i_updateGuard);
+ i_objects.erase( obj );
+ }
void Update(uint32 diff);
void UpdatePlayers(uint32 diff);
@@ -192,7 +198,7 @@ class TRINITY_DLL_DECL ObjectAccessor : public Trinity::Singleton<ObjectAccessor
void RemoveCorpse(Corpse *corpse);
void AddCorpse(Corpse* corpse);
void AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* map);
- Corpse* ConvertCorpseForPlayer(uint64 player_guid);
+ Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false);
static void UpdateObject(Object* obj, Player* exceptPlayer);
static void _buildUpdateObject(Object* obj, UpdateDataMapType &);
diff --git a/src/game/ObjectDefines.h b/src/game/ObjectDefines.h
index 53a0174ba2f..ee58e8a5f34 100644
--- a/src/game/ObjectDefines.h
+++ b/src/game/ObjectDefines.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -41,6 +41,7 @@ enum HighGuid
HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
HIGHGUID_UNIT = 0xF130, // blizz F130
HIGHGUID_PET = 0xF140, // blizz F140
+ HIGHGUID_VEHICLE = 0xF150, // blizz F550
HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
HIGHGUID_CORPSE = 0xF101, // blizz F100
HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
@@ -50,6 +51,7 @@ enum HighGuid
#define IS_CREATURE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_UNIT )
#define IS_PET_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PET )
+#define IS_VEHICLE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_VEHICLE )
#define IS_CREATURE_OR_PET_GUID(Guid)( IS_CREATURE_GUID(Guid) || IS_PET_GUID(Guid) )
#define IS_PLAYER_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PLAYER && Guid!=0 )
#define IS_UNIT_GUID(Guid) ( IS_CREATURE_OR_PET_GUID(Guid) || IS_PLAYER_GUID(Guid) )
@@ -87,6 +89,7 @@ inline bool IsGuidHaveEnPart(uint64 const& guid)
case HIGHGUID_TRANSPORT:
case HIGHGUID_UNIT:
case HIGHGUID_PET:
+ case HIGHGUID_VEHICLE:
case HIGHGUID_MO_TRANSPORT:
default:
return true;
@@ -106,6 +109,7 @@ inline char const* GetLogNameForGuid(uint64 guid)
case HIGHGUID_TRANSPORT: return "transport";
case HIGHGUID_UNIT: return "creature";
case HIGHGUID_PET: return "pet";
+ case HIGHGUID_VEHICLE: return "vehicle";
case HIGHGUID_DYNAMICOBJECT:return "dynobject";
case HIGHGUID_CORPSE: return "corpse";
case HIGHGUID_MO_TRANSPORT: return "mo_transport";
diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp
index 14b1865cfa7..38083d02306 100644
--- a/src/game/ObjectGridLoader.cpp
+++ b/src/game/ObjectGridLoader.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -59,7 +59,7 @@ ObjectGridRespawnMover::Visit(CreatureMapType &m)
Creature * c = iter->getSource();
- assert(!c->isPet() && "ObjectGridRespawnMover don't must be called for pets");
+ assert((!c->isPet() || !c->isVehicle()) && "ObjectGridRespawnMover don't must be called for pets");
Cell const& cur_cell = c->GetCurrentCell();
diff --git a/src/game/ObjectGridLoader.h b/src/game/ObjectGridLoader.h
index d076d0ba29b..7b5c827b7ea 100644
--- a/src/game/ObjectGridLoader.h
+++ b/src/game/ObjectGridLoader.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 55af142a094..34cfa48c917 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -22,6 +22,7 @@
#include "Database/DatabaseEnv.h"
#include "Database/SQLStorage.h"
#include "Database/SQLStorageImpl.h"
+#include "Policies/SingletonImp.h"
#include "Log.h"
#include "MapManager.h"
@@ -35,7 +36,6 @@
#include "ArenaTeam.h"
#include "Transports.h"
#include "ProgressBar.h"
-#include "Policies/SingletonImp.h"
#include "Language.h"
#include "GameEvent.h"
#include "Spell.h"
@@ -46,6 +46,7 @@
#include "Util.h"
#include "WaypointManager.h"
#include "InstanceData.h" //for condition_instance_data
+#include "BattleGround.h"
INSTANTIATE_SINGLETON_1(ObjectMgr);
@@ -116,6 +117,7 @@ ObjectMgr::ObjectMgr()
m_hiCharGuid = 1;
m_hiCreatureGuid = 1;
m_hiPetGuid = 1;
+ m_hiVehicleGuid = 1;
m_hiItemGuid = 1;
m_hiGoGuid = 1;
m_hiDoGuid = 1;
@@ -123,9 +125,9 @@ ObjectMgr::ObjectMgr()
m_hiPetNumber = 1;
m_ItemTextId = 1;
m_mailid = 1;
- m_auctionid = 1;
m_guildId = 1;
m_arenaTeamId = 1;
+ m_auctionid = 1;
mGuildBankTabPrice.resize(GUILD_BANK_MAX_TABS);
mGuildBankTabPrice[0] = 100;
@@ -142,24 +144,10 @@ ObjectMgr::ObjectMgr()
ObjectMgr::~ObjectMgr()
{
for( QuestMap::iterator i = mQuestTemplates.begin( ); i != mQuestTemplates.end( ); ++i )
- {
delete i->second;
- }
- mQuestTemplates.clear( );
-
- for( GossipTextMap::iterator i = mGossipText.begin( ); i != mGossipText.end( ); ++i )
- {
- delete i->second;
- }
- mGossipText.clear( );
-
- mAreaTriggers.clear();
for(PetLevelInfoMap::iterator i = petInfo.begin( ); i != petInfo.end( ); ++i )
- {
delete[] i->second;
- }
- petInfo.clear();
// free only if loaded
for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
@@ -172,15 +160,16 @@ ObjectMgr::~ObjectMgr()
// free group and guild objects
for (GroupSet::iterator itr = mGroupSet.begin(); itr != mGroupSet.end(); ++itr)
delete (*itr);
- for (GuildSet::iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr)
- delete (*itr);
- for (CachePlayerInfoMap::iterator itr = m_mPlayerInfoMap.begin(); itr != m_mPlayerInfoMap.end(); ++itr)
+ for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
delete itr->second;
- for(ItemMap::iterator itr = mAitems.begin(); itr != mAitems.end(); ++itr)
+ for (CachePlayerInfoMap::iterator itr = m_mPlayerInfoMap.begin(); itr != m_mPlayerInfoMap.end(); ++itr)
delete itr->second;
+ //for(ItemMap::iterator itr = mAitems.begin(); itr != mAitems.end(); ++itr)
+ // delete itr->second;
+
for (CacheVendorItemMap::iterator itr = m_mCacheVendorItemMap.begin(); itr != m_mCacheVendorItemMap.end(); ++itr)
itr->second.Clear();
@@ -252,43 +241,53 @@ Group * ObjectMgr::GetGroupByLeader(const uint64 &guid) const
return NULL;
}
-Guild * ObjectMgr::GetGuildById(const uint32 GuildId) const
+Guild * ObjectMgr::GetGuildById(uint32 GuildId) const
{
- for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr)
- if ((*itr)->GetId() == GuildId)
- return *itr;
+ GuildMap::const_iterator itr = mGuildMap.find(GuildId);
+ if (itr != mGuildMap.end())
+ return itr->second;
return NULL;
}
Guild * ObjectMgr::GetGuildByName(const std::string& guildname) const
{
- for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr)
- if ((*itr)->GetName() == guildname)
- return *itr;
+ for(GuildMap::const_iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
+ if (itr->second->GetName() == guildname)
+ return itr->second;
return NULL;
}
-std::string ObjectMgr::GetGuildNameById(const uint32 GuildId) const
+std::string ObjectMgr::GetGuildNameById(uint32 GuildId) const
{
- for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr)
- if ((*itr)->GetId() == GuildId)
- return (*itr)->GetName();
+ GuildMap::const_iterator itr = mGuildMap.find(GuildId);
+ if (itr != mGuildMap.end())
+ return itr->second->GetName();
return "";
}
Guild* ObjectMgr::GetGuildByLeader(const uint64 &guid) const
{
- for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr)
- if( (*itr)->GetLeader() == guid)
- return *itr;
+ for(GuildMap::const_iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
+ if (itr->second->GetLeader() == guid)
+ return itr->second;
return NULL;
}
-ArenaTeam* ObjectMgr::GetArenaTeamById(const uint32 arenateamid) const
+void ObjectMgr::AddGuild(Guild* guild)
+{
+ mGuildMap[guild->GetId()] = guild;
+}
+
+void ObjectMgr::RemoveGuild(uint32 Id)
+{
+ mGuildMap.erase(Id);
+}
+
+ArenaTeam* ObjectMgr::GetArenaTeamById(uint32 arenateamid) const
{
ArenaTeamMap::const_iterator itr = mArenaTeamMap.find(arenateamid);
if (itr != mArenaTeamMap.end())
@@ -320,257 +319,9 @@ void ObjectMgr::AddArenaTeam(ArenaTeam* arenaTeam)
mArenaTeamMap[arenaTeam->GetId()] = arenaTeam;
}
-void ObjectMgr::RemoveArenaTeam(ArenaTeam* arenaTeam)
-{
- mArenaTeamMap.erase( arenaTeam->GetId() );
-}
-
-AuctionHouseObject * ObjectMgr::GetAuctionsMap( uint32 location )
-{
- switch ( location )
- {
- case 6: //horde
- return & mHordeAuctions;
- break;
- case 2: //alliance
- return & mAllianceAuctions;
- break;
- default: //neutral
- return & mNeutralAuctions;
- }
-}
-
-uint32 ObjectMgr::GetAuctionCut(uint32 location, uint32 highBid)
-{
- if (location == 7 && !sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
- return (uint32) (0.15f * highBid * sWorld.getRate(RATE_AUCTION_CUT));
- else
- return (uint32) (0.05f * highBid * sWorld.getRate(RATE_AUCTION_CUT));
-}
-
-uint32 ObjectMgr::GetAuctionDeposit(uint32 location, uint32 time, Item *pItem)
-{
- float percentance; // in 0..1
- if ( location == 7 && !sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
- percentance = 0.75f;
- else
- percentance = 0.15f;
-
- percentance *= sWorld.getRate(RATE_AUCTION_DEPOSIT);
-
- return uint32( percentance * pItem->GetProto()->SellPrice * pItem->GetCount() * (time / MIN_AUCTION_TIME ) );
-}
-
-/// the sum of outbid is (1% from current bid)*5, if bid is very small, it is 1c
-uint32 ObjectMgr::GetAuctionOutBid(uint32 currentBid)
-{
- uint32 outbid = (currentBid / 100) * 5;
- if (!outbid)
- outbid = 1;
- return outbid;
-}
-
-//does not clear ram
-void ObjectMgr::SendAuctionWonMail( AuctionEntry *auction )
-{
- Item *pItem = GetAItem(auction->item_guidlow);
- if(!pItem)
- return;
-
- uint64 bidder_guid = MAKE_NEW_GUID(auction->bidder, 0, HIGHGUID_PLAYER);
- Player *bidder = GetPlayer(bidder_guid);
-
- uint32 bidder_accId = 0;
-
- // data for gm.log
- if( sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
- {
- uint32 bidder_security = 0;
- std::string bidder_name;
- if (bidder)
- {
- bidder_accId = bidder->GetSession()->GetAccountId();
- bidder_security = bidder->GetSession()->GetSecurity();
- bidder_name = bidder->GetName();
- }
- else
- {
- bidder_accId = GetPlayerAccountIdByGUID(bidder_guid);
- bidder_security = accmgr.GetSecurity(bidder_accId);
-
- if(bidder_security > SEC_PLAYER ) // not do redundant DB requests
- {
- if(!GetPlayerNameByGUID(bidder_guid,bidder_name))
- bidder_name = GetTrinityStringForDBCLocale(LANG_UNKNOWN);
- }
- }
-
- if( bidder_security > SEC_PLAYER )
- {
- std::string owner_name;
- if(!GetPlayerNameByGUID(auction->owner,owner_name))
- owner_name = GetTrinityStringForDBCLocale(LANG_UNKNOWN);
-
- uint32 owner_accid = GetPlayerAccountIdByGUID(auction->owner);
-
- sLog.outCommand(bidder_accId,"GM %s (Account: %u) won item in auction: %s (Entry: %u Count: %u) and pay money: %u. Original owner %s (Account: %u)",
- bidder_name.c_str(),bidder_accId,pItem->GetProto()->Name1,pItem->GetEntry(),pItem->GetCount(),auction->bid,owner_name.c_str(),owner_accid);
- }
- }
- else if(!bidder)
- bidder_accId = GetPlayerAccountIdByGUID(bidder_guid);
-
- // receiver exist
- if(bidder || bidder_accId)
- {
- std::ostringstream msgAuctionWonSubject;
- msgAuctionWonSubject << auction->item_template << ":0:" << AUCTION_WON;
-
- std::ostringstream msgAuctionWonBody;
- msgAuctionWonBody.width(16);
- msgAuctionWonBody << std::right << std::hex << auction->owner;
- msgAuctionWonBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
- sLog.outDebug( "AuctionWon body string : %s", msgAuctionWonBody.str().c_str() );
-
- //prepare mail data... :
- uint32 itemTextId = CreateItemText( msgAuctionWonBody.str() );
-
- // set owner to bidder (to prevent delete item with sender char deleting)
- // owner in `data` will set at mail receive and item extracting
- CharacterDatabase.PExecute("UPDATE item_instance SET owner_guid = '%u' WHERE guid='%u'",auction->bidder,pItem->GetGUIDLow());
- CharacterDatabase.CommitTransaction();
-
- MailItemsInfo mi;
- mi.AddItem(auction->item_guidlow, auction->item_template, pItem);
-
- if (bidder)
- bidder->GetSession()->SendAuctionBidderNotification( auction->location, auction->Id, bidder_guid, 0, 0, auction->item_template);
- else
- RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
-
- // will delete item or place to receiver mail list
- WorldSession::SendMailTo(bidder, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, auction->bidder, msgAuctionWonSubject.str(), itemTextId, &mi, 0, 0, MAIL_CHECK_MASK_AUCTION);
- }
- // receiver not exist
- else
- {
- CharacterDatabase.PExecute("DELETE FROM item_instance WHERE guid='%u'", pItem->GetGUIDLow());
- RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
- delete pItem;
- }
-}
-
-void ObjectMgr::SendAuctionSalePendingMail( AuctionEntry * auction )
+void ObjectMgr::RemoveArenaTeam(uint32 Id)
{
- uint64 owner_guid = MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER);
- Player *owner = GetPlayer(owner_guid);
-
- // owner exist (online or offline)
- if(owner || GetPlayerAccountIdByGUID(owner_guid))
- {
- std::ostringstream msgAuctionSalePendingSubject;
- msgAuctionSalePendingSubject << auction->item_template << ":0:" << AUCTION_SALE_PENDING;
-
- std::ostringstream msgAuctionSalePendingBody;
- uint32 auctionCut = GetAuctionCut(auction->location, auction->bid);
-
- time_t distrTime = time(NULL) + HOUR;
-
- msgAuctionSalePendingBody.width(16);
- msgAuctionSalePendingBody << std::right << std::hex << auction->bidder;
- msgAuctionSalePendingBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
- msgAuctionSalePendingBody << ":" << auction->deposit << ":" << auctionCut << ":0:";
- msgAuctionSalePendingBody << secsToTimeBitFields(distrTime);
-
- sLog.outDebug("AuctionSalePending body string : %s", msgAuctionSalePendingBody.str().c_str());
-
- uint32 itemTextId = CreateItemText( msgAuctionSalePendingBody.str() );
-
- WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, auction->owner, msgAuctionSalePendingSubject.str(), itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_AUCTION);
- }
-}
-
-//call this method to send mail to auction owner, when auction is successful, it does not clear ram
-void ObjectMgr::SendAuctionSuccessfulMail( AuctionEntry * auction )
-{
- uint64 owner_guid = MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER);
- Player *owner = GetPlayer(owner_guid);
-
- uint32 owner_accId = 0;
- if(!owner)
- owner_accId = GetPlayerAccountIdByGUID(owner_guid);
-
- // owner exist
- if(owner || owner_accId)
- {
- std::ostringstream msgAuctionSuccessfulSubject;
- msgAuctionSuccessfulSubject << auction->item_template << ":0:" << AUCTION_SUCCESSFUL;
-
- std::ostringstream auctionSuccessfulBody;
- uint32 auctionCut = GetAuctionCut(auction->location, auction->bid);
-
- auctionSuccessfulBody.width(16);
- auctionSuccessfulBody << std::right << std::hex << auction->bidder;
- auctionSuccessfulBody << std::dec << ":" << auction->bid << ":" << auction->buyout;
- auctionSuccessfulBody << ":" << auction->deposit << ":" << auctionCut;
-
- sLog.outDebug("AuctionSuccessful body string : %s", auctionSuccessfulBody.str().c_str());
-
- uint32 itemTextId = CreateItemText( auctionSuccessfulBody.str() );
-
- uint32 profit = auction->bid + auction->deposit - auctionCut;
-
- if (owner)
- {
- //send auction owner notification, bidder must be current!
- owner->GetSession()->SendAuctionOwnerNotification( auction );
- }
-
- WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, auction->owner, msgAuctionSuccessfulSubject.str(), itemTextId, NULL, profit, 0, MAIL_CHECK_MASK_AUCTION, HOUR);
- }
-}
-
-//does not clear ram
-void ObjectMgr::SendAuctionExpiredMail( AuctionEntry * auction )
-{ //return an item in auction to its owner by mail
- Item *pItem = GetAItem(auction->item_guidlow);
- if(!pItem)
- {
- sLog.outError("Auction item (GUID: %u) not found, and lost.",auction->item_guidlow);
- return;
- }
-
- uint64 owner_guid = MAKE_NEW_GUID(auction->owner, 0, HIGHGUID_PLAYER);
- Player *owner = GetPlayer(owner_guid);
-
- uint32 owner_accId = 0;
- if(!owner)
- owner_accId = GetPlayerAccountIdByGUID(owner_guid);
-
- // owner exist
- if(owner || owner_accId)
- {
- std::ostringstream subject;
- subject << auction->item_template << ":0:" << AUCTION_EXPIRED;
-
- if ( owner )
- owner->GetSession()->SendAuctionOwnerNotification( auction );
- else
- RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
-
- MailItemsInfo mi;
- mi.AddItem(auction->item_guidlow, auction->item_template, pItem);
-
- // will delete item or place to receiver mail list
- WorldSession::SendMailTo(owner, MAIL_AUCTION, MAIL_STATIONERY_AUCTION, auction->location, GUID_LOPART(owner_guid), subject.str(), 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE);
- }
- // owner not found
- else
- {
- CharacterDatabase.PExecute("DELETE FROM item_instance WHERE guid='%u'",pItem->GetGUIDLow());
- RemoveAItem(pItem->GetGUIDLow()); // we have to remove the item, before we delete it !!
- delete pItem;
- }
+ mArenaTeamMap.erase(Id);
}
CreatureInfo const* ObjectMgr::GetCreatureTemplate(uint32 id)
@@ -590,7 +341,7 @@ void ObjectMgr::LoadCreatureLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 creature locale strings. DB table `locales_creature` is empty.");
return;
}
@@ -658,7 +409,7 @@ void ObjectMgr::LoadNpcOptionLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 npc_option locale strings. DB table `locales_npc_option` is empty.");
return;
}
@@ -709,6 +460,57 @@ void ObjectMgr::LoadNpcOptionLocales()
sLog.outString( ">> Loaded %u npc_option locale strings", mNpcOptionLocaleMap.size() );
}
+void ObjectMgr::LoadPointOfInterestLocales()
+{
+ mPointOfInterestLocaleMap.clear(); // need for reload case
+
+ QueryResult *result = WorldDatabase.Query("SELECT entry,icon_name_loc1,icon_name_loc2,icon_name_loc3,icon_name_loc4,icon_name_loc5,icon_name_loc6,icon_name_loc7,icon_name_loc8 FROM locales_points_of_interest");
+
+ if(!result)
+ {
+ barGoLink bar(1);
+
+ bar.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded 0 points_of_interest locale strings. DB table `locales_points_of_interest` is empty.");
+ return;
+ }
+
+ barGoLink bar(result->GetRowCount());
+
+ do
+ {
+ Field *fields = result->Fetch();
+ bar.step();
+
+ uint32 entry = fields[0].GetUInt32();
+
+ PointOfInterestLocale& data = mPointOfInterestLocaleMap[entry];
+
+ for(int i = 1; i < MAX_LOCALE; ++i)
+ {
+ std::string str = fields[i].GetCppString();
+ if(str.empty())
+ continue;
+
+ int idx = GetOrNewIndexForLocale(LocaleConstant(i));
+ if(idx >= 0)
+ {
+ if(data.IconName.size() <= idx)
+ data.IconName.resize(idx+1);
+
+ data.IconName[idx] = str;
+ }
+ }
+ } while (result->NextRow());
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u points_of_interest locale strings", mPointOfInterestLocaleMap.size() );
+}
+
struct SQLCreatureLoader : public SQLStorageLoaderBase<SQLCreatureLoader>
{
template<class D>
@@ -842,6 +644,19 @@ void ObjectMgr::LoadCreatureTemplates()
if((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE)
sLog.outErrorDb("Creature (Entry: %u) has wrong trainer type %u",cInfo->Entry,cInfo->trainer_type);
+ if(cInfo->type && !sCreatureTypeStore.LookupEntry(cInfo->type))
+ {
+ sLog.outErrorDb("Creature (Entry: %u) has invalid creature type (%u) in `type`",cInfo->Entry,cInfo->type);
+ const_cast<CreatureInfo*>(cInfo)->type = CREATURE_TYPE_HUMANOID;
+ }
+
+ // must exist or used hidden but used in data horse case
+ if(cInfo->family && !sCreatureFamilyStore.LookupEntry(cInfo->family) && cInfo->family != CREATURE_FAMILY_HORSE_CUSTOM )
+ {
+ sLog.outErrorDb("Creature (Entry: %u) has invalid creature family (%u) in `family`",cInfo->Entry,cInfo->family);
+ const_cast<CreatureInfo*>(cInfo)->family = 0;
+ }
+
if(cInfo->InhabitType <= 0 || cInfo->InhabitType > INHABIT_ANYWHERE)
{
sLog.outErrorDb("Creature (Entry: %u) has wrong value (%u) in `InhabitType`, creature will not correctly walk/swim/fly",cInfo->Entry,cInfo->InhabitType);
@@ -855,6 +670,15 @@ void ObjectMgr::LoadCreatureTemplates()
sLog.outErrorDb("Creature (Entry: %u) has non-existing PetSpellDataId (%u)", cInfo->Entry, cInfo->PetSpellDataId);
}
+ for(int i = 0; i < CREATURE_MAX_SPELLS; ++i)
+ {
+ if(cInfo->spells[i] && !sSpellStore.LookupEntry(cInfo->spells[i]))
+ {
+ sLog.outErrorDb("Creature (Entry: %u) has non-existing Spell%d (%u), set to 0", cInfo->Entry, i+1,cInfo->spells[i]);
+ const_cast<CreatureInfo*>(cInfo)->spells[i] = 0;
+ }
+ }
+
if(cInfo->MovementType >= MAX_DB_MOTION_TYPE)
{
sLog.outErrorDb("Creature (Entry: %u) has wrong movement generator type (%u), ignore and set to IDLE.",cInfo->Entry,cInfo->MovementType);
@@ -1003,8 +827,47 @@ void ObjectMgr::LoadEquipmentTemplates()
{
sEquipmentStorage.Load();
+ for(uint32 i=0; i< sEquipmentStorage.MaxEntry; ++i)
+ {
+ EquipmentInfo const* eqInfo = sEquipmentStorage.LookupEntry<EquipmentInfo>(i);
+
+ if(!eqInfo)
+ continue;
+
+ for(uint8 j=0; j<3; j++)
+ {
+ if(!eqInfo->equipentry[j])
+ continue;
+
+ ItemEntry const *dbcitem = sItemStore.LookupEntry(eqInfo->equipentry[j]);
+
+ if(!dbcitem)
+ {
+ sLog.outErrorDb("Unknown item (entry=%u) in creature_equip_template.equipentry%u for entry = %u, forced to 0.", eqInfo->equipentry[j], j+1, i);
+ const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
+ continue;
+ }
+
+ if(dbcitem->InventoryType != INVTYPE_WEAPON &&
+ dbcitem->InventoryType != INVTYPE_SHIELD &&
+ dbcitem->InventoryType != INVTYPE_RANGED &&
+ dbcitem->InventoryType != INVTYPE_2HWEAPON &&
+ dbcitem->InventoryType != INVTYPE_WEAPONMAINHAND &&
+ dbcitem->InventoryType != INVTYPE_WEAPONOFFHAND &&
+ dbcitem->InventoryType != INVTYPE_HOLDABLE &&
+ dbcitem->InventoryType != INVTYPE_THROWN &&
+ dbcitem->InventoryType != INVTYPE_RANGEDRIGHT)
+ {
+ sLog.outErrorDb("Item (entry=%u) in creature_equip_template.equipentry%u for entry = %u is not equipable in a hand, forced to 0.", eqInfo->equipentry[j], j+1, i);
+ const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
+ }
+ }
+ }
sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
sLog.outString();
+
+ // This DBC is currently only used for item templates and creature equipments checks.
+ sItemStore.Clear();
}
CreatureModelInfo const* ObjectMgr::GetCreatureModelInfo(uint32 modelid)
@@ -1076,9 +939,10 @@ void ObjectMgr::LoadCreatures()
QueryResult *result = WorldDatabase.Query("SELECT creature.guid, id, map, modelid,"
// 4 5 6 7 8 9 10 11
"equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint,"
- // 12 13 14 15 16 17
- "curhealth, curmana, DeathState, MovementType, spawnMask, event "
- "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid");
+ // 12 13 14 15 16 17 18 19
+ "curhealth, curmana, DeathState, MovementType, spawnMask, phaseMask, event, pool_entry "
+ "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid "
+ "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid");
if(!result)
{
@@ -1086,7 +950,7 @@ void ObjectMgr::LoadCreatures()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outErrorDb(">> Loaded 0 creature. DB table `creature` is empty.");
return;
}
@@ -1105,11 +969,19 @@ void ObjectMgr::LoadCreatures()
Field *fields = result->Fetch();
bar.step();
- uint32 guid = fields[0].GetUInt32();
+ uint32 guid = fields[ 0].GetUInt32();
+ uint32 entry = fields[ 1].GetUInt32();
+
+ CreatureInfo const* cInfo = GetCreatureTemplate(entry);
+ if(!cInfo)
+ {
+ sLog.outErrorDb("Table `creature` has creature (GUID: %u) with non existing creature entry %u, skipped.", guid, entry);
+ continue;
+ }
CreatureData& data = mCreatureDataMap[guid];
- data.id = fields[ 1].GetUInt32();
+ data.id = entry;
data.mapid = fields[ 2].GetUInt32();
data.displayid = fields[ 3].GetUInt32();
data.equipmentId = fields[ 4].GetUInt32();
@@ -1125,14 +997,9 @@ void ObjectMgr::LoadCreatures()
data.is_dead = fields[14].GetBool();
data.movementType = fields[15].GetUInt8();
data.spawnMask = fields[16].GetUInt8();
- int16 gameEvent = fields[17].GetInt16();
-
- CreatureInfo const* cInfo = GetCreatureTemplate(data.id);
- if(!cInfo)
- {
- sLog.outErrorDb("Table `creature` have creature (GUID: %u) with not existed creature entry %u, skipped.",guid,data.id );
- continue;
- }
+ data.phaseMask = fields[17].GetUInt16();
+ int16 gameEvent = fields[18].GetInt16();
+ int16 PoolId = fields[19].GetInt16();
if(heroicCreatures.find(data.id)!=heroicCreatures.end())
{
@@ -1183,8 +1050,15 @@ void ObjectMgr::LoadCreatures()
}
}
- if (gameEvent==0) // if not this is to be managed by GameEvent System
+ if(data.phaseMask==0)
+ {
+ sLog.outErrorDb("Table `creature` have creature (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.",guid,data.id );
+ data.phaseMask = 1;
+ }
+
+ if (gameEvent==0 && PoolId==0) // if not this is to be managed by GameEvent System or Pool system
AddCreatureToGrid(guid, &data);
+
++count;
} while (result->NextRow());
@@ -1233,9 +1107,10 @@ void ObjectMgr::LoadGameobjects()
// 0 1 2 3 4 5 6
QueryResult *result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation,"
- // 7 8 9 10 11 12 13 14 15
- "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, event "
- "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid");
+ // 7 8 9 10 11 12 13 14 15 16 17
+ "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, event, pool_entry "
+ "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid "
+ "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid");
if(!result)
{
@@ -1255,11 +1130,19 @@ void ObjectMgr::LoadGameobjects()
Field *fields = result->Fetch();
bar.step();
- uint32 guid = fields[0].GetUInt32();
+ uint32 guid = fields[ 0].GetUInt32();
+ uint32 entry = fields[ 1].GetUInt32();
+
+ GameObjectInfo const* gInfo = GetGameObjectInfo(entry);
+ if(!gInfo)
+ {
+ sLog.outErrorDb("Table `gameobject` has gameobject (GUID: %u) with non existing gameobject entry %u, skipped.", guid, entry);
+ continue;
+ }
GameObjectData& data = mGameObjectDataMap[guid];
- data.id = fields[ 1].GetUInt32();
+ data.id = entry;
data.mapid = fields[ 2].GetUInt32();
data.posX = fields[ 3].GetFloat();
data.posY = fields[ 4].GetFloat();
@@ -1274,16 +1157,17 @@ void ObjectMgr::LoadGameobjects()
data.go_state = fields[13].GetUInt32();
data.ArtKit = 0;
data.spawnMask = fields[14].GetUInt8();
- int16 gameEvent = fields[15].GetInt16();
+ data.phaseMask = fields[15].GetUInt16();
+ int16 gameEvent = fields[16].GetInt16();
+ int16 PoolId = fields[17].GetInt16();
- GameObjectInfo const* gInfo = GetGameObjectInfo(data.id);
- if(!gInfo)
+ if(data.phaseMask==0)
{
- sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u) with not existed gameobject entry %u, skipped.",guid,data.id );
- continue;
+ sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.",guid,data.id );
+ data.phaseMask = 1;
}
- if (gameEvent==0) // if not this is to be managed by GameEvent System
+ if (gameEvent==0 && PoolId==0) // if not this is to be managed by GameEvent System or Pool system
AddGameobjectToGrid(guid, &data);
++count;
@@ -1498,65 +1382,6 @@ uint32 ObjectMgr::GetPlayerAccountIdByPlayerName(const std::string& name) const
return 0;
}
-void ObjectMgr::LoadAuctions()
-{
- QueryResult *result = CharacterDatabase.Query("SELECT COUNT(*) FROM auctionhouse");
- if( !result )
- return;
-
- Field *fields = result->Fetch();
- uint32 AuctionCount=fields[0].GetUInt32();
- delete result;
-
- if(!AuctionCount)
- return;
-
- result = CharacterDatabase.Query( "SELECT id,auctioneerguid,itemguid,item_template,itemowner,buyoutprice,time,buyguid,lastbid,startbid,deposit,location FROM auctionhouse" );
- if( !result )
- return;
-
- barGoLink bar( AuctionCount );
-
- AuctionEntry *aItem;
-
- do
- {
- fields = result->Fetch();
-
- bar.step();
-
- aItem = new AuctionEntry;
- aItem->Id = fields[0].GetUInt32();
- aItem->auctioneer = fields[1].GetUInt32();
- aItem->item_guidlow = fields[2].GetUInt32();
- aItem->item_template = fields[3].GetUInt32();
- aItem->owner = fields[4].GetUInt32();
- aItem->buyout = fields[5].GetUInt32();
- aItem->time = fields[6].GetUInt32();
- aItem->bidder = fields[7].GetUInt32();
- aItem->bid = fields[8].GetUInt32();
- aItem->startbid = fields[9].GetUInt32();
- aItem->deposit = fields[10].GetUInt32();
- aItem->location = fields[11].GetUInt8();
- //check if sold item exists
- if ( GetAItem( aItem->item_guidlow ) )
- {
- GetAuctionsMap( aItem->location )->AddAuction(aItem);
- }
- else
- {
- CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE id = '%u'",aItem->Id);
- sLog.outError("Auction %u has not a existing item : %u", aItem->Id, aItem->item_guidlow);
- delete aItem;
- }
- } while (result->NextRow());
- delete result;
-
- sLog.outString();
- sLog.outString( ">> Loaded %u auctions", AuctionCount );
- sLog.outString();
-}
-
void ObjectMgr::LoadItemLocales()
{
mItemLocaleMap.clear(); // need for reload case
@@ -1569,7 +1394,7 @@ void ObjectMgr::LoadItemLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 Item locale strings. DB table `locales_item` is empty.");
return;
}
@@ -1653,6 +1478,32 @@ void ObjectMgr::LoadItemPrototypes()
if(dbcitem)
{
+ if(proto->Class != dbcitem->Class)
+ {
+ sLog.outErrorDb("Item (Entry: %u) not correct class %u, must be %u (still using DB value).",i,proto->Class,dbcitem->Class);
+ // It safe let use Class from DB
+ }
+ /* disabled: have some strange wrong cases for Subclass values.
+ for enable also uncomment Subclass field in ItemEntry structure and in Itemfmt[]
+ if(proto->SubClass != dbcitem->SubClass)
+ {
+ sLog.outErrorDb("Item (Entry: %u) not correct (Class: %u, Sub: %u) pair, must be (Class: %u, Sub: %u) (still using DB value).",i,proto->Class,proto->SubClass,dbcitem->Class,dbcitem->SubClass);
+ // It safe let use Subclass from DB
+ }
+ */
+
+ if(proto->Unk0 != dbcitem->Unk0)
+ {
+ sLog.outErrorDb("Item (Entry: %u) not correct %i Unk0, must be %i (still using DB value).",i,proto->Unk0,dbcitem->Unk0);
+ // It safe let use Unk0 from DB
+ }
+
+ if(proto->Material != dbcitem->Material)
+ {
+ sLog.outErrorDb("Item (Entry: %u) not correct %i material, must be %i (still using DB value).",i,proto->Material,dbcitem->Material);
+ // It safe let use Material from DB
+ }
+
if(proto->InventoryType != dbcitem->InventoryType)
{
sLog.outErrorDb("Item (Entry: %u) not correct %u inventory type, must be %u (still using DB value).",i,proto->InventoryType,dbcitem->InventoryType);
@@ -1678,7 +1529,7 @@ void ObjectMgr::LoadItemPrototypes()
if(proto->Class >= MAX_ITEM_CLASS)
{
sLog.outErrorDb("Item (Entry: %u) has wrong Class value (%u)",i,proto->Class);
- const_cast<ItemPrototype*>(proto)->Class = ITEM_CLASS_JUNK;
+ const_cast<ItemPrototype*>(proto)->Class = ITEM_CLASS_MISC;
}
if(proto->SubClass >= MaxItemSubclassValues[proto->Class])
@@ -1711,14 +1562,30 @@ void ObjectMgr::LoadItemPrototypes()
const_cast<ItemPrototype*>(proto)->RequiredSkill = 0;
}
- if(!(proto->AllowableClass & CLASSMASK_ALL_PLAYABLE))
{
- sLog.outErrorDb("Item (Entry: %u) not have in `AllowableClass` any playable classes (%u) and can't be equipped.",i,proto->AllowableClass);
- }
- if(!(proto->AllowableRace & RACEMASK_ALL_PLAYABLE))
- {
- sLog.outErrorDb("Item (Entry: %u) not have in `AllowableRace` any playable races (%u) and can't be equipped.",i,proto->AllowableRace);
+ // can be used in equip slot, as page read use in inventory, or spell casting at use
+ bool req = proto->InventoryType!=INVTYPE_NON_EQUIP || proto->PageText;
+ if(!req)
+ {
+ for (int j = 0; j < 5; ++j)
+ {
+ if(proto->Spells[j].SpellId)
+ {
+ req = true;
+ break;
+ }
+ }
+ }
+
+ if(req)
+ {
+ if(!(proto->AllowableClass & CLASSMASK_ALL_PLAYABLE))
+ sLog.outErrorDb("Item (Entry: %u) not have in `AllowableClass` any playable classes (%u) and can't be equipped or use.",i,proto->AllowableClass);
+
+ if(!(proto->AllowableRace & RACEMASK_ALL_PLAYABLE))
+ sLog.outErrorDb("Item (Entry: %u) not have in `AllowableRace` any playable races (%u) and can't be equipped or use.",i,proto->AllowableRace);
+ }
}
if(proto->RequiredSpell && !sSpellStore.LookupEntry(proto->RequiredSpell))
@@ -1744,11 +1611,22 @@ void ObjectMgr::LoadItemPrototypes()
else if(proto->RequiredReputationRank > MIN_REPUTATION_RANK)
sLog.outErrorDb("Item (Entry: %u) has RequiredReputationFaction ==0 but RequiredReputationRank > 0, rank setting is useless.",i);
+ if(proto->MaxCount < -1)
+ {
+ sLog.outErrorDb("Item (Entry: %u) has too large negative in maxcount (%i), replace by value (-1) no storing limits.",i,proto->MaxCount);
+ const_cast<ItemPrototype*>(proto)->MaxCount = -1;
+ }
+
if(proto->Stackable==0)
{
- sLog.outErrorDb("Item (Entry: %u) has wrong value in stackable (%u), replace by default 1.",i,proto->Stackable);
+ sLog.outErrorDb("Item (Entry: %u) has wrong value in stackable (%i), replace by default 1.",i,proto->Stackable);
const_cast<ItemPrototype*>(proto)->Stackable = 1;
}
+ else if(proto->Stackable < -1)
+ {
+ sLog.outErrorDb("Item (Entry: %u) has too large negative in stackable (%i), replace by value (-1) no stacking limits.",i,proto->Stackable);
+ const_cast<ItemPrototype*>(proto)->Stackable = -1;
+ }
else if(proto->Stackable > 255)
{
sLog.outErrorDb("Item (Entry: %u) has too large value in stackable (%u), replace by hardcoded upper limit (255).",i,proto->Stackable);
@@ -1775,7 +1653,7 @@ void ObjectMgr::LoadItemPrototypes()
}
// special format
- if(proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN)
+ if((proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN) || (proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN_PET))
{
// spell_1
if(proto->Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
@@ -1812,7 +1690,7 @@ void ObjectMgr::LoadItemPrototypes()
const_cast<ItemPrototype*>(proto)->Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
}
// allowed only in special format
- else if(proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN)
+ else if((proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN) || (proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN_PET))
{
sLog.outErrorDb("Item (Entry: %u) has broken spell in spellid_%d (%u)",i,1+1,proto->Spells[1].SpellId);
const_cast<ItemPrototype*>(proto)->Spells[0].SpellId = 0;
@@ -1858,7 +1736,7 @@ void ObjectMgr::LoadItemPrototypes()
const_cast<ItemPrototype*>(proto)->Spells[j].SpellId = 0;
}
// allowed only in special format
- else if(proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN)
+ else if((proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN) || (proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN_PET))
{
sLog.outErrorDb("Item (Entry: %u) has broken spell in spellid_%d (%u)",i,j+1,proto->Spells[j].SpellId);
const_cast<ItemPrototype*>(proto)->Spells[j].SpellId = 0;
@@ -1926,57 +1804,13 @@ void ObjectMgr::LoadItemPrototypes()
sLog.outErrorDb("Item (Entry: %u) has wrong FoodType value (%u)",i,proto->FoodType);
const_cast<ItemPrototype*>(proto)->FoodType = 0;
}
- }
-
- // this DBC used currently only for check item templates in DB.
- sItemStore.Clear();
-}
-
-void ObjectMgr::LoadAuctionItems()
-{
- QueryResult *result = CharacterDatabase.Query( "SELECT itemguid,item_template FROM auctionhouse" );
- if( !result )
- return;
-
- barGoLink bar( result->GetRowCount() );
-
- uint32 count = 0;
-
- Field *fields;
- do
- {
- bar.step();
-
- fields = result->Fetch();
- uint32 item_guid = fields[0].GetUInt32();
- uint32 item_template = fields[1].GetUInt32();
-
- ItemPrototype const *proto = GetItemPrototype(item_template);
-
- if(!proto)
+ if(proto->ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(proto->ItemLimitCategory))
{
- sLog.outError( "ObjectMgr::LoadAuctionItems: Unknown item (GUID: %u id: #%u) in auction, skipped.", item_guid,item_template);
- continue;
+ sLog.outErrorDb("Item (Entry: %u) has wrong LimitCategory value (%u)",i,proto->ItemLimitCategory);
+ const_cast<ItemPrototype*>(proto)->ItemLimitCategory = 0;
}
-
- Item *item = NewItemOrBag(proto);
-
- if(!item->LoadFromDB(item_guid,0))
- {
- delete item;
- continue;
- }
- AddAItem(item);
-
- ++count;
}
- while( result->NextRow() );
-
- delete result;
-
- sLog.outString();
- sLog.outString( ">> Loaded %u auction items", count );
}
void ObjectMgr::LoadPetLevelInfo()
@@ -2260,7 +2094,7 @@ void ObjectMgr::LoadPlayerInfo()
if(sWorld.getConfig(CONFIG_START_ALL_SPELLS))
result = WorldDatabase.Query("SELECT race, class, Spell, Active FROM playercreateinfo_spell_custom");
else
- result = WorldDatabase.Query("SELECT race, class, Spell, Active FROM playercreateinfo_spell");
+ result = WorldDatabase.Query("SELECT race, class, Spell FROM playercreateinfo_spell");
uint32 count = 0;
@@ -2295,7 +2129,7 @@ void ObjectMgr::LoadPlayerInfo()
}
PlayerInfo* pInfo = &playerInfo[current_race][current_class];
- pInfo->spell.push_back(CreateSpellPair(fields[2].GetUInt16(), fields[3].GetUInt8()));
+ pInfo->spell.push_back(fields[2].GetUInt32());
bar.step();
++count;
@@ -2567,6 +2401,67 @@ void ObjectMgr::LoadPlayerInfo()
}
}
}
+
+ // Loading xp per level data
+ {
+ mPlayerXPperLevel.resize(sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
+ for (uint32 level = 0; level < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
+ mPlayerXPperLevel[level] = 0;
+
+ // 0 1
+ QueryResult *result = WorldDatabase.Query("SELECT lvl, xp_for_next_level FROM player_xp_for_level");
+
+ uint32 count = 0;
+
+ if (!result)
+ {
+ barGoLink bar( 1 );
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u xp for level definitions", count );
+ sLog.outErrorDb( "Error loading `player_xp_for_level` table or empty table.");
+ exit(1);
+ }
+
+ barGoLink bar( result->GetRowCount() );
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 current_level = fields[0].GetUInt32();
+ uint32 current_xp = fields[1].GetUInt32();
+
+ if(current_level >= sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
+ {
+ if(current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
+ sLog.outErrorDb("Wrong (> %u) level %u in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL,current_level);
+ else
+ sLog.outDetail("Unused (> MaxPlayerLevel in mangosd.conf) level %u in `player_xp_for_levels` table, ignoring.",current_level);
+ continue;
+ }
+ //PlayerXPperLevel
+ mPlayerXPperLevel[current_level] = current_xp;
+ bar.step();
+ ++count;
+ }
+ while (result->NextRow());
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u xp for level definitions", count );
+ }
+
+ // fill level gaps
+ for (uint32 level = 1; level < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
+ {
+ if( mPlayerXPperLevel[level] == 0)
+ {
+ sLog.outErrorDb("Level %i does not have XP for level data. Using data of level [%i] + 100.",level+1, level);
+ mPlayerXPperLevel[level] = mPlayerXPperLevel[level-1]+100;
+ }
+ }
}
void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint32 level, PlayerClassLevelInfo* info) const
@@ -2919,31 +2814,31 @@ void ObjectMgr::LoadQuests()
QueryResult *result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClass, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
// 9 10 11 12 13 14 15 16
"RepObjectiveFaction, RepObjectiveValue, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime,"
- // 17 18 19 20 21 22 23 24 25 26
- "QuestFlags, SpecialFlags, CharTitleId, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell,"
- // 27 28 29 30 31 32 33 34 35 36
+ // 17 18 19 20 21 22 23 24 25 26 27 28
+ "QuestFlags, SpecialFlags, CharTitleId, PlayersSlain, BonusTalents, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell,"
+ // 29 30 31 32 33 34 35 36 37 38
"Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4,"
- // 37 38 39 40 41 42 43 44
+ // 39 40 41 42 43 44 45 46
"ReqItemId1, ReqItemId2, ReqItemId3, ReqItemId4, ReqItemCount1, ReqItemCount2, ReqItemCount3, ReqItemCount4,"
- // 45 46 47 48 49 50 51 52 53 54 54 55
+ // 47 48 49 50 51 52 53 54 55 56 57 58
"ReqSourceId1, ReqSourceId2, ReqSourceId3, ReqSourceId4, ReqSourceCount1, ReqSourceCount2, ReqSourceCount3, ReqSourceCount4, ReqSourceRef1, ReqSourceRef2, ReqSourceRef3, ReqSourceRef4,"
- // 57 58 59 60 61 62 63 64
+ // 59 60 61 62 63 64 65 66
"ReqCreatureOrGOId1, ReqCreatureOrGOId2, ReqCreatureOrGOId3, ReqCreatureOrGOId4, ReqCreatureOrGOCount1, ReqCreatureOrGOCount2, ReqCreatureOrGOCount3, ReqCreatureOrGOCount4,"
- // 65 66 67 68
+ // 67 68 69 70
"ReqSpellCast1, ReqSpellCast2, ReqSpellCast3, ReqSpellCast4,"
- // 69 70 71 72 73 74
+ // 71 72 73 74 75 76
"RewChoiceItemId1, RewChoiceItemId2, RewChoiceItemId3, RewChoiceItemId4, RewChoiceItemId5, RewChoiceItemId6,"
- // 75 76 77 78 79 80
+ // 77 78 79 80 81 82
"RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6,"
- // 81 82 83 84 85 86 87 88
+ // 83 84 85 86 87 88 89 90
"RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4,"
- // 89 90 91 92 93 94 95 96 97 98
+ // 91 92 93 94 95 96 97 98 99 100
"RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
- // 99 100 101 102 103 104 105 106 107 108 109
+ // 101 102 103 104 105 106 107 108 109 110 111
"RewHonorableKills, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt,"
- // 110 111 112 113 114 115 116 117 118 119
+ // 112 113 114 115 116 117 118 119 120 121
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4,IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4,"
- // 120 121
+ // 122 123
"StartScript, CompleteScript"
" FROM quest_template");
if(result == NULL)
@@ -3613,7 +3508,7 @@ void ObjectMgr::LoadQuestLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 Quest locale strings. DB table `locales_quest` is empty.");
return;
}
@@ -3973,6 +3868,21 @@ void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename)
}
case SCRIPT_COMMAND_REMOVE_AURA:
+ {
+ if(!sSpellStore.LookupEntry(tmp.datalong))
+ {
+ sLog.outErrorDb("Table `%s` using non-existent spell (id: %u) in SCRIPT_COMMAND_REMOVE_AURA or SCRIPT_COMMAND_CAST_SPELL for script id %u",
+ tablename,tmp.datalong,tmp.id);
+ continue;
+ }
+ if(tmp.datalong2 & ~0x1) // 1 bits (0,1)
+ {
+ sLog.outErrorDb("Table `%s` using unknown flags in datalong2 (%u)i n SCRIPT_COMMAND_CAST_SPELL for script id %u",
+ tablename,tmp.datalong2,tmp.id);
+ continue;
+ }
+ break;
+ }
case SCRIPT_COMMAND_CAST_SPELL:
{
if(!sSpellStore.LookupEntry(tmp.datalong))
@@ -3981,6 +3891,12 @@ void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename)
tablename,tmp.datalong,tmp.id);
continue;
}
+ if(tmp.datalong2 & ~0x3) // 2 bits
+ {
+ sLog.outErrorDb("Table `%s` using unknown flags in datalong2 (%u)i n SCRIPT_COMMAND_CAST_SPELL for script id %u",
+ tablename,tmp.datalong2,tmp.id);
+ continue;
+ }
break;
}
}
@@ -4229,7 +4145,7 @@ void ObjectMgr::LoadPageTextLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 PageText locale strings. DB table `locales_page_text` is empty.");
return;
}
@@ -4296,14 +4212,20 @@ void ObjectMgr::LoadInstanceTemplate()
else if(!entry->HasResetTime())
continue;
+ //FIXME: now exist heroic instance, normal/heroic raid instances
+ // entry->resetTimeHeroic store reset time for both heroic mode instance (raid and non-raid)
+ // entry->resetTimeRaid store reset time for normal raid only
+ // for current state entry->resetTimeRaid == entry->resetTimeHeroic in case raid instances with heroic mode.
+ // but at some point wee need implement reset time dependent from raid instance mode
if(temp->reset_delay == 0)
{
// use defaults from the DBC
- if(entry->SupportsHeroicMode())
+ if(entry->resetTimeHeroic) // for both raid and non raids, read above
{
temp->reset_delay = entry->resetTimeHeroic / DAY;
}
else if (entry->resetTimeRaid && entry->map_type == MAP_RAID)
+ // for normal raid only
{
temp->reset_delay = entry->resetTimeRaid / DAY;
}
@@ -4317,27 +4239,16 @@ void ObjectMgr::LoadInstanceTemplate()
sLog.outString();
}
-void ObjectMgr::AddGossipText(GossipText *pGText)
-{
- ASSERT( pGText->Text_ID );
- ASSERT( mGossipText.find(pGText->Text_ID) == mGossipText.end() );
- mGossipText[pGText->Text_ID] = pGText;
-}
-
-GossipText *ObjectMgr::GetGossipText(uint32 Text_ID)
+GossipText const *ObjectMgr::GetGossipText(uint32 Text_ID) const
{
- GossipTextMap::const_iterator itr;
- for (itr = mGossipText.begin(); itr != mGossipText.end(); ++itr)
- {
- if(itr->second->Text_ID == Text_ID)
- return itr->second;
- }
+ GossipTextMap::const_iterator itr = mGossipText.find(Text_ID);
+ if(itr != mGossipText.end())
+ return &itr->second;
return NULL;
}
void ObjectMgr::LoadGossipText()
{
- GossipText *pGText;
QueryResult *result = WorldDatabase.Query( "SELECT * FROM npc_text" );
int count = 0;
@@ -4364,30 +4275,29 @@ void ObjectMgr::LoadGossipText()
bar.step();
- pGText = new GossipText;
- pGText->Text_ID = fields[cic++].GetUInt32();
-
- for (int i=0; i< 8; i++)
+ uint32 Text_ID = fields[cic++].GetUInt32();
+ if(!Text_ID)
{
- pGText->Options[i].Text_0 = fields[cic++].GetCppString();
- pGText->Options[i].Text_1 = fields[cic++].GetCppString();
+ sLog.outErrorDb("Table `npc_text` has record wit reserved id 0, ignore.");
+ continue;
+ }
- pGText->Options[i].Language = fields[cic++].GetUInt32();
- pGText->Options[i].Probability = fields[cic++].GetFloat();
+ GossipText& gText = mGossipText[Text_ID];
- pGText->Options[i].Emotes[0]._Delay = fields[cic++].GetUInt32();
- pGText->Options[i].Emotes[0]._Emote = fields[cic++].GetUInt32();
+ for (int i=0; i< 8; i++)
+ {
+ gText.Options[i].Text_0 = fields[cic++].GetCppString();
+ gText.Options[i].Text_1 = fields[cic++].GetCppString();
- pGText->Options[i].Emotes[1]._Delay = fields[cic++].GetUInt32();
- pGText->Options[i].Emotes[1]._Emote = fields[cic++].GetUInt32();
+ gText.Options[i].Language = fields[cic++].GetUInt32();
+ gText.Options[i].Probability = fields[cic++].GetFloat();
- pGText->Options[i].Emotes[2]._Delay = fields[cic++].GetUInt32();
- pGText->Options[i].Emotes[2]._Emote = fields[cic++].GetUInt32();
+ for(int j=0; j < 3; ++j)
+ {
+ gText.Options[i].Emotes[j]._Delay = fields[cic++].GetUInt32();
+ gText.Options[i].Emotes[j]._Emote = fields[cic++].GetUInt32();
+ }
}
-
- if ( !pGText->Text_ID ) continue;
- AddGossipText( pGText );
-
} while( result->NextRow() );
sLog.outString();
@@ -4416,7 +4326,7 @@ void ObjectMgr::LoadNpcTextLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 Quest locale strings. DB table `locales_npc_text` is empty.");
return;
}
@@ -4481,14 +4391,27 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
// 0 1 2 3 4 5 6 7 8 9
QueryResult* result = CharacterDatabase.PQuery("SELECT id,messageType,sender,receiver,itemTextId,has_items,expire_time,cod,checked,mailTemplateId FROM mail WHERE expire_time < '" I64FMTD "'", (uint64)basetime);
if ( !result )
+ {
+ barGoLink bar(1);
+ bar.step();
+ sLog.outString();
+ sLog.outString(">> Only expired mails (need to be return or delete) or DB table `mail` is empty.");
return; // any mails need to be returned or deleted
- Field *fields;
+ }
+
//std::ostringstream delitems, delmails; //will be here for optimization
//bool deletemail = false, deleteitem = false;
//delitems << "DELETE FROM item_instance WHERE guid IN ( ";
//delmails << "DELETE FROM mail WHERE id IN ( "
+
+ barGoLink bar( result->GetRowCount() );
+ uint32 count = 0;
+ Field *fields;
+
do
{
+ bar.step();
+
fields = result->Fetch();
Mail *m = new Mail;
m->messageID = fields[0].GetUInt32();
@@ -4554,8 +4477,12 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
//delmails << m->messageID << ", ";
CharacterDatabase.PExecute("DELETE FROM mail WHERE id = '%u'", m->messageID);
delete m;
+ ++count;
} while (result->NextRow());
delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u mails", count );
}
void ObjectMgr::LoadQuestAreaTriggers()
@@ -4712,7 +4639,7 @@ void ObjectMgr::LoadAreaTriggerScripts()
sLog.outString( ">> Loaded %u areatrigger scripts", count );
}
-uint32 ObjectMgr::GetNearestTaxiNode( float x, float y, float z, uint32 mapid )
+uint32 ObjectMgr::GetNearestTaxiNode( float x, float y, float z, uint32 mapid, uint32 team )
{
bool found = false;
float dist;
@@ -4721,24 +4648,31 @@ uint32 ObjectMgr::GetNearestTaxiNode( float x, float y, float z, uint32 mapid )
for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
{
TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
- if(node && node->map_id == mapid)
+ if(!node || node->map_id != mapid || !node->MountCreatureID[team == ALLIANCE ? 1 : 0])
+ continue;
+
+ uint8 field = (uint8)((i - 1) / 32);
+ uint32 submask = 1<<((i-1)%32);
+
+ // skip not taxi network nodes
+ if((sTaxiNodesMask[field] & submask)==0)
+ continue;
+
+ float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z);
+ if(found)
{
- float dist2 = (node->x - x)*(node->x - x)+(node->y - y)*(node->y - y)+(node->z - z)*(node->z - z);
- if(found)
+ if(dist2 < dist)
{
- if(dist2 < dist)
- {
- dist = dist2;
- id = i;
- }
- }
- else
- {
- found = true;
dist = dist2;
id = i;
}
}
+ else
+ {
+ found = true;
+ dist = dist2;
+ id = i;
+ }
}
return id;
@@ -4776,17 +4710,19 @@ uint16 ObjectMgr::GetTaxiMount( uint32 id, uint32 team )
TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
if(node)
{
- if (team == ALLIANCE) mount_entry = node->alliance_mount_type;
- else mount_entry = node->horde_mount_type;
-
- CreatureInfo const *cinfo = GetCreatureTemplate(mount_entry);
- if (cinfo)
+ if (team == ALLIANCE)
{
- if(! (mount_id = cinfo->GetRandomValidModelId()))
- {
- sLog.outErrorDb("No displayid found for the taxi mount with the entry %u! Can't load it!", mount_entry);
- return false;
- }
+ mount_entry = node->MountCreatureID[1];
+ CreatureInfo const *ci = GetCreatureTemplate(mount_entry);
+ if(ci)
+ mount_id = ci->Modelid1;
+ }
+ if (team == HORDE)
+ {
+ mount_entry = node->MountCreatureID[0];
+ CreatureInfo const *ci = GetCreatureTemplate(mount_entry);
+ if(ci)
+ mount_id = ci->Modelid3;
}
}
@@ -4914,7 +4850,7 @@ void ObjectMgr::LoadGraveyardZones()
WorldSafeLocsEntry const *ObjectMgr::GetClosestGraveYard(float x, float y, float z, uint32 MapId, uint32 team)
{
// search for zone associated closest graveyard
- uint32 zoneId = MapManager::Instance().GetZoneId(MapId,x,y);
+ uint32 zoneId = MapManager::Instance().GetZoneId(MapId,x,y,z);
// Simulate std. algorithm:
// found some graveyard associated to (ghost_zone,ghost_map)
@@ -5242,6 +5178,9 @@ void ObjectMgr::LoadAreaTriggerTeleports()
sLog.outString( ">> Loaded %u area trigger teleport definitions", count );
}
+/*
+ * Searches for the areatrigger which teleports players out of the given map
+ */
AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const
{
const MapEntry *mapEntry = sMapStore.LookupEntry(Map);
@@ -5258,6 +5197,23 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const
return NULL;
}
+/**
+ * Searches for the areatrigger which teleports players to the given map
+ */
+AreaTrigger const* ObjectMgr::GetMapEntranceTrigger(uint32 Map) const
+{
+ for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr)
+ {
+ if(itr->second.target_mapId == Map)
+ {
+ AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
+ if(atEntry)
+ return &itr->second;
+ }
+ }
+ return NULL;
+}
+
void ObjectMgr::SetHighestGuids()
{
QueryResult *result = CharacterDatabase.Query( "SELECT MAX(guid) FROM characters" );
@@ -5274,9 +5230,6 @@ void ObjectMgr::SetHighestGuids()
delete result;
}
- // pet guids are not saved to DB, set to 0 (pet guid != pet id)
- m_hiPetGuid = 0;
-
result = CharacterDatabase.Query( "SELECT MAX(guid) FROM item_instance" );
if( result )
{
@@ -5350,24 +5303,24 @@ uint32 ObjectMgr::GenerateArenaTeamId()
return m_arenaTeamId++;
}
-uint32 ObjectMgr::GenerateGuildId()
+uint32 ObjectMgr::GenerateAuctionID()
{
- if(m_guildId>=0xFFFFFFFE)
+ if(m_auctionid>=0xFFFFFFFE)
{
- sLog.outError("Guild ids overflow!! Can't continue, shutting down server. ");
+ sLog.outError("Auctions ids overflow!! Can't continue, shutting down server. ");
World::StopNow(ERROR_EXIT_CODE);
}
- return m_guildId++;
+ return m_auctionid++;
}
-uint32 ObjectMgr::GenerateAuctionID()
+uint32 ObjectMgr::GenerateGuildId()
{
- if(m_auctionid>=0xFFFFFFFE)
+ if(m_guildId>=0xFFFFFFFE)
{
- sLog.outError("Auctions ids overflow!! Can't continue, shutting down server. ");
+ sLog.outError("Guild ids overflow!! Can't continue, shutting down server. ");
World::StopNow(ERROR_EXIT_CODE);
}
- return m_auctionid++;
+ return m_guildId++;
}
uint32 ObjectMgr::GenerateMailID()
@@ -5429,6 +5382,13 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
World::StopNow(ERROR_EXIT_CODE);
}
return m_hiPetGuid++;
+ case HIGHGUID_VEHICLE:
+ if(m_hiVehicleGuid>=0x00FFFFFF)
+ {
+ sLog.outError("Vehicle guid overflow!! Can't continue, shutting down server. ");
+ World::StopNow(ERROR_EXIT_CODE);
+ }
+ return m_hiVehicleGuid++;
case HIGHGUID_PLAYER:
if(m_hiCharGuid>=0xFFFFFFFE)
{
@@ -5480,7 +5440,7 @@ void ObjectMgr::LoadGameObjectLocales()
bar.step();
- sLog.outString("");
+ sLog.outString();
sLog.outString(">> Loaded 0 gameobject locale strings. DB table `locales_gameobject` is empty.");
return;
}
@@ -5512,9 +5472,9 @@ void ObjectMgr::LoadGameObjectLocales()
}
}
- for(int i = MAX_LOCALE; i < MAX_LOCALE*2-1; ++i)
+ for(int i = 1; i < MAX_LOCALE; ++i)
{
- std::string str = fields[i].GetCppString();
+ std::string str = fields[i+(MAX_LOCALE-1)].GetCppString();
if(!str.empty())
{
int idx = GetOrNewIndexForLocale(LocaleConstant(i));
@@ -5616,10 +5576,10 @@ void ObjectMgr::LoadGameobjectInfo()
break;
}
case GAMEOBJECT_TYPE_CHAIR: //7
- if(goInfo->chair.height > 2)
+ if(goInfo->chair.height > (UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR) )
{
- sLog.outErrorDb("Gameobject (Entry: %u GoType: %u) have data1=%u but correct chair height in range 0..2.",
- id,goInfo->type,goInfo->chair.height);
+ sLog.outErrorDb("Gameobject (Entry: %u GoType: %u) have data1=%u but correct chair height in range 0..%i.",
+ id,goInfo->type,goInfo->chair.height,UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR);
// prevent client and server unexpected work
const_cast<GameObjectInfo*>(goInfo)->chair.height = 0;
@@ -5714,6 +5674,16 @@ void ObjectMgr::LoadGameobjectInfo()
}
break;
}
+ case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
+ if(goInfo->barberChair.chairheight > (UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR) )
+ {
+ sLog.outErrorDb("Gameobject (Entry: %u GoType: %u) have data1=%u but correct chair height in range 0..%i.",
+ id,goInfo->type,goInfo->barberChair.chairheight,UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR);
+
+ // prevent client and server unexpected work
+ const_cast<GameObjectInfo*>(goInfo)->barberChair.chairheight = 0;
+ }
+ break;
}
}
@@ -5762,6 +5732,13 @@ uint32 ObjectMgr::GetBaseXP(uint32 level)
return mBaseXPTable[level] ? mBaseXPTable[level] : 0;
}
+uint32 ObjectMgr::GetXPForLevel(uint32 level)
+{
+ if (level < mPlayerXPperLevel.size())
+ return mPlayerXPperLevel[level];
+ return 0;
+}
+
void ObjectMgr::LoadPetNames()
{
uint32 count = 0;
@@ -5963,6 +5940,58 @@ void ObjectMgr::LoadReputationOnKill()
sLog.outString(">> Loaded %u creature award reputation definitions", count);
}
+void ObjectMgr::LoadPointsOfInterest()
+{
+ uint32 count = 0;
+
+ // 0 1 2 3 4 5
+ QueryResult *result = WorldDatabase.Query("SELECT entry, x, y, icon, flags, data, icon_name FROM points_of_interest");
+
+ if(!result)
+ {
+ barGoLink bar(1);
+
+ bar.step();
+
+ sLog.outString();
+ sLog.outErrorDb(">> Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
+ return;
+ }
+
+ barGoLink bar(result->GetRowCount());
+
+ do
+ {
+ Field *fields = result->Fetch();
+ bar.step();
+
+ uint32 point_id = fields[0].GetUInt32();
+
+ PointOfInterest POI;
+ POI.x = fields[1].GetFloat();
+ POI.y = fields[2].GetFloat();
+ POI.icon = fields[3].GetUInt32();
+ POI.flags = fields[4].GetUInt32();
+ POI.data = fields[5].GetUInt32();
+ POI.icon_name = fields[6].GetCppString();
+
+ if(!MaNGOS::IsValidMapCoord(POI.x,POI.y))
+ {
+ sLog.outErrorDb("Table `points_of_interest` (Entry: %u) have invalid coordinates (X: %f Y: %f), ignored.",point_id,POI.x,POI.y);
+ continue;
+ }
+
+ mPointsOfInterest[point_id] = POI;
+
+ ++count;
+ } while (result->NextRow());
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u Points of Interest definitions", count);
+}
+
void ObjectMgr::LoadWeatherZoneChances()
{
uint32 count = 0;
@@ -6001,19 +6030,19 @@ void ObjectMgr::LoadWeatherZoneChances()
if(wzc.data[season].rainChance > 100)
{
wzc.data[season].rainChance = 25;
- sLog.outErrorDb("Weather for zone %u season %u has wrong rain chance > 100%",zone_id,season);
+ sLog.outErrorDb("Weather for zone %u season %u has wrong rain chance > 100%%",zone_id,season);
}
if(wzc.data[season].snowChance > 100)
{
wzc.data[season].snowChance = 25;
- sLog.outErrorDb("Weather for zone %u season %u has wrong snow chance > 100%",zone_id,season);
+ sLog.outErrorDb("Weather for zone %u season %u has wrong snow chance > 100%%",zone_id,season);
}
if(wzc.data[season].stormChance > 100)
{
wzc.data[season].stormChance = 25;
- sLog.outErrorDb("Weather for zone %u season %u has wrong storm chance > 100%",zone_id,season);
+ sLog.outErrorDb("Weather for zone %u season %u has wrong storm chance > 100%%",zone_id,season);
}
}
@@ -6230,11 +6259,18 @@ void ObjectMgr::LoadReservedPlayersNames()
bar.step();
fields = result->Fetch();
std::string name= fields[0].GetCppString();
- if(normalizePlayerName(name))
+
+ std::wstring wstr;
+ if(!Utf8toWStr (name,wstr))
{
- m_ReservedNames.insert(name);
- ++count;
+ sLog.outError("Table `reserved_name` have invalid name: %s", name.c_str() );
+ continue;
}
+
+ wstrToLower(wstr);
+
+ m_ReservedNames.insert(wstr);
+ ++count;
} while ( result->NextRow() );
delete result;
@@ -6243,6 +6279,17 @@ void ObjectMgr::LoadReservedPlayersNames()
sLog.outString( ">> Loaded %u reserved player names", count );
}
+bool ObjectMgr::IsReservedName( const std::string& name ) const
+{
+ std::wstring wstr;
+ if(!Utf8toWStr (name,wstr))
+ return false;
+
+ wstrToLower(wstr);
+
+ return m_ReservedNames.find(wstr) != m_ReservedNames.end();
+}
+
enum LanguageType
{
LT_BASIC_LATIN = 0x0000,
@@ -6391,55 +6438,26 @@ int ObjectMgr::GetOrNewIndexForLocale( LocaleConstant loc )
return m_LocalForIndex.size()-1;
}
-void ObjectMgr::LoadBattleMastersEntry()
+void ObjectMgr::LoadGameObjectForQuests()
{
- mBattleMastersMap.clear(); // need for reload case
-
- QueryResult *result = WorldDatabase.Query( "SELECT entry,bg_template FROM battlemaster_entry" );
-
- uint32 count = 0;
+ mGameObjectForQuestSet.clear(); // need for reload case
- if( !result )
+ if( !sGOStorage.MaxEntry )
{
barGoLink bar( 1 );
bar.step();
-
sLog.outString();
- sLog.outString( ">> Loaded 0 battlemaster entries - table is empty!" );
+ sLog.outString( ">> Loaded 0 GameObjects for quests" );
return;
}
- barGoLink bar( result->GetRowCount() );
-
- do
- {
- ++count;
- bar.step();
-
- Field *fields = result->Fetch();
-
- uint32 entry = fields[0].GetUInt32();
- uint32 bgTypeId = fields[1].GetUInt32();
-
- mBattleMastersMap[entry] = bgTypeId;
-
- } while( result->NextRow() );
-
- delete result;
-
- sLog.outString();
- sLog.outString( ">> Loaded %u battlemaster entries", count );
-}
-
-void ObjectMgr::LoadGameObjectForQuests()
-{
- mGameObjectForQuestSet.clear(); // need for reload case
-
+ barGoLink bar( sGOStorage.MaxEntry - 1 );
uint32 count = 0;
// collect GO entries for GO that must activated
for(uint32 go_entry = 1; go_entry < sGOStorage.MaxEntry; ++go_entry)
{
+ bar.step();
GameObjectInfo const* goInfo = sGOStorage.LookupEntry<GameObjectInfo>(go_entry);
if(!goInfo)
continue;
@@ -6474,7 +6492,7 @@ void ObjectMgr::LoadGameObjectForQuests()
}
sLog.outString();
- sLog.outString( ">> Loaded %u GameObject for quests", count );
+ sLog.outString( ">> Loaded %u GameObjects for quests", count );
}
bool ObjectMgr::LoadTrinityStrings(DatabaseType& db, char const* table, int32 min_value, int32 max_value)
@@ -6500,7 +6518,7 @@ bool ObjectMgr::LoadTrinityStrings(DatabaseType& db, char const* table, int32 mi
bar.step();
- sLog.outString("");
+ sLog.outString();
if(min_value == MIN_TRINITY_STRING_ID) // error only in case internal strings
sLog.outErrorDb(">> Loaded 0 trinity strings. DB table `%s` is empty. Cannot continue.",table);
else
@@ -6744,7 +6762,7 @@ bool PlayerCondition::Meets(Player const * player) const
case CONDITION_ITEM:
return player->HasItemCount(value1, value2);
case CONDITION_ITEM_EQUIPPED:
- return player->GetItemOrItemWithGemEquipped(value1) != NULL;
+ return player->HasItemOrGemWithIdEquipped(value1,1);
case CONDITION_ZONEID:
return player->GetZoneId() == value1;
case CONDITION_REPUTATION_RANK:
@@ -6767,7 +6785,7 @@ bool PlayerCondition::Meets(Player const * player) const
{
Unit::AuraMap const& auras = player->GetAuras();
for(Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
- if((itr->second->GetSpellProto()->Attributes & 0x1000010) && itr->second->GetSpellProto()->SpellVisual==3580)
+ if((itr->second->GetSpellProto()->Attributes & 0x1000010) && itr->second->GetSpellProto()->SpellVisual[0]==3580)
return true;
return false;
}
@@ -6944,7 +6962,7 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const *pSkill, bool racial)
return SKILL_RANGE_MONO;
case SKILL_CATEGORY_ARMOR:
case SKILL_CATEGORY_CLASS:
- if(pSkill->id != SKILL_POISONS && pSkill->id != SKILL_LOCKPICKING)
+ if(pSkill->id != SKILL_LOCKPICKING)
return SKILL_RANGE_MONO;
else
return SKILL_RANGE_LEVEL;
@@ -6959,7 +6977,7 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const *pSkill, bool racial)
return SKILL_RANGE_MONO;
default:
case SKILL_CATEGORY_ATTRIBUTES: //not found in dbc
- case SKILL_CATEGORY_NOT_DISPLAYED: //only GENEREC(DND)
+ case SKILL_CATEGORY_GENERIC: //only GENERIC(DND)
return SKILL_RANGE_NONE;
}
}
@@ -7020,11 +7038,10 @@ void ObjectMgr::LoadGameTele()
++count;
}
while (result->NextRow());
-
delete result;
sLog.outString();
- sLog.outString( ">> Loaded %u game tele's", count );
+ sLog.outString( ">> Loaded %u GameTeleports", count );
}
GameTele const* ObjectMgr::GetGameTele(const std::string& name) const
@@ -7160,30 +7177,41 @@ void ObjectMgr::LoadTrainerSpell()
continue;
}
- TrainerSpell* pTrainerSpell = new TrainerSpell();
- pTrainerSpell->spell = spell;
- pTrainerSpell->spellcost = fields[2].GetUInt32();
- pTrainerSpell->reqskill = fields[3].GetUInt32();
- pTrainerSpell->reqskillvalue = fields[4].GetUInt32();
- pTrainerSpell->reqlevel = fields[5].GetUInt32();
+ TrainerSpellData& data = m_mCacheTrainerSpellMap[entry];
- if(!pTrainerSpell->reqlevel)
- pTrainerSpell->reqlevel = spellinfo->spellLevel;
+ TrainerSpell& trainerSpell = data.spellList[spell];
+ trainerSpell.spell = spell;
+ trainerSpell.spellCost = fields[2].GetUInt32();
+ trainerSpell.reqSkill = fields[3].GetUInt32();
+ trainerSpell.reqSkillValue = fields[4].GetUInt32();
+ trainerSpell.reqLevel = fields[5].GetUInt32();
+ if(!trainerSpell.reqLevel)
+ trainerSpell.reqLevel = spellinfo->spellLevel;
- TrainerSpellData& data = m_mCacheTrainerSpellMap[entry];
+ // calculate learned spell for profession case when stored cast-spell
+ trainerSpell.learnedSpell = spell;
+ for(int i = 0; i <3; ++i)
+ {
+ if(spellinfo->Effect[i] != SPELL_EFFECT_LEARN_SPELL)
+ continue;
+ if(SpellMgr::IsProfessionOrRidingSpell(spellinfo->EffectTriggerSpell[i]))
+ {
+ trainerSpell.learnedSpell = spellinfo->EffectTriggerSpell[i];
+ break;
+ }
+ }
- if(SpellMgr::IsProfessionSpell(spell))
+ if(SpellMgr::IsProfessionSpell(trainerSpell.learnedSpell))
data.trainerType = 2;
- data.spellList.push_back(pTrainerSpell);
++count;
} while (result->NextRow());
delete result;
sLog.outString();
- sLog.outString( ">> Loaded Trainers %d", count );
+ sLog.outString( ">> Loaded %d Trainers", count );
}
void ObjectMgr::LoadVendors()
@@ -7461,16 +7489,30 @@ void ObjectMgr::LoadScriptNames()
"SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' "
"UNION "
"SELECT DISTINCT(script) FROM instance_template WHERE script <> ''");
- if(result)
+
+ if( !result )
{
- do
- {
- m_scriptNames.push_back((*result)[0].GetString());
- } while (result->NextRow());
- delete result;
+ barGoLink bar( 1 );
+ bar.step();
+ sLog.outString();
+ sLog.outErrorDb(">> Loaded empty set of Script Names!");
+ return;
}
+ barGoLink bar( result->GetRowCount() );
+ uint32 count = 0;
+
+ do
+ {
+ bar.step();
+ m_scriptNames.push_back((*result)[0].GetString());
+ ++count;
+ } while (result->NextRow());
+ delete result;
+
std::sort(m_scriptNames.begin(), m_scriptNames.end());
+ sLog.outString();
+ sLog.outString( ">> Loaded %d Script Names", count );
}
uint32 ObjectMgr::GetScriptId(const char *name)
@@ -7599,3 +7641,12 @@ void ObjectMgr::LoadTransportEvents()
delete result;
}
+CreatureInfo const* GetCreatureTemplateStore(uint32 entry)
+{
+ return sCreatureStorage.LookupEntry<CreatureInfo>(entry);
+}
+
+Quest const* GetQuestTemplateStore(uint32 entry)
+{
+ return objmgr.GetQuestTemplate(entry);
+}
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 5dbea9c0ce4..3946f912b96 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -34,7 +34,6 @@
#include "ItemPrototype.h"
#include "NPCHandler.h"
#include "Database/DatabaseEnv.h"
-#include "AuctionHouseObject.h"
#include "Mail.h"
#include "Map.h"
#include "ObjectAccessor.h"
@@ -153,6 +152,7 @@ typedef UNORDERED_MAP<uint32,NpcTextLocale> NpcTextLocaleMap;
typedef UNORDERED_MAP<uint32,PageTextLocale> PageTextLocaleMap;
typedef UNORDERED_MAP<uint32,TrinityStringLocale> TrinityStringLocaleMap;
typedef UNORDERED_MAP<uint32,NpcOptionLocale> NpcOptionLocaleMap;
+typedef UNORDERED_MAP<uint32,PointOfInterestLocale> PointOfInterestLocaleMap;
typedef std::multimap<uint32,uint32> QuestRelations;
@@ -179,6 +179,17 @@ struct ReputationOnKillEntry
bool team_dependent;
};
+struct PointOfInterest
+{
+ uint32 entry;
+ float x;
+ float y;
+ uint32 icon;
+ uint32 flags;
+ uint32 data;
+ std::string icon_name;
+};
+
struct PetCreateSpellEntry
{
uint32 spellid[4];
@@ -305,9 +316,10 @@ class ObjectMgr
typedef UNORDERED_MAP<uint32, Item*> ItemMap;
typedef std::set< Group * > GroupSet;
- typedef std::set< Guild * > GuildSet;
- typedef UNORDERED_MAP<uint32, ArenaTeam* > ArenaTeamMap;
+ typedef UNORDERED_MAP<uint32, Guild *> GuildMap;
+
+ typedef UNORDERED_MAP<uint32, ArenaTeam*> ArenaTeamMap;
typedef UNORDERED_MAP<uint32, Quest*> QuestMap;
@@ -316,6 +328,7 @@ class ObjectMgr
typedef UNORDERED_MAP<uint32, uint32> AreaTriggerScriptMap;
typedef UNORDERED_MAP<uint32, ReputationOnKillEntry> RepOnKillMap;
+ typedef UNORDERED_MAP<uint32, PointOfInterest> PointOfInterestMap;
typedef UNORDERED_MAP<uint32, WeatherZoneChances> WeatherZoneMap;
@@ -338,17 +351,17 @@ class ObjectMgr
void RemoveGroup(Group* group) { mGroupSet.erase( group ); }
Guild* GetGuildByLeader(uint64 const&guid) const;
- Guild* GetGuildById(const uint32 GuildId) const;
+ Guild* GetGuildById(uint32 GuildId) const;
Guild* GetGuildByName(const std::string& guildname) const;
- std::string GetGuildNameById(const uint32 GuildId) const;
- void AddGuild(Guild* guild) { mGuildSet.insert( guild ); }
- void RemoveGuild(Guild* guild) { mGuildSet.erase( guild ); }
+ std::string GetGuildNameById(uint32 GuildId) const;
+ void AddGuild(Guild* guild);
+ void RemoveGuild(uint32 Id);
- ArenaTeam* GetArenaTeamById(const uint32 arenateamid) const;
+ ArenaTeam* GetArenaTeamById(uint32 arenateamid) const;
ArenaTeam* GetArenaTeamByName(const std::string& arenateamname) const;
ArenaTeam* GetArenaTeamByCaptain(uint64 const& guid) const;
void AddArenaTeam(ArenaTeam* arenaTeam);
- void RemoveArenaTeam(ArenaTeam* arenaTeam);
+ void RemoveArenaTeam(uint32 Id);
ArenaTeamMap::iterator GetArenaTeamMapBegin() { return mArenaTeamMap.begin(); }
ArenaTeamMap::iterator GetArenaTeamMapEnd() { return mArenaTeamMap.end(); }
@@ -374,42 +387,6 @@ class ObjectMgr
return sInstanceTemplate.LookupEntry<InstanceTemplate>(map);
}
- Item* GetAItem(uint32 id)
- {
- ItemMap::const_iterator itr = mAitems.find(id);
- if (itr != mAitems.end())
- {
- return itr->second;
- }
- return NULL;
- }
- void AddAItem(Item* it)
- {
- ASSERT( it );
- ASSERT( mAitems.find(it->GetGUIDLow()) == mAitems.end());
- mAitems[it->GetGUIDLow()] = it;
- }
- bool RemoveAItem(uint32 id)
- {
- ItemMap::iterator i = mAitems.find(id);
- if (i == mAitems.end())
- {
- return false;
- }
- mAitems.erase(i);
- return true;
- }
- AuctionHouseObject * GetAuctionsMap( uint32 location );
-
- //auction messages
- void SendAuctionWonMail( AuctionEntry * auction );
- void SendAuctionSalePendingMail( AuctionEntry * auction );
- void SendAuctionSuccessfulMail( AuctionEntry * auction );
- void SendAuctionExpiredMail( AuctionEntry * auction );
- static uint32 GetAuctionCut( uint32 location, uint32 highBid );
- static uint32 GetAuctionDeposit(uint32 location, uint32 time, Item *pItem);
- static uint32 GetAuctionOutBid(uint32 currentBid);
-
PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint32 level) const;
PlayerClassInfo const* GetPlayerClassInfo(uint32 class_) const
@@ -435,7 +412,7 @@ class ObjectMgr
uint32 GetPlayerAccountIdByGUID(const uint64 &guid) const;
uint32 GetPlayerAccountIdByPlayerName(const std::string& name) const;
- uint32 GetNearestTaxiNode( float x, float y, float z, uint32 mapid );
+ uint32 GetNearestTaxiNode( float x, float y, float z, uint32 mapid, uint32 team );
void GetTaxiPath( uint32 source, uint32 destination, uint32 &path, uint32 &cost);
uint16 GetTaxiMount( uint32 id, uint32 team );
void GetTaxiPathNodes( uint32 path, Path &pathnodes, std::vector<uint32>& mapIds );
@@ -455,8 +432,16 @@ class ObjectMgr
return itr->second;
return 0;
}
- bool IsTavernAreaTrigger(uint32 Trigger_ID) const { return mTavernAreaTriggerSet.count(Trigger_ID) != 0; }
- bool IsGameObjectForQuests(uint32 entry) const { return mGameObjectForQuestSet.count(entry) != 0; }
+ bool IsTavernAreaTrigger(uint32 Trigger_ID) const
+ {
+ return mTavernAreaTriggerSet.find(Trigger_ID) != mTavernAreaTriggerSet.end();
+ }
+
+ bool IsGameObjectForQuests(uint32 entry) const
+ {
+ return mGameObjectForQuestSet.find(entry) != mGameObjectForQuestSet.end();
+ }
+
bool IsGuildVaultGameObject(Player *player, uint64 guid) const
{
if(GameObject *go = ObjectAccessor::GetGameObject(*player, guid))
@@ -465,16 +450,7 @@ class ObjectMgr
return false;
}
- uint32 GetBattleMasterBG(uint32 entry) const
- {
- BattleMastersMap::const_iterator itr = mBattleMastersMap.find(entry);
- if(itr != mBattleMastersMap.end())
- return itr->second;
- return 2; //BATTLEGROUND_WS - i will not add include only for constant usage!
- }
-
- void AddGossipText(GossipText *pGText);
- GossipText *GetGossipText(uint32 Text_ID);
+ GossipText const* GetGossipText(uint32 Text_ID) const;
WorldSafeLocsEntry const *GetClosestGraveYard(float x, float y, float z, uint32 MapId, uint32 team);
bool AddGraveYardLink(uint32 id, uint32 zone, uint32 team, bool inDB = true);
@@ -491,6 +467,7 @@ class ObjectMgr
}
AreaTrigger const* GetGoBackTrigger(uint32 Map) const;
+ AreaTrigger const* GetMapEntranceTrigger(uint32 Map) const;
uint32 GetAreaTriggerScriptId(uint32 trigger_id);
@@ -502,6 +479,14 @@ class ObjectMgr
return NULL;
}
+ PointOfInterest const* GetPointOfInterest(uint32 id) const
+ {
+ PointOfInterestMap::const_iterator itr = mPointsOfInterest.find(id);
+ if(itr != mPointsOfInterest.end())
+ return &itr->second;
+ return NULL;
+ }
+
PetCreateSpellEntry const* GetPetCreateSpellEntry(uint32 id) const
{
PetCreateSpellMap::const_iterator itr = mPetCreateSpell.find(id);
@@ -560,6 +545,7 @@ class ObjectMgr
void LoadNpcTextLocales();
void LoadPageTextLocales();
void LoadNpcOptionLocales();
+ void LoadPointOfInterestLocales();
void LoadInstanceTemplate();
void LoadGossipText();
@@ -568,15 +554,11 @@ class ObjectMgr
void LoadQuestAreaTriggers();
void LoadAreaTriggerScripts();
void LoadTavernAreaTriggers();
- void LoadBattleMastersEntry();
void LoadGameObjectForQuests();
void LoadItemTexts();
void LoadPageTexts();
- //load first auction items, because of check if item exists, when loading
- void LoadAuctionItems();
- void LoadAuctions();
void LoadPlayerInfo();
void LoadPetLevelInfo();
void LoadExplorationBaseXP();
@@ -586,6 +568,7 @@ class ObjectMgr
void LoadFishingBaseSkillLevel();
void LoadReputationOnKill();
+ void LoadPointsOfInterest();
void LoadWeatherZoneChances();
void LoadGameTele();
@@ -597,6 +580,7 @@ class ObjectMgr
std::string GeneratePetName(uint32 entry);
uint32 GetBaseXP(uint32 level);
+ uint32 GetXPForLevel(uint32 level);
int32 GetFishingBaseSkillLevel(uint32 entry) const
{
@@ -608,12 +592,12 @@ class ObjectMgr
void SetHighestGuids();
uint32 GenerateLowGuid(HighGuid guidhigh);
+ uint32 GenerateArenaTeamId();
uint32 GenerateAuctionID();
- uint32 GenerateMailID();
+ uint32 GenerateGuildId();
uint32 GenerateItemTextID();
+ uint32 GenerateMailID();
uint32 GeneratePetNumber();
- uint32 GenerateArenaTeamId();
- uint32 GenerateGuildId();
void LoadPlayerInfoInCache();
PCachePlayerInfo GetPlayerInfoFromCache(uint32 unPlayerGuid) const;
@@ -696,6 +680,12 @@ class ObjectMgr
if(itr==mNpcOptionLocaleMap.end()) return NULL;
return &itr->second;
}
+ PointOfInterestLocale const* GetPointOfInterestLocale(uint32 poi_id) const
+ {
+ PointOfInterestLocaleMap::const_iterator itr = mPointOfInterestLocaleMap.find(poi_id);
+ if(itr==mPointOfInterestLocaleMap.end()) return NULL;
+ return &itr->second;
+ }
GameObjectData const* GetGOData(uint32 guid) const
{
@@ -734,10 +724,7 @@ class ObjectMgr
// reserved names
void LoadReservedPlayersNames();
- bool IsReservedName(const std::string& name) const
- {
- return m_ReservedNames.find(name) != m_ReservedNames.end();
- }
+ bool IsReservedName(const std::string& name) const;
// name with valid structure and symbols
static bool IsValidName( const std::string& name, bool create = false );
@@ -811,20 +798,23 @@ class ObjectMgr
ScriptNameMap &GetScriptNames() { return m_scriptNames; }
const char * GetScriptName(uint32 id) { return id < m_scriptNames.size() ? m_scriptNames[id].c_str() : ""; }
uint32 GetScriptId(const char *name);
+
+ int GetOrNewIndexForLocale(LocaleConstant loc);
protected:
// first free id for selected id type
- uint32 m_auctionid;
- uint32 m_mailid;
- uint32 m_ItemTextId;
uint32 m_arenaTeamId;
+ uint32 m_auctionid;
uint32 m_guildId;
+ uint32 m_ItemTextId;
+ uint32 m_mailid;
uint32 m_hiPetNumber;
// first free low guid for seelcted guid type
uint32 m_hiCharGuid;
uint32 m_hiCreatureGuid;
uint32 m_hiPetGuid;
+ uint32 m_hiVehicleGuid;
uint32 m_hiItemGuid;
uint32 m_hiGoGuid;
uint32 m_hiDoGuid;
@@ -832,28 +822,19 @@ class ObjectMgr
QuestMap mQuestTemplates;
- typedef UNORDERED_MAP<uint32, GossipText*> GossipTextMap;
+ typedef UNORDERED_MAP<uint32, GossipText> GossipTextMap;
typedef UNORDERED_MAP<uint32, uint32> QuestAreaTriggerMap;
- typedef UNORDERED_MAP<uint32, uint32> BattleMastersMap;
typedef UNORDERED_MAP<uint32, std::string> ItemTextMap;
typedef std::set<uint32> TavernAreaTriggerSet;
typedef std::set<uint32> GameObjectForQuestSet;
GroupSet mGroupSet;
- GuildSet mGuildSet;
+ GuildMap mGuildMap;
ArenaTeamMap mArenaTeamMap;
- ItemMap mItems;
- ItemMap mAitems;
-
ItemTextMap mItemTexts;
- AuctionHouseObject mHordeAuctions;
- AuctionHouseObject mAllianceAuctions;
- AuctionHouseObject mNeutralAuctions;
-
QuestAreaTriggerMap mQuestAreaTriggerMap;
- BattleMastersMap mBattleMastersMap;
TavernAreaTriggerSet mTavernAreaTriggerSet;
GameObjectForQuestSet mGameObjectForQuestSet;
GossipTextMap mGossipText;
@@ -862,12 +843,14 @@ class ObjectMgr
RepOnKillMap mRepOnKill;
+ PointOfInterestMap mPointsOfInterest;
+
WeatherZoneMap mWeatherZoneMap;
PetCreateSpellMap mPetCreateSpell;
//character reserved names
- typedef std::set<std::string> ReservedNamesMap;
+ typedef std::set<std::wstring> ReservedNamesMap;
ReservedNamesMap m_ReservedNames;
std::set<uint32> m_DisabledPlayerSpells;
@@ -881,7 +864,6 @@ class ObjectMgr
typedef std::vector<LocaleConstant> LocalForIndex;
LocalForIndex m_LocalForIndex;
- int GetOrNewIndexForLocale(LocaleConstant loc);
int DBCLocaleIndex;
@@ -900,6 +882,9 @@ class ObjectMgr
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo* plinfo) const;
PlayerInfo playerInfo[MAX_RACES][MAX_CLASSES];
+ typedef std::vector<uint32> PlayerXPperLevel; // [level]
+ PlayerXPperLevel mPlayerXPperLevel;
+
typedef std::map<uint32,uint32> BaseXPMap; // [area level][base xp]
BaseXPMap mBaseXPTable;
@@ -921,6 +906,7 @@ class ObjectMgr
PageTextLocaleMap mPageTextLocaleMap;
TrinityStringLocaleMap mTrinityStringLocaleMap;
NpcOptionLocaleMap mNpcOptionLocaleMap;
+ PointOfInterestLocaleMap mPointOfInterestLocaleMap;
RespawnTimes mCreatureRespawnTimes;
RespawnTimes mGORespawnTimes;
@@ -946,6 +932,8 @@ TRINITY_DLL_SPEC uint32 GetScriptId(const char *name);
TRINITY_DLL_SPEC ObjectMgr::ScriptNameMap& GetScriptNames();
TRINITY_DLL_SPEC GameObjectInfo const *GetGameObjectInfo(uint32 id);
TRINITY_DLL_SPEC CreatureInfo const *GetCreatureInfo(uint32 id);
+TRINITY_DLL_SPEC CreatureInfo const* GetCreatureTemplateStore(uint32 entry);
+TRINITY_DLL_SPEC Quest const* GetQuestTemplateStore(uint32 entry);
#endif
diff --git a/src/game/ObjectPosSelector.cpp b/src/game/ObjectPosSelector.cpp
new file mode 100644
index 00000000000..899dfec3fdb
--- /dev/null
+++ b/src/game/ObjectPosSelector.cpp
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ObjectPosSelector.h"
+
+ObjectPosSelector::ObjectPosSelector(float x,float y,float size,float dist)
+: m_center_x(x),m_center_y(y),m_size(size),m_dist(dist)
+{
+ m_anglestep = acos(m_dist/(m_dist+2*m_size));
+
+ m_nextUsedPos[USED_POS_PLUS] = m_UsedPosLists[USED_POS_PLUS].end();
+ m_nextUsedPos[USED_POS_MINUS] = m_UsedPosLists[USED_POS_MINUS].end();
+
+ m_smallStepAngle[USED_POS_PLUS] = 0;
+ m_smallStepAngle[USED_POS_MINUS] = 0;
+
+ m_smallStepOk[USED_POS_PLUS] = false;
+ m_smallStepOk[USED_POS_MINUS] = false;
+
+ m_smallStepNextUsedPos[USED_POS_PLUS] = NULL;
+ m_smallStepNextUsedPos[USED_POS_MINUS] = NULL;
+}
+
+ObjectPosSelector::UsedPosList::value_type const* ObjectPosSelector::nextUsedPos(UsedPosType uptype)
+{
+ UsedPosList::const_iterator itr = m_nextUsedPos[uptype];
+ if(itr!=m_UsedPosLists[uptype].end())
+ ++itr;
+
+ if(itr==m_UsedPosLists[uptype].end())
+ {
+ if(!m_UsedPosLists[~uptype].empty())
+ return &*m_UsedPosLists[~uptype].rbegin();
+ else
+ return NULL;
+ }
+ else
+ return &*itr;
+}
+
+void ObjectPosSelector::AddUsedPos(float size,float angle,float dist)
+{
+ if(angle>=0)
+ m_UsedPosLists[USED_POS_PLUS].insert(UsedPosList::value_type(angle,UsedPos(1.0,size,dist)));
+ else
+ m_UsedPosLists[USED_POS_MINUS].insert(UsedPosList::value_type(-angle,UsedPos(-1.0,size,dist)));
+}
+
+void ObjectPosSelector::InitializeAngle()
+{
+ m_nextUsedPos[USED_POS_PLUS] = m_UsedPosLists[USED_POS_PLUS].begin();
+ m_nextUsedPos[USED_POS_MINUS] = m_UsedPosLists[USED_POS_MINUS].begin();
+
+ m_smallStepAngle[USED_POS_PLUS] = 0;
+ m_smallStepAngle[USED_POS_MINUS] = 0;
+
+ m_smallStepOk[USED_POS_PLUS] = true;
+ m_smallStepOk[USED_POS_MINUS] = true;
+}
+
+bool ObjectPosSelector::FirstAngle(float& angle)
+{
+ if(m_UsedPosLists[USED_POS_PLUS].empty() && !m_UsedPosLists[USED_POS_MINUS].empty() )
+ return NextAngleFor(*m_UsedPosLists[USED_POS_MINUS].begin(),1.0,USED_POS_PLUS,angle);
+ else if(m_UsedPosLists[USED_POS_MINUS].empty() && !m_UsedPosLists[USED_POS_PLUS].empty() )
+ return NextAngleFor(*m_UsedPosLists[USED_POS_PLUS].begin(),-1.0,USED_POS_MINUS,angle);
+
+ return false;
+}
+
+bool ObjectPosSelector::NextAngle(float& angle)
+{
+ while(m_nextUsedPos[USED_POS_PLUS]!=m_UsedPosLists[USED_POS_PLUS].end() ||
+ m_nextUsedPos[USED_POS_MINUS]!=m_UsedPosLists[USED_POS_MINUS].end() ||
+ m_smallStepOk[USED_POS_PLUS] || m_smallStepOk[USED_POS_MINUS] )
+ {
+ // calculate next possible angle
+ if(NextPosibleAngle(angle))
+ return true;
+ }
+
+ return false;
+}
+
+bool ObjectPosSelector::NextUsedAngle(float& angle)
+{
+ while(m_nextUsedPos[USED_POS_PLUS]!=m_UsedPosLists[USED_POS_PLUS].end() ||
+ m_nextUsedPos[USED_POS_MINUS]!=m_UsedPosLists[USED_POS_MINUS].end() )
+ {
+ // calculate next possible angle
+ if(!NextPosibleAngle(angle))
+ return true;
+ }
+
+ return false;
+}
+
+bool ObjectPosSelector::NextPosibleAngle( float& angle )
+{
+ // ++ direction less updated
+ if( m_nextUsedPos[USED_POS_PLUS]!=m_UsedPosLists[USED_POS_PLUS].end() &&
+ (m_nextUsedPos[USED_POS_MINUS]==m_UsedPosLists[USED_POS_MINUS].end() || m_nextUsedPos[USED_POS_PLUS]->first <= m_nextUsedPos[USED_POS_MINUS]->first) )
+ {
+ bool ok;
+ if(m_smallStepOk[USED_POS_PLUS])
+ ok = NextSmallStepAngle(1.0,USED_POS_PLUS,angle);
+ else
+ ok = NextAngleFor(*m_nextUsedPos[USED_POS_PLUS],1.0,USED_POS_PLUS,angle);
+
+ if(!ok)
+ ++m_nextUsedPos[USED_POS_PLUS]; // increase. only at fail (original or checked)
+ return ok;
+ }
+ // -- direction less updated
+ else if( m_nextUsedPos[USED_POS_MINUS]!=m_UsedPosLists[USED_POS_MINUS].end())
+ {
+ bool ok;
+ if(m_smallStepOk[USED_POS_MINUS])
+ ok = NextSmallStepAngle(-1.0,USED_POS_MINUS,angle);
+ else
+ ok = NextAngleFor(*m_nextUsedPos[USED_POS_MINUS],-1.0,USED_POS_MINUS,angle);
+
+ if(!ok)
+ ++m_nextUsedPos[USED_POS_MINUS];
+ return ok;
+ }
+ else // both list empty
+ {
+ if( m_smallStepOk[USED_POS_PLUS] && (!m_smallStepOk[USED_POS_MINUS] || m_smallStepAngle[USED_POS_PLUS] <= m_smallStepAngle[USED_POS_MINUS]) )
+ {
+ return NextSmallStepAngle(1.0,USED_POS_PLUS,angle);
+ }
+ // -- direction less updated
+ else if( m_smallStepOk[USED_POS_MINUS] )
+ {
+ return NextSmallStepAngle(-1.0,USED_POS_MINUS,angle);
+ }
+ }
+
+ // no angles
+ return false;
+}
diff --git a/src/game/ObjectPosSelector.h b/src/game/ObjectPosSelector.h
new file mode 100644
index 00000000000..84050611121
--- /dev/null
+++ b/src/game/ObjectPosSelector.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _OBJECT_POS_SELECTOR_H
+#define _OBJECT_POS_SELECTOR_H
+
+#include<Common.h>
+
+#include<map>
+
+enum UsedPosType { USED_POS_PLUS, USED_POS_MINUS };
+
+inline UsedPosType operator ~(UsedPosType uptype)
+{
+ return uptype==USED_POS_PLUS ? USED_POS_MINUS : USED_POS_PLUS;
+}
+
+struct ObjectPosSelector
+{
+ struct UsedPos
+ {
+ UsedPos(float sign_, float size_,float dist_) : sign(sign_), size(size_),dist(dist_) {}
+
+ float sign;
+
+ float size; // size of point
+ float dist; // dist to central point (including central point size)
+ };
+
+ typedef std::multimap<float,UsedPos> UsedPosList; // abs(angle)->Node
+
+ ObjectPosSelector(float x,float y,float size,float dist);
+
+ void AddUsedPos(float size,float angle,float dist);
+ void InitializeAngle();
+
+ bool FirstAngle(float& angle);
+ bool NextAngle(float& angle);
+ bool NextUsedAngle(float& angle);
+
+ bool NextPosibleAngle( float& angle );
+
+ bool CheckAngle(UsedPosList::value_type const& nextUsedPos, float sign, float angle ) const
+ {
+ float angle_step2 = GetAngle(nextUsedPos.second);
+
+ float next_angle = nextUsedPos.first;
+ if(nextUsedPos.second.sign * sign < 0) // last node from diff. list (-pi+alpha)
+ next_angle = 2*M_PI-next_angle; // move to positive
+
+ return fabs(angle)+angle_step2 <= next_angle;
+ }
+
+ bool CheckOriginal() const
+ {
+ return (m_UsedPosLists[USED_POS_PLUS].empty() || CheckAngle( *m_UsedPosLists[USED_POS_PLUS].begin(),1.0,0)) &&
+ (m_UsedPosLists[USED_POS_MINUS].empty() || CheckAngle( *m_UsedPosLists[USED_POS_MINUS].begin(),-1.0,0));
+ }
+
+ bool IsNonBalanced() const { return m_UsedPosLists[USED_POS_PLUS].empty() != m_UsedPosLists[USED_POS_MINUS].empty(); }
+
+ bool NextAngleFor( UsedPosList::value_type const& usedPos, float sign, UsedPosType uptype, float &angle )
+ {
+ float angle_step = GetAngle(usedPos.second);
+
+ // next possible angle
+ angle = usedPos.first * usedPos.second.sign + angle_step * sign;
+
+ UsedPosList::value_type const* nextNode = nextUsedPos(uptype);
+ if(nextNode)
+ {
+ // if next node permit use selected angle, then do it
+ if(!CheckAngle(*nextNode, sign, angle))
+ {
+ m_smallStepOk[uptype] = false;
+ return false;
+ }
+ }
+
+ // possible more points
+ m_smallStepOk[uptype] = true;
+ m_smallStepAngle[uptype] = angle;
+ m_smallStepNextUsedPos[uptype] = nextNode;
+
+ return true;
+ }
+
+ bool NextSmallStepAngle( float sign, UsedPosType uptype, float &angle )
+ {
+ // next possible angle
+ angle = m_smallStepAngle[uptype] + m_anglestep * sign;
+
+ if(fabs(angle) > M_PI)
+ {
+ m_smallStepOk[uptype] = false;
+ return false;
+ }
+
+ if(m_smallStepNextUsedPos[uptype])
+ {
+ if(fabs(angle) >= m_smallStepNextUsedPos[uptype]->first)
+ {
+ m_smallStepOk[uptype] = false;
+ return false;
+ }
+
+ // if next node permit use selected angle, then do it
+ if(!CheckAngle(*m_smallStepNextUsedPos[uptype], sign, angle))
+ {
+ m_smallStepOk[uptype] = false;
+ return false;
+ }
+ }
+
+ // possible more points
+ m_smallStepAngle[uptype] = angle;
+ return true;
+ }
+
+ // next used post for m_nextUsedPos[uptype]
+ UsedPosList::value_type const* nextUsedPos(UsedPosType uptype);
+
+ // angle from used pos to next possible free pos
+ float GetAngle(UsedPos const& usedPos) const { return acos(m_dist/(usedPos.dist+usedPos.size+m_size)); }
+
+ float m_center_x;
+ float m_center_y;
+ float m_size; // size of object in center
+ float m_dist; // distance for searching pos (including central object size)
+ float m_anglestep;
+
+ UsedPosList m_UsedPosLists[2];
+ UsedPosList::const_iterator m_nextUsedPos[2];
+
+ // field for small step from first after next used pos until next pos
+ float m_smallStepAngle[2];
+ bool m_smallStepOk[2];
+ UsedPosList::value_type const* m_smallStepNextUsedPos[2];
+};
+#endif
diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp
index eebe4343797..bba5c81ae9e 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -28,1065 +28,1202 @@
/// Correspondence between opcodes and their names
OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
{
- /*0x000*/ { "MSG_NULL_ACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x001*/ { "CMSG_BOOTME", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x002*/ { "CMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x003*/ { "SMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x004*/ { "CMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x005*/ { "SMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x006*/ { "CMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x007*/ { "SMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x008*/ { "CMSG_WORLD_TELEPORT", STATUS_LOGGEDIN, &WorldSession::HandleWorldTeleportOpcode },
- /*0x009*/ { "CMSG_TELEPORT_TO_UNIT", STATUS_LOGGEDIN, &WorldSession::Handle_NULL },
- /*0x00A*/ { "CMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00B*/ { "SMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x00C*/ { "CMSG_DEBUG_CHANGECELLZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00D*/ { "CMSG_EMBLAZON_TABARD_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00E*/ { "CMSG_UNEMBLAZON_TABARD_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00F*/ { "CMSG_RECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x010*/ { "CMSG_LEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x011*/ { "CMSG_CREATEMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x012*/ { "CMSG_DESTROYMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x013*/ { "CMSG_CREATEITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x014*/ { "CMSG_CREATEGAMEOBJECT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x015*/ { "SMSG_CHECK_FOR_BOTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x016*/ { "CMSG_MAKEMONSTERATTACKGUID", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x017*/ { "CMSG_BOT_DETECTED2", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x018*/ { "CMSG_FORCEACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x019*/ { "CMSG_FORCEACTIONONOTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x01A*/ { "CMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x01B*/ { "SMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x01C*/ { "CMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x01D*/ { "SMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x01E*/ { "SMSG_DEBUGINFOSPELLMISS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x01F*/ { "CMSG_WEATHER_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x020*/ { "CMSG_UNDRESSPLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x021*/ { "CMSG_BEASTMASTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x022*/ { "CMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x023*/ { "SMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x024*/ { "CMSG_CHEAT_SETMONEY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x025*/ { "CMSG_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x026*/ { "CMSG_PET_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x027*/ { "CMSG_SET_WORLDSTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x028*/ { "CMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x029*/ { "CMSG_USE_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02A*/ { "CMSG_FLAG_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02B*/ { "CMSG_FLAG_QUEST_FINISH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02C*/ { "CMSG_CLEAR_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02D*/ { "CMSG_SEND_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02E*/ { "CMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02F*/ { "SMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x030*/ { "CMSG_DISABLE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x031*/ { "CMSG_ADVANCE_SPAWN_TIME", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x032*/ { "CMSG_PVP_PORT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x033*/ { "CMSG_AUTH_SRP6_BEGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x034*/ { "CMSG_AUTH_SRP6_PROOF", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x035*/ { "CMSG_AUTH_SRP6_RECODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x036*/ { "CMSG_CHAR_CREATE", STATUS_AUTHED, &WorldSession::HandleCharCreateOpcode },
- /*0x037*/ { "CMSG_CHAR_ENUM", STATUS_AUTHED, &WorldSession::HandleCharEnumOpcode },
- /*0x038*/ { "CMSG_CHAR_DELETE", STATUS_AUTHED, &WorldSession::HandleCharDeleteOpcode },
- /*0x039*/ { "SMSG_AUTH_SRP6_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03A*/ { "SMSG_CHAR_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03B*/ { "SMSG_CHAR_ENUM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03C*/ { "SMSG_CHAR_DELETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03D*/ { "CMSG_PLAYER_LOGIN", STATUS_AUTHED, &WorldSession::HandlePlayerLoginOpcode },
- /*0x03E*/ { "SMSG_NEW_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03F*/ { "SMSG_TRANSFER_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x040*/ { "SMSG_TRANSFER_ABORTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x041*/ { "SMSG_CHARACTER_LOGIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x042*/ { "SMSG_LOGIN_SETTIMESPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x043*/ { "SMSG_GAMETIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x044*/ { "CMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x045*/ { "SMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x046*/ { "CMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x047*/ { "SMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x048*/ { "CMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x049*/ { "SMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x04A*/ { "CMSG_PLAYER_LOGOUT", STATUS_LOGGEDIN, &WorldSession::HandlePlayerLogoutOpcode },
- /*0x04B*/ { "CMSG_LOGOUT_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleLogoutRequestOpcode },
- /*0x04C*/ { "SMSG_LOGOUT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x04D*/ { "SMSG_LOGOUT_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x04E*/ { "CMSG_LOGOUT_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleLogoutCancelOpcode },
- /*0x04F*/ { "SMSG_LOGOUT_CANCEL_ACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x050*/ { "CMSG_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNameQueryOpcode },
- /*0x051*/ { "SMSG_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x052*/ { "CMSG_PET_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetNameQuery },
- /*0x053*/ { "SMSG_PET_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x054*/ { "CMSG_GUILD_QUERY", STATUS_AUTHED, &WorldSession::HandleGuildQueryOpcode },
- /*0x055*/ { "SMSG_GUILD_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x056*/ { "CMSG_ITEM_QUERY_SINGLE", STATUS_LOGGEDIN, &WorldSession::HandleItemQuerySingleOpcode },
- /*0x057*/ { "CMSG_ITEM_QUERY_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x058*/ { "SMSG_ITEM_QUERY_SINGLE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x059*/ { "SMSG_ITEM_QUERY_MULTIPLE_RESPONSE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x05A*/ { "CMSG_PAGE_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePageQueryOpcode },
- /*0x05B*/ { "SMSG_PAGE_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x05C*/ { "CMSG_QUEST_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestQueryOpcode },
- /*0x05D*/ { "SMSG_QUEST_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x05E*/ { "CMSG_GAMEOBJECT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectQueryOpcode },
- /*0x05F*/ { "SMSG_GAMEOBJECT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x060*/ { "CMSG_CREATURE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCreatureQueryOpcode },
- /*0x061*/ { "SMSG_CREATURE_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x062*/ { "CMSG_WHO", STATUS_LOGGEDIN, &WorldSession::HandleWhoOpcode },
- /*0x063*/ { "SMSG_WHO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x064*/ { "CMSG_WHOIS", STATUS_LOGGEDIN, &WorldSession::HandleWhoisOpcode },
- /*0x065*/ { "SMSG_WHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x066*/ { "CMSG_CONTACT_LIST", STATUS_LOGGEDIN, &WorldSession::HandleFriendListOpcode },
- /*0x067*/ { "SMSG_CONTACT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x068*/ { "SMSG_FRIEND_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x069*/ { "CMSG_ADD_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleAddFriendOpcode },
- /*0x06A*/ { "CMSG_DEL_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleDelFriendOpcode },
- /*0x06B*/ { "CMSG_SET_CONTACT_NOTES", STATUS_LOGGEDIN, &WorldSession::HandleSetFriendNoteOpcode },
- /*0x06C*/ { "CMSG_ADD_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleAddIgnoreOpcode },
- /*0x06D*/ { "CMSG_DEL_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleDelIgnoreOpcode },
- /*0x06E*/ { "CMSG_GROUP_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupInviteOpcode },
- /*0x06F*/ { "SMSG_GROUP_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x070*/ { "CMSG_GROUP_CANCEL", STATUS_LOGGEDIN, &WorldSession::Handle_Deprecated },
- /*0x071*/ { "SMSG_GROUP_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x072*/ { "CMSG_GROUP_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGroupAcceptOpcode },
- /*0x073*/ { "CMSG_GROUP_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGroupDeclineOpcode },
- /*0x074*/ { "SMSG_GROUP_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x075*/ { "CMSG_GROUP_UNINVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteNameOpcode },
- /*0x076*/ { "CMSG_GROUP_UNINVITE_GUID", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteGuidOpcode },
- /*0x077*/ { "SMSG_GROUP_UNINVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x078*/ { "CMSG_GROUP_SET_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupSetLeaderOpcode },
- /*0x079*/ { "SMSG_GROUP_SET_LEADER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07A*/ { "CMSG_LOOT_METHOD", STATUS_LOGGEDIN, &WorldSession::HandleLootMethodOpcode },
- /*0x07B*/ { "CMSG_GROUP_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGroupLeaveOpcode },
- /*0x07C*/ { "SMSG_GROUP_DESTROYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07D*/ { "SMSG_GROUP_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07E*/ { "SMSG_PARTY_MEMBER_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07F*/ { "SMSG_PARTY_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x080*/ { "UMSG_UPDATE_GROUP_MEMBERS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x081*/ { "CMSG_GUILD_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildCreateOpcode },
- /*0x082*/ { "CMSG_GUILD_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGuildInviteOpcode },
- /*0x083*/ { "SMSG_GUILD_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x084*/ { "CMSG_GUILD_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGuildAcceptOpcode },
- /*0x085*/ { "CMSG_GUILD_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDeclineOpcode },
- /*0x086*/ { "SMSG_GUILD_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x087*/ { "CMSG_GUILD_INFO", STATUS_LOGGEDIN, &WorldSession::HandleGuildInfoOpcode },
- /*0x088*/ { "SMSG_GUILD_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x089*/ { "CMSG_GUILD_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleGuildRosterOpcode },
- /*0x08A*/ { "SMSG_GUILD_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x08B*/ { "CMSG_GUILD_PROMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildPromoteOpcode },
- /*0x08C*/ { "CMSG_GUILD_DEMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDemoteOpcode },
- /*0x08D*/ { "CMSG_GUILD_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaveOpcode },
- /*0x08E*/ { "CMSG_GUILD_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildRemoveOpcode },
- /*0x08F*/ { "CMSG_GUILD_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGuildDisbandOpcode },
- /*0x090*/ { "CMSG_GUILD_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaderOpcode },
- /*0x091*/ { "CMSG_GUILD_MOTD", STATUS_LOGGEDIN, &WorldSession::HandleGuildMOTDOpcode },
- /*0x092*/ { "SMSG_GUILD_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x093*/ { "SMSG_GUILD_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x094*/ { "UMSG_UPDATE_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x095*/ { "CMSG_MESSAGECHAT", STATUS_LOGGEDIN, &WorldSession::HandleMessagechatOpcode },
- /*0x096*/ { "SMSG_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x097*/ { "CMSG_JOIN_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoin },
- /*0x098*/ { "CMSG_LEAVE_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelLeave },
- /*0x099*/ { "SMSG_CHANNEL_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x09A*/ { "CMSG_CHANNEL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelList },
- /*0x09B*/ { "SMSG_CHANNEL_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x09C*/ { "CMSG_CHANNEL_PASSWORD", STATUS_LOGGEDIN, &WorldSession::HandleChannelPassword },
- /*0x09D*/ { "CMSG_CHANNEL_SET_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelSetOwner },
- /*0x09E*/ { "CMSG_CHANNEL_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelOwner },
- /*0x09F*/ { "CMSG_CHANNEL_MODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerator },
- /*0x0A0*/ { "CMSG_CHANNEL_UNMODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmoderator },
- /*0x0A1*/ { "CMSG_CHANNEL_MUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelMute },
- /*0x0A2*/ { "CMSG_CHANNEL_UNMUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmute },
- /*0x0A3*/ { "CMSG_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelInvite },
- /*0x0A4*/ { "CMSG_CHANNEL_KICK", STATUS_LOGGEDIN, &WorldSession::HandleChannelKick },
- /*0x0A5*/ { "CMSG_CHANNEL_BAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelBan },
- /*0x0A6*/ { "CMSG_CHANNEL_UNBAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnban },
- /*0x0A7*/ { "CMSG_CHANNEL_ANNOUNCEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleChannelAnnounce },
- /*0x0A8*/ { "CMSG_CHANNEL_MODERATE", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerate },
- /*0x0A9*/ { "SMSG_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0AA*/ { "SMSG_DESTROY_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0AB*/ { "CMSG_USE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleUseItemOpcode },
- /*0x0AC*/ { "CMSG_OPEN_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleOpenItemOpcode },
- /*0x0AD*/ { "CMSG_READ_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleReadItem },
- /*0x0AE*/ { "SMSG_READ_ITEM_OK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0AF*/ { "SMSG_READ_ITEM_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0B0*/ { "SMSG_ITEM_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0B1*/ { "CMSG_GAMEOBJ_USE", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectUseOpcode },
- /*0x0B2*/ { "CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0B3*/ { "SMSG_GAMEOBJECT_CUSTOM_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0B4*/ { "CMSG_AREATRIGGER", STATUS_LOGGEDIN, &WorldSession::HandleAreaTriggerOpcode },
- /*0x0B5*/ { "MSG_MOVE_START_FORWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B6*/ { "MSG_MOVE_START_BACKWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B7*/ { "MSG_MOVE_STOP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B8*/ { "MSG_MOVE_START_STRAFE_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B9*/ { "MSG_MOVE_START_STRAFE_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BA*/ { "MSG_MOVE_STOP_STRAFE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BB*/ { "MSG_MOVE_JUMP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BC*/ { "MSG_MOVE_START_TURN_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BD*/ { "MSG_MOVE_START_TURN_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BE*/ { "MSG_MOVE_STOP_TURN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BF*/ { "MSG_MOVE_START_PITCH_UP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C0*/ { "MSG_MOVE_START_PITCH_DOWN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C1*/ { "MSG_MOVE_STOP_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C2*/ { "MSG_MOVE_SET_RUN_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C3*/ { "MSG_MOVE_SET_WALK_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C4*/ { "MSG_MOVE_TOGGLE_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C5*/ { "MSG_MOVE_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C6*/ { "MSG_MOVE_TELEPORT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C7*/ { "MSG_MOVE_TELEPORT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveTeleportAck },
- /*0x0C8*/ { "MSG_MOVE_TOGGLE_FALL_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C9*/ { "MSG_MOVE_FALL_LAND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0CA*/ { "MSG_MOVE_START_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0CB*/ { "MSG_MOVE_STOP_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0CC*/ { "MSG_MOVE_SET_RUN_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0CD*/ { "MSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0CE*/ { "MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT",STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0CF*/ { "MSG_MOVE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D0*/ { "MSG_MOVE_SET_WALK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D1*/ { "MSG_MOVE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D2*/ { "MSG_MOVE_SET_SWIM_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D3*/ { "MSG_MOVE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D4*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT",STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D5*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D6*/ { "MSG_MOVE_SET_ALL_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D7*/ { "MSG_MOVE_SET_TURN_RATE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D8*/ { "MSG_MOVE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D9*/ { "MSG_MOVE_TOGGLE_COLLISION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0DA*/ { "MSG_MOVE_SET_FACING", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0DB*/ { "MSG_MOVE_SET_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0DC*/ { "MSG_MOVE_WORLDPORT_ACK", STATUS_TRANSFER_PENDING, &WorldSession::HandleMoveWorldportAckOpcode},
- /*0x0DD*/ { "SMSG_MONSTER_MOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0DE*/ { "SMSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0DF*/ { "SMSG_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E0*/ { "MSG_MOVE_SET_RAW_POSITION_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0E1*/ { "CMSG_MOVE_SET_RAW_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0E2*/ { "SMSG_FORCE_RUN_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E3*/ { "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x0E4*/ { "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E5*/ { "CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
- /*0x0E6*/ { "SMSG_FORCE_SWIM_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E7*/ { "CMSG_FORCE_SWIM_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x0E8*/ { "SMSG_FORCE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E9*/ { "CMSG_FORCE_MOVE_ROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveRootAck },
- /*0x0EA*/ { "SMSG_FORCE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0EB*/ { "CMSG_FORCE_MOVE_UNROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveUnRootAck },
- /*0x0EC*/ { "MSG_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0ED*/ { "MSG_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0EE*/ { "MSG_MOVE_HEARTBEAT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0EF*/ { "SMSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F0*/ { "CMSG_MOVE_KNOCK_BACK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveKnockBackAck },
- /*0x0F1*/ { "MSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0F2*/ { "SMSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F3*/ { "SMSG_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F6*/ { "CMSG_MOVE_HOVER_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveHoverAck },
- /*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0F8*/ { "CMSG_TRIGGER_CINEMATIC_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0F9*/ { "CMSG_OPENING_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0FA*/ { "SMSG_TRIGGER_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0FB*/ { "CMSG_NEXT_CINEMATIC_CAMERA", STATUS_LOGGEDIN, &WorldSession::HandleNextCinematicCamera },
- /*0x0FC*/ { "CMSG_COMPLETE_CINEMATIC", STATUS_LOGGEDIN, &WorldSession::HandleCompleteCinema },
- /*0x0FD*/ { "SMSG_TUTORIAL_FLAGS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0FE*/ { "CMSG_TUTORIAL_FLAG", STATUS_LOGGEDIN, &WorldSession::HandleTutorialFlag },
- /*0x0FF*/ { "CMSG_TUTORIAL_CLEAR", STATUS_LOGGEDIN, &WorldSession::HandleTutorialClear },
- /*0x100*/ { "CMSG_TUTORIAL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleTutorialReset },
- /*0x101*/ { "CMSG_STANDSTATECHANGE", STATUS_LOGGEDIN, &WorldSession::HandleStandStateChangeOpcode },
- /*0x102*/ { "CMSG_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleEmoteOpcode },
- /*0x103*/ { "SMSG_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x104*/ { "CMSG_TEXT_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleTextEmoteOpcode },
- /*0x105*/ { "SMSG_TEXT_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x106*/ { "CMSG_AUTOEQUIP_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x107*/ { "CMSG_AUTOSTORE_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x108*/ { "CMSG_AUTOSTORE_LOOT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutostoreLootItemOpcode },
- /*0x109*/ { "CMSG_STORE_LOOT_IN_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x10A*/ { "CMSG_AUTOEQUIP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemOpcode },
- /*0x10B*/ { "CMSG_AUTOSTORE_BAG_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBagItemOpcode },
- /*0x10C*/ { "CMSG_SWAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapItem },
- /*0x10D*/ { "CMSG_SWAP_INV_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapInvItemOpcode },
- /*0x10E*/ { "CMSG_SPLIT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSplitItemOpcode },
- /*0x10F*/ { "CMSG_AUTOEQUIP_ITEM_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemSlotOpcode },
- /*0x110*/ { "OBSOLETE_DROP_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x111*/ { "CMSG_DESTROYITEM", STATUS_LOGGEDIN, &WorldSession::HandleDestroyItemOpcode },
- /*0x112*/ { "SMSG_INVENTORY_CHANGE_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x113*/ { "SMSG_OPEN_CONTAINER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x114*/ { "CMSG_INSPECT", STATUS_LOGGEDIN, &WorldSession::HandleInspectOpcode },
- /*0x115*/ { "SMSG_INSPECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x116*/ { "CMSG_INITIATE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleInitiateTradeOpcode },
- /*0x117*/ { "CMSG_BEGIN_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBeginTradeOpcode },
- /*0x118*/ { "CMSG_BUSY_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBusyTradeOpcode },
- /*0x119*/ { "CMSG_IGNORE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleIgnoreTradeOpcode },
- /*0x11A*/ { "CMSG_ACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleAcceptTradeOpcode },
- /*0x11B*/ { "CMSG_UNACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleUnacceptTradeOpcode },
- /*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_AUTHED, &WorldSession::HandleCancelTradeOpcode },
- /*0x11D*/ { "CMSG_SET_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeItemOpcode },
- /*0x11E*/ { "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleClearTradeItemOpcode },
- /*0x11F*/ { "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeGoldOpcode },
- /*0x120*/ { "SMSG_TRADE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x121*/ { "SMSG_TRADE_STATUS_EXTENDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x122*/ { "SMSG_INITIALIZE_FACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x123*/ { "SMSG_SET_FACTION_VISIBLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x124*/ { "SMSG_SET_FACTION_STANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x125*/ { "CMSG_SET_FACTION_ATWAR", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionAtWar },
- /*0x126*/ { "CMSG_SET_FACTION_CHEAT", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionCheat },
- /*0x127*/ { "SMSG_SET_PROFICIENCY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x128*/ { "CMSG_SET_ACTION_BUTTON", STATUS_LOGGEDIN, &WorldSession::HandleSetActionButtonOpcode },
- /*0x129*/ { "SMSG_ACTION_BUTTONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12A*/ { "SMSG_INITIAL_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12B*/ { "SMSG_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12C*/ { "SMSG_SUPERCEDED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12D*/ { "CMSG_NEW_SPELL_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x12E*/ { "CMSG_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCastSpellOpcode },
- /*0x12F*/ { "CMSG_CANCEL_CAST", STATUS_LOGGEDIN, &WorldSession::HandleCancelCastOpcode },
- /*0x130*/ { "SMSG_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x131*/ { "SMSG_SPELL_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x132*/ { "SMSG_SPELL_GO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x133*/ { "SMSG_SPELL_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
- /*0x137*/ { "SMSG_UPDATE_AURA_DURATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
- /*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
- /*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode },
- /*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
- /*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
- /*0x143*/ { "SMSG_ATTACKSTART", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x144*/ { "SMSG_ATTACKSTOP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x145*/ { "SMSG_ATTACKSWING_NOTINRANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x146*/ { "SMSG_ATTACKSWING_BADFACING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x147*/ { "SMSG_ATTACKSWING_NOTSTANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14B*/ { "SMSG_VICTIMSTATEUPDATE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14F*/ { "SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x150*/ { "SMSG_SPELLHEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x151*/ { "SMSG_SPELLENERGIZELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x152*/ { "CMSG_SHEATHE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x153*/ { "CMSG_SAVE_PLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x154*/ { "CMSG_SETDEATHBINDPOINT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x155*/ { "SMSG_BINDPOINTUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x156*/ { "CMSG_GETDEATHBINDZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x157*/ { "SMSG_BINDZONEREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x158*/ { "SMSG_PLAYERBOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x159*/ { "SMSG_CLIENT_CONTROL_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x15A*/ { "CMSG_REPOP_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleRepopRequestOpcode },
- /*0x15B*/ { "SMSG_RESURRECT_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x15C*/ { "CMSG_RESURRECT_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleResurrectResponseOpcode },
- /*0x15D*/ { "CMSG_LOOT", STATUS_LOGGEDIN, &WorldSession::HandleLootOpcode },
- /*0x15E*/ { "CMSG_LOOT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleLootMoneyOpcode },
- /*0x15F*/ { "CMSG_LOOT_RELEASE", STATUS_LOGGEDIN, &WorldSession::HandleLootReleaseOpcode },
- /*0x160*/ { "SMSG_LOOT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x161*/ { "SMSG_LOOT_RELEASE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x162*/ { "SMSG_LOOT_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x163*/ { "SMSG_LOOT_MONEY_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x164*/ { "SMSG_LOOT_ITEM_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x165*/ { "SMSG_LOOT_CLEAR_MONEY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x166*/ { "SMSG_ITEM_PUSH_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x167*/ { "SMSG_DUEL_REQUESTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x168*/ { "SMSG_DUEL_OUTOFBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x169*/ { "SMSG_DUEL_INBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16A*/ { "SMSG_DUEL_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16B*/ { "SMSG_DUEL_WINNER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16C*/ { "CMSG_DUEL_ACCEPTED", STATUS_LOGGEDIN, &WorldSession::HandleDuelAcceptedOpcode },
- /*0x16D*/ { "CMSG_DUEL_CANCELLED", STATUS_LOGGEDIN, &WorldSession::HandleDuelCancelledOpcode },
- /*0x16E*/ { "SMSG_MOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16F*/ { "SMSG_DISMOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x170*/ { "SMSG_PUREMOUNT_CANCELLED_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x171*/ { "CMSG_MOUNTSPECIAL_ANIM", STATUS_LOGGEDIN, &WorldSession::HandleMountSpecialAnimOpcode },
- /*0x172*/ { "SMSG_MOUNTSPECIAL_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x173*/ { "SMSG_PET_TAME_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x174*/ { "CMSG_PET_SET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetSetAction },
- /*0x175*/ { "CMSG_PET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetAction },
- /*0x176*/ { "CMSG_PET_ABANDON", STATUS_LOGGEDIN, &WorldSession::HandlePetAbandon },
- /*0x177*/ { "CMSG_PET_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetRename },
- /*0x178*/ { "SMSG_PET_NAME_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x179*/ { "SMSG_PET_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17A*/ { "SMSG_PET_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17B*/ { "CMSG_GOSSIP_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleGossipHelloOpcode },
- /*0x17C*/ { "CMSG_GOSSIP_SELECT_OPTION", STATUS_LOGGEDIN, &WorldSession::HandleGossipSelectOptionOpcode },
- /*0x17D*/ { "SMSG_GOSSIP_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17E*/ { "SMSG_GOSSIP_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17F*/ { "CMSG_NPC_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNpcTextQueryOpcode },
- /*0x180*/ { "SMSG_NPC_TEXT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x181*/ { "SMSG_NPC_WONT_TALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x182*/ { "CMSG_QUESTGIVER_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryOpcode},
- /*0x183*/ { "SMSG_QUESTGIVER_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x184*/ { "CMSG_QUESTGIVER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverHelloOpcode },
- /*0x185*/ { "SMSG_QUESTGIVER_QUEST_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x186*/ { "CMSG_QUESTGIVER_QUERY_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverQuestQueryOpcode},
- /*0x187*/ { "CMSG_QUESTGIVER_QUEST_AUTOLAUNCH", STATUS_LOGGEDIN, &WorldSession::HandleQuestAutoLaunch },
- /*0x188*/ { "SMSG_QUESTGIVER_QUEST_DETAILS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x189*/ { "CMSG_QUESTGIVER_ACCEPT_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverAcceptQuestOpcode},
- /*0x18A*/ { "CMSG_QUESTGIVER_COMPLETE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestComplete },
- /*0x18B*/ { "SMSG_QUESTGIVER_REQUEST_ITEMS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x18C*/ { "CMSG_QUESTGIVER_REQUEST_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverRequestRewardOpcode},
- /*0x18D*/ { "SMSG_QUESTGIVER_OFFER_REWARD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x18E*/ { "CMSG_QUESTGIVER_CHOOSE_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverChooseRewardOpcode},
- /*0x18F*/ { "SMSG_QUESTGIVER_QUEST_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x190*/ { "CMSG_QUESTGIVER_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverCancel },
- /*0x191*/ { "SMSG_QUESTGIVER_QUEST_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x192*/ { "SMSG_QUESTGIVER_QUEST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x193*/ { "CMSG_QUESTLOG_SWAP_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogSwapQuest },
- /*0x194*/ { "CMSG_QUESTLOG_REMOVE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogRemoveQuest },
- /*0x195*/ { "SMSG_QUESTLOG_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x196*/ { "SMSG_QUESTUPDATE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x197*/ { "SMSG_QUESTUPDATE_FAILEDTIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x198*/ { "SMSG_QUESTUPDATE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x199*/ { "SMSG_QUESTUPDATE_ADD_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x19A*/ { "SMSG_QUESTUPDATE_ADD_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x19B*/ { "CMSG_QUEST_CONFIRM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleQuestConfirmAccept },
- /*0x19C*/ { "SMSG_QUEST_CONFIRM_ACCEPT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x19D*/ { "CMSG_PUSHQUESTTOPARTY", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushToParty },
- /*0x19E*/ { "CMSG_LIST_INVENTORY", STATUS_LOGGEDIN, &WorldSession::HandleListInventoryOpcode },
- /*0x19F*/ { "SMSG_LIST_INVENTORY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A0*/ { "CMSG_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSellItemOpcode },
- /*0x1A1*/ { "SMSG_SELL_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A2*/ { "CMSG_BUY_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemOpcode },
- /*0x1A3*/ { "CMSG_BUY_ITEM_IN_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemInSlotOpcode },
- /*0x1A4*/ { "SMSG_BUY_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A5*/ { "SMSG_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A6*/ { "CMSG_TAXICLEARALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1A7*/ { "CMSG_TAXIENABLEALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1A8*/ { "CMSG_TAXISHOWNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1A9*/ { "SMSG_SHOWTAXINODES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1AA*/ { "CMSG_TAXINODE_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNodeStatusQueryOpcode },
- /*0x1AB*/ { "SMSG_TAXINODE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1AC*/ { "CMSG_TAXIQUERYAVAILABLENODES", STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAvailableNodesOpcode},
- /*0x1AD*/ { "CMSG_ACTIVATETAXI", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiOpcode },
- /*0x1AE*/ { "SMSG_ACTIVATETAXIREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1AF*/ { "SMSG_NEW_TAXI_PATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B0*/ { "CMSG_TRAINER_LIST", STATUS_LOGGEDIN, &WorldSession::HandleTrainerListOpcode },
- /*0x1B1*/ { "SMSG_TRAINER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B2*/ { "CMSG_TRAINER_BUY_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleTrainerBuySpellOpcode },
- /*0x1B3*/ { "SMSG_TRAINER_BUY_SUCCEEDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B4*/ { "SMSG_TRAINER_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B5*/ { "CMSG_BINDER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBinderActivateOpcode },
- /*0x1B6*/ { "SMSG_PLAYERBINDERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B7*/ { "CMSG_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBankerActivateOpcode },
- /*0x1B8*/ { "SMSG_SHOW_BANK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B9*/ { "CMSG_BUY_BANK_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyBankSlotOpcode },
- /*0x1BA*/ { "SMSG_BUY_BANK_SLOT_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1BB*/ { "CMSG_PETITION_SHOWLIST", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowListOpcode },
- /*0x1BC*/ { "SMSG_PETITION_SHOWLIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1BD*/ { "CMSG_PETITION_BUY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionBuyOpcode },
- /*0x1BE*/ { "CMSG_PETITION_SHOW_SIGNATURES", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowSignOpcode },
- /*0x1BF*/ { "SMSG_PETITION_SHOW_SIGNATURES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C0*/ { "CMSG_PETITION_SIGN", STATUS_LOGGEDIN, &WorldSession::HandlePetitionSignOpcode },
- /*0x1C1*/ { "SMSG_PETITION_SIGN_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C2*/ { "MSG_PETITION_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandlePetitionDeclineOpcode },
- /*0x1C3*/ { "CMSG_OFFER_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleOfferPetitionOpcode },
- /*0x1C4*/ { "CMSG_TURN_IN_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleTurnInPetitionOpcode },
- /*0x1C5*/ { "SMSG_TURN_IN_PETITION_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C6*/ { "CMSG_PETITION_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionQueryOpcode },
- /*0x1C7*/ { "SMSG_PETITION_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C8*/ { "SMSG_FISH_NOT_HOOKED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C9*/ { "SMSG_FISH_ESCAPED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1CA*/ { "CMSG_BUG", STATUS_LOGGEDIN, &WorldSession::HandleBugOpcode },
- /*0x1CB*/ { "SMSG_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1CC*/ { "CMSG_PLAYED_TIME", STATUS_LOGGEDIN, &WorldSession::HandlePlayedTime },
- /*0x1CD*/ { "SMSG_PLAYED_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1CE*/ { "CMSG_QUERY_TIME", STATUS_LOGGEDIN, &WorldSession::HandleQueryTimeOpcode },
- /*0x1CF*/ { "SMSG_QUERY_TIME_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D0*/ { "SMSG_LOG_XPGAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D1*/ { "SMSG_AURACASTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D2*/ { "CMSG_RECLAIM_CORPSE", STATUS_LOGGEDIN, &WorldSession::HandleCorpseReclaimOpcode },
- /*0x1D3*/ { "CMSG_WRAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleWrapItemOpcode },
- /*0x1D4*/ { "SMSG_LEVELUP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D5*/ { "MSG_MINIMAP_PING", STATUS_LOGGEDIN, &WorldSession::HandleMinimapPingOpcode },
- /*0x1D6*/ { "SMSG_RESISTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D7*/ { "SMSG_ENCHANTMENTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D8*/ { "CMSG_SET_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1D9*/ { "SMSG_START_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DA*/ { "SMSG_PAUSE_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DB*/ { "SMSG_STOP_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DC*/ { "CMSG_PING", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
- /*0x1DD*/ { "SMSG_PONG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DE*/ { "SMSG_CLEAR_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DF*/ { "SMSG_GAMEOBJECT_PAGETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E0*/ { "CMSG_SETSHEATHED", STATUS_LOGGEDIN, &WorldSession::HandleSetSheathedOpcode },
- /*0x1E1*/ { "SMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E2*/ { "SMSG_SPELL_DELAYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E3*/ { "CMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E4*/ { "SMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E5*/ { "CMSG_GHOST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E6*/ { "CMSG_GM_INVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E7*/ { "SMSG_INVALID_PROMOTION_CODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E8*/ { "MSG_GM_BIND_OTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E9*/ { "MSG_GM_SUMMON", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1EA*/ { "SMSG_ITEM_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1EB*/ { "SMSG_ITEM_ENCHANT_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1EC*/ { "SMSG_AUTH_CHALLENGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1ED*/ { "CMSG_AUTH_SESSION", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
- /*0x1EE*/ { "SMSG_AUTH_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1EF*/ { "MSG_GM_SHOWLABEL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1F0*/ { "CMSG_PET_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandlePetCastSpellOpcode },
- /*0x1F1*/ { "MSG_SAVE_GUILD_EMBLEM", STATUS_LOGGEDIN, &WorldSession::HandleGuildSaveEmblemOpcode },
- /*0x1F2*/ { "MSG_TABARDVENDOR_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleTabardVendorActivateOpcode},
- /*0x1F3*/ { "SMSG_PLAY_SPELL_VISUAL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F4*/ { "CMSG_ZONEUPDATE", STATUS_LOGGEDIN, &WorldSession::HandleZoneUpdateOpcode },
- /*0x1F5*/ { "SMSG_PARTYKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F6*/ { "SMSG_COMPRESSED_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F7*/ { "SMSG_PLAY_SPELL_IMPACT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F8*/ { "SMSG_EXPLORATION_EXPERIENCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F9*/ { "CMSG_GM_SET_SECURITY_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1FA*/ { "CMSG_GM_NUKE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1FB*/ { "MSG_RANDOM_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleRandomRollOpcode },
- /*0x1FC*/ { "SMSG_ENVIRONMENTALDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1FD*/ { "CMSG_RWHOIS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1FE*/ { "SMSG_RWHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1FF*/ { "MSG_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLookingForGroup },
- /*0x200*/ { "CMSG_SET_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleSetLfgOpcode },
- /*0x201*/ { "CMSG_UNLEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x202*/ { "CMSG_UNLEARN_SKILL", STATUS_LOGGEDIN, &WorldSession::HandleUnlearnSkillOpcode },
- /*0x203*/ { "SMSG_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x204*/ { "CMSG_DECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x205*/ { "CMSG_GMTICKET_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketCreateOpcode },
- /*0x206*/ { "SMSG_GMTICKET_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x000*/ { "MSG_NULL_ACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x001*/ { "CMSG_BOOTME", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x002*/ { "CMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x003*/ { "SMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x004*/ { "CMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x005*/ { "SMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x006*/ { "CMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x007*/ { "SMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x008*/ { "CMSG_WORLD_TELEPORT", STATUS_LOGGEDIN, &WorldSession::HandleWorldTeleportOpcode },
+ /*0x009*/ { "CMSG_TELEPORT_TO_UNIT", STATUS_LOGGEDIN, &WorldSession::Handle_NULL },
+ /*0x00A*/ { "CMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00B*/ { "SMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x00C*/ { "CMSG_DEBUG_CHANGECELLZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00D*/ { "CMSG_MOVE_CHARACTER_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00E*/ { "SMSG_MOVE_CHARACTER_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00F*/ { "CMSG_RECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x010*/ { "CMSG_LEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x011*/ { "CMSG_CREATEMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x012*/ { "CMSG_DESTROYMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x013*/ { "CMSG_CREATEITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x014*/ { "CMSG_CREATEGAMEOBJECT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x015*/ { "SMSG_CHECK_FOR_BOTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x016*/ { "CMSG_MAKEMONSTERATTACKGUID", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x017*/ { "CMSG_BOT_DETECTED2", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x018*/ { "CMSG_FORCEACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x019*/ { "CMSG_FORCEACTIONONOTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x01A*/ { "CMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x01B*/ { "SMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x01C*/ { "CMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x01D*/ { "SMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x01E*/ { "SMSG_REFER_A_FRIEND_EXPIRED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x01F*/ { "CMSG_WEATHER_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x020*/ { "CMSG_UNDRESSPLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x021*/ { "CMSG_BEASTMASTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x022*/ { "CMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x023*/ { "SMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x024*/ { "CMSG_CHEAT_SETMONEY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x025*/ { "CMSG_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x026*/ { "CMSG_PET_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x027*/ { "CMSG_SET_WORLDSTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x028*/ { "CMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x029*/ { "CMSG_USE_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02A*/ { "CMSG_FLAG_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02B*/ { "CMSG_FLAG_QUEST_FINISH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02C*/ { "CMSG_CLEAR_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02D*/ { "CMSG_SEND_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02E*/ { "CMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02F*/ { "SMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x030*/ { "CMSG_DISABLE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x031*/ { "CMSG_ADVANCE_SPAWN_TIME", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x032*/ { "SMSG_DESTRUCTIBLE_BUILDING_DAMAGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x033*/ { "CMSG_AUTH_SRP6_BEGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x034*/ { "CMSG_AUTH_SRP6_PROOF", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x035*/ { "CMSG_AUTH_SRP6_RECODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x036*/ { "CMSG_CHAR_CREATE", STATUS_AUTHED, &WorldSession::HandleCharCreateOpcode },
+ /*0x037*/ { "CMSG_CHAR_ENUM", STATUS_AUTHED, &WorldSession::HandleCharEnumOpcode },
+ /*0x038*/ { "CMSG_CHAR_DELETE", STATUS_AUTHED, &WorldSession::HandleCharDeleteOpcode },
+ /*0x039*/ { "SMSG_AUTH_SRP6_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03A*/ { "SMSG_CHAR_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03B*/ { "SMSG_CHAR_ENUM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03C*/ { "SMSG_CHAR_DELETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03D*/ { "CMSG_PLAYER_LOGIN", STATUS_AUTHED, &WorldSession::HandlePlayerLoginOpcode },
+ /*0x03E*/ { "SMSG_NEW_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03F*/ { "SMSG_TRANSFER_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x040*/ { "SMSG_TRANSFER_ABORTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x041*/ { "SMSG_CHARACTER_LOGIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x042*/ { "SMSG_LOGIN_SETTIMESPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x043*/ { "SMSG_GAMETIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x044*/ { "CMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x045*/ { "SMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x046*/ { "CMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x047*/ { "SMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x048*/ { "CMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x049*/ { "SMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x04A*/ { "CMSG_PLAYER_LOGOUT", STATUS_LOGGEDIN, &WorldSession::HandlePlayerLogoutOpcode },
+ /*0x04B*/ { "CMSG_LOGOUT_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleLogoutRequestOpcode },
+ /*0x04C*/ { "SMSG_LOGOUT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x04D*/ { "SMSG_LOGOUT_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x04E*/ { "CMSG_LOGOUT_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleLogoutCancelOpcode },
+ /*0x04F*/ { "SMSG_LOGOUT_CANCEL_ACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x050*/ { "CMSG_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNameQueryOpcode },
+ /*0x051*/ { "SMSG_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x052*/ { "CMSG_PET_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetNameQuery },
+ /*0x053*/ { "SMSG_PET_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x054*/ { "CMSG_GUILD_QUERY", STATUS_AUTHED, &WorldSession::HandleGuildQueryOpcode },
+ /*0x055*/ { "SMSG_GUILD_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x056*/ { "CMSG_ITEM_QUERY_SINGLE", STATUS_LOGGEDIN, &WorldSession::HandleItemQuerySingleOpcode },
+ /*0x057*/ { "CMSG_ITEM_QUERY_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x058*/ { "SMSG_ITEM_QUERY_SINGLE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x059*/ { "SMSG_ITEM_QUERY_MULTIPLE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x05A*/ { "CMSG_PAGE_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePageQueryOpcode },
+ /*0x05B*/ { "SMSG_PAGE_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x05C*/ { "CMSG_QUEST_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestQueryOpcode },
+ /*0x05D*/ { "SMSG_QUEST_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x05E*/ { "CMSG_GAMEOBJECT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectQueryOpcode },
+ /*0x05F*/ { "SMSG_GAMEOBJECT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x060*/ { "CMSG_CREATURE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCreatureQueryOpcode },
+ /*0x061*/ { "SMSG_CREATURE_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x062*/ { "CMSG_WHO", STATUS_LOGGEDIN, &WorldSession::HandleWhoOpcode },
+ /*0x063*/ { "SMSG_WHO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x064*/ { "CMSG_WHOIS", STATUS_LOGGEDIN, &WorldSession::HandleWhoisOpcode },
+ /*0x065*/ { "SMSG_WHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x066*/ { "CMSG_CONTACT_LIST", STATUS_LOGGEDIN, &WorldSession::HandleFriendListOpcode },
+ /*0x067*/ { "SMSG_CONTACT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x068*/ { "SMSG_FRIEND_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x069*/ { "CMSG_ADD_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleAddFriendOpcode },
+ /*0x06A*/ { "CMSG_DEL_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleDelFriendOpcode },
+ /*0x06B*/ { "CMSG_SET_CONTACT_NOTES", STATUS_LOGGEDIN, &WorldSession::HandleSetFriendNoteOpcode },
+ /*0x06C*/ { "CMSG_ADD_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleAddIgnoreOpcode },
+ /*0x06D*/ { "CMSG_DEL_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleDelIgnoreOpcode },
+ /*0x06E*/ { "CMSG_GROUP_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupInviteOpcode },
+ /*0x06F*/ { "SMSG_GROUP_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x070*/ { "CMSG_GROUP_CANCEL", STATUS_LOGGEDIN, &WorldSession::Handle_Deprecated },
+ /*0x071*/ { "SMSG_GROUP_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x072*/ { "CMSG_GROUP_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGroupAcceptOpcode },
+ /*0x073*/ { "CMSG_GROUP_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGroupDeclineOpcode },
+ /*0x074*/ { "SMSG_GROUP_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x075*/ { "CMSG_GROUP_UNINVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteNameOpcode },
+ /*0x076*/ { "CMSG_GROUP_UNINVITE_GUID", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteGuidOpcode },
+ /*0x077*/ { "SMSG_GROUP_UNINVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x078*/ { "CMSG_GROUP_SET_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupSetLeaderOpcode },
+ /*0x079*/ { "SMSG_GROUP_SET_LEADER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07A*/ { "CMSG_LOOT_METHOD", STATUS_LOGGEDIN, &WorldSession::HandleLootMethodOpcode },
+ /*0x07B*/ { "CMSG_GROUP_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGroupLeaveOpcode },
+ /*0x07C*/ { "SMSG_GROUP_DESTROYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07D*/ { "SMSG_GROUP_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07E*/ { "SMSG_PARTY_MEMBER_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07F*/ { "SMSG_PARTY_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x080*/ { "UMSG_UPDATE_GROUP_MEMBERS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x081*/ { "CMSG_GUILD_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildCreateOpcode },
+ /*0x082*/ { "CMSG_GUILD_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGuildInviteOpcode },
+ /*0x083*/ { "SMSG_GUILD_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x084*/ { "CMSG_GUILD_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGuildAcceptOpcode },
+ /*0x085*/ { "CMSG_GUILD_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDeclineOpcode },
+ /*0x086*/ { "SMSG_GUILD_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x087*/ { "CMSG_GUILD_INFO", STATUS_LOGGEDIN, &WorldSession::HandleGuildInfoOpcode },
+ /*0x088*/ { "SMSG_GUILD_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x089*/ { "CMSG_GUILD_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleGuildRosterOpcode },
+ /*0x08A*/ { "SMSG_GUILD_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x08B*/ { "CMSG_GUILD_PROMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildPromoteOpcode },
+ /*0x08C*/ { "CMSG_GUILD_DEMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDemoteOpcode },
+ /*0x08D*/ { "CMSG_GUILD_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaveOpcode },
+ /*0x08E*/ { "CMSG_GUILD_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildRemoveOpcode },
+ /*0x08F*/ { "CMSG_GUILD_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGuildDisbandOpcode },
+ /*0x090*/ { "CMSG_GUILD_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaderOpcode },
+ /*0x091*/ { "CMSG_GUILD_MOTD", STATUS_LOGGEDIN, &WorldSession::HandleGuildMOTDOpcode },
+ /*0x092*/ { "SMSG_GUILD_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x093*/ { "SMSG_GUILD_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x094*/ { "UMSG_UPDATE_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x095*/ { "CMSG_MESSAGECHAT", STATUS_LOGGEDIN, &WorldSession::HandleMessagechatOpcode },
+ /*0x096*/ { "SMSG_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x097*/ { "CMSG_JOIN_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoin },
+ /*0x098*/ { "CMSG_LEAVE_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelLeave },
+ /*0x099*/ { "SMSG_CHANNEL_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x09A*/ { "CMSG_CHANNEL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelList },
+ /*0x09B*/ { "SMSG_CHANNEL_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x09C*/ { "CMSG_CHANNEL_PASSWORD", STATUS_LOGGEDIN, &WorldSession::HandleChannelPassword },
+ /*0x09D*/ { "CMSG_CHANNEL_SET_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelSetOwner },
+ /*0x09E*/ { "CMSG_CHANNEL_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelOwner },
+ /*0x09F*/ { "CMSG_CHANNEL_MODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerator },
+ /*0x0A0*/ { "CMSG_CHANNEL_UNMODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmoderator },
+ /*0x0A1*/ { "CMSG_CHANNEL_MUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelMute },
+ /*0x0A2*/ { "CMSG_CHANNEL_UNMUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmute },
+ /*0x0A3*/ { "CMSG_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelInvite },
+ /*0x0A4*/ { "CMSG_CHANNEL_KICK", STATUS_LOGGEDIN, &WorldSession::HandleChannelKick },
+ /*0x0A5*/ { "CMSG_CHANNEL_BAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelBan },
+ /*0x0A6*/ { "CMSG_CHANNEL_UNBAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnban },
+ /*0x0A7*/ { "CMSG_CHANNEL_ANNOUNCEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleChannelAnnounce },
+ /*0x0A8*/ { "CMSG_CHANNEL_MODERATE", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerate },
+ /*0x0A9*/ { "SMSG_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0AA*/ { "SMSG_DESTROY_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0AB*/ { "CMSG_USE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleUseItemOpcode },
+ /*0x0AC*/ { "CMSG_OPEN_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleOpenItemOpcode },
+ /*0x0AD*/ { "CMSG_READ_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleReadItem },
+ /*0x0AE*/ { "SMSG_READ_ITEM_OK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0AF*/ { "SMSG_READ_ITEM_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0B0*/ { "SMSG_ITEM_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0B1*/ { "CMSG_GAMEOBJ_USE", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectUseOpcode },
+ /*0x0B2*/ { "CMSG_DESTROY_ITEMS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0B3*/ { "SMSG_GAMEOBJECT_CUSTOM_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0B4*/ { "CMSG_AREATRIGGER", STATUS_LOGGEDIN, &WorldSession::HandleAreaTriggerOpcode },
+ /*0x0B5*/ { "MSG_MOVE_START_FORWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B6*/ { "MSG_MOVE_START_BACKWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B7*/ { "MSG_MOVE_STOP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B8*/ { "MSG_MOVE_START_STRAFE_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B9*/ { "MSG_MOVE_START_STRAFE_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BA*/ { "MSG_MOVE_STOP_STRAFE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BB*/ { "MSG_MOVE_JUMP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BC*/ { "MSG_MOVE_START_TURN_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BD*/ { "MSG_MOVE_START_TURN_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BE*/ { "MSG_MOVE_STOP_TURN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BF*/ { "MSG_MOVE_START_PITCH_UP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C0*/ { "MSG_MOVE_START_PITCH_DOWN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C1*/ { "MSG_MOVE_STOP_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C2*/ { "MSG_MOVE_SET_RUN_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C3*/ { "MSG_MOVE_SET_WALK_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C4*/ { "MSG_MOVE_TOGGLE_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C5*/ { "MSG_MOVE_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C6*/ { "MSG_MOVE_TELEPORT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C7*/ { "MSG_MOVE_TELEPORT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveTeleportAck },
+ /*0x0C8*/ { "MSG_MOVE_TOGGLE_FALL_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C9*/ { "MSG_MOVE_FALL_LAND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0CA*/ { "MSG_MOVE_START_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0CB*/ { "MSG_MOVE_STOP_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0CC*/ { "MSG_MOVE_SET_RUN_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0CD*/ { "MSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0CE*/ { "MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0CF*/ { "MSG_MOVE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D0*/ { "MSG_MOVE_SET_WALK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D1*/ { "MSG_MOVE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D2*/ { "MSG_MOVE_SET_SWIM_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D3*/ { "MSG_MOVE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D4*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D5*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D6*/ { "MSG_MOVE_SET_ALL_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D7*/ { "MSG_MOVE_SET_TURN_RATE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D8*/ { "MSG_MOVE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D9*/ { "MSG_MOVE_TOGGLE_COLLISION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0DA*/ { "MSG_MOVE_SET_FACING", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0DB*/ { "MSG_MOVE_SET_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0DC*/ { "MSG_MOVE_WORLDPORT_ACK", STATUS_TRANSFER_PENDING,&WorldSession::HandleMoveWorldportAckOpcode},
+ /*0x0DD*/ { "SMSG_MONSTER_MOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0DE*/ { "SMSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0DF*/ { "SMSG_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E0*/ { "MSG_MOVE_SET_RAW_POSITION_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0E1*/ { "CMSG_MOVE_SET_RAW_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0E2*/ { "SMSG_FORCE_RUN_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E3*/ { "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x0E4*/ { "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E5*/ { "CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x0E6*/ { "SMSG_FORCE_SWIM_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E7*/ { "CMSG_FORCE_SWIM_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x0E8*/ { "SMSG_FORCE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E9*/ { "CMSG_FORCE_MOVE_ROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveRootAck },
+ /*0x0EA*/ { "SMSG_FORCE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0EB*/ { "CMSG_FORCE_MOVE_UNROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveUnRootAck },
+ /*0x0EC*/ { "MSG_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0ED*/ { "MSG_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0EE*/ { "MSG_MOVE_HEARTBEAT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0EF*/ { "SMSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F0*/ { "CMSG_MOVE_KNOCK_BACK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveKnockBackAck },
+ /*0x0F1*/ { "MSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0F2*/ { "SMSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F3*/ { "SMSG_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F6*/ { "CMSG_MOVE_HOVER_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveHoverAck },
+ /*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0F8*/ { "CMSG_TRIGGER_CINEMATIC_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0F9*/ { "CMSG_OPENING_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0FA*/ { "SMSG_TRIGGER_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0FB*/ { "CMSG_NEXT_CINEMATIC_CAMERA", STATUS_LOGGEDIN, &WorldSession::HandleNextCinematicCamera },
+ /*0x0FC*/ { "CMSG_COMPLETE_CINEMATIC", STATUS_LOGGEDIN, &WorldSession::HandleCompleteCinema },
+ /*0x0FD*/ { "SMSG_TUTORIAL_FLAGS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0FE*/ { "CMSG_TUTORIAL_FLAG", STATUS_LOGGEDIN, &WorldSession::HandleTutorialFlag },
+ /*0x0FF*/ { "CMSG_TUTORIAL_CLEAR", STATUS_LOGGEDIN, &WorldSession::HandleTutorialClear },
+ /*0x100*/ { "CMSG_TUTORIAL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleTutorialReset },
+ /*0x101*/ { "CMSG_STANDSTATECHANGE", STATUS_LOGGEDIN, &WorldSession::HandleStandStateChangeOpcode },
+ /*0x102*/ { "CMSG_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleEmoteOpcode },
+ /*0x103*/ { "SMSG_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x104*/ { "CMSG_TEXT_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleTextEmoteOpcode },
+ /*0x105*/ { "SMSG_TEXT_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x106*/ { "CMSG_AUTOEQUIP_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x107*/ { "CMSG_AUTOSTORE_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x108*/ { "CMSG_AUTOSTORE_LOOT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutostoreLootItemOpcode },
+ /*0x109*/ { "CMSG_STORE_LOOT_IN_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x10A*/ { "CMSG_AUTOEQUIP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemOpcode },
+ /*0x10B*/ { "CMSG_AUTOSTORE_BAG_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBagItemOpcode },
+ /*0x10C*/ { "CMSG_SWAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapItem },
+ /*0x10D*/ { "CMSG_SWAP_INV_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapInvItemOpcode },
+ /*0x10E*/ { "CMSG_SPLIT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSplitItemOpcode },
+ /*0x10F*/ { "CMSG_AUTOEQUIP_ITEM_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemSlotOpcode },
+ /*0x110*/ { "OBSOLETE_DROP_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x111*/ { "CMSG_DESTROYITEM", STATUS_LOGGEDIN, &WorldSession::HandleDestroyItemOpcode },
+ /*0x112*/ { "SMSG_INVENTORY_CHANGE_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x113*/ { "SMSG_OPEN_CONTAINER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x114*/ { "CMSG_INSPECT", STATUS_LOGGEDIN, &WorldSession::HandleInspectOpcode },
+ /*0x115*/ { "SMSG_INSPECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x116*/ { "CMSG_INITIATE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleInitiateTradeOpcode },
+ /*0x117*/ { "CMSG_BEGIN_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBeginTradeOpcode },
+ /*0x118*/ { "CMSG_BUSY_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBusyTradeOpcode },
+ /*0x119*/ { "CMSG_IGNORE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleIgnoreTradeOpcode },
+ /*0x11A*/ { "CMSG_ACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleAcceptTradeOpcode },
+ /*0x11B*/ { "CMSG_UNACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleUnacceptTradeOpcode },
+ /*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_AUTHED, &WorldSession::HandleCancelTradeOpcode },
+ /*0x11D*/ { "CMSG_SET_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeItemOpcode },
+ /*0x11E*/ { "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleClearTradeItemOpcode },
+ /*0x11F*/ { "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeGoldOpcode },
+ /*0x120*/ { "SMSG_TRADE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x121*/ { "SMSG_TRADE_STATUS_EXTENDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x122*/ { "SMSG_INITIALIZE_FACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x123*/ { "SMSG_SET_FACTION_VISIBLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x124*/ { "SMSG_SET_FACTION_STANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x125*/ { "CMSG_SET_FACTION_ATWAR", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionAtWar },
+ /*0x126*/ { "CMSG_SET_FACTION_CHEAT", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionCheat },
+ /*0x127*/ { "SMSG_SET_PROFICIENCY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x128*/ { "CMSG_SET_ACTION_BUTTON", STATUS_LOGGEDIN, &WorldSession::HandleSetActionButtonOpcode },
+ /*0x129*/ { "SMSG_ACTION_BUTTONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12A*/ { "SMSG_INITIAL_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12B*/ { "SMSG_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12C*/ { "SMSG_SUPERCEDED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12D*/ { "CMSG_NEW_SPELL_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x12E*/ { "CMSG_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCastSpellOpcode },
+ /*0x12F*/ { "CMSG_CANCEL_CAST", STATUS_LOGGEDIN, &WorldSession::HandleCancelCastOpcode },
+ /*0x130*/ { "SMSG_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x131*/ { "SMSG_SPELL_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x132*/ { "SMSG_SPELL_GO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x133*/ { "SMSG_SPELL_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
+ /*0x137*/ { "SMSG_UPDATE_AURA_DURATION_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
+ /*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
+ /*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode },
+ /*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
+ /*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
+ /*0x143*/ { "SMSG_ATTACKSTART", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x144*/ { "SMSG_ATTACKSTOP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x145*/ { "SMSG_ATTACKSWING_NOTINRANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x146*/ { "SMSG_ATTACKSWING_BADFACING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x147*/ { "SMSG_ATTACKSWING_NOTSTANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14B*/ { "SMSG_VICTIMSTATEUPDATE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14F*/ { "SMSG_SPELLBREAKLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x150*/ { "SMSG_SPELLHEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x151*/ { "SMSG_SPELLENERGIZELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x152*/ { "SMSG_BREAK_TARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x153*/ { "CMSG_SAVE_PLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x154*/ { "CMSG_SETDEATHBINDPOINT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x155*/ { "SMSG_BINDPOINTUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x156*/ { "CMSG_GETDEATHBINDZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x157*/ { "SMSG_BINDZONEREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x158*/ { "SMSG_PLAYERBOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x159*/ { "SMSG_CLIENT_CONTROL_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x15A*/ { "CMSG_REPOP_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleRepopRequestOpcode },
+ /*0x15B*/ { "SMSG_RESURRECT_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x15C*/ { "CMSG_RESURRECT_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleResurrectResponseOpcode },
+ /*0x15D*/ { "CMSG_LOOT", STATUS_LOGGEDIN, &WorldSession::HandleLootOpcode },
+ /*0x15E*/ { "CMSG_LOOT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleLootMoneyOpcode },
+ /*0x15F*/ { "CMSG_LOOT_RELEASE", STATUS_LOGGEDIN, &WorldSession::HandleLootReleaseOpcode },
+ /*0x160*/ { "SMSG_LOOT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x161*/ { "SMSG_LOOT_RELEASE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x162*/ { "SMSG_LOOT_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x163*/ { "SMSG_LOOT_MONEY_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x164*/ { "SMSG_LOOT_ITEM_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x165*/ { "SMSG_LOOT_CLEAR_MONEY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x166*/ { "SMSG_ITEM_PUSH_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x167*/ { "SMSG_DUEL_REQUESTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x168*/ { "SMSG_DUEL_OUTOFBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x169*/ { "SMSG_DUEL_INBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16A*/ { "SMSG_DUEL_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16B*/ { "SMSG_DUEL_WINNER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16C*/ { "CMSG_DUEL_ACCEPTED", STATUS_LOGGEDIN, &WorldSession::HandleDuelAcceptedOpcode },
+ /*0x16D*/ { "CMSG_DUEL_CANCELLED", STATUS_LOGGEDIN, &WorldSession::HandleDuelCancelledOpcode },
+ /*0x16E*/ { "SMSG_MOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16F*/ { "SMSG_DISMOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x170*/ { "SMSG_PUREMOUNT_CANCELLED_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x171*/ { "CMSG_MOUNTSPECIAL_ANIM", STATUS_LOGGEDIN, &WorldSession::HandleMountSpecialAnimOpcode },
+ /*0x172*/ { "SMSG_MOUNTSPECIAL_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x173*/ { "SMSG_PET_TAME_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x174*/ { "CMSG_PET_SET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetSetAction },
+ /*0x175*/ { "CMSG_PET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetAction },
+ /*0x176*/ { "CMSG_PET_ABANDON", STATUS_LOGGEDIN, &WorldSession::HandlePetAbandon },
+ /*0x177*/ { "CMSG_PET_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetRename },
+ /*0x178*/ { "SMSG_PET_NAME_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x179*/ { "SMSG_PET_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17A*/ { "SMSG_PET_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17B*/ { "CMSG_GOSSIP_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleGossipHelloOpcode },
+ /*0x17C*/ { "CMSG_GOSSIP_SELECT_OPTION", STATUS_LOGGEDIN, &WorldSession::HandleGossipSelectOptionOpcode },
+ /*0x17D*/ { "SMSG_GOSSIP_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17E*/ { "SMSG_GOSSIP_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17F*/ { "CMSG_NPC_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNpcTextQueryOpcode },
+ /*0x180*/ { "SMSG_NPC_TEXT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x181*/ { "SMSG_NPC_WONT_TALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x182*/ { "CMSG_QUESTGIVER_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryOpcode},
+ /*0x183*/ { "SMSG_QUESTGIVER_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x184*/ { "CMSG_QUESTGIVER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverHelloOpcode },
+ /*0x185*/ { "SMSG_QUESTGIVER_QUEST_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x186*/ { "CMSG_QUESTGIVER_QUERY_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverQuestQueryOpcode},
+ /*0x187*/ { "CMSG_QUESTGIVER_QUEST_AUTOLAUNCH", STATUS_LOGGEDIN, &WorldSession::HandleQuestAutoLaunch },
+ /*0x188*/ { "SMSG_QUESTGIVER_QUEST_DETAILS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x189*/ { "CMSG_QUESTGIVER_ACCEPT_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverAcceptQuestOpcode},
+ /*0x18A*/ { "CMSG_QUESTGIVER_COMPLETE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestComplete },
+ /*0x18B*/ { "SMSG_QUESTGIVER_REQUEST_ITEMS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x18C*/ { "CMSG_QUESTGIVER_REQUEST_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverRequestRewardOpcode},
+ /*0x18D*/ { "SMSG_QUESTGIVER_OFFER_REWARD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x18E*/ { "CMSG_QUESTGIVER_CHOOSE_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverChooseRewardOpcode},
+ /*0x18F*/ { "SMSG_QUESTGIVER_QUEST_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x190*/ { "CMSG_QUESTGIVER_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverCancel },
+ /*0x191*/ { "SMSG_QUESTGIVER_QUEST_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x192*/ { "SMSG_QUESTGIVER_QUEST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x193*/ { "CMSG_QUESTLOG_SWAP_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogSwapQuest },
+ /*0x194*/ { "CMSG_QUESTLOG_REMOVE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogRemoveQuest },
+ /*0x195*/ { "SMSG_QUESTLOG_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x196*/ { "SMSG_QUESTUPDATE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x197*/ { "SMSG_QUESTUPDATE_FAILEDTIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x198*/ { "SMSG_QUESTUPDATE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x199*/ { "SMSG_QUESTUPDATE_ADD_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x19A*/ { "SMSG_QUESTUPDATE_ADD_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x19B*/ { "CMSG_QUEST_CONFIRM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleQuestConfirmAccept },
+ /*0x19C*/ { "SMSG_QUEST_CONFIRM_ACCEPT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x19D*/ { "CMSG_PUSHQUESTTOPARTY", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushToParty },
+ /*0x19E*/ { "CMSG_LIST_INVENTORY", STATUS_LOGGEDIN, &WorldSession::HandleListInventoryOpcode },
+ /*0x19F*/ { "SMSG_LIST_INVENTORY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A0*/ { "CMSG_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSellItemOpcode },
+ /*0x1A1*/ { "SMSG_SELL_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A2*/ { "CMSG_BUY_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemOpcode },
+ /*0x1A3*/ { "CMSG_BUY_ITEM_IN_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemInSlotOpcode },
+ /*0x1A4*/ { "SMSG_BUY_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A5*/ { "SMSG_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A6*/ { "CMSG_TAXICLEARALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1A7*/ { "CMSG_TAXIENABLEALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1A8*/ { "CMSG_TAXISHOWNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1A9*/ { "SMSG_SHOWTAXINODES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1AA*/ { "CMSG_TAXINODE_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNodeStatusQueryOpcode },
+ /*0x1AB*/ { "SMSG_TAXINODE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1AC*/ { "CMSG_TAXIQUERYAVAILABLENODES", STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAvailableNodes },
+ /*0x1AD*/ { "CMSG_ACTIVATETAXI", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiOpcode },
+ /*0x1AE*/ { "SMSG_ACTIVATETAXIREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1AF*/ { "SMSG_NEW_TAXI_PATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B0*/ { "CMSG_TRAINER_LIST", STATUS_LOGGEDIN, &WorldSession::HandleTrainerListOpcode },
+ /*0x1B1*/ { "SMSG_TRAINER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B2*/ { "CMSG_TRAINER_BUY_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleTrainerBuySpellOpcode },
+ /*0x1B3*/ { "SMSG_TRAINER_BUY_SUCCEEDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B4*/ { "SMSG_TRAINER_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B5*/ { "CMSG_BINDER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBinderActivateOpcode },
+ /*0x1B6*/ { "SMSG_PLAYERBINDERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B7*/ { "CMSG_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBankerActivateOpcode },
+ /*0x1B8*/ { "SMSG_SHOW_BANK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B9*/ { "CMSG_BUY_BANK_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyBankSlotOpcode },
+ /*0x1BA*/ { "SMSG_BUY_BANK_SLOT_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1BB*/ { "CMSG_PETITION_SHOWLIST", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowListOpcode },
+ /*0x1BC*/ { "SMSG_PETITION_SHOWLIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1BD*/ { "CMSG_PETITION_BUY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionBuyOpcode },
+ /*0x1BE*/ { "CMSG_PETITION_SHOW_SIGNATURES", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowSignOpcode },
+ /*0x1BF*/ { "SMSG_PETITION_SHOW_SIGNATURES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C0*/ { "CMSG_PETITION_SIGN", STATUS_LOGGEDIN, &WorldSession::HandlePetitionSignOpcode },
+ /*0x1C1*/ { "SMSG_PETITION_SIGN_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C2*/ { "MSG_PETITION_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandlePetitionDeclineOpcode },
+ /*0x1C3*/ { "CMSG_OFFER_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleOfferPetitionOpcode },
+ /*0x1C4*/ { "CMSG_TURN_IN_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleTurnInPetitionOpcode },
+ /*0x1C5*/ { "SMSG_TURN_IN_PETITION_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C6*/ { "CMSG_PETITION_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionQueryOpcode },
+ /*0x1C7*/ { "SMSG_PETITION_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C8*/ { "SMSG_FISH_NOT_HOOKED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C9*/ { "SMSG_FISH_ESCAPED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1CA*/ { "CMSG_BUG", STATUS_LOGGEDIN, &WorldSession::HandleBugOpcode },
+ /*0x1CB*/ { "SMSG_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1CC*/ { "CMSG_PLAYED_TIME", STATUS_LOGGEDIN, &WorldSession::HandlePlayedTime },
+ /*0x1CD*/ { "SMSG_PLAYED_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1CE*/ { "CMSG_QUERY_TIME", STATUS_LOGGEDIN, &WorldSession::HandleQueryTimeOpcode },
+ /*0x1CF*/ { "SMSG_QUERY_TIME_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D0*/ { "SMSG_LOG_XPGAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D1*/ { "SMSG_AURACASTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D2*/ { "CMSG_RECLAIM_CORPSE", STATUS_LOGGEDIN, &WorldSession::HandleCorpseReclaimOpcode },
+ /*0x1D3*/ { "CMSG_WRAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleWrapItemOpcode },
+ /*0x1D4*/ { "SMSG_LEVELUP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D5*/ { "MSG_MINIMAP_PING", STATUS_LOGGEDIN, &WorldSession::HandleMinimapPingOpcode },
+ /*0x1D6*/ { "SMSG_RESISTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D7*/ { "SMSG_ENCHANTMENTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D8*/ { "CMSG_SET_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1D9*/ { "SMSG_START_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DA*/ { "SMSG_PAUSE_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DB*/ { "SMSG_STOP_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DC*/ { "CMSG_PING", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
+ /*0x1DD*/ { "SMSG_PONG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DE*/ { "SMSG_CLEAR_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DF*/ { "SMSG_GAMEOBJECT_PAGETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E0*/ { "CMSG_SETSHEATHED", STATUS_LOGGEDIN, &WorldSession::HandleSetSheathedOpcode },
+ /*0x1E1*/ { "SMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E2*/ { "SMSG_SPELL_DELAYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E3*/ { "CMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E4*/ { "SMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E5*/ { "CMSG_GHOST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E6*/ { "CMSG_GM_INVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E7*/ { "SMSG_INVALID_PROMOTION_CODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E8*/ { "MSG_GM_BIND_OTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E9*/ { "MSG_GM_SUMMON", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1EA*/ { "SMSG_ITEM_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1EB*/ { "SMSG_ITEM_ENCHANT_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1EC*/ { "SMSG_AUTH_CHALLENGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1ED*/ { "CMSG_AUTH_SESSION", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
+ /*0x1EE*/ { "SMSG_AUTH_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1EF*/ { "MSG_GM_SHOWLABEL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1F0*/ { "CMSG_PET_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandlePetCastSpellOpcode },
+ /*0x1F1*/ { "MSG_SAVE_GUILD_EMBLEM", STATUS_LOGGEDIN, &WorldSession::HandleGuildSaveEmblemOpcode },
+ /*0x1F2*/ { "MSG_TABARDVENDOR_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleTabardVendorActivateOpcode},
+ /*0x1F3*/ { "SMSG_PLAY_SPELL_VISUAL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F4*/ { "CMSG_ZONEUPDATE", STATUS_LOGGEDIN, &WorldSession::HandleZoneUpdateOpcode },
+ /*0x1F5*/ { "SMSG_PARTYKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F6*/ { "SMSG_COMPRESSED_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F7*/ { "SMSG_PLAY_SPELL_IMPACT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F8*/ { "SMSG_EXPLORATION_EXPERIENCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F9*/ { "CMSG_GM_SET_SECURITY_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1FA*/ { "CMSG_GM_NUKE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1FB*/ { "MSG_RANDOM_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleRandomRollOpcode },
+ /*0x1FC*/ { "SMSG_ENVIRONMENTALDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1FD*/ { "CMSG_RWHOIS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1FE*/ { "SMSG_RWHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1FF*/ { "MSG_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLookingForGroup },
+ /*0x200*/ { "CMSG_SET_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleSetLfgOpcode },
+ /*0x201*/ { "CMSG_UNLEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x202*/ { "CMSG_UNLEARN_SKILL", STATUS_LOGGEDIN, &WorldSession::HandleUnlearnSkillOpcode },
+ /*0x203*/ { "SMSG_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x204*/ { "CMSG_DECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x205*/ { "CMSG_GMTICKET_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketCreateOpcode },
+ /*0x206*/ { "SMSG_GMTICKET_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x207*/ { "CMSG_GMTICKET_UPDATETEXT", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketUpdateOpcode },
- /*0x208*/ { "SMSG_GMTICKET_UPDATETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x209*/ { "SMSG_ACCOUNT_DATA_TIMES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20A*/ { "CMSG_REQUEST_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData },
- /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleUpdateAccountData },
- /*0x20C*/ { "SMSG_UPDATE_ACCOUNT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20D*/ { "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20E*/ { "SMSG_POWERGAINLOG_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20F*/ { "CMSG_GM_TEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x210*/ { "CMSG_GM_CREATE_ITEM_TARGET", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x211*/ { "CMSG_GMTICKET_GETTICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketGetTicketOpcode },
- /*0x212*/ { "SMSG_GMTICKET_GETTICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x213*/ { "CMSG_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x214*/ { "SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x215*/ { "SMSG_GAMEOBJECT_DESPAWN_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x216*/ { "MSG_CORPSE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCorpseQueryOpcode },
- /*0x217*/ { "CMSG_GMTICKET_DELETETICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketDeleteOpcode },
- /*0x218*/ { "SMSG_GMTICKET_DELETETICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x219*/ { "SMSG_CHAT_WRONG_FACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x21A*/ { "CMSG_GMTICKET_SYSTEMSTATUS", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketSystemStatusOpcode},
- /*0x21B*/ { "SMSG_GMTICKET_SYSTEMSTATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x21C*/ { "CMSG_SPIRIT_HEALER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleSpiritHealerActivateOpcode},
- /*0x21D*/ { "CMSG_SET_STAT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x21E*/ { "SMSG_SET_REST_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x21F*/ { "CMSG_SKILL_BUY_STEP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x220*/ { "CMSG_SKILL_BUY_RANK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x221*/ { "CMSG_XP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x222*/ { "SMSG_SPIRIT_HEALER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x223*/ { "CMSG_CHARACTER_POINT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x224*/ { "SMSG_GOSSIP_POI", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x225*/ { "CMSG_CHAT_IGNORED", STATUS_LOGGEDIN, &WorldSession::HandleChatIgnoredOpcode },
- /*0x226*/ { "CMSG_GM_VISION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x227*/ { "CMSG_SERVER_COMMAND", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x228*/ { "CMSG_GM_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x229*/ { "CMSG_GM_REVEALTO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22A*/ { "CMSG_GM_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22B*/ { "CMSG_GM_SUMMONMOB", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22C*/ { "CMSG_GM_MOVECORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22D*/ { "CMSG_GM_FREEZE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22E*/ { "CMSG_GM_UBERINVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22F*/ { "CMSG_GM_REQUEST_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x230*/ { "SMSG_GM_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x231*/ { "CMSG_GUILD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildRankOpcode },
- /*0x232*/ { "CMSG_GUILD_ADD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildAddRankOpcode },
- /*0x233*/ { "CMSG_GUILD_DEL_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildDelRankOpcode },
- /*0x234*/ { "CMSG_GUILD_SET_PUBLIC_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetPublicNoteOpcode },
- /*0x235*/ { "CMSG_GUILD_SET_OFFICER_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetOfficerNoteOpcode },
- /*0x236*/ { "SMSG_LOGIN_VERIFY_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x237*/ { "CMSG_CLEAR_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x238*/ { "CMSG_SEND_MAIL", STATUS_LOGGEDIN, &WorldSession::HandleSendMail },
- /*0x239*/ { "SMSG_SEND_MAIL_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x23A*/ { "CMSG_GET_MAIL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleGetMail },
- /*0x23B*/ { "SMSG_MAIL_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x23C*/ { "CMSG_BATTLEFIELD_LIST", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundListOpcode },
- /*0x23D*/ { "SMSG_BATTLEFIELD_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x23E*/ { "CMSG_BATTLEFIELD_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x23F*/ { "SMSG_BATTLEFIELD_WIN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x240*/ { "SMSG_BATTLEFIELD_LOSE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x241*/ { "CMSG_TAXICLEARNODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x242*/ { "CMSG_TAXIENABLENODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x243*/ { "CMSG_ITEM_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemTextQuery },
- /*0x244*/ { "SMSG_ITEM_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x245*/ { "CMSG_MAIL_TAKE_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleTakeMoney },
- /*0x246*/ { "CMSG_MAIL_TAKE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleTakeItem },
- /*0x247*/ { "CMSG_MAIL_MARK_AS_READ", STATUS_LOGGEDIN, &WorldSession::HandleMarkAsRead },
- /*0x248*/ { "CMSG_MAIL_RETURN_TO_SENDER", STATUS_LOGGEDIN, &WorldSession::HandleReturnToSender },
- /*0x249*/ { "CMSG_MAIL_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleMailDelete },
- /*0x24A*/ { "CMSG_MAIL_CREATE_TEXT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleMailCreateTextItem },
- /*0x24B*/ { "SMSG_SPELLLOGMISS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24C*/ { "SMSG_SPELLLOGEXECUTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24D*/ { "SMSG_DEBUGAURAPROC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24E*/ { "SMSG_PERIODICAURALOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24F*/ { "SMSG_SPELLDAMAGESHIELD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x250*/ { "SMSG_SPELLNONMELEEDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x251*/ { "CMSG_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandleLearnTalentOpcode },
- /*0x252*/ { "SMSG_RESURRECT_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x253*/ { "CMSG_TOGGLE_PVP", STATUS_LOGGEDIN, &WorldSession::HandleTogglePvP },
- /*0x254*/ { "SMSG_ZONE_UNDER_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x255*/ { "MSG_AUCTION_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleAuctionHelloOpcode },
- /*0x256*/ { "CMSG_AUCTION_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionSellItem },
- /*0x257*/ { "CMSG_AUCTION_REMOVE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionRemoveItem },
- /*0x258*/ { "CMSG_AUCTION_LIST_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListItems },
- /*0x259*/ { "CMSG_AUCTION_LIST_OWNER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListOwnerItems },
- /*0x25A*/ { "CMSG_AUCTION_PLACE_BID", STATUS_LOGGEDIN, &WorldSession::HandleAuctionPlaceBid },
- /*0x25B*/ { "SMSG_AUCTION_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25C*/ { "SMSG_AUCTION_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25D*/ { "SMSG_AUCTION_OWNER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25E*/ { "SMSG_AUCTION_BIDDER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25F*/ { "SMSG_AUCTION_OWNER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x260*/ { "SMSG_PROCRESIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x261*/ { "SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE",STATUS_NEVER,&WorldSession::Handle_ServerSide },
- /*0x262*/ { "SMSG_DISPEL_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x263*/ { "SMSG_SPELLORDAMAGE_IMMUNE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x264*/ { "CMSG_AUCTION_LIST_BIDDER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListBidderItems },
- /*0x265*/ { "SMSG_AUCTION_BIDDER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x266*/ { "SMSG_SET_FLAT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x267*/ { "SMSG_SET_PCT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x268*/ { "CMSG_SET_AMMO", STATUS_LOGGEDIN, &WorldSession::HandleSetAmmoOpcode },
- /*0x269*/ { "SMSG_CORPSE_RECLAIM_DELAY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x26A*/ { "CMSG_SET_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleSetActiveMoverOpcode },
- /*0x26B*/ { "CMSG_PET_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandlePetCancelAuraOpcode },
- /*0x26C*/ { "CMSG_PLAYER_AI_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x26D*/ { "CMSG_CANCEL_AUTO_REPEAT_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCancelAutoRepeatSpellOpcode},
- /*0x26E*/ { "MSG_GM_ACCOUNT_ONLINE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x26F*/ { "MSG_LIST_STABLED_PETS", STATUS_LOGGEDIN, &WorldSession::HandleListStabledPetsOpcode },
- /*0x270*/ { "CMSG_STABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStablePet },
- /*0x271*/ { "CMSG_UNSTABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleUnstablePet },
- /*0x272*/ { "CMSG_BUY_STABLE_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyStableSlot },
- /*0x273*/ { "SMSG_STABLE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x274*/ { "CMSG_STABLE_REVIVE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableRevivePet },
- /*0x275*/ { "CMSG_STABLE_SWAP_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableSwapPet },
- /*0x276*/ { "MSG_QUEST_PUSH_RESULT", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushResult },
- /*0x277*/ { "SMSG_PLAY_MUSIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x278*/ { "SMSG_PLAY_OBJECT_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x279*/ { "CMSG_REQUEST_PET_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestPetInfoOpcode },
- /*0x27A*/ { "CMSG_FAR_SIGHT", STATUS_LOGGEDIN, &WorldSession::HandleFarSightOpcode },
- /*0x27B*/ { "SMSG_SPELLDISPELLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x27C*/ { "SMSG_DAMAGE_CALC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x27D*/ { "CMSG_ENABLE_DAMAGE_LOG", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x27E*/ { "CMSG_GROUP_CHANGE_SUB_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleGroupChangeSubGroupOpcode },
- /*0x27F*/ { "CMSG_REQUEST_PARTY_MEMBER_STATS", STATUS_LOGGEDIN, &WorldSession::HandleRequestPartyMemberStatsOpcode},
- /*0x280*/ { "CMSG_GROUP_SWAP_SUB_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x281*/ { "CMSG_RESET_FACTION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x282*/ { "CMSG_AUTOSTORE_BANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBankItemOpcode },
- /*0x283*/ { "CMSG_AUTOBANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoBankItemOpcode },
- /*0x284*/ { "MSG_QUERY_NEXT_MAIL_TIME", STATUS_LOGGEDIN, &WorldSession::HandleMsgQueryNextMailtime },
- /*0x285*/ { "SMSG_RECEIVED_MAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x286*/ { "SMSG_RAID_GROUP_ONLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x287*/ { "CMSG_SET_DURABILITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x288*/ { "CMSG_SET_PVP_RANK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x289*/ { "CMSG_ADD_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x28A*/ { "CMSG_DEL_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x28B*/ { "CMSG_SET_PVP_TITLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x28C*/ { "SMSG_PVP_CREDIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x28D*/ { "SMSG_AUCTION_REMOVED_NOTIFICATION",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x28E*/ { "CMSG_GROUP_RAID_CONVERT", STATUS_LOGGEDIN, &WorldSession::HandleRaidConvertOpcode },
- /*0x28F*/ { "CMSG_GROUP_ASSISTANT_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupAssistantOpcode },
- /*0x290*/ { "CMSG_BUYBACK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuybackItem },
- /*0x291*/ { "SMSG_SERVER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x292*/ { "CMSG_MEETINGSTONE_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x293*/ { "CMSG_MEETINGSTONE_LEAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x294*/ { "CMSG_MEETINGSTONE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x295*/ { "SMSG_MEETINGSTONE_SETQUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x296*/ { "CMSG_MEETINGSTONE_INFO", STATUS_LOGGEDIN, &WorldSession::HandleMeetingStoneInfo },
- /*0x297*/ { "SMSG_MEETINGSTONE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x298*/ { "SMSG_MEETINGSTONE_IN_PROGRESS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x299*/ { "SMSG_MEETINGSTONE_MEMBER_ADDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29A*/ { "CMSG_GMTICKETSYSTEM_TOGGLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x29B*/ { "CMSG_CANCEL_GROWTH_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelGrowthAuraOpcode },
- /*0x29C*/ { "SMSG_CANCEL_AUTO_REPEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29D*/ { "SMSG_STANDSTATE_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29E*/ { "SMSG_LOOT_ALL_PASSED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29F*/ { "SMSG_LOOT_ROLL_WON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A0*/ { "CMSG_LOOT_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleLootRoll },
- /*0x2A1*/ { "SMSG_LOOT_START_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A2*/ { "SMSG_LOOT_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A3*/ { "CMSG_LOOT_MASTER_GIVE", STATUS_LOGGEDIN, &WorldSession::HandleLootMasterGiveOpcode },
- /*0x2A4*/ { "SMSG_LOOT_MASTER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A5*/ { "SMSG_SET_FORCED_REACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A6*/ { "SMSG_SPELL_FAILED_OTHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A7*/ { "SMSG_GAMEOBJECT_RESET_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A8*/ { "CMSG_REPAIR_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleRepairItemOpcode },
- /*0x2A9*/ { "SMSG_CHAT_PLAYER_NOT_FOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2AA*/ { "MSG_TALENT_WIPE_CONFIRM", STATUS_LOGGEDIN, &WorldSession::HandleTalentWipeOpcode },
- /*0x2AB*/ { "SMSG_SUMMON_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2AC*/ { "CMSG_SUMMON_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleSummonResponseOpcode },
- /*0x2AD*/ { "MSG_MOVE_TOGGLE_GRAVITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2AE*/ { "SMSG_MONSTER_MOVE_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2AF*/ { "SMSG_PET_BROKEN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B0*/ { "MSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B1*/ { "MSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B2*/ { "CMSG_SERVER_BROADCAST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B3*/ { "CMSG_SELF_RES", STATUS_LOGGEDIN, &WorldSession::HandleSelfResOpcode },
- /*0x2B4*/ { "SMSG_FEIGN_DEATH_RESISTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B5*/ { "CMSG_RUN_SCRIPT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B6*/ { "SMSG_SCRIPT_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B7*/ { "SMSG_DUEL_COUNTDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B8*/ { "SMSG_AREA_TRIGGER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B9*/ { "CMSG_TOGGLE_HELM", STATUS_LOGGEDIN, &WorldSession::HandleToggleHelmOpcode },
- /*0x2BA*/ { "CMSG_TOGGLE_CLOAK", STATUS_LOGGEDIN, &WorldSession::HandleToggleCloakOpcode },
- /*0x2BB*/ { "SMSG_MEETINGSTONE_JOINFAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2BC*/ { "SMSG_PLAYER_SKINNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2BD*/ { "SMSG_DURABILITY_DAMAGE_DEATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2BE*/ { "CMSG_SET_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2BF*/ { "CMSG_SET_ACTIONBAR_TOGGLES", STATUS_AUTHED, &WorldSession::HandleSetActionBar },
- /*0x2C0*/ { "UMSG_DELETE_GUILD_CHARTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2C1*/ { "MSG_PETITION_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetitionRenameOpcode },
- /*0x2C2*/ { "SMSG_INIT_WORLD_STATES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C3*/ { "SMSG_UPDATE_WORLD_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C4*/ { "CMSG_ITEM_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemNameQueryOpcode },
- /*0x2C5*/ { "SMSG_ITEM_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C6*/ { "SMSG_PET_ACTION_FEEDBACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C7*/ { "CMSG_CHAR_RENAME", STATUS_AUTHED, &WorldSession::HandleChangePlayerNameOpcode },
- /*0x2C8*/ { "SMSG_CHAR_RENAME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C9*/ { "CMSG_MOVE_SPLINE_DONE", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNextDestinationOpcode },
- /*0x2CA*/ { "CMSG_MOVE_FALL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x2CB*/ { "SMSG_INSTANCE_SAVE_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2CC*/ { "SMSG_RAID_INSTANCE_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2CD*/ { "CMSG_REQUEST_RAID_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestRaidInfoOpcode },
- /*0x2CE*/ { "CMSG_MOVE_TIME_SKIPPED", STATUS_LOGGEDIN, &WorldSession::HandleMoveTimeSkippedOpcode },
- /*0x2CF*/ { "CMSG_MOVE_FEATHER_FALL_ACK", STATUS_LOGGEDIN, &WorldSession::HandleFeatherFallAck },
- /*0x2D0*/ { "CMSG_MOVE_WATER_WALK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveWaterWalkAck },
- /*0x2D1*/ { "CMSG_MOVE_NOT_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleNotActiveMoverOpcode },
- /*0x2D2*/ { "SMSG_PLAY_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2D3*/ { "CMSG_BATTLEFIELD_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleBattlefieldStatusOpcode },
- /*0x2D4*/ { "SMSG_BATTLEFIELD_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2D5*/ { "CMSG_BATTLEFIELD_PORT", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPortOpcode},
- /*0x2D6*/ { "MSG_INSPECT_HONOR_STATS", STATUS_LOGGEDIN, &WorldSession::HandleInspectHonorStatsOpcode },
- /*0x2D7*/ { "CMSG_BATTLEMASTER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundHelloOpcode },
- /*0x2D8*/ { "CMSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2D9*/ { "CMSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2DA*/ { "SMSG_FORCE_WALK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2DB*/ { "CMSG_FORCE_WALK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x2DC*/ { "SMSG_FORCE_SWIM_BACK_SPEED_CHANGE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2DD*/ { "CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
- /*0x2DE*/ { "SMSG_FORCE_TURN_RATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2DF*/ { "CMSG_FORCE_TURN_RATE_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x2E0*/ { "MSG_PVP_LOG_DATA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPVPlogdataOpcode},
- /*0x2E1*/ { "CMSG_LEAVE_BATTLEFIELD", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundLeaveOpcode },
- /*0x2E2*/ { "CMSG_AREA_SPIRIT_HEALER_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueryOpcode},
- /*0x2E3*/ { "CMSG_AREA_SPIRIT_HEALER_QUEUE", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueueOpcode},
- /*0x2E4*/ { "SMSG_AREA_SPIRIT_HEALER_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2E5*/ { "CMSG_GM_UNTEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2E6*/ { "SMSG_WARDEN_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2E7*/ { "CMSG_WARDEN_DATA", STATUS_LOGGEDIN, &WorldSession::HandleWardenDataOpcode },
- /*0x2E8*/ { "SMSG_GROUP_JOINED_BATTLEGROUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2E9*/ { "MSG_BATTLEGROUND_PLAYER_POSITIONS",STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPositionsOpcode},
- /*0x2EA*/ { "CMSG_PET_STOP_ATTACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2EB*/ { "SMSG_BINDER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2EC*/ { "SMSG_BATTLEGROUND_PLAYER_JOINED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2ED*/ { "SMSG_BATTLEGROUND_PLAYER_LEFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2EE*/ { "CMSG_BATTLEMASTER_JOIN", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundJoinOpcode },
- /*0x2EF*/ { "SMSG_ADDON_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F0*/ { "CMSG_PET_UNLEARN", STATUS_LOGGEDIN, &WorldSession::HandlePetUnlearnOpcode },
- /*0x2F1*/ { "SMSG_PET_UNLEARN_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F2*/ { "SMSG_PARTY_MEMBER_STATS_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F3*/ { "CMSG_PET_SPELL_AUTOCAST", STATUS_LOGGEDIN, &WorldSession::HandlePetSpellAutocastOpcode },
- /*0x2F4*/ { "SMSG_WEATHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F5*/ { "SMSG_PLAY_TIME_WARNING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F6*/ { "SMSG_MINIGAME_SETUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F7*/ { "SMSG_MINIGAME_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F8*/ { "CMSG_MINIGAME_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2F9*/ { "SMSG_MINIGAME_MOVE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FA*/ { "SMSG_RAID_INSTANCE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FB*/ { "SMSG_COMPRESSED_MOVES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FC*/ { "CMSG_GUILD_INFO_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildChangeInfoOpcode },
- /*0x2FD*/ { "SMSG_CHAT_RESTRICTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FE*/ { "SMSG_SPLINE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FF*/ { "SMSG_SPLINE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x300*/ { "SMSG_SPLINE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x301*/ { "SMSG_SPLINE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x302*/ { "SMSG_SPLINE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x303*/ { "SMSG_SPLINE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x304*/ { "SMSG_SPLINE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x305*/ { "SMSG_SPLINE_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x306*/ { "SMSG_SPLINE_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x307*/ { "SMSG_SPLINE_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x308*/ { "SMSG_SPLINE_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x309*/ { "SMSG_SPLINE_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30A*/ { "SMSG_SPLINE_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30B*/ { "SMSG_SPLINE_MOVE_START_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30C*/ { "SMSG_SPLINE_MOVE_STOP_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30D*/ { "SMSG_SPLINE_MOVE_SET_RUN_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30E*/ { "SMSG_SPLINE_MOVE_SET_WALK_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30F*/ { "CMSG_GM_NUKE_ACCOUNT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x310*/ { "MSG_GM_DESTROY_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x311*/ { "CMSG_GM_DESTROY_ONLINE_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x312*/ { "CMSG_ACTIVATETAXIEXPRESS", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiFarOpcode },
- /*0x313*/ { "SMSG_SET_FACTION_ATWAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x314*/ { "SMSG_GAMETIMEBIAS_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x315*/ { "CMSG_DEBUG_ACTIONS_START", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x316*/ { "CMSG_DEBUG_ACTIONS_STOP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x317*/ { "CMSG_SET_FACTION_INACTIVE", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionInactiveOpcode},
- /*0x318*/ { "CMSG_SET_WATCHED_FACTION", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionIndexOpcode},
- /*0x319*/ { "MSG_MOVE_TIME_SKIPPED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x31A*/ { "SMSG_SPLINE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x31B*/ { "CMSG_SET_EXPLORATION_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x31C*/ { "SMSG_INVALIDATE_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x31D*/ { "CMSG_RESET_INSTANCES", STATUS_LOGGEDIN, &WorldSession::HandleResetInstancesOpcode },
- /*0x31E*/ { "SMSG_INSTANCE_RESET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x31F*/ { "SMSG_INSTANCE_RESET_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x320*/ { "SMSG_UPDATE_LAST_INSTANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x321*/ { "MSG_RAID_TARGET_UPDATE", STATUS_LOGGEDIN, &WorldSession::HandleRaidIconTargetOpcode },
- /*0x322*/ { "MSG_RAID_READY_CHECK", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckOpcode },
- /*0x323*/ { "CMSG_LUA_USAGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x324*/ { "SMSG_PET_ACTION_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x325*/ { "SMSG_PET_DISMISS_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x326*/ { "SMSG_GHOSTEE_GONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x327*/ { "CMSG_GM_UPDATE_TICKET_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x328*/ { "SMSG_GM_TICKET_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x329*/ { "MSG_SET_DUNGEON_DIFFICULTY", STATUS_LOGGEDIN, &WorldSession::HandleDungeonDifficultyOpcode },
- /*0x32A*/ { "CMSG_GMSURVEY_SUBMIT", STATUS_LOGGEDIN, &WorldSession::Handle_NULL },//&WorldSession::HandleGMSurveySubmit
- /*0x32B*/ { "SMSG_UPDATE_INSTANCE_OWNERSHIP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x32C*/ { "CMSG_IGNORE_KNOCKBACK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x32D*/ { "SMSG_CHAT_PLAYER_AMBIGUOUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x32E*/ { "MSG_DELAY_GHOST_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x32F*/ { "SMSG_SPELLINSTAKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x330*/ { "SMSG_SPELL_UPDATE_CHAIN_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x331*/ { "CMSG_CHAT_FILTERED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x332*/ { "SMSG_EXPECTED_SPAM_RECORDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x333*/ { "SMSG_SPELLSTEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x334*/ { "CMSG_LOTTERY_QUERY_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x335*/ { "SMSG_LOTTERY_QUERY_RESULT_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x336*/ { "CMSG_BUY_LOTTERY_TICKET_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x337*/ { "SMSG_LOTTERY_RESULT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x338*/ { "SMSG_CHARACTER_PROFILE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x339*/ { "SMSG_CHARACTER_PROFILE_REALM_CONNECTED",STATUS_NEVER,&WorldSession::Handle_ServerSide },
- /*0x33A*/ { "SMSG_DEFENSE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33B*/ { "SMSG_INSTANCE_DIFFICULTY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33C*/ { "MSG_GM_RESETINSTANCELIMIT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x33D*/ { "SMSG_MOTD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33E*/ { "SMSG_MOVE_SET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33F*/ { "SMSG_MOVE_UNSET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x340*/ { "CMSG_MOVE_FLIGHT_ACK_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x341*/ { "MSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x342*/ { "MSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x343*/ { "SMSG_MOVE_SET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x344*/ { "SMSG_MOVE_UNSET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x345*/ { "CMSG_MOVE_SET_CAN_FLY_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveFlyModeChangeAckOpcode},
- /*0x346*/ { "CMSG_MOVE_SET_FLY", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x347*/ { "CMSG_SOCKET_GEMS", STATUS_LOGGEDIN, &WorldSession::HandleSocketOpcode },
- /*0x348*/ { "CMSG_ARENA_TEAM_CREATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x349*/ { "SMSG_ARENA_TEAM_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x34A*/ { "UMSG_UPDATE_ARENA_TEAM_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x34B*/ { "CMSG_ARENA_TEAM_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamQueryOpcode },
- /*0x34C*/ { "SMSG_ARENA_TEAM_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x34D*/ { "CMSG_ARENA_TEAM_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRosterOpcode },
- /*0x34E*/ { "SMSG_ARENA_TEAM_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x34F*/ { "CMSG_ARENA_TEAM_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamAddMemberOpcode },
- /*0x350*/ { "SMSG_ARENA_TEAM_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x351*/ { "CMSG_ARENA_TEAM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteAcceptOpcode},
- /*0x352*/ { "CMSG_ARENA_TEAM_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteDeclineOpcode},
- /*0x353*/ { "CMSG_ARENA_TEAM_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamLeaveOpcode },
- /*0x354*/ { "CMSG_ARENA_TEAM_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRemoveFromTeamOpcode},
- /*0x355*/ { "CMSG_ARENA_TEAM_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamDisbandOpcode },
- /*0x356*/ { "CMSG_ARENA_TEAM_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamPromoteToCaptainOpcode},
- /*0x357*/ { "SMSG_ARENA_TEAM_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x358*/ { "CMSG_BATTLEMASTER_JOIN_ARENA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundArenaJoin },
- /*0x359*/ { "MSG_MOVE_START_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x35A*/ { "MSG_MOVE_STOP_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x35B*/ { "SMSG_ARENA_TEAM_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x35C*/ { "CMSG_LFG_SET_AUTOJOIN", STATUS_AUTHED, &WorldSession::HandleLfgAutoJoinOpcode },
- /*0x35D*/ { "CMSG_LFG_CLEAR_AUTOJOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfgCancelAutoJoinOpcode },
- /*0x35E*/ { "CMSG_LFM_SET_AUTOFILL", STATUS_AUTHED, &WorldSession::HandleLfmAutoAddMembersOpcode },
- /*0x35F*/ { "CMSG_LFM_CLEAR_AUTOFILL", STATUS_LOGGEDIN, &WorldSession::HandleLfmCancelAutoAddmembersOpcode},
- /*0x360*/ { "CMSG_ACCEPT_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x361*/ { "CMSG_DECLINE_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x362*/ { "CMSG_CANCEL_PENDING_LFG", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x363*/ { "CMSG_CLEAR_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearOpcode },
- /*0x364*/ { "CMSG_CLEAR_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetNoneOpcode },
- /*0x365*/ { "CMSG_SET_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetOpcode },
- /*0x366*/ { "CMSG_SET_LFG_COMMENT", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetCommentOpcode },
- /*0x367*/ { "SMSG_LFG_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x368*/ { "SMSG_LFG_OTHER_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x369*/ { "SMSG_LFG_AUTOJOIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36A*/ { "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36B*/ { "SMSG_LFG_LEADER_IS_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36C*/ { "SMSG_LFG_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36D*/ { "SMSG_LFG_UPDATE_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36E*/ { "SMSG_LFG_UPDATE_LFG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36F*/ { "SMSG_LFG_UPDATE_QUEUED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x370*/ { "SMSG_LFG_PENDING_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x371*/ { "SMSG_LFG_PENDING_MATCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x372*/ { "SMSG_LFG_PENDING_MATCH_DONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x373*/ { "SMSG_TITLE_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x374*/ { "CMSG_SET_TITLE", STATUS_LOGGEDIN, &WorldSession::HandleChooseTitleOpcode },
- /*0x375*/ { "CMSG_CANCEL_MOUNT_AURA", STATUS_LOGGEDIN, &WorldSession::HandleDismountOpcode },
- /*0x376*/ { "SMSG_ARENA_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x377*/ { "MSG_INSPECT_ARENA_TEAMS", STATUS_LOGGEDIN, &WorldSession::HandleInspectArenaStatsOpcode },
- /*0x378*/ { "SMSG_DEATH_RELEASE_LOC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x379*/ { "CMSG_CANCEL_TEMP_ENCHANTMENT", STATUS_LOGGEDIN, &WorldSession::HandleCancelTempItemEnchantmentOpcode},
- /*0x37A*/ { "SMSG_FORCED_DEATH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x37B*/ { "CMSG_CHEAT_SET_HONOR_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37C*/ { "CMSG_CHEAT_SET_ARENA_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37D*/ { "MSG_MOVE_SET_FLIGHT_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37E*/ { "MSG_MOVE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37F*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT",STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x380*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x381*/ { "SMSG_FORCE_FLIGHT_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x382*/ { "CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
- /*0x383*/ { "SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x384*/ { "CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
- /*0x385*/ { "SMSG_SPLINE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x386*/ { "SMSG_SPLINE_SET_FLIGHT_BACK_SPEED",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x387*/ { "CMSG_MAELSTROM_INVALIDATE_CACHE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x388*/ { "SMSG_FLIGHT_SPLINE_SYNC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x389*/ { "CMSG_SET_TAXI_BENCHMARK_MODE", STATUS_AUTHED, &WorldSession::HandleSetTaxiBenchmarkOpcode },
- /*0x38A*/ { "SMSG_JOINED_BATTLEGROUND_QUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x38B*/ { "SMSG_REALM_SPLIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x38C*/ { "CMSG_REALM_SPLIT", STATUS_AUTHED, &WorldSession::HandleRealmStateRequestOpcode },
- /*0x38D*/ { "CMSG_MOVE_CHNG_TRANSPORT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x38E*/ { "MSG_PARTY_ASSIGNMENT", STATUS_LOGGEDIN, &WorldSession::HandleGroupPromoteOpcode },
- /*0x38F*/ { "SMSG_OFFER_PETITION_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x390*/ { "SMSG_TIME_SYNC_REQ", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x391*/ { "CMSG_TIME_SYNC_RESP", STATUS_LOGGEDIN, &WorldSession::HandleAllowMoveAckOpcode },
- /*0x392*/ { "CMSG_SEND_LOCAL_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x393*/ { "CMSG_SEND_GENERAL_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x394*/ { "CMSG_SEND_COMBAT_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x395*/ { "CMSG_MAELSTROM_GM_SENT_MAIL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x396*/ { "SMSG_RESET_FAILED_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x397*/ { "SMSG_REAL_GROUP_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x398*/ { "SMSG_LFG_DISABLED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x399*/ { "CMSG_ACTIVE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x39A*/ { "CMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x39B*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE",STATUS_NEVER,&WorldSession::Handle_ServerSide },
- /*0x39C*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE_WRITE_FILE",STATUS_NEVER,&WorldSession::Handle_ServerSide},
- /*0x39D*/ { "SMSG_UPDATE_COMBO_POINTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x39E*/ { "SMSG_VOICE_SESSION_ROSTER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x39F*/ { "SMSG_VOICE_SESSION_LEAVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A0*/ { "SMSG_VOICE_SESSION_ADJUST_PRIORITY",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A1*/ { "CMSG_VOICE_SET_TALKER_MUTED_REQUEST",STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3A2*/ { "SMSG_VOICE_SET_TALKER_MUTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A3*/ { "SMSG_INIT_EXTRA_AURA_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A4*/ { "SMSG_SET_EXTRA_AURA_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A5*/ { "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A6*/ { "SMSG_CLEAR_EXTRA_AURA_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A7*/ { "MSG_MOVE_START_DESCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x3A8*/ { "CMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3A9*/ { "SMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3AA*/ { "SMSG_SPELL_CHANCE_PROC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3AB*/ { "CMSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3AC*/ { "SMSG_DISMOUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3AD*/ { "MSG_MOVE_UPDATE_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3AE*/ { "MSG_RAID_READY_CHECK_CONFIRM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3AF*/ { "CMSG_VOICE_SESSION_ENABLE", STATUS_AUTHED, &WorldSession::HandleVoiceSettingsOpcode },
- /*0x3B0*/ { "SMSG_VOICE_PARENTAL_CONTROLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B1*/ { "CMSG_GM_WHISPER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B2*/ { "SMSG_GM_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B3*/ { "MSG_GM_GEARRATING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B4*/ { "CMSG_COMMENTATOR_ENABLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B5*/ { "SMSG_COMMENTATOR_STATE_CHANGED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B6*/ { "CMSG_COMMENTATOR_GET_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B7*/ { "SMSG_COMMENTATOR_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B8*/ { "CMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B9*/ { "SMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3BA*/ { "SMSG_COMMENTATOR_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3BB*/ { "CMSG_COMMENTATOR_ENTER_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BC*/ { "CMSG_COMMENTATOR_EXIT_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BD*/ { "CMSG_COMMENTATOR_INSTANCE_COMMAND",STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BE*/ { "SMSG_CLEAR_TARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3BF*/ { "CMSG_BOT_DETECTED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3C0*/ { "SMSG_CROSSED_INEBRIATION_THRESHOLD",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C1*/ { "CMSG_CHEAT_PLAYER_LOGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3C2*/ { "CMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3C3*/ { "SMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C4*/ { "SMSG_KICK_REASON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C5*/ { "MSG_RAID_READY_CHECK_FINISHED", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckFinishOpcode},
- /*0x3C6*/ { "CMSG_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleReportSpamOpcode },
- /*0x3C7*/ { "SMSG_COMPLAIN_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C8*/ { "SMSG_FEATURE_SYSTEM_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C9*/ { "CMSG_GM_SHOW_COMPLAINTS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CA*/ { "CMSG_GM_UNSQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CB*/ { "CMSG_CHANNEL_SILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CC*/ { "CMSG_CHANNEL_SILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CD*/ { "CMSG_CHANNEL_UNSILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CE*/ { "CMSG_CHANNEL_UNSILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CF*/ { "CMSG_TARGET_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D0*/ { "CMSG_TARGET_SCRIPT_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D1*/ { "CMSG_CHANNEL_DISPLAY_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelRosterQuery },
- /*0x3D2*/ { "CMSG_SET_ACTIVE_VOICE_CHANNEL", STATUS_AUTHED, &WorldSession::HandleChannelVoiceChatQuery },
- /*0x3D3*/ { "CMSG_GET_CHANNEL_MEMBER_COUNT", STATUS_LOGGEDIN, &WorldSession::HandleChannelInfoQuery },
- /*0x3D4*/ { "SMSG_CHANNEL_MEMBER_COUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3D5*/ { "CMSG_CHANNEL_VOICE_ON", STATUS_LOGGEDIN, &WorldSession::HandleChannelEnableVoiceOpcode },
- /*0x3D6*/ { "CMSG_CHANNEL_VOICE_OFF", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D7*/ { "CMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D8*/ { "SMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3D9*/ { "SMSG_AVAILABLE_VOICE_CHANNEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3DA*/ { "CMSG_ADD_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DB*/ { "CMSG_DEL_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DC*/ { "CMSG_PARTY_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DD*/ { "CMSG_PARTY_UNSILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DE*/ { "MSG_NOTIFY_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DF*/ { "SMSG_COMSAT_RECONNECT_TRY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E0*/ { "SMSG_COMSAT_DISCONNECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E1*/ { "SMSG_COMSAT_CONNECT_FAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E2*/ { "SMSG_VOICE_CHAT_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E3*/ { "CMSG_REPORT_PVP_AFK", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundReportAFK },
- /*0x3E4*/ { "CMSG_REPORT_PVP_AFK_RESULT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3E5*/ { "CMSG_GUILD_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankQuery },
- /*0x3E6*/ { "CMSG_GUILD_BANK_QUERY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabColon },
- /*0x3E7*/ { "SMSG_GUILD_BANK_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E8*/ { "CMSG_GUILD_BANK_SWAP_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDepositItem },
- /*0x3E9*/ { "CMSG_GUILD_BANK_BUY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankBuyTab },
- /*0x3EA*/ { "CMSG_GUILD_BANK_UPDATE_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankModifyTab },
- /*0x3EB*/ { "CMSG_GUILD_BANK_DEPOSIT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDeposit },
- /*0x3EC*/ { "CMSG_GUILD_BANK_WITHDRAW_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankWithdraw },
- /*0x3ED*/ { "MSG_GUILD_BANK_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankLog },
- /*0x3EE*/ { "CMSG_SET_CHANNEL_WATCH", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoinNotify },
- /*0x3EF*/ { "SMSG_USERLIST_ADD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F0*/ { "SMSG_USERLIST_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F1*/ { "SMSG_USERLIST_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F2*/ { "CMSG_CLEAR_CHANNEL_WATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3F3*/ { "SMSG_INSPECT_TALENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F4*/ { "SMSG_GOGOGO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F5*/ { "SMSG_ECHO_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F6*/ { "CMSG_SET_TITLE_SUFFIX", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3F7*/ { "CMSG_SPELLCLICK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3F8*/ { "SMSG_LOOT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F9*/ { "CMSG_GM_CHARACTER_RESTORE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3FA*/ { "CMSG_GM_CHARACTER_SAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3FB*/ { "SMSG_VOICESESSION_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3FC*/ { "MSG_GUILD_PERMISSIONS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetRights },
- /*0x3FD*/ { "MSG_GUILD_BANK_MONEY_WITHDRAWN", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetMoneyAmount },
- /*0x3FE*/ { "MSG_GUILD_EVENT_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildEventLogOpcode },
- /*0x3FF*/ { "CMSG_MAELSTROM_RENAME_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x400*/ { "CMSG_GET_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x401*/ { "SMSG_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x402*/ { "SMSG_FORCE_DISPLAY_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x403*/ { "SMSG_SPELL_CHANCE_RESIST_PUSHBACK",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x404*/ { "CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT",STATUS_NEVER,&WorldSession::Handle_NULL },
- /*0x405*/ { "SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT",STATUS_NEVER,&WorldSession::Handle_ServerSide },
- /*0x406*/ { "CMSG_KEEP_ALIVE", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
- /*0x407*/ { "SMSG_RAID_READY_CHECK_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x408*/ { "CMSG_OPT_OUT_OF_LOOT", STATUS_AUTHED, &WorldSession::HandleGroupPassOnLootOpcode },
- /*0x409*/ { "MSG_QUERY_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabText },
- /*0x40A*/ { "CMSG_SET_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankSetTabText },
- /*0x40B*/ { "CMSG_SET_GRANTABLE_LEVELS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40C*/ { "CMSG_GRANT_LEVEL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40D*/ { "CMSG_REFER_A_FRIEND", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40E*/ { "MSG_GM_CHANGE_ARENA_RATING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x208*/ { "SMSG_GMTICKET_UPDATETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x209*/ { "SMSG_ACCOUNT_DATA_TIMES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20A*/ { "CMSG_REQUEST_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData },
+ /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_AUTHED, &WorldSession::HandleUpdateAccountData },
+ /*0x20C*/ { "SMSG_UPDATE_ACCOUNT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20D*/ { "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20E*/ { "SMSG_POWERGAINLOG_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20F*/ { "CMSG_GM_TEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x210*/ { "CMSG_GM_CREATE_ITEM_TARGET", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x211*/ { "CMSG_GMTICKET_GETTICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketGetTicketOpcode },
+ /*0x212*/ { "SMSG_GMTICKET_GETTICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x213*/ { "CMSG_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x214*/ { "SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x215*/ { "SMSG_GAMEOBJECT_DESPAWN_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x216*/ { "MSG_CORPSE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCorpseQueryOpcode },
+ /*0x217*/ { "CMSG_GMTICKET_DELETETICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketDeleteOpcode },
+ /*0x218*/ { "SMSG_GMTICKET_DELETETICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x219*/ { "SMSG_CHAT_WRONG_FACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x21A*/ { "CMSG_GMTICKET_SYSTEMSTATUS", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketSystemStatusOpcode},
+ /*0x21B*/ { "SMSG_GMTICKET_SYSTEMSTATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x21C*/ { "CMSG_SPIRIT_HEALER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleSpiritHealerActivateOpcode},
+ /*0x21D*/ { "CMSG_SET_STAT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x21E*/ { "SMSG_SET_REST_START_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x21F*/ { "CMSG_SKILL_BUY_STEP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x220*/ { "CMSG_SKILL_BUY_RANK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x221*/ { "CMSG_XP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x222*/ { "SMSG_SPIRIT_HEALER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x223*/ { "CMSG_CHARACTER_POINT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x224*/ { "SMSG_GOSSIP_POI", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x225*/ { "CMSG_CHAT_IGNORED", STATUS_LOGGEDIN, &WorldSession::HandleChatIgnoredOpcode },
+ /*0x226*/ { "CMSG_GM_VISION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x227*/ { "CMSG_SERVER_COMMAND", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x228*/ { "CMSG_GM_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x229*/ { "CMSG_GM_REVEALTO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22A*/ { "CMSG_GM_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22B*/ { "CMSG_GM_SUMMONMOB", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22C*/ { "CMSG_GM_MOVECORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22D*/ { "CMSG_GM_FREEZE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22E*/ { "CMSG_GM_UBERINVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22F*/ { "CMSG_GM_REQUEST_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x230*/ { "SMSG_GM_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x231*/ { "CMSG_GUILD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildRankOpcode },
+ /*0x232*/ { "CMSG_GUILD_ADD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildAddRankOpcode },
+ /*0x233*/ { "CMSG_GUILD_DEL_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildDelRankOpcode },
+ /*0x234*/ { "CMSG_GUILD_SET_PUBLIC_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetPublicNoteOpcode },
+ /*0x235*/ { "CMSG_GUILD_SET_OFFICER_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetOfficerNoteOpcode },
+ /*0x236*/ { "SMSG_LOGIN_VERIFY_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x237*/ { "CMSG_CLEAR_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x238*/ { "CMSG_SEND_MAIL", STATUS_LOGGEDIN, &WorldSession::HandleSendMail },
+ /*0x239*/ { "SMSG_SEND_MAIL_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x23A*/ { "CMSG_GET_MAIL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleGetMail },
+ /*0x23B*/ { "SMSG_MAIL_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x23C*/ { "CMSG_BATTLEFIELD_LIST", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundListOpcode },
+ /*0x23D*/ { "SMSG_BATTLEFIELD_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x23E*/ { "CMSG_BATTLEFIELD_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x23F*/ { "SMSG_BATTLEFIELD_WIN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x240*/ { "SMSG_BATTLEFIELD_LOSE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x241*/ { "CMSG_TAXICLEARNODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x242*/ { "CMSG_TAXIENABLENODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x243*/ { "CMSG_ITEM_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemTextQuery },
+ /*0x244*/ { "SMSG_ITEM_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x245*/ { "CMSG_MAIL_TAKE_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleTakeMoney },
+ /*0x246*/ { "CMSG_MAIL_TAKE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleTakeItem },
+ /*0x247*/ { "CMSG_MAIL_MARK_AS_READ", STATUS_LOGGEDIN, &WorldSession::HandleMarkAsRead },
+ /*0x248*/ { "CMSG_MAIL_RETURN_TO_SENDER", STATUS_LOGGEDIN, &WorldSession::HandleReturnToSender },
+ /*0x249*/ { "CMSG_MAIL_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleMailDelete },
+ /*0x24A*/ { "CMSG_MAIL_CREATE_TEXT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleMailCreateTextItem },
+ /*0x24B*/ { "SMSG_SPELLLOGMISS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24C*/ { "SMSG_SPELLLOGEXECUTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24D*/ { "SMSG_DEBUGAURAPROC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24E*/ { "SMSG_PERIODICAURALOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24F*/ { "SMSG_SPELLDAMAGESHIELD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x250*/ { "SMSG_SPELLNONMELEEDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x251*/ { "CMSG_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandleLearnTalentOpcode },
+ /*0x252*/ { "SMSG_RESURRECT_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x253*/ { "CMSG_TOGGLE_PVP", STATUS_LOGGEDIN, &WorldSession::HandleTogglePvP },
+ /*0x254*/ { "SMSG_ZONE_UNDER_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x255*/ { "MSG_AUCTION_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleAuctionHelloOpcode },
+ /*0x256*/ { "CMSG_AUCTION_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionSellItem },
+ /*0x257*/ { "CMSG_AUCTION_REMOVE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionRemoveItem },
+ /*0x258*/ { "CMSG_AUCTION_LIST_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListItems },
+ /*0x259*/ { "CMSG_AUCTION_LIST_OWNER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListOwnerItems },
+ /*0x25A*/ { "CMSG_AUCTION_PLACE_BID", STATUS_LOGGEDIN, &WorldSession::HandleAuctionPlaceBid },
+ /*0x25B*/ { "SMSG_AUCTION_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25C*/ { "SMSG_AUCTION_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25D*/ { "SMSG_AUCTION_OWNER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25E*/ { "SMSG_AUCTION_BIDDER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25F*/ { "SMSG_AUCTION_OWNER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x260*/ { "SMSG_PROCRESIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x261*/ { "SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x262*/ { "SMSG_DISPEL_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x263*/ { "SMSG_SPELLORDAMAGE_IMMUNE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x264*/ { "CMSG_AUCTION_LIST_BIDDER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListBidderItems },
+ /*0x265*/ { "SMSG_AUCTION_BIDDER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x266*/ { "SMSG_SET_FLAT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x267*/ { "SMSG_SET_PCT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x268*/ { "CMSG_SET_AMMO", STATUS_LOGGEDIN, &WorldSession::HandleSetAmmoOpcode },
+ /*0x269*/ { "SMSG_CORPSE_RECLAIM_DELAY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x26A*/ { "CMSG_SET_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleSetActiveMoverOpcode },
+ /*0x26B*/ { "CMSG_PET_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandlePetCancelAuraOpcode },
+ /*0x26C*/ { "CMSG_PLAYER_AI_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x26D*/ { "CMSG_CANCEL_AUTO_REPEAT_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCancelAutoRepeatSpellOpcode},
+ /*0x26E*/ { "MSG_GM_ACCOUNT_ONLINE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x26F*/ { "MSG_LIST_STABLED_PETS", STATUS_LOGGEDIN, &WorldSession::HandleListStabledPetsOpcode },
+ /*0x270*/ { "CMSG_STABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStablePet },
+ /*0x271*/ { "CMSG_UNSTABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleUnstablePet },
+ /*0x272*/ { "CMSG_BUY_STABLE_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyStableSlot },
+ /*0x273*/ { "SMSG_STABLE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x274*/ { "CMSG_STABLE_REVIVE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableRevivePet },
+ /*0x275*/ { "CMSG_STABLE_SWAP_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableSwapPet },
+ /*0x276*/ { "MSG_QUEST_PUSH_RESULT", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushResult },
+ /*0x277*/ { "SMSG_PLAY_MUSIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x278*/ { "SMSG_PLAY_OBJECT_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x279*/ { "CMSG_REQUEST_PET_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestPetInfoOpcode },
+ /*0x27A*/ { "CMSG_FAR_SIGHT", STATUS_LOGGEDIN, &WorldSession::HandleFarSightOpcode },
+ /*0x27B*/ { "SMSG_SPELLDISPELLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x27C*/ { "SMSG_DAMAGE_CALC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x27D*/ { "CMSG_ENABLE_DAMAGE_LOG", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x27E*/ { "CMSG_GROUP_CHANGE_SUB_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleGroupChangeSubGroupOpcode },
+ /*0x27F*/ { "CMSG_REQUEST_PARTY_MEMBER_STATS", STATUS_LOGGEDIN, &WorldSession::HandleRequestPartyMemberStatsOpcode},
+ /*0x280*/ { "CMSG_GROUP_SWAP_SUB_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x281*/ { "CMSG_RESET_FACTION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x282*/ { "CMSG_AUTOSTORE_BANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBankItemOpcode },
+ /*0x283*/ { "CMSG_AUTOBANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoBankItemOpcode },
+ /*0x284*/ { "MSG_QUERY_NEXT_MAIL_TIME", STATUS_LOGGEDIN, &WorldSession::HandleMsgQueryNextMailtime },
+ /*0x285*/ { "SMSG_RECEIVED_MAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x286*/ { "SMSG_RAID_GROUP_ONLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x287*/ { "CMSG_SET_DURABILITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x288*/ { "CMSG_SET_PVP_RANK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x289*/ { "CMSG_ADD_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x28A*/ { "CMSG_DEL_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x28B*/ { "CMSG_SET_PVP_TITLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x28C*/ { "SMSG_PVP_CREDIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x28D*/ { "SMSG_AUCTION_REMOVED_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x28E*/ { "CMSG_GROUP_RAID_CONVERT", STATUS_LOGGEDIN, &WorldSession::HandleRaidConvertOpcode },
+ /*0x28F*/ { "CMSG_GROUP_ASSISTANT_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupAssistantOpcode },
+ /*0x290*/ { "CMSG_BUYBACK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuybackItem },
+ /*0x291*/ { "SMSG_SERVER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x292*/ { "CMSG_MEETINGSTONE_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x293*/ { "CMSG_MEETINGSTONE_LEAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x294*/ { "CMSG_MEETINGSTONE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x295*/ { "SMSG_MEETINGSTONE_SETQUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x296*/ { "CMSG_MEETINGSTONE_INFO", STATUS_LOGGEDIN, &WorldSession::HandleMeetingStoneInfo },
+ /*0x297*/ { "SMSG_MEETINGSTONE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x298*/ { "SMSG_MEETINGSTONE_IN_PROGRESS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x299*/ { "SMSG_MEETINGSTONE_MEMBER_ADDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29A*/ { "CMSG_GMTICKETSYSTEM_TOGGLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x29B*/ { "CMSG_CANCEL_GROWTH_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelGrowthAuraOpcode },
+ /*0x29C*/ { "SMSG_CANCEL_AUTO_REPEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29D*/ { "SMSG_STANDSTATE_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29E*/ { "SMSG_LOOT_ALL_PASSED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29F*/ { "SMSG_LOOT_ROLL_WON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A0*/ { "CMSG_LOOT_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleLootRoll },
+ /*0x2A1*/ { "SMSG_LOOT_START_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A2*/ { "SMSG_LOOT_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A3*/ { "CMSG_LOOT_MASTER_GIVE", STATUS_LOGGEDIN, &WorldSession::HandleLootMasterGiveOpcode },
+ /*0x2A4*/ { "SMSG_LOOT_MASTER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A5*/ { "SMSG_SET_FORCED_REACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A6*/ { "SMSG_SPELL_FAILED_OTHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A7*/ { "SMSG_GAMEOBJECT_RESET_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A8*/ { "CMSG_REPAIR_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleRepairItemOpcode },
+ /*0x2A9*/ { "SMSG_CHAT_PLAYER_NOT_FOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2AA*/ { "MSG_TALENT_WIPE_CONFIRM", STATUS_LOGGEDIN, &WorldSession::HandleTalentWipeOpcode },
+ /*0x2AB*/ { "SMSG_SUMMON_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2AC*/ { "CMSG_SUMMON_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleSummonResponseOpcode },
+ /*0x2AD*/ { "MSG_MOVE_TOGGLE_GRAVITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2AE*/ { "SMSG_MONSTER_MOVE_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2AF*/ { "SMSG_PET_BROKEN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B0*/ { "MSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B1*/ { "MSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B2*/ { "CMSG_SERVER_BROADCAST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B3*/ { "CMSG_SELF_RES", STATUS_LOGGEDIN, &WorldSession::HandleSelfResOpcode },
+ /*0x2B4*/ { "SMSG_FEIGN_DEATH_RESISTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B5*/ { "CMSG_RUN_SCRIPT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B6*/ { "SMSG_SCRIPT_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B7*/ { "SMSG_DUEL_COUNTDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B8*/ { "SMSG_AREA_TRIGGER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B9*/ { "CMSG_SHOWING_HELM", STATUS_LOGGEDIN, &WorldSession::HandleToggleHelmOpcode },
+ /*0x2BA*/ { "CMSG_SHOWING_CLOAK", STATUS_LOGGEDIN, &WorldSession::HandleToggleCloakOpcode },
+ /*0x2BB*/ { "SMSG_MEETINGSTONE_JOINFAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2BC*/ { "SMSG_PLAYER_SKINNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2BD*/ { "SMSG_DURABILITY_DAMAGE_DEATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2BE*/ { "CMSG_SET_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2BF*/ { "CMSG_SET_ACTIONBAR_TOGGLES", STATUS_AUTHED, &WorldSession::HandleSetActionBar },
+ /*0x2C0*/ { "UMSG_DELETE_GUILD_CHARTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2C1*/ { "MSG_PETITION_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetitionRenameOpcode },
+ /*0x2C2*/ { "SMSG_INIT_WORLD_STATES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C3*/ { "SMSG_UPDATE_WORLD_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C4*/ { "CMSG_ITEM_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemNameQueryOpcode },
+ /*0x2C5*/ { "SMSG_ITEM_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C6*/ { "SMSG_PET_ACTION_FEEDBACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C7*/ { "CMSG_CHAR_RENAME", STATUS_AUTHED, &WorldSession::HandleChangePlayerNameOpcode },
+ /*0x2C8*/ { "SMSG_CHAR_RENAME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C9*/ { "CMSG_MOVE_SPLINE_DONE", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNextDestinationOpcode },
+ /*0x2CA*/ { "CMSG_MOVE_FALL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x2CB*/ { "SMSG_INSTANCE_SAVE_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2CC*/ { "SMSG_RAID_INSTANCE_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2CD*/ { "CMSG_REQUEST_RAID_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestRaidInfoOpcode },
+ /*0x2CE*/ { "CMSG_MOVE_TIME_SKIPPED", STATUS_LOGGEDIN, &WorldSession::HandleMoveTimeSkippedOpcode },
+ /*0x2CF*/ { "CMSG_MOVE_FEATHER_FALL_ACK", STATUS_LOGGEDIN, &WorldSession::HandleFeatherFallAck },
+ /*0x2D0*/ { "CMSG_MOVE_WATER_WALK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveWaterWalkAck },
+ /*0x2D1*/ { "CMSG_MOVE_NOT_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleMoveNotActiveMover },
+ /*0x2D2*/ { "SMSG_PLAY_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2D3*/ { "CMSG_BATTLEFIELD_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleBattlefieldStatusOpcode },
+ /*0x2D4*/ { "SMSG_BATTLEFIELD_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2D5*/ { "CMSG_BATTLEFIELD_PORT", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPortOpcode},
+ /*0x2D6*/ { "MSG_INSPECT_HONOR_STATS", STATUS_LOGGEDIN, &WorldSession::HandleInspectHonorStatsOpcode },
+ /*0x2D7*/ { "CMSG_BATTLEMASTER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundHelloOpcode },
+ /*0x2D8*/ { "CMSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2D9*/ { "CMSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2DA*/ { "SMSG_FORCE_WALK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2DB*/ { "CMSG_FORCE_WALK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x2DC*/ { "SMSG_FORCE_SWIM_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2DD*/ { "CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x2DE*/ { "SMSG_FORCE_TURN_RATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2DF*/ { "CMSG_FORCE_TURN_RATE_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x2E0*/ { "MSG_PVP_LOG_DATA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPVPlogdataOpcode},
+ /*0x2E1*/ { "CMSG_LEAVE_BATTLEFIELD", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundLeaveOpcode },
+ /*0x2E2*/ { "CMSG_AREA_SPIRIT_HEALER_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueryOpcode},
+ /*0x2E3*/ { "CMSG_AREA_SPIRIT_HEALER_QUEUE", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueueOpcode},
+ /*0x2E4*/ { "SMSG_AREA_SPIRIT_HEALER_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2E5*/ { "CMSG_GM_UNTEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2E6*/ { "SMSG_WARDEN_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2E7*/ { "CMSG_WARDEN_DATA", STATUS_LOGGEDIN, &WorldSession::HandleWardenDataOpcode },
+ /*0x2E8*/ { "SMSG_GROUP_JOINED_BATTLEGROUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2E9*/ { "MSG_BATTLEGROUND_PLAYER_POSITIONS", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPositionsOpcode},
+ /*0x2EA*/ { "CMSG_PET_STOP_ATTACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2EB*/ { "SMSG_BINDER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2EC*/ { "SMSG_BATTLEGROUND_PLAYER_JOINED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2ED*/ { "SMSG_BATTLEGROUND_PLAYER_LEFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2EE*/ { "CMSG_BATTLEMASTER_JOIN", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundJoinOpcode },
+ /*0x2EF*/ { "SMSG_ADDON_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F0*/ { "CMSG_PET_UNLEARN", STATUS_LOGGEDIN, &WorldSession::HandlePetUnlearnOpcode },
+ /*0x2F1*/ { "SMSG_PET_UNLEARN_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F2*/ { "SMSG_PARTY_MEMBER_STATS_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F3*/ { "CMSG_PET_SPELL_AUTOCAST", STATUS_LOGGEDIN, &WorldSession::HandlePetSpellAutocastOpcode },
+ /*0x2F4*/ { "SMSG_WEATHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F5*/ { "SMSG_PLAY_TIME_WARNING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F6*/ { "SMSG_MINIGAME_SETUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F7*/ { "SMSG_MINIGAME_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F8*/ { "CMSG_MINIGAME_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2F9*/ { "SMSG_MINIGAME_MOVE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FA*/ { "SMSG_RAID_INSTANCE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FB*/ { "SMSG_COMPRESSED_MOVES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FC*/ { "CMSG_GUILD_INFO_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildChangeInfoOpcode },
+ /*0x2FD*/ { "SMSG_CHAT_RESTRICTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FE*/ { "SMSG_SPLINE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FF*/ { "SMSG_SPLINE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x300*/ { "SMSG_SPLINE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x301*/ { "SMSG_SPLINE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x302*/ { "SMSG_SPLINE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x303*/ { "SMSG_SPLINE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x304*/ { "SMSG_SPLINE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x305*/ { "SMSG_SPLINE_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x306*/ { "SMSG_SPLINE_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x307*/ { "SMSG_SPLINE_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x308*/ { "SMSG_SPLINE_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x309*/ { "SMSG_SPLINE_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30A*/ { "SMSG_SPLINE_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30B*/ { "SMSG_SPLINE_MOVE_START_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30C*/ { "SMSG_SPLINE_MOVE_STOP_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30D*/ { "SMSG_SPLINE_MOVE_SET_RUN_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30E*/ { "SMSG_SPLINE_MOVE_SET_WALK_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30F*/ { "CMSG_GM_NUKE_ACCOUNT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x310*/ { "MSG_GM_DESTROY_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x311*/ { "CMSG_GM_DESTROY_ONLINE_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x312*/ { "CMSG_ACTIVATETAXIEXPRESS", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiFarOpcode },
+ /*0x313*/ { "SMSG_SET_FACTION_ATWAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x314*/ { "SMSG_GAMETIMEBIAS_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x315*/ { "CMSG_DEBUG_ACTIONS_START", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x316*/ { "CMSG_DEBUG_ACTIONS_STOP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x317*/ { "CMSG_SET_FACTION_INACTIVE", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionInactiveOpcode},
+ /*0x318*/ { "CMSG_SET_WATCHED_FACTION", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionIndexOpcode},
+ /*0x319*/ { "MSG_MOVE_TIME_SKIPPED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x31A*/ { "SMSG_SPLINE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x31B*/ { "CMSG_SET_EXPLORATION_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x31C*/ { "SMSG_INVALIDATE_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x31D*/ { "CMSG_RESET_INSTANCES", STATUS_LOGGEDIN, &WorldSession::HandleResetInstancesOpcode },
+ /*0x31E*/ { "SMSG_INSTANCE_RESET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x31F*/ { "SMSG_INSTANCE_RESET_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x320*/ { "SMSG_UPDATE_LAST_INSTANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x321*/ { "MSG_RAID_TARGET_UPDATE", STATUS_LOGGEDIN, &WorldSession::HandleRaidIconTargetOpcode },
+ /*0x322*/ { "MSG_RAID_READY_CHECK", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckOpcode },
+ /*0x323*/ { "CMSG_LUA_USAGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x324*/ { "SMSG_PET_ACTION_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x325*/ { "SMSG_PET_DISMISS_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x326*/ { "SMSG_GHOSTEE_GONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x327*/ { "CMSG_GM_UPDATE_TICKET_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x328*/ { "SMSG_GM_TICKET_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x329*/ { "MSG_SET_DUNGEON_DIFFICULTY", STATUS_LOGGEDIN, &WorldSession::HandleDungeonDifficultyOpcode },
+ /*0x32A*/ { "CMSG_GMSURVEY_SUBMIT", STATUS_NEVER, &WorldSession::Handle_NULL },//LOGGEDIN, &WorldSession::HandleGMSurveySubmit },
+ /*0x32B*/ { "SMSG_UPDATE_INSTANCE_OWNERSHIP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x32C*/ { "CMSG_IGNORE_KNOCKBACK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x32D*/ { "SMSG_CHAT_PLAYER_AMBIGUOUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x32E*/ { "MSG_DELAY_GHOST_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x32F*/ { "SMSG_SPELLINSTAKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x330*/ { "SMSG_SPELL_UPDATE_CHAIN_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x331*/ { "CMSG_CHAT_FILTERED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x332*/ { "SMSG_EXPECTED_SPAM_RECORDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x333*/ { "SMSG_SPELLSTEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x334*/ { "CMSG_LOTTERY_QUERY_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x335*/ { "SMSG_LOTTERY_QUERY_RESULT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x336*/ { "CMSG_BUY_LOTTERY_TICKET_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x337*/ { "SMSG_LOTTERY_RESULT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x338*/ { "SMSG_CHARACTER_PROFILE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x339*/ { "SMSG_CHARACTER_PROFILE_REALM_CONNECTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33A*/ { "SMSG_DEFENSE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33B*/ { "SMSG_INSTANCE_DIFFICULTY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33C*/ { "MSG_GM_RESETINSTANCELIMIT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x33D*/ { "SMSG_MOTD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33E*/ { "SMSG_MOVE_SET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33F*/ { "SMSG_MOVE_UNSET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x340*/ { "CMSG_MOVE_FLIGHT_ACK_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x341*/ { "MSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x342*/ { "MSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x343*/ { "SMSG_MOVE_SET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x344*/ { "SMSG_MOVE_UNSET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x345*/ { "CMSG_MOVE_SET_CAN_FLY_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveFlyModeChangeAckOpcode},
+ /*0x346*/ { "CMSG_MOVE_SET_FLY", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x347*/ { "CMSG_SOCKET_GEMS", STATUS_LOGGEDIN, &WorldSession::HandleSocketOpcode },
+ /*0x348*/ { "CMSG_ARENA_TEAM_CREATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x349*/ { "SMSG_ARENA_TEAM_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x34A*/ { "UMSG_UPDATE_ARENA_TEAM_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x34B*/ { "CMSG_ARENA_TEAM_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamQueryOpcode },
+ /*0x34C*/ { "SMSG_ARENA_TEAM_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x34D*/ { "CMSG_ARENA_TEAM_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRosterOpcode },
+ /*0x34E*/ { "SMSG_ARENA_TEAM_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x34F*/ { "CMSG_ARENA_TEAM_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamAddMemberOpcode },
+ /*0x350*/ { "SMSG_ARENA_TEAM_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x351*/ { "CMSG_ARENA_TEAM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteAcceptOpcode},
+ /*0x352*/ { "CMSG_ARENA_TEAM_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteDeclineOpcode},
+ /*0x353*/ { "CMSG_ARENA_TEAM_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamLeaveOpcode },
+ /*0x354*/ { "CMSG_ARENA_TEAM_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRemoveFromTeamOpcode},
+ /*0x355*/ { "CMSG_ARENA_TEAM_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamDisbandOpcode },
+ /*0x356*/ { "CMSG_ARENA_TEAM_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamPromoteToCaptainOpcode},
+ /*0x357*/ { "SMSG_ARENA_TEAM_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x358*/ { "CMSG_BATTLEMASTER_JOIN_ARENA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundArenaJoin },
+ /*0x359*/ { "MSG_MOVE_START_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x35A*/ { "MSG_MOVE_STOP_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x35B*/ { "SMSG_ARENA_TEAM_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x35C*/ { "CMSG_LFG_SET_AUTOJOIN", STATUS_AUTHED, &WorldSession::HandleLfgAutoJoinOpcode },
+ /*0x35D*/ { "CMSG_LFG_CLEAR_AUTOJOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfgCancelAutoJoinOpcode },
+ /*0x35E*/ { "CMSG_LFM_SET_AUTOFILL", STATUS_AUTHED, &WorldSession::HandleLfmAutoAddMembersOpcode },
+ /*0x35F*/ { "CMSG_LFM_CLEAR_AUTOFILL", STATUS_LOGGEDIN, &WorldSession::HandleLfmCancelAutoAddmembersOpcode},
+ /*0x360*/ { "CMSG_ACCEPT_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x361*/ { "CMSG_DECLINE_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x362*/ { "CMSG_CANCEL_PENDING_LFG", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x363*/ { "CMSG_CLEAR_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearOpcode },
+ /*0x364*/ { "CMSG_CLEAR_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetNoneOpcode },
+ /*0x365*/ { "CMSG_SET_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetOpcode },
+ /*0x366*/ { "CMSG_SET_LFG_COMMENT", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetCommentOpcode },
+ /*0x367*/ { "SMSG_LFG_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x368*/ { "SMSG_LFG_OTHER_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x369*/ { "SMSG_LFG_AUTOJOIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36A*/ { "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36B*/ { "SMSG_LFG_LEADER_IS_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36C*/ { "SMSG_LFG_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36D*/ { "SMSG_LFG_UPDATE_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36E*/ { "SMSG_LFG_UPDATE_LFG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36F*/ { "SMSG_LFG_UPDATE_QUEUED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x370*/ { "SMSG_LFG_PENDING_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x371*/ { "SMSG_LFG_PENDING_MATCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x372*/ { "SMSG_LFG_PENDING_MATCH_DONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x373*/ { "SMSG_TITLE_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x374*/ { "CMSG_SET_TITLE", STATUS_LOGGEDIN, &WorldSession::HandleChooseTitleOpcode },
+ /*0x375*/ { "CMSG_CANCEL_MOUNT_AURA", STATUS_LOGGEDIN, &WorldSession::HandleDismountOpcode },
+ /*0x376*/ { "SMSG_ARENA_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x377*/ { "MSG_INSPECT_ARENA_TEAMS", STATUS_LOGGEDIN, &WorldSession::HandleInspectArenaStatsOpcode },
+ /*0x378*/ { "SMSG_DEATH_RELEASE_LOC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x379*/ { "CMSG_CANCEL_TEMP_ENCHANTMENT", STATUS_LOGGEDIN, &WorldSession::HandleCancelTempItemEnchantmentOpcode},
+ /*0x37A*/ { "SMSG_FORCED_DEATH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x37B*/ { "CMSG_CHEAT_SET_HONOR_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37C*/ { "CMSG_CHEAT_SET_ARENA_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37D*/ { "MSG_MOVE_SET_FLIGHT_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37E*/ { "MSG_MOVE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37F*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x380*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x381*/ { "SMSG_FORCE_FLIGHT_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x382*/ { "CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x383*/ { "SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x384*/ { "CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x385*/ { "SMSG_SPLINE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x386*/ { "SMSG_SPLINE_SET_FLIGHT_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x387*/ { "CMSG_MAELSTROM_INVALIDATE_CACHE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x388*/ { "SMSG_FLIGHT_SPLINE_SYNC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x389*/ { "CMSG_SET_TAXI_BENCHMARK_MODE", STATUS_AUTHED, &WorldSession::HandleSetTaxiBenchmarkOpcode },
+ /*0x38A*/ { "SMSG_JOINED_BATTLEGROUND_QUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x38B*/ { "SMSG_REALM_SPLIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x38C*/ { "CMSG_REALM_SPLIT", STATUS_AUTHED, &WorldSession::HandleRealmStateRequestOpcode },
+ /*0x38D*/ { "CMSG_MOVE_CHNG_TRANSPORT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x38E*/ { "MSG_PARTY_ASSIGNMENT", STATUS_LOGGEDIN, &WorldSession::HandleGroupPromoteOpcode },
+ /*0x38F*/ { "SMSG_OFFER_PETITION_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x390*/ { "SMSG_TIME_SYNC_REQ", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x391*/ { "CMSG_TIME_SYNC_RESP", STATUS_LOGGEDIN, &WorldSession::HandleTimeSyncResp },
+ /*0x392*/ { "CMSG_SEND_LOCAL_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x393*/ { "CMSG_SEND_GENERAL_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x394*/ { "CMSG_SEND_COMBAT_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x395*/ { "CMSG_MAELSTROM_GM_SENT_MAIL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x396*/ { "SMSG_RESET_FAILED_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x397*/ { "SMSG_REAL_GROUP_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x398*/ { "SMSG_LFG_DISABLED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x399*/ { "CMSG_ACTIVE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x39A*/ { "CMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x39B*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x39C*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE_WRITE_FILE",STATUS_NEVER,&WorldSession::Handle_ServerSide },
+ /*0x39D*/ { "SMSG_UPDATE_COMBO_POINTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x39E*/ { "SMSG_VOICE_SESSION_ROSTER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x39F*/ { "SMSG_VOICE_SESSION_LEAVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A0*/ { "SMSG_VOICE_SESSION_ADJUST_PRIORITY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A1*/ { "CMSG_VOICE_SET_TALKER_MUTED_REQUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3A2*/ { "SMSG_VOICE_SET_TALKER_MUTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A3*/ { "SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A4*/ { "SMSG_SET_EXTRA_AURA_INFO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A5*/ { "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A6*/ { "SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A7*/ { "MSG_MOVE_START_DESCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x3A8*/ { "CMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3A9*/ { "SMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3AA*/ { "SMSG_SPELL_CHANCE_PROC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3AB*/ { "CMSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3AC*/ { "SMSG_DISMOUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3AD*/ { "MSG_MOVE_UPDATE_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3AE*/ { "MSG_RAID_READY_CHECK_CONFIRM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3AF*/ { "CMSG_VOICE_SESSION_ENABLE", STATUS_AUTHED, &WorldSession::HandleVoiceSettingsOpcode },
+ /*0x3B0*/ { "SMSG_VOICE_SESSION_ENABLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B1*/ { "SMSG_VOICE_PARENTAL_CONTROLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B2*/ { "CMSG_GM_WHISPER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B3*/ { "SMSG_GM_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B4*/ { "MSG_GM_GEARRATING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B5*/ { "CMSG_COMMENTATOR_ENABLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B6*/ { "SMSG_COMMENTATOR_STATE_CHANGED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B7*/ { "CMSG_COMMENTATOR_GET_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B8*/ { "SMSG_COMMENTATOR_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B9*/ { "CMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BA*/ { "SMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3BB*/ { "SMSG_COMMENTATOR_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3BC*/ { "CMSG_COMMENTATOR_ENTER_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BD*/ { "CMSG_COMMENTATOR_EXIT_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BE*/ { "CMSG_COMMENTATOR_INSTANCE_COMMAND", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BF*/ { "SMSG_CLEAR_TARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C0*/ { "CMSG_BOT_DETECTED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3C1*/ { "SMSG_CROSSED_INEBRIATION_THRESHOLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C2*/ { "CMSG_CHEAT_PLAYER_LOGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3C3*/ { "CMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3C4*/ { "SMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C5*/ { "SMSG_KICK_REASON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C6*/ { "MSG_RAID_READY_CHECK_FINISHED", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckFinishOpcode},
+ /*0x3C7*/ { "CMSG_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleReportSpamOpcode },
+ /*0x3C8*/ { "SMSG_COMPLAIN_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C9*/ { "SMSG_FEATURE_SYSTEM_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3CA*/ { "CMSG_GM_SHOW_COMPLAINTS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CB*/ { "CMSG_GM_UNSQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CC*/ { "CMSG_CHANNEL_SILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CD*/ { "CMSG_CHANNEL_SILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CE*/ { "CMSG_CHANNEL_UNSILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CF*/ { "CMSG_CHANNEL_UNSILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D0*/ { "CMSG_TARGET_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D1*/ { "CMSG_TARGET_SCRIPT_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D2*/ { "CMSG_CHANNEL_DISPLAY_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelRosterQuery },
+ /*0x3D3*/ { "CMSG_SET_ACTIVE_VOICE_CHANNEL", STATUS_AUTHED, &WorldSession::HandleChannelVoiceChatQuery },
+ /*0x3D4*/ { "CMSG_GET_CHANNEL_MEMBER_COUNT", STATUS_LOGGEDIN, &WorldSession::HandleChannelInfoQuery },
+ /*0x3D5*/ { "SMSG_CHANNEL_MEMBER_COUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3D6*/ { "CMSG_CHANNEL_VOICE_ON", STATUS_LOGGEDIN, &WorldSession::HandleChannelEnableVoiceOpcode },
+ /*0x3D7*/ { "CMSG_CHANNEL_VOICE_OFF", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D8*/ { "CMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D9*/ { "SMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3DA*/ { "SMSG_AVAILABLE_VOICE_CHANNEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3DB*/ { "CMSG_ADD_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DC*/ { "CMSG_DEL_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DD*/ { "CMSG_PARTY_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DE*/ { "CMSG_PARTY_UNSILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DF*/ { "MSG_NOTIFY_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3E0*/ { "SMSG_COMSAT_RECONNECT_TRY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E1*/ { "SMSG_COMSAT_DISCONNECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E2*/ { "SMSG_COMSAT_CONNECT_FAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E3*/ { "SMSG_VOICE_CHAT_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E4*/ { "CMSG_REPORT_PVP_AFK", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundReportAFK },
+ /*0x3E5*/ { "CMSG_REPORT_PVP_AFK_RESULT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3E6*/ { "CMSG_GUILD_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankQuery },
+ /*0x3E7*/ { "CMSG_GUILD_BANK_QUERY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabColon },
+ /*0x3E8*/ { "SMSG_GUILD_BANK_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E9*/ { "CMSG_GUILD_BANK_SWAP_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDepositItem },
+ /*0x3EA*/ { "CMSG_GUILD_BANK_BUY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankBuyTab },
+ /*0x3EB*/ { "CMSG_GUILD_BANK_UPDATE_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankModifyTab },
+ /*0x3EC*/ { "CMSG_GUILD_BANK_DEPOSIT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDeposit },
+ /*0x3ED*/ { "CMSG_GUILD_BANK_WITHDRAW_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankWithdraw },
+ /*0x3EE*/ { "MSG_GUILD_BANK_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankLog },
+ /*0x3EF*/ { "CMSG_SET_CHANNEL_WATCH", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoinNotify },
+ /*0x3F0*/ { "SMSG_USERLIST_ADD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F1*/ { "SMSG_USERLIST_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F2*/ { "SMSG_USERLIST_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F3*/ { "CMSG_CLEAR_CHANNEL_WATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3F4*/ { "SMSG_INSPECT_TALENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F5*/ { "SMSG_GOGOGO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F6*/ { "SMSG_ECHO_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F7*/ { "CMSG_SET_TITLE_SUFFIX", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3F8*/ { "CMSG_SPELLCLICK", STATUS_LOGGEDIN, &WorldSession::HandleSpellClick },
+ /*0x3F9*/ { "SMSG_LOOT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3FA*/ { "CMSG_GM_CHARACTER_RESTORE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3FB*/ { "CMSG_GM_CHARACTER_SAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3FC*/ { "SMSG_VOICESESSION_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3FD*/ { "MSG_GUILD_PERMISSIONS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetRights },
+ /*0x3FE*/ { "MSG_GUILD_BANK_MONEY_WITHDRAWN", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetMoneyAmount },
+ /*0x3FF*/ { "MSG_GUILD_EVENT_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildEventLogOpcode },
+ /*0x400*/ { "CMSG_MAELSTROM_RENAME_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x401*/ { "CMSG_GET_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x402*/ { "SMSG_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x403*/ { "SMSG_FORCE_DISPLAY_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x404*/ { "SMSG_SPELL_CHANCE_RESIST_PUSHBACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x405*/ { "CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x406*/ { "SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x407*/ { "CMSG_KEEP_ALIVE", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
+ /*0x408*/ { "SMSG_RAID_READY_CHECK_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x409*/ { "CMSG_OPT_OUT_OF_LOOT", STATUS_AUTHED, &WorldSession::HandleGroupPassOnLootOpcode },
+ /*0x40A*/ { "MSG_QUERY_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabText },
+ /*0x40B*/ { "CMSG_SET_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankSetTabText },
+ /*0x40C*/ { "CMSG_SET_GRANTABLE_LEVELS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x40D*/ { "CMSG_GRANT_LEVEL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x40E*/ { "CMSG_REFER_A_FRIEND", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x40F*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelDeclineInvite },
- /*0x410*/ { "CMSG_GROUPACTION_THROTTLED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x411*/ { "SMSG_OVERRIDE_LIGHT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x412*/ { "SMSG_TOTEM_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x413*/ { "CMSG_TOTEM_DESTROYED", STATUS_LOGGEDIN, &WorldSession::HandleTotemDestroy },
- /*0x414*/ { "CMSG_EXPIRE_RAID_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x415*/ { "CMSG_NO_SPELL_VARIANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x416*/ { "CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY",STATUS_LOGGEDIN,&WorldSession::HandleQuestgiverStatusQueryMultipleOpcode},
- /*0x417*/ { "SMSG_QUESTGIVER_STATUS_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x418*/ { "CMSG_SET_PLAYER_DECLINED_NAMES", STATUS_AUTHED, &WorldSession::HandleDeclinedPlayerNameOpcode },
- /*0x419*/ { "SMSG_SET_PLAYER_DECLINED_NAMES_RESULT",STATUS_NEVER,&WorldSession::Handle_ServerSide },
- /*0x41A*/ { "CMSG_QUERY_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x41B*/ { "CMSG_CLEAR_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x41C*/ { "SMSG_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x41D*/ { "SMSG_SEND_UNLEARN_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x41E*/ { "SMSG_PROPOSE_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x41F*/ { "CMSG_ACCEPT_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x420*/ { "SMSG_REFER_A_FRIEND_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x421*/ { "SMSG_SPLINE_MOVE_SET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x422*/ { "SMSG_SPLINE_MOVE_UNSET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x423*/ { "SMSG_SUMMON_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x410*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x411*/ { "CMSG_GROUPACTION_THROTTLED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x412*/ { "SMSG_OVERRIDE_LIGHT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x413*/ { "SMSG_TOTEM_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x414*/ { "CMSG_TOTEM_DESTROYED", STATUS_LOGGEDIN, &WorldSession::HandleTotemDestroy },
+ /*0x415*/ { "CMSG_EXPIRE_RAID_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x416*/ { "CMSG_NO_SPELL_VARIANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x417*/ { "CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryMultipleOpcode},
+ /*0x418*/ { "SMSG_QUESTGIVER_STATUS_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x419*/ { "CMSG_SET_PLAYER_DECLINED_NAMES", STATUS_AUTHED, &WorldSession::HandleDeclinedPlayerNameOpcode },
+ /*0x41A*/ { "SMSG_SET_PLAYER_DECLINED_NAMES_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x41B*/ { "CMSG_QUERY_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x41C*/ { "CMSG_CLEAR_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x41D*/ { "SMSG_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x41E*/ { "SMSG_SEND_UNLEARN_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x41F*/ { "SMSG_PROPOSE_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x420*/ { "CMSG_ACCEPT_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x421*/ { "SMSG_REFER_A_FRIEND_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x422*/ { "SMSG_SPLINE_MOVE_SET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x423*/ { "SMSG_SPLINE_MOVE_UNSET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x424*/ { "SMSG_SUMMON_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x425*/ { "CMSG_CHANGE_PERSONAL_ARENA_RATING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x426*/ { "CMSG_ALTER_APPEARANCE", STATUS_LOGGEDIN, &WorldSession::HandleAlterAppearance },
+ /*0x427*/ { "SMSG_ENABLE_BARBER_SHOP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x428*/ { "SMSG_BARBER_SHOP_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x429*/ { "CMSG_CALENDAR_GET_CALENDAR", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGetCalendar },
+ /*0x42A*/ { "CMSG_CALENDAR_GET_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGetEvent },
+ /*0x42B*/ { "CMSG_CALENDAR_GUILD_FILTER", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGuildFilter },
+ /*0x42C*/ { "CMSG_CALENDAR_ARENA_TEAM", STATUS_LOGGEDIN, &WorldSession::HandleCalendarArenaTeam },
+ /*0x42D*/ { "CMSG_CALENDAR_ADD_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarAddEvent },
+ /*0x42E*/ { "CMSG_CALENDAR_UPDATE_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarUpdateEvent },
+ /*0x42F*/ { "CMSG_CALENDAR_REMOVE_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarRemoveEvent },
+ /*0x430*/ { "CMSG_CALENDAR_COPY_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarCopyEvent },
+ /*0x431*/ { "CMSG_CALENDAR_EVENT_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventInvite },
+ /*0x432*/ { "CMSG_CALENDAR_EVENT_RSVP", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventRsvp },
+ /*0x433*/ { "CMSG_CALENDAR_EVENT_REMOVE_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventRemoveInvite },
+ /*0x434*/ { "CMSG_CALENDAR_EVENT_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventStatus },
+ /*0x435*/ { "CMSG_CALENDAR_EVENT_MODERATOR_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventModeratorStatus},
+ /*0x436*/ { "SMSG_CALENDAR_SEND_CALENDAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x437*/ { "SMSG_CALENDAR_SEND_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x438*/ { "SMSG_CALENDAR_FILTER_GUILD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x439*/ { "SMSG_CALENDAR_ARENA_TEAM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x43A*/ { "SMSG_CALENDAR_EVENT_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x43B*/ { "SMSG_CALENDAR_EVENT_INVITE_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x43C*/ { "SMSG_CALENDAR_EVENT_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x43D*/ { "SMSG_CALENDAR_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x43E*/ { "SMSG_CALENDAR_RAID_LOCKOUT_ADDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x43F*/ { "SMSG_CALENDAR_RAID_LOCKOUT_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x440*/ { "SMSG_CALENDAR_EVENT_INVITE_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x441*/ { "SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x442*/ { "SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x443*/ { "SMSG_CALENDAR_EVENT_REMOVED_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x444*/ { "SMSG_CALENDAR_EVENT_UPDATED_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x445*/ { "SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x446*/ { "CMSG_CALENDAR_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleCalendarComplain },
+ /*0x447*/ { "CMSG_CALENDAR_GET_NUM_PENDING", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGetNumPending },
+ /*0x448*/ { "SMSG_CALENDAR_SEND_NUM_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x449*/ { "CMSG_SAVE_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x44A*/ { "SMSG_NOTIFY_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x44B*/ { "CMSG_PLAY_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x44C*/ { "SMSG_PLAY_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x44D*/ { "CMSG_LOAD_DANCES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x44E*/ { "CMSG_STOP_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x44F*/ { "SMSG_STOP_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x450*/ { "CMSG_SYNC_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x451*/ { "CMSG_DANCE_QUERY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x452*/ { "SMSG_DANCE_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x453*/ { "SMSG_INVALIDATE_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x454*/ { "CMSG_DELETE_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x455*/ { "SMSG_LEARNED_DANCE_MOVES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x456*/ { "CMSG_LEARN_DANCE_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x457*/ { "CMSG_UNLEARN_DANCE_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x458*/ { "CMSG_SET_RUNE_COUNT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x459*/ { "CMSG_SET_RUNE_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x45A*/ { "MSG_MOVE_SET_PITCH_RATE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x45B*/ { "MSG_MOVE_SET_PITCH_RATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x45C*/ { "SMSG_FORCE_PITCH_RATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x45D*/ { "CMSG_FORCE_PITCH_RATE_CHANGE_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x45E*/ { "SMSG_SPLINE_SET_PITCH_RATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x45F*/ { "SMSG_MOVE_ABANDON_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x460*/ { "MSG_MOVE_ABANDON_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x461*/ { "CMSG_MOVE_ABANDON_TRANSPORT_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x462*/ { "CMSG_UPDATE_MISSILE_TRAJECTORY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x463*/ { "SMSG_UPDATE_ACCOUNT_DATA_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x464*/ { "SMSG_TRIGGER_MOVIE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x465*/ { "CMSG_COMPLETE_MOVIE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x466*/ { "CMSG_SET_GLYPH_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x467*/ { "CMSG_SET_GLYPH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x468*/ { "SMSG_ACHIEVEMENT_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x469*/ { "SMSG_DYNAMIC_DROP_ROLL_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x46A*/ { "SMSG_CRITERIA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x46B*/ { "CMSG_QUERY_INSPECT_ACHIEVEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleInspectAchievements },
+ /*0x46C*/ { "SMSG_RESPOND_INSPECT_ACHIEVEMENTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x46D*/ { "CMSG_DISMISS_CONTROLLED_VEHICLE", STATUS_LOGGEDIN, &WorldSession::HandleDismissControlledVehicle },
+ /*0x46E*/ { "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x46F*/ { "SMSG_QUESTUPDATE_ADD_PVP_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x470*/ { "CMSG_SET_CRITERIA_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x471*/ { "SMSG_GROUP_SWAP_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x472*/ { "CMSG_UNITANIMTIER_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x473*/ { "CMSG_CHAR_CUSTOMIZE", STATUS_AUTHED, &WorldSession::HandleCharCustomize },
+ /*0x474*/ { "SMSG_CHAR_CUSTOMIZE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x475*/ { "SMSG_PET_RENAMEABLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x476*/ { "CMSG_REQUEST_VEHICLE_EXIT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x477*/ { "CMSG_REQUEST_VEHICLE_PREV_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x47A*/ { "CMSG_PET_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandlePetLearnTalent },
+ /*0x47B*/ { "CMSG_PET_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x47C*/ { "SMSG_SET_PHASE_SHIFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x47D*/ { "SMSG_ALL_ACHIEVEMENT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x47E*/ { "CMSG_FORCE_SAY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x47F*/ { "SMSG_HEALTH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x480*/ { "SMSG_POWER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x481*/ { "CMSG_GAMEOBJ_REPORT_USE", STATUS_LOGGEDIN, &WorldSession::HandleGameobjectReportUse },
+ /*0x482*/ { "SMSG_HIGHEST_THREAT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x483*/ { "SMSG_THREAT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x484*/ { "SMSG_THREAT_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x485*/ { "SMSG_THREAT_CLEAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x486*/ { "SMSG_CONVERT_RUNE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x487*/ { "SMSG_RESYNC_RUNES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x488*/ { "SMSG_ADD_RUNE_POWER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x489*/ { "CMSG_START_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x48A*/ { "CMSG_REMOVE_GLYPH", STATUS_LOGGEDIN, &WorldSession::HandleRemoveGlyph },
+ /*0x48B*/ { "CMSG_DUMP_OBJECTS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x48C*/ { "SMSG_DUMP_OBJECTS_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x48D*/ { "CMSG_DISMISS_CRITTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x48E*/ { "SMSG_NOTIFY_DEST_LOC_SPELL_CAST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x48F*/ { "CMSG_AUCTION_LIST_PENDING_SALES", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListPendingSales },
+ /*0x490*/ { "SMSG_AUCTION_LIST_PENDING_SALES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x491*/ { "SMSG_MODIFY_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x492*/ { "SMSG_PET_UPDATE_COMBO_POINTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x493*/ { "CMSG_ENABLETAXI", STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAvailableNodes },
+ /*0x494*/ { "SMSG_PRE_RESURRECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x495*/ { "SMSG_AURA_UPDATE_ALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x496*/ { "SMSG_AURA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x497*/ { "CMSG_FLOOD_GRACE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x498*/ { "SMSG_SERVER_FIRST_ACHIEVEMENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x499*/ { "SMSG_PET_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x49A*/ { "SMSG_PET_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x49B*/ { "CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x49C*/ { "CMSG_HEARTH_AND_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x49D*/ { "SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x49E*/ { "SMSG_CRITERIA_DELETED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x49F*/ { "SMSG_ACHIEVEMENT_DELETED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A0*/ { "CMSG_SERVER_INFO_QUERY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A1*/ { "SMSG_SERVER_INFO_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A5*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A6*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x4A7*/ { "UMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A8*/ { "UMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4A9*/ { "UMSG_UNKNOWN_1193", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4AA*/ { "UMSG_UNKNOWN_1194", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4AB*/ { "UMSG_UNKNOWN_1195", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x4AC*/ { "UMSG_UNKNOWN_1196", STATUS_NEVER, &WorldSession::Handle_NULL },
};
diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h
index 12f9c9459fa..d57cfd62852 100644
--- a/src/game/Opcodes.h
+++ b/src/game/Opcodes.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -49,8 +49,8 @@ enum Opcodes
CMSG_ZONE_MAP = 0x00A,
SMSG_ZONE_MAP = 0x00B,
CMSG_DEBUG_CHANGECELLZONE = 0x00C,
- CMSG_EMBLAZON_TABARD_OBSOLETE = 0x00D,
- CMSG_UNEMBLAZON_TABARD_OBSOLETE = 0x00E,
+ CMSG_MOVE_CHARACTER_CHEAT = 0x00D,
+ SMSG_MOVE_CHARACTER_CHEAT = 0x00E,
CMSG_RECHARGE = 0x00F,
CMSG_LEARN_SPELL = 0x010,
CMSG_CREATEMONSTER = 0x011,
@@ -66,7 +66,7 @@ enum Opcodes
SMSG_FORCEACTIONSHOW = 0x01B,
CMSG_PETGODMODE = 0x01C,
SMSG_PETGODMODE = 0x01D,
- SMSG_DEBUGINFOSPELLMISS_OBSOLETE = 0x01E,
+ SMSG_REFER_A_FRIEND_EXPIRED = 0x01E,
CMSG_WEATHER_SPEED_CHEAT = 0x01F,
CMSG_UNDRESSPLAYER = 0x020,
CMSG_BEASTMASTER = 0x021,
@@ -86,7 +86,7 @@ enum Opcodes
SMSG_DEBUG_AISTATE = 0x02F,
CMSG_DISABLE_PVP_CHEAT = 0x030,
CMSG_ADVANCE_SPAWN_TIME = 0x031,
- CMSG_PVP_PORT_OBSOLETE = 0x032,
+ SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x032,
CMSG_AUTH_SRP6_BEGIN = 0x033,
CMSG_AUTH_SRP6_PROOF = 0x034,
CMSG_AUTH_SRP6_RECODE = 0x035,
@@ -214,7 +214,7 @@ enum Opcodes
SMSG_READ_ITEM_FAILED = 0x0AF,
SMSG_ITEM_COOLDOWN = 0x0B0,
CMSG_GAMEOBJ_USE = 0x0B1,
- CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE = 0x0B2,
+ CMSG_DESTROY_ITEMS = 0x0B2,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x0B3,
CMSG_AREATRIGGER = 0x0B4,
MSG_MOVE_START_FORWARD = 0x0B5,
@@ -347,7 +347,7 @@ enum Opcodes
SMSG_SPELL_COOLDOWN = 0x134,
SMSG_COOLDOWN_EVENT = 0x135,
CMSG_CANCEL_AURA = 0x136,
- SMSG_UPDATE_AURA_DURATION = 0x137,
+ SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137,
SMSG_PET_CAST_FAILED = 0x138,
MSG_CHANNEL_START = 0x139,
MSG_CHANNEL_UPDATE = 0x13A,
@@ -371,10 +371,10 @@ enum Opcodes
SMSG_DAMAGE_DONE_OBSOLETE = 0x14C,
SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D,
SMSG_CANCEL_COMBAT = 0x14E,
- SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE = 0x14F,
+ SMSG_SPELLBREAKLOG = 0x14F,
SMSG_SPELLHEALLOG = 0x150,
SMSG_SPELLENERGIZELOG = 0x151,
- CMSG_SHEATHE_OBSOLETE = 0x152,
+ SMSG_BREAK_TARGET = 0x152,
CMSG_SAVE_PLAYER = 0x153,
CMSG_SETDEATHBINDPOINT = 0x154,
SMSG_BINDPOINTUPDATE = 0x155,
@@ -578,7 +578,7 @@ enum Opcodes
SMSG_GMTICKET_SYSTEMSTATUS = 0x21B,
CMSG_SPIRIT_HEALER_ACTIVATE = 0x21C,
CMSG_SET_STAT_CHEAT = 0x21D,
- SMSG_SET_REST_START = 0x21E,
+ SMSG_SET_REST_START_OBSOLETE = 0x21E,
CMSG_SKILL_BUY_STEP = 0x21F,
CMSG_SKILL_BUY_RANK = 0x220,
CMSG_XP_CHEAT = 0x221,
@@ -733,8 +733,8 @@ enum Opcodes
SMSG_SCRIPT_MESSAGE = 0x2B6,
SMSG_DUEL_COUNTDOWN = 0x2B7,
SMSG_AREA_TRIGGER_MESSAGE = 0x2B8,
- CMSG_TOGGLE_HELM = 0x2B9,
- CMSG_TOGGLE_CLOAK = 0x2BA,
+ CMSG_SHOWING_HELM = 0x2B9,
+ CMSG_SHOWING_CLOAK = 0x2BA,
SMSG_MEETINGSTONE_JOINFAILED = 0x2BB,
SMSG_PLAYER_SKINNED = 0x2BC,
SMSG_DURABILITY_DAMAGE_DEATH = 0x2BD,
@@ -967,10 +967,10 @@ enum Opcodes
SMSG_VOICE_SESSION_ADJUST_PRIORITY = 0x3A0,
CMSG_VOICE_SET_TALKER_MUTED_REQUEST = 0x3A1,
SMSG_VOICE_SET_TALKER_MUTED = 0x3A2,
- SMSG_INIT_EXTRA_AURA_INFO = 0x3A3,
- SMSG_SET_EXTRA_AURA_INFO = 0x3A4,
- SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE = 0x3A5,
- SMSG_CLEAR_EXTRA_AURA_INFO = 0x3A6,
+ SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE = 0x3A3,
+ SMSG_SET_EXTRA_AURA_INFO_OBSOLETE = 0x3A4,
+ SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE = 0x3A5,
+ SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE = 0x3A6,
MSG_MOVE_START_DESCEND = 0x3A7,
CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A8,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A9,
@@ -980,127 +980,262 @@ enum Opcodes
MSG_MOVE_UPDATE_CAN_FLY = 0x3AD,
MSG_RAID_READY_CHECK_CONFIRM = 0x3AE,
CMSG_VOICE_SESSION_ENABLE = 0x3AF,
- SMSG_VOICE_PARENTAL_CONTROLS = 0x3B0,
- CMSG_GM_WHISPER = 0x3B1,
- SMSG_GM_MESSAGECHAT = 0x3B2,
- MSG_GM_GEARRATING = 0x3B3,
- CMSG_COMMENTATOR_ENABLE = 0x3B4,
- SMSG_COMMENTATOR_STATE_CHANGED = 0x3B5,
- CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B6,
- SMSG_COMMENTATOR_MAP_INFO = 0x3B7,
- CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B8,
- SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
- SMSG_COMMENTATOR_PLAYER_INFO = 0x3BA,
- CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BB,
- CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BC,
- CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BD,
- SMSG_CLEAR_TARGET = 0x3BE,
- CMSG_BOT_DETECTED = 0x3BF,
- SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C0,
- CMSG_CHEAT_PLAYER_LOGIN = 0x3C1,
- CMSG_CHEAT_PLAYER_LOOKUP = 0x3C2,
- SMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
- SMSG_KICK_REASON = 0x3C4,
- MSG_RAID_READY_CHECK_FINISHED = 0x3C5,
- CMSG_COMPLAIN = 0x3C6,
- SMSG_COMPLAIN_RESULT = 0x3C7,
- SMSG_FEATURE_SYSTEM_STATUS = 0x3C8,
- CMSG_GM_SHOW_COMPLAINTS = 0x3C9,
- CMSG_GM_UNSQUELCH = 0x3CA,
- CMSG_CHANNEL_SILENCE_VOICE = 0x3CB,
- CMSG_CHANNEL_SILENCE_ALL = 0x3CC,
- CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CD,
- CMSG_CHANNEL_UNSILENCE_ALL = 0x3CE,
- CMSG_TARGET_CAST = 0x3CF,
- CMSG_TARGET_SCRIPT_CAST = 0x3D0,
- CMSG_CHANNEL_DISPLAY_LIST = 0x3D1,
- CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D2,
- CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D3,
- SMSG_CHANNEL_MEMBER_COUNT = 0x3D4,
- CMSG_CHANNEL_VOICE_ON = 0x3D5,
- CMSG_CHANNEL_VOICE_OFF = 0x3D6,
- CMSG_DEBUG_LIST_TARGETS = 0x3D7,
- SMSG_DEBUG_LIST_TARGETS = 0x3D8,
- SMSG_AVAILABLE_VOICE_CHANNEL = 0x3D9,
- CMSG_ADD_VOICE_IGNORE = 0x3DA,
- CMSG_DEL_VOICE_IGNORE = 0x3DB,
- CMSG_PARTY_SILENCE = 0x3DC,
- CMSG_PARTY_UNSILENCE = 0x3DD,
- MSG_NOTIFY_PARTY_SQUELCH = 0x3DE,
- SMSG_COMSAT_RECONNECT_TRY = 0x3DF,
- SMSG_COMSAT_DISCONNECT = 0x3E0,
- SMSG_COMSAT_CONNECT_FAIL = 0x3E1,
- SMSG_VOICE_CHAT_STATUS = 0x3E2,
- CMSG_REPORT_PVP_AFK = 0x3E3,
- CMSG_REPORT_PVP_AFK_RESULT = 0x3E4,
- CMSG_GUILD_BANKER_ACTIVATE = 0x3E5,
- CMSG_GUILD_BANK_QUERY_TAB = 0x3E6,
- SMSG_GUILD_BANK_LIST = 0x3E7,
- CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E8,
- CMSG_GUILD_BANK_BUY_TAB = 0x3E9,
- CMSG_GUILD_BANK_UPDATE_TAB = 0x3EA,
- CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EB,
- CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3EC,
- MSG_GUILD_BANK_LOG_QUERY = 0x3ED,
- CMSG_SET_CHANNEL_WATCH = 0x3EE,
- SMSG_USERLIST_ADD = 0x3EF,
- SMSG_USERLIST_REMOVE = 0x3F0,
- SMSG_USERLIST_UPDATE = 0x3F1,
- CMSG_CLEAR_CHANNEL_WATCH = 0x3F2,
- SMSG_INSPECT_TALENT = 0x3F3,
- SMSG_GOGOGO_OBSOLETE = 0x3F4,
- SMSG_ECHO_PARTY_SQUELCH = 0x3F5,
- CMSG_SET_TITLE_SUFFIX = 0x3F6,
- CMSG_SPELLCLICK = 0x3F7,
- SMSG_LOOT_LIST = 0x3F8,
- CMSG_GM_CHARACTER_RESTORE = 0x3F9,
- CMSG_GM_CHARACTER_SAVE = 0x3FA,
- SMSG_VOICESESSION_FULL = 0x3FB,
- MSG_GUILD_PERMISSIONS = 0x3FC,
- MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FD,
- MSG_GUILD_EVENT_LOG_QUERY = 0x3FE,
- CMSG_MAELSTROM_RENAME_GUILD = 0x3FF,
- CMSG_GET_MIRRORIMAGE_DATA = 0x400,
- SMSG_MIRRORIMAGE_DATA = 0x401,
- SMSG_FORCE_DISPLAY_UPDATE = 0x402,
- SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x403,
- CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x404,
- SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
- CMSG_KEEP_ALIVE = 0x406,
- SMSG_RAID_READY_CHECK_ERROR = 0x407,
- CMSG_OPT_OUT_OF_LOOT = 0x408,
- MSG_QUERY_GUILD_BANK_TEXT = 0x409,
- CMSG_SET_GUILD_BANK_TEXT = 0x40A,
- CMSG_SET_GRANTABLE_LEVELS = 0x40B,
- CMSG_GRANT_LEVEL = 0x40C,
- CMSG_REFER_A_FRIEND = 0x40D,
- MSG_GM_CHANGE_ARENA_RATING = 0x40E,
- CMSG_DECLINE_CHANNEL_INVITE = 0x40F,
- CMSG_GROUPACTION_THROTTLED = 0x410,
- SMSG_OVERRIDE_LIGHT = 0x411,
- SMSG_TOTEM_CREATED = 0x412,
- CMSG_TOTEM_DESTROYED = 0x413,
- CMSG_EXPIRE_RAID_INSTANCE = 0x414,
- CMSG_NO_SPELL_VARIANCE = 0x415,
- CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x416,
- SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x417,
- CMSG_SET_PLAYER_DECLINED_NAMES = 0x418,
- SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x419,
- CMSG_QUERY_SERVER_BUCK_DATA = 0x41A,
- CMSG_CLEAR_SERVER_BUCK_DATA = 0x41B,
- SMSG_SERVER_BUCK_DATA = 0x41C,
- SMSG_SEND_UNLEARN_SPELLS = 0x41D,
- SMSG_PROPOSE_LEVEL_GRANT = 0x41E,
- CMSG_ACCEPT_LEVEL_GRANT = 0x41F,
- SMSG_REFER_A_FRIEND_FAILURE = 0x420,
- SMSG_SPLINE_MOVE_SET_FLYING = 0x421,
- SMSG_SPLINE_MOVE_UNSET_FLYING = 0x422,
- SMSG_SUMMON_CANCEL = 0x423
+ SMSG_VOICE_SESSION_ENABLE = 0x3B0,
+ SMSG_VOICE_PARENTAL_CONTROLS = 0x3B1,
+ CMSG_GM_WHISPER = 0x3B2,
+ SMSG_GM_MESSAGECHAT = 0x3B3,
+ MSG_GM_GEARRATING = 0x3B4,
+ CMSG_COMMENTATOR_ENABLE = 0x3B5,
+ SMSG_COMMENTATOR_STATE_CHANGED = 0x3B6,
+ CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B7,
+ SMSG_COMMENTATOR_MAP_INFO = 0x3B8,
+ CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
+ SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3BA,
+ SMSG_COMMENTATOR_PLAYER_INFO = 0x3BB,
+ CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BC,
+ CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BD,
+ CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BE,
+ SMSG_CLEAR_TARGET = 0x3BF,
+ CMSG_BOT_DETECTED = 0x3C0,
+ SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C1,
+ CMSG_CHEAT_PLAYER_LOGIN = 0x3C2,
+ CMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
+ SMSG_CHEAT_PLAYER_LOOKUP = 0x3C4,
+ SMSG_KICK_REASON = 0x3C5,
+ MSG_RAID_READY_CHECK_FINISHED = 0x3C6,
+ CMSG_COMPLAIN = 0x3C7,
+ SMSG_COMPLAIN_RESULT = 0x3C8,
+ SMSG_FEATURE_SYSTEM_STATUS = 0x3C9,
+ CMSG_GM_SHOW_COMPLAINTS = 0x3CA,
+ CMSG_GM_UNSQUELCH = 0x3CB,
+ CMSG_CHANNEL_SILENCE_VOICE = 0x3CC,
+ CMSG_CHANNEL_SILENCE_ALL = 0x3CD,
+ CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CE,
+ CMSG_CHANNEL_UNSILENCE_ALL = 0x3CF,
+ CMSG_TARGET_CAST = 0x3D0,
+ CMSG_TARGET_SCRIPT_CAST = 0x3D1,
+ CMSG_CHANNEL_DISPLAY_LIST = 0x3D2,
+ CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D3,
+ CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D4,
+ SMSG_CHANNEL_MEMBER_COUNT = 0x3D5,
+ CMSG_CHANNEL_VOICE_ON = 0x3D6,
+ CMSG_CHANNEL_VOICE_OFF = 0x3D7,
+ CMSG_DEBUG_LIST_TARGETS = 0x3D8,
+ SMSG_DEBUG_LIST_TARGETS = 0x3D9,
+ SMSG_AVAILABLE_VOICE_CHANNEL = 0x3DA,
+ CMSG_ADD_VOICE_IGNORE = 0x3DB,
+ CMSG_DEL_VOICE_IGNORE = 0x3DC,
+ CMSG_PARTY_SILENCE = 0x3DD,
+ CMSG_PARTY_UNSILENCE = 0x3DE,
+ MSG_NOTIFY_PARTY_SQUELCH = 0x3DF,
+ SMSG_COMSAT_RECONNECT_TRY = 0x3E0,
+ SMSG_COMSAT_DISCONNECT = 0x3E1,
+ SMSG_COMSAT_CONNECT_FAIL = 0x3E2,
+ SMSG_VOICE_CHAT_STATUS = 0x3E3,
+ CMSG_REPORT_PVP_AFK = 0x3E4,
+ CMSG_REPORT_PVP_AFK_RESULT = 0x3E5,
+ CMSG_GUILD_BANKER_ACTIVATE = 0x3E6,
+ CMSG_GUILD_BANK_QUERY_TAB = 0x3E7,
+ SMSG_GUILD_BANK_LIST = 0x3E8,
+ CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E9,
+ CMSG_GUILD_BANK_BUY_TAB = 0x3EA,
+ CMSG_GUILD_BANK_UPDATE_TAB = 0x3EB,
+ CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EC,
+ CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3ED,
+ MSG_GUILD_BANK_LOG_QUERY = 0x3EE,
+ CMSG_SET_CHANNEL_WATCH = 0x3EF,
+ SMSG_USERLIST_ADD = 0x3F0,
+ SMSG_USERLIST_REMOVE = 0x3F1,
+ SMSG_USERLIST_UPDATE = 0x3F2,
+ CMSG_CLEAR_CHANNEL_WATCH = 0x3F3,
+ SMSG_INSPECT_TALENT = 0x3F4,
+ SMSG_GOGOGO_OBSOLETE = 0x3F5,
+ SMSG_ECHO_PARTY_SQUELCH = 0x3F6,
+ CMSG_SET_TITLE_SUFFIX = 0x3F7,
+ CMSG_SPELLCLICK = 0x3F8,
+ SMSG_LOOT_LIST = 0x3F9,
+ CMSG_GM_CHARACTER_RESTORE = 0x3FA,
+ CMSG_GM_CHARACTER_SAVE = 0x3FB,
+ SMSG_VOICESESSION_FULL = 0x3FC,
+ MSG_GUILD_PERMISSIONS = 0x3FD,
+ MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FE,
+ MSG_GUILD_EVENT_LOG_QUERY = 0x3FF,
+ CMSG_MAELSTROM_RENAME_GUILD = 0x400,
+ CMSG_GET_MIRRORIMAGE_DATA = 0x401,
+ SMSG_MIRRORIMAGE_DATA = 0x402,
+ SMSG_FORCE_DISPLAY_UPDATE = 0x403,
+ SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x404,
+ CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
+ SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x406,
+ CMSG_KEEP_ALIVE = 0x407,
+ SMSG_RAID_READY_CHECK_ERROR = 0x408,
+ CMSG_OPT_OUT_OF_LOOT = 0x409,
+ MSG_QUERY_GUILD_BANK_TEXT = 0x40A,
+ CMSG_SET_GUILD_BANK_TEXT = 0x40B,
+ CMSG_SET_GRANTABLE_LEVELS = 0x40C,
+ CMSG_GRANT_LEVEL = 0x40D,
+ CMSG_REFER_A_FRIEND = 0x40E,
+ MSG_GM_CHANGE_ARENA_RATING = 0x40F,
+ CMSG_DECLINE_CHANNEL_INVITE = 0x410,
+ CMSG_GROUPACTION_THROTTLED = 0x411,
+ SMSG_OVERRIDE_LIGHT = 0x412,
+ SMSG_TOTEM_CREATED = 0x413,
+ CMSG_TOTEM_DESTROYED = 0x414,
+ CMSG_EXPIRE_RAID_INSTANCE = 0x415,
+ CMSG_NO_SPELL_VARIANCE = 0x416,
+ CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x417,
+ SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x418,
+ CMSG_SET_PLAYER_DECLINED_NAMES = 0x419,
+ SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x41A,
+ CMSG_QUERY_SERVER_BUCK_DATA = 0x41B,
+ CMSG_CLEAR_SERVER_BUCK_DATA = 0x41C,
+ SMSG_SERVER_BUCK_DATA = 0x41D,
+ SMSG_SEND_UNLEARN_SPELLS = 0x41E,
+ SMSG_PROPOSE_LEVEL_GRANT = 0x41F,
+ CMSG_ACCEPT_LEVEL_GRANT = 0x420,
+ SMSG_REFER_A_FRIEND_FAILURE = 0x421,
+ SMSG_SPLINE_MOVE_SET_FLYING = 0x422,
+ SMSG_SPLINE_MOVE_UNSET_FLYING = 0x423,
+ SMSG_SUMMON_CANCEL = 0x424,
+ CMSG_CHANGE_PERSONAL_ARENA_RATING = 0x425,
+ CMSG_ALTER_APPEARANCE = 0x426,
+ SMSG_ENABLE_BARBER_SHOP = 0x427,
+ SMSG_BARBER_SHOP_RESULT = 0x428,
+ CMSG_CALENDAR_GET_CALENDAR = 0x429,
+ CMSG_CALENDAR_GET_EVENT = 0x42A,
+ CMSG_CALENDAR_GUILD_FILTER = 0x42B,
+ CMSG_CALENDAR_ARENA_TEAM = 0x42C,
+ CMSG_CALENDAR_ADD_EVENT = 0x42D,
+ CMSG_CALENDAR_UPDATE_EVENT = 0x42E,
+ CMSG_CALENDAR_REMOVE_EVENT = 0x42F,
+ CMSG_CALENDAR_COPY_EVENT = 0x430,
+ CMSG_CALENDAR_EVENT_INVITE = 0x431,
+ CMSG_CALENDAR_EVENT_RSVP = 0x432,
+ CMSG_CALENDAR_EVENT_REMOVE_INVITE = 0x433,
+ CMSG_CALENDAR_EVENT_STATUS = 0x434,
+ CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x435,
+ SMSG_CALENDAR_SEND_CALENDAR = 0x436,
+ SMSG_CALENDAR_SEND_EVENT = 0x437,
+ SMSG_CALENDAR_FILTER_GUILD = 0x438,
+ SMSG_CALENDAR_ARENA_TEAM = 0x439,
+ SMSG_CALENDAR_EVENT_INVITE = 0x43A,
+ SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x43B,
+ SMSG_CALENDAR_EVENT_STATUS = 0x43C,
+ SMSG_CALENDAR_COMMAND_RESULT = 0x43D,
+ SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x43E,
+ SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x43F,
+ SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x440,
+ SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x441,
+ SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x442,
+ SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x443,
+ SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x444,
+ SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0x445,
+ CMSG_CALENDAR_COMPLAIN = 0x446,
+ CMSG_CALENDAR_GET_NUM_PENDING = 0x447,
+ SMSG_CALENDAR_SEND_NUM_PENDING = 0x448,
+ CMSG_SAVE_DANCE = 0x449,
+ SMSG_NOTIFY_DANCE = 0x44A,
+ CMSG_PLAY_DANCE = 0x44B,
+ SMSG_PLAY_DANCE = 0x44C,
+ CMSG_LOAD_DANCES = 0x44D,
+ CMSG_STOP_DANCE = 0x44E,
+ SMSG_STOP_DANCE = 0x44F,
+ CMSG_SYNC_DANCE = 0x450,
+ CMSG_DANCE_QUERY = 0x451,
+ SMSG_DANCE_QUERY_RESPONSE = 0x452,
+ SMSG_INVALIDATE_DANCE = 0x453,
+ CMSG_DELETE_DANCE = 0x454,
+ SMSG_LEARNED_DANCE_MOVES = 0x455,
+ CMSG_LEARN_DANCE_MOVE = 0x456,
+ CMSG_UNLEARN_DANCE_MOVE = 0x457,
+ CMSG_SET_RUNE_COUNT = 0x458,
+ CMSG_SET_RUNE_COOLDOWN = 0x459,
+ MSG_MOVE_SET_PITCH_RATE_CHEAT = 0x45A,
+ MSG_MOVE_SET_PITCH_RATE = 0x45B,
+ SMSG_FORCE_PITCH_RATE_CHANGE = 0x45C,
+ CMSG_FORCE_PITCH_RATE_CHANGE_ACK = 0x45D,
+ SMSG_SPLINE_SET_PITCH_RATE = 0x45E,
+ SMSG_MOVE_ABANDON_TRANSPORT = 0x45F,
+ MSG_MOVE_ABANDON_TRANSPORT = 0x460,
+ CMSG_MOVE_ABANDON_TRANSPORT_ACK = 0x461,
+ CMSG_UPDATE_MISSILE_TRAJECTORY = 0x462,
+ SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x463,
+ SMSG_TRIGGER_MOVIE = 0x464,
+ CMSG_COMPLETE_MOVIE = 0x465,
+ CMSG_SET_GLYPH_SLOT = 0x466,
+ CMSG_SET_GLYPH = 0x467,
+ SMSG_ACHIEVEMENT_EARNED = 0x468,
+ SMSG_DYNAMIC_DROP_ROLL_RESULT = 0x469,
+ SMSG_CRITERIA_UPDATE = 0x46A,
+ CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x46B,
+ SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x46C,
+ CMSG_DISMISS_CONTROLLED_VEHICLE = 0x46D,
+ CMSG_COMPLETE_ACHIEVEMENT_CHEAT = 0x46E,
+ SMSG_QUESTUPDATE_ADD_PVP_KILL = 0x46F,
+ CMSG_SET_CRITERIA_CHEAT = 0x470,
+ SMSG_GROUP_SWAP_FAILED = 0x471,
+ CMSG_UNITANIMTIER_CHEAT = 0x472,
+ CMSG_CHAR_CUSTOMIZE = 0x473,
+ SMSG_CHAR_CUSTOMIZE = 0x474,
+ SMSG_PET_RENAMEABLE = 0x475,
+ CMSG_REQUEST_VEHICLE_EXIT = 0x476,
+ CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x477,
+ CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x478,
+ CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x479,
+ CMSG_PET_LEARN_TALENT = 0x47A,
+ CMSG_PET_UNLEARN_TALENTS = 0x47B,
+ SMSG_SET_PHASE_SHIFT = 0x47C,
+ SMSG_ALL_ACHIEVEMENT_DATA = 0x47D,
+ CMSG_FORCE_SAY_CHEAT = 0x47E,
+ SMSG_HEALTH_UPDATE = 0x47F,
+ SMSG_POWER_UPDATE = 0x480,
+ CMSG_GAMEOBJ_REPORT_USE = 0x481,
+ SMSG_HIGHEST_THREAT_UPDATE = 0x482,
+ SMSG_THREAT_UPDATE = 0x483,
+ SMSG_THREAT_REMOVE = 0x484,
+ SMSG_THREAT_CLEAR = 0x485,
+ SMSG_CONVERT_RUNE = 0x486,
+ SMSG_RESYNC_RUNES = 0x487,
+ SMSG_ADD_RUNE_POWER = 0x488,
+ CMSG_START_QUEST = 0x489,
+ CMSG_REMOVE_GLYPH = 0x48A,
+ CMSG_DUMP_OBJECTS = 0x48B,
+ SMSG_DUMP_OBJECTS_DATA = 0x48C,
+ CMSG_DISMISS_CRITTER = 0x48D,
+ SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x48E,
+ CMSG_AUCTION_LIST_PENDING_SALES = 0x48F,
+ SMSG_AUCTION_LIST_PENDING_SALES = 0x490,
+ SMSG_MODIFY_COOLDOWN = 0x491,
+ SMSG_PET_UPDATE_COMBO_POINTS = 0x492,
+ CMSG_ENABLETAXI = 0x493,
+ SMSG_PRE_RESURRECT = 0x494,
+ SMSG_AURA_UPDATE_ALL = 0x495,
+ SMSG_AURA_UPDATE = 0x496,
+ CMSG_FLOOD_GRACE_CHEAT = 0x497,
+ SMSG_SERVER_FIRST_ACHIEVEMENT = 0x498,
+ SMSG_PET_LEARNED_SPELL = 0x499,
+ SMSG_PET_REMOVED_SPELL = 0x49A,
+ CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B,
+ CMSG_HEARTH_AND_RESURRECT = 0x49C,
+ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D,
+ SMSG_CRITERIA_DELETED = 0x49E,
+ SMSG_ACHIEVEMENT_DELETED = 0x49F,
+ CMSG_SERVER_INFO_QUERY = 0x4A0,
+ SMSG_SERVER_INFO_RESPONSE = 0x4A1,
+ CMSG_CHECK_LOGIN_CRITERIA = 0x4A2,
+ SMSG_SERVER_BUCK_DATA_START = 0x4A3,
+ CMSG_QUERY_VEHICLE_STATUS = 0x4A4,
+ SMSG_PET_GUIDS = 0x4A5,
+ SMSG_CLIENTCACHE_VERSION = 0x4A6,
+ UMSG_UNKNOWN_1191 = 0x4A7,
+ UMSG_UNKNOWN_1192 = 0x4A8,
+ UMSG_UNKNOWN_1193 = 0x4A9,
+ UMSG_UNKNOWN_1194 = 0x4AA,
+ UMSG_UNKNOWN_1195 = 0x4AB,
+ UMSG_UNKNOWN_1196 = 0x4AC,
+ NUM_MSG_TYPES = 0x4AD
};
-// Don't forget to change this value and add opcode name to Opcodes.cpp when you add new opcode!
-#define NUM_MSG_TYPES 0x424
-
/// Player state
enum SessionStatus
{
diff --git a/src/game/OutdoorPvP.cpp b/src/game/OutdoorPvP.cpp
index 57f072ebbef..b48a226d6a4 100644
--- a/src/game/OutdoorPvP.cpp
+++ b/src/game/OutdoorPvP.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -95,7 +95,7 @@ bool OutdoorPvPObjective::AddObject(uint32 type, uint32 entry, uint32 map, float
if(!pMap)
return true;
GameObject * go = new GameObject;
- if(!go->Create(guid,entry, pMap,x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,1))
+ if(!go->Create(guid,entry, pMap,PHASEMASK_NORMAL,x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,1))
{
sLog.outError("Gameobject template %u not found in database.", entry);
delete go;
@@ -156,7 +156,7 @@ bool OutdoorPvPObjective::AddCreature(uint32 type, uint32 entry, uint32 teamval,
if(!pMap)
return true;
Creature* pCreature = new Creature;
- if (!pCreature->Create(guid, pMap, entry, teamval))
+ if (!pCreature->Create(guid, pMap, PHASEMASK_NORMAL, entry, teamval))
{
sLog.outError("Can't create creature entry: %u",entry);
delete pCreature;
@@ -256,7 +256,7 @@ bool OutdoorPvPObjective::AddCapturePoint(uint32 entry, uint32 map, float x, flo
return true;
// add GO...
GameObject * go = new GameObject;
- if(!go->Create(guid,entry, pMap,x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,1))
+ if(!go->Create(guid,entry, pMap,PHASEMASK_NORMAL,x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,1))
{
sLog.outError("Gameobject template %u not found in database.", entry);
delete go;
@@ -269,7 +269,7 @@ bool OutdoorPvPObjective::AddCapturePoint(uint32 entry, uint32 map, float x, flo
}
// add creature...
Creature* pCreature = new Creature;
- if (!pCreature->Create(creature_guid, pMap, OPVP_TRIGGER_CREATURE_ENTRY, 0))
+ if (!pCreature->Create(creature_guid, pMap, PHASEMASK_NORMAL, OPVP_TRIGGER_CREATURE_ENTRY, 0))
{
sLog.outError("Can't create creature entry: %u",entry);
delete pCreature;
diff --git a/src/game/OutdoorPvP.h b/src/game/OutdoorPvP.h
index e7bd21059a7..c1c39c1ff65 100644
--- a/src/game/OutdoorPvP.h
+++ b/src/game/OutdoorPvP.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPEP.cpp b/src/game/OutdoorPvPEP.cpp
index 41747dba100..f0ff85574c0 100644
--- a/src/game/OutdoorPvPEP.cpp
+++ b/src/game/OutdoorPvPEP.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPEP.h b/src/game/OutdoorPvPEP.h
index ae242a1da16..5ba4591e48d 100644
--- a/src/game/OutdoorPvPEP.h
+++ b/src/game/OutdoorPvPEP.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPHP.cpp b/src/game/OutdoorPvPHP.cpp
index b31f79a6288..6058b82c102 100644
--- a/src/game/OutdoorPvPHP.cpp
+++ b/src/game/OutdoorPvPHP.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPHP.h b/src/game/OutdoorPvPHP.h
index da41761d572..a538f82b216 100644
--- a/src/game/OutdoorPvPHP.h
+++ b/src/game/OutdoorPvPHP.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPMgr.cpp b/src/game/OutdoorPvPMgr.cpp
index 5c53bf4eaba..f6af15e7529 100644
--- a/src/game/OutdoorPvPMgr.cpp
+++ b/src/game/OutdoorPvPMgr.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPMgr.h b/src/game/OutdoorPvPMgr.h
index 7426876b42b..28b01c586b7 100644
--- a/src/game/OutdoorPvPMgr.h
+++ b/src/game/OutdoorPvPMgr.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPNA.cpp b/src/game/OutdoorPvPNA.cpp
index 9b59347dd2d..9030337f2cd 100644
--- a/src/game/OutdoorPvPNA.cpp
+++ b/src/game/OutdoorPvPNA.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPNA.h b/src/game/OutdoorPvPNA.h
index b6be2270cda..92e0b9dcbbb 100644
--- a/src/game/OutdoorPvPNA.h
+++ b/src/game/OutdoorPvPNA.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPObjectiveAI.cpp b/src/game/OutdoorPvPObjectiveAI.cpp
index 7c4fd5e6de8..233fffd6b2f 100644
--- a/src/game/OutdoorPvPObjectiveAI.cpp
+++ b/src/game/OutdoorPvPObjectiveAI.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPObjectiveAI.h b/src/game/OutdoorPvPObjectiveAI.h
index d21655795e9..5c68f45b082 100644
--- a/src/game/OutdoorPvPObjectiveAI.h
+++ b/src/game/OutdoorPvPObjectiveAI.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPSI.cpp b/src/game/OutdoorPvPSI.cpp
index 378543da48e..615f6fab9f8 100644
--- a/src/game/OutdoorPvPSI.cpp
+++ b/src/game/OutdoorPvPSI.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -202,7 +202,7 @@ bool OutdoorPvPSI::HandleDropFlag(Player *plr, uint32 spellId)
Map * map = MapManager::Instance().GetMap(plr->GetMapId(), plr);
if(!map)
return true;
- if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),SI_SILITHYST_MOUND, map,plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),0,0,0,0,100,1))
+ if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),SI_SILITHYST_MOUND, map, plr->GetPhaseMask(), plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),0,0,0,0,100,1))
{
delete go;
}
@@ -228,7 +228,7 @@ bool OutdoorPvPSI::HandleDropFlag(Player *plr, uint32 spellId)
Map * map = MapManager::Instance().GetMap(plr->GetMapId(), plr);
if(!map)
return true;
- if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),SI_SILITHYST_MOUND, map ,plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),0,0,0,0,100,1))
+ if(!go->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT),SI_SILITHYST_MOUND, map, plr->GetPhaseMask() ,plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),0,0,0,0,100,1))
{
delete go;
}
diff --git a/src/game/OutdoorPvPSI.h b/src/game/OutdoorPvPSI.h
index 4b0b5da357e..1f2331b4251 100644
--- a/src/game/OutdoorPvPSI.h
+++ b/src/game/OutdoorPvPSI.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPTF.cpp b/src/game/OutdoorPvPTF.cpp
index b94bc9246ee..01b224cffa9 100644
--- a/src/game/OutdoorPvPTF.cpp
+++ b/src/game/OutdoorPvPTF.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPZM.cpp b/src/game/OutdoorPvPZM.cpp
index b220f6a778f..29997eec920 100644
--- a/src/game/OutdoorPvPZM.cpp
+++ b/src/game/OutdoorPvPZM.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/OutdoorPvPZM.h b/src/game/OutdoorPvPZM.h
index b9d5ae7bc2e..405c0133b5c 100644
--- a/src/game/OutdoorPvPZM.h
+++ b/src/game/OutdoorPvPZM.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Path.h b/src/game/Path.h
index 2b793aed892..2fd6723b01c 100644
--- a/src/game/Path.h
+++ b/src/game/Path.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index 00452fc0d95..b4b8bae9c67 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -41,46 +41,14 @@ char const* petTypeSuffix[MAX_PET_TYPE] =
"'s Companion" // MINI_PET
};
-//numbers represent minutes * 100 while happy (you get 100 loyalty points per min while happy)
-uint32 const LevelUpLoyalty[6] =
-{
- 5500,
- 11500,
- 17000,
- 23500,
- 31000,
- 39500,
-};
-
-uint32 const LevelStartLoyalty[6] =
-{
- 2000,
- 4500,
- 7000,
- 10000,
- 13500,
- 17500,
-};
-
-Pet::Pet(PetType type) : Creature()
+Pet::Pet(PetType type) :
+Creature(), m_petType(type), m_removed(false), m_happinessTimer(7500), m_duration(0), m_bonusdamage(0),
+m_resetTalentsCost(0), m_resetTalentsTime(0), m_usedTalentCount(0), m_auraRaidUpdateMask(0), m_loading(false),
+m_declinedname(NULL)
{
m_isPet = true;
m_name = "Pet";
- m_petType = type;
-
- m_removed = false;
m_regenTimer = 4000;
- m_happinessTimer = 7500;
- m_loyaltyTimer = 12000;
- m_duration = 0;
- m_bonusdamage = 0;
-
- m_loyaltyPoints = 0;
- m_TrainingPoints = 0;
- m_resetTalentsCost = 0;
- m_resetTalentsTime = 0;
-
- m_auraUpdateMask = 0;
// pets always have a charminfo, even if they are not actually charmed
CharmInfo* charmInfo = InitCharmInfo(this);
@@ -90,12 +58,6 @@ Pet::Pet(PetType type) : Creature()
else if(type == GUARDIAN_PET) // always aggressive
charmInfo->SetReactState(REACT_AGGRESSIVE);
- m_spells.clear();
- m_Auras.clear();
- m_CreatureSpellCooldowns.clear();
- m_CreatureCategoryCooldowns.clear();
- m_autospells.clear();
- m_declinedname = NULL;
//m_isActive = true;
}
@@ -126,26 +88,28 @@ void Pet::RemoveFromWorld()
Unit::RemoveFromWorld();
}
-bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool current )
+bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool current )
{
+ m_loading = true;
+
uint32 ownerid = owner->GetGUIDLow();
QueryResult *result;
if(petnumber)
- // known petnumber entry 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND id = '%u'",ownerid, petnumber);
+ // known petnumber entry 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND id = '%u'",ownerid, petnumber);
else if(current)
- // current pet (slot 0) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND slot = '0'",ownerid );
+ // current pet (slot 0) 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND slot = '0'",ownerid );
else if(petentry)
// known petentry entry (unique for summoned pet, but non unique for hunter pet (only from current or not stabled pets)
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '0' OR slot = '3') ",ownerid, petentry );
+ // 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '0' OR slot = '3') ",ownerid, petentry );
else
// any current or other non-stabled pet (for hunter "call pet")
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND (slot = '0' OR slot = '3') ",ownerid);
+ // 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND (slot = '0' OR slot = '3') ",ownerid);
if(!result)
return false;
@@ -160,7 +124,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
return false;
}
- uint32 summon_spell_id = fields[21].GetUInt32();
+ uint32 summon_spell_id = fields[19].GetUInt32();
SpellEntry const* spellInfo = sSpellStore.LookupEntry(summon_spell_id);
bool is_temporary_summoned = spellInfo && GetSpellDuration(spellInfo) > 0;
@@ -175,7 +139,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
Map *map = owner->GetMap();
uint32 guid = objmgr.GenerateLowGuid(HIGHGUID_PET);
uint32 pet_number = fields[0].GetUInt32();
- if(!Create(guid, map, petentry, pet_number))
+ if(!Create(guid, map, owner->GetPhaseMask(), petentry, pet_number))
{
delete result;
return false;
@@ -194,8 +158,8 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
return false;
}
- setPetType(PetType(fields[22].GetUInt8()));
- SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,owner->getFaction());
+ setPetType(PetType(fields[20].GetUInt8()));
+ SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, owner->getFaction());
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
CreatureInfo const *cinfo = GetCreatureInfo();
@@ -206,72 +170,67 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
delete result;
return true;
}
- if(getPetType()==HUNTER_PET || (getPetType()==SUMMON_PET && cinfo->type == CREATURE_TYPE_DEMON && owner->getClass() == CLASS_WARLOCK))
+
+ if(getPetType() == HUNTER_PET || (getPetType() == SUMMON_PET && cinfo->type == CREATURE_TYPE_DEMON && owner->getClass() == CLASS_WARLOCK))
m_charmInfo->SetPetNumber(pet_number, true);
else
m_charmInfo->SetPetNumber(pet_number, false);
- SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner->GetGUID());
+
+ SetOwnerGUID(owner->GetGUID());
SetDisplayId(fields[3].GetUInt32());
SetNativeDisplayId(fields[3].GetUInt32());
- uint32 petlevel=fields[4].GetUInt32();
- SetUInt32Value(UNIT_NPC_FLAGS , 0);
- SetName(fields[11].GetString());
+ uint32 petlevel = fields[4].GetUInt32();
+ SetUInt32Value(UNIT_NPC_FLAGS, 0);
+ SetName(fields[9].GetString());
switch(getPetType())
{
-
case SUMMON_PET:
petlevel=owner->getLevel();
- SetUInt32Value(UNIT_FIELD_BYTES_0,2048);
+ SetUInt32Value(UNIT_FIELD_BYTES_0, 2048);
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);
- SetByteValue(UNIT_FIELD_BYTES_1, 1, fields[8].GetUInt32());
- SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
-
- if(fields[12].GetBool())
- SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_NOT_ALLOWED);
- else
- SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED);
+ SetByteValue(UNIT_FIELD_BYTES_1, 1, fields[7].GetUInt32());
+ SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ SetByteValue(UNIT_FIELD_BYTES_2, 2, fields[10].GetBool() ? UNIT_RENAME_NOT_ALLOWED : UNIT_RENAME_ALLOWED);
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
// this enables popup window (pet abandon, cancel)
- SetTP(fields[9].GetInt32());
- SetMaxPower(POWER_HAPPINESS,GetCreatePowers(POWER_HAPPINESS));
- SetPower( POWER_HAPPINESS,fields[15].GetUInt32());
+ SetMaxPower(POWER_HAPPINESS, GetCreatePowers(POWER_HAPPINESS));
+ SetPower(POWER_HAPPINESS, fields[13].GetUInt32());
setPowerType(POWER_FOCUS);
break;
default:
- sLog.outError("Pet have incorrect type (%u) for pet loading.",getPetType());
+ sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType());
}
- InitStatsForLevel( petlevel);
+
+ InitStatsForLevel(petlevel);
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
- SetUInt64Value(UNIT_FIELD_CREATEDBY, owner->GetGUID());
+ SetCreatorGUID(owner->GetGUID());
- m_charmInfo->SetReactState( ReactStates( fields[6].GetUInt8() ));
- m_loyaltyPoints = fields[7].GetInt32();
+ m_charmInfo->SetReactState(ReactStates(fields[6].GetUInt8()));
- uint32 savedhealth = fields[13].GetUInt32();
- uint32 savedmana = fields[14].GetUInt32();
+ uint32 savedhealth = fields[11].GetUInt32();
+ uint32 savedmana = fields[12].GetUInt32();
// set current pet as current
- if(fields[10].GetUInt32() != 0)
+ if(fields[8].GetUInt32() != 0)
{
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("UPDATE character_pet SET slot = '3' WHERE owner = '%u' AND slot = '0' AND id <> '%u'",ownerid, m_charmInfo->GetPetNumber());
- CharacterDatabase.PExecute("UPDATE character_pet SET slot = '0' WHERE owner = '%u' AND id = '%u'",ownerid, m_charmInfo->GetPetNumber());
+ CharacterDatabase.PExecute("UPDATE character_pet SET slot = '3' WHERE owner = '%u' AND slot = '0' AND id <> '%u'", ownerid, m_charmInfo->GetPetNumber());
+ CharacterDatabase.PExecute("UPDATE character_pet SET slot = '0' WHERE owner = '%u' AND id = '%u'", ownerid, m_charmInfo->GetPetNumber());
CharacterDatabase.CommitTransaction();
}
if(!is_temporary_summoned)
{
// permanent controlled pets store state in DB
- Tokens tokens = StrSplit(fields[16].GetString(), " ");
+ Tokens tokens = StrSplit(fields[14].GetString(), " ");
if(tokens.size() != 20)
{
@@ -290,11 +249,11 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
// patch for old data where some spells have ACT_DECIDE but should have ACT_CAST
// so overwrite old state
SpellEntry const *spellInfo = sSpellStore.LookupEntry(m_charmInfo->GetActionBarEntry(index)->SpellOrAction);
- if (spellInfo && spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET) m_charmInfo->GetActionBarEntry(index)->Type = ACT_CAST;
+ if (spellInfo && spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET) m_charmInfo->GetActionBarEntry(index)->Type = ACT_ENABLED;
}
//init teach spells
- tokens = StrSplit(fields[17].GetString(), " ");
+ tokens = StrSplit(fields[15].GetString(), " ");
for (iter = tokens.begin(), index = 0; index < 4; ++iter, ++index)
{
uint32 tmp = atol((*iter).c_str());
@@ -309,7 +268,10 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
}
// since last save (in seconds)
- uint32 timediff = (time(NULL) - fields[18].GetUInt32());
+ uint32 timediff = (time(NULL) - fields[16].GetUInt32());
+
+ m_resetTalentsCost = fields[17].GetUInt32();
+ m_resetTalentsTime = fields[18].GetUInt64();
delete result;
@@ -375,6 +337,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
}
}
+ m_loading = false;
return true;
}
@@ -417,10 +380,6 @@ void Pet::SavePetToDB(PetSaveMode mode)
case PET_SAVE_IN_STABLE_SLOT_2:
case PET_SAVE_NOT_IN_SLOT:
{
- uint32 loyalty =1;
- if(getPetType()!=HUNTER_PET)
- loyalty = GetLoyaltyLevel();
-
uint32 owner = GUID_LOPART(GetOwnerGUID());
std::string name = m_name;
CharacterDatabase.escape_string(name);
@@ -437,7 +396,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
CharacterDatabase.PExecute("DELETE FROM character_pet WHERE owner = '%u' AND (slot = '0' OR slot = '3')", owner );
// save pet
std::ostringstream ss;
- ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata,TeachSpelldata,savetime,resettalents_cost,resettalents_time,CreatedBySpell,PetType) "
+ ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
<< "VALUES ("
<< m_charmInfo->GetPetNumber() << ", "
<< GetEntry() << ", "
@@ -446,9 +405,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
<< getLevel() << ", "
<< GetUInt32Value(UNIT_FIELD_PETEXPERIENCE) << ", "
<< uint32(m_charmInfo->GetReactState()) << ", "
- << m_loyaltyPoints << ", "
- << GetLoyaltyLevel() << ", "
- << m_TrainingPoints << ", "
+ << uint32(GetFreeTalentPoints()) << ", "
<< uint32(mode) << ", '"
<< name.c_str() << "', "
<< uint32((GetByteValue(UNIT_FIELD_BYTES_2, 2) == UNIT_RENAME_ALLOWED)?0:1) << ", "
@@ -521,12 +478,12 @@ void Pet::setDeathState(DeathState s) // overwrite virtual
if(!mapEntry || (mapEntry->map_type != MAP_ARENA && mapEntry->map_type != MAP_BATTLEGROUND))
ModifyPower(POWER_HAPPINESS, -HAPPINESS_LEVEL_SIZE);
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
}
else if(getDeathState()==ALIVE)
{
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
CastPetAuras(true);
}
}
@@ -553,6 +510,7 @@ void Pet::Update(uint32 diff)
// unsummon pet that lost owner
Unit* owner = GetOwner();
if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && !isPossessed()) || isControlled() && !owner->GetPetGUID())
+ //if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID()))
{
Remove(PET_SAVE_NOT_IN_SLOT, true);
return;
@@ -598,14 +556,6 @@ void Pet::Update(uint32 diff)
else
m_happinessTimer -= diff;
- if(m_loyaltyTimer <= diff)
- {
- TickLoyaltyChange();
- m_loyaltyTimer = 12000;
- }
- else
- m_loyaltyTimer -= diff;
-
break;
}
default:
@@ -627,7 +577,7 @@ void Pet::RegenerateFocus()
AuraList const& ModPowerRegenPCTAuras = GetAurasByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT);
for(AuraList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
if ((*i)->GetModifier()->m_miscvalue == POWER_FOCUS)
- addvalue *= ((*i)->GetModifierValue() + 100) / 100.0f;
+ addvalue *= ((*i)->GetModifier()->m_amount + 100) / 100.0f;
ModifyPower(POWER_FOCUS, (int32)addvalue);
}
@@ -637,83 +587,12 @@ void Pet::LooseHappiness()
uint32 curValue = GetPower(POWER_HAPPINESS);
if (curValue <= 0)
return;
- int32 addvalue = (140 >> GetLoyaltyLevel()) * 125; //value is 70/35/17/8/4 (per min) * 1000 / 8 (timer 7.5 secs)
+ int32 addvalue = 670; //value is 70/35/17/8/4 (per min) * 1000 / 8 (timer 7.5 secs)
if(isInCombat()) //we know in combat happiness fades faster, multiplier guess
addvalue = int32(addvalue * 1.5);
ModifyPower(POWER_HAPPINESS, -addvalue);
}
-void Pet::ModifyLoyalty(int32 addvalue)
-{
- uint32 loyaltylevel = GetLoyaltyLevel();
-
- if(addvalue > 0) //only gain influenced, not loss
- addvalue = int32((float)addvalue * sWorld.getRate(RATE_LOYALTY));
-
- if(loyaltylevel >= BEST_FRIEND && (addvalue + m_loyaltyPoints) > int32(GetMaxLoyaltyPoints(loyaltylevel)))
- return;
-
- m_loyaltyPoints += addvalue;
-
- if(m_loyaltyPoints < 0)
- {
- if(loyaltylevel > REBELLIOUS)
- {
- //level down
- --loyaltylevel;
- SetLoyaltyLevel(LoyaltyLevel(loyaltylevel));
- m_loyaltyPoints = GetStartLoyaltyPoints(loyaltylevel);
- SetTP(m_TrainingPoints - int32(getLevel()));
- }
- else
- {
- m_loyaltyPoints = 0;
- Unit* owner = GetOwner();
- if(owner && owner->GetTypeId() == TYPEID_PLAYER)
- {
- WorldPacket data(SMSG_PET_BROKEN, 0);
- ((Player*)owner)->GetSession()->SendPacket(&data);
-
- //run away
- ((Player*)owner)->RemovePet(this,PET_SAVE_AS_DELETED);
- }
- }
- }
- //level up
- else if(m_loyaltyPoints > int32(GetMaxLoyaltyPoints(loyaltylevel)))
- {
- ++loyaltylevel;
- SetLoyaltyLevel(LoyaltyLevel(loyaltylevel));
- m_loyaltyPoints = GetStartLoyaltyPoints(loyaltylevel);
- SetTP(m_TrainingPoints + getLevel());
- }
-}
-
-void Pet::TickLoyaltyChange()
-{
- int32 addvalue;
-
- switch(GetHappinessState())
- {
- case HAPPY: addvalue = 20; break;
- case CONTENT: addvalue = 10; break;
- case UNHAPPY: addvalue = -20; break;
- default:
- return;
- }
- ModifyLoyalty(addvalue);
-}
-
-void Pet::KillLoyaltyBonus(uint32 level)
-{
- if(level > 100)
- return;
-
- //at lower levels gain is faster | the lower loyalty the more loyalty is gained
- uint32 bonus = uint32(((100 - level) / 10) + (6 - GetLoyaltyLevel()));
- ModifyLoyalty(bonus);
-}
-
HappinessState Pet::GetHappinessState()
{
if(GetPower(POWER_HAPPINESS) < HAPPINESS_LEVEL_SIZE)
@@ -724,11 +603,6 @@ HappinessState Pet::GetHappinessState()
return CONTENT;
}
-void Pet::SetLoyaltyLevel(LoyaltyLevel level)
-{
- SetByteValue(UNIT_FIELD_BYTES_1, 1, level);
-}
-
bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
{
uint8 activecount = 1;
@@ -765,82 +639,6 @@ bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
return true;
}
-bool Pet::HasTPForSpell(uint32 spellid)
-{
- int32 neededtrainp = GetTPForSpell(spellid);
- if((m_TrainingPoints - neededtrainp < 0 || neededtrainp < 0) && neededtrainp != 0)
- return false;
- return true;
-}
-
-int32 Pet::GetTPForSpell(uint32 spellid)
-{
- uint32 basetrainp = 0;
-
- SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellid);
- SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellid);
- for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
- {
- if(!_spell_idx->second->reqtrainpoints)
- return 0;
-
- basetrainp = _spell_idx->second->reqtrainpoints;
- break;
- }
-
- uint32 spenttrainp = 0;
- uint32 chainstart = spellmgr.GetFirstSpellInChain(spellid);
-
- for (PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
- {
- if(itr->second->state == PETSPELL_REMOVED)
- continue;
-
- if(spellmgr.GetFirstSpellInChain(itr->first) == chainstart)
- {
- SkillLineAbilityMap::const_iterator _lower = spellmgr.GetBeginSkillLineAbilityMap(itr->first);
- SkillLineAbilityMap::const_iterator _upper = spellmgr.GetEndSkillLineAbilityMap(itr->first);
-
- for(SkillLineAbilityMap::const_iterator _spell_idx2 = _lower; _spell_idx2 != _upper; ++_spell_idx2)
- {
- if(_spell_idx2->second->reqtrainpoints > spenttrainp)
- {
- spenttrainp = _spell_idx2->second->reqtrainpoints;
- break;
- }
- }
- }
- }
-
- return int32(basetrainp) - int32(spenttrainp);
-}
-
-uint32 Pet::GetMaxLoyaltyPoints(uint32 level)
-{
- return LevelUpLoyalty[level - 1];
-}
-
-uint32 Pet::GetStartLoyaltyPoints(uint32 level)
-{
- return LevelStartLoyalty[level - 1];
-}
-
-void Pet::SetTP(int32 TP)
-{
- m_TrainingPoints = TP;
- SetUInt32Value(UNIT_TRAINING_POINTS, (uint32)GetDispTP());
-}
-
-int32 Pet::GetDispTP()
-{
- if(getPetType()!= HUNTER_PET)
- return(0);
- if(m_TrainingPoints < 0)
- return -m_TrainingPoints;
- else
- return -(m_TrainingPoints + 1);
-}
-
void Pet::Remove(PetSaveMode mode, bool returnreagent)
{
Unit* owner = GetOwner();
@@ -895,7 +693,7 @@ void Pet::GivePetXP(uint32 xp)
newXP -= nextLvlXP;
SetLevel( level + 1 );
- SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(level+1))/4));
+ SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(level+1)/4);
level = getLevel();
nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP);
@@ -903,9 +701,6 @@ void Pet::GivePetXP(uint32 xp)
}
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP);
-
- if(getPetType() == HUNTER_PET)
- KillLoyaltyBonus(level);
}
void Pet::GivePetLevel(uint32 level)
@@ -913,9 +708,8 @@ void Pet::GivePetLevel(uint32 level)
if(!level)
return;
- InitStatsForLevel( level);
-
- SetTP(m_TrainingPoints + (GetLoyaltyLevel() - 1));
+ InitStatsForLevel(level);
+ InitTalentForLevel();
}
bool Pet::CreateBaseAtCreature(Creature* creature)
@@ -932,7 +726,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
sLog.outDebug("Create pet");
uint32 pet_number = objmgr.GeneratePetNumber();
- if(!Create(guid, creature->GetMap(), creature->GetEntry(), pet_number))
+ if(!Create(guid, creature->GetMap(), creature->GetPhaseMask(), creature->GetEntry(), pet_number))
return false;
Relocate(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation());
@@ -963,26 +757,20 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
setPowerType(POWER_FOCUS);
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0);
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
- SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(creature->getLevel()))/4));
- SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
+ SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(creature->getLevel())/4);
SetUInt32Value(UNIT_NPC_FLAGS, 0);
- CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family);
- if( char* familyname = cFamily->Name[sWorld.GetDefaultDbcLocale()] )
- SetName(familyname);
+ if(CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family))
+ SetName(cFamily->Name[sWorld.GetDefaultDbcLocale()]);
else
- SetName(creature->GetName());
+ SetName(creature->GetNameForLocaleIdx(objmgr.GetDBCLocaleIndex()));
- m_loyaltyPoints = 1000;
if(cinfo->type == CREATURE_TYPE_BEAST)
{
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED);
-
- SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED) );
- SetLoyaltyLevel(REBELLIOUS);
+ SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED));
}
return true;
}
@@ -1111,8 +899,8 @@ bool Pet::InitStatsForLevel(uint32 petlevel)
}
case HUNTER_PET:
{
- SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(petlevel))/4));
-
+ SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(petlevel)/4);
+ learnLevelupSpells();
//these formula may not be correct; however, it is designed to be close to what it should be
//this makes dps 0.5 of pets level
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - (petlevel / 4)) );
@@ -1304,7 +1092,7 @@ void Pet::_SaveSpellCooldowns()
void Pet::_LoadSpells()
{
- QueryResult *result = CharacterDatabase.PQuery("SELECT spell,slot,active FROM pet_spell WHERE guid = '%u'",m_charmInfo->GetPetNumber());
+ QueryResult *result = CharacterDatabase.PQuery("SELECT spell,active FROM pet_spell WHERE guid = '%u'",m_charmInfo->GetPetNumber());
if(result)
{
@@ -1312,7 +1100,7 @@ void Pet::_LoadSpells()
{
Field *fields = result->Fetch();
- addSpell(fields[0].GetUInt16(), fields[2].GetUInt16(), PETSPELL_UNCHANGED, fields[1].GetUInt16());
+ addSpell(fields[0].GetUInt32(), fields[1].GetUInt16(), PETSPELL_UNCHANGED);
}
while( result->NextRow() );
@@ -1329,7 +1117,7 @@ void Pet::_SaveSpells()
if (itr->second->state == PETSPELL_REMOVED || itr->second->state == PETSPELL_CHANGED)
CharacterDatabase.PExecute("DELETE FROM pet_spell WHERE guid = '%u' and spell = '%u'", m_charmInfo->GetPetNumber(), itr->first);
if (itr->second->state == PETSPELL_NEW || itr->second->state == PETSPELL_CHANGED)
- CharacterDatabase.PExecute("INSERT INTO pet_spell (guid,spell,slot,active) VALUES ('%u', '%u', '%u','%u')", m_charmInfo->GetPetNumber(), itr->first, itr->second->slotId,itr->second->active);
+ CharacterDatabase.PExecute("INSERT INTO pet_spell (guid,spell,active) VALUES ('%u', '%u', '%u')", m_charmInfo->GetPetNumber(), itr->first, itr->second->active);
if (itr->second->state == PETSPELL_REMOVED)
_removeSpell(itr->first);
@@ -1344,10 +1132,6 @@ void Pet::_LoadAuras(uint32 timediff)
for (int i = 0; i < TOTAL_AURAS; i++)
m_modAuras[i].clear();
- // all aura related fields
- for(int i = UNIT_FIELD_AURA; i <= UNIT_FIELD_AURASTATE; ++i)
- SetUInt32Value(i, 0);
-
QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber());
if(result)
@@ -1451,7 +1235,7 @@ void Pet::_SaveAuras()
{
CharacterDatabase.PExecute("INSERT INTO pet_aura (guid,caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges) "
"VALUES ('%u', '" I64FMTD "', '%u', '%u', '%u', '%d', '%d', '%d', '%d')",
- m_charmInfo->GetPetNumber(), itr2->second->GetCasterGUID(),(uint32)itr2->second->GetId(), (uint32)itr2->second->GetEffIndex(), (uint32)itr2->second->GetStackAmount(), itr2->second->GetModifier()->m_amount,int(itr2->second->GetAuraMaxDuration()),int(itr2->second->GetAuraDuration()),int(itr2->second->m_procCharges));
+ m_charmInfo->GetPetNumber(), itr2->second->GetCasterGUID(),(uint32)itr2->second->GetId(), (uint32)itr2->second->GetEffIndex(), (uint32)itr2->second->GetStackAmount(), itr2->second->GetModifier()->m_amount ,int(itr2->second->GetAuraMaxDuration()),int(itr2->second->GetAuraDuration()),int(itr2->second->GetAuraCharges()));
}
}
}
@@ -1469,7 +1253,7 @@ void Pet::_SaveAuras()
}
}
-bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 slot_id, PetSpellType type)
+bool Pet::addSpell(uint32 spell_id, uint16 active, PetSpellState state, PetSpellType type)
{
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
if (!spellInfo)
@@ -1488,7 +1272,7 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s
// same spells don't have autocast option
if (spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET)
- active = ACT_CAST;
+ active = ACT_ENABLED;
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr != m_spells.end())
@@ -1525,40 +1309,45 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s
else
newspell->active = active;
- uint32 chainstart = spellmgr.GetFirstSpellInChain(spell_id);
-
- for (PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
+ // talent: unlearn all other talent ranks (high and low)
+ if(TalentSpellPos const* talentPos = GetTalentSpellPos(spell_id))
{
- if(itr->second->state == PETSPELL_REMOVED) continue;
-
- if(spellmgr.GetFirstSpellInChain(itr->first) == chainstart)
+ if(TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentPos->talent_id ))
{
- slot_id = itr->second->slotId;
- newspell->active = itr->second->active;
-
- if(newspell->active == ACT_ENABLED)
- ToggleAutocast(itr->first, false);
+ for(int i=0; i <5; ++i)
+ {
+ // skip learning spell and no rank spell case
+ uint32 rankSpellId = talentInfo->RankID[i];
+ if(!rankSpellId || rankSpellId==spell_id)
+ continue;
- oldspell_id = itr->first;
- removeSpell(itr->first);
+ // skip unknown ranks
+ if(!HasSpell(rankSpellId))
+ continue;
+ removeSpell(rankSpellId);
+ }
}
}
-
- uint16 tmpslot=slot_id;
-
- if (tmpslot == 0xffff)
+ else if(uint32 chainstart = spellmgr.GetFirstSpellInChain(spell_id))
{
- uint16 maxid = 0;
- PetSpellMap::iterator itr;
- for (itr = m_spells.begin(); itr != m_spells.end(); ++itr)
+ for (PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
{
if(itr->second->state == PETSPELL_REMOVED) continue;
- if (itr->second->slotId > maxid) maxid = itr->second->slotId;
+
+ if(spellmgr.GetFirstSpellInChain(itr->first) == chainstart)
+ {
+ newspell->active = itr->second->active;
+
+ if(newspell->active == ACT_ENABLED)
+ ToggleAutocast(itr->first, false);
+
+ oldspell_id = itr->first;
+ unlearnSpell(itr->first);
+ break;
+ }
}
- tmpslot = maxid + 1;
}
- newspell->slotId = tmpslot;
m_spells[spell_id] = newspell;
if (IsPassiveSpell(spell_id))
@@ -1569,29 +1358,81 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s
if(newspell->active == ACT_ENABLED)
ToggleAutocast(spell_id, true);
+ uint32 talentCost = GetTalentSpellCost(spell_id);
+ if (talentCost)
+ {
+ int32 free_points = GetMaxTalentPointsForLevel(getLevel());
+ m_usedTalentCount+=talentCost;
+ // update free talent points
+ free_points-=m_usedTalentCount;
+ SetFreeTalentPoints(free_points > 0 ? free_points : 0);
+ }
return true;
}
-bool Pet::learnSpell(uint16 spell_id)
+bool Pet::learnSpell(uint32 spell_id)
{
// prevent duplicated entires in spell book
if (!addSpell(spell_id))
return false;
Unit* owner = GetOwner();
- if(owner->GetTypeId()==TYPEID_PLAYER)
+ if(owner && owner->GetTypeId() == TYPEID_PLAYER)
+ {
+ if(!m_loading)
+ {
+ WorldPacket data(SMSG_PET_LEARNED_SPELL, 2);
+ data << uint16(spell_id);
+ ((Player*)owner)->GetSession()->SendPacket(&data);
+ }
((Player*)owner)->PetSpellInitialize();
+ }
return true;
}
-void Pet::removeSpell(uint16 spell_id)
+void Pet::learnLevelupSpells()
+{
+ PetLevelupSpellSet const *levelupSpells = spellmgr.GetPetLevelupSpellList(GetCreatureInfo()->family);
+ if(!levelupSpells)
+ return;
+
+ uint32 level = getLevel();
+
+ for(PetLevelupSpellSet::const_iterator itr = levelupSpells->begin(); itr != levelupSpells->end(); ++itr)
+ {
+ if(itr->first <= level)
+ learnSpell(itr->second);
+ else
+ unlearnSpell(itr->second);
+ }
+}
+
+bool Pet::unlearnSpell(uint32 spell_id)
+{
+ if(removeSpell(spell_id))
+ {
+ if(GetOwner()->GetTypeId() == TYPEID_PLAYER)
+ {
+ if(!m_loading)
+ {
+ WorldPacket data(SMSG_PET_REMOVED_SPELL, 2);
+ data << uint16(spell_id);
+ ((Player*)GetOwner())->GetSession()->SendPacket(&data);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+bool Pet::removeSpell(uint32 spell_id)
{
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr == m_spells.end())
- return;
+ return false;
if(itr->second->state == PETSPELL_REMOVED)
- return;
+ return false;
if(itr->second->state == PETSPELL_NEW)
{
@@ -1602,9 +1443,23 @@ void Pet::removeSpell(uint16 spell_id)
itr->second->state = PETSPELL_REMOVED;
RemoveAurasDueToSpell(spell_id);
+
+ uint32 talentCost = GetTalentSpellCost(spell_id);
+ if (talentCost > 0)
+ {
+ if (m_usedTalentCount > talentCost)
+ m_usedTalentCount-=talentCost;
+ else
+ m_usedTalentCount = 0;
+ // update free talent points
+ int32 free_points = GetMaxTalentPointsForLevel(getLevel()) - m_usedTalentCount;
+ SetFreeTalentPoints(free_points > 0 ? free_points : 0);
+ }
+
+ return true;
}
-bool Pet::_removeSpell(uint16 spell_id)
+bool Pet::_removeSpell(uint32 spell_id)
{
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr != m_spells.end())
@@ -1620,8 +1475,11 @@ void Pet::InitPetCreateSpells()
{
m_charmInfo->InitPetActionBar();
+ for (PetSpellMap::iterator i = m_spells.begin(); i != m_spells.end(); ++i)
+ delete i->second;
m_spells.clear();
- int32 usedtrainpoints = 0, petspellid;
+
+ uint32 petspellid;
PetCreateSpellEntry const* CreateSpells = objmgr.GetPetCreateSpellEntry(GetEntry());
if(CreateSpells)
{
@@ -1641,7 +1499,7 @@ void Pet::InitPetCreateSpells()
if(owner->GetTypeId() == TYPEID_PLAYER && !((Player*)owner)->HasSpell(learn_spellproto->Id))
{
if(IsPassiveSpell(petspellid)) //learn passive skills when tamed, not sure if thats right
- ((Player*)owner)->learnSpell(learn_spellproto->Id);
+ ((Player*)owner)->learnSpell(learn_spellproto->Id,false);
else
AddTeachSpell(learn_spellproto->EffectTriggerSpell[0], learn_spellproto->Id);
}
@@ -1650,23 +1508,12 @@ void Pet::InitPetCreateSpells()
petspellid = learn_spellproto->Id;
addSpell(petspellid);
-
- SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(learn_spellproto->EffectTriggerSpell[0]);
- SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(learn_spellproto->EffectTriggerSpell[0]);
-
- for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
- {
- usedtrainpoints += _spell_idx->second->reqtrainpoints;
- break;
- }
}
}
LearnPetPassives();
CastPetAuras(false);
-
- SetTP(-usedtrainpoints);
}
void Pet::CheckLearning(uint32 spellid)
@@ -1686,11 +1533,115 @@ void Pet::CheckLearning(uint32 spellid)
if(urand(0, 100) < 10)
{
- ((Player*)owner)->learnSpell(itr->second);
+ ((Player*)owner)->learnSpell(itr->second,false);
m_teachspells.erase(itr);
}
}
+bool Pet::resetTalents(bool no_cost)
+{
+ Unit *owner = GetOwner();
+ if (!owner || owner->GetTypeId()!=TYPEID_PLAYER)
+ return false;
+
+ CreatureInfo const * ci = GetCreatureInfo();
+ if(!ci)
+ return false;
+ // Check pet talent type
+ CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
+ if(!pet_family || pet_family->petTalentType < 0)
+ return false;
+
+ Player *player = (Player *)owner;
+
+ uint32 level = getLevel();
+ uint32 talentPointsForLevel = GetMaxTalentPointsForLevel(level);
+
+ if (m_usedTalentCount == 0)
+ {
+ SetFreeTalentPoints(talentPointsForLevel);
+ return false;
+ }
+
+ uint32 cost = 0;
+
+ if(!no_cost)
+ {
+ cost = resetTalentsCost();
+
+ if (player->GetMoney() < cost)
+ {
+ player->SendBuyError( BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);
+ return false;
+ }
+ }
+
+ for (unsigned int i = 0; i < sTalentStore.GetNumRows(); i++)
+ {
+ TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
+
+ if (!talentInfo) continue;
+
+ TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentInfo->TalentTab );
+
+ if(!talentTabInfo)
+ continue;
+
+ // unlearn only talents for pets family talent type
+ if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
+ continue;
+
+ for (int j = 0; j < 5; j++)
+ {
+ for(PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
+ {
+ if(itr->second->state == PETSPELL_REMOVED)
+ {
+ ++itr;
+ continue;
+ }
+ // remove learned spells (all ranks)
+ uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
+
+ // unlearn if first rank is talent or learned by talent
+ if (itrFirstId == talentInfo->RankID[j] || spellmgr.IsSpellLearnToSpell(talentInfo->RankID[j],itrFirstId))
+ {
+ removeSpell(itr->first);
+ itr = m_spells.begin();
+ continue;
+ }
+ else
+ ++itr;
+ }
+ }
+ }
+
+ SetFreeTalentPoints(talentPointsForLevel);
+
+ if(!no_cost)
+ {
+ player->ModifyMoney(-(int32)cost);
+
+ m_resetTalentsCost = cost;
+ m_resetTalentsTime = time(NULL);
+ }
+ player->PetSpellInitialize();
+ return true;
+}
+
+void Pet::InitTalentForLevel()
+{
+ uint32 level = getLevel();
+ uint32 talentPointsForLevel = GetMaxTalentPointsForLevel(level);
+ // Reset talents in case low level (on level down) or wrong points for level (hunter can unlearn TP increase talent)
+ if(talentPointsForLevel == 0 || m_usedTalentCount > talentPointsForLevel)
+ {
+ // Remove all talent points
+ resetTalents(true);
+ }
+ SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
+}
+
uint32 Pet::resetTalentsCost() const
{
uint32 days = (sWorld.GetGameTime() - m_resetTalentsTime)/DAY;
@@ -1709,6 +1660,15 @@ uint32 Pet::resetTalentsCost() const
return (m_resetTalentsCost + 1*GOLD > 10*GOLD ? 10*GOLD : m_resetTalentsCost + 1*GOLD);
}
+uint8 Pet::GetMaxTalentPointsForLevel(uint32 level)
+{
+ uint8 points = (level >= 20) ? ((level - 16) / 4) : 0;
+ // Mod points from owner SPELL_AURA_MOD_PET_TALENT_POINTS
+ if (Unit *owner = GetOwner())
+ points+=owner->GetTotalAuraModifier(SPELL_AURA_MOD_PET_TALENT_POINTS);
+ return points;
+}
+
void Pet::ToggleAutocast(uint32 spellid, bool apply)
{
if(IsPassiveSpell(spellid))
@@ -1719,13 +1679,15 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
// && tempSpell->EffectImplicitTargetA[0] != TARGET_CHAIN_DAMAGE)
// return;
- PetSpellMap::const_iterator itr = m_spells.find((uint16)spellid);
+ PetSpellMap::const_iterator itr = m_spells.find(spellid);
int i;
if(apply)
{
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++);
+ for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++)
+ ; // just search
+
if (i == m_autospells.size())
{
m_autospells.push_back(spellid);
@@ -1736,7 +1698,9 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
else
{
AutoSpellList::iterator itr2 = m_autospells.begin();
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++, itr2++);
+ for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++, itr2++)
+ ; // just search
+
if (i < m_autospells.size())
{
m_autospells.erase(itr2);
@@ -1746,10 +1710,11 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
}
}
-bool Pet::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number)
+bool Pet::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
{
SetMapId(map->GetId());
SetInstanceId(map->GetInstanceId());
+ SetPhaseMask(phaseMask,false);
Object::_Create(guidlow, pet_number, HIGHGUID_PET);
@@ -1759,8 +1724,7 @@ bool Pet::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number)
if(!InitEntry(Entry))
return false;
- SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
+ SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
if(getPetType() == MINI_PET) // always non-attackable
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -1770,7 +1734,8 @@ bool Pet::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number)
bool Pet::HasSpell(uint32 spell) const
{
- return (m_spells.find(spell) != m_spells.end());
+ PetSpellMap::const_iterator itr = m_spells.find(spell);
+ return (itr != m_spells.end() && itr->second->state != PETSPELL_REMOVED );
}
// Get all passive spells in our skill line
@@ -1791,7 +1756,7 @@ void Pet::LearnPetPassives()
// Passive 01~10, Passive 00 (20782, not used), Ferocious Inspiration (34457)
// Scale 01~03 (34902~34904, bonus from owner, not used)
for(PetFamilySpellsSet::const_iterator petSet = petStore->second.begin(); petSet != petStore->second.end(); ++petSet)
- addSpell(*petSet, ACT_DECIDE, PETSPELL_NEW, 0xffff, PETSPELL_FAMILY);
+ addSpell(*petSet, ACT_DECIDE, PETSPELL_NEW, PETSPELL_FAMILY);
}
}
diff --git a/src/game/Pet.h b/src/game/Pet.h
index d55c467826a..71eeed483e1 100644
--- a/src/game/Pet.h
+++ b/src/game/Pet.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -53,16 +53,6 @@ enum HappinessState
HAPPY = 3
};
-enum LoyaltyLevel
-{
- REBELLIOUS = 1,
- UNRULY = 2,
- SUBMISSIVE = 3,
- DEPENDABLE = 4,
- FAITHFUL = 5,
- BEST_FRIEND = 6
-};
-
enum PetSpellState
{
PETSPELL_UNCHANGED = 0,
@@ -79,7 +69,6 @@ enum PetSpellType
struct PetSpell
{
- uint16 slotId;
uint16 active;
PetSpellState state : 16;
@@ -117,15 +106,12 @@ enum PetNameInvalidReason
PET_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 16
};
-typedef UNORDERED_MAP<uint16, PetSpell*> PetSpellMap;
+typedef UNORDERED_MAP<uint32, PetSpell*> PetSpellMap;
typedef std::map<uint32,uint32> TeachSpellMap;
typedef std::vector<uint32> AutoSpellList;
#define HAPPINESS_LEVEL_SIZE 333000
-extern const uint32 LevelUpLoyalty[6];
-extern const uint32 LevelStartLoyalty[6];
-
#define ACTIVE_SPELLS_MAX 4
#define OWNER_MAX_DISTANCE 100
@@ -147,9 +133,9 @@ class Pet : public Creature
bool isControlled() const { return getPetType()==SUMMON_PET || getPetType()==HUNTER_PET; }
bool isTemporarySummoned() const { return m_duration > 0; }
- bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number);
+ bool Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number);
bool CreateBaseAtCreature(Creature* creature);
- bool LoadPetFromDB( Unit* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false );
+ bool LoadPetFromDB( Player* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false );
void SavePetToDB(PetSaveMode mode);
void Remove(PetSaveMode mode, bool returnreagent = false);
static void DeleteFromDB(uint32 guidlow);
@@ -168,14 +154,7 @@ class Pet : public Creature
void RegenerateFocus();
void LooseHappiness();
- void TickLoyaltyChange();
- void ModifyLoyalty(int32 addvalue);
HappinessState GetHappinessState();
- uint32 GetMaxLoyaltyPoints(uint32 level);
- uint32 GetStartLoyaltyPoints(uint32 level);
- void KillLoyaltyBonus(uint32 level);
- uint32 GetLoyaltyLevel() { return GetByteValue(UNIT_FIELD_BYTES_1, 1); }
- void SetLoyaltyLevel(LoyaltyLevel level);
void GivePetXP(uint32 xp);
void GivePetLevel(uint32 level);
bool InitStatsForLevel(uint32 level);
@@ -195,10 +174,8 @@ class Pet : public Creature
void UpdateAttackPowerAndDamage(bool ranged = false);
void UpdateDamagePhysical(WeaponAttackType attType);
- bool CanTakeMoreActiveSpells(uint32 SpellIconID);
- void ToggleAutocast(uint32 spellid, bool apply);
- bool HasTPForSpell(uint32 spellid);
- int32 GetTPForSpell(uint32 spellid);
+ bool CanTakeMoreActiveSpells(uint32 SpellIconID);
+ void ToggleAutocast(uint32 spellid, bool apply);
bool HasSpell(uint32 spell) const;
void AddTeachSpell(uint32 learned_id, uint32 source_id) { m_teachspells[learned_id] = source_id; }
@@ -214,10 +191,12 @@ class Pet : public Creature
void _LoadSpells();
void _SaveSpells();
- bool addSpell(uint16 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, uint16 slot_id=0xffff, PetSpellType type = PETSPELL_NORMAL);
- bool learnSpell(uint16 spell_id);
- void removeSpell(uint16 spell_id);
- bool _removeSpell(uint16 spell_id);
+ bool addSpell(uint32 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, PetSpellType type = PETSPELL_NORMAL);
+ bool learnSpell(uint32 spell_id);
+ void learnLevelupSpells();
+ bool unlearnSpell(uint32 spell_id);
+ bool removeSpell(uint32 spell_id);
+ bool _removeSpell(uint32 spell_id);
PetSpellMap m_spells;
TeachSpellMap m_teachspells;
@@ -225,32 +204,33 @@ class Pet : public Creature
void InitPetCreateSpells();
void CheckLearning(uint32 spellid);
+
+ bool resetTalents(bool no_cost = false);
uint32 resetTalentsCost() const;
+ void InitTalentForLevel();
- void SetTP(int32 TP);
- int32 GetDispTP();
+ uint8 GetMaxTalentPointsForLevel(uint32 level);
+ uint8 GetFreeTalentPoints() { return GetByteValue(UNIT_FIELD_BYTES_1, 1); }
+ void SetFreeTalentPoints(uint8 points) { SetByteValue(UNIT_FIELD_BYTES_1, 1, points); }
- int32 m_TrainingPoints;
uint32 m_resetTalentsCost;
time_t m_resetTalentsTime;
+ uint32 m_usedTalentCount;
- uint64 GetAuraUpdateMask() { return m_auraUpdateMask; }
- void SetAuraUpdateMask(uint8 slot) { m_auraUpdateMask |= (uint64(1) << slot); }
- void UnsetAuraUpdateMask(uint8 slot) { m_auraUpdateMask &= ~(uint64(1) << slot); }
- void ResetAuraUpdateMask() { m_auraUpdateMask = 0; }
+ const uint64& GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; }
+ void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); }
+ void ResetAuraUpdateMaskForRaid() { m_auraRaidUpdateMask = 0; }
DeclinedName const* GetDeclinedNames() const { return m_declinedname; }
bool m_removed; // prevent overwrite pet state in DB at next Pet::Update if pet already removed(saved)
protected:
- uint32 m_regenTimer;
uint32 m_happinessTimer;
- uint32 m_loyaltyTimer;
PetType m_petType;
int32 m_duration; // time until unsummon (used mostly for summoned guardians and not used for controlled pets)
- int32 m_loyaltyPoints;
int32 m_bonusdamage;
- uint64 m_auraUpdateMask;
+ uint64 m_auraRaidUpdateMask;
+ bool m_loading;
DeclinedName *m_declinedname;
diff --git a/src/game/PetAI.cpp b/src/game/PetAI.cpp
index f841d83fdb0..9685b71a934 100644
--- a/src/game/PetAI.cpp
+++ b/src/game/PetAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -139,11 +139,11 @@ void PetAI::UpdateAI(const uint32 diff)
else
m_updateAlliesTimer -= diff;
- if (inCombat && i_pet.getVictim() == NULL)
+ if (inCombat && !i_pet.getVictim())
_stopAttack();
// i_pet.getVictim() can't be used for check in case stop fighting, i_pet.getVictim() clear at Unit death etc.
- if( i_pet.getVictim() != NULL )
+ if( i_pet.getVictim() )
{
if( _needToStop() )
{
diff --git a/src/game/PetAI.h b/src/game/PetAI.h
index 017627d73f0..82f143e725e 100644
--- a/src/game/PetAI.h
+++ b/src/game/PetAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp
index 05c889b8cf9..17c2ba4275b 100644
--- a/src/game/PetHandler.cpp
+++ b/src/game/PetHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -106,7 +106,7 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
}
// only place where pet can be player
pet->clearUnitState(UNIT_STAT_FOLLOW);
- uint64 selguid = _player->GetSelection();
+ const uint64& selguid = _player->GetSelection();
Unit *TargetUnit = ObjectAccessor::GetUnit(*_player, selguid);
if(!TargetUnit)
return;
@@ -118,27 +118,35 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
//if(!pet->IsWithinLOSInMap(TargetUnit))
// return;
- if(pet->GetTypeId() != TYPEID_PLAYER)
+ // This is true if pet has no target or has target but targets differs.
+ if(pet->getVictim() != TargetUnit)
{
- if (((Creature*)pet)->AI())
- ((Creature*)pet)->AI()->AttackStart(TargetUnit);
+ if (pet->getVictim())
+ pet->AttackStop();
- //10% chance to play special pet attack talk, else growl
- if(((Creature*)pet)->isPet() && ((Pet*)pet)->getPetType() == SUMMON_PET && pet != TargetUnit && urand(0, 100) < 10)
- pet->SendPetTalk((uint32)PET_TALK_ATTACK);
- else
+ if(pet->GetTypeId() != TYPEID_PLAYER)
{
- // 90% chance for pet and 100% chance for charmed creature
- pet->SendPetAIReaction(guid1);
+ pet->GetMotionMaster()->Clear();
+ if (((Creature*)pet)->AI())
+ ((Creature*)pet)->AI()->AttackStart(TargetUnit);
+
+ //10% chance to play special pet attack talk, else growl
+ if(((Creature*)pet)->isPet() && ((Pet*)pet)->getPetType() == SUMMON_PET && pet != TargetUnit && urand(0, 100) < 10)
+ pet->SendPetTalk((uint32)PET_TALK_ATTACK);
+ else
+ {
+ // 90% chance for pet and 100% chance for charmed creature
+ pet->SendPetAIReaction(guid1);
+ }
}
- }
- else // charmed player
- {
- if(pet->getVictim() && pet->getVictim() != TargetUnit)
- pet->AttackStop();
+ else // charmed player
+ {
+ if(pet->getVictim() && pet->getVictim() != TargetUnit)
+ pet->AttackStop();
- pet->Attack(TargetUnit,true);
- pet->SendPetAIReaction(guid1);
+ pet->Attack(TargetUnit,true);
+ pet->SendPetAIReaction(guid1);
+ }
}
break;
}
@@ -169,19 +177,17 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
break;
}
break;
- case ACT_DISABLED: //0x8100 spell (disabled), ignore
- case ACT_CAST: //0x0100
- case ACT_ENABLED: //0xc100 spell
+ case ACT_DISABLED: // 0x8100 spell (disabled), ignore
+ case ACT_PASSIVE: // 0x0100
+ case ACT_ENABLED: // 0xC100 spell
{
- Unit* unit_target;
- if(guid2)
- unit_target = ObjectAccessor::GetUnit(*_player,guid2);
- else
- unit_target = NULL;
-
+ Unit* unit_target = NULL;
if (((Creature*)pet)->GetGlobalCooldown() > 0)
return;
+ if(guid2)
+ unit_target = ObjectAccessor::GetUnit(*_player,guid2);
+
// do not cast unknown spells
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellid );
if(!spellInfo)
@@ -206,7 +212,7 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
int16 result = spell->PetCanCast(unit_target);
- //auto turn to target unless possessed
+ //auto turn to target unless possessed
if(result == SPELL_FAILED_UNIT_NOT_INFRONT && !pet->isPossessed())
{
pet->SetInFront(unit_target);
@@ -237,12 +243,15 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
if( unit_target && !GetPlayer()->IsFriendlyTo(unit_target) && !pet->isPossessed())
{
- pet->clearUnitState(UNIT_STAT_FOLLOW);
- if(pet->getVictim())
- pet->AttackStop();
- pet->GetMotionMaster()->Clear();
- if (((Creature*)pet)->AI())
- ((Creature*)pet)->AI()->AttackStart(unit_target);
+ // This is true if pet has no target or has target but targets differs.
+ if (pet->getVictim() != unit_target)
+ {
+ if (pet->getVictim())
+ pet->AttackStop();
+ pet->GetMotionMaster()->Clear();
+ if (((Creature*)pet)->AI())
+ ((Creature*)pet)->AI()->AttackStart(unit_target);
+ }
}
spell->prepare(&(spell->m_targets));
@@ -252,15 +261,12 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
if(pet->isPossessed())
{
WorldPacket data(SMSG_CAST_FAILED, (4+1+1));
- data << uint32(spellid) << uint8(2) << uint8(result);
+ data << uint8(0) << uint32(spellid) << uint8(result);
switch (result)
{
case SPELL_FAILED_REQUIRES_SPELL_FOCUS:
data << uint32(spellInfo->RequiresSpellFocus);
break;
- case SPELL_FAILED_REQUIRES_AREA:
- data << uint32(spellInfo->AreaId);
- break;
}
SendPacket(&data);
}
@@ -297,7 +303,7 @@ void WorldSession::HandlePetNameQuery( WorldPacket & recv_data )
void WorldSession::SendPetNameQuery( uint64 petguid, uint32 petnumber)
{
- Creature* pet = ObjectAccessor::GetCreatureOrPet(*_player, petguid);
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, petguid);
if(!pet || !pet->GetCharmInfo() || pet->GetCharmInfo()->GetPetNumber() != petnumber)
return;
@@ -339,7 +345,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
if(ObjectAccessor::FindPlayer(petguid))
return;
- Creature* pet = ObjectAccessor::GetCreatureOrPet(*_player, petguid);
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, petguid);
if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm()))
{
@@ -364,7 +370,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
sLog.outDetail( "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X\n", _player->GetName(), position, spell_id, act_state);
//if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
- if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_CAST) && spell_id && !pet->HasSpell(spell_id)))
+ if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
{
//sign for autocast
if(act_state == ACT_ENABLED && spell_id)
@@ -476,7 +482,7 @@ void WorldSession::HandlePetAbandon( WorldPacket & recv_data )
sLog.outDetail( "HandlePetAbandon. CMSG_PET_ABANDON pet guid is %u", GUID_LOPART(guid) );
// pet/charmed
- Creature* pet = ObjectAccessor::GetCreatureOrPet(*_player, guid);
+ Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid);
if(pet)
{
if(pet->isPet())
@@ -500,11 +506,11 @@ void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket)
sLog.outDetail("CMSG_PET_UNLEARN");
uint64 guid;
- recvPacket >> guid;
+ recvPacket >> guid; // Pet guid
Pet* pet = _player->GetPet();
- if(!pet || pet->getPetType() != HUNTER_PET || pet->m_spells.size() <= 1)
+ if(!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
return;
if(guid != pet->GetGUID())
@@ -519,38 +525,7 @@ void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket)
sLog.outError("WorldSession::HandlePetUnlearnOpcode: object "I64FMTD" is considered pet-like but doesn't have a charminfo!", pet->GetGUID());
return;
}
-
- uint32 cost = pet->resetTalentsCost();
-
- if (GetPlayer()->GetMoney() < cost)
- {
- GetPlayer()->SendBuyError( BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);
- return;
- }
-
- for(PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end();)
- {
- uint32 spell_id = itr->first; // Pet::removeSpell can invalidate iterator at erase NEW spell
- ++itr;
- pet->removeSpell(spell_id);
- }
-
- pet->SetTP(pet->getLevel() * (pet->GetLoyaltyLevel() - 1));
-
- for(uint8 i = 0; i < 10; i++)
- {
- if(charmInfo->GetActionBarEntry(i)->SpellOrAction && charmInfo->GetActionBarEntry(i)->Type == ACT_ENABLED || charmInfo->GetActionBarEntry(i)->Type == ACT_DISABLED)
- charmInfo->GetActionBarEntry(i)->SpellOrAction = 0;
- }
-
- // relearn pet passives
- pet->LearnPetPassives();
-
- pet->m_resetTalentsTime = time(NULL);
- pet->m_resetTalentsCost = cost;
- GetPlayer()->ModifyMoney(-(int32)cost);
-
- GetPlayer()->PetSpellInitialize();
+ pet->resetTalents();
}
void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket )
@@ -570,7 +545,7 @@ void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket )
if(ObjectAccessor::FindPlayer(guid))
return;
- Creature* pet=ObjectAccessor::GetCreatureOrPet(*_player,guid);
+ Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid);
if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm()))
{
@@ -606,11 +581,15 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
{
sLog.outDetail("WORLD: CMSG_PET_CAST_SPELL");
- CHECK_PACKET_SIZE(recvPacket,8+4);
+ CHECK_PACKET_SIZE(recvPacket,8+1+4+1);
uint64 guid;
uint32 spellid;
+ uint8 cast_count;
+ uint8 unk_flags; // flags (if 0x02 - some additional data are received)
+
+ recvPacket >> guid >> cast_count >> spellid >> unk_flags;
- recvPacket >> guid >> spellid;
+ sLog.outDebug("WORLD: CMSG_PET_CAST_SPELL, cast_count: %u, spellid %u, unk_flags %u", cast_count, spellid, unk_flags);
// This opcode is also sent from charmed and possessed units (players and creatures)
if(!_player->GetPet() && !_player->GetCharm())
@@ -645,6 +624,7 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
caster->clearUnitState(UNIT_STAT_FOLLOW);
Spell *spell = new Spell(caster, spellInfo, false);
+ spell->m_cast_count = cast_count; // probably pending spell cast
spell->m_targets = targets;
int16 result = spell->PetCanCast(NULL);
@@ -704,3 +684,128 @@ void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, Dec
SendPacket(&data);
}
+void WorldSession::HandlePetLearnTalent( WorldPacket & recv_data )
+{
+ sLog.outDebug("WORLD: CMSG_PET_LEARN_TALENT");
+ recv_data.hexlike();
+
+ CHECK_PACKET_SIZE(recv_data, 8+4+4);
+
+ uint64 guid;
+ uint32 talent_id, requested_rank;
+ recv_data >> guid >> talent_id >> requested_rank;
+
+ Pet *pet = _player->GetPet();
+
+ if(!pet)
+ return;
+
+ if(guid != pet->GetGUID())
+ return;
+
+ uint32 CurTalentPoints = pet->GetFreeTalentPoints();
+
+ if(CurTalentPoints == 0)
+ return;
+
+ if (requested_rank > 4)
+ return;
+
+ TalentEntry const *talentInfo = sTalentStore.LookupEntry(talent_id);
+
+ if(!talentInfo)
+ return;
+
+ TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
+
+ if(!talentTabInfo)
+ return;
+
+ CreatureInfo const *ci = pet->GetCreatureInfo();
+
+ if(!ci)
+ return;
+
+ CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
+
+ if(!pet_family)
+ return;
+
+ if(pet_family->petTalentType < 0) // not hunter pet
+ return;
+
+ // prevent learn talent for different family (cheating)
+ if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
+ return;
+
+ // prevent skip talent ranks (cheating)
+ if(requested_rank > 0 && !pet->HasSpell(talentInfo->RankID[requested_rank-1]))
+ return;
+
+ // Check if it requires another talent
+ if (talentInfo->DependsOn > 0)
+ {
+ if(TalentEntry const *depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
+ {
+ bool hasEnoughRank = false;
+ for (int i = talentInfo->DependsOnRank; i <= 4; i++)
+ {
+ if (depTalentInfo->RankID[i] != 0)
+ if (pet->HasSpell(depTalentInfo->RankID[i]))
+ hasEnoughRank = true;
+ }
+ if (!hasEnoughRank)
+ return;
+ }
+ }
+
+ // Find out how many points we have in this field
+ uint32 spentPoints = 0;
+
+ uint32 tTab = talentInfo->TalentTab;
+ if (talentInfo->Row > 0)
+ {
+ unsigned int numRows = sTalentStore.GetNumRows();
+ for (unsigned int i = 0; i < numRows; i++) // Loop through all talents.
+ {
+ // Someday, someone needs to revamp
+ const TalentEntry *tmpTalent = sTalentStore.LookupEntry(i);
+ if (tmpTalent) // the way talents are tracked
+ {
+ if (tmpTalent->TalentTab == tTab)
+ {
+ for (int j = 0; j <= 4; j++)
+ {
+ if (tmpTalent->RankID[j] != 0)
+ {
+ if (pet->HasSpell(tmpTalent->RankID[j]))
+ {
+ spentPoints += j + 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // not have required min points spent in talent tree
+ if(spentPoints < (talentInfo->Row * 3))
+ return;
+
+ // spell not set in talent.dbc
+ uint32 spellid = talentInfo->RankID[requested_rank];
+ if( spellid == 0 )
+ {
+ sLog.outError("Talent.dbc have for talent: %u Rank: %u spell id = 0", talent_id, requested_rank);
+ return;
+ }
+
+ // already known
+ if(pet->HasSpell(spellid))
+ return;
+
+ // learn! (other talent ranks will unlearned at learning)
+ pet->learnSpell(spellid);
+ sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talent_id, requested_rank, spellid);
+}
diff --git a/src/game/PetitionsHandler.cpp b/src/game/PetitionsHandler.cpp
index 7ae368140c7..87a8d512597 100644
--- a/src/game/PetitionsHandler.cpp
+++ b/src/game/PetitionsHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -199,9 +199,9 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data)
if(!charter)
return;
- charter->SetUInt32Value(ITEM_FIELD_ENCHANTMENT, charter->GetGUIDLow());
- // ITEM_FIELD_ENCHANTMENT is guild/arenateam id
- // ITEM_FIELD_ENCHANTMENT+1 is current signatures count (showed on item)
+ charter->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, charter->GetGUIDLow());
+ // ITEM_FIELD_ENCHANTMENT_1_1 is guild/arenateam id
+ // ITEM_FIELD_ENCHANTMENT_1_1+1 is current signatures count (showed on item)
charter->SetState(ITEM_CHANGED, _player);
_player->SendNewItem(charter, 1, true, false);
@@ -565,7 +565,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data)
// update signs count on charter, required testing...
//Item *item = _player->GetItemByGuid(petitionguid));
//if(item)
- // item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT+1, signs);
+ // item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1+1, signs);
// update for owner if online
if(Player *owner = objmgr.GetPlayer(ownerguid))
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 4114f4da4ac..fb5fcb3f089 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -64,6 +64,7 @@
#include "Spell.h"
#include "SocialMgr.h"
#include "GameEvent.h"
+#include "AchievementMgr.h"
#include <cmath>
@@ -132,7 +133,7 @@ PlayerTaxi::PlayerTaxi()
memset(m_taximask, 0, sizeof(m_taximask));
}
-void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 level)
+void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level)
{
// capital and taxi hub masks
switch(race)
@@ -149,6 +150,13 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 level)
case RACE_BLOODELF: SetTaximaskNode(82); break; // Blood Elf
case RACE_DRAENEI: SetTaximaskNode(94); break; // Draenei
}
+
+ switch(chrClass)
+ {
+ case CLASS_DEATH_KNIGHT: // TODO: figure out initial known nodes
+ break;
+ }
+
// new continent starting masks (It will be accessible only at new map)
switch(Player::TeamForRace(race))
{
@@ -188,7 +196,7 @@ void PlayerTaxi::AppendTaximaskTo( ByteBuffer& data, bool all )
}
}
-bool PlayerTaxi::LoadTaxiDestinationsFromString( const std::string& values )
+bool PlayerTaxi::LoadTaxiDestinationsFromString( const std::string& values, uint32 team )
{
ClearTaxiDestinations();
@@ -216,6 +224,10 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString( const std::string& values )
return false;
}
+ // can't load taxi path without mount set (quest taxi path?)
+ if(!objmgr.GetTaxiMount(GetTaxiSource(),team))
+ return false;
+
return true;
}
@@ -245,13 +257,22 @@ uint32 PlayerTaxi::GetCurrentTaxiPath() const
return path;
}
+std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi)
+{
+ ss << "'";
+ for(int i = 0; i < TaxiMaskSize; ++i)
+ ss << taxi.m_taximask[i] << " ";
+ ss << "'";
+ return ss;
+}
+
//== Player ====================================================
const int32 Player::ReputationRank_Length[MAX_REPUTATION_RANK] = {36000, 3000, 3000, 3000, 6000, 12000, 21000, 1000};
UpdateMask Player::updateVisualBits;
-Player::Player (WorldSession *session): Unit()
+Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
{
m_transport = 0;
@@ -280,6 +301,7 @@ Player::Player (WorldSession *session): Unit()
m_comboPoints = 0;
m_usedTalentCount = 0;
+ m_questRewardTalentCount = 0;
m_regenTimer = 0;
m_weaponChangeTimer = 0;
@@ -306,7 +328,7 @@ Player::Player (WorldSession *session): Unit()
// group is initialized in the reference constructor
SetGroupInvite(NULL);
m_groupUpdateMask = 0;
- m_auraUpdateMask = 0;
+ m_auraRaidUpdateMask = 0;
duel = NULL;
@@ -335,7 +357,7 @@ Player::Player (WorldSession *session): Unit()
m_regenTimer = 0;
m_weaponChangeTimer = 0;
m_breathTimer = 0;
- m_isunderwater = 0;
+ m_isunderwater = UNDERWATER_NONE;
m_isInWater = false;
m_drunkTimer = 0;
m_drunk = 0;
@@ -350,7 +372,7 @@ Player::Player (WorldSession *session): Unit()
m_bgBattleGroundID = 0;
for (int j=0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; j++)
{
- m_bgBattleGroundQueueID[j].bgQueueType = 0;
+ m_bgBattleGroundQueueID[j].bgQueueTypeId = BATTLEGROUND_QUEUE_NONE;
m_bgBattleGroundQueueID[j].invitedToInstance = 0;
}
m_bgTeam = 0;
@@ -362,6 +384,7 @@ Player::Player (WorldSession *session): Unit()
m_canParry = false;
m_canBlock = false;
m_canDualWield = false;
+ m_canTitanGrip = false;
m_ammoDPS = 0.0f;
m_temporaryUnsummonedPetNumber = 0;
@@ -406,6 +429,14 @@ Player::Player (WorldSession *session): Unit()
m_auraBaseMod[i][PCT_MOD] = 1.0f;
}
+ for (int i = 0; i < MAX_COMBAT_RATING; i++)
+ m_baseRatingValue[i] = 0;
+
+ m_baseSpellDamage = 0;
+ m_baseSpellHealing = 0;
+ m_baseFeralAP = 0;
+ m_baseManaRegen = 0;
+
// Honor System
m_lastHonorUpdateTime = time(NULL);
@@ -419,6 +450,8 @@ Player::Player (WorldSession *session): Unit()
//Default movement to run mode
m_unit_movement_flags = 0;
+ m_mover = NULL;
+
m_miniPet = 0;
m_bgAfkReportedTimer = 0;
m_contestedPvPTimer = 0;
@@ -428,6 +461,8 @@ Player::Player (WorldSession *session): Unit()
m_isActive = true;
m_farsightVision = false;
+
+ m_runes = NULL;
}
Player::~Player ()
@@ -472,6 +507,7 @@ Player::~Player ()
itr->second.save->RemovePlayer(this);
delete m_declinedname;
+ delete m_runes;
}
void Player::CleanupsBeforeDelete()
@@ -517,24 +553,8 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
uint8 powertype = cEntry->powerType;
- uint32 unitfield;
-
- switch(powertype)
- {
- case POWER_ENERGY:
- case POWER_MANA:
- unitfield = 0x00000000;
- break;
- case POWER_RAGE:
- unitfield = 0x00110000;
- break;
- default:
- sLog.outError("Invalid default powertype %u for player (class %u)",powertype,class_);
- return false;
- }
-
- SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE );
- SetFloatValue(UNIT_FIELD_COMBATREACH, DEFAULT_COMBAT_REACH );
+ SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE);
+ SetFloatValue(UNIT_FIELD_COMBATREACH, 1.5f);
switch(gender)
{
@@ -557,12 +577,13 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
uint32 RaceClassGender = ( race ) | ( class_ << 8 ) | ( gender << 16 );
SetUInt32Value(UNIT_FIELD_BYTES_0, ( RaceClassGender | ( powertype << 24 ) ) );
- SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_UNK5 );
- SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE );
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP );
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE );
+ SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_REGENERATE_POWER);
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
+ SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
- //-1 is default value
+ // -1 is default value
SetUInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1));
SetUInt32Value(PLAYER_BYTES, (skin | (face << 8) | (hairStyle << 16) | (hairColor << 24)));
@@ -574,6 +595,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt32Value( PLAYER_GUILD_TIMESTAMP, 0 );
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES, 0 ); // 0=disabled
+ SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES1, 0 ); // 0=disabled
SetUInt32Value( PLAYER_CHOSEN_TITLE, 0 );
SetUInt32Value( PLAYER_FIELD_KILLS, 0 );
SetUInt32Value( PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0 );
@@ -581,10 +603,20 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt32Value( PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0 );
// set starting level
+ uint32 start_level = getClass() != CLASS_DEATH_KNIGHT
+ ? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)
+ : sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
+
if (GetSession()->GetSecurity() >= SEC_MODERATOR)
- SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_GM_LEVEL));
- else
- SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL));
+ {
+ uint32 gm_level = sWorld.getConfig(CONFIG_START_GM_LEVEL);
+ if(gm_level > start_level)
+ start_level = gm_level;
+ }
+
+ SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
+
+ InitRunes();
SetUInt32Value (PLAYER_FIELD_COINAGE, sWorld.getConfig(CONFIG_START_PLAYER_MONEY));
SetUInt32Value (PLAYER_FIELD_HONOR_CURRENCY, sWorld.getConfig(CONFIG_START_HONOR_POINTS));
@@ -648,6 +680,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
// base stats and related field values
InitStatsForLevel();
InitTaxiNodesForLevel();
+ InitGlyphsForLevel();
InitTalentForLevel();
InitPrimaryProffesions(); // to max set before any spell added
@@ -660,8 +693,16 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetPower(POWER_MANA,GetMaxPower(POWER_MANA));
}
+ if(getPowerType() == POWER_RUNIC_POWER)
+ {
+ SetPower(POWER_RUNE, 8);
+ SetMaxPower(POWER_RUNE, 8);
+ SetPower(POWER_RUNIC_POWER, 0);
+ SetMaxPower(POWER_RUNIC_POWER, 1000);
+ }
+
// original spells
- learnDefaultSpells(true);
+ learnDefaultSpells();
// original action bar
std::list<uint16>::const_iterator action_itr[4];
@@ -703,6 +744,11 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
uint32 item_id = oEntry->ItemId[j];
+
+ // Hack for not existed item id in dbc 3.0.3
+ if(item_id==40582)
+ continue;
+
ItemPrototype const* iProto = objmgr.GetItemPrototype(item_id);
if(!iProto)
{
@@ -710,7 +756,9 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
continue;
}
- uint32 count = iProto->Stackable; // max stack by default (mostly 1)
+ // max stack by default (mostly 1), 1 for infinity stackable
+ uint32 count = iProto->Stackable > 0 ? uint32(iProto->Stackable) : 1;
+
if(iProto->Class==ITEM_CLASS_CONSUMABLE && iProto->SubClass==ITEM_SUBCLASS_FOOD)
{
switch(iProto->Spells[0].SpellCategory)
@@ -869,39 +917,40 @@ void Player::EnvironmentalDamage(uint64 guid, EnviromentalDamage type, uint32 da
void Player::HandleDrowning()
{
- if(!m_isunderwater)
+ if(!(m_isunderwater&~UNDERWATER_INLAVA))
return;
//if player is GM, have waterbreath, is dead or if breathing is disabled then return
- if(waterbreath || isGameMaster() || !isAlive() || GetSession()->GetSecurity() >= sWorld.getConfig(CONFIG_DISABLE_BREATHING))
+ if(isGameMaster() || !isAlive() || HasAuraType(SPELL_AURA_WATER_BREATHING) || GetSession()->GetSecurity() >= sWorld.getConfig(CONFIG_DISABLE_BREATHING))
{
StopMirrorTimer(BREATH_TIMER);
- m_isunderwater = 0;
+ // drop every flag _except_ LAVA - otherwise waterbreathing will prevent lava damage
+ m_isunderwater &= UNDERWATER_INLAVA;
return;
}
- uint32 UnderWaterTime = 1*MINUTE*1000; // default length 1 min
+ uint32 UnderWaterTime = 3*MINUTE*1000; // default duration
AuraList const& mModWaterBreathing = GetAurasByType(SPELL_AURA_MOD_WATER_BREATHING);
for(AuraList::const_iterator i = mModWaterBreathing.begin(); i != mModWaterBreathing.end(); ++i)
- UnderWaterTime = uint32(UnderWaterTime * (100.0f + (*i)->GetModifierValue()) / 100.0f);
+ UnderWaterTime = uint32(UnderWaterTime * (100.0f + (*i)->GetModifier()->m_amount) / 100.0f);
- if ((m_isunderwater & 0x01) && !(m_isunderwater & 0x80) && isAlive())
+ if ((m_isunderwater & UNDERWATER_INWATER) && !(m_isunderwater & UNDERWATER_INLAVA) && isAlive())
{
//single trigger timer
- if (!(m_isunderwater & 0x02))
+ if (!(m_isunderwater & UNDERWATER_WATER_TRIGGER))
{
- m_isunderwater|= 0x02;
+ m_isunderwater|= UNDERWATER_WATER_TRIGGER;
m_breathTimer = UnderWaterTime + 1000;
}
- //single trigger "Breathbar"
- if ( m_breathTimer <= UnderWaterTime && !(m_isunderwater & 0x04))
+ //single trigger "show Breathbar"
+ if ( m_breathTimer <= UnderWaterTime && !(m_isunderwater & UNDERWATER_WATER_BREATHB))
{
- m_isunderwater|= 0x04;
+ m_isunderwater|= UNDERWATER_WATER_BREATHB;
StartMirrorTimer(BREATH_TIMER, UnderWaterTime);
}
//continuous trigger drowning "Damage"
- if ((m_breathTimer == 0) && (m_isunderwater & 0x01))
+ if ((m_breathTimer == 0) && (m_isunderwater & UNDERWATER_INWATER))
{
//TODO: Check this formula
uint64 guid = GetGUID();
@@ -912,74 +961,51 @@ void Player::HandleDrowning()
}
}
//single trigger retract bar
- else if (!(m_isunderwater & 0x01) && !(m_isunderwater & 0x08) && (m_isunderwater & 0x02) && (m_breathTimer > 0) && isAlive())
+ else if (!(m_isunderwater & UNDERWATER_INWATER) && (m_isunderwater & UNDERWATER_WATER_TRIGGER) && (m_breathTimer > 0) && isAlive())
{
- m_isunderwater = 0x08;
-
uint32 BreathRegen = 10;
+ // m_breathTimer will be reduced in ModifyMirrorTimer
ModifyMirrorTimer(BREATH_TIMER, UnderWaterTime, m_breathTimer,BreathRegen);
- m_isunderwater = 0x10;
+ m_isunderwater = UNDERWATER_WATER_BREATHB_RETRACTING;
}
//remove bar
- else if ((m_breathTimer < 50) && !(m_isunderwater & 0x01) && (m_isunderwater == 0x10))
+ else if ((m_breathTimer < 50) && !(m_isunderwater & UNDERWATER_INWATER) && (m_isunderwater == UNDERWATER_WATER_BREATHB_RETRACTING))
{
StopMirrorTimer(BREATH_TIMER);
- m_isunderwater = 0;
+ m_isunderwater = UNDERWATER_NONE;
}
}
void Player::HandleLava()
{
- bool ValidArea = false;
-
- if ((m_isunderwater & 0x80) && isAlive())
+ if ((m_isunderwater & UNDERWATER_INLAVA) && isAlive())
{
- //Single trigger Set BreathTimer
- if (!(m_isunderwater & 0x80))
+ /*
+ * arrai: how is this supposed to work? UNDERWATER_INLAVA is always set in this scope!
+ // Single trigger Set BreathTimer
+ if (!(m_isunderwater & UNDERWATER_INLAVA))
{
- m_isunderwater|= 0x04;
+ m_isunderwater|= UNDERWATER_WATER_BREATHB;
m_breathTimer = 1000;
}
- //Reset BreathTimer and still in the lava
+ */
+ // Reset BreathTimer and still in the lava
if (!m_breathTimer)
{
uint64 guid = GetGUID();
uint32 damage = urand(600, 700); // TODO: Get more detailed information about lava damage
- uint32 dmgZone = GetZoneId(); // TODO: Find correct "lava dealing zone" flag in Area Table
-
- // Deal lava damage only in lava zones.
- switch(dmgZone)
- {
- case 0x8D:
- ValidArea = false;
- break;
- case 0x94:
- ValidArea = false;
- break;
- case 0x2CE:
- ValidArea = false;
- break;
- case 0x2CF:
- ValidArea = false;
- break;
- default:
- if (dmgZone / 5 & 0x408)
- ValidArea = true;
- }
- // if is valid area and is not gamemaster then deal damage
- if ( ValidArea && !isGameMaster() )
+ // if not gamemaster then deal damage
+ if ( !isGameMaster() )
EnvironmentalDamage(guid, DAMAGE_LAVA, damage);
m_breathTimer = 1000;
}
-
}
- //Death timer disabled and WaterFlags reset
- else if (m_deathState == DEAD)
+ else if (!isAlive()) // Disable breath timer and reset underwater flags
{
m_breathTimer = 0;
- m_isunderwater = 0;
+ m_isunderwater = UNDERWATER_NONE;
}
}
@@ -1311,6 +1337,7 @@ void Player::Update( uint32 p_time )
Pet* pet = GetPet();
if(pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && !pet->isPossessed())
+ //if(pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && (GetCharmGUID() && (pet->GetGUID() != GetCharmGUID())))
{
RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true);
return;
@@ -1354,6 +1381,7 @@ void Player::setDeathState(DeathState s)
// passive spell
if(!ressSpellId)
ressSpellId = GetResurrectionSpellId();
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1);
}
Unit::setDeathState(s);
@@ -1374,13 +1402,15 @@ void Player::setDeathState(DeathState s)
void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
{
- *p_data << GetGUID();
+ Field *fields = result->Fetch();
+
+ *p_data << uint64(GetGUID());
*p_data << m_name;
- *p_data << getRace();
+ *p_data << uint8(getRace());
uint8 pClass = getClass();
- *p_data << pClass;
- *p_data << getGender();
+ *p_data << uint8(pClass);
+ *p_data << uint8(getGender());
uint32 bytes = GetUInt32Value(PLAYER_BYTES);
*p_data << uint8(bytes);
@@ -1393,16 +1423,17 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
*p_data << uint8(getLevel()); // player level
// do not use GetMap! it will spawn a new instance since the bound instances are not loaded
- uint32 zoneId = MapManager::Instance().GetZoneId(GetMapId(), GetPositionX(),GetPositionY());
+ uint32 zoneId = MapManager::Instance().GetZoneId(GetMapId(), GetPositionX(),GetPositionY(),GetPositionZ());
sLog.outDebug("Player::BuildEnumData: m:%u, x:%f, y:%f, z:%f zone:%u", GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), zoneId);
- *p_data << zoneId;
- *p_data << GetMapId();
+ *p_data << uint32(zoneId);
+ *p_data << uint32(GetMapId());
*p_data << GetPositionX();
*p_data << GetPositionY();
*p_data << GetPositionZ();
- *p_data << (result ? result->Fetch()[13].GetUInt32() : 0);
+ // guild id
+ *p_data << (result ? fields[13].GetUInt32() : 0);
uint32 char_flags = 0;
if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM))
@@ -1413,14 +1444,13 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
char_flags |= CHARACTER_FLAG_GHOST;
if(HasAtLoginFlag(AT_LOGIN_RENAME))
char_flags |= CHARACTER_FLAG_RENAME;
- // always send the flag if declined names aren't used
- // to let the client select a default method of declining the name
- if(!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) || (result && result->Fetch()[14].GetCppString() != ""))
+ if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && (fields[14].GetCppString() != ""))
char_flags |= CHARACTER_FLAG_DECLINED;
- *p_data << (uint32)char_flags; // character flags
-
- *p_data << (uint8)1; // unknown
+ *p_data << uint32(char_flags); // character flags
+ // character customize (flags?)
+ *p_data << uint32(HasAtLoginFlag(AT_LOGIN_CUSTOMIZE) ? 1 : 0);
+ *p_data << uint8(1); // unknown
// Pets info
{
@@ -1431,8 +1461,6 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
// show pet at selection character in character list only for non-ghost character
if(result && isAlive() && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER))
{
- Field* fields = result->Fetch();
-
uint32 entry = fields[10].GetUInt32();
CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(entry);
if(cInfo)
@@ -1443,36 +1471,11 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
}
}
- *p_data << (uint32)petDisplayId;
- *p_data << (uint32)petLevel;
- *p_data << (uint32)petFamily;
+ *p_data << uint32(petDisplayId);
+ *p_data << uint32(petLevel);
+ *p_data << uint32(petFamily);
}
- /*ItemPrototype const *items[EQUIPMENT_SLOT_END];
- for (int i = 0; i < EQUIPMENT_SLOT_END; i++)
- items[i] = NULL;
-
- QueryResult *result = CharacterDatabase.PQuery("SELECT slot,item_template FROM character_inventory WHERE guid = '%u' AND bag = 0",GetGUIDLow());
- if (result)
- {
- do
- {
- Field *fields = result->Fetch();
- uint8 slot = fields[0].GetUInt8() & 255;
- uint32 item_id = fields[1].GetUInt32();
- if( slot >= EQUIPMENT_SLOT_END )
- continue;
-
- items[slot] = objmgr.GetItemPrototype(item_id);
- if(!items[slot])
- {
- sLog.outError( "Player::BuildEnumData: Player %s have unknown item (id: #%u) in inventory, skipped.", GetName(),item_id );
- continue;
- }
- } while (result->NextRow());
- delete result;
- }*/
-
for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++)
{
uint32 visualbase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET);
@@ -1489,20 +1492,20 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
if (proto != NULL)
{
- *p_data << (uint32)proto->DisplayInfoID;
- *p_data << (uint8)proto->InventoryType;
- *p_data << (uint32)(enchant?enchant->aura_id:0);
+ *p_data << uint32(proto->DisplayInfoID);
+ *p_data << uint8(proto->InventoryType);
+ *p_data << uint32(enchant ? enchant->aura_id : 0);
}
else
{
- *p_data << (uint32)0;
- *p_data << (uint8)0;
- *p_data << (uint32)0; // enchant?
+ *p_data << uint32(0);
+ *p_data << uint8(0);
+ *p_data << uint32(0); // enchant?
}
}
- *p_data << (uint32)0; // first bag display id
- *p_data << (uint8)0; // first bag inventory type
- *p_data << (uint32)0; // enchant?
+ *p_data << uint32(0); // first bag display id
+ *p_data << uint8(0); // first bag inventory type
+ *p_data << uint32(0); // enchant?
}
bool Player::ToggleAFK()
@@ -1587,13 +1590,13 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if(GetTransport())
RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
- SendTransferAborted(mapid, TRANSFER_ABORT_INSUF_EXPAN_LVL1);
+ SendTransferAborted(mapid, TRANSFER_ABORT_INSUF_EXPAN_LVL, mEntry->Expansion());
return false; // normal client can't teleport to this map...
}
else
{
- sLog.outDebug("Player %s will teleported to map %u", GetName(), mapid);
+ sLog.outDebug("Player %s is being teleported to map %u", GetName(), mapid);
}
// if we were on a transport, leave
@@ -1894,13 +1897,20 @@ void Player::RegenerateAll()
{
RegenerateHealth();
if (!isInCombat() && !HasAuraType(SPELL_AURA_INTERRUPT_REGEN))
+ {
Regenerate(POWER_RAGE);
+ if(getClass() == CLASS_DEATH_KNIGHT)
+ Regenerate(POWER_RUNIC_POWER);
+ }
}
Regenerate( POWER_ENERGY );
Regenerate( POWER_MANA );
+ if(getClass() == CLASS_DEATH_KNIGHT)
+ Regenerate( POWER_RUNE );
+
m_regenTimer = regenDelay;
}
@@ -1920,11 +1930,11 @@ void Player::Regenerate(Powers power)
if (recentCast)
{
// Trinity Updates Mana in intervals of 2s, which is correct
- addvalue = GetFloatValue(PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT) * ManaIncreaseRate * 2.00f;
+ addvalue = GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 2.00f;
}
else
{
- addvalue = GetFloatValue(PLAYER_FIELD_MOD_MANA_REGEN) * ManaIncreaseRate * 2.00f;
+ addvalue = GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 2.00f;
}
} break;
case POWER_RAGE: // Regenerate rage
@@ -1935,6 +1945,17 @@ void Player::Regenerate(Powers power)
case POWER_ENERGY: // Regenerate energy (rogue)
addvalue = 20;
break;
+ case POWER_RUNIC_POWER:
+ {
+ float RunicPowerDecreaseRate = sWorld.getRate(RATE_POWER_RUNICPOWER_LOSS);
+ addvalue = 30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
+ } break;
+ case POWER_RUNE:
+ {
+ for(uint32 i = 0; i < MAX_RUNES; ++i)
+ if(uint8 cd = GetRuneCooldown(i)) // if we have cooldown, reduce it...
+ SetRuneCooldown(i, cd - 1); // ... by 2 sec (because update is every 2 sec)
+ } break;
case POWER_FOCUS:
case POWER_HAPPINESS:
break;
@@ -1947,10 +1968,10 @@ void Player::Regenerate(Powers power)
AuraList const& ModPowerRegenPCTAuras = GetAurasByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT);
for(AuraList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
if ((*i)->GetModifier()->m_miscvalue == power)
- addvalue *= ((*i)->GetModifierValue() + 100) / 100.0f;
+ addvalue *= ((*i)->GetModifier()->m_amount + 100) / 100.0f;
}
- if (power != POWER_RAGE)
+ if (power != POWER_RAGE && power != POWER_RUNIC_POWER)
{
curValue += uint32(addvalue);
if (curValue > maxValue)
@@ -1988,7 +2009,7 @@ void Player::RegenerateHealth()
{
AuraList const& mModHealthRegenPct = GetAurasByType(SPELL_AURA_MOD_HEALTH_REGEN_PERCENT);
for(AuraList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
- addvalue *= (100.0f + (*i)->GetModifierValue()) / 100.0f;
+ addvalue *= (100.0f + (*i)->GetModifier()->m_amount) / 100.0f;
}
else if(HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT))
addvalue *= GetTotalAuraModifier(SPELL_AURA_MOD_REGEN_DURING_COMBAT) / 100.0f;
@@ -2048,21 +2069,27 @@ void Player::SetGameMaster(bool on)
setFaction(35);
SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_GM);
- RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP);
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
ResetContestedPvP();
getHostilRefManager().setOnlineOfflineState(false);
CombatStop();
+
+ SetPhaseMask(PHASEMASK_ANYWHERE,false); // see and visible in all phases
}
else
{
+ // restore phase
+ AuraList const& phases = GetAurasByType(SPELL_AURA_PHASE);
+ SetPhaseMask(!phases.empty() ? phases.front()->GetMiscValue() : PHASEMASK_NORMAL,false);
+
m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
setFactionForRace(getRace());
RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_GM);
// restore FFA PvP Server state
if(sWorld.IsFFAPvPRealm())
- SetFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
// restore FFA PvP area state, remove not allowed for GM mounts
UpdateArea(m_areaUpdateId);
@@ -2186,7 +2213,7 @@ void Player::GiveXP(uint32 xp, Unit* victim)
// handle SPELL_AURA_MOD_XP_PCT auras
Unit::AuraList const& ModXPPctAuras = GetAurasByType(SPELL_AURA_MOD_XP_PCT);
for(Unit::AuraList::const_iterator i = ModXPPctAuras.begin();i != ModXPPctAuras.end(); ++i)
- xp = uint32(xp*(1.0f + (*i)->GetModifierValue() / 100.0f));
+ xp = uint32(xp*(1.0f + (*i)->GetModifier()->m_amount / 100.0f));
// XP resting bonus for kill
uint32 rested_bonus_xp = victim ? GetXPRestBonus(xp) : 0;
@@ -2234,13 +2261,15 @@ void Player::GiveLevel(uint32 level)
data << uint32(0);
data << uint32(0);
data << uint32(0);
+ data << uint32(0);
+ data << uint32(0);
// end for
for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) // Stats loop (0-4)
data << uint32(int32(info.stats[i]) - GetCreateStat(Stats(i)));
GetSession()->SendPacket(&data);
- SetUInt32Value(PLAYER_NEXT_LEVEL_XP, Trinity::XP::xp_to_level(level));
+ SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(level));
//update level, max level of skills
if(getLevel()!= level)
@@ -2257,6 +2286,7 @@ void Player::GiveLevel(uint32 level)
InitTalentForLevel();
InitTaxiNodesForLevel();
+ InitGlyphsForLevel();
UpdateAllStats();
@@ -2276,6 +2306,7 @@ void Player::GiveLevel(uint32 level)
Pet* pet = GetPet();
if(pet && pet->getPetType()==SUMMON_PET)
pet->GivePetLevel(level);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL);
}
void Player::InitTalentForLevel()
@@ -2293,7 +2324,8 @@ void Player::InitTalentForLevel()
}
else
{
- uint32 talentPointsForLevel = uint32((level-9)*sWorld.getRate(RATE_TALENT));
+ uint32 talentPointsForLevel = CalculateTalentsPoints();
+
// if used more that have then reset
if(m_usedTalentCount > talentPointsForLevel)
{
@@ -2320,7 +2352,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
objmgr.GetPlayerLevelInfo(getRace(),getClass(),getLevel(),&info);
SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) );
- SetUInt32Value(PLAYER_NEXT_LEVEL_XP, Trinity::XP::xp_to_level(getLevel()));
+ SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(getLevel()));
UpdateSkillsForLevel ();
@@ -2370,11 +2402,11 @@ void Player::InitStatsForLevel(bool reapplyMods)
SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, 0.0f );
SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, 0.0f );
- SetUInt32Value(UNIT_FIELD_ATTACK_POWER, 0 );
- SetUInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, 0 );
+ SetInt32Value(UNIT_FIELD_ATTACK_POWER, 0 );
+ SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, 0 );
SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER,0.0f);
- SetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER, 0 );
- SetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS,0 );
+ SetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER, 0 );
+ SetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS,0 );
SetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER,0.0f);
// Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
@@ -2412,6 +2444,9 @@ void Player::InitStatsForLevel(bool reapplyMods)
SetFloatValue(UNIT_FIELD_POWER_COST_MODIFIER+i,0.0f);
SetFloatValue(UNIT_FIELD_POWER_COST_MULTIPLIER+i,0.0f);
}
+ // Reset no reagent cost field
+ for(int i = 0; i < 3; i++)
+ SetUInt32Value(PLAYER_NO_REAGENT_COST_1 + i, 0);
// Init data for form but skip reapply item mods for form
InitDataForForm(reapplyMods);
@@ -2428,15 +2463,18 @@ void Player::InitStatsForLevel(bool reapplyMods)
RemoveFlag( UNIT_FIELD_FLAGS,
UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_ATTACKABLE_1 |
UNIT_FLAG_PET_IN_COMBAT | UNIT_FLAG_SILENCED | UNIT_FLAG_PACIFIED |
- UNIT_FLAG_DISABLE_ROTATE | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_DISARMED |
+ UNIT_FLAG_STUNNED | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_DISARMED |
UNIT_FLAG_CONFUSED | UNIT_FLAG_FLEEING | UNIT_FLAG_NOT_SELECTABLE |
UNIT_FLAG_SKINNABLE | UNIT_FLAG_MOUNT | UNIT_FLAG_TAXI_FLIGHT );
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE ); // must be set
+ SetFlag(UNIT_FIELD_FLAGS_2,UNIT_FLAG2_REGENERATE_POWER);// must be set
+
// cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
- RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK | PLAYER_FLAGS_DND | PLAYER_FLAGS_GM | PLAYER_FLAGS_GHOST | PLAYER_FLAGS_FFA_PVP);
+ RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK | PLAYER_FLAGS_DND | PLAYER_FLAGS_GM | PLAYER_FLAGS_GHOST | PLAYER_ALLOW_ONLY_ABILITY);
- SetByteValue(UNIT_FIELD_BYTES_1, 2, 0x00); // one form stealth modified bytes
+ RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP | UNIT_BYTE2_FLAG_SANCTUARY);
// restore if need some important flags
SetUInt32Value(PLAYER_FIELD_BYTES2, 0 ); // flags empty by default
@@ -2452,6 +2490,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
SetPower(POWER_RAGE, GetMaxPower(POWER_RAGE));
SetPower(POWER_FOCUS, 0);
SetPower(POWER_HAPPINESS, 0);
+ SetPower(POWER_RUNIC_POWER, 0);
}
void Player::SendInitialSpells()
@@ -2584,13 +2623,13 @@ void Player::AddNewMailDeliverTime(time_t deliver_time)
}
}
-bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading, uint16 slot_id, bool disabled)
+bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled)
{
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
if (!spellInfo)
{
// do character spell book cleanup (all characters)
- if(loading && !learning) // spell load case
+ if(!IsInWorld() && !learning) // spell load case
{
sLog.outError("Player::addSpell: Non-existed in SpellStore spell #%u request, deleting for all characters in `character_spell`.",spell_id);
CharacterDatabase.PExecute("DELETE FROM character_spell WHERE spell = '%u'",spell_id);
@@ -2604,7 +2643,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
if(!SpellMgr::IsSpellValid(spellInfo,this,false))
{
// do character spell book cleanup (all characters)
- if(loading && !learning) // spell load case
+ if(!IsInWorld() && !learning) // spell load case
{
sLog.outError("Player::addSpell: Broken spell #%u learning not allowed, deleting for all characters in `character_spell`.",spell_id);
CharacterDatabase.PExecute("DELETE FROM character_spell WHERE spell = '%u'",spell_id);
@@ -2617,29 +2656,80 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
PlayerSpellState state = learning ? PLAYERSPELL_NEW : PLAYERSPELL_UNCHANGED;
+ bool dependent_set = false;
bool disabled_case = false;
bool superceded_old = false;
PlayerSpellMap::iterator itr = m_spells.find(spell_id);
if (itr != m_spells.end())
{
+ uint32 next_active_spell_id = 0;
+ // fix activate state for non-stackable low rank (and find next spell for !active case)
+ if(!SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0)
+ {
+ if(uint32 next = spellmgr.GetNextSpellInChain(spell_id))
+ {
+ if(HasSpell(next))
+ {
+ // high rank already known so this must !active
+ active = false;
+ next_active_spell_id = next;
+ }
+ }
+ }
+
+ // not do anything if already known in expected state
+ if(itr->second->state != PLAYERSPELL_REMOVED && itr->second->active == active &&
+ itr->second->dependent == dependent && itr->second->disabled == disabled)
+ {
+ if(!IsInWorld() && !learning) // explicitly load from DB and then exist in it already and set correctly
+ itr->second->state = PLAYERSPELL_UNCHANGED;
+
+ return false;
+ }
+
+ // dependent spell known as not dependent, overwrite state
+ if (itr->second->state != PLAYERSPELL_REMOVED && !itr->second->dependent && dependent)
+ {
+ itr->second->dependent = dependent;
+ if (itr->second->state != PLAYERSPELL_NEW)
+ itr->second->state = PLAYERSPELL_CHANGED;
+ dependent_set = true;
+ }
+
// update active state for known spell
if(itr->second->active != active && itr->second->state != PLAYERSPELL_REMOVED && !itr->second->disabled)
{
itr->second->active = active;
- // loading && !learning == explicitly load from DB and then exist in it already and set correctly
- if(loading && !learning)
+ if(!IsInWorld() && !learning && !dependent_set) // explicitly load from DB and then exist in it already and set correctly
itr->second->state = PLAYERSPELL_UNCHANGED;
else if(itr->second->state != PLAYERSPELL_NEW)
itr->second->state = PLAYERSPELL_CHANGED;
- if(!active)
+ if(active)
{
- WorldPacket data(SMSG_REMOVED_SPELL, 4);
- data << uint16(spell_id);
- GetSession()->SendPacket(&data);
+ if (IsPassiveSpell(spell_id) && IsNeedCastPassiveSpellAtLearn(spellInfo))
+ CastSpell (this,spell_id,true);
+ }
+ else if(IsInWorld())
+ {
+ if(next_active_spell_id)
+ {
+ // update spell ranks in spellbook and action bar
+ WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
+ data << uint16(spell_id);
+ data << uint16(next_active_spell_id);
+ GetSession()->SendPacket( &data );
+ }
+ else
+ {
+ WorldPacket data(SMSG_REMOVED_SPELL, 4);
+ data << uint16(spell_id);
+ GetSession()->SendPacket(&data);
+ }
}
+
return active; // learn (show in spell book if active now)
}
@@ -2668,7 +2758,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
default: // known not saved yet spell (new or modified)
{
// can be in case spell loading but learned at some previous spell loading
- if(loading && !learning)
+ if(!IsInWorld() && !learning && !dependent_set)
itr->second->state = PLAYERSPELL_UNCHANGED;
return false;
@@ -2690,10 +2780,6 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
if(!rankSpellId || rankSpellId==spell_id)
continue;
- // skip unknown ranks
- if(!HasSpell(rankSpellId))
- continue;
-
removeSpell(rankSpellId);
}
}
@@ -2701,16 +2787,17 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
// non talent spell: learn low ranks (recursive call)
else if(uint32 prev_spell = spellmgr.GetPrevSpellInChain(spell_id))
{
- if(loading) // at spells loading, no output, but allow save
- addSpell(prev_spell,active,true,loading,SPELL_WITHOUT_SLOT_ID,disabled);
+ if(!IsInWorld() || disabled) // at spells loading, no output, but allow save
+ addSpell(prev_spell,active,true,true,disabled);
else // at normal learning
- learnSpell(prev_spell);
+ learnSpell(prev_spell,true);
}
PlayerSpell *newspell = new PlayerSpell;
- newspell->active = active;
- newspell->state = state;
- newspell->disabled = disabled;
+ newspell->state = state;
+ newspell->active = active;
+ newspell->dependent = dependent;
+ newspell->disabled = disabled;
// replace spells in action bars and spellbook to bigger rank if only one spell rank must be accessible
if(newspell->active && !newspell->disabled && !SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0)
@@ -2727,7 +2814,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
{
if(spellmgr.IsHighRankOfSpell(spell_id,itr->first))
{
- if(!loading) // not send spell (re-/over-)learn packets at loading
+ if(IsInWorld()) // not send spell (re-/over-)learn packets at loading
{
WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
data << uint16(itr->first);
@@ -2737,12 +2824,13 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
// mark old spell as disable (SMSG_SUPERCEDED_SPELL replace it in client by new)
itr->second->active = false;
- itr->second->state = PLAYERSPELL_CHANGED;
+ if(itr->second->state != PLAYERSPELL_NEW)
+ itr->second->state = PLAYERSPELL_CHANGED;
superceded_old = true; // new spell replace old in action bars and spell book.
}
else if(spellmgr.IsHighRankOfSpell(itr->first,spell_id))
{
- if(!loading) // not send spell (re-/over-)learn packets at loading
+ if(IsInWorld()) // not send spell (re-/over-)learn packets at loading
{
WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
data << uint16(spell_id);
@@ -2760,23 +2848,6 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
}
}
- uint16 tmpslot=slot_id;
-
- if (tmpslot == SPELL_WITHOUT_SLOT_ID)
- {
- uint16 maxid = 0;
- PlayerSpellMap::iterator itr;
- for (itr = m_spells.begin(); itr != m_spells.end(); ++itr)
- {
- if(itr->second->state == PLAYERSPELL_REMOVED)
- continue;
- if (itr->second->slotId > maxid)
- maxid = itr->second->slotId;
- }
- tmpslot = maxid + 1;
- }
-
- newspell->slotId = tmpslot;
m_spells[spell_id] = newspell;
// return false if spell disabled
@@ -2796,23 +2867,8 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
// also cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
else if (IsPassiveSpell(spell_id))
{
- // if spell doesn't require a stance or the player is in the required stance
- if( ( !spellInfo->Stances &&
- spell_id != 5420 && spell_id != 5419 && spell_id != 7376 &&
- spell_id != 7381 && spell_id != 21156 && spell_id != 21009 &&
- spell_id != 21178 && spell_id != 33948 && spell_id != 40121 ) ||
- m_form != 0 && (spellInfo->Stances & (1<<(m_form-1))) ||
- (spell_id == 5420 && m_form == FORM_TREE) ||
- (spell_id == 5419 && m_form == FORM_TRAVEL) ||
- (spell_id == 7376 && m_form == FORM_DEFENSIVESTANCE) ||
- (spell_id == 7381 && m_form == FORM_BERSERKERSTANCE) ||
- (spell_id == 21156 && m_form == FORM_BATTLESTANCE)||
- (spell_id == 21178 && (m_form == FORM_BEAR || m_form == FORM_DIREBEAR) ) ||
- (spell_id == 33948 && m_form == FORM_FLIGHT) ||
- (spell_id == 40121 && m_form == FORM_FLIGHT_EPIC) )
- //Check CasterAuraStates
- if (!spellInfo->CasterAuraState || HasAuraState(AuraState(spellInfo->CasterAuraState)))
- CastSpell(this, spell_id, true);
+ if(IsNeedCastPassiveSpellAtLearn(spellInfo))
+ CastSpell(this, spell_id, true);
}
else if( IsSpellHaveEffect(spellInfo,SPELL_EFFECT_SKILL_STEP) )
{
@@ -2866,8 +2922,6 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
continue;
if(_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
- // poison special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
- pSkill->id==SKILL_POISONS && _spell_idx->second->max_value==0 ||
// lockpicking special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
pSkill->id==SKILL_LOCKPICKING && _spell_idx->second->max_value==0 )
{
@@ -2897,37 +2951,71 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
{
if(!itr->second.autoLearned)
{
- if(loading) // at spells loading, no output, but allow save
- addSpell(itr->second.spell,true,true,loading);
+ if(!IsInWorld() || !itr->second.active) // at spells loading, no output, but allow save
+ addSpell(itr->second.spell,itr->second.active,true,true,false);
else // at normal learning
- learnSpell(itr->second.spell);
+ learnSpell(itr->second.spell,true);
}
}
+ if(IsInWorld())
+ {
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS);
+ }
+
// return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell
return active && !disabled && !superceded_old;
}
-void Player::learnSpell(uint32 spell_id)
+bool Player::IsNeedCastPassiveSpellAtLearn(SpellEntry const* spellInfo) const
+{
+ bool need_cast = false;
+
+ switch(spellInfo->Id)
+ {
+ // some spells not have stance data expacted cast at form change or present
+ case 5420: need_cast = (m_form == FORM_TREE); break;
+ case 5419: need_cast = (m_form == FORM_TRAVEL); break;
+ case 7376: need_cast = (m_form == FORM_DEFENSIVESTANCE); break;
+ case 7381: need_cast = (m_form == FORM_BERSERKERSTANCE); break;
+ case 21156: need_cast = (m_form == FORM_BATTLESTANCE); break;
+ case 21178: need_cast = (m_form == FORM_BEAR || m_form == FORM_DIREBEAR); break;
+ case 33948: need_cast = (m_form == FORM_FLIGHT); break;
+ case 34764: need_cast = (m_form == FORM_FLIGHT); break;
+ case 40121: need_cast = (m_form == FORM_FLIGHT_EPIC); break;
+ case 40122: need_cast = (m_form == FORM_FLIGHT_EPIC); break;
+ // another spells have proper stance data
+ default: need_cast = !spellInfo->Stances || m_form != 0 && (spellInfo->Stances & (1<<(m_form-1))); break;
+ }
+
+ //Check CasterAuraStates
+ return need_cast && (!spellInfo->CasterAuraState || HasAuraState(AuraState(spellInfo->CasterAuraState)));
+}
+
+void Player::learnSpell(uint32 spell_id, bool dependent)
{
PlayerSpellMap::iterator itr = m_spells.find(spell_id);
bool disabled = (itr != m_spells.end()) ? itr->second->disabled : false;
bool active = disabled ? itr->second->active : true;
- bool learning = addSpell(spell_id,active);
+ bool learning = addSpell(spell_id,active,true,dependent,false);
// learn all disabled higher ranks (recursive)
- SpellChainNode const* node = spellmgr.GetSpellChainNode(spell_id);
- if (node)
+ if(disabled)
{
- PlayerSpellMap::iterator iter = m_spells.find(node->next);
- if (disabled && iter != m_spells.end() && iter->second->disabled )
- learnSpell(node->next);
+ SpellChainNode const* node = spellmgr.GetSpellChainNode(spell_id);
+ if(node)
+ {
+ PlayerSpellMap::iterator iter = m_spells.find(node->next);
+ if (iter != m_spells.end() && iter->second->disabled )
+ learnSpell(node->next,false);
+ }
}
- // prevent duplicated entires in spell book
- if(!learning)
+ // prevent duplicated entires in spell book, also not send if not in world (loading)
+ if(!learning || !IsInWorld ())
return;
WorldPacket data(SMSG_LEARNED_SPELL, 4);
@@ -2935,7 +3023,7 @@ void Player::learnSpell(uint32 spell_id)
GetSession()->SendPacket(&data);
}
-void Player::removeSpell(uint32 spell_id, bool disabled)
+void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_for_low_rank)
{
PlayerSpellMap::iterator itr = m_spells.find(spell_id);
if (itr == m_spells.end())
@@ -2957,10 +3045,8 @@ void Player::removeSpell(uint32 spell_id, bool disabled)
for (uint32 i=reqMap.count(spell_id);i>0;i--,itr2++)
removeSpell(itr2->second,disabled);
- // removing
- WorldPacket data(SMSG_REMOVED_SPELL, 4);
- data << uint16(spell_id);
- GetSession()->SendPacket(&data);
+ bool cur_active = itr->second->active;
+ bool cur_dependent = itr->second->dependent;
if (disabled)
{
@@ -3053,8 +3139,6 @@ void Player::removeSpell(uint32 spell_id, bool disabled)
continue;
if(_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
- // poison special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
- pSkill->id==SKILL_POISONS && _spell_idx->second->max_value==0 ||
// lockpicking special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
pSkill->id==SKILL_LOCKPICKING && _spell_idx->second->max_value==0 )
{
@@ -3074,6 +3158,60 @@ void Player::removeSpell(uint32 spell_id, bool disabled)
for(SpellLearnSpellMap::const_iterator itr2 = spell_begin; itr2 != spell_end; ++itr2)
removeSpell(itr2->second.spell, disabled);
+
+ // activate lesser rank in spellbook/action bar, and cast it if need
+ bool prev_activate = false;
+
+ if(uint32 prev_id = spellmgr.GetPrevSpellInChain (spell_id))
+ {
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
+
+ // if talent then lesser rank also talent and need learn
+ if(talentCosts)
+ {
+ //learnSpell (prev_id,false);
+ }
+ // if ranked non-stackable spell: need activate lesser rank and update dendence state
+ else if(cur_active && !SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0)
+ {
+ // need manually update dependence state (learn spell ignore like attempts)
+ PlayerSpellMap::iterator prev_itr = m_spells.find(prev_id);
+ if (prev_itr != m_spells.end())
+ {
+ if(prev_itr->second->dependent != cur_dependent)
+ {
+ prev_itr->second->dependent = cur_dependent;
+ if(prev_itr->second->state != PLAYERSPELL_NEW)
+ prev_itr->second->state = PLAYERSPELL_CHANGED;
+ }
+
+ // now re-learn if need re-activate
+ if(cur_active && !prev_itr->second->active)
+ {
+ if(addSpell(prev_id,true,false,prev_itr->second->dependent,prev_itr->second->disabled))
+ {
+ if(update_action_bar_for_low_rank)
+ {
+ // downgrade spell ranks in spellbook and action bar
+ WorldPacket data(SMSG_SUPERCEDED_SPELL, (4));
+ data << uint16(spell_id);
+ data << uint16(prev_id);
+ GetSession()->SendPacket( &data );
+ prev_activate = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // remove from spell book if not replaced by lesser rank
+ if(!prev_activate)
+ {
+ WorldPacket data(SMSG_REMOVED_SPELL, 4);
+ data << uint16(spell_id);
+ GetSession()->SendPacket(&data);
+ }
}
void Player::RemoveArenaSpellCooldowns()
@@ -3216,8 +3354,7 @@ bool Player::resetTalents(bool no_cost)
CharacterDatabase.PExecute("UPDATE characters set at_login = at_login & ~ %u WHERE guid ='%u'", uint32(AT_LOGIN_RESET_TALENTS), GetGUIDLow());
}
- uint32 level = getLevel();
- uint32 talentPointsForLevel = level < 10 ? 0 : uint32((level-9)*sWorld.getRate(RATE_TALENT));
+ uint32 talentPointsForLevel = CalculateTalentsPoints();
if (m_usedTalentCount == 0)
{
@@ -3297,18 +3434,6 @@ bool Player::resetTalents(bool no_cost)
return true;
}
-bool Player::_removeSpell(uint16 spell_id)
-{
- PlayerSpellMap::iterator itr = m_spells.find(spell_id);
- if (itr != m_spells.end())
- {
- delete itr->second;
- m_spells.erase(itr);
- return true;
- }
- return false;
-}
-
Mail* Player::GetMail(uint32 id)
{
for(PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
@@ -3354,50 +3479,46 @@ void Player::InitVisibleBits()
{
updateVisualBits.SetCount(PLAYER_END);
- // TODO: really implement OWNER_ONLY and GROUP_ONLY. Flags can be found in UpdateFields.h
-
updateVisualBits.SetBit(OBJECT_FIELD_GUID);
updateVisualBits.SetBit(OBJECT_FIELD_TYPE);
+ updateVisualBits.SetBit(OBJECT_FIELD_ENTRY);
updateVisualBits.SetBit(OBJECT_FIELD_SCALE_X);
-
- updateVisualBits.SetBit(UNIT_FIELD_CHARM);
- updateVisualBits.SetBit(UNIT_FIELD_CHARM+1);
-
- updateVisualBits.SetBit(UNIT_FIELD_SUMMON);
- updateVisualBits.SetBit(UNIT_FIELD_SUMMON+1);
-
- updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY);
- updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY+1);
-
- updateVisualBits.SetBit(UNIT_FIELD_TARGET);
- updateVisualBits.SetBit(UNIT_FIELD_TARGET+1);
-
- updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT);
- updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT+1);
-
+ updateVisualBits.SetBit(UNIT_FIELD_CHARM + 0);
+ updateVisualBits.SetBit(UNIT_FIELD_CHARM + 1);
+ updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 0);
+ updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 1);
+ updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 0);
+ updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 1);
+ updateVisualBits.SetBit(UNIT_FIELD_TARGET + 0);
+ updateVisualBits.SetBit(UNIT_FIELD_TARGET + 1);
+ updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 0);
+ updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 1);
+ updateVisualBits.SetBit(UNIT_FIELD_BYTES_0);
updateVisualBits.SetBit(UNIT_FIELD_HEALTH);
updateVisualBits.SetBit(UNIT_FIELD_POWER1);
updateVisualBits.SetBit(UNIT_FIELD_POWER2);
updateVisualBits.SetBit(UNIT_FIELD_POWER3);
updateVisualBits.SetBit(UNIT_FIELD_POWER4);
updateVisualBits.SetBit(UNIT_FIELD_POWER5);
-
+ updateVisualBits.SetBit(UNIT_FIELD_POWER6);
+ updateVisualBits.SetBit(UNIT_FIELD_POWER7);
updateVisualBits.SetBit(UNIT_FIELD_MAXHEALTH);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER1);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER2);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER3);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER4);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER5);
-
+ updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER6);
+ updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER7);
updateVisualBits.SetBit(UNIT_FIELD_LEVEL);
updateVisualBits.SetBit(UNIT_FIELD_FACTIONTEMPLATE);
- updateVisualBits.SetBit(UNIT_FIELD_BYTES_0);
+ updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 0);
+ updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 1);
+ updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 2);
updateVisualBits.SetBit(UNIT_FIELD_FLAGS);
updateVisualBits.SetBit(UNIT_FIELD_FLAGS_2);
- for(uint16 i = UNIT_FIELD_AURA; i < UNIT_FIELD_AURASTATE; ++i)
- updateVisualBits.SetBit(i);
updateVisualBits.SetBit(UNIT_FIELD_AURASTATE);
- updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME);
+ updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 0);
updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 1);
updateVisualBits.SetBit(UNIT_FIELD_BOUNDINGRADIUS);
updateVisualBits.SetBit(UNIT_FIELD_COMBATREACH);
@@ -3410,10 +3531,12 @@ void Player::InitVisibleBits()
updateVisualBits.SetBit(UNIT_DYNAMIC_FLAGS);
updateVisualBits.SetBit(UNIT_CHANNEL_SPELL);
updateVisualBits.SetBit(UNIT_MOD_CAST_SPEED);
+ updateVisualBits.SetBit(UNIT_FIELD_BASE_MANA);
updateVisualBits.SetBit(UNIT_FIELD_BYTES_2);
+ updateVisualBits.SetBit(UNIT_FIELD_HOVERHEIGHT);
- updateVisualBits.SetBit(PLAYER_DUEL_ARBITER);
- updateVisualBits.SetBit(PLAYER_DUEL_ARBITER+1);
+ updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 0);
+ updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 1);
updateVisualBits.SetBit(PLAYER_FLAGS);
updateVisualBits.SetBit(PLAYER_GUILDID);
updateVisualBits.SetBit(PLAYER_GUILDRANK);
@@ -3424,29 +3547,29 @@ void Player::InitVisibleBits()
updateVisualBits.SetBit(PLAYER_GUILD_TIMESTAMP);
// PLAYER_QUEST_LOG_x also visible bit on official (but only on party/raid)...
- for(uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i+=4)
+ for(uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i += 4)
updateVisualBits.SetBit(i);
- //Players visible items are not inventory stuff
- //431) = 884 (0x374) = main weapon
- for(uint16 i = 0; i < EQUIPMENT_SLOT_END; i++)
+ // Players visible items are not inventory stuff
+ for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
- // item creator
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + (i*MAX_VISIBLE_ITEM_OFFSET) + 0);
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + (i*MAX_VISIBLE_ITEM_OFFSET) + 1);
+ uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET;
- uint16 visual_base = PLAYER_VISIBLE_ITEM_1_0 + (i*MAX_VISIBLE_ITEM_OFFSET);
+ // item creator
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 0 + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 1 + offset);
// item entry
- updateVisualBits.SetBit(visual_base + 0);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset);
- // item enchantment IDs
- for(uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; ++j)
- updateVisualBits.SetBit(visual_base + 1 + j);
+ // item enchantments
+ for(uint8 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 1 + j + offset);
// random properties
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 0 + (i*MAX_VISIBLE_ITEM_OFFSET));
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 1 + (i*MAX_VISIBLE_ITEM_OFFSET));
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_SEED + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PAD + offset);
}
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@@ -3464,7 +3587,6 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
if(target == this)
{
-
for(int i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
{
if(m_items[i] == NULL)
@@ -3472,7 +3594,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
m_items[i]->BuildCreateUpdateBlockForPlayer( data, target );
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
if(m_items[i] == NULL)
continue;
@@ -3505,7 +3627,7 @@ void Player::DestroyForPlayer( Player *target ) const
m_items[i]->DestroyForPlayer( target );
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
if(m_items[i] == NULL)
continue;
@@ -3517,8 +3639,16 @@ void Player::DestroyForPlayer( Player *target ) const
bool Player::HasSpell(uint32 spell) const
{
- PlayerSpellMap::const_iterator itr = m_spells.find((uint16)spell);
- return (itr != m_spells.end() && itr->second->state != PLAYERSPELL_REMOVED && !itr->second->disabled);
+ PlayerSpellMap::const_iterator itr = m_spells.find(spell);
+ return (itr != m_spells.end() && itr->second->state != PLAYERSPELL_REMOVED &&
+ !itr->second->disabled);
+}
+
+bool Player::HasActiveSpell(uint32 spell) const
+{
+ PlayerSpellMap::const_iterator itr = m_spells.find(spell);
+ return (itr != m_spells.end() && itr->second->state != PLAYERSPELL_REMOVED &&
+ itr->second->active && !itr->second->disabled);
}
TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell) const
@@ -3526,22 +3656,22 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell
if (!trainer_spell)
return TRAINER_SPELL_RED;
- if (!trainer_spell->spell)
+ if (!trainer_spell->learnedSpell)
return TRAINER_SPELL_RED;
// known spell
- if(HasSpell(trainer_spell->spell))
+ if(HasSpell(trainer_spell->learnedSpell))
return TRAINER_SPELL_GRAY;
// check race/class requirement
- if(!IsSpellFitByClassAndRace(trainer_spell->spell))
+ if(!IsSpellFitByClassAndRace(trainer_spell->learnedSpell))
return TRAINER_SPELL_RED;
// check level requirement
- if(getLevel() < trainer_spell->reqlevel)
+ if(getLevel() < trainer_spell->reqLevel)
return TRAINER_SPELL_RED;
- if(SpellChainNode const* spell_chain = spellmgr.GetSpellChainNode(trainer_spell->spell))
+ if(SpellChainNode const* spell_chain = spellmgr.GetSpellChainNode(trainer_spell->learnedSpell))
{
// check prev.rank requirement
if(spell_chain->prev && !HasSpell(spell_chain->prev))
@@ -3556,11 +3686,11 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell
}
// check skill requirement
- if(trainer_spell->reqskill && GetBaseSkillValue(trainer_spell->reqskill) < trainer_spell->reqskillvalue)
+ if(trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
return TRAINER_SPELL_RED;
// exist, already checked at loading
- SpellEntry const* spell = sSpellStore.LookupEntry(trainer_spell->spell);
+ SpellEntry const* spell = sSpellStore.LookupEntry(trainer_spell->learnedSpell);
// secondary prof. or not prof. spell
uint32 skill = spell->EffectMiscValue[1];
@@ -3593,27 +3723,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
}
// remove from arena teams
- uint32 at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_2v2);
- if(at_id != 0)
- {
- ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
- if(at)
- at->DelMember(playerguid);
- }
- at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_3v3);
- if(at_id != 0)
- {
- ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
- if(at)
- at->DelMember(playerguid);
- }
- at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_5v5);
- if(at_id != 0)
- {
- ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
- if(at)
- at->DelMember(playerguid);
- }
+ LeaveAllArenaTeams(playerguid);
// the player was uninvited already on logout so just remove from group
QueryResult *resultGroup = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", guid);
@@ -3654,15 +3764,16 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
MailItemsInfo mi;
if(has_items)
{
- QueryResult *resultItems = CharacterDatabase.PQuery("SELECT item_guid,item_template FROM mail_items WHERE mail_id='%u'", mail_id);
+ // data needs to be at first place for Item::LoadFromDB
+ QueryResult *resultItems = CharacterDatabase.PQuery("SELECT data,item_guid,item_template FROM mail_items JOIN item_instance ON item_guid = guid WHERE mail_id='%u'", mail_id);
if(resultItems)
{
do
{
Field *fields2 = resultItems->Fetch();
- uint32 item_guidlow = fields2[0].GetUInt32();
- uint32 item_template = fields2[1].GetUInt32();
+ uint32 item_guidlow = fields2[1].GetUInt32();
+ uint32 item_template = fields2[2].GetUInt32();
ItemPrototype const* itemProto = objmgr.GetItemPrototype(item_template);
if(!itemProto)
@@ -3672,7 +3783,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
}
Item *pItem = NewItemOrBag(itemProto);
- if(!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)))
+ if(!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER),resultItems))
{
pItem->FSetState(ITEM_REMOVED);
pItem->SaveToDB(); // it also deletes item object !
@@ -3735,6 +3846,8 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
CharacterDatabase.PExecute("DELETE FROM mail_items WHERE receiver = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_pet WHERE owner = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid);
+ CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
+ CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
CharacterDatabase.CommitTransaction();
//LoginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID);
@@ -3765,6 +3878,10 @@ void Player::SetMovement(PlayerMovementType pType)
*/
void Player::BuildPlayerRepop()
{
+ WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size());
+ data.append(GetPackGUID());
+ GetSession()->SendPacket(&data);
+
if(getRace() == RACE_NIGHTELF)
CastSpell(this, 20584, true); // auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form)
CastSpell(this, 8326, true); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?)
@@ -3809,7 +3926,8 @@ void Player::BuildPlayerRepop()
SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, (float)1.0); //see radius of death player?
- SetByteValue(UNIT_FIELD_BYTES_1, 3, PLAYER_STATE_FLAG_ALWAYS_STAND);
+ // set and clear other
+ SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
}
void Player::SendDelayResponse(const uint32 ml_seconds)
@@ -3884,8 +4002,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
{
if(Aura* Aur = GetAura(SPELL_ID_PASSIVE_RESURRECTION_SICKNESS,i))
{
- Aur->SetAuraDuration(delta*1000);
- Aur->UpdateAuraDuration();
+ Aur->SetAuraDurationAndUpdate(delta*1000);
}
}
}
@@ -3926,8 +4043,7 @@ void Player::CreateCorpse()
Corpse *corpse = new Corpse( (m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH) ? CORPSE_RESURRECTABLE_PVP : CORPSE_RESURRECTABLE_PVE );
SetPvPDeath(false);
- if(!corpse->Create(objmgr.GenerateLowGuid(HIGHGUID_CORPSE), this, GetMapId(), GetPositionX(),
- GetPositionY(), GetPositionZ(), GetOrientation()))
+ if(!corpse->Create(objmgr.GenerateLowGuid(HIGHGUID_CORPSE), this))
{
delete corpse;
return;
@@ -4423,7 +4539,7 @@ uint32 Player::GetShieldBlockValue() const
{
BaseModGroup modGroup = SHIELD_BLOCK_VALUE;
- float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH)/20 - 1;
+ float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH) * 0.5f - 10;
value = (value < 0) ? 0 : value;
@@ -4612,7 +4728,18 @@ float Player::OCTRegenMPPerSpirit()
void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
{
- ApplyModUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr, value, apply);
+ m_baseRatingValue[cr]+=(apply ? value : -value);
+
+ int32 amount = uint32(m_baseRatingValue[cr]);
+ // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
+ // stat used stored in miscValueB for this aura
+ AuraList const& modRatingFromStat = GetAurasByType(SPELL_AURA_MOD_RATING_FROM_STAT);
+ for(AuraList::const_iterator i = modRatingFromStat.begin();i != modRatingFromStat.end(); ++i)
+ if ((*i)->GetMiscValue() & (1<<cr))
+ amount += int32(GetStat(Stats((*i)->GetMiscBValue())) * (*i)->GetModifier()->m_amount / 100.0f);
+ if (amount < 0)
+ amount = 0;
+ SetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr, uint32(amount));
float RatingCoeffecient = GetRatingCoefficient(cr);
float RatingChange = 0.0f;
@@ -4635,16 +4762,13 @@ void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
UpdateBlockPercentage();
break;
case CR_HIT_MELEE:
- RatingChange = value / RatingCoeffecient;
- m_modMeleeHitChance += apply ? RatingChange : -RatingChange;
+ UpdateMeleeHitChances();
break;
case CR_HIT_RANGED:
- RatingChange = value / RatingCoeffecient;
- m_modRangedHitChance += apply ? RatingChange : -RatingChange;
+ UpdateRangedHitChances();
break;
case CR_HIT_SPELL:
- RatingChange = value / RatingCoeffecient;
- m_modSpellHitChance += apply ? RatingChange : -RatingChange;
+ UpdateSpellHitChances();
break;
case CR_CRIT_MELEE:
if(affectStats)
@@ -4742,6 +4866,7 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step)
new_value = max;
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(new_value,max));
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
return true;
}
@@ -4777,7 +4902,7 @@ bool Player::UpdateCraftSkill(uint32 spellid)
if(spellEntry && spellEntry->Mechanic==MECHANIC_DISCOVERY)
{
if(uint32 discoveredSpell = GetSkillDiscoverySpell(_spell_idx->second->skillId, spellid, this))
- learnSpell(discoveredSpell);
+ learnSpell(discoveredSpell,false);
}
uint32 craft_skill_gain = sWorld.getConfig(CONFIG_SKILL_GAIN_CRAFTING);
@@ -4804,6 +4929,7 @@ bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLeve
case SKILL_HERBALISM:
case SKILL_LOCKPICKING:
case SKILL_JEWELCRAFTING:
+ case SKILL_INSCRIPTION:
return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator,gathering_skill_gain);
case SKILL_SKINNING:
if( sWorld.getConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS)==0)
@@ -4832,6 +4958,11 @@ bool Player::UpdateFishingSkill()
return UpdateSkillPro(SKILL_FISHING,chance*10,gathering_skill_gain);
}
+// levels sync. with spell requirement for skill levels to learn
+// bonus abilities in sSkillLineAbilityStore
+// Used only to avoid scan DBC at each skill grow
+static uint32 bonusSkillLevels[] = {75,150,225,300,375,450};
+
bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
{
sLog.outDebug("UpdateSkillPro(SkillId %d, Chance %3.1f%%)", SkillId, Chance/10.0);
@@ -4866,6 +4997,15 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
new_value = MaxValue;
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(new_value,MaxValue));
+ for(uint32* bsl = &bonusSkillLevels[0]; *bsl; ++bsl)
+ {
+ if((SkillValue < *bsl && new_value >= *bsl))
+ {
+ learnSkillRewardedSpells( SkillId, new_value);
+ break;
+ }
+ }
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
sLog.outDebug("Player::UpdateSkillPro Chance=%3.1f%% taken", Chance/10.0);
return true;
}
@@ -4913,22 +5053,8 @@ void Player::UpdateWeaponSkill (WeaponAttackType attType)
UpdateAllCritPercentages();
}
-void Player::UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, MeleeHitOutcome outcome, bool defence)
+void Player::UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, bool defence)
{
-/* Not need, this checked on call this func from trigger system
- switch(outcome)
- {
- case MELEE_HIT_CRIT:
- case MELEE_HIT_DODGE:
- case MELEE_HIT_PARRY:
- case MELEE_HIT_BLOCK:
- case MELEE_HIT_BLOCK_CRIT:
- return;
-
- default:
- break;
- }
-*/
uint32 plevel = getLevel(); // if defense than pVictim == attacker
uint32 greylevel = Trinity::XP::GetGrayLevel(plevel);
uint32 moblevel = pVictim->getLevelForTarget(this);
@@ -5025,7 +5151,7 @@ void Player::UpdateSkillsToMaxSkillsForLevel()
if (GetUInt32Value(PLAYER_SKILL_INDEX(i)))
{
uint32 pskill = GetUInt32Value(PLAYER_SKILL_INDEX(i)) & 0x0000FFFF;
- if( IsProfessionSkill(pskill) || pskill == SKILL_RIDING )
+ if( IsProfessionOrRidingSkill(pskill))
continue;
uint32 data = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i));
@@ -5053,7 +5179,11 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
if(i<PLAYER_MAX_SKILLS) //has skill
{
if(currVal)
+ {
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
+ learnSkillRewardedSpells(id, currVal);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
+ }
else //remove
{
// clear skill fields
@@ -5061,27 +5191,11 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),0);
SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
- // remove spells that depend on this skill when removing the skill
- for (PlayerSpellMap::const_iterator itr = m_spells.begin(), next = m_spells.begin(); itr != m_spells.end(); itr = next)
- {
- ++next;
- if(itr->second->state == PLAYERSPELL_REMOVED)
- continue;
-
- SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(itr->first);
- SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(itr->first);
-
- for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
- {
- if (_spell_idx->second->skillId == id)
- {
- // this may remove more than one spell (dependents)
- removeSpell(itr->first);
- next = m_spells.begin();
- break;
- }
- }
- }
+ // remove all spells that related to this skill
+ for (uint32 j=0; j<sSkillLineAbilityStore.GetNumRows(); ++j)
+ if(SkillLineAbilityEntry const *pAbility = sSkillLineAbilityStore.LookupEntry(j))
+ if (pAbility->skillId==id)
+ removeSpell(spellmgr.GetFirstSpellInChain(pAbility->spellId));
}
}
else if(currVal) //add
@@ -5101,6 +5215,7 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
else
SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
// apply skill bonuses
SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
@@ -5118,7 +5233,7 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
(*i)->ApplyModifier(true);
// Learn all spells for skill
- learnSkillRewardedSpells(id);
+ learnSkillRewardedSpells(id, currVal);
return;
}
}
@@ -5216,6 +5331,22 @@ uint16 Player::GetPureSkillValue(uint32 skill) const
return 0;
}
+int16 Player::GetSkillPermBonusValue(uint32 skill) const
+{
+ if(!skill)
+ return 0;
+
+ for (int i = 0; i < PLAYER_MAX_SKILLS; i++)
+ {
+ if ((GetUInt32Value(PLAYER_SKILL_INDEX(i)) & 0x0000FFFF) == skill)
+ {
+ return SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i)));
+ }
+ }
+
+ return 0;
+}
+
int16 Player::GetSkillTempBonusValue(uint32 skill) const
{
if(!skill)
@@ -5371,17 +5502,17 @@ void Player::SaveRecallPosition()
void Player::SendMessageToSet(WorldPacket *data, bool self, bool to_possessor)
{
- MapManager::Instance().GetMap(GetMapId(), this)->MessageBroadcast(this, data, self, to_possessor);
+ GetMap()->MessageBroadcast(this, data, self, to_possessor);
}
void Player::SendMessageToSetInRange(WorldPacket *data, float dist, bool self, bool to_possessor)
{
- MapManager::Instance().GetMap(GetMapId(), this)->MessageDistBroadcast(this, data, dist, self, to_possessor);
+ GetMap()->MessageDistBroadcast(this, data, dist, self, to_possessor);
}
void Player::SendMessageToSetInRange(WorldPacket *data, float dist, bool self, bool to_possessor, bool own_team_only)
{
- MapManager::Instance().GetMap(GetMapId(), this)->MessageDistBroadcast(this, data, dist, self, to_possessor, own_team_only);
+ GetMap()->MessageDistBroadcast(this, data, dist, self, to_possessor, own_team_only);
}
void Player::SendDirectMessage(WorldPacket *data)
@@ -5397,14 +5528,14 @@ void Player::CheckExploreSystem()
if (isInFlight())
return;
- uint16 areaFlag=MapManager::Instance().GetBaseMap(GetMapId())->GetAreaFlag(GetPositionX(),GetPositionY());
+ uint16 areaFlag=MapManager::Instance().GetBaseMap(GetMapId())->GetAreaFlag(GetPositionX(),GetPositionY(),GetPositionZ());
if(areaFlag==0xffff)
return;
int offset = areaFlag / 32;
if(offset >= 128)
{
- sLog.outError("ERROR: Wrong area flag %u in map data for (X: %f Y: %f) point to field PLAYER_EXPLORED_ZONES_1 + %u ( %u must be < 64 ).",areaFlag,GetPositionX(),GetPositionY(),offset,offset);
+ sLog.outError("ERROR: Wrong area flag %u in map data for (X: %f Y: %f) point to field PLAYER_EXPLORED_ZONES_1 + %u ( %u must be < 128 ).",areaFlag,GetPositionX(),GetPositionY(),offset,offset);
return;
}
@@ -5415,6 +5546,8 @@ void Player::CheckExploreSystem()
{
SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA);
+
AreaTableEntry const *p = GetAreaEntryByAreaFlagAndMap(areaFlag,GetMapId());
if(!p)
{
@@ -5511,6 +5644,7 @@ void Player::SendFactionState(FactionState const* faction) const
{
WorldPacket data(SMSG_SET_FACTION_STANDING, (16)); // last check 2.4.0
data << (float) 0; // unk 2.4.0
+ data << (uint8) 0; // wotlk 8634
data << (uint32) 1; // count
// for
data << (uint32) faction->ReputationListID;
@@ -5820,7 +5954,7 @@ bool Player::ModifyOneFactionReputation(FactionEntry const* factionEntry, int32
SetFactionVisible(&itr->second);
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
if(uint32 questid = GetQuestSlotQuestId(i))
{
@@ -5842,7 +5976,8 @@ bool Player::ModifyOneFactionReputation(FactionEntry const* factionEntry, int32
}
}
}
-
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION);
SendFactionState(&(itr->second));
return true;
@@ -5908,6 +6043,8 @@ bool Player::SetOneFactionReputation(FactionEntry const* factionEntry, int32 sta
SetFactionAtWar(&itr->second,true);
SendFactionState(&(itr->second));
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION);
return true;
}
return false;
@@ -6106,12 +6243,7 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor, bool pvpt
victim_guid = 0; // Don't show HK: <rank> message, only log.
}
- if(k_level <= 5)
- k_grey = 0;
- else if( k_level <= 39 )
- k_grey = k_level - 5 - k_level/10;
- else
- k_grey = k_level - 1 - k_level/5;
+ k_grey = Trinity::XP::GetGrayLevel(k_level);
if(v_level<=k_grey)
return false;
@@ -6147,6 +6279,8 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor, bool pvpt
if(groupsize > 1)
honor /= groupsize;
+ // apply honor multiplier from aura (not stacking-get highest)
+ honor = int32(float(honor) * (float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HONOR_GAIN_PCT))+100.0f)/100.0f);
honor *= (((float)urand(8,12))/10); // approx honor: 80% - 120% of real honor
}
@@ -6176,8 +6310,8 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor, bool pvpt
{
// Check if allowed to receive it in current map
uint8 MapType = sWorld.getConfig(CONFIG_PVP_TOKEN_MAP_TYPE);
- if( (MapType == 1 && !InBattleGround() && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP))
- || (MapType == 2 && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP))
+ if( (MapType == 1 && !InBattleGround() && !HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))
+ || (MapType == 2 && !HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))
|| (MapType == 3 && !InBattleGround()) )
return true;
@@ -6235,24 +6369,18 @@ void Player::ModifyArenaPoints( int32 value )
uint32 Player::GetGuildIdFromDB(uint64 guid)
{
- std::ostringstream ss;
- ss<<"SELECT guildid FROM guild_member WHERE guid='"<<guid<<"'";
- QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
- if( result )
- {
- uint32 v = result->Fetch()[0].GetUInt32();
- delete result;
- return v;
- }
- else
+ QueryResult* result = CharacterDatabase.PQuery("SELECT guildid FROM guild_member WHERE guid='%u'", GUID_LOPART(guid));
+ if(!result)
return 0;
+
+ uint32 id = result->Fetch()[0].GetUInt32();
+ delete result;
+ return id;
}
uint32 Player::GetRankFromDB(uint64 guid)
{
- std::ostringstream ss;
- ss<<"SELECT rank FROM guild_member WHERE guid='"<<guid<<"'";
- QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
+ QueryResult *result = CharacterDatabase.PQuery( "SELECT rank FROM guild_member WHERE guid='%u'", GUID_LOPART(guid) );
if( result )
{
uint32 v = result->Fetch()[0].GetUInt32();
@@ -6276,10 +6404,8 @@ uint32 Player::GetArenaTeamIdFromDB(uint64 guid, uint8 type)
uint32 Player::GetZoneIdFromDB(uint64 guid)
{
- std::ostringstream ss;
-
- ss<<"SELECT zone FROM characters WHERE guid='"<<GUID_LOPART(guid)<<"'";
- QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
+ uint32 guidLow = GUID_LOPART(guid);
+ QueryResult *result = CharacterDatabase.PQuery( "SELECT zone FROM characters WHERE guid='%u'", guidLow );
if (!result)
return 0;
Field* fields = result->Fetch();
@@ -6289,22 +6415,19 @@ uint32 Player::GetZoneIdFromDB(uint64 guid)
if (!zone)
{
// stored zone is zero, use generic and slow zone detection
- ss.str("");
- ss<<"SELECT map,position_x,position_y FROM characters WHERE guid='"<<GUID_LOPART(guid)<<"'";
- result = CharacterDatabase.Query(ss.str().c_str());
+ result = CharacterDatabase.PQuery("SELECT map,position_x,position_y,position_z FROM characters WHERE guid='%u'", guidLow);
if( !result )
return 0;
fields = result->Fetch();
- uint32 map = fields[0].GetUInt32();
+ uint32 map = fields[0].GetUInt32();
float posx = fields[1].GetFloat();
float posy = fields[2].GetFloat();
+ float posz = fields[3].GetFloat();
delete result;
- zone = MapManager::Instance().GetZoneId(map,posx,posy);
+ zone = MapManager::Instance().GetZoneId(map,posx,posy,posz);
- ss.str("");
- ss << "UPDATE characters SET zone='"<<zone<<"' WHERE guid='"<<GUID_LOPART(guid)<<"'";
- CharacterDatabase.Execute(ss.str().c_str());
+ CharacterDatabase.PExecute("UPDATE characters SET zone='%u' WHERE guid='%u'", zone, guidLow);
}
return zone;
@@ -6321,14 +6444,14 @@ void Player::UpdateArea(uint32 newArea)
if(area && (area->flags & AREA_FLAG_ARENA))
{
if(!isGameMaster())
- SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP);
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
}
else
{
// remove ffa flag only if not ffapvp realm
// removal in sanctuaries and capitals is handled in zone update
- if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP) && !sWorld.IsFFAPvPRealm())
- RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP);
+ if(HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) && !sWorld.IsFFAPvPRealm())
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
}
UpdateAreaDependentAuras(newArea);
@@ -6390,13 +6513,13 @@ void Player::UpdateZone(uint32 newZone)
if(zone->flags & AREA_FLAG_SANCTUARY) // in sanctuary
{
- SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY);
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);
if(sWorld.IsFFAPvPRealm())
- RemoveFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
}
else
{
- RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY);
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);
}
if(zone->flags & AREA_FLAG_CAPITAL) // in capital city
@@ -6406,7 +6529,7 @@ void Player::UpdateZone(uint32 newZone)
InnEnter(time(0),GetMapId(),0,0,0);
if(sWorld.IsFFAPvPRealm())
- RemoveFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
}
else // anywhere else
{
@@ -6420,7 +6543,7 @@ void Player::UpdateZone(uint32 newZone)
SetRestType(REST_TYPE_NO);
if(sWorld.IsFFAPvPRealm())
- SetFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
}
}
else // not in tavern (leave city then)
@@ -6430,7 +6553,7 @@ void Player::UpdateZone(uint32 newZone)
// Set player to FFA PVP when not in rested environment.
if(sWorld.IsFFAPvPRealm())
- SetFlag(PLAYER_FLAGS,PLAYER_FLAGS_FFA_PVP);
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
}
}
}
@@ -6600,7 +6723,12 @@ void Player::_ApplyItemMods(Item *item, uint8 slot,bool apply)
sLog.outDetail("applying mods for item %u ",item->GetGUIDLow());
- uint32 attacktype = Player::GetAttackBySlot(slot);
+ uint8 attacktype = Player::GetAttackBySlot(slot);
+
+ //check disarm only on mod apply to allow remove item mods
+ if (apply && !CanUseAttackType(attacktype) )
+ return;
+
if(attacktype < MAX_ATTACK)
_ApplyWeaponDependentAuraMods(item,WeaponAttackType(attacktype),apply);
@@ -6618,19 +6746,43 @@ void Player::_ApplyItemMods(Item *item, uint8 slot,bool apply)
sLog.outDebug("_ApplyItemMods complete.");
}
-void Player::_ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply)
+void Player::_ApplyItemBonuses(ItemPrototype const *proto, uint8 slot, bool apply)
{
if(slot >= INVENTORY_SLOT_BAG_END || !proto)
return;
for (int i = 0; i < 10; i++)
{
- float val = float (proto->ItemStat[i].ItemStatValue);
+ uint32 statType = 0;
+ int32 val = 0;
+
+ if(proto->ScalingStatDistribution)
+ {
+ if(ScalingStatDistributionEntry const *ssd = sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution))
+ {
+ statType = ssd->StatMod[i];
+
+ if(uint32 modifier = ssd->Modifier[i])
+ {
+ uint32 level = ((getLevel() > ssd->MaxLevel) ? ssd->MaxLevel : getLevel());
+ if(ScalingStatValuesEntry const *ssv = sScalingStatValuesStore.LookupEntry(level))
+ {
+ uint32 multiplier = ssv->Multiplier[proto->GetScalingStatValuesColumn()];
+ val = (multiplier * modifier) / 10000;
+ }
+ }
+ }
+ }
+ else
+ {
+ statType = proto->ItemStat[i].ItemStatType;
+ val = proto->ItemStat[i].ItemStatValue;
+ }
- if(val==0)
+ if(val == 0)
continue;
- switch (proto->ItemStat[i].ItemStatType)
+ switch (statType)
{
case ITEM_MOD_MANA:
HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
@@ -6748,6 +6900,32 @@ void Player::_ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply)
case ITEM_MOD_EXPERTISE_RATING:
ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
break;
+ case ITEM_MOD_ATTACK_POWER:
+ HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(val), apply);
+ HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(val), apply);
+ break;
+ case ITEM_MOD_RANGED_ATTACK_POWER:
+ HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(val), apply);
+ break;
+ case ITEM_MOD_FERAL_ATTACK_POWER:
+ ApplyFeralAPBonus(int32(val), apply);
+ break;
+ case ITEM_MOD_SPELL_HEALING_DONE:
+ ApplySpellHealingBonus(int32(val), apply);
+ break;
+ case ITEM_MOD_SPELL_DAMAGE_DONE:
+ ApplySpellDamageBonus(int32(val), apply);
+ break;
+ case ITEM_MOD_MANA_REGENERATION:
+ ApplyManaRegenBonus(int32(val), apply);
+ break;
+ case ITEM_MOD_ARMOR_PENETRATION_RATING:
+ ApplyRatingMod(CR_ARMOR_PENETRATION, int32(val), apply);
+ break;
+ case ITEM_MOD_SPELL_POWER:
+ ApplySpellHealingBonus(int32(val), apply);
+ ApplySpellDamageBonus(int32(val), apply);
+ break;
}
}
@@ -6802,7 +6980,15 @@ void Player::_ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply)
SetBaseWeaponDamage(attType, MAXDAMAGE, damage);
}
- if(!IsUseEquipedWeapon(slot==EQUIPMENT_SLOT_MAINHAND))
+ // Druids get feral AP bonus from weapon dps
+ if(getClass() == CLASS_DRUID)
+ {
+ int32 feral_bonus = proto->getFeralBonus();
+ if (feral_bonus > 0)
+ ApplyFeralAPBonus(feral_bonus, apply);
+ }
+
+ if(!IsInFeralForm() || !CanUseAttackType(attType))
return;
if (proto->Delay)
@@ -6851,7 +7037,7 @@ void Player::_ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attac
if (item->IsFitToSpellRequirements(aura->GetSpellProto()))
{
- HandleBaseModValue(mod, FLAT_MOD, float (aura->GetModifierValue()), apply);
+ HandleBaseModValue(mod, FLAT_MOD, float (aura->GetModifier()->m_amount), apply);
}
}
@@ -6885,7 +7071,7 @@ void Player::_ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType att
if (item->IsFitToSpellRequirements(aura->GetSpellProto()))
{
- HandleStatModifier(unitMod, unitModType, float(aura->GetModifierValue()),apply);
+ HandleStatModifier(unitMod, unitModType, float(aura->GetModifier()->m_amount),apply);
}
}
@@ -7080,6 +7266,92 @@ void Player::CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attTy
}
}
+void Player::CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 cast_count, uint32 glyphIndex)
+{
+ ItemPrototype const* proto = item->GetProto();
+ // special learning case
+ if(proto->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN || proto->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN_PET)
+ {
+ uint32 learn_spell_id = proto->Spells[0].SpellId;
+ uint32 learning_spell_id = proto->Spells[1].SpellId;
+
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(learn_spell_id);
+ if(!spellInfo)
+ {
+ sLog.outError("Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, learn_spell_id);
+ SendEquipError(EQUIP_ERR_NONE,item,NULL);
+ return;
+ }
+
+ Spell *spell = new Spell(this, spellInfo, false);
+ spell->m_CastItem = item;
+ spell->m_cast_count = cast_count; //set count of casts
+ spell->m_currentBasePoints[0] = learning_spell_id;
+ spell->prepare(&targets);
+ return;
+ }
+
+ // use triggered flag only for items with many spell casts and for not first cast
+ int count = 0;
+
+ // item spells casted at use
+ for(int i = 0; i < 5; ++i)
+ {
+ _Spell const& spellData = proto->Spells[i];
+
+ // no spell
+ if(!spellData.SpellId)
+ continue;
+
+ // wrong triggering type
+ if( spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE && spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_NO_DELAY_USE)
+ continue;
+
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellData.SpellId);
+ if(!spellInfo)
+ {
+ sLog.outError("Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring",proto->ItemId, spellData.SpellId);
+ continue;
+ }
+
+ Spell *spell = new Spell(this, spellInfo, (count > 0));
+ spell->m_CastItem = item;
+ spell->m_cast_count = cast_count; // set count of casts
+ spell->m_glyphIndex = glyphIndex; // glyph index
+ spell->prepare(&targets);
+
+ ++count;
+ }
+
+ // Item enchantments spells casted at use
+ for(int e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
+ {
+ uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
+ SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
+ if(!pEnchant) continue;
+ for (int s=0;s<3;s++)
+ {
+ if(pEnchant->type[s]!=ITEM_ENCHANTMENT_TYPE_USE_SPELL)
+ continue;
+
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(pEnchant->spellid[s]);
+ if (!spellInfo)
+ {
+ sLog.outError("Player::CastItemUseSpell Enchant %i, cast unknown spell %i", pEnchant->ID, pEnchant->spellid[s]);
+ continue;
+ }
+
+ Spell *spell = new Spell(this, spellInfo, (count > 0));
+ spell->m_CastItem = item;
+ spell->m_cast_count = cast_count; // set count of casts
+ spell->m_glyphIndex = glyphIndex; // glyph index
+ spell->prepare(&targets);
+
+ ++count;
+ }
+ }
+}
+
void Player::_RemoveAllItemMods()
{
sLog.outDebug("_RemoveAllItemMods start.");
@@ -7255,7 +7527,7 @@ void Player::RemovedInsignia(Player* looterPlr)
// We have to convert player corpse to bones, not to be able to resurrect there
// SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
- Corpse *bones = ObjectAccessor::Instance().ConvertCorpseForPlayer(GetGUID());
+ Corpse *bones = ObjectAccessor::Instance().ConvertCorpseForPlayer(GetGUID(),true);
if (!bones)
return;
@@ -7322,11 +7594,11 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
{
sLog.outDebug(" if(lootid)");
loot->clear();
- loot->FillLoot(lootid, LootTemplates_Gameobject, this);
+ loot->FillLoot(lootid, LootTemplates_Gameobject, this, false);
}
if(loot_type == LOOT_FISHING)
- go->getFishLoot(loot);
+ go->getFishLoot(loot,this);
go->SetLootState(GO_ACTIVATED);
}
@@ -7349,7 +7621,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
{
item->m_lootGenerated = true;
loot->clear();
- loot->FillLoot(item->GetProto()->DisenchantID, LootTemplates_Disenchant, this);
+ loot->FillLoot(item->GetProto()->DisenchantID, LootTemplates_Disenchant, this,true);
}
}
else if(loot_type == LOOT_PROSPECTING)
@@ -7360,7 +7632,18 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
{
item->m_lootGenerated = true;
loot->clear();
- loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this);
+ loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this,true);
+ }
+ }
+ else if(loot_type == LOOT_MILLING)
+ {
+ loot = &item->loot;
+
+ if(!item->m_lootGenerated)
+ {
+ item->m_lootGenerated = true;
+ loot->clear();
+ loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this,true);
}
}
else
@@ -7371,7 +7654,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
{
item->m_lootGenerated = true;
loot->clear();
- loot->FillLoot(item->GetEntry(), LootTemplates_Item, this);
+ loot->FillLoot(item->GetEntry(), LootTemplates_Item, this,true);
loot->generateMoneyLoot(item->GetProto()->MinMoneyLoot,item->GetProto()->MaxMoneyLoot);
}
@@ -7395,7 +7678,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
uint32 pLevel = bones->loot.gold;
bones->loot.clear();
if(GetBattleGround()->GetTypeID() == BATTLEGROUND_AV)
- loot->FillLoot(1, LootTemplates_Creature, this);
+ loot->FillLoot(1, LootTemplates_Creature, this, true);
// It may need a better formula
// Now it works like this: lvl10: ~6copper, lvl70: ~9silver
bones->loot.gold = (uint32)( urand(50, 150) * 0.016f * pow( ((float)pLevel)/5.76f, 2.5f) * sWorld.getRate(RATE_DROP_MONEY) );
@@ -7431,7 +7714,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
loot->clear();
if (uint32 lootid = creature->GetCreatureInfo()->pickpocketLootId)
- loot->FillLoot(lootid, LootTemplates_Pickpocketing, this);
+ loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, false);
// Generate extra money for pick pocket loot
const uint32 a = urand(0, creature->getLevel()/2);
@@ -7461,7 +7744,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
loot->clear();
if (uint32 lootid = creature->GetCreatureInfo()->lootid)
- loot->FillLoot(lootid, LootTemplates_Creature, recipient);
+ loot->FillLoot(lootid, LootTemplates_Creature, recipient, false);
loot->generateMoneyLoot(creature->GetCreatureInfo()->mingold,creature->GetCreatureInfo()->maxgold);
@@ -7491,7 +7774,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
if (loot_type == LOOT_SKINNING)
{
loot->clear();
- loot->FillLoot(creature->GetCreatureInfo()->SkinLootId, LootTemplates_Skinning, this);
+ loot->FillLoot(creature->GetCreatureInfo()->SkinLootId, LootTemplates_Skinning, this, false);
}
// set group rights only for loot_type != LOOT_SKINNING
else
@@ -7525,41 +7808,8 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
SetLootGUID(guid);
- QuestItemList *q_list = 0;
- if (permission != NONE_PERMISSION)
- {
- QuestItemMap const& lootPlayerQuestItems = loot->GetPlayerQuestItems();
- QuestItemMap::const_iterator itr = lootPlayerQuestItems.find(GetGUIDLow());
- if (itr == lootPlayerQuestItems.end())
- q_list = loot->FillQuestLoot(this);
- else
- q_list = itr->second;
- }
-
- QuestItemList *ffa_list = 0;
- if (permission != NONE_PERMISSION)
- {
- QuestItemMap const& lootPlayerFFAItems = loot->GetPlayerFFAItems();
- QuestItemMap::const_iterator itr = lootPlayerFFAItems.find(GetGUIDLow());
- if (itr == lootPlayerFFAItems.end())
- ffa_list = loot->FillFFALoot(this);
- else
- ffa_list = itr->second;
- }
-
- QuestItemList *conditional_list = 0;
- if (permission != NONE_PERMISSION)
- {
- QuestItemMap const& lootPlayerNonQuestNonFFAConditionalItems = loot->GetPlayerNonQuestNonFFAConditionalItems();
- QuestItemMap::const_iterator itr = lootPlayerNonQuestNonFFAConditionalItems.find(GetGUIDLow());
- if (itr == lootPlayerNonQuestNonFFAConditionalItems.end())
- conditional_list = loot->FillNonQuestNonFFAConditionalLoot(this);
- else
- conditional_list = itr->second;
- }
-
- // LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_DISENCHANTING and LOOT_INSIGNIA unsupported by client, sending LOOT_SKINNING instead
- if(loot_type == LOOT_PICKPOCKETING || loot_type == LOOT_DISENCHANTING || loot_type == LOOT_PROSPECTING || loot_type == LOOT_INSIGNIA)
+ // LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_DISENCHANTING, LOOT_INSIGNIA and LOOT_MILLING unsupported by client, sending LOOT_SKINNING instead
+ if(loot_type == LOOT_PICKPOCKETING || loot_type == LOOT_DISENCHANTING || loot_type == LOOT_PROSPECTING || loot_type == LOOT_INSIGNIA || loot_type == LOOT_MILLING)
loot_type = LOOT_SKINNING;
if(loot_type == LOOT_FISHINGHOLE)
@@ -7569,7 +7819,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
data << uint64(guid);
data << uint8(loot_type);
- data << LootView(*loot, q_list, ffa_list, conditional_list, this, permission);
+ data << LootView(*loot, this, permission);
SendDirectMessage(&data);
@@ -7636,46 +7886,46 @@ void Player::SendInitWorldStates(bool forceZone, uint32 forceZoneId)
case 1537:
case 2257:
case 2918:
- NumberOfFields = 6;
+ NumberOfFields = 8;
break;
case 139:
- NumberOfFields = 39;
+ NumberOfFields = 41;
break;
case 1377:
- NumberOfFields = 13;
+ NumberOfFields = 15;
break;
case 2597:
- NumberOfFields = 81;
+ NumberOfFields = 83;
break;
case 3277:
- NumberOfFields = 14;
+ NumberOfFields = 16;
break;
case 3358:
case 3820:
- NumberOfFields = 38;
+ NumberOfFields = 40;
break;
case 3483:
- NumberOfFields = 25;
+ NumberOfFields = 27;
break;
case 3518:
- NumberOfFields = 37;
+ NumberOfFields = 39;
break;
case 3519:
- NumberOfFields = 36;
+ NumberOfFields = 38;
break;
case 3521:
- NumberOfFields = 35;
+ NumberOfFields = 37;
break;
case 3698:
case 3702:
case 3968:
- NumberOfFields = 9;
+ NumberOfFields = 11;
break;
case 3703:
- NumberOfFields = 9;
+ NumberOfFields = 11;
break;
default:
- NumberOfFields = 10;
+ NumberOfFields = 12;
break;
}
@@ -7690,6 +7940,10 @@ void Player::SendInitWorldStates(bool forceZone, uint32 forceZoneId)
data << uint32(0x8d5) << uint32(0x0); // 4
data << uint32(0x8d4) << uint32(0x0); // 5
data << uint32(0x8d3) << uint32(0x0); // 6
+ // 7 1 - Arena season in progress, 0 - end of season
+ data << uint32(0xC77) << uint32(sWorld.getConfig(CONFIG_ARENA_SEASON_IN_PROGRESS));
+ // 8 Arena season id
+ data << uint32(0xF3D) << uint32(sWorld.getConfig(CONFIG_ARENA_SEASON_ID));
if(mapid == 530) // Outland
{
data << uint32(0x9bf) << uint32(0x0); // 7
@@ -8283,7 +8537,8 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
// (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
if(CanDualWield())
slots[1] = EQUIPMENT_SLOT_OFFHAND;
- };break;
+ break;
+ };
case INVTYPE_SHIELD:
slots[0] = EQUIPMENT_SLOT_OFFHAND;
break;
@@ -8292,6 +8547,8 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
break;
case INVTYPE_2HWEAPON:
slots[0] = EQUIPMENT_SLOT_MAINHAND;
+ if (CanDualWield() && CanTitanGrip())
+ slots[1] = EQUIPMENT_SLOT_OFFHAND;
break;
case INVTYPE_TABARD:
slots[0] = EQUIPMENT_SLOT_TABARD;
@@ -8337,6 +8594,10 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
if (pClass == CLASS_WARLOCK)
slots[0] = EQUIPMENT_SLOT_RANGED;
break;
+ case ITEM_SUBCLASS_ARMOR_SIGIL:
+ if (pClass == CLASS_DEATH_KNIGHT)
+ slots[0] = EQUIPMENT_SLOT_RANGED;
+ break;
}
break;
}
@@ -8362,14 +8623,8 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
{
if ( slots[i] != NULL_SLOT && !GetItemByPos( INVENTORY_SLOT_BAG_0, slots[i] ) )
{
- // in case 2hand equipped weapon offhand slot empty but not free
- if(slots[i]==EQUIPMENT_SLOT_OFFHAND)
- {
- Item* mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
- if(!mainItem || mainItem->GetProto()->InventoryType != INVTYPE_2HWEAPON)
- return slots[i];
- }
- else
+ // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
+ if(slots[i]!=EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
return slots[i];
}
}
@@ -8419,7 +8674,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
return EQUIP_ERR_OK;
}
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -8461,7 +8716,7 @@ uint32 Player::GetItemCount( uint32 item, bool inBankAlso, Item* skipItem ) cons
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
count += pItem->GetCount();
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
@@ -8521,7 +8776,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const
if( pItem && pItem->GetGUID() == guid )
return pItem;
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetGUID() == guid )
@@ -8567,7 +8822,7 @@ Item* Player::GetItemByPos( uint16 pos ) const
Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const
{
- if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END ) )
+ if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) )
return m_items[slot];
else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END
|| bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END )
@@ -8590,14 +8845,14 @@ Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable) cons
default: return NULL;
}
- Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
+ Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, slot);
if (!item || item->GetProto()->Class != ITEM_CLASS_WEAPON)
return NULL;
if(!useable)
return item;
- if( item->IsBroken() || !IsUseEquipedWeapon(attackType==BASE_ATTACK) )
+ if( item->IsBroken() || IsInFeralForm())
return NULL;
return item;
@@ -8605,7 +8860,7 @@ Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable) cons
Item* Player::GetShield(bool useable) const
{
- Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+ Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
if (!item || item->GetProto()->Class != ITEM_CLASS_ARMOR)
return NULL;
@@ -8618,7 +8873,7 @@ Item* Player::GetShield(bool useable) const
return item;
}
-uint32 Player::GetAttackBySlot( uint8 slot )
+uint8 Player::GetAttackBySlot( uint8 slot )
{
switch(slot)
{
@@ -8645,7 +8900,7 @@ bool Player::IsInventoryPos( uint8 bag, uint8 slot )
return true;
if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END )
return true;
- if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END ) )
+ if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) )
return true;
return false;
}
@@ -8766,7 +9021,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
return true;
}
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -8826,31 +9081,76 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
return false;
}
-Item* Player::GetItemOrItemWithGemEquipped( uint32 item ) const
+bool Player::HasItemOrGemWithIdEquipped( uint32 item, uint32 count, uint8 except_slot ) const
{
- Item *pItem;
- for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; i++)
+ uint32 tempcount = 0;
+ for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
{
- pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
- if( pItem && pItem->GetEntry() == item )
- return pItem;
+ if(i==int(except_slot))
+ continue;
+
+ Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+ if( pItem && pItem->GetEntry() == item)
+ {
+ tempcount += pItem->GetCount();
+ if( tempcount >= count )
+ return true;
+ }
}
ItemPrototype const *pProto = objmgr.GetItemPrototype(item);
if (pProto && pProto->GemProperties)
{
- for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; i++)
+ for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
{
- pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
- if( pItem && pItem->GetProto()->Socket[0].Color )
+ if(i==int(except_slot))
+ continue;
+
+ Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+ if( pItem && pItem->GetProto()->Socket[0].Color)
{
- if (pItem->GetGemCountWithID(item) > 0 )
- return pItem;
+ tempcount += pItem->GetGemCountWithID(item);
+ if( tempcount >= count )
+ return true;
}
}
}
- return NULL;
+ return false;
+}
+
+bool Player::HasItemOrGemWithLimitCategoryEquipped( uint32 limitCategory, uint32 count, uint8 except_slot ) const
+{
+ uint32 tempcount = 0;
+ for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
+ {
+ if(i==int(except_slot))
+ continue;
+
+ Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+ if (!pItem)
+ continue;
+
+ ItemPrototype const *pProto = pItem->GetProto();
+ if (!pProto)
+ continue;
+
+ if (pProto->ItemLimitCategory == limitCategory)
+ {
+ tempcount += pItem->GetCount();
+ if( tempcount >= count )
+ return true;
+ }
+
+ if( pProto->Socket[0].Color)
+ {
+ tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
+ if( tempcount >= count )
+ return true;
+ }
+ }
+
+ return false;
}
uint8 Player::_CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count ) const
@@ -8864,12 +9164,12 @@ uint8 Player::_CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem,
}
// no maximum
- if(pProto->MaxCount == 0)
+ if(pProto->MaxCount <= 0)
return EQUIP_ERR_OK;
uint32 curcount = GetItemCount(pProto->ItemId,true,pItem);
- if( curcount + count > pProto->MaxCount )
+ if (curcount + count > uint32(pProto->MaxCount))
{
if(no_space_count)
*no_space_count = count +curcount - pProto->MaxCount;
@@ -8884,13 +9184,13 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
Item *pItem;
for(uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
{
- pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+ pItem = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true;
}
- for(uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
+ for(uint8 i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i)
{
- pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+ pItem = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true;
}
@@ -8900,7 +9200,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
{
for(uint32 j = 0; j < pBag->GetBagSize(); ++j)
{
- pItem = GetItemByPos( i, j );
+ pItem = GetUseableItemByPos( i, j );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true;
}
@@ -8928,6 +9228,18 @@ uint8 Player::_CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountV
if(slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
+ // vanitypet case (not use, vanity pets stored as spells)
+ if(slot >= VANITYPET_SLOT_START && slot < VANITYPET_SLOT_END)
+ return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
+
+ // currencytoken case (disabled until proper implement)
+ if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(false /*pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS*/))
+ return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
+
+ // guestbag case (disabled until proper implement)
+ if(slot >= QUESTBAG_SLOT_START && slot < QUESTBAG_SLOT_END && !(false /*pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS*/))
+ return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
+
// prevent cheating
if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
@@ -8947,7 +9259,7 @@ uint8 Player::_CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountV
}
// non empty stack with space
- need_space = pProto->Stackable;
+ need_space = pProto->GetMaxStackSize();
}
// non empty slot, check item type
else
@@ -8957,10 +9269,11 @@ uint8 Player::_CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountV
return EQUIP_ERR_ITEM_CANT_STACK;
// check free space
- if(pItem2->GetCount() >= pProto->Stackable)
+ if(pItem2->GetCount() >= pProto->GetMaxStackSize())
return EQUIP_ERR_ITEM_CANT_STACK;
- need_space = pProto->Stackable - pItem2->GetCount();
+ // free stack space or infinity
+ need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
}
if(need_space > count)
@@ -9014,9 +9327,9 @@ uint8 Player::_CanStoreItem_InBag( uint8 bag, ItemPosCountVec &dest, ItemPrototy
if( pItem2 )
{
- if(pItem2->GetEntry() == pProto->ItemId && pItem2->GetCount() < pProto->Stackable )
+ if(pItem2->GetEntry() == pProto->ItemId && pItem2->GetCount() < pProto->GetMaxStackSize())
{
- uint32 need_space = pProto->Stackable - pItem2->GetCount();
+ uint32 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
if(need_space > count)
need_space = count;
@@ -9033,7 +9346,7 @@ uint8 Player::_CanStoreItem_InBag( uint8 bag, ItemPosCountVec &dest, ItemPrototy
}
else
{
- uint32 need_space = pProto->Stackable;
+ uint32 need_space = pProto->GetMaxStackSize();
if(need_space > count)
need_space = count;
@@ -9071,9 +9384,9 @@ uint8 Player::_CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end,
if( pItem2 )
{
- if(pItem2->GetEntry() == pProto->ItemId && pItem2->GetCount() < pProto->Stackable )
+ if(pItem2->GetEntry() == pProto->ItemId && pItem2->GetCount() < pProto->GetMaxStackSize())
{
- uint32 need_space = pProto->Stackable - pItem2->GetCount();
+ uint32 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
if(need_space > count)
need_space = count;
ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
@@ -9089,7 +9402,7 @@ uint8 Player::_CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end,
}
else
{
- uint32 need_space = pProto->Stackable;
+ uint32 need_space = pProto->GetMaxStackSize();
if(need_space > count)
need_space = count;
@@ -9168,11 +9481,11 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
if( bag != NULL_BAG )
{
// search stack in bag for merge to
- if( pProto->Stackable > 1 )
+ if( pProto->Stackable != 1 )
{
if( bag == INVENTORY_SLOT_BAG_0 ) // inventory
{
- res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,KEYRING_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
+ res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
@@ -9260,6 +9573,53 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
}
}
+ // Vanity pet case skipped as not used
+
+ /* until proper implementation
+ else if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
+ {
+ res = _CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
+ if(res!=EQUIP_ERR_OK)
+ {
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return res;
+ }
+
+ if(count==0)
+ {
+ if(no_similar_count==0)
+ return EQUIP_ERR_OK;
+
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
+ }
+ }
+ */
+ /* until proper implementation
+ else if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
+ {
+ res = _CanStoreItem_InInventorySlots(QUESTBAG_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
+ if(res!=EQUIP_ERR_OK)
+ {
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return res;
+ }
+
+ if(count==0)
+ {
+ if(no_similar_count==0)
+ return EQUIP_ERR_OK;
+
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
+ }
+ }
+ */
+
res = _CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START,INVENTORY_SLOT_ITEM_END,dest,pProto,count,false,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
@@ -9306,9 +9666,9 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
// not specific bag or have space for partly store only in specific bag
// search stack for merge to
- if( pProto->Stackable > 1 )
+ if( pProto->Stackable != 1 )
{
- res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,KEYRING_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
+ res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
@@ -9407,6 +9767,53 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
}
}
+ // Vanity pet case skipped as not used
+
+ /* until proper implementation
+ else if(false pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
+ {
+ res = _CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
+ if(res!=EQUIP_ERR_OK)
+ {
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return res;
+ }
+
+ if(count==0)
+ {
+ if(no_similar_count==0)
+ return EQUIP_ERR_OK;
+
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
+ }
+ }
+ */
+ /* until proper implementation
+ else if(false pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
+ {
+ res = _CanStoreItem_InInventorySlots(QUESTBAG_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
+ if(res!=EQUIP_ERR_OK)
+ {
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return res;
+ }
+
+ if(count==0)
+ {
+ if(no_similar_count==0)
+ return EQUIP_ERR_OK;
+
+ if(no_space_count)
+ *no_space_count = count + no_similar_count;
+ return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
+ }
+ }
+ */
+
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{
res = _CanStoreItem_InBag(i,dest,pProto,count,false,false,pItem,bag,slot);
@@ -9476,10 +9883,14 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
int inv_slot_items[INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START];
int inv_bags[INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START][MAX_BAG_SIZE];
int inv_keys[KEYRING_SLOT_END-KEYRING_SLOT_START];
+ int inv_tokens[CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START];
+ int inv_quests[QUESTBAG_SLOT_END-QUESTBAG_SLOT_START];
memset(inv_slot_items,0,sizeof(int)*(INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START));
memset(inv_bags,0,sizeof(int)*(INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START)*MAX_BAG_SIZE);
memset(inv_keys,0,sizeof(int)*(KEYRING_SLOT_END-KEYRING_SLOT_START));
+ memset(inv_tokens,0,sizeof(int)*(CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START));
+ memset(inv_quests,0,sizeof(int)*(QUESTBAG_SLOT_END-QUESTBAG_SLOT_START));
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
{
@@ -9501,6 +9912,28 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
}
}
+ // Vanity pet case skipped as not used
+
+ for(int i = CURRENCYTOKEN_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
+ {
+ pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+
+ if (pItem2 && !pItem2->IsInTrade())
+ {
+ inv_tokens[i-CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
+ }
+ }
+
+ for(int i = QUESTBAG_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ {
+ pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
+
+ if (pItem2 && !pItem2->IsInTrade())
+ {
+ inv_quests[i-QUESTBAG_SLOT_START] = pItem2->GetCount();
+ }
+ }
+
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
@@ -9544,14 +9977,14 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
return res;
// search stack for merge to
- if( pProto->Stackable > 1 )
+ if( pProto->Stackable != 1 )
{
bool b_found = false;
for(int t = KEYRING_SLOT_START; t < KEYRING_SLOT_END; t++)
{
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
- if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_keys[t-KEYRING_SLOT_START] + pItem->GetCount() <= pProto->Stackable )
+ if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_keys[t-KEYRING_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
{
inv_keys[t-KEYRING_SLOT_START] += pItem->GetCount();
b_found = true;
@@ -9560,10 +9993,36 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
}
if (b_found) continue;
+ // Vanity pet case skipped as not used
+
+ for(int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; t++)
+ {
+ pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
+ if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_tokens[t-CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
+ {
+ inv_tokens[t-CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
+ b_found = true;
+ break;
+ }
+ }
+ if (b_found) continue;
+
+ for(int t = QUESTBAG_SLOT_START; t < QUESTBAG_SLOT_END; t++)
+ {
+ pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
+ if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_quests[t-QUESTBAG_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
+ {
+ inv_quests[t-QUESTBAG_SLOT_START] += pItem->GetCount();
+ b_found = true;
+ break;
+ }
+ }
+ if (b_found) continue;
+
for(int t = INVENTORY_SLOT_ITEM_START; t < INVENTORY_SLOT_ITEM_END; t++)
{
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
- if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_slot_items[t-INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->Stackable )
+ if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_slot_items[t-INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
{
inv_slot_items[t-INVENTORY_SLOT_ITEM_START] += pItem->GetCount();
b_found = true;
@@ -9580,7 +10039,7 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
for(uint32 j = 0; j < pBag->GetBagSize(); j++)
{
pItem2 = GetItemByPos( t, j );
- if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_bags[t-INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->Stackable )
+ if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_bags[t-INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->GetMaxStackSize())
{
inv_bags[t-INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
b_found = true;
@@ -9612,6 +10071,41 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
if (b_found) continue;
+ // Vanity pet case skipped as not used
+
+ /* until proper implementation
+ if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
+ {
+ for(uint32 t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
+ {
+ if( inv_tokens[t-CURRENCYTOKEN_SLOT_START] == 0 )
+ {
+ inv_tokens[t-CURRENCYTOKEN_SLOT_START] = 1;
+ b_found = true;
+ break;
+ }
+ }
+ }
+
+ if (b_found) continue;
+ */
+ /* until proper implementation
+ if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
+ {
+ for(uint32 t = QUESTBAG_SLOT_START; t < QUESTBAG_SLOT_END; ++t)
+ {
+ if( inv_quests[t-QUESTBAG_SLOT_START] == 0 )
+ {
+ inv_quests[t-QUESTBAG_SLOT_START] = 1;
+ b_found = true;
+ break;
+ }
+ }
+ }
+
+ if (b_found) continue;
+ */
+
for(int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; t++)
{
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, t );
@@ -9701,11 +10195,6 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
ItemPrototype const *pProto = pItem->GetProto();
if( pProto )
{
- // May be here should be more stronger checks; STUNNED checked
- // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
- if (not_loading && hasUnitState(UNIT_STAT_STUNNED))
- return EQUIP_ERR_YOU_ARE_STUNNED;
-
if(pItem->IsBindedNotWith(GetGUID()))
return EQUIP_ERR_DONT_OWN_THAT_ITEM;
@@ -9714,24 +10203,33 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
if(res != EQUIP_ERR_OK)
return res;
- // do not allow equipping gear except weapons, offhands, projectiles, relics in
- // - combat
- // - in-progress arenas
- if( !pProto->CanChangeEquipStateInCombat() )
+ // check this only in game
+ if(not_loading)
{
- if( isInCombat() )
- return EQUIP_ERR_NOT_IN_COMBAT;
+ // May be here should be more stronger checks; STUNNED checked
+ // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
+ if (hasUnitState(UNIT_STAT_STUNNED))
+ return EQUIP_ERR_YOU_ARE_STUNNED;
+
+ // do not allow equipping gear except weapons, offhands, projectiles, relics in
+ // - combat
+ // - in-progress arenas
+ if( !pProto->CanChangeEquipStateInCombat() )
+ {
+ if( isInCombat() )
+ return EQUIP_ERR_NOT_IN_COMBAT;
- if(BattleGround* bg = GetBattleGround())
- if( bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS )
- return EQUIP_ERR_NOT_DURING_ARENA_MATCH;
- }
+ if(BattleGround* bg = GetBattleGround())
+ if( bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS )
+ return EQUIP_ERR_NOT_DURING_ARENA_MATCH;
+ }
- if(isInCombat()&& pProto->Class == ITEM_CLASS_WEAPON && m_weaponChangeTimer != 0)
- return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
+ if(isInCombat()&& pProto->Class == ITEM_CLASS_WEAPON && m_weaponChangeTimer != 0)
+ return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
- if(IsNonMeleeSpellCasted(false))
- return EQUIP_ERR_CANT_DO_RIGHT_NOW;
+ if(IsNonMeleeSpellCasted(false))
+ return EQUIP_ERR_CANT_DO_RIGHT_NOW;
+ }
uint8 eslot = FindEquipSlot( pProto, slot, swap );
if( eslot == NULL_SLOT )
@@ -9743,33 +10241,9 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
if( !swap && GetItemByPos( INVENTORY_SLOT_BAG_0, eslot ) )
return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE;
- // check unique-equipped on item
- if (pProto->Flags & ITEM_FLAGS_UNIQUE_EQUIPPED)
- {
- // there is an equip limit on this item
- Item* tItem = GetItemOrItemWithGemEquipped(pProto->ItemId);
- if (tItem && (!swap || tItem->GetSlot() != eslot ) )
- return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE;
- }
-
- // check unique-equipped on gems
- for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
- {
- uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
- if(!enchant_id)
- continue;
- SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
- if(!enchantEntry)
- continue;
-
- ItemPrototype const* pGem = objmgr.GetItemPrototype(enchantEntry->GemID);
- if(pGem && (pGem->Flags & ITEM_FLAGS_UNIQUE_EQUIPPED))
- {
- Item* tItem = GetItemOrItemWithGemEquipped(enchantEntry->GemID);
- if(tItem && (!swap || tItem->GetSlot() != eslot ))
- return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE;
- }
- }
+ // if swap ignore item (equipped also)
+ if(uint8 res = CanEquipUniqueItem(pItem, swap ? eslot : NULL_SLOT))
+ return res;
// check unique-equipped special item classes
if (pProto->Class == ITEM_CLASS_QUIVER)
@@ -9796,33 +10270,42 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
if(eslot == EQUIPMENT_SLOT_OFFHAND)
{
- if( type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND )
+ if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
{
if(!CanDualWield())
return EQUIP_ERR_CANT_DUAL_WIELD;
}
-
- Item *mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
- if(mainItem)
+ else if (type == INVTYPE_2HWEAPON)
{
- if(mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON)
- return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED;
+ if(!CanDualWield() || !CanTitanGrip())
+ return EQUIP_ERR_CANT_DUAL_WIELD;
}
+
+ if(IsTwoHandUsed())
+ return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED;
}
// equip two-hand weapon case (with possible unequip 2 items)
if( type == INVTYPE_2HWEAPON )
{
- if(eslot != EQUIPMENT_SLOT_MAINHAND)
+ if (eslot == EQUIPMENT_SLOT_OFFHAND)
+ {
+ if (!CanTitanGrip())
+ return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED;
+ }
+ else if (eslot != EQUIPMENT_SLOT_MAINHAND)
return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED;
- // offhand item must can be stored in inventory for offhand item and it also must be unequipped
- Item *offItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND );
- ItemPosCountVec off_dest;
- if( offItem && (!not_loading ||
- CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND,false) != EQUIP_ERR_OK ||
- CanStoreItem( NULL_BAG, NULL_SLOT, off_dest, offItem, false ) != EQUIP_ERR_OK ) )
- return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL;
+ if (!CanTitanGrip())
+ {
+ // offhand item must can be stored in inventory for offhand item and it also must be unequipped
+ Item *offItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND );
+ ItemPosCountVec off_dest;
+ if( offItem && (!not_loading ||
+ CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND,false) != EQUIP_ERR_OK ||
+ CanStoreItem( NULL_BAG, NULL_SLOT, off_dest, offItem, false ) != EQUIP_ERR_OK ) )
+ return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL;
+ }
}
dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
return EQUIP_ERR_OK;
@@ -9894,29 +10377,17 @@ uint8 Player::CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *p
// in specific slot
if( bag != NULL_BAG && slot != NULL_SLOT )
{
- if( pProto->InventoryType == INVTYPE_BAG )
- {
- Bag *pBag = (Bag*)pItem;
- if( pBag )
- {
- if( slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END )
- {
- if( !HasBankBagSlot( slot ) )
- return EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT;
- if( uint8 cantuse = CanUseItem( pItem, not_loading ) != EQUIP_ERR_OK )
- return cantuse;
- }
- else
- {
- if( !pBag->IsEmpty() )
- return EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG;
- }
- }
- }
- else
+ if( slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END )
{
- if( slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END )
+ if (!pItem->IsBag())
return EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT;
+
+ Bag *pBag = (Bag*)pItem;
+ if( !HasBankBagSlot( slot ) )
+ return EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT;
+
+ if( uint8 cantuse = CanUseItem( pItem, not_loading ) != EQUIP_ERR_OK )
+ return cantuse;
}
res = _CanStoreItem_InSpecificSlot(bag,slot,dest,pProto,count,swap,pItem);
@@ -9940,7 +10411,7 @@ uint8 Player::CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *p
}
// search stack in bag for merge to
- if( pProto->Stackable > 1 )
+ if( pProto->Stackable != 1 )
{
if( bag == INVENTORY_SLOT_BAG_0 )
{
@@ -9992,7 +10463,7 @@ uint8 Player::CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *p
// not specific bag or have space for partly store only in specific bag
// search stack for merge to
- if( pProto->Stackable > 1 )
+ if( pProto->Stackable != 1 )
{
// in slots
res = _CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START,BANK_SLOT_ITEM_END,dest,pProto,count,true,pItem,bag,slot);
@@ -10742,7 +11213,7 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
}
}
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -10845,7 +11316,7 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
@@ -11073,6 +11544,8 @@ void Player::SwapItem( uint16 src, uint16 dst )
return;
}
+ // SRC checks
+
if(pSrcItem->m_lootGenerated) // prevent swap looting item
{
//best error message found for attempting to swap while looting
@@ -11083,8 +11556,8 @@ void Player::SwapItem( uint16 src, uint16 dst )
// check unequip potability for equipped items and bank bags
if(IsEquipmentPos ( src ) || IsBagPos ( src ))
{
- // bags can be swapped with empty bag slots
- uint8 msg = CanUnequipItem( src, !IsBagPos ( src ) || IsBagPos ( dst ));
+ // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
+ uint8 msg = CanUnequipItem( src, !IsBagPos ( src ) || IsBagPos ( dst ) || pDstItem && pDstItem->IsBag() && ((Bag*)pDstItem)->IsEmpty());
if(msg != EQUIP_ERR_OK)
{
SendEquipError( msg, pSrcItem, pDstItem );
@@ -11099,6 +11572,34 @@ void Player::SwapItem( uint16 src, uint16 dst )
return;
}
+ // DST checks
+
+ if (pDstItem)
+ {
+ if(pDstItem->m_lootGenerated) // prevent swap looting item
+ {
+ //best error message found for attempting to swap while looting
+ SendEquipError( EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, NULL );
+ return;
+ }
+
+ // check unequip potability for equipped items and bank bags
+ if(IsEquipmentPos ( dst ) || IsBagPos ( dst ))
+ {
+ // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
+ uint8 msg = CanUnequipItem( dst, !IsBagPos ( dst ) || IsBagPos ( src ) || pSrcItem->IsBag() && ((Bag*)pSrcItem)->IsEmpty());
+ if(msg != EQUIP_ERR_OK)
+ {
+ SendEquipError( msg, pSrcItem, pDstItem );
+ return;
+ }
+ }
+ }
+
+ // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
+ // or swap empty bag with another empty or not empty bag (with items exchange)
+
+ // Move case
if( !pDstItem )
{
if( IsInventoryPos( dst ) )
@@ -11141,140 +11642,187 @@ void Player::SwapItem( uint16 src, uint16 dst )
EquipItem( dest, pSrcItem, true);
AutoUnequipOffhandIfNeed();
}
+
+ return;
}
- else // if (!pDstItem)
+
+ // attempt merge to / fill target item
+ if(!pSrcItem->IsBag() && !pDstItem->IsBag())
{
- if(pDstItem->m_lootGenerated) // prevent swap looting item
- {
- //best error message found for attempting to swap while looting
- SendEquipError( EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, NULL );
+ uint8 msg;
+ ItemPosCountVec sDest;
+ uint16 eDest;
+ if( IsInventoryPos( dst ) )
+ msg = CanStoreItem( dstbag, dstslot, sDest, pSrcItem, false );
+ else if( IsBankPos ( dst ) )
+ msg = CanBankItem( dstbag, dstslot, sDest, pSrcItem, false );
+ else if( IsEquipmentPos ( dst ) )
+ msg = CanEquipItem( dstslot, eDest, pSrcItem, false );
+ else
return;
- }
- // check unequip potability for equipped items and bank bags
- if(IsEquipmentPos ( dst ) || IsBagPos ( dst ))
+ // can be merge/fill
+ if(msg == EQUIP_ERR_OK)
{
- // bags can be swapped with empty bag slots
- uint8 msg = CanUnequipItem( dst, !IsBagPos ( dst ) || IsBagPos ( src ) );
- if(msg != EQUIP_ERR_OK)
+ if( pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetProto()->GetMaxStackSize())
{
- SendEquipError( msg, pSrcItem, pDstItem );
- return;
- }
- }
-
- // attempt merge to / fill target item
- {
- uint8 msg;
- ItemPosCountVec sDest;
- uint16 eDest;
- if( IsInventoryPos( dst ) )
- msg = CanStoreItem( dstbag, dstslot, sDest, pSrcItem, false );
- else if( IsBankPos ( dst ) )
- msg = CanBankItem( dstbag, dstslot, sDest, pSrcItem, false );
- else if( IsEquipmentPos ( dst ) )
- msg = CanEquipItem( dstslot, eDest, pSrcItem, false );
- else
- return;
+ RemoveItem(srcbag, srcslot, true);
- // can be merge/fill
- if(msg == EQUIP_ERR_OK)
- {
- if( pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetProto()->Stackable )
+ if( IsInventoryPos( dst ) )
+ StoreItem( sDest, pSrcItem, true);
+ else if( IsBankPos ( dst ) )
+ BankItem( sDest, pSrcItem, true);
+ else if( IsEquipmentPos ( dst ) )
{
- RemoveItem(srcbag, srcslot, true);
-
- if( IsInventoryPos( dst ) )
- StoreItem( sDest, pSrcItem, true);
- else if( IsBankPos ( dst ) )
- BankItem( sDest, pSrcItem, true);
- else if( IsEquipmentPos ( dst ) )
- {
- EquipItem( eDest, pSrcItem, true);
- AutoUnequipOffhandIfNeed();
- }
+ EquipItem( eDest, pSrcItem, true);
+ AutoUnequipOffhandIfNeed();
}
- else
+ }
+ else
+ {
+ pSrcItem->SetCount( pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetProto()->GetMaxStackSize());
+ pDstItem->SetCount( pSrcItem->GetProto()->GetMaxStackSize());
+ pSrcItem->SetState(ITEM_CHANGED, this);
+ pDstItem->SetState(ITEM_CHANGED, this);
+ if( IsInWorld() )
{
- pSrcItem->SetCount( pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetProto()->Stackable );
- pDstItem->SetCount( pSrcItem->GetProto()->Stackable );
- pSrcItem->SetState(ITEM_CHANGED, this);
- pDstItem->SetState(ITEM_CHANGED, this);
- if( IsInWorld() )
- {
- pSrcItem->SendUpdateToPlayer( this );
- pDstItem->SendUpdateToPlayer( this );
- }
+ pSrcItem->SendUpdateToPlayer( this );
+ pDstItem->SendUpdateToPlayer( this );
}
- return;
}
+ return;
}
+ }
- // impossible merge/fill, do real swap
- uint8 msg;
+ // impossible merge/fill, do real swap
+ uint8 msg;
- // check src->dest move possibility
- ItemPosCountVec sDest;
- uint16 eDest;
- if( IsInventoryPos( dst ) )
- msg = CanStoreItem( dstbag, dstslot, sDest, pSrcItem, true );
- else if( IsBankPos( dst ) )
- msg = CanBankItem( dstbag, dstslot, sDest, pSrcItem, true );
- else if( IsEquipmentPos( dst ) )
- {
- msg = CanEquipItem( dstslot, eDest, pSrcItem, true );
- if( msg == EQUIP_ERR_OK )
- msg = CanUnequipItem( eDest, true );
- }
+ // check src->dest move possibility
+ ItemPosCountVec sDest;
+ uint16 eDest;
+ if( IsInventoryPos( dst ) )
+ msg = CanStoreItem( dstbag, dstslot, sDest, pSrcItem, true );
+ else if( IsBankPos( dst ) )
+ msg = CanBankItem( dstbag, dstslot, sDest, pSrcItem, true );
+ else if( IsEquipmentPos( dst ) )
+ {
+ msg = CanEquipItem( dstslot, eDest, pSrcItem, true );
+ if( msg == EQUIP_ERR_OK )
+ msg = CanUnequipItem( eDest, true );
+ }
- if( msg != EQUIP_ERR_OK )
+ if( msg != EQUIP_ERR_OK )
+ {
+ SendEquipError( msg, pSrcItem, pDstItem );
+ return;
+ }
+
+ // check dest->src move possibility
+ ItemPosCountVec sDest2;
+ uint16 eDest2;
+ if( IsInventoryPos( src ) )
+ msg = CanStoreItem( srcbag, srcslot, sDest2, pDstItem, true );
+ else if( IsBankPos( src ) )
+ msg = CanBankItem( srcbag, srcslot, sDest2, pDstItem, true );
+ else if( IsEquipmentPos( src ) )
+ {
+ msg = CanEquipItem( srcslot, eDest2, pDstItem, true);
+ if( msg == EQUIP_ERR_OK )
+ msg = CanUnequipItem( eDest2, true);
+ }
+
+ if( msg != EQUIP_ERR_OK )
+ {
+ SendEquipError( msg, pDstItem, pSrcItem );
+ return;
+ }
+
+ // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
+ if(pSrcItem->IsBag() && pDstItem->IsBag())
+ {
+ Bag* emptyBag = NULL;
+ Bag* fullBag = NULL;
+ if(((Bag*)pSrcItem)->IsEmpty() && !IsBagPos(src))
{
- SendEquipError( msg, pSrcItem, pDstItem );
- return;
+ emptyBag = (Bag*)pSrcItem;
+ fullBag = (Bag*)pDstItem;
}
-
- // check dest->src move possibility
- ItemPosCountVec sDest2;
- uint16 eDest2;
- if( IsInventoryPos( src ) )
- msg = CanStoreItem( srcbag, srcslot, sDest2, pDstItem, true );
- else if( IsBankPos( src ) )
- msg = CanBankItem( srcbag, srcslot, sDest2, pDstItem, true );
- else if( IsEquipmentPos( src ) )
+ else if(((Bag*)pDstItem)->IsEmpty() && !IsBagPos(dst))
{
- msg = CanEquipItem( srcslot, eDest2, pDstItem, true);
- if( msg == EQUIP_ERR_OK )
- msg = CanUnequipItem( eDest2, true);
+ emptyBag = (Bag*)pDstItem;
+ fullBag = (Bag*)pSrcItem;
}
- if( msg != EQUIP_ERR_OK )
+ // bag swap (with items exchange) case
+ if(emptyBag && fullBag)
{
- SendEquipError( msg, pDstItem, pSrcItem );
- return;
- }
+ ItemPrototype const* emotyProto = emptyBag->GetProto();
- // now do moves, remove...
- RemoveItem(dstbag, dstslot, false);
- RemoveItem(srcbag, srcslot, false);
+ uint32 count = 0;
- // add to dest
- if( IsInventoryPos( dst ) )
- StoreItem(sDest, pSrcItem, true);
- else if( IsBankPos( dst ) )
- BankItem(sDest, pSrcItem, true);
- else if( IsEquipmentPos( dst ) )
- EquipItem(eDest, pSrcItem, true);
-
- // add to src
- if( IsInventoryPos( src ) )
- StoreItem(sDest2, pDstItem, true);
- else if( IsBankPos( src ) )
- BankItem(sDest2, pDstItem, true);
- else if( IsEquipmentPos( src ) )
- EquipItem(eDest2, pDstItem, true);
+ for(int i=0; i < fullBag->GetBagSize(); ++i)
+ {
+ Item *bagItem = fullBag->GetItemByPos(i);
+ if (!bagItem)
+ continue;
- AutoUnequipOffhandIfNeed();
+ ItemPrototype const* bagItemProto = bagItem->GetProto();
+ if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emotyProto))
+ {
+ // one from items not go to empry target bag
+ SendEquipError( EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem );
+ return;
+ }
+
+ ++count;
+ }
+
+
+ if (count > emptyBag->GetBagSize())
+ {
+ // too small targeted bag
+ SendEquipError( EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pSrcItem, pDstItem );
+ return;
+ }
+
+ // Items swap
+ count = 0; // will pos in new bag
+ for(int i=0; i< fullBag->GetBagSize(); ++i)
+ {
+ Item *bagItem = fullBag->GetItemByPos(i);
+ if (!bagItem)
+ continue;
+
+ fullBag->RemoveItem(i, true);
+ emptyBag->StoreItem(count, bagItem, true);
+ bagItem->SetState(ITEM_CHANGED, this);
+
+ ++count;
+ }
+ }
}
+
+ // now do moves, remove...
+ RemoveItem(dstbag, dstslot, false);
+ RemoveItem(srcbag, srcslot, false);
+
+ // add to dest
+ if( IsInventoryPos( dst ) )
+ StoreItem(sDest, pSrcItem, true);
+ else if( IsBankPos( dst ) )
+ BankItem(sDest, pSrcItem, true);
+ else if( IsEquipmentPos( dst ) )
+ EquipItem(eDest, pSrcItem, true);
+
+ // add to src
+ if( IsInventoryPos( src ) )
+ StoreItem(sDest2, pDstItem, true);
+ else if( IsBankPos( src ) )
+ BankItem(sDest2, pDstItem, true);
+ else if( IsEquipmentPos( src ) )
+ EquipItem(eDest2, pDstItem, true);
+
+ AutoUnequipOffhandIfNeed();
}
void Player::AddItemToBuyBackSlot( Item *pItem )
@@ -11842,6 +12390,40 @@ void Player::ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool a
((Player*)this)->ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
sLog.outDebug("+ %u EXPERTISE", enchant_amount);
break;
+ case ITEM_MOD_ATTACK_POWER:
+ HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
+ HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
+ sLog.outDebug("+ %u ATTACK_POWER", enchant_amount);
+ break;
+ case ITEM_MOD_RANGED_ATTACK_POWER:
+ HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
+ sLog.outDebug("+ %u RANGED_ATTACK_POWER", enchant_amount);
+ break;
+ case ITEM_MOD_FERAL_ATTACK_POWER:
+ ((Player*)this)->ApplyFeralAPBonus(enchant_amount, apply);
+ sLog.outDebug("+ %u FERAL_ATTACK_POWER", enchant_amount);
+ break;
+ case ITEM_MOD_SPELL_HEALING_DONE:
+ ((Player*)this)->ApplySpellHealingBonus(enchant_amount, apply);
+ sLog.outDebug("+ %u SPELL_HEALING_DONE", enchant_amount);
+ break;
+ case ITEM_MOD_SPELL_DAMAGE_DONE:
+ ((Player*)this)->ApplySpellDamageBonus(enchant_amount, apply);
+ sLog.outDebug("+ %u SPELL_DAMAGE_DONE", enchant_amount);
+ break;
+ case ITEM_MOD_MANA_REGENERATION:
+ ((Player*)this)->ApplyManaRegenBonus(enchant_amount, apply);
+ sLog.outDebug("+ %u MANA_REGENERATION", enchant_amount);
+ break;
+ case ITEM_MOD_ARMOR_PENETRATION_RATING:
+ ((Player*)this)->ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
+ sLog.outDebug("+ %u ARMOR PENETRATION", enchant_amount);
+ break;
+ case ITEM_MOD_SPELL_POWER:
+ ((Player*)this)->ApplySpellHealingBonus(enchant_amount, apply);
+ ((Player*)this)->ApplySpellDamageBonus(enchant_amount, apply);
+ sLog.outDebug("+ %u SPELL_POWER", enchant_amount);
+ break;
default:
break;
}
@@ -11865,8 +12447,14 @@ void Player::ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool a
}
break;
}
+ case ITEM_ENCHANTMENT_TYPE_USE_SPELL:
+ // processed in Player::CastItemUseSpell
+ break;
+ case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET:
+ // nothing do..
+ break;
default:
- sLog.outError("Unknown item enchantment display type: %d",enchant_display_type);
+ sLog.outError("Unknown item enchantment (id = %d) display type: %d", enchant_id, enchant_display_type);
break;
} /*switch(enchant_display_type)*/
} /*for*/
@@ -12036,7 +12624,7 @@ void Player::SendPreparedQuest( uint64 guid )
if( pCreature )
{
uint32 textid = pCreature->GetNpcTextId();
- GossipText * gossiptext = objmgr.GetGossipText(textid);
+ GossipText const* gossiptext = objmgr.GetGossipText(textid);
if( !gossiptext )
{
qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
@@ -12340,8 +12928,6 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver )
// if not exist then created with set uState==NEW and rewarded=false
QuestStatusData& questStatusData = mQuestStatus[quest_id];
- if (questStatusData.uState != QUEST_NEW)
- questStatusData.uState = QUEST_CHANGED;
// check for repeatable quests status reset
questStatusData.m_status = QUEST_STATUS_INCOMPLETE;
@@ -12349,18 +12935,18 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver )
if ( pQuest->HasFlag( QUEST_TRINITY_FLAGS_DELIVER ) )
{
- for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
+ for(int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
questStatusData.m_itemcount[i] = 0;
}
if ( pQuest->HasFlag(QUEST_TRINITY_FLAGS_KILL_OR_CAST | QUEST_TRINITY_FLAGS_SPEAKTO) )
{
- for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
+ for(int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
questStatusData.m_creatureOrGOcount[i] = 0;
}
GiveQuestSourceItem( pQuest );
- AdjustQuestReqItemCount( pQuest );
+ AdjustQuestReqItemCount( pQuest, questStatusData );
if( pQuest->GetRepObjectiveFaction() )
SetFactionVisibleForFactionId(pQuest->GetRepObjectiveFaction());
@@ -12383,6 +12969,9 @@ void Player::AddQuest( Quest const *pQuest, Object *questGiver )
SetQuestSlot(log_slot, quest_id, qtime);
+ if (questStatusData.uState != QUEST_NEW)
+ questStatusData.uState = QUEST_CHANGED;
+
//starting initial quest script
if(questGiver && pQuest->GetQuestStartScript()!=0)
sWorld.ScriptsStart(sQuestStartScripts, pQuest->GetQuestStartScript(), questGiver, this);
@@ -12500,6 +13089,12 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
SetTitle(titleEntry);
}
+ if(pQuest->GetBonusTalents())
+ {
+ m_questRewardTalentCount+=pQuest->GetBonusTalents();
+ InitTalentForLevel();
+ }
+
// Send reward mail
if(pQuest->GetRewMailTemplateId())
{
@@ -12531,12 +13126,13 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
Loot questMailLoot;
- questMailLoot.FillLoot(pQuest->GetQuestId(), LootTemplates_QuestMail, this);
+ questMailLoot.FillLoot(pQuest->GetQuestId(), LootTemplates_QuestMail, this,true);
// fill mail
MailItemsInfo mi; // item list preparing
- for(size_t i = 0; mi.size() < MAX_MAIL_ITEMS && i < questMailLoot.items.size(); ++i)
+ uint32 max_slot = questMailLoot.GetMaxSlotInLootFor(this);
+ for(uint32 i = 0; mi.size() < MAX_MAIL_ITEMS && i < max_slot; ++i)
{
if(LootItem* lootitem = questMailLoot.LootItemInSlot(i,this))
{
@@ -12548,23 +13144,14 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
}
}
- for(size_t i = 0; mi.size() < MAX_MAIL_ITEMS && i < questMailLoot.quest_items.size(); ++i)
- {
- if(LootItem* lootitem = questMailLoot.LootItemInSlot(i+questMailLoot.items.size(),this))
- {
- if(Item* item = Item::CreateItem(lootitem->itemid,lootitem->count,this))
- {
- item->SaveToDB(); // save for prevent lost at next mail load, if send fail then item will deleted
- mi.AddItem(item->GetGUIDLow(), item->GetEntry(), item);
- }
- }
- }
-
WorldSession::SendMailTo(this, mailType, MAIL_STATIONERY_NORMAL, senderGuidOrEntry, GetGUIDLow(), "", 0, &mi, 0, 0, MAIL_CHECK_MASK_NONE,pQuest->GetRewMailDelaySecs(),pQuest->GetRewMailTemplateId());
}
if(pQuest->IsDaily())
+ {
SetDailyQuestStatus(quest_id);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, 1);
+ }
if ( !pQuest->IsRepeatable() )
SetQuestStatus(quest_id, QUEST_STATUS_COMPLETE);
@@ -12577,6 +13164,8 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
SendQuestReward( pQuest, XP, questGiver );
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT);
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST);
}
void Player::FailQuest( uint32 quest_id )
@@ -12601,8 +13190,9 @@ void Player::FailTimedQuest( uint32 quest_id )
{
QuestStatusData& q_status = mQuestStatus[quest_id];
- if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
q_status.m_timer = 0;
+ if (q_status.uState != QUEST_NEW)
+ q_status.uState = QUEST_CHANGED;
IncompleteQuest( quest_id );
@@ -13088,18 +13678,18 @@ uint32 Player::GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry)
if( !qInfo )
return 0;
- for (int j = 0; j < QUEST_OBJECTIVES_COUNT; j++)
+ for (int j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
if ( qInfo->ReqCreatureOrGOId[j] == entry )
return mQuestStatus[quest_id].m_creatureOrGOcount[j];
return 0;
}
-void Player::AdjustQuestReqItemCount( Quest const* pQuest )
+void Player::AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData )
{
if ( pQuest->HasFlag( QUEST_TRINITY_FLAGS_DELIVER ) )
{
- for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
+ for(int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
{
uint32 reqitemcount = pQuest->ReqItemCount[i];
if( reqitemcount != 0 )
@@ -13107,9 +13697,8 @@ void Player::AdjustQuestReqItemCount( Quest const* pQuest )
uint32 quest_id = pQuest->GetQuestId();
uint32 curitemcount = GetItemCount(pQuest->ReqItemId[i],true);
- QuestStatusData& q_status = mQuestStatus[quest_id];
- q_status.m_itemcount[i] = std::min(curitemcount, reqitemcount);
- if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
+ questStatusData.m_itemcount[i] = std::min(curitemcount, reqitemcount);
+ if (questStatusData.uState != QUEST_NEW) questStatusData.uState = QUEST_CHANGED;
}
}
}
@@ -13117,7 +13706,7 @@ void Player::AdjustQuestReqItemCount( Quest const* pQuest )
uint16 Player::FindQuestSlot( uint32 quest_id ) const
{
- for ( uint16 i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for ( uint16 i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
if ( GetQuestSlotQuestId(i) == quest_id )
return i;
@@ -13165,7 +13754,7 @@ void Player::GroupEventHappens( uint32 questId, WorldObject const* pEventObject
void Player::ItemAddedQuestCheck( uint32 entry, uint32 count )
{
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
uint32 questid = GetQuestSlotQuestId(i);
if ( questid == 0 )
@@ -13202,11 +13791,12 @@ void Player::ItemAddedQuestCheck( uint32 entry, uint32 count )
}
}
UpdateForQuestsGO();
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, entry);
}
void Player::ItemRemovedQuestCheck( uint32 entry, uint32 count )
{
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
uint32 questid = GetQuestSlotQuestId(i);
if(!questid)
@@ -13248,7 +13838,8 @@ void Player::ItemRemovedQuestCheck( uint32 entry, uint32 count )
void Player::KilledMonster( uint32 entry, uint64 guid )
{
uint32 addkillcount = 1;
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, entry, addkillcount);
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
uint32 questid = GetQuestSlotQuestId(i);
if(!questid)
@@ -13303,7 +13894,7 @@ void Player::CastedCreatureOrGO( uint32 entry, uint64 guid, uint32 spell_id )
bool isCreature = IS_CREATURE_GUID(guid);
uint32 addCastCount = 1;
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
{
uint32 questid = GetQuestSlotQuestId(i);
if(!questid)
@@ -13370,7 +13961,7 @@ void Player::CastedCreatureOrGO( uint32 entry, uint64 guid, uint32 spell_id )
void Player::TalkedToCreature( uint32 entry, uint64 guid )
{
uint32 addTalkCount = 1;
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
uint32 questid = GetQuestSlotQuestId(i);
if(!questid)
@@ -13425,7 +14016,7 @@ void Player::TalkedToCreature( uint32 entry, uint64 guid )
void Player::MoneyChanged( uint32 count )
{
- for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
uint32 questid = GetQuestSlotQuestId(i);
if (!questid)
@@ -13455,13 +14046,21 @@ void Player::MoneyChanged( uint32 count )
bool Player::HasQuestForItem( uint32 itemid ) const
{
- for( QuestStatusMap::const_iterator i = mQuestStatus.begin( ); i != mQuestStatus.end( ); ++i )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
- QuestStatusData const& q_status = i->second;
+ uint32 questid = GetQuestSlotQuestId(i);
+ if ( questid == 0 )
+ continue;
+
+ QuestStatusMap::const_iterator qs_itr = mQuestStatus.find(questid);
+ if(qs_itr == mQuestStatus.end())
+ continue;
+
+ QuestStatusData const& q_status = qs_itr->second;
if (q_status.m_status == QUEST_STATUS_INCOMPLETE)
{
- Quest const* qinfo = objmgr.GetQuestTemplate(i->first);
+ Quest const* qinfo = objmgr.GetQuestTemplate(questid);
if(!qinfo)
continue;
@@ -13526,13 +14125,12 @@ void Player::SendQuestReward( Quest const *pQuest, uint32 XP, Object * questGive
uint32 questid = pQuest->GetQuestId();
sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = %u", questid );
gameeventmgr.HandleQuestComplete(questid);
- WorldPacket data( SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4+4+pQuest->GetRewItemsCount()*8) );
- data << questid;
- data << uint32(0x03);
+ WorldPacket data( SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4) );
+ data << uint32(questid);
if ( getLevel() < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) )
{
- data << XP;
+ data << uint32(XP);
data << uint32(pQuest->GetRewOrReqMoney());
}
else
@@ -13540,16 +14138,9 @@ void Player::SendQuestReward( Quest const *pQuest, uint32 XP, Object * questGive
data << uint32(0);
data << uint32(pQuest->GetRewOrReqMoney() + int32(pQuest->GetRewMoneyMaxLevel() * sWorld.getRate(RATE_DROP_MONEY)));
}
- data << uint32(0); // new 2.3.0, HonorPoints?
- data << uint32( pQuest->GetRewItemsCount() ); // max is 5
- for (uint32 i = 0; i < pQuest->GetRewItemsCount(); ++i)
- {
- if ( pQuest->RewItemId[i] > 0 )
- data << pQuest->RewItemId[i] << pQuest->RewItemCount[i];
- else
- data << uint32(0) << uint32(0);
- }
+ data << uint32(10*Trinity::Honor::hk_honor_at_level(getLevel(), pQuest->GetRewHonorableKills()));
+ data << uint32(pQuest->GetBonusTalents()); // bonus talents
GetSession()->SendPacket( &data );
if (pQuest->GetQuestCompleteScript() != 0)
@@ -13560,8 +14151,9 @@ void Player::SendQuestFailed( uint32 quest_id )
{
if( quest_id )
{
- WorldPacket data( SMSG_QUESTGIVER_QUEST_FAILED, 4 );
+ WorldPacket data( SMSG_QUESTGIVER_QUEST_FAILED, 4+4 );
data << quest_id;
+ data << uint32(0); // failed reason (4 for inventory is full)
GetSession()->SendPacket( &data );
sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
}
@@ -13600,10 +14192,10 @@ void Player::SendPushToPartyResponse( Player *pPlayer, uint32 msg )
void Player::SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint32 count )
{
- WorldPacket data( SMSG_QUESTUPDATE_ADD_ITEM, (4+4) );
+ WorldPacket data( SMSG_QUESTUPDATE_ADD_ITEM, 0 );
sLog.outDebug( "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM" );
- data << pQuest->ReqItemId[item_idx];
- data << count;
+ //data << pQuest->ReqItemId[item_idx];
+ //data << count;
GetSession()->SendPacket( &data );
}
@@ -13649,7 +14241,7 @@ bool Player::MinimalLoadFromDB( QueryResult *result, uint32 guid )
if(!LoadValues( fields[1].GetString()))
{
- sLog.outError("ERROR: Player #%d have broken data in `data` field. Can't be loaded.",GUID_LOPART(guid));
+ sLog.outError("ERROR: Player #%d have broken data in `data` field. Can't be loaded for character list.",GUID_LOPART(guid));
if(delete_result) delete result;
return false;
}
@@ -13719,7 +14311,7 @@ void Player::_LoadArenaTeamInfo(QueryResult *result)
ArenaTeam* aTeam = objmgr.GetArenaTeamById(arenateamid);
if(!aTeam)
{
- sLog.outError("FATAL: couldn't load arenateam %u", arenateamid);
+ sLog.outError("Player::_LoadArenaTeamInfo: couldn't load arenateam %u, week %u, season %u, rating %u", arenateamid, played_week, played_season, personal_rating);
continue;
}
uint8 arenaSlot = aTeam->GetSlot();
@@ -13837,8 +14429,8 @@ float Player::GetFloatValueFromDB(uint16 index, uint64 guid)
bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
{
- //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] [29] 30 31 32 33
- //QueryResult *result = CharacterDatabase.PQuery("SELECT guid, account, data, name, race, class, position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeon_difficulty, arena_pending_points FROM characters WHERE guid = '%u'", guid);
+ //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] [29] 30 31 32 33 34 35 36 37 38 39 40
+ //QueryResult *result = CharacterDatabase.PQuery("SELECT guid, account, data, name, race, class, position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeon_difficulty, arena_pending_points,bgid,bgteam,bgmap,bgx,bgy,bgz,bgo FROM characters WHERE guid = '%u'", guid);
QueryResult *result = holder->GetResult(PLAYER_LOGIN_QUERY_LOADFROM);
if(!result)
@@ -13907,22 +14499,19 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
//Other way is to saves m_team into characters table.
setFactionForRace(m_race);
SetCharm(0);
+ SetMover(this);
m_class = fields[5].GetUInt8();
- PlayerInfo const *info = objmgr.GetPlayerInfo(m_race, m_class);
- if(!info)
- {
- sLog.outError("Player have incorrect race/class pair. Can't be loaded.");
- delete result;
+ // load home bind and check in same time class/race pair, it used later for restore broken positions
+ if(!_LoadHomeBind(holder->GetResult(PLAYER_LOGIN_QUERY_LOADHOMEBIND)))
return false;
- }
InitPrimaryProffesions(); // to max set before any spell loaded
+ // init saved position, and fix it later if problematic
uint32 transGUID = fields[24].GetUInt32();
Relocate(fields[6].GetFloat(),fields[7].GetFloat(),fields[8].GetFloat(),fields[10].GetFloat());
- SetFallInformation(0, fields[8].GetFloat());
SetMapId(fields[9].GetUInt32());
SetDifficulty(fields[32].GetUInt32()); // may be changed in _LoadGroup
@@ -13957,9 +14546,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
if(!IsPositionValid())
{
sLog.outError("ERROR: Player (guidlow %d) have invalid coordinates (X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.",guid,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
-
- SetMapId(info->mapId);
- Relocate(info->positionX,info->positionY,info->positionZ,0.0f);
+ RelocateToHomebind();
transGUID = 0;
@@ -13969,49 +14556,57 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
m_movementInfo.t_o = 0.0f;
}
- if(!_LoadHomeBind(holder->GetResult(PLAYER_LOGIN_QUERY_LOADHOMEBIND)))
- return false;
+ uint32 bgid = fields[34].GetUInt32();
+ uint32 bgteam = fields[35].GetUInt32();
- // load the player's map here if it's not already loaded
- Map *map = GetMap();
- if (!map)
+ if(bgid) //saved in BattleGround
{
- AreaTrigger const* at = objmgr.GetGoBackTrigger(GetMapId());
- if(at)
+ SetBattleGroundEntryPoint(fields[36].GetUInt32(),fields[37].GetFloat(),fields[38].GetFloat(),fields[39].GetFloat(),fields[40].GetFloat());
+
+ // check entry point and fix to homebind if need
+ MapEntry const* mapEntry = sMapStore.LookupEntry(m_bgEntryPoint.mapid);
+ if(!mapEntry || mapEntry->Instanceable() || !MapManager::IsValidMapCoord(m_bgEntryPoint))
+ SetBattleGroundEntryPoint(m_homebindMapId,m_homebindX,m_homebindY,m_homebindZ,0.0f);
+
+ BattleGround *currentBg = sBattleGroundMgr.GetBattleGround(bgid);
+
+ if(currentBg && currentBg->IsPlayerInBattleGround(GetGUID()))
{
- SetMapId(at->target_mapId);
- Relocate(at->target_X, at->target_Y, at->target_Z, GetOrientation());
- sLog.outError("Player (guidlow %d) is teleported to gobacktrigger (Map: %u X: %f Y: %f Z: %f O: %f).",guid,GetMapId(),GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+ BattleGroundQueueTypeId bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(currentBg->GetTypeID(), currentBg->GetArenaType());
+ uint32 queueSlot = AddBattleGroundQueueId(bgQueueTypeId);
+
+ SetBattleGroundId(currentBg->GetInstanceID());
+ SetBGTeam(bgteam);
+
+ //join player to battleground group
+ currentBg->PlayerRelogin(this);
+ currentBg->AddOrSetPlayerToCorrectBgGroup(this, GetGUID(), bgteam);
+
+ SetInviteForBattleGroundQueueType(bgQueueTypeId,currentBg->GetInstanceID());
}
else
{
- SetMapId(m_homebindMapId);
- Relocate(m_homebindX, m_homebindY, m_homebindZ, GetOrientation());
- sLog.outError("Player (guidlow %d) is teleported to home (Map: %u X: %f Y: %f Z: %f O: %f).",guid,GetMapId(),GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+ Relocate(GetBattleGroundEntryPoint());
+ //RemoveArenaAuras(true);
}
-
- map = GetMap();
- if(!map)
+ }
+ else
+ {
+ MapEntry const* mapEntry = sMapStore.LookupEntry(GetMapId());
+ // if server restart after player save in BG or area
+ // player can have current coordinates in to BG/Arean map, fix this
+ if(!mapEntry || mapEntry->IsBattleGroundOrArena())
{
- sLog.outError("ERROR: Player (guidlow %d) have invalid coordinates (X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.",guid,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
-
- SetMapId(info->mapId);
- Relocate(info->positionX,info->positionY,info->positionZ,0.0f);
+ // return to BG master
+ SetMapId(fields[36].GetUInt32());
+ Relocate(fields[37].GetFloat(),fields[38].GetFloat(),fields[39].GetFloat(),fields[40].GetFloat());
- map = GetMap();
- if(!map)
- {
- sLog.outError("ERROR: Player (guidlow %d) have invalid coordinates (X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.",guid,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
- sLog.outError("CRASH.");
- assert(false);
- }
+ // check entry point and fix to homebind if need
+ mapEntry = sMapStore.LookupEntry(GetMapId());
+ if(!mapEntry || mapEntry->IsBattleGroundOrArena() || !IsPositionValid())
+ RelocateToHomebind();
}
}
- // since the player may not be bound to the map yet, make sure subsequent
- // getmap calls won't create new maps
- SetInstanceId(map->GetInstanceId());
-
- SaveRecallPosition();
if (transGUID != 0)
{
@@ -14030,8 +14625,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
guid,GetPositionX()+m_movementInfo.t_x,GetPositionY()+m_movementInfo.t_y,
GetPositionZ()+m_movementInfo.t_z,GetOrientation()+m_movementInfo.t_o);
- SetMapId(info->mapId);
- Relocate(info->positionX,info->positionY,info->positionZ,0.0f);
+ RelocateToHomebind();
m_movementInfo.t_x = 0.0f;
m_movementInfo.t_y = 0.0f;
@@ -14060,8 +14654,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
sLog.outError("ERROR: Player (guidlow %d) have invalid transport guid (%u). Teleport to default race/class locations.",
guid,transGUID);
- SetMapId(info->mapId);
- Relocate(info->positionX,info->positionY,info->positionZ,0.0f);
+ RelocateToHomebind();
m_movementInfo.t_x = 0.0f;
m_movementInfo.t_y = 0.0f;
@@ -14072,6 +14665,61 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
}
}
+ // NOW player must have valid map
+ // load the player's map here if it's not already loaded
+ Map *map = GetMap();
+
+ if (!map)
+ {
+ AreaTrigger const* at = objmgr.GetGoBackTrigger(GetMapId());
+ if(at)
+ {
+ SetMapId(at->target_mapId);
+ Relocate(at->target_X, at->target_Y, at->target_Z, GetOrientation());
+ sLog.outError("Player (guidlow %d) is teleported to gobacktrigger (Map: %u X: %f Y: %f Z: %f O: %f).",guid,GetMapId(),GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+ }
+ else
+ {
+ RelocateToHomebind();
+ sLog.outError("Player (guidlow %d) is teleported to home (Map: %u X: %f Y: %f Z: %f O: %f).",guid,GetMapId(),GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+ }
+
+ map = GetMap();
+ if(!map)
+ {
+ sLog.outError("ERROR: Player (guidlow %d) have invalid coordinates (X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.",guid,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+ delete result;
+ return false;
+
+ /*SetMapId(info->mapId);
+ Relocate(info->positionX,info->positionY,info->positionZ,0.0f);
+
+ map = GetMap();
+ if(!map)
+ {
+ sLog.outError("ERROR: Player (guidlow %d) have invalid coordinates (X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.",guid,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+ sLog.outError("CRASH.");
+ assert(false);
+ }*/
+ }
+ }
+
+ // since the player may not be bound to the map yet, make sure subsequent
+ // getmap calls won't create new maps
+ SetInstanceId(map->GetInstanceId());
+
+ // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
+ if(GetInstanceId() && !sInstanceSaveManager.GetInstanceSave(GetInstanceId()))
+ {
+ AreaTrigger const* at = objmgr.GetMapEntranceTrigger(GetMapId());
+ if(at)
+ Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
+ else
+ sLog.outError("Player %s(GUID: %u) logged in to a reset instance (map: %u) and there is no aretrigger leading to this map. Thus he can't be ported back to the entrance. This _might_ be an exploit attempt.", GetName(), GetGUIDLow(), GetMapId());
+ }
+
+ SaveRecallPosition();
+
time_t now = time(NULL);
time_t logoutTime = time_t(fields[16].GetUInt64());
@@ -14121,10 +14769,10 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
uint32 extraflags = fields[25].GetUInt32();
m_stableSlots = fields[26].GetUInt32();
- if(m_stableSlots > 2)
+ if(m_stableSlots > 4)
{
- sLog.outError("Player can have not more 2 stable slots, but have in DB %u",uint32(m_stableSlots));
- m_stableSlots = 2;
+ sLog.outError("Player can have not more 4 stable slots, but have in DB %u",uint32(m_stableSlots));
+ m_stableSlots = 4;
}
m_atLoginFlags = fields[27].GetUInt32();
@@ -14148,34 +14796,18 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
// clear charm/summon related fields
SetCharm(NULL);
+ SetMover(NULL);
SetPet(NULL);
- SetCharmerGUID(NULL);
- SetOwnerGUID(NULL);
- SetCreatorGUID(NULL);
+ SetCharmerGUID(0);
+ SetOwnerGUID(0);
+ SetCreatorGUID(0);
// reset some aura modifiers before aura apply
- SetFarSight(NULL);
+ SetFarSightGUID(0);
SetUInt32Value(PLAYER_TRACK_CREATURES, 0 );
SetUInt32Value(PLAYER_TRACK_RESOURCES, 0 );
- // reset skill modifiers and set correct unlearn flags
- for (uint32 i = 0; i < PLAYER_MAX_SKILLS; i++)
- {
- SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
-
- // set correct unlearn bit
- uint32 id = GetUInt32Value(PLAYER_SKILL_INDEX(i)) & 0x0000FFFF;
- if(!id) continue;
-
- SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(id);
- if(!pSkill) continue;
-
- // enable unlearn button for primary professions only
- if (pSkill->categoryId == SKILL_CATEGORY_PROFESSION)
- SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,1));
- else
- SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
- }
+ _LoadSkills();
// make sure the unit is considered out of combat for proper loading
ClearInCombat();
@@ -14193,6 +14825,8 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
// reset stats before loading any modifiers
InitStatsForLevel();
InitTaxiNodesForLevel();
+ InitGlyphsForLevel();
+ InitRunes();
// apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
@@ -14200,6 +14834,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
//_LoadMail();
_LoadAuras(holder->GetResult(PLAYER_LOGIN_QUERY_LOADAURAS), time_diff);
+ _LoadGlyphAuras();
// add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
if( HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST) )
@@ -14207,14 +14842,14 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
_LoadSpells(holder->GetResult(PLAYER_LOGIN_QUERY_LOADSPELLS));
- // after spell load
- InitTalentForLevel();
- learnSkillRewardedSpells();
-
// after spell load, learn rewarded spell if need also
_LoadQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS));
_LoadDailyQuestStatus(holder->GetResult(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS));
+ // after spell and quest load
+ InitTalentForLevel();
+ learnDefaultSpells();
+
_LoadTutorials(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTUTORIALS));
// must be before inventory (some items required reputation check)
@@ -14232,9 +14867,6 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
m_social = sSocialMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADSOCIALLIST), GetGUIDLow());
- //if(!_LoadHomeBind(holder->GetResult(PLAYER_LOGIN_QUERY_LOADHOMEBIND)))
- // return false;
-
// check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
// note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
if(uint32 curTitle = GetUInt32Value(PLAYER_CHOSEN_TITLE))
@@ -14244,7 +14876,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
}
// Not finish taxi flight path
- if(!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes))
+ if(!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes,GetTeam()))
{
// problems with taxi path loading
TaxiNodesEntry const* nodeEntry = NULL;
@@ -14254,8 +14886,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
if(!nodeEntry) // don't know taxi start node, to homebind
{
sLog.outError("Character %u have wrong data in taxi destination list, teleport to homebind.",GetGUIDLow());
- SetMapId(m_homebindMapId);
- Relocate( m_homebindX, m_homebindY, m_homebindZ,0.0f);
+ RelocateToHomebind();
SaveRecallPosition(); // save as recall also to prevent recall and fall from sky
}
else // have start node, to it
@@ -14280,6 +14911,9 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
// flight will started later
}
+ // has to be called after last Relocate() in Player::LoadFromDB
+ SetFallInformation(0, GetPositionZ());
+
_LoadSpellCooldowns(holder->GetResult(PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS));
// Spell code allow apply any auras to dead character in load time in aura/spell/item loading
@@ -14313,6 +14947,28 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
break;
}
+ switch(sWorld.getConfig(CONFIG_GM_VISIBLE_STATE))
+ {
+ default:
+ case 0: SetGMVisible(false); break; // invisible
+ case 1: break; // visible
+ case 2: // save state
+ if(extraflags & PLAYER_EXTRA_GM_INVISIBLE)
+ SetGMVisible(false);
+ break;
+ }
+
+ /*switch(sWorld.getConfig(CONFIG_GM_ACCEPT_TICKETS))
+ {
+ default:
+ case 0: break; // disable
+ case 1: SetAcceptTicket(true); break; // enable
+ case 2: // save state
+ if(extraflags & PLAYER_EXTRA_GM_ACCEPT_TICKETS)
+ SetAcceptTicket(true);
+ break;
+ }*/
+
switch(sWorld.getConfig(CONFIG_GM_CHAT))
{
default:
@@ -14338,6 +14994,8 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
_LoadDeclinedNames(holder->GetResult(PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES));
+ m_achievementMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS), holder->GetResult(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS));
+ m_achievementMgr.CheckAllAchievementCriteria();
return true;
}
@@ -14391,10 +15049,6 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
for (int i = 0; i < TOTAL_AURAS; i++)
m_modAuras[i].clear();
- // all aura related fields
- for(int i = UNIT_FIELD_AURA; i <= UNIT_FIELD_AURASTATE; ++i)
- SetUInt32Value(i, 0);
-
//QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges FROM character_aura WHERE guid = '%u'",GetGUIDLow());
if(result)
@@ -14440,7 +15094,7 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
remaincharges = spellproto->procCharges;
}
else
- remaincharges = -1;
+ remaincharges = 0;
//do not load single target auras (unless they were cast by the player)
if (caster_guid != GetGUID() && IsSingleTargetSpell(spellproto))
@@ -14465,6 +15119,36 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
CastSpell(this,SPELL_ID_PASSIVE_BATTLE_STANCE,true);
}
+void Player::_LoadGlyphAuras()
+{
+ for (uint8 i = 0; i <= MAX_GLYPH_SLOT_INDEX; ++i)
+ {
+ if (uint32 glyph = GetGlyph(i))
+ {
+ if (GlyphPropertiesEntry const *gp = sGlyphPropertiesStore.LookupEntry(glyph))
+ {
+ if (GlyphSlotEntry const *gs = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
+ {
+ if(gp->TypeFlags == gs->TypeFlags)
+ {
+ CastSpell(this, gp->SpellId, true);
+ continue;
+ }
+ else
+ sLog.outError("Player %s has glyph with typeflags %u in slot with typeflags %u, removing.", m_name.c_str(), gp->TypeFlags, gs->TypeFlags);
+ }
+ else
+ sLog.outError("Player %s has not existing glyph slot entry %u on index %u", m_name.c_str(), GetGlyphSlot(i), i);
+ }
+ else
+ sLog.outError("Player %s has not existing glyph entry %u on index %u", m_name.c_str(), glyph, i);
+
+ // On any error remove glyph
+ SetGlyph(i, 0);
+ }
+ }
+}
+
void Player::LoadCorpse()
{
if( isAlive() )
@@ -14640,15 +15324,16 @@ void Player::_LoadInventory(QueryResult *result, uint32 timediff)
// load mailed item which should receive current player
void Player::_LoadMailedItems(Mail *mail)
{
- QueryResult* result = CharacterDatabase.PQuery("SELECT item_guid, item_template FROM mail_items WHERE mail_id='%u'", mail->messageID);
+ // data needs to be at first place for Item::LoadFromDB
+ QueryResult* result = CharacterDatabase.PQuery("SELECT data, item_guid, item_template FROM mail_items JOIN item_instance ON item_guid = guid WHERE mail_id='%u'", mail->messageID);
if(!result)
return;
do
{
Field *fields = result->Fetch();
- uint32 item_guid_low = fields[0].GetUInt32();
- uint32 item_template = fields[1].GetUInt32();
+ uint32 item_guid_low = fields[1].GetUInt32();
+ uint32 item_template = fields[2].GetUInt32();
mail->AddItem(item_guid_low, item_template);
@@ -14664,7 +15349,7 @@ void Player::_LoadMailedItems(Mail *mail)
Item *item = NewItemOrBag(proto);
- if(!item->LoadFromDB(item_guid_low, 0))
+ if(!item->LoadFromDB(item_guid_low, 0, result))
{
sLog.outError( "Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: %u, deleted from mail", mail->messageID, item_guid_low);
CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid = '%u'", item_guid_low);
@@ -14845,6 +15530,9 @@ void Player::_LoadQuestStatus(QueryResult *result)
if(CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(pQuest->GetCharTitleId()))
SetTitle(titleEntry);
}
+
+ if(pQuest->GetBonusTalents())
+ m_questRewardTalentCount+=pQuest->GetBonusTalents();
}
sLog.outDebug("Quest status is {%u} for quest {%u} for player (GUID: %u)", questStatusData.m_status, quest_id, GetGUIDLow());
@@ -14960,11 +15648,7 @@ void Player::_LoadReputation(QueryResult *result)
void Player::_LoadSpells(QueryResult *result)
{
- for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
- delete itr->second;
- m_spells.clear();
-
- //QueryResult *result = CharacterDatabase.PQuery("SELECT spell,slot,active FROM character_spell WHERE guid = '%u'",GetGUIDLow());
+ //QueryResult *result = CharacterDatabase.PQuery("SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'",GetGUIDLow());
if(result)
{
@@ -14972,7 +15656,7 @@ void Player::_LoadSpells(QueryResult *result)
{
Field *fields = result->Fetch();
- addSpell(fields[0].GetUInt16(), fields[2].GetBool(), false, true, fields[1].GetUInt16(), fields[3].GetBool());
+ addSpell(fields[0].GetUInt16(), fields[1].GetBool(), false, false, fields[2].GetBool());
}
while( result->NextRow() );
@@ -15121,29 +15805,29 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave *save, bool permanent, b
void Player::SendRaidInfo()
{
+ uint32 counter = 0;
+
WorldPacket data(SMSG_RAID_INSTANCE_INFO, 4);
- uint32 counter = 0, i;
- for(i = 0; i < TOTAL_DIFFICULTIES; i++)
- for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr)
- if(itr->second.perm) counter++;
+ size_t p_counter = data.wpos();
+ data << uint32(counter); // placeholder
- data << counter;
- for(i = 0; i < TOTAL_DIFFICULTIES; i++)
+ for(int i = 0; i < TOTAL_DIFFICULTIES; ++i)
{
for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr)
{
if(itr->second.perm)
{
InstanceSave *save = itr->second.save;
- data << (save->GetMapId());
- data << (uint32)(save->GetResetTime() - time(NULL));
- data << save->GetInstanceId();
- data << uint32(counter);
- counter--;
+ data << uint32(save->GetMapId());
+ data << uint32(save->GetResetTime() - time(NULL));
+ data << uint32(save->GetInstanceId());
+ data << uint32(save->GetDifficulty());
+ ++counter;
}
}
}
+ data.put<uint32>(p_counter,counter);
GetSession()->SendPacket(&data);
}
@@ -15229,6 +15913,13 @@ void Player::ConvertInstancesToGroup(Player *player, Group *group, uint64 player
bool Player::_LoadHomeBind(QueryResult *result)
{
+ PlayerInfo const *info = objmgr.GetPlayerInfo(getRace(), getClass());
+ if(!info)
+ {
+ sLog.outError("Player have incorrect race/class pair. Can't be loaded.");
+ return false;
+ }
+
bool ok = false;
//QueryResult *result = CharacterDatabase.PQuery("SELECT map,zone,position_x,position_y,position_z FROM character_homebind WHERE guid = '%u'", GUID_LOPART(playerGuid));
if (result)
@@ -15253,9 +15944,6 @@ bool Player::_LoadHomeBind(QueryResult *result)
if(!ok)
{
- PlayerInfo const *info = objmgr.GetPlayerInfo(getRace(), getClass());
- if(!info) return false;
-
m_homebindMapId = info->mapId;
m_homebindZoneId = info->zoneId;
m_homebindX = info->positionX;
@@ -15283,12 +15971,6 @@ void Player::SaveToDB()
// first save/honor gain after midnight will also update the player's honor fields
UpdateHonorFields();
- // players aren't saved on battleground maps
- uint32 mapid = IsBeingTeleported() ? GetTeleportDest().mapid : GetMapId();
- const MapEntry * me = sMapStore.LookupEntry(mapid);
- if(!me || me->IsBattleGroundOrArena())
- return;
-
int is_save_resting = HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) ? 1 : 0;
//save, far from tavern/city
//save, but in tavern/city
@@ -15303,10 +15985,10 @@ void Player::SaveToDB()
uint32 tmp_displayid = GetDisplayId();
// Set player sit state to standing on save, also stealth and shifted form
- SetByteValue(UNIT_FIELD_BYTES_1, 0, 0); // stand state
+ SetStandState(UNIT_STAND_STATE_STAND); // stand state
+ RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // stand flags?
SetByteValue(UNIT_FIELD_BYTES_2, 3, 0); // shapeshift
- SetByteValue(UNIT_FIELD_BYTES_1, 3, 0); // stand flags?
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
SetDisplayId(GetNativeDisplayId());
bool inworld = IsInWorld();
@@ -15324,23 +16006,14 @@ void Player::SaveToDB()
"taximask, online, cinematic, "
"totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, "
"trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, "
- "death_expire_time, taxi_path, arena_pending_points, latency) VALUES ("
+ "death_expire_time, taxi_path, arena_pending_points, latency, bgid, bgteam, bgmap, bgx, bgy, bgz, bgo) VALUES ("
<< GetGUIDLow() << ", "
<< GetSession()->GetAccountId() << ", '"
<< sql_name << "', "
<< m_race << ", "
<< m_class << ", ";
- bool save_to_dest = false;
- if(IsBeingTeleported())
- {
- // don't save to battlegrounds or arenas
- const MapEntry *entry = sMapStore.LookupEntry(GetTeleportDest().mapid);
- if(entry && entry->map_type != MAP_BATTLEGROUND && entry->map_type != MAP_ARENA)
- save_to_dest = true;
- }
-
- if(!save_to_dest)
+ if(!IsBeingTeleported())
{
ss << GetMapId() << ", "
<< (uint32)GetDifficulty() << ", "
@@ -15365,12 +16038,11 @@ void Player::SaveToDB()
ss << GetUInt32Value(i) << " ";
}
- ss << "', '";
+ ss << "', ";
- for( i = 0; i < 8; i++ )
- ss << m_taxi.GetTaximask(i) << " ";
+ ss << m_taxi; // string with TaxiMaskSize numbers
- ss << "', ";
+ ss << ", ";
ss << (inworld ? 1 : 0);
ss << ", ";
@@ -15424,9 +16096,19 @@ void Player::SaveToDB()
ss << ", '";
ss << m_taxi.SaveTaxiDestinationsToString();
- ss << "', '0', '";
+ ss << "', '0', ";
ss << GetSession()->GetLatency();
- ss << "' )";
+ ss << ", ";
+ ss << GetBattleGroundId();
+ ss << ", ";
+ ss << GetBGTeam();
+ ss << ", ";
+ ss << m_bgEntryPoint.mapid << ", "
+ << finiteAlways(m_bgEntryPoint.x) << ", "
+ << finiteAlways(m_bgEntryPoint.y) << ", "
+ << finiteAlways(m_bgEntryPoint.z) << ", "
+ << finiteAlways(m_bgEntryPoint.o);
+ ss << ")";
CharacterDatabase.Execute( ss.str().c_str() );
@@ -15455,23 +16137,7 @@ void Player::SaveToDB()
// save pet (hunter pet level and experience and all type pets health/mana).
if(Pet* pet = GetPet())
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
-
- //to prevent access to DB we should cache some data, which is used very often
- CachePlayerInfoMap::iterator _iter = objmgr.m_mPlayerInfoMap.find(GetGUIDLow());
- if(_iter != objmgr.m_mPlayerInfoMap.end())//skip new players
- {
- _iter->second->unLevel = getLevel();
-
- _iter->second->unArenaInfoSlot0 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 0 * 6 + 5);
- _iter->second->unArenaInfoSlot1 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 * 6 + 5);
- _iter->second->unArenaInfoSlot2 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 2 * 6 + 5);
-
- _iter->second->unfield = GetUInt32Value(UNIT_FIELD_BYTES_0);
-
- _iter->second->unArenaInfoId0 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (0 * 6));
- _iter->second->unArenaInfoId1 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (1 * 6));
- _iter->second->unArenaInfoId2 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (2 * 6));
- }
+ m_achievementMgr.SaveToDB();
}
// fast save function for item/money cheating preventing - save only inventory and money state
@@ -15549,7 +16215,7 @@ void Player::_SaveAuras()
{
CharacterDatabase.PExecute("INSERT INTO character_aura (guid,caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges) "
"VALUES ('%u', '" I64FMTD "' ,'%u', '%u', '%u', '%d', '%d', '%d', '%d')",
- GetGUIDLow(), itr2->second->GetCasterGUID(), (uint32)itr2->second->GetId(), (uint32)itr2->second->GetEffIndex(), (uint32)itr2->second->GetStackAmount(), itr2->second->GetModifier()->m_amount,int(itr2->second->GetAuraMaxDuration()),int(itr2->second->GetAuraDuration()),int(itr2->second->m_procCharges));
+ GetGUIDLow(), itr2->second->GetCasterGUID(), (uint32)itr2->second->GetId(), (uint32)itr2->second->GetEffIndex(), (uint32)itr2->second->GetStackAmount(), itr2->second->GetModifier()->m_amount ,int(itr2->second->GetAuraMaxDuration()),int(itr2->second->GetAuraDuration()),int(itr2->second->GetAuraCharges()));
}
}
}
@@ -15750,18 +16416,26 @@ void Player::_SaveReputation()
void Player::_SaveSpells()
{
- for (PlayerSpellMap::const_iterator itr = m_spells.begin(), next = m_spells.begin(); itr != m_spells.end(); itr = next)
+ for (PlayerSpellMap::iterator itr = m_spells.begin(), next = m_spells.begin(); itr != m_spells.end();)
{
- ++next;
if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->state == PLAYERSPELL_CHANGED)
CharacterDatabase.PExecute("DELETE FROM character_spell WHERE guid = '%u' and spell = '%u'", GetGUIDLow(), itr->first);
- if (itr->second->state == PLAYERSPELL_NEW || itr->second->state == PLAYERSPELL_CHANGED)
- CharacterDatabase.PExecute("INSERT INTO character_spell (guid,spell,slot,active,disabled) VALUES ('%u', '%u', '%u','%u','%u')", GetGUIDLow(), itr->first, itr->second->slotId,itr->second->active ? 1 : 0,itr->second->disabled ? 1 : 0);
+
+ // add only changed/new not dependent spells
+ if (!itr->second->dependent && (itr->second->state == PLAYERSPELL_NEW || itr->second->state == PLAYERSPELL_CHANGED))
+ CharacterDatabase.PExecute("INSERT INTO character_spell (guid,spell,active,disabled) VALUES ('%u', '%u', '%u', '%u')", GetGUIDLow(), itr->first, itr->second->active ? 1 : 0,itr->second->disabled ? 1 : 0);
if (itr->second->state == PLAYERSPELL_REMOVED)
- _removeSpell(itr->first);
+ {
+ delete itr->second;
+ m_spells.erase(itr++);
+ }
else
+ {
itr->second->state = PLAYERSPELL_UNCHANGED;
+ ++itr;
+ }
+
}
}
@@ -15933,6 +16607,42 @@ void Player::SetFloatValueInDB(uint16 index, float value, uint64 guid)
Player::SetUInt32ValueInDB(index, temp, guid);
}
+void Player::Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair)
+{
+ Tokens tokens;
+ if(!LoadValuesArrayFromDB(tokens, guid))
+ return;
+
+ uint32 unit_bytes0 = GetUInt32ValueFromArray(tokens, UNIT_FIELD_BYTES_0);
+ uint8 race = unit_bytes0 & 0xFF;
+ uint8 class_ = (unit_bytes0 >> 8) & 0xFF;
+
+ PlayerInfo const* info = objmgr.GetPlayerInfo(race, class_);
+ if(!info)
+ return;
+
+ unit_bytes0 &= ~(0xFF << 16);
+ unit_bytes0 |= (gender << 16);
+ SetUInt32ValueInArray(tokens, UNIT_FIELD_BYTES_0, unit_bytes0);
+
+ SetUInt32ValueInArray(tokens, UNIT_FIELD_DISPLAYID, gender ? info->displayId_f : info->displayId_m);
+ SetUInt32ValueInArray(tokens, UNIT_FIELD_NATIVEDISPLAYID, gender ? info->displayId_f : info->displayId_m);
+
+ SetUInt32ValueInArray(tokens, PLAYER_BYTES, (skin | (face << 8) | (hairStyle << 16) | (hairColor << 24)));
+
+ uint32 player_bytes2 = GetUInt32ValueFromArray(tokens, PLAYER_BYTES_2);
+ player_bytes2 &= ~0xFF;
+ player_bytes2 |= facialHair;
+ SetUInt32ValueInArray(tokens, PLAYER_BYTES_2, player_bytes2);
+
+ uint32 player_bytes3 = GetUInt32ValueFromArray(tokens, PLAYER_BYTES_3);
+ player_bytes3 &= ~0xFF;
+ player_bytes3 |= gender;
+ SetUInt32ValueInArray(tokens, PLAYER_BYTES_3, player_bytes3);
+
+ SaveValuesArrayInDB(tokens, guid);
+}
+
void Player::SendAttackSwingNotStanding()
{
WorldPacket data(SMSG_ATTACKSWING_NOTSTANDING, 0);
@@ -15965,7 +16675,8 @@ void Player::SendAttackSwingBadFacingAttack()
void Player::SendAutoRepeatCancel()
{
- WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, 0);
+ WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, GetPackGUID().size());
+ data.append(GetPackGUID()); // may be it's target guid
GetSession()->SendPacket( &data );
}
@@ -16198,6 +16909,7 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
{
WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
+ data << uint32(0);
GetSession()->SendPacket(&data);
if(GetGroup())
@@ -16341,65 +17053,79 @@ void Player::PetSpellInitialize()
{
Pet* pet = GetPet();
- if(pet)
- {
- uint8 addlist = 0;
+ if(!pet)
+ return;
- sLog.outDebug("Pet Spells Groups");
+ sLog.outDebug("Pet Spells Groups");
- CreatureInfo const *cinfo = pet->GetCreatureInfo();
+ CharmInfo *charmInfo = pet->GetCharmInfo();
- if(pet->isControlled() && (pet->getPetType() == HUNTER_PET || cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK))
- {
- for(PetSpellMap::iterator itr = pet->m_spells.begin();itr != pet->m_spells.end();++itr)
- {
- if(itr->second->state == PETSPELL_REMOVED)
- continue;
- ++addlist;
- }
- }
+ WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+10*4);
+ data << uint64(pet->GetGUID());
+ data << uint32(pet->GetCreatureInfo()->family); // creature family (required for pet talents)
+ data << uint32(0);
+ data << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
- // first line + actionbar + spellcount + spells + last adds
- WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);
+ // action bar loop
+ for(uint32 i = 0; i < 10; i++)
+ {
+ data << uint32(charmInfo->GetActionBarEntry(i)->Raw);
+ }
- CharmInfo *charmInfo = pet->GetCharmInfo();
+ size_t spellsCountPos = data.wpos();
- //16
- data << (uint64)pet->GetGUID() << uint32(0x00000000) << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
+ // spells count
+ uint8 addlist = 0;
+ data << uint8(addlist); // placeholder
- for(uint32 i = 0; i < 10; i++) //40
+ if(pet->isControlled() && ((pet->getPetType() == HUNTER_PET) || ((pet->GetCreatureInfo()->type == CREATURE_TYPE_DEMON) && (getClass() == CLASS_WARLOCK))))
+ {
+ // spells loop
+ for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
{
- data << uint16(charmInfo->GetActionBarEntry(i)->SpellOrAction) << uint16(charmInfo->GetActionBarEntry(i)->Type);
+ if(itr->second->state == PETSPELL_REMOVED)
+ continue;
+
+ data << uint16(itr->first);
+ data << uint16(itr->second->active); // pet spell active state isn't boolean
+ ++addlist;
}
+ }
- data << uint8(addlist); //1
+ data.put<uint8>(spellsCountPos, addlist);
- if(addlist && pet->isControlled())
- {
- for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
- {
- if(itr->second->state == PETSPELL_REMOVED)
- continue;
+ uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size() + pet->m_CreatureCategoryCooldowns.size();
+ data << uint8(cooldownsCount);
- data << uint16(itr->first);
- data << uint16(itr->second->active); // pet spell active state isn't boolean
- }
- }
+ time_t curTime = time(NULL);
- //data << uint8(0x01) << uint32(0x6010) << uint32(0x01) << uint32(0x05) << uint16(0x00); //15
- uint8 count = 3; //1+8+8+8=25
+ for(CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
+ {
+ time_t cooldown = 0;
- // if count = 0, then end of packet...
- data << count;
- // uint32 value is spell id...
- // uint64 value is constant 0, unknown...
- data << uint32(0x6010) << uint64(0); // if count = 1, 2 or 3
- //data << uint32(0x5fd1) << uint64(0); // if count = 2
- data << uint32(0x8e8c) << uint64(0); // if count = 3
- data << uint32(0x8e8b) << uint64(0); // if count = 3
+ if(itr->second > curTime)
+ cooldown = (itr->second - curTime) * 1000;
- GetSession()->SendPacket(&data);
+ data << uint16(itr->first); // spellid
+ data << uint16(0); // spell category?
+ data << uint32(itr->second); // cooldown
+ data << uint32(0); // category cooldown
}
+
+ for(CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureCategoryCooldowns.begin(); itr != pet->m_CreatureCategoryCooldowns.end(); ++itr)
+ {
+ time_t cooldown = 0;
+
+ if(itr->second > curTime)
+ cooldown = (itr->second - curTime) * 1000;
+
+ data << uint16(itr->first); // spellid
+ data << uint16(0); // spell category?
+ data << uint32(0); // cooldown
+ data << uint32(itr->second); // category cooldown
+ }
+
+ GetSession()->SendPacket(&data);
}
void Player::PossessSpellInitialize()
@@ -16421,7 +17147,10 @@ void Player::PossessSpellInitialize()
WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);// first line + actionbar + spellcount + spells + last adds
//16
- data << (uint64)charm->GetGUID() << uint32(0x00000000) << uint8(0) << uint8(0) << uint16(0);
+ data << uint64(charm->GetGUID());
+ data << uint32(0x00000000);
+ data << uint32(0);
+ data << uint8(0) << uint8(0) << uint16(0);
for(uint32 i = 0; i < 10; i++) //40
{
@@ -16430,11 +17159,8 @@ void Player::PossessSpellInitialize()
data << uint8(addlist); //1
- uint8 count = 3;
- data << count;
- data << uint32(0x6010) << uint64(0); // if count = 1, 2 or 3
- data << uint32(0x8e8c) << uint64(0); // if count = 3
- data << uint32(0x8e8b) << uint64(0); // if count = 3
+ uint8 count = 0;
+ data << uint8(count); // cooldowns count
GetSession()->SendPacket(&data);
}
@@ -16471,13 +17197,13 @@ void Player::CharmSpellInitialize()
WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);// first line + actionbar + spellcount + spells + last adds
- data << (uint64)charm->GetGUID() << uint32(0x00000000);
-
+ data << uint64(charm->GetGUID());
+ data << uint32(0x00000000);
+ data << uint32(0);
if(charm->GetTypeId() != TYPEID_PLAYER)
data << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState());
else
data << uint8(0) << uint8(0);
-
data << uint16(0);
for(uint32 i = 0; i < 10; i++) //40
@@ -16500,51 +17226,12 @@ void Player::CharmSpellInitialize()
}
}
- uint8 count = 3;
- data << count;
- data << uint32(0x6010) << uint64(0); // if count = 1, 2 or 3
- data << uint32(0x8e8c) << uint64(0); // if count = 3
- data << uint32(0x8e8b) << uint64(0); // if count = 3
+ uint8 count = 0;
+ data << uint8(count); // cooldowns count
GetSession()->SendPacket(&data);
}
-int32 Player::GetTotalFlatMods(uint32 spellId, SpellModOp op)
-{
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
- if (!spellInfo) return 0;
- int32 total = 0;
- for (SpellModList::iterator itr = m_spellMods[op].begin(); itr != m_spellMods[op].end(); ++itr)
- {
- SpellModifier *mod = *itr;
-
- if(!IsAffectedBySpellmod(spellInfo,mod))
- continue;
-
- if (mod->type == SPELLMOD_FLAT)
- total += mod->value;
- }
- return total;
-}
-
-int32 Player::GetTotalPctMods(uint32 spellId, SpellModOp op)
-{
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
- if (!spellInfo) return 0;
- int32 total = 0;
- for (SpellModList::iterator itr = m_spellMods[op].begin(); itr != m_spellMods[op].end(); ++itr)
- {
- SpellModifier *mod = *itr;
-
- if(!IsAffectedBySpellmod(spellInfo,mod))
- continue;
-
- if (mod->type == SPELLMOD_PCT)
- total += mod->value;
- }
- return total;
-}
-
bool Player::IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell const* spell)
{
if (!mod || !spellInfo)
@@ -16562,22 +17249,27 @@ bool Player::IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mo
return false;
}
- return spellmgr.IsAffectedBySpell(spellInfo,mod->spellId,mod->effectId,mod->mask);
+ return spellmgr.IsAffectedByMod(spellInfo, mod);
}
void Player::AddSpellMod(SpellModifier* mod, bool apply)
{
uint16 Opcode= (mod->type == SPELLMOD_FLAT) ? SMSG_SET_FLAT_SPELL_MODIFIER : SMSG_SET_PCT_SPELL_MODIFIER;
- for(int eff=0;eff<64;++eff)
+ uint8 i=0;
+ flag96 _mask;
+ for(int eff=0;eff<96;++eff)
{
- uint64 _mask = uint64(1) << eff;
+ if ((eff!=0) && (eff%32==0))
+ i++;
+
+ _mask[i] = uint32(1) << (eff-(32*i));
if ( mod->mask & _mask)
{
int32 val = 0;
for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
{
- if ((*itr)->type == mod->type && (*itr)->mask & _mask)
+ if ((*itr)->type == mod->type && (*itr)->mask & _mask )
val += (*itr)->value;
}
val += apply ? mod->value : -(mod->value);
@@ -16676,6 +17368,27 @@ void Player::RemovePetitionsAndSigns(uint64 guid, uint32 type)
CharacterDatabase.CommitTransaction();
}
+void Player::LeaveAllArenaTeams(uint64 guid)
+{
+ QueryResult *result = CharacterDatabase.PQuery("SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid='%u'", GUID_LOPART(guid));
+ if(!result)
+ return;
+
+ do
+ {
+ Field *fields = result->Fetch();
+ uint32 at_id = fields[0].GetUInt32();
+ if(at_id != 0)
+ {
+ ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
+ if(at)
+ at->DelMember(guid);
+ }
+ } while (result->NextRow());
+
+ delete result;
+}
+
void Player::SetRestBonus (float rest_bonus_new)
{
// Prevent resting on max level
@@ -16706,7 +17419,7 @@ void Player::HandleStealthedUnitsDetection()
{
std::list<Unit*> stealthedUnits;
Trinity::AnyStealthedCheck u_check;
- Trinity::UnitListSearcher<Trinity::AnyStealthedCheck > searcher(stealthedUnits, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyStealthedCheck > searcher(this, stealthedUnits, u_check);
VisitNearbyObject(World::GetMaxVisibleDistance(), searcher);
for (std::list<Unit*>::iterator i = stealthedUnits.begin(); i != stealthedUnits.end(); ++i)
@@ -16725,7 +17438,7 @@ void Player::HandleStealthedUnitsDetection()
// send data at target visibility change (adding to client)
if((*i)!=this && (*i)->isType(TYPEMASK_UNIT))
{
- SendAuraDurationsForTarget(*i);
+ SendAurasForTarget(*i);
//if(((Unit*)(*i))->isAlive()) //should be always alive
{
if((*i)->GetTypeId()==TYPEID_UNIT)
@@ -17521,6 +18234,10 @@ bool Player::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList, bool
if (u == this)
return true;
+ // phased visibility (both must phased in same way)
+ if(!InSamePhase(u))
+ return false;
+
// player visible for other player if not logout and at same transport
// including case when player is out of world
bool at_same_transport =
@@ -17719,7 +18436,7 @@ void Player::UpdateVisibilityOf(WorldObject* target)
// send data at target visibility change (adding to client)
if(target!=this && target->isType(TYPEMASK_UNIT))
{
- SendAuraDurationsForTarget((Unit*)target);
+ SendAurasForTarget((Unit*)target);
if(((Unit*)target)->isAlive())
{
if(target->GetTypeId()==TYPEID_UNIT)
@@ -17778,7 +18495,7 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, UpdateDataMapType&
}
}
-template<>
+/*template<>
void Player::UpdateVisibilityOf<Creature>(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow)
{
if(HaveAtClient(target))
@@ -17811,10 +18528,10 @@ void Player::UpdateVisibilityOf<Creature>(Creature* target, UpdateData& data, Up
#endif
}
}
-}
+}*/
template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
-//template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
+template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
@@ -17898,7 +18615,7 @@ void Player::SetGroup(Group *group, int8 subgroup)
void Player::SendInitialPacketsBeforeAddToMap()
{
- WorldPacket data(SMSG_SET_REST_START, 4);
+ WorldPacket data(SMSG_SET_REST_START_OBSOLETE, 4);
data << uint32(0); // unknown, may be rest state time or experience
GetSession()->SendPacket(&data);
@@ -17926,6 +18643,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
SendInitialActionButtons();
SendInitialReputations();
+ m_achievementMgr.SendAllAchievementData();
UpdateZone(GetZoneId());
SendInitWorldStates();
@@ -17936,13 +18654,23 @@ void Player::SendInitialPacketsBeforeAddToMap()
data << (float)0.01666667f; // game speed
GetSession()->SendPacket( &data );
+ data.Initialize(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
+ data << uint32(0x00000000); // on blizz it increments periodically
+ GetSession()->SendPacket(&data);
+
// set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment
if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight())
AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
+
+ m_mover = this;
}
void Player::SendInitialPacketsAfterAddToMap()
{
+ WorldPacket data(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
+ data << uint32(0x00000000); // on blizz it increments periodically
+ GetSession()->SendPacket(&data);
+
CastSpell(this, 836, true); // LOGINEFFECT
// set some aura effects that send packet to player client after add player to map
@@ -17973,6 +18701,7 @@ void Player::SendInitialPacketsAfterAddToMap()
SendMessageToSet(&data,true);
}
+ SendAurasForTarget(this);
SendEnchantmentDurations(); // must be after add to map
SendItemDurations(); // must be after add to map
}
@@ -17985,16 +18714,24 @@ void Player::SendUpdateToOutOfRangeGroupMembers()
group->UpdatePlayerOutOfRange(this);
m_groupUpdateMask = GROUP_UPDATE_FLAG_NONE;
- m_auraUpdateMask = 0;
+ m_auraRaidUpdateMask = 0;
if(Pet *pet = GetPet())
- pet->ResetAuraUpdateMask();
+ pet->ResetAuraUpdateMaskForRaid();
}
-void Player::SendTransferAborted(uint32 mapid, uint16 reason)
+void Player::SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg)
{
WorldPacket data(SMSG_TRANSFER_ABORTED, 4+2);
data << uint32(mapid);
- data << uint16(reason); // transfer abort reason
+ data << uint8(reason); // transfer abort reason
+ switch(reason)
+ {
+ case TRANSFER_ABORT_INSUF_EXPAN_LVL:
+ case TRANSFER_ABORT_DIFFICULTY:
+ case TRANSFER_ABORT_UNIQUE_MESSAGE:
+ data << uint8(arg);
+ break;
+ }
GetSession()->SendPacket(&data);
}
@@ -18060,22 +18797,18 @@ void Player::resetSpells()
learnQuestRewardedSpells();
}
-void Player::learnDefaultSpells(bool loading)
+void Player::learnDefaultSpells()
{
// learn default race/class spells
PlayerInfo const *info = objmgr.GetPlayerInfo(getRace(),getClass());
- std::list<CreateSpellPair>::const_iterator spell_itr;
- for (spell_itr = info->spell.begin(); spell_itr!=info->spell.end(); ++spell_itr)
+ for (PlayerCreateInfoSpells::const_iterator itr = info->spell.begin(); itr!=info->spell.end(); ++itr)
{
- uint16 tspell = spell_itr->first;
- if (tspell)
- {
- sLog.outDebug("PLAYER: Adding initial spell, id = %u",tspell);
- if(loading || !spell_itr->second) // not care about passive spells or loading case
- addSpell(tspell,spell_itr->second);
- else // but send in normal spell in game learn case
- learnSpell(tspell);
- }
+ uint32 tspell = *itr;
+ sLog.outDebug("PLAYER (Class: %u Race: %u): Adding initial spell, id = %u",uint32(getClass()),uint32(getRace()), tspell);
+ if(!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
+ addSpell(tspell,true,true,true,false);
+ else // but send in normal spell in game learn case
+ learnSpell(tspell,true);
}
}
@@ -18167,7 +18900,7 @@ void Player::learnQuestRewardedSpells()
}
}
-void Player::learnSkillRewardedSpells(uint32 skill_id )
+void Player::learnSkillRewardedSpells(uint32 skill_id, uint32 skill_value )
{
uint32 raceMask = getRaceMask();
uint32 classMask = getClassMask();
@@ -18185,35 +18918,67 @@ void Player::learnSkillRewardedSpells(uint32 skill_id )
if (sSpellStore.LookupEntry(pAbility->spellId))
{
- // Ok need learn spell
- learnSpell(pAbility->spellId);
+ // need unlearn spell
+ if (skill_value < pAbility->req_skill_value)
+ removeSpell(pAbility->spellId);
+ // need learn
+ else if (!IsInWorld())
+ addSpell(pAbility->spellId,true,true,true,false);
+ else
+ learnSpell(pAbility->spellId,true);
}
}
}
-void Player::learnSkillRewardedSpells()
+void Player::SendAurasForTarget(Unit *target)
{
- for (uint16 i=0; i < PLAYER_MAX_SKILLS; i++)
- {
- if(!GetUInt32Value(PLAYER_SKILL_INDEX(i)))
- continue;
-
- uint32 pskill = GetUInt32Value(PLAYER_SKILL_INDEX(i)) & 0x0000FFFF;
+ if(!target || target->GetVisibleAuras()->empty()) // speedup things
+ return;
- learnSkillRewardedSpells(pskill);
- }
-}
+ WorldPacket data(SMSG_AURA_UPDATE_ALL);
+ data.append(target->GetPackGUID());
-void Player::SendAuraDurationsForTarget(Unit* target)
-{
- for(Unit::AuraMap::const_iterator itr = target->GetAuras().begin(); itr != target->GetAuras().end(); ++itr)
+ Unit::VisibleAuraMap const *visibleAuras = target->GetVisibleAuras();
+ for(Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
{
- Aura* aura = itr->second;
- if(aura->GetAuraSlot() >= MAX_AURAS || aura->IsPassive() || aura->GetCasterGUID()!=GetGUID())
- continue;
+ Aura * aura=NULL;
+ for (uint8 i=0 ; i<3; i++)
+ {
+ if (itr->second.m_slotAuras[i])
+ {
+ aura=itr->second.m_slotAuras[i];
+ break;
+ }
+ }
+ if(aura)
+ {
+ data << uint8(aura->GetAuraSlot());
+ data << uint32(aura->GetId());
+
+ if(aura->GetId())
+ {
+ // flags
+ data << itr->second.m_Flags;
+ // level
+ data << itr->second.m_Level;
+ // charges
+ data << uint8(aura->GetAuraCharges());
+
+ if(!(itr->second.m_Flags & AFLAG_NOT_CASTER))
+ {
+ data << uint8(0); // packed GUID of someone (caster?)
+ }
- aura->SendAuraDurationForCaster(this);
+ if(itr->second.m_Flags & AFLAG_DURATION) // include aura duration
+ {
+ data << uint32(aura->GetAuraMaxDuration());
+ data << uint32(aura->GetAuraDuration());
+ }
+ }
+ }
}
+
+ GetSession()->SendPacket(&data);
}
void Player::SetDailyQuestStatus( uint32 quest_id )
@@ -18257,7 +19022,7 @@ bool Player::InArena() const
return true;
}
-bool Player::GetBGAccessByLevel(uint32 bgTypeId) const
+bool Player::GetBGAccessByLevel(BattleGroundTypeId bgTypeId) const
{
// get a template bg instead of running one
BattleGround *bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
@@ -18270,40 +19035,34 @@ bool Player::GetBGAccessByLevel(uint32 bgTypeId) const
return true;
}
-uint32 Player::GetMinLevelForBattleGroundQueueId(uint32 queue_id)
+uint32 Player::GetMinLevelForBattleGroundQueueId(uint32 queue_id, BattleGroundTypeId bgTypeId)
{
- if(queue_id < 1)
- return 0;
-
- if(queue_id >=6)
- queue_id = 6;
-
- return 10*(queue_id+1);
+ BattleGround *bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
+ assert(bg);
+ return (queue_id*10)+bg->GetMinLevel();
}
-uint32 Player::GetMaxLevelForBattleGroundQueueId(uint32 queue_id)
+uint32 Player::GetMaxLevelForBattleGroundQueueId(uint32 queue_id, BattleGroundTypeId bgTypeId)
{
- if(queue_id >=6)
- return 255; // hardcoded max level
-
- return 10*(queue_id+2)-1;
+ return GetMinLevelForBattleGroundQueueId(queue_id, bgTypeId)+10;
}
-//TODO make this more generic - current implementation is wrong
-uint32 Player::GetBattleGroundQueueIdFromLevel() const
+uint32 Player::GetBattleGroundQueueIdFromLevel(BattleGroundTypeId bgTypeId) const
{
- uint32 level = getLevel();
- if(level <= 19)
- return 0;
- else if (level > 69)
- return 6;
- else
- return level/10 - 1; // 20..29 -> 1, 30-39 -> 2, ...
- /*
- assert(bgTypeId < MAX_BATTLEGROUND_TYPES);
BattleGround *bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
assert(bg);
- return (getLevel() - bg->GetMinLevel()) / 10;*/
+ if(getLevel()<bg->GetMinLevel())
+ {
+ sLog.outError("getting queue_id for player who doesn't meet the requirements - this shouldn't happen");
+ return 0;
+ }
+ uint32 queue_id = (getLevel() - bg->GetMinLevel()) / 10;
+ if(queue_id>MAX_BATTLEGROUND_QUEUES)
+ {
+ sLog.outError("to high queue_id %u this shouldn't happen",queue_id);
+ return 0;
+ }
+ return queue_id;
}
float Player::GetReputationPriceDiscount( Creature const* pCreature ) const
@@ -18326,28 +19085,42 @@ bool Player::IsSpellFitByClassAndRace( uint32 spell_id ) const
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spell_id);
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spell_id);
+ if(lower==upper)
+ return true;
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
{
// skip wrong race skills
if( _spell_idx->second->racemask && (_spell_idx->second->racemask & racemask) == 0)
- return false;
+ continue;
// skip wrong class skills
if( _spell_idx->second->classmask && (_spell_idx->second->classmask & classmask) == 0)
- return false;
+ continue;
+
+ return true;
}
- return true;
+
+ return false;
}
-bool Player::HasQuestForGO(int32 GOId)
+bool Player::HasQuestForGO(int32 GOId) const
{
- for( QuestStatusMap::iterator i = mQuestStatus.begin( ); i != mQuestStatus.end( ); ++i )
+ for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
- QuestStatusData qs=i->second;
+ uint32 questid = GetQuestSlotQuestId(i);
+ if ( questid == 0 )
+ continue;
+
+ QuestStatusMap::const_iterator qs_itr = mQuestStatus.find(questid);
+ if(qs_itr == mQuestStatus.end())
+ continue;
+
+ QuestStatusData const& qs = qs_itr->second;
+
if (qs.m_status == QUEST_STATUS_INCOMPLETE)
{
- Quest const* qinfo = objmgr.GetQuestTemplate(i->first);
+ Quest const* qinfo = objmgr.GetQuestTemplate(questid);
if(!qinfo)
continue;
@@ -18442,9 +19215,8 @@ void Player::AutoUnequipOffhandIfNeed()
if(!offItem)
return;
- Item *mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
-
- if(!mainItem || mainItem->GetProto()->InventoryType != INVTYPE_2HWEAPON)
+ // need unequip for 2h-weapon without TitanGrip
+ if (!IsTwoHandUsed())
return;
ItemPosCountVec off_dest;
@@ -18477,7 +19249,7 @@ bool Player::HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item cons
case ITEM_CLASS_WEAPON:
{
for(int i= EQUIPMENT_SLOT_MAINHAND; i < EQUIPMENT_SLOT_TABARD; ++i)
- if(Item *item = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
+ if(Item *item = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, i ))
if(item!=ignoreItem && item->IsFitToSpellRequirements(spellInfo))
return true;
break;
@@ -18486,17 +19258,17 @@ bool Player::HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item cons
{
// tabard not have dependent spells
for(int i= EQUIPMENT_SLOT_START; i< EQUIPMENT_SLOT_MAINHAND; ++i)
- if(Item *item = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
+ if(Item *item = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, i ))
if(item!=ignoreItem && item->IsFitToSpellRequirements(spellInfo))
return true;
// shields can be equipped to offhand slot
- if(Item *item = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
+ if(Item *item = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
if(item!=ignoreItem && item->IsFitToSpellRequirements(spellInfo))
return true;
// ranged slot can have some armor subclasses
- if(Item *item = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED))
+ if(Item *item = GetUseableItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED))
if(item!=ignoreItem && item->IsFitToSpellRequirements(spellInfo))
return true;
@@ -18510,6 +19282,24 @@ bool Player::HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item cons
return false;
}
+bool Player::CanNoReagentCast(SpellEntry const* spellInfo) const
+{
+ // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
+ if (spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
+ HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION))
+ return true;
+
+ // Check no reagent use mask
+ flag96 noReagentMask;
+ noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
+ noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1+1);
+ noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1+2);
+ if (spellInfo->SpellFamilyFlags & noReagentMask)
+ return true;
+
+ return false;
+}
+
void Player::RemoveItemDependentAurasAndCasts( Item * pItem )
{
AuraMap& auras = GetAuras();
@@ -18555,7 +19345,7 @@ uint32 Player::GetResurrectionSpellId()
for(AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
{
// Soulstone Resurrection // prio: 3 (max, non death persistent)
- if( prio < 2 && (*itr)->GetSpellProto()->SpellVisual == 99 && (*itr)->GetSpellProto()->SpellIconID == 92 )
+ if( prio < 2 && (*itr)->GetSpellProto()->SpellVisual[0] == 99 && (*itr)->GetSpellProto()->SpellIconID == 92 )
{
switch((*itr)->GetId())
{
@@ -18565,6 +19355,7 @@ uint32 Player::GetResurrectionSpellId()
case 20764: spell_id = 20760; break; // rank 4
case 20765: spell_id = 20761; break; // rank 5
case 27239: spell_id = 27240; break; // rank 6
+ case 47883: spell_id = 47882; break; // rank 7
default:
sLog.outError("Unhandled spell %%u: S.Resurrection",(*itr)->GetId());
continue;
@@ -18587,6 +19378,26 @@ uint32 Player::GetResurrectionSpellId()
return spell_id;
}
+// Used in triggers for check "Only to targets that grant experience or honor" req
+bool Player::isHonorOrXPTarget(Unit* pVictim)
+{
+ uint32 v_level = pVictim->getLevel();
+ uint32 k_grey = Trinity::XP::GetGrayLevel(getLevel());
+
+ // Victim level less gray level
+ if(v_level<=k_grey)
+ return false;
+
+ if(pVictim->GetTypeId() == TYPEID_UNIT)
+ {
+ if (((Creature*)pVictim)->isTotem() ||
+ ((Creature*)pVictim)->isPet() ||
+ ((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL)
+ return false;
+ }
+ return true;
+}
+
bool Player::RewardPlayerAndGroupAtKill(Unit* pVictim)
{
bool PvP = pVictim->isCharmedOwnedByPlayerOrPlayer();
@@ -18714,6 +19525,9 @@ uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const
void Player::ResurectUsingRequestData()
{
+ /// Teleport before resurrecting, otherwise the player might get attacked from creatures near his corpse
+ TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation());
+
ResurrectPlayer(0.0f,false);
if(GetMaxHealth() > m_resurrectHealth)
@@ -18731,8 +19545,6 @@ void Player::ResurectUsingRequestData()
SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY) );
SpawnCorpseBones();
-
- TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation());
}
void Player::SetClientControl(Unit* target, uint8 allowMove)
@@ -18746,28 +19558,31 @@ void Player::SetClientControl(Unit* target, uint8 allowMove)
void Player::UpdateZoneDependentAuras( uint32 newZone )
{
// remove new continent flight forms
- if( !isGameMaster() &&
- GetVirtualMapForMapAndZone(GetMapId(),newZone) != 530)
+ if( !IsAllowUseFlyMountsHere() )
{
RemoveSpellsCausingAura(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
RemoveSpellsCausingAura(SPELL_AURA_FLY);
}
// Some spells applied at enter into zone (with subzones)
- // Human Illusion
- // NOTE: these are removed by RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CHANGE_MAP);
- if ( newZone == 2367 ) // Old Hillsbrad Foothills
- {
- uint32 spellid = 0;
- // all horde races
- if( GetTeam() == HORDE )
- spellid = getGender() == GENDER_FEMALE ? 35481 : 35480;
- // and some alliance races
- else if( getRace() == RACE_NIGHTELF || getRace() == RACE_DRAENEI )
- spellid = getGender() == GENDER_FEMALE ? 35483 : 35482;
-
- if(spellid && !HasAura(spellid,0) )
- CastSpell(this,spellid,true);
+ switch(newZone)
+ {
+ case 2367: // Old Hillsbrad Foothills
+ {
+ // Human Illusion
+ // NOTE: these are removed by RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CHANGE_MAP);
+ uint32 spellid = 0;
+ // all horde races
+ if( GetTeam() == HORDE )
+ spellid = getGender() == GENDER_FEMALE ? 35481 : 35480;
+ // and some alliance races
+ else if( getRace() == RACE_NIGHTELF || getRace() == RACE_DRAENEI )
+ spellid = getGender() == GENDER_FEMALE ? 35483 : 35482;
+
+ if(spellid && !HasAura(spellid,0) )
+ CastSpell(this,spellid,true);
+ break;
+ }
}
}
@@ -18777,25 +19592,41 @@ void Player::UpdateAreaDependentAuras( uint32 newArea )
for(AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end();)
{
// use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or instead UpdateZone in both cases m_zoneUpdateId up-to-date
- if(!IsSpellAllowedInLocation(iter->second->GetSpellProto(),GetMapId(),m_zoneUpdateId,newArea))
+ if(GetSpellAllowedInLocationError(iter->second->GetSpellProto(),GetMapId(),m_zoneUpdateId,newArea,GetBattleGroundId())!=0)
RemoveAura(iter);
else
++iter;
}
- // unmount if enter in this subzone
- if( newArea == 35)
- RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
- // Dragonmaw Illusion
- else if( newArea == 3759 || newArea == 3966 || newArea == 3939 )
+ // some auras applied at subzone enter
+ switch(newArea)
{
- if( GetDummyAura(40214) )
- {
- if( !HasAura(40216,0) )
- CastSpell(this,40216,true);
- if( !HasAura(42016,0) )
- CastSpell(this,42016,true);
- }
+ // Dragonmaw Illusion
+ case 3759: // Netherwing Ledge
+ case 3939: // Dragonmaw Fortress
+ case 3966: // Dragonmaw Base Camp
+ if( GetDummyAura(40214) )
+ {
+ if( !HasAura(40216,0) )
+ CastSpell(this,40216,true);
+ if( !HasAura(42016,0) )
+ CastSpell(this,42016,true);
+ }
+ break;
+ // Dominion Over Acherus
+ case 4281: // Acherus: The Ebon Hold
+ case 4342: // Acherus: The Ebon Hold
+ if( HasSpell(51721) )
+ if( !HasAura(51721,0) )
+ CastSpell(this,51721,true);
+ break;
+ // Mist of the Kvaldir
+ case 4028: //Riplash Strand
+ case 4029: //Riplash Ruins
+ case 4106: //Garrosh's Landing
+ case 4031: //Pal'ea
+ CastSpell(this,54119,true);
+ break;
}
}
@@ -18930,18 +19761,20 @@ PartyResult Player::CanUninviteFromGroup() const
void Player::UpdateUnderwaterState( Map* m, float x, float y, float z )
{
float water_z = m->GetWaterLevel(x,y);
- float height_z = m->GetHeight(x,y,z, false); // use .map base surface height
+ float terrain_z = m->GetHeight(x,y,z, false); // use .map base surface height
uint8 flag1 = m->GetTerrainType(x,y);
- //!Underwater check, not in water if underground or above water level
- if (height_z <= INVALID_HEIGHT || z < (height_z-2) || z > (water_z - 2) )
- m_isunderwater &= 0x7A;
+ //!Underwater check, not in water if underground or above water level - take UC royal quater for example
+ if (terrain_z <= INVALID_HEIGHT || z < (terrain_z-2) || z > (water_z - 2) )
+ m_isunderwater &= ~UNDERWATER_INWATER;
else if ((z < (water_z - 2)) && (flag1 & 0x01))
- m_isunderwater |= 0x01;
+ m_isunderwater |= UNDERWATER_INWATER;
//!in lava check, anywhere under lava level
- if ((height_z <= INVALID_HEIGHT || z < (height_z - 0)) && (flag1 == 0x00) && IsInWater())
- m_isunderwater |= 0x80;
+ if ((terrain_z <= INVALID_HEIGHT || z < (terrain_z - 0)) && (flag1 == 0x00) && IsInWater())
+ m_isunderwater |= UNDERWATER_INLAVA;
+ else
+ m_isunderwater &= ~UNDERWATER_INLAVA;
}
void Player::SetCanParry( bool value )
@@ -18976,8 +19809,8 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const
void Player::HandleFallDamage(MovementInfo& movementInfo)
{
- if(movementInfo.fallTime < 1500)
- return;
+ //if(movementInfo.fallTime < 1500)
+ // return;
// calculate total z distance of the fall
float z_diff = m_lastFallZ - movementInfo.z;
@@ -18987,7 +19820,7 @@ void Player::HandleFallDamage(MovementInfo& movementInfo)
// 14.57 can be calculated by resolving damageperc formular below to 0
if (z_diff >= 14.57f && !isDead() && !isGameMaster() &&
!HasAuraType(SPELL_AURA_HOVER) && !HasAuraType(SPELL_AURA_FEATHER_FALL) &&
- !HasAuraType(SPELL_AURA_FLY) && !IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL,true) )
+ !HasAuraType(SPELL_AURA_FLY) && !IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL) )
{
//Safe fall, fall height reduction
int32 safe_fall = GetTotalAuraModifier(SPELL_AURA_SAFE_FALL);
@@ -19047,37 +19880,37 @@ void Player::HandleFallUnderMap()
}
}
-void Player::SetViewport(uint64 guid, bool moveable)
+/*void Player::SetViewport(uint64 guid, bool moveable)
{
WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, 8+1);
data.appendPackGUID(guid); // Packed guid of object to set client's view to
data << (moveable ? uint8(0x01) : uint8(0x00)); // 0 - can't move; 1 - can move
m_session->SendPacket(&data);
sLog.outDetail("Viewport for "I64FMT" (%s) changed to "I64FMT, GetGUID(), GetName(), guid);
-}
+}*/
WorldObject* Player::GetFarsightTarget() const
{
// Players can have in farsight field another player's guid, a creature's guid, or a dynamic object's guid
- if (uint64 guid = GetUInt64Value(PLAYER_FARSIGHT))
- return (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT);
+ if(uint64 guid = GetFarSightGUID())
+ return (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_FARSIGHTOBJ);
return NULL;
}
void Player::StopCastingBindSight()
{
- if (WorldObject* fTarget = GetFarsightTarget())
+ if (WorldObject* target = GetFarsightTarget())
{
- if (fTarget->isType(TYPEMASK_PLAYER | TYPEMASK_UNIT))
- ((Unit*)fTarget)->RemoveSpellsCausingAura(SPELL_AURA_BIND_SIGHT);
+ if (target->isType(TYPEMASK_PLAYER | TYPEMASK_UNIT))
+ ((Unit*)target)->RemoveSpellsCausingAura(SPELL_AURA_BIND_SIGHT);
}
}
void Player::ClearFarsight()
{
- if (GetUInt64Value(PLAYER_FARSIGHT))
+ if(GetFarSightGUID())
{
- SetUInt64Value(PLAYER_FARSIGHT, 0);
+ SetFarSightGUID(0);
WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
GetSession()->SendPacket(&data);
}
@@ -19091,7 +19924,7 @@ void Player::SetFarsightTarget(WorldObject* obj)
// Remove the current target if there is one
StopCastingBindSight();
- SetUInt64Value(PLAYER_FARSIGHT, obj->GetGUID());
+ SetFarSightGUID(obj->GetGUID());
}
bool Player::isAllowUseBattleGroundObject()
@@ -19106,6 +19939,159 @@ bool Player::isAllowUseBattleGroundObject()
);
}
+uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair)
+{
+ uint32 level = getLevel();
+
+ if(level > GT_MAX_LEVEL)
+ level = GT_MAX_LEVEL; // max level in this dbc
+
+ uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
+ uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
+ uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
+
+ if((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair))
+ return 0;
+
+ GtBarberShopCostBaseEntry const *bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
+
+ if(!bsc) // shouldn't happen
+ return 0xFFFFFFFF;
+
+ float cost = 0;
+
+ if(hairstyle != newhairstyle)
+ cost += bsc->cost; // full price
+
+ if((haircolor != newhaircolor) && (hairstyle == newhairstyle))
+ cost += bsc->cost * 0.5f; // +1/2 of price
+
+ if(facialhair != newfacialhair)
+ cost += bsc->cost * 0.75f; // +3/4 of price
+
+ return uint32(cost);
+}
+
+void Player::InitGlyphsForLevel()
+{
+ for(uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
+ if(GlyphSlotEntry const * gs = sGlyphSlotStore.LookupEntry(i))
+ if(gs->Order)
+ SetGlyphSlot(gs->Order - 1, gs->Id);
+
+ uint32 level = getLevel();
+ uint32 value = 0;
+
+ // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
+ if(level >= 15)
+ value |= (0x01 | 0x02);
+ if(level >= 30)
+ value |= 0x08;
+ if(level >= 50)
+ value |= 0x04;
+ if(level >= 70)
+ value |= 0x10;
+ if(level >= 80)
+ value |= 0x20;
+
+ SetUInt32Value(PLAYER_GLYPHS_ENABLED, value);
+}
+
+void Player::EnterVehicle(Vehicle *vehicle)
+{
+ VehicleEntry const *ve = sVehicleStore.LookupEntry(vehicle->GetVehicleId());
+ if(!ve)
+ return;
+
+ VehicleSeatEntry const *veSeat = sVehicleSeatStore.LookupEntry(ve->m_seatID[0]);
+ if(!veSeat)
+ return;
+
+ vehicle->SetCharmerGUID(GetGUID());
+ vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
+ vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
+ vehicle->setFaction(getFaction());
+
+ SetCharm(vehicle); // charm
+ SetMover(vehicle);
+ SetFarSightGUID(vehicle->GetGUID()); // set view
+
+ SetClientControl(vehicle, 1); // redirect controls to vehicle
+
+ WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
+ GetSession()->SendPacket(&data);
+
+ data.Initialize(MSG_MOVE_TELEPORT_ACK, 30);
+ data.append(GetPackGUID());
+ data << uint32(0); // counter?
+ data << uint32(MOVEMENTFLAG_ONTRANSPORT); // transport
+ data << uint16(0); // special flags
+ data << uint32(getMSTime()); // time
+ data << vehicle->GetPositionX(); // x
+ data << vehicle->GetPositionY(); // y
+ data << vehicle->GetPositionZ(); // z
+ data << vehicle->GetOrientation(); // o
+ // transport part, TODO: load/calculate seat offsets
+ data << uint64(vehicle->GetGUID()); // transport guid
+ data << float(veSeat->m_attachmentOffsetX); // transport offsetX
+ data << float(veSeat->m_attachmentOffsetY); // transport offsetY
+ data << float(veSeat->m_attachmentOffsetZ); // transport offsetZ
+ data << float(0); // transport orientation
+ data << uint32(getMSTime()); // transport time
+ data << uint8(0); // seat
+ // end of transport part
+ data << uint32(0); // fall time
+ GetSession()->SendPacket(&data);
+
+ data.Initialize(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1);
+ data << uint64(vehicle->GetGUID());
+ data << uint32(0x00000000);
+ data << uint32(0x00000000);
+ data << uint32(0x00000101);
+
+ for(uint32 i = 0; i < 10; ++i)
+ data << uint16(0) << uint8(0) << uint8(i+8);
+
+ data << uint8(0);
+ data << uint8(0);
+ GetSession()->SendPacket(&data);
+}
+
+void Player::ExitVehicle(Vehicle *vehicle)
+{
+ vehicle->SetCharmerGUID(0);
+ vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
+ vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
+ vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H);
+
+ SetCharm(NULL);
+ SetMover(NULL);
+ SetFarSightGUID(0);
+
+ SetClientControl(vehicle, 0);
+
+ WorldPacket data(MSG_MOVE_TELEPORT_ACK, 30);
+ data.append(GetPackGUID());
+ data << uint32(0); // counter?
+ data << uint32(MOVEMENTFLAG_FLY_UNK1); // fly unk
+ data << uint16(0x40); // special flags
+ data << uint32(getMSTime()); // time
+ data << vehicle->GetPositionX(); // x
+ data << vehicle->GetPositionY(); // y
+ data << vehicle->GetPositionZ(); // z
+ data << vehicle->GetOrientation(); // o
+ data << uint32(0); // fall time
+ GetSession()->SendPacket(&data);
+
+ data.Initialize(SMSG_PET_SPELLS, 8+4);
+ data << uint64(0);
+ data << uint32(0);
+ GetSession()->SendPacket(&data);
+
+ // only for flyable vehicles?
+ CastSpell(this, 45472, true); // Parachute
+}
+
bool Player::HasTitle(uint32 bitIndex)
{
if (bitIndex > 128)
@@ -19123,7 +20109,6 @@ void Player::SetTitle(CharTitlesEntry const* title)
SetFlag(PLAYER__FIELD_KNOWN_TITLES+fieldIndexOffset, flag);
}
-
/*-----------------------TRINITY--------------------------*/
bool Player::isTotalImmunity()
{
@@ -19181,3 +20166,248 @@ void Player::UpdateCharmedAI()
}
}
+void Player::ConvertRune(uint8 index, uint8 newType)
+{
+ SetCurrentRune(index, newType);
+
+ WorldPacket data(SMSG_CONVERT_RUNE, 2);
+ data << uint8(index);
+ data << uint8(newType);
+ GetSession()->SendPacket(&data);
+}
+
+void Player::ResyncRunes(uint8 count)
+{
+ WorldPacket data(SMSG_RESYNC_RUNES, count * 2);
+ for(uint32 i = 0; i < count; ++i)
+ {
+ data << uint8(GetCurrentRune(i)); // rune type
+ data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
+ }
+ GetSession()->SendPacket(&data);
+}
+
+void Player::AddRunePower(uint8 index)
+{
+ WorldPacket data(SMSG_ADD_RUNE_POWER, 4);
+ data << uint32(1 << index); // mask (0x00-0x3F probably)
+ GetSession()->SendPacket(&data);
+}
+
+void Player::InitRunes()
+{
+ if(getClass() != CLASS_DEATH_KNIGHT)
+ return;
+
+ m_runes = new Runes;
+
+ m_runes->runeState = 0;
+
+ for(uint32 i = 0; i < MAX_RUNES; ++i)
+ {
+ SetBaseRune(i, i / 2); // init base types
+ SetCurrentRune(i, i / 2); // init current types
+ SetRuneCooldown(i, 0); // reset cooldowns
+ m_runes->SetRuneState(i);
+ }
+
+ for(uint32 i = 0; i < NUM_RUNE_TYPES; ++i)
+ SetFloatValue(PLAYER_RUNE_REGEN_1 + i, 0.1f);
+}
+
+void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast)
+{
+ Loot loot;
+ loot.FillLoot (loot_id,store,this,true);
+
+ uint32 max_slot = loot.GetMaxSlotInLootFor(this);
+ for(uint32 i = 0; i < max_slot; ++i)
+ {
+ LootItem* lootItem = loot.LootItemInSlot(i,this);
+
+ ItemPosCountVec dest;
+ uint8 msg = CanStoreNewItem (bag,slot,dest,lootItem->itemid,lootItem->count);
+ if(msg != EQUIP_ERR_OK && slot != NULL_SLOT)
+ msg = CanStoreNewItem( bag, NULL_SLOT,dest,lootItem->itemid,lootItem->count);
+ if( msg != EQUIP_ERR_OK && bag != NULL_BAG)
+ msg = CanStoreNewItem( NULL_BAG, NULL_SLOT,dest,lootItem->itemid,lootItem->count);
+ if(msg != EQUIP_ERR_OK)
+ {
+ SendEquipError( msg, NULL, NULL );
+ continue;
+ }
+
+ Item* pItem = StoreNewItem (dest,lootItem->itemid,true,lootItem->randomPropertyId);
+ SendNewItem(pItem, lootItem->count, false, false, broadcast);
+ }
+}
+
+uint32 Player::CalculateTalentsPoints() const
+{
+ uint32 base_talent = getLevel() < 10 ? 0 : uint32((getLevel()-9)*sWorld.getRate(RATE_TALENT));
+
+ if(getClass() != CLASS_DEATH_KNIGHT)
+ return base_talent;
+
+ uint32 talentPointsForLevel =
+ (getLevel() < 56 ? 0 : uint32((getLevel()-55)*sWorld.getRate(RATE_TALENT)))
+ + m_questRewardTalentCount;
+
+ if(talentPointsForLevel > base_talent)
+ talentPointsForLevel = base_talent;
+
+ return talentPointsForLevel;
+}
+
+bool Player::IsAllowUseFlyMountsHere() const
+{
+ if (isGameMaster())
+ return true;
+
+ uint32 v_map = GetVirtualMapForMapAndZone(GetMapId(), GetZoneId());
+ return v_map == 530 || v_map == 571 && HasSpell(54197);
+}
+
+void Player::learnSpellHighRank(uint32 spellid)
+{
+ learnSpell(spellid,false);
+
+ if(uint32 next = spellmgr.GetNextSpellInChain(spellid))
+ learnSpellHighRank(next);
+}
+
+void Player::_LoadSkills()
+{
+ // Note: skill data itself loaded from `data` field. This is only cleanup part of load
+
+ // reset skill modifiers and set correct unlearn flags
+ for (uint32 i = 0; i < PLAYER_MAX_SKILLS; i++)
+ {
+ SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
+
+ // set correct unlearn bit
+ uint32 id = GetUInt32Value(PLAYER_SKILL_INDEX(i)) & 0x0000FFFF;
+ if(!id) continue;
+
+ SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(id);
+ if(!pSkill) continue;
+
+ // enable unlearn button for primary professions only
+ if (pSkill->categoryId == SKILL_CATEGORY_PROFESSION)
+ SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,1));
+ else
+ SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
+
+ uint32 vskill = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i)));
+
+ learnSkillRewardedSpells(id, vskill);
+ }
+
+ // special settings
+ if(getClass()==CLASS_DEATH_KNIGHT)
+ {
+ uint32 base_level = std::min(getLevel(),sWorld.getConfig (CONFIG_START_HEROIC_PLAYER_LEVEL));
+ if(base_level < 1)
+ base_level = 1;
+ uint32 base_skill = (base_level-1)*5; // 270 at starting level 55
+ if(base_skill < 1)
+ base_skill = 1; // skill mast be known and then > 0 in any case
+
+ if(GetPureSkillValue (SKILL_FIRST_AID) < base_skill)
+ SetSkill(SKILL_FIRST_AID,base_skill, base_skill);
+ if(GetPureSkillValue (SKILL_AXES) < base_skill)
+ SetSkill(SKILL_AXES, base_skill,base_skill);
+ if(GetPureSkillValue (SKILL_DEFENSE) < base_skill)
+ SetSkill(SKILL_DEFENSE, base_skill,base_skill);
+ if(GetPureSkillValue (SKILL_POLEARMS) < base_skill)
+ SetSkill(SKILL_POLEARMS, base_skill,base_skill);
+ if(GetPureSkillValue (SKILL_SWORDS) < base_skill)
+ SetSkill(SKILL_SWORDS, base_skill,base_skill);
+ if(GetPureSkillValue (SKILL_2H_AXES) < base_skill)
+ SetSkill(SKILL_2H_AXES, base_skill,base_skill);
+ if(GetPureSkillValue (SKILL_2H_SWORDS) < base_skill)
+ SetSkill(SKILL_2H_SWORDS, base_skill,base_skill);
+ if(GetPureSkillValue (SKILL_UNARMED) < base_skill)
+ SetSkill(SKILL_UNARMED, base_skill,base_skill);
+ }
+}
+
+uint32 Player::GetPhaseMaskForSpawn() const
+{
+ uint32 phase = PHASEMASK_NORMAL;
+ if(!isGameMaster())
+ phase = GetPhaseMask();
+ else
+ {
+ AuraList const& phases = GetAurasByType(SPELL_AURA_PHASE);
+ if(!phases.empty())
+ phase = phases.front()->GetMiscValue();
+ }
+
+ // some aura phases include 1 normal map in addition to phase itself
+ if(uint32 n_phase = phase & ~PHASEMASK_NORMAL)
+ return n_phase;
+
+ return PHASEMASK_NORMAL;
+}
+
+uint8 Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limit_count) const
+{
+ ItemPrototype const* pProto = pItem->GetProto();
+
+ // proto based limitations
+ if(uint8 res = CanEquipUniqueItem(pProto,eslot,limit_count))
+ return res;
+
+ // check unique-equipped on gems
+ for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
+ {
+ uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
+ if(!enchant_id)
+ continue;
+ SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
+ if(!enchantEntry)
+ continue;
+
+ ItemPrototype const* pGem = objmgr.GetItemPrototype(enchantEntry->GemID);
+ if(!pGem)
+ continue;
+
+ // include for check equip another gems with same limit category for not equipped item (and then not counted)
+ uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
+ ? pItem->GetGemCountWithLimitCategory(pGem->ItemLimitCategory) : 1;
+
+ if(uint8 res = CanEquipUniqueItem(pGem, eslot,gem_limit_count))
+ return res;
+ }
+
+ return EQUIP_ERR_OK;
+}
+
+uint8 Player::CanEquipUniqueItem( ItemPrototype const* itemProto, uint8 except_slot, uint32 limit_count) const
+{
+ // check unique-equipped on item
+ if (itemProto->Flags & ITEM_FLAGS_UNIQUE_EQUIPPED)
+ {
+ // there is an equip limit on this item
+ if(HasItemOrGemWithIdEquipped(itemProto->ItemId,1,except_slot))
+ return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE;
+ }
+
+ // check unique-equipped limit
+ if (itemProto->ItemLimitCategory)
+ {
+ ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
+ if(!limitEntry)
+ return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE;
+
+ if(limit_count > limitEntry->maxCount)
+ return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE; // attempt add too many limit category items (gems)
+
+ // there is an equip limit on this item
+ if(HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory,limitEntry->maxCount-limit_count+1,except_slot))
+ return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE;
+ }
+
+ return EQUIP_ERR_OK;
+}
diff --git a/src/game/Player.h b/src/game/Player.h
index 79380fbbb2c..5904f8e948e 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -35,6 +35,8 @@
#include "Pet.h"
#include "MapReference.h"
#include "Util.h" // for Tokens typedef
+#include "AchievementMgr.h"
+#include "BattleGround.h"
#include<string>
#include<vector>
@@ -47,8 +49,11 @@ class Pet;
class PlayerMenu;
class Transport;
class UpdateMask;
+class SpellCastTargets;
class PlayerSocial;
class OutdoorPvP;
+class AchievementMgr;
+class Vehicle;
typedef std::deque<Mail*> PlayerMails;
@@ -62,6 +67,17 @@ enum SpellModType
SPELLMOD_PCT = 108 // SPELL_AURA_ADD_PCT_MODIFIER
};
+// 2^n values, Player::m_isunderwater is a bitmask. These are mangos internal values, they are never send to any client
+enum PlayerUnderwaterState
+{
+ UNDERWATER_NONE = 0x00,
+ UNDERWATER_INWATER = 0x01, // terrain type is water and player is afflicted by it
+ UNDERWATER_WATER_TRIGGER = 0x02, // m_breathTimer has been initialized
+ UNDERWATER_WATER_BREATHB = 0x04, // breathbar has been send to client
+ UNDERWATER_WATER_BREATHB_RETRACTING = 0x10, // breathbar is currently refilling - the player is above water level
+ UNDERWATER_INLAVA = 0x80 // terrain type is lava and player is afflicted by it
+};
+
enum PlayerSpellState
{
PLAYERSPELL_UNCHANGED = 0,
@@ -72,27 +88,26 @@ enum PlayerSpellState
struct PlayerSpell
{
- uint16 slotId : 16;
PlayerSpellState state : 8;
- bool active : 1;
- bool disabled : 1;
+ bool active : 1; // show in spellbook
+ bool dependent : 1; // learned as result another spell learn, skill grow, quest reward, etc
+ bool disabled : 1; // first rank has been learned in result talent learn but currently talent unlearned, save max learned ranks
};
-#define SPELL_WITHOUT_SLOT_ID uint16(-1)
-
+// Spell modifier (used for modify other spells)
struct SpellModifier
{
+ SpellModifier() : charges(0), lastAffected(NULL) {}
SpellModOp op : 8;
SpellModType type : 8;
int16 charges : 16;
int32 value;
- uint64 mask;
+ flag96 mask;
uint32 spellId;
- uint32 effectId;
Spell const* lastAffected;
};
-typedef UNORDERED_MAP<uint16, PlayerSpell*> PlayerSpellMap;
+typedef UNORDERED_MAP<uint32, PlayerSpell*> PlayerSpellMap;
typedef std::list<SpellModifier*> SpellModList;
struct SpellCooldown
@@ -141,8 +156,6 @@ enum ActionButtonType
typedef std::map<uint8,ActionButton> ActionButtonList;
-typedef std::pair<uint16, uint8> CreateSpellPair;
-
struct PlayerCreateInfoItem
{
PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) {}
@@ -174,6 +187,8 @@ struct PlayerLevelInfo
uint8 stats[MAX_STATS];
};
+typedef std::list<uint32> PlayerCreateInfoSpells;
+
struct PlayerInfo
{
// existence checked by displayId != 0 // existence checked by displayId != 0
@@ -189,7 +204,7 @@ struct PlayerInfo
uint16 displayId_m;
uint16 displayId_f;
PlayerCreateInfoItems item;
- std::list<CreateSpellPair> spell;
+ PlayerCreateInfoSpells spell;
std::list<uint16> action[4];
PlayerLevelInfo* levelInfo; //[level-1] 0..MaxPlayerLevel-1
@@ -224,6 +239,39 @@ struct Areas
float y2;
};
+#define MAX_RUNES 6
+#define RUNE_COOLDOWN 5 // 5*2=10 sec
+
+enum RuneType
+{
+ RUNE_BLOOD = 0,
+ RUNE_UNHOLY = 1,
+ RUNE_FROST = 2,
+ RUNE_DEATH = 3,
+ NUM_RUNE_TYPES = 4
+};
+
+struct RuneInfo
+{
+ uint8 BaseRune;
+ uint8 CurrentRune;
+ uint8 Cooldown;
+};
+
+struct Runes
+{
+ RuneInfo runes[MAX_RUNES];
+ uint8 runeState; // mask of available runes
+
+ void SetRuneState(uint8 index, bool set = true)
+ {
+ if(set)
+ runeState |= (1 << index); // usable
+ else
+ runeState &= ~(1 << index); // on cooldown
+ }
+};
+
enum FactionFlags
{
FACTION_FLAG_VISIBLE = 0x01, // makes visible in client (set or can be set at interaction with target of this faction)
@@ -328,52 +376,6 @@ enum DrunkenState
DRUNKEN_SMASHED = 3
};
-enum PlayerStateType
-{
- /*
- PLAYER_STATE_DANCE
- PLAYER_STATE_SLEEP
- PLAYER_STATE_SIT
- PLAYER_STATE_STAND
- PLAYER_STATE_READYUNARMED
- PLAYER_STATE_WORK
- PLAYER_STATE_POINT(DNR)
- PLAYER_STATE_NONE // not used or just no state, just standing there?
- PLAYER_STATE_STUN
- PLAYER_STATE_DEAD
- PLAYER_STATE_KNEEL
- PLAYER_STATE_USESTANDING
- PLAYER_STATE_STUN_NOSHEATHE
- PLAYER_STATE_USESTANDING_NOSHEATHE
- PLAYER_STATE_WORK_NOSHEATHE
- PLAYER_STATE_SPELLPRECAST
- PLAYER_STATE_READYRIFLE
- PLAYER_STATE_WORK_NOSHEATHE_MINING
- PLAYER_STATE_WORK_NOSHEATHE_CHOPWOOD
- PLAYER_STATE_AT_EASE
- PLAYER_STATE_READY1H
- PLAYER_STATE_SPELLKNEELSTART
- PLAYER_STATE_SUBMERGED
- */
-
- PLAYER_STATE_NONE = 0,
- PLAYER_STATE_SIT = 1,
- PLAYER_STATE_SIT_CHAIR = 2,
- PLAYER_STATE_SLEEP = 3,
- PLAYER_STATE_SIT_LOW_CHAIR = 4,
- PLAYER_STATE_SIT_MEDIUM_CHAIR = 5,
- PLAYER_STATE_SIT_HIGH_CHAIR = 6,
- PLAYER_STATE_DEAD = 7,
- PLAYER_STATE_KNEEL = 8,
-
- PLAYER_STATE_FORM_ALL = 0x00FF0000,
-
- PLAYER_STATE_FLAG_ALWAYS_STAND = 0x01, // byte 4
- PLAYER_STATE_FLAG_CREEP = 0x02000000,
- PLAYER_STATE_FLAG_UNTRACKABLE = 0x04000000,
- PLAYER_STATE_FLAG_ALL = 0xFF000000,
-};
-
enum PlayerFlags
{
PLAYER_FLAGS_GROUP_LEADER = 0x00000001,
@@ -382,17 +384,25 @@ enum PlayerFlags
PLAYER_FLAGS_GM = 0x00000008,
PLAYER_FLAGS_GHOST = 0x00000010,
PLAYER_FLAGS_RESTING = 0x00000020,
- PLAYER_FLAGS_FFA_PVP = 0x00000080,
+ PLAYER_FLAGS_UNK7 = 0x00000040,
+ PLAYER_FLAGS_UNK8 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
PLAYER_FLAGS_IN_PVP = 0x00000200,
PLAYER_FLAGS_HIDE_HELM = 0x00000400,
PLAYER_FLAGS_HIDE_CLOAK = 0x00000800,
- PLAYER_FLAGS_UNK1 = 0x00001000, // played long time
- PLAYER_FLAGS_UNK2 = 0x00002000, // played too long time
- PLAYER_FLAGS_UNK3 = 0x00008000, // strange visual effect (2.0.1), looks like PLAYER_FLAGS_GHOST flag
- PLAYER_FLAGS_SANCTUARY = 0x00010000, // player entered sanctuary
- PLAYER_FLAGS_UNK4 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
- PLAYER_UNK = 0x00040000, // 2.0.8...
+ PLAYER_FLAGS_UNK13 = 0x00001000, // played long time
+ PLAYER_FLAGS_UNK14 = 0x00002000, // played too long time
+ PLAYER_FLAGS_UNK15 = 0x00004000,
+ PLAYER_FLAGS_UNK16 = 0x00008000, // strange visual effect (2.0.1), looks like PLAYER_FLAGS_GHOST flag
+ PLAYER_FLAGS_UNK17 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
+ PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
+ PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
+ PLAYER_FLAGS_UNK20 = 0x00080000,
+ PLAYER_FLAGS_UNK21 = 0x00100000,
+ PLAYER_FLAGS_UNK22 = 0x00200000,
+ PLAYER_FLAGS_UNK23 = 0x00400000,
+ PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree
+ PLAYER_FLAGS_UNK25 = 0x01000000 // disabled all melee ability on tab include autoattack
};
// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
@@ -481,7 +491,8 @@ enum LootType
LOOT_DISENCHANTING = 5, // unsupported by client, sending LOOT_SKINNING instead
LOOT_PROSPECTING = 6, // unsupported by client, sending LOOT_SKINNING instead
LOOT_INSIGNIA = 7, // unsupported by client, sending LOOT_SKINNING instead
- LOOT_FISHINGHOLE = 8 // unsupported by client, sending LOOT_FISHING instead
+ LOOT_FISHINGHOLE = 8, // unsupported by client, sending LOOT_FISHING instead
+ LOOT_MILLING = 9 // unsupported by client, sending LOOT_SKINNING instead
};
enum MirrorTimerType
@@ -511,7 +522,8 @@ enum AtLoginFlags
AT_LOGIN_NONE = 0,
AT_LOGIN_RENAME = 1,
AT_LOGIN_RESET_SPELLS = 2,
- AT_LOGIN_RESET_TALENTS = 4
+ AT_LOGIN_RESET_TALENTS = 4,
+ AT_LOGIN_CUSTOMIZE = 8
};
typedef std::map<uint32, QuestStatusData> QuestStatusMap;
@@ -543,7 +555,7 @@ enum PlayerSlots
// first slot for item stored (in any way in player m_items data)
PLAYER_SLOT_START = 0,
// last+1 slot for item stored (in any way in player m_items data)
- PLAYER_SLOT_END = 118,
+ PLAYER_SLOT_END = 200,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
};
@@ -671,12 +683,30 @@ enum KeyRingSlots
KEYRING_SLOT_END = 118
};
+enum VanityPetSlots
+{
+ VANITYPET_SLOT_START = 118, // not use, vanity pets stored as spells
+ VANITYPET_SLOT_END = 136 // not alloed any content in.
+};
+
+enum CurrencyTokenSlots
+{
+ CURRENCYTOKEN_SLOT_START = 136,
+ CURRENCYTOKEN_SLOT_END = 168
+};
+
+enum QuestBagSlots
+{
+ QUESTBAG_SLOT_START = 168,
+ QUESTBAG_SLOT_END = 200
+};
+
struct ItemPosCount
{
- ItemPosCount(uint16 _pos, uint8 _count) : pos(_pos), count(_count) {}
+ ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {}
bool isContainedIn(std::vector<ItemPosCount> const& vec) const;
uint16 pos;
- uint8 count;
+ uint32 count;
};
typedef std::vector<ItemPosCount> ItemPosCountVec;
@@ -689,14 +719,15 @@ enum TradeSlots
enum TransferAbortReason
{
- TRANSFER_ABORT_MAX_PLAYERS = 0x0001, // Transfer Aborted: instance is full
- TRANSFER_ABORT_NOT_FOUND = 0x0002, // Transfer Aborted: instance not found
- TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x0003, // You have entered too many instances recently.
- TRANSFER_ABORT_ZONE_IN_COMBAT = 0x0005, // Unable to zone in while an encounter is in progress.
- TRANSFER_ABORT_INSUF_EXPAN_LVL1 = 0x0106, // You must have TBC expansion installed to access this area.
- TRANSFER_ABORT_DIFFICULTY1 = 0x0007, // Normal difficulty mode is not available for %s.
- TRANSFER_ABORT_DIFFICULTY2 = 0x0107, // Heroic difficulty mode is not available for %s.
- TRANSFER_ABORT_DIFFICULTY3 = 0x0207 // Epic difficulty mode is not available for %s.
+ TRANSFER_ABORT_ERROR = 0x00,
+ TRANSFER_ABORT_MAX_PLAYERS = 0x01, // Transfer Aborted: instance is full
+ TRANSFER_ABORT_NOT_FOUND = 0x02, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x03, // You have entered too many instances recently.
+ TRANSFER_ABORT_ZONE_IN_COMBAT = 0x05, // Unable to zone in while an encounter is in progress.
+ TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x06, // You must have <TBC,WotLK> expansion installed to access this area.
+ TRANSFER_ABORT_DIFFICULTY = 0x07, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
+ TRANSFER_ABORT_UNIQUE_MESSAGE = 0x08, // Until you've escaped TLK's grasp, you cannot leave this place!
+ TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x09 // Additional instances cannot be launched, please try again later.
};
enum InstanceResetWarningType
@@ -710,15 +741,16 @@ enum InstanceResetWarningType
struct MovementInfo
{
// common
- //uint32 flags;
- uint8 unk1;
+ uint32 flags;
+ uint16 unk1;
uint32 time;
float x, y, z, o;
// transport
uint64 t_guid;
float t_x, t_y, t_z, t_o;
uint32 t_time;
- // swimming and unk
+ int8 t_seat;
+ // swimming and unknown
float s_pitch;
// last fall time
uint32 fallTime;
@@ -729,17 +761,17 @@ struct MovementInfo
MovementInfo()
{
- //flags =
+ flags = 0;
time = t_time = fallTime = 0;
unk1 = 0;
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0;
}
- /*void SetMovementFlags(uint32 _flags)
+ void SetMovementFlags(uint32 _flags)
{
flags = _flags;
- }*/
+ }
};
// flags that use in movement check for example at spell casting
@@ -812,10 +844,12 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 16,
PLAYER_LOGIN_QUERY_LOADGUILD = 17,
PLAYER_LOGIN_QUERY_LOADARENAINFO = 18,
-
- MAX_PLAYER_LOGIN_QUERY
+ PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 19,
+ PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 20,
+ MAX_PLAYER_LOGIN_QUERY = 21
};
+
// Player summoning auto-decline time (in secs)
#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
@@ -836,11 +870,9 @@ class TRINITY_DLL_SPEC PlayerTaxi
PlayerTaxi();
~PlayerTaxi() {}
// Nodes
- void InitTaxiNodesForLevel(uint32 race, uint32 level);
+ void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level);
void LoadTaxiMask(const char* data);
- void SaveTaxiMask(const char* data);
- uint32 GetTaximask( uint8 index ) const { return m_taximask[index]; }
bool IsTaximaskNodeKnown(uint32 nodeidx) const
{
uint8 field = uint8((nodeidx - 1) / 32);
@@ -862,7 +894,7 @@ class TRINITY_DLL_SPEC PlayerTaxi
void AppendTaximaskTo(ByteBuffer& data,bool all);
// Destinations
- bool LoadTaxiDestinationsFromString(const std::string& values);
+ bool LoadTaxiDestinationsFromString(const std::string& values, uint32 team);
std::string SaveTaxiDestinationsToString();
void ClearTaxiDestinations() { m_TaxiDestinations.clear(); }
@@ -876,11 +908,15 @@ class TRINITY_DLL_SPEC PlayerTaxi
return GetTaxiDestination();
}
bool empty() const { return m_TaxiDestinations.empty(); }
+
+ friend std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi);
private:
TaxiMask m_taximask;
std::deque<uint32> m_TaxiDestinations;
};
+std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi);
+
class TRINITY_DLL_SPEC Player : public Unit
{
friend class WorldSession;
@@ -898,17 +934,6 @@ class TRINITY_DLL_SPEC Player : public Unit
void AddToWorld();
void RemoveFromWorld();
- void SetViewport(uint64 guid, bool movable);
- void StopCastingCharm() { Uncharm(); }
- void StopBindSight();
- WorldObject* GetFarsightTarget() const;
- void ClearFarsight();
- void StopCastingBindSight();
- void SetFarsightTarget(WorldObject* target);
- // Controls if vision is currently on farsight object, updated in FAR_SIGHT opcode
- void SetFarsightVision(bool apply) { m_farsightVision = apply; }
- bool HasFarsightVision() const { return m_farsightVision; }
-
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0);
bool TeleportTo(WorldLocation const &loc, uint32 options = 0)
@@ -939,7 +964,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void SendInitialPacketsBeforeAddToMap();
void SendInitialPacketsAfterAddToMap();
- void SendTransferAborted(uint32 mapid, uint16 reason);
+ void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0);
void SendInstanceResetWarning(uint32 mapid, uint32 time);
bool CanInteractWithNPCs(bool alive = true) const;
@@ -952,10 +977,12 @@ class TRINITY_DLL_SPEC Player : public Unit
std::string afkMsg;
std::string dndMsg;
+ uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair);
+
PlayerSocial *GetSocial() { return m_social; }
PlayerTaxi m_taxi;
- void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(),getLevel()); }
+ void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_id = 0 , Creature* npc = NULL);
// mount_id can be used in scripting calls
bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; }
@@ -1016,6 +1043,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void AddGuardian(Pet* pet) { m_guardianPets.insert(pet->GetGUID()); }
GuardianPetList const& GetGuardians() const { return m_guardianPets; }
void Uncharm();
+ uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
void Say(const std::string& text, const uint32 language);
void Yell(const std::string& text, const uint32 language);
@@ -1034,9 +1062,15 @@ class TRINITY_DLL_SPEC Player : public Unit
Item* GetItemByGuid( uint64 guid ) const;
Item* GetItemByPos( uint16 pos ) const;
Item* GetItemByPos( uint8 bag, uint8 slot ) const;
+ inline Item* GetUseableItemByPos( uint8 bag, uint8 slot ) const //Does additional check for disarmed weapons
+ {
+ if (!CanUseAttackType(GetAttackBySlot(slot)))
+ return NULL;
+ return GetItemByPos(bag, slot);
+ }
Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const;
Item* GetShield(bool useable = false) const;
- static uint32 GetAttackBySlot( uint8 slot ); // MAX_ATTACK if not weapon slot
+ static uint8 GetAttackBySlot( uint8 slot ); // MAX_ATTACK if not weapon slot
std::vector<Item *> &GetItemUpdateQueue() { return m_itemUpdateQueue; }
static bool IsInventoryPos( uint16 pos ) { return IsInventoryPos(pos >> 8,pos & 255); }
static bool IsInventoryPos( uint8 bag, uint8 slot );
@@ -1050,7 +1084,9 @@ class TRINITY_DLL_SPEC Player : public Unit
bool HasBankBagSlot( uint8 slot ) const;
bool HasItemCount( uint32 item, uint32 count, bool inBankAlso = false ) const;
bool HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item const* ignoreItem = NULL);
- Item* GetItemOrItemWithGemEquipped( uint32 item ) const;
+ bool CanNoReagentCast(SpellEntry const* spellInfo) const;
+ bool HasItemOrGemWithIdEquipped( uint32 item, uint32 count, uint8 except_slot = NULL_SLOT) const;
+ bool HasItemOrGemWithLimitCategoryEquipped( uint32 limitCategory, uint32 count, uint8 except_slot = NULL_SLOT) const;
uint8 CanTakeMoreSimilarItems(Item* pItem) const { return _CanTakeMoreSimilarItems(pItem->GetEntry(),pItem->GetCount(),pItem); }
uint8 CanTakeMoreSimilarItems(uint32 entry, uint32 count) const { return _CanTakeMoreSimilarItems(entry,count,NULL); }
uint8 CanStoreNewItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = NULL ) const
@@ -1068,6 +1104,9 @@ class TRINITY_DLL_SPEC Player : public Unit
uint8 CanStoreItems( Item **pItem,int count) const;
uint8 CanEquipNewItem( uint8 slot, uint16 &dest, uint32 item, bool swap ) const;
uint8 CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading = true ) const;
+
+ uint8 CanEquipUniqueItem( Item * pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1 ) const;
+ uint8 CanEquipUniqueItem( ItemPrototype const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1 ) const;
uint8 CanUnequipItems( uint32 item, uint32 count ) const;
uint8 CanUnequipItem( uint16 src, bool swap ) const;
uint8 CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, Item *pItem, bool swap, bool not_loading = true ) const;
@@ -1081,6 +1120,8 @@ class TRINITY_DLL_SPEC Player : public Unit
Item* EquipItem( uint16 pos, Item *pItem, bool update );
void AutoUnequipOffhandIfNeed();
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count);
+ void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast = false);
+ void AutoStoreLoot(uint32 loot_id, LootStore const& store, bool broadcast = false) { AutoStoreLoot(NULL_BAG,NULL_SLOT,loot_id,store,broadcast); }
uint8 _CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = NULL) const;
uint8 _CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item *pItem = NULL, bool swap = false, uint32* no_space_count = NULL ) const;
@@ -1123,10 +1164,10 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 GetWeaponProficiency() const { return m_WeaponProficiency; }
uint32 GetArmorProficiency() const { return m_ArmorProficiency; }
bool IsInFeralForm() const { return m_form == FORM_CAT || m_form == FORM_BEAR || m_form == FORM_DIREBEAR; }
- bool IsUseEquipedWeapon( bool mainhand ) const
+ bool IsTwoHandUsed() const
{
- // disarm applied only to mainhand weapon
- return !IsInFeralForm() && (!mainhand || !HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) );
+ Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
+ return mainItem && mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip();
}
void SendNewItem( Item *item, uint32 count, bool received, bool created, bool broadcast = false );
bool BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint64 bagguid, uint8 slot);
@@ -1225,7 +1266,6 @@ class TRINITY_DLL_SPEC Player : public Unit
}
}
uint32 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry);
- void AdjustQuestReqItemCount( Quest const* pQuest );
void AreaExploredOrEventHappens( uint32 questId );
void GroupEventHappens( uint32 questId, WorldObject const* pEventObject );
void ItemAddedQuestCheck( uint32 entry, uint32 count );
@@ -1235,7 +1275,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void TalkedToCreature( uint32 entry, uint64 guid );
void MoneyChanged( uint32 value );
bool HasQuestForItem( uint32 itemid ) const;
- bool HasQuestForGO(int32 GOId);
+ bool HasQuestForGO(int32 GOId) const;
void UpdateForQuestsGO();
bool CanShareQuest(uint32 quest_id) const;
@@ -1262,6 +1302,7 @@ class TRINITY_DLL_SPEC Player : public Unit
/*********************************************************/
bool LoadFromDB(uint32 guid, SqlQueryHolder *holder);
+
bool MinimalLoadFromDB(QueryResult *result, uint32 guid);
static bool LoadValuesArrayFromDB(Tokens& data,uint64 guid);
static uint32 GetUInt32ValueFromArray(Tokens const& data, uint16 index);
@@ -1283,6 +1324,7 @@ class TRINITY_DLL_SPEC Player : public Unit
static void SetFloatValueInArray(Tokens& data,uint16 index, float value);
static void SetUInt32ValueInDB(uint16 index, uint32 value, uint64 guid);
static void SetFloatValueInDB(uint16 index, float value, uint64 guid);
+ static void Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair);
static void SavePositionInDB(uint32 mapid, float x,float y,float z,float o,uint32 zone,uint64 guid);
bool m_mailsLoaded;
@@ -1339,7 +1381,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void SetSelection(const uint64 &guid) { m_curSelection = guid; SetUInt64Value(UNIT_FIELD_TARGET, guid); }
uint8 GetComboPoints() { return m_comboPoints; }
- uint64 GetComboTarget() { return m_comboTarget; }
+ const uint64& GetComboTarget() const { return m_comboTarget; }
void AddComboPoints(Unit* target, int8 count);
void ClearComboPoints();
@@ -1375,10 +1417,7 @@ class TRINITY_DLL_SPEC Player : public Unit
Item* GetMItem(uint32 id)
{
ItemMap::const_iterator itr = mMitems.find(id);
- if (itr != mMitems.end())
- return itr->second;
-
- return NULL;
+ return itr != mMitems.end() ? itr->second : NULL;
}
void AddMItem(Item* it)
@@ -1390,30 +1429,28 @@ class TRINITY_DLL_SPEC Player : public Unit
bool RemoveMItem(uint32 id)
{
- ItemMap::iterator i = mMitems.find(id);
- if (i == mMitems.end())
- return false;
-
- mMitems.erase(i);
- return true;
+ return mMitems.erase(id) ? true : false;
}
void PetSpellInitialize();
void CharmSpellInitialize();
void PossessSpellInitialize();
bool HasSpell(uint32 spell) const;
+ bool HasActiveSpell(uint32 spell) const; // show in spellbook
TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const;
bool IsSpellFitByClassAndRace( uint32 spell_id ) const;
+ bool IsNeedCastPassiveSpellAtLearn(SpellEntry const* spellInfo) const;
void SendProficiency(uint8 pr1, uint32 pr2);
void SendInitialSpells();
- bool addSpell(uint32 spell_id, bool active, bool learning = true, bool loading = false, uint16 slot_id=SPELL_WITHOUT_SLOT_ID, bool disabled = false);
- void learnSpell(uint32 spell_id);
- void removeSpell(uint32 spell_id, bool disabled = false);
+ bool addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled);
+ void learnSpell(uint32 spell_id, bool dependent);
+ void removeSpell(uint32 spell_id, bool disabled = false, bool update_action_bar_for_low_rank = false);
void resetSpells();
- void learnDefaultSpells(bool loading = false);
+ void learnDefaultSpells();
void learnQuestRewardedSpells();
void learnQuestRewardedSpells(Quest const* quest);
+ void learnSpellHighRank(uint32 spellid);
uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); }
void SetFreeTalentPoints(uint32 points) { SetUInt32Value(PLAYER_CHARACTER_POINTS1,points); }
@@ -1421,6 +1458,14 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 resetTalentsCost() const;
void InitTalentForLevel();
+ uint32 CalculateTalentsPoints() const;
+
+ void InitGlyphsForLevel();
+ void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
+ uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
+ void SetGlyph(uint8 slot, uint32 glyph) { SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph); }
+ uint32 GetGlyph(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot); }
+
uint32 GetFreePrimaryProffesionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS2); }
void SetFreePrimaryProffesions(uint16 profs) { SetUInt32Value(PLAYER_CHARACTER_POINTS2,profs); }
void InitPrimaryProffesions();
@@ -1429,8 +1474,6 @@ class TRINITY_DLL_SPEC Player : public Unit
PlayerSpellMap & GetSpellMap() { return m_spells; }
void AddSpellMod(SpellModifier* mod, bool apply);
- int32 GetTotalFlatMods(uint32 spellId, SpellModOp op);
- int32 GetTotalPctMods(uint32 spellId, SpellModOp op);
bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell const* spell = NULL);
template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell = NULL);
void RemoveSpellMods(Spell const* spell);
@@ -1535,6 +1578,7 @@ class TRINITY_DLL_SPEC Player : public Unit
static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot);
void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; }
+ static void LeaveAllArenaTeams(uint64 guid);
void SetDifficulty(uint32 dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; }
uint8 GetDifficulty() { return m_dungeonDifficulty; }
@@ -1560,9 +1604,12 @@ class TRINITY_DLL_SPEC Player : public Unit
void UpdateArmor();
void UpdateMaxHealth();
void UpdateMaxPower(Powers power);
+ void ApplyFeralAPBonus(int32 amount, bool apply);
void UpdateAttackPowerAndDamage(bool ranged = false);
void UpdateShieldBlockValue();
void UpdateDamagePhysical(WeaponAttackType attType);
+ void ApplySpellDamageBonus(int32 amount, bool apply);
+ void ApplySpellHealingBonus(int32 amount, bool apply);
void UpdateSpellDamageAndHealingBonus();
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float& min_damage, float& max_damage);
@@ -1580,6 +1627,8 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 GetRangedCritDamageReduction(uint32 damage) const;
uint32 GetSpellCritDamageReduction(uint32 damage) const;
uint32 GetDotDamageReduction(uint32 damage) const;
+ uint32 GetBaseSpellDamageBonus() { return m_baseSpellDamage;}
+ uint32 GetBaseSpellHealingBonus() { return m_baseSpellHealing;}
float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const;
void UpdateBlockPercentage();
@@ -1587,9 +1636,14 @@ class TRINITY_DLL_SPEC Player : public Unit
void UpdateAllCritPercentages();
void UpdateParryPercentage();
void UpdateDodgePercentage();
+ void UpdateMeleeHitChances();
+ void UpdateRangedHitChances();
+ void UpdateSpellHitChances();
+
void UpdateAllSpellCritChances();
void UpdateSpellCritChance(uint32 school);
void UpdateExpertise(WeaponAttackType attType);
+ void ApplyManaRegenBonus(int32 amount, bool apply);
void UpdateManaRegen();
const uint64& GetLootGUID() const { return m_lootGuid; }
@@ -1666,18 +1720,18 @@ class TRINITY_DLL_SPEC Player : public Unit
void UpdateDefense();
void UpdateWeaponSkill (WeaponAttackType attType);
- void UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, MeleeHitOutcome outcome, bool defence);
+ void UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, bool defence);
void SetSkill(uint32 id, uint16 currVal, uint16 maxVal);
- uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus
+ uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
uint16 GetPureMaxSkillValue(uint32 skill) const; // max
uint16 GetSkillValue(uint32 skill) const; // skill value + perm. bonus + temp bonus
uint16 GetBaseSkillValue(uint32 skill) const; // skill value + perm. bonus
uint16 GetPureSkillValue(uint32 skill) const; // skill value
+ int16 GetSkillPermBonusValue(uint32 skill) const;
int16 GetSkillTempBonusValue(uint32 skill) const;
bool HasSkill(uint32 skill) const;
- void learnSkillRewardedSpells( uint32 id );
- void learnSkillRewardedSpells();
+ void learnSkillRewardedSpells(uint32 id, uint32 value);
void SetDontMove(bool dontMove);
bool GetDontMove() const { return m_dontMove; }
@@ -1691,6 +1745,7 @@ class TRINITY_DLL_SPEC Player : public Unit
bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
bool RewardPlayerAndGroupAtKill(Unit* pVictim);
+ bool isHonorOrXPTarget(Unit* pVictim);
FactionStateList m_factions;
ForcedReactions m_forcedReactions;
@@ -1757,6 +1812,8 @@ class TRINITY_DLL_SPEC Player : public Unit
void SetCanParry(bool value);
bool CanBlock() const { return m_canBlock; }
void SetCanBlock(bool value);
+ bool CanTitanGrip() const { return m_canTitanGrip ; }
+ void SetCanTitanGrip(bool value) { m_canTitanGrip = value; }
void SetRegularAttackTime();
void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; }
@@ -1785,12 +1842,13 @@ class TRINITY_DLL_SPEC Player : public Unit
void ApplyEquipSpell(SpellEntry const* spellInfo, Item* item, bool apply, bool form_change = false);
void UpdateEquipSpellsAtFormChange();
void CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attType);
+ void CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 cast_count, uint32 glyphIndex);
void SendInitWorldStates(bool force = false, uint32 forceZoneId = 0);
void SendUpdateWorldState(uint32 Field, uint32 Value);
void SendDirectMessage(WorldPacket *data);
- void SendAuraDurationsForTarget(Unit* target);
+ void SendAurasForTarget(Unit *target);
PlayerMenu* PlayerTalkClass;
std::vector<ItemSetEffect *> ItemSetEff;
@@ -1809,46 +1867,46 @@ class TRINITY_DLL_SPEC Player : public Unit
BattleGround* GetBattleGround() const;
bool InArena() const;
- static uint32 GetMinLevelForBattleGroundQueueId(uint32 queue_id);
- static uint32 GetMaxLevelForBattleGroundQueueId(uint32 queue_id);
- uint32 GetBattleGroundQueueIdFromLevel() const;
+ static uint32 GetMinLevelForBattleGroundQueueId(uint32 queue_id, BattleGroundTypeId bgTypeId);
+ static uint32 GetMaxLevelForBattleGroundQueueId(uint32 queue_id, BattleGroundTypeId bgTypeId);
+ uint32 GetBattleGroundQueueIdFromLevel(BattleGroundTypeId bgTypeId) const;
bool InBattleGroundQueue() const
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
- if (m_bgBattleGroundQueueID[i].bgQueueType != 0)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE)
return true;
return false;
}
- uint32 GetBattleGroundQueueId(uint32 index) const { return m_bgBattleGroundQueueID[index].bgQueueType; }
- uint32 GetBattleGroundQueueIndex(uint32 bgQueueType) const
+ BattleGroundQueueTypeId GetBattleGroundQueueTypeId(uint32 index) const { return m_bgBattleGroundQueueID[index].bgQueueTypeId; }
+ uint32 GetBattleGroundQueueIndex(BattleGroundQueueTypeId bgQueueTypeId) const
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
- if (m_bgBattleGroundQueueID[i].bgQueueType == bgQueueType)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
return i;
return PLAYER_MAX_BATTLEGROUND_QUEUES;
}
- bool IsInvitedForBattleGroundQueueType(uint32 bgQueueType) const
+ bool IsInvitedForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
- if (m_bgBattleGroundQueueID[i].bgQueueType == bgQueueType)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
return m_bgBattleGroundQueueID[i].invitedToInstance != 0;
return PLAYER_MAX_BATTLEGROUND_QUEUES;
}
- bool InBattleGroundQueueForBattleGroundQueueType(uint32 bgQueueType) const
+ bool InBattleGroundQueueForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const
{
- return GetBattleGroundQueueIndex(bgQueueType) < PLAYER_MAX_BATTLEGROUND_QUEUES;
+ return GetBattleGroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES;
}
void SetBattleGroundId(uint32 val) { m_bgBattleGroundID = val; }
- uint32 AddBattleGroundQueueId(uint32 val)
+ uint32 AddBattleGroundQueueId(BattleGroundQueueTypeId val)
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
{
- if (m_bgBattleGroundQueueID[i].bgQueueType == 0 || m_bgBattleGroundQueueID[i].bgQueueType == val)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || m_bgBattleGroundQueueID[i].bgQueueTypeId == val)
{
- m_bgBattleGroundQueueID[i].bgQueueType = val;
+ m_bgBattleGroundQueueID[i].bgQueueTypeId = val;
m_bgBattleGroundQueueID[i].invitedToInstance = 0;
return i;
}
@@ -1858,26 +1916,26 @@ class TRINITY_DLL_SPEC Player : public Unit
bool HasFreeBattleGroundQueueId()
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
- if (m_bgBattleGroundQueueID[i].bgQueueType == 0)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE)
return true;
return false;
}
- void RemoveBattleGroundQueueId(uint32 val)
+ void RemoveBattleGroundQueueId(BattleGroundQueueTypeId val)
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
{
- if (m_bgBattleGroundQueueID[i].bgQueueType == val)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == val)
{
- m_bgBattleGroundQueueID[i].bgQueueType = 0;
+ m_bgBattleGroundQueueID[i].bgQueueTypeId = BATTLEGROUND_QUEUE_NONE;
m_bgBattleGroundQueueID[i].invitedToInstance = 0;
return;
}
}
}
- void SetInviteForBattleGroundQueueType(uint32 bgQueueType, uint32 instanceId)
+ void SetInviteForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId, uint32 instanceId)
{
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
- if (m_bgBattleGroundQueueID[i].bgQueueType == bgQueueType)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
m_bgBattleGroundQueueID[i].invitedToInstance = instanceId;
}
bool IsInvitedForBattleGroundInstance(uint32 instanceId) const
@@ -1887,18 +1945,10 @@ class TRINITY_DLL_SPEC Player : public Unit
return true;
return false;
}
- uint32 GetBattleGroundEntryPointMap() const { return m_bgEntryPointMap; }
- float GetBattleGroundEntryPointX() const { return m_bgEntryPointX; }
- float GetBattleGroundEntryPointY() const { return m_bgEntryPointY; }
- float GetBattleGroundEntryPointZ() const { return m_bgEntryPointZ; }
- float GetBattleGroundEntryPointO() const { return m_bgEntryPointO; }
+ WorldLocation const& GetBattleGroundEntryPoint() const { return m_bgEntryPoint; }
void SetBattleGroundEntryPoint(uint32 Map, float PosX, float PosY, float PosZ, float PosO )
{
- m_bgEntryPointMap = Map;
- m_bgEntryPointX = PosX;
- m_bgEntryPointY = PosY;
- m_bgEntryPointZ = PosZ;
- m_bgEntryPointO = PosO;
+ m_bgEntryPoint = WorldLocation(Map,PosX,PosY,PosZ,PosO);
}
void SetBGTeam(uint32 team) { m_bgTeam = team; }
@@ -1910,7 +1960,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void ReportedAfkBy(Player* reporter);
void ClearAfkReports() { m_bgAfkReporter.clear(); }
- bool GetBGAccessByLevel(uint32 bgTypeId) const;
+ bool GetBGAccessByLevel(BattleGroundTypeId bgTypeId) const;
bool isAllowUseBattleGroundObject();
bool isTotalImmunity();
@@ -1951,6 +2001,7 @@ class TRINITY_DLL_SPEC Player : public Unit
MovementInfo m_movementInfo;
uint32 m_lastFallTime;
float m_lastFallZ;
+ Unit *m_mover;
void SetFallInformation(uint32 time, float z)
{
m_lastFallTime = time;
@@ -1961,6 +2012,7 @@ class TRINITY_DLL_SPEC Player : public Unit
bool CanFly() const { return HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); }
bool IsFlying() const { return HasUnitMovementFlag(MOVEMENTFLAG_FLYING); }
+ bool IsAllowUseFlyMountsHere() const;
void HandleDrowning();
void HandleFallDamage(MovementInfo& movementInfo);
@@ -1968,8 +2020,20 @@ class TRINITY_DLL_SPEC Player : public Unit
void SetClientControl(Unit* target, uint8 allowMove);
- uint64 GetFarSight() const { return GetUInt64Value(PLAYER_FARSIGHT); }
- void SetFarSight(uint64 guid) { SetUInt64Value(PLAYER_FARSIGHT, guid); }
+ void EnterVehicle(Vehicle *vehicle);
+ void ExitVehicle(Vehicle *vehicle);
+
+ void SetMover(Unit* target) { m_mover = target ? target : this; }
+ void StopCastingCharm() { Uncharm(); }
+ void StopCastingBindSight();
+ uint64 GetFarSightGUID() const { return GetUInt64Value(PLAYER_FARSIGHT); }
+ void SetFarSightGUID(uint64 guid) { SetUInt64Value(PLAYER_FARSIGHT, guid); }
+ WorldObject* GetFarsightTarget() const;
+ void ClearFarsight();
+ void SetFarsightTarget(WorldObject* target);
+ // Controls if vision is currently on farsight object, updated in FAR_SIGHT opcode
+ void SetFarsightVision(bool apply) { m_farsightVision = apply; }
+ bool HasFarsightVision() const { return m_farsightVision; }
// Transports
Transport * GetTransport() const { return m_transport; }
@@ -1980,6 +2044,7 @@ class TRINITY_DLL_SPEC Player : public Unit
float GetTransOffsetZ() const { return m_movementInfo.t_z; }
float GetTransOffsetO() const { return m_movementInfo.t_o; }
uint32 GetTransTime() const { return m_movementInfo.t_time; }
+ int8 GetTransSeat() const { return m_movementInfo.t_seat; }
uint32 GetSaveTimer() const { return m_nextSave; }
void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
@@ -1998,6 +2063,7 @@ class TRINITY_DLL_SPEC Player : public Unit
float m_homebindX;
float m_homebindY;
float m_homebindZ;
+ void RelocateToHomebind() { SetMapId(m_homebindMapId); Relocate(m_homebindX,m_homebindY,m_homebindZ); }
// currently visible objects at player client
typedef std::set<uint64> ClientGUIDs;
@@ -2031,7 +2097,6 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 GetOldPetSpell() const { return m_oldpetspell; }
void SetOldPetSpell(uint32 petspell) { m_oldpetspell = petspell; }
-
/*********************************************************/
/*** INSTANCE SYSTEM ***/
/*********************************************************/
@@ -2064,11 +2129,10 @@ class TRINITY_DLL_SPEC Player : public Unit
GroupReference& GetGroupRef() { return m_group; }
void SetGroup(Group *group, int8 subgroup = -1);
uint8 GetSubGroup() const { return m_group.getSubGroup(); }
- uint32 GetGroupUpdateFlag() { return m_groupUpdateMask; }
+ uint32 GetGroupUpdateFlag() const { return m_groupUpdateMask; }
void SetGroupUpdateFlag(uint32 flag) { m_groupUpdateMask |= flag; }
- uint64 GetAuraUpdateMask() { return m_auraUpdateMask; }
- void SetAuraUpdateMask(uint8 slot) { m_auraUpdateMask |= (uint64(1) << slot); }
- void UnsetAuraUpdateMask(uint8 slot) { m_auraUpdateMask &= ~(uint64(1) << slot); }
+ const uint64& GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; }
+ void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); }
Player* GetNextRandomRaidMember(float radius);
PartyResult CanUninviteFromGroup() const;
@@ -2080,6 +2144,18 @@ class TRINITY_DLL_SPEC Player : public Unit
WorldLocation& GetTeleportDest() { return m_teleport_dest; }
DeclinedName const* GetDeclinedNames() const { return m_declinedname; }
+ uint8 GetRunesState() const { return m_runes->runeState; }
+ uint8 GetBaseRune(uint8 index) const { return m_runes->runes[index].BaseRune; }
+ uint8 GetCurrentRune(uint8 index) const { return m_runes->runes[index].CurrentRune; }
+ uint8 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; }
+ void SetBaseRune(uint8 index, uint8 baseRune) { m_runes->runes[index].BaseRune = baseRune; }
+ void SetCurrentRune(uint8 index, uint8 currentRune) { m_runes->runes[index].CurrentRune = currentRune; }
+ void SetRuneCooldown(uint8 index, uint8 cooldown) { m_runes->runes[index].Cooldown = cooldown; m_runes->SetRuneState(index, (cooldown == 0) ? true : false); }
+ void ConvertRune(uint8 index, uint8 newType);
+ void ResyncRunes(uint8 count);
+ void AddRunePower(uint8 index);
+ void InitRunes();
+ AchievementMgr& GetAchievementMgr() { return m_achievementMgr; }
bool HasTitle(uint32 bitIndex);
bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); }
void SetTitle(CharTitlesEntry const* title);
@@ -2097,15 +2173,11 @@ class TRINITY_DLL_SPEC Player : public Unit
*/
struct BgBattleGroundQueueID_Rec
{
- uint32 bgQueueType;
+ BattleGroundQueueTypeId bgQueueTypeId;
uint32 invitedToInstance;
};
BgBattleGroundQueueID_Rec m_bgBattleGroundQueueID[PLAYER_MAX_BATTLEGROUND_QUEUES];
- uint32 m_bgEntryPointMap;
- float m_bgEntryPointX;
- float m_bgEntryPointY;
- float m_bgEntryPointZ;
- float m_bgEntryPointO;
+ WorldLocation m_bgEntryPoint;
std::set<uint32> m_bgAfkReporter;
uint8 m_bgAfkReportedCount;
@@ -2129,6 +2201,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void _LoadActions(QueryResult *result);
void _LoadAuras(QueryResult *result, uint32 timediff);
+ void _LoadGlyphAuras();
void _LoadBoundInstances(QueryResult *result);
void _LoadInventory(QueryResult *result, uint32 timediff);
void _LoadMailInit(QueryResult *resultUnread, QueryResult *resultDelivery);
@@ -2138,6 +2211,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void _LoadDailyQuestStatus(QueryResult *result);
void _LoadGroup(QueryResult *result);
void _LoadReputation(QueryResult *result);
+ void _LoadSkills();
void _LoadSpells(QueryResult *result);
void _LoadTutorials(QueryResult *result);
void _LoadFriendList(QueryResult *result);
@@ -2179,7 +2253,6 @@ class TRINITY_DLL_SPEC Player : public Unit
time_t m_lastHonorUpdateTime;
void outDebugValues() const;
- bool _removeSpell(uint16 spell_id);
uint64 m_lootGuid;
uint32 m_race;
@@ -2216,6 +2289,11 @@ class TRINITY_DLL_SPEC Player : public Unit
ActionButtonList m_actionButtons;
float m_auraBaseMod[BASEMOD_END][MOD_END];
+ int16 m_baseRatingValue[MAX_COMBAT_RATING];
+ uint16 m_baseSpellDamage;
+ uint16 m_baseSpellHealing;
+ uint16 m_baseFeralAP;
+ uint16 m_baseManaRegen;
SpellModList m_spellMods[MAX_SPELLMOD];
int32 m_SpellModRemoveCount;
@@ -2249,7 +2327,6 @@ class TRINITY_DLL_SPEC Player : public Unit
bool m_DailyQuestChanged;
time_t m_lastDailyQuestTime;
- uint32 m_regenTimer;
uint32 m_breathTimer;
uint32 m_drunkTimer;
uint16 m_drunk;
@@ -2268,8 +2345,10 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 m_ArmorProficiency;
bool m_canParry;
bool m_canBlock;
+ bool m_canTitanGrip;
uint8 m_swingErrorMsg;
float m_ammoDPS;
+
////////////////////Rest System/////////////////////
int time_inn_enter;
uint32 inn_pos_mapid;
@@ -2286,6 +2365,7 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 m_resetTalentsCost;
time_t m_resetTalentsTime;
uint32 m_usedTalentCount;
+ uint32 m_questRewardTalentCount;
// Social
PlayerSocial *m_social;
@@ -2294,7 +2374,7 @@ class TRINITY_DLL_SPEC Player : public Unit
GroupReference m_group;
Group *m_groupInvite;
uint32 m_groupUpdateMask;
- uint64 m_auraUpdateMask;
+ uint64 m_auraRaidUpdateMask;
// Temporarily removed pet cache
uint32 m_temporaryUnsummonedPetNumber;
@@ -2316,6 +2396,8 @@ class TRINITY_DLL_SPEC Player : public Unit
bool m_farsightVision;
DeclinedName *m_declinedname;
+ Runes *m_runes;
+ AchievementMgr m_achievementMgr;
private:
// internal common parts for CanStore/StoreItem functions
uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const;
@@ -2323,6 +2405,8 @@ class TRINITY_DLL_SPEC Player : public Unit
uint8 _CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot ) const;
Item* _StoreItem( uint16 pos, Item *pItem, uint32 count, bool clone, bool update );
+ void AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData );
+
GridReference<Player> m_gridRef;
MapReference m_mapRef;
diff --git a/src/game/PlayerDump.cpp b/src/game/PlayerDump.cpp
index b061b63a06a..fea5666c9e0 100644
--- a/src/game/PlayerDump.cpp
+++ b/src/game/PlayerDump.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/PlayerDump.h b/src/game/PlayerDump.h
index 2fbdf513ce5..01f97718267 100644
--- a/src/game/PlayerDump.h
+++ b/src/game/PlayerDump.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -20,28 +20,7 @@
#ifndef _PLAYER_DUMP_H
#define _PLAYER_DUMP_H
-/*
-#include "Log.h"
-#include "Object.h"
-#include "Bag.h"
-#include "Creature.h"
-#include "Player.h"
-#include "DynamicObject.h"
-#include "GameObject.h"
-#include "Corpse.h"
-#include "QuestDef.h"
-#include "Path.h"
-#include "ItemPrototype.h"
-#include "NPCHandler.h"
-#include "Database/DatabaseEnv.h"
-#include "AuctionHouseObject.h"
-#include "Mail.h"
-#include "Map.h"
-#include "ObjectAccessor.h"
-#include "ObjectDefines.h"
-#include "Policies/Singleton.h"
-#include "Database/SQLStorage.h"
-*/
+
#include <string>
#include <map>
#include <set>
diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp
index 4aa21d32d55..f3b1f2281f7 100644
--- a/src/game/PointMovementGenerator.cpp
+++ b/src/game/PointMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/PointMovementGenerator.h b/src/game/PointMovementGenerator.h
index 5d0bb4e80e7..49b48772ffb 100644
--- a/src/game/PointMovementGenerator.h
+++ b/src/game/PointMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/PoolHandler.cpp b/src/game/PoolHandler.cpp
new file mode 100644
index 00000000000..0f18aee0549
--- /dev/null
+++ b/src/game/PoolHandler.cpp
@@ -0,0 +1,720 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://www.mangosproject.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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "PoolHandler.h"
+#include "World.h"
+#include "ObjectMgr.h"
+#include "ProgressBar.h"
+#include "Language.h"
+#include "Log.h"
+#include "MapManager.h"
+#include "Policies/SingletonImp.h"
+
+INSTANTIATE_SINGLETON_1(PoolHandler);
+
+////////////////////////////////////////////////////////////
+// Methods of template class PoolGroup
+
+template <class T>
+PoolGroup<T>::PoolGroup()
+{
+ Spawned = 0;
+}
+
+// Method to add a gameobject/creature guid to the proper list depending on pool type and chance value
+template <class T>
+void PoolGroup<T>::AddEntry(PoolObject& poolitem, uint32 maxentries)
+{
+ if (poolitem.chance != 0 && maxentries == 1)
+ ExplicitlyChanced.push_back(poolitem);
+ else
+ EqualChanced.push_back(poolitem);
+}
+
+// Method to check the chances are proper in this object pool
+template <class T>
+bool PoolGroup<T>::CheckPool(void)
+{
+ if (EqualChanced.size() == 0)
+ {
+ float chance = 0;
+ for (uint32 i=0; i<ExplicitlyChanced.size(); ++i)
+ chance += ExplicitlyChanced[i].chance;
+ if (chance != 100 && chance != 0)
+ return false;
+ }
+ return true;
+}
+
+// Method that tell if the gameobject, creature or pool is spawned currently
+template <class T>
+bool PoolGroup<T>::IsSpawnedObject(uint32 guid)
+{
+ for (uint32 i=0; i<ExplicitlyChanced.size(); ++i)
+ if (ExplicitlyChanced[i].guid == guid)
+ return ExplicitlyChanced[i].spawned;
+ for (uint32 i=0; i<EqualChanced.size(); ++i)
+ if (EqualChanced[i].guid == guid)
+ return EqualChanced[i].spawned;
+ return false;
+}
+
+// Method that return a guid of a rolled creature or gameobject
+// Note: Copy from loot system because it's very similar and only few things change
+template <class T>
+uint32 PoolGroup<T>::RollOne(void)
+{
+ if (!ExplicitlyChanced.empty()) // First explicitly chanced entries are checked
+ {
+ float roll = rand_chance();
+
+ for (uint32 i=0; i<ExplicitlyChanced.size(); ++i)
+ {
+ roll -= ExplicitlyChanced[i].chance;
+ if (roll < 0)
+ return ExplicitlyChanced[i].guid;
+ }
+ }
+ if (!EqualChanced.empty())
+ return EqualChanced[irand(0, EqualChanced.size()-1)].guid;
+
+ return 0; // None found
+}
+
+// Main method to despawn a creature or gameobject in a pool
+// If no guid is passed, the pool is just removed (event end case)
+// If guid is filled, cache will be used and no removal will occur, it just fill the cache
+template<class T>
+void PoolGroup<T>::DespawnObject(uint32 guid)
+{
+ for (int i=0; i<EqualChanced.size(); ++i)
+ {
+ if (EqualChanced[i].spawned)
+ {
+ if (!guid || EqualChanced[i].guid == guid)
+ {
+ if (guid)
+ CacheValue = EqualChanced[i].guid;
+ else
+ Despawn1Object(EqualChanced[i].guid);
+
+ EqualChanced[i].spawned = false;
+ Spawned--;
+ }
+ }
+ }
+}
+
+// Method that is actualy doing the removal job on one creature
+template<>
+void PoolGroup<Creature>::Despawn1Object(uint32 guid)
+{
+ if (CreatureData const* data = objmgr.GetCreatureData(guid))
+ {
+ objmgr.RemoveCreatureFromGrid(guid, data);
+
+ if (Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_UNIT), (Creature*)NULL))
+ {
+ pCreature->CleanupsBeforeDelete();
+ pCreature->AddObjectToRemoveList();
+ }
+ }
+}
+
+// Same on one gameobject
+template<>
+void PoolGroup<GameObject>::Despawn1Object(uint32 guid)
+{
+ if (GameObjectData const* data = objmgr.GetGOData(guid))
+ {
+ objmgr.RemoveGameobjectFromGrid(guid, data);
+
+ if (GameObject* pGameobject = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_GAMEOBJECT), (GameObject*)NULL))
+ pGameobject->AddObjectToRemoveList();
+ }
+}
+
+// Same on one pool
+template<>
+void PoolGroup<Pool>::Despawn1Object(uint32 child_pool_id)
+{
+ poolhandler.DespawnPool(child_pool_id);
+}
+
+// Method for a pool only to remove any found record causing a circular dependency loop
+template<>
+void PoolGroup<Pool>::RemoveOneRelation(uint16 child_pool_id)
+{
+ for (PoolObjectList::iterator itr = ExplicitlyChanced.begin(); itr != ExplicitlyChanced.end(); ++itr)
+ {
+ if(itr->guid == child_pool_id)
+ {
+ ExplicitlyChanced.erase(itr);
+ break;
+ }
+ }
+ for (PoolObjectList::iterator itr = EqualChanced.begin(); itr != EqualChanced.end(); ++itr)
+ {
+ if(itr->guid == child_pool_id)
+ {
+ EqualChanced.erase(itr);
+ break;
+ }
+ }
+}
+
+// Method that Spawn 1+ creatures or gameobject
+// if cache is false (initialization or event start), X creatures are spawned with X <= limit (< if limit higher that the number of creatures in pool)
+// if cache is true, this means only one has to be spawned (or respawned if the rolled one is same as cached one)
+template <class T>
+void PoolGroup<T>::SpawnObject(uint32 limit, bool cache)
+{
+ if (limit == 1) // This is the only case where explicit chance is used
+ {
+ uint32 roll = RollOne();
+ if (cache && CacheValue != roll)
+ Despawn1Object(CacheValue);
+ CacheValue = Spawn1Object(roll);
+ }
+ else if (limit < EqualChanced.size() && Spawned < limit)
+ {
+ std::vector<uint32> IndexList;
+ for (int i=0; i<EqualChanced.size(); ++i)
+ if (!EqualChanced[i].spawned)
+ IndexList.push_back(i);
+
+ while (Spawned < limit && IndexList.size() > 0)
+ {
+ uint32 roll = urand(1, IndexList.size()) - 1;
+ uint32 index = IndexList[roll];
+ if (!cache || (cache && EqualChanced[index].guid != CacheValue))
+ {
+ if (cache)
+ Despawn1Object(CacheValue);
+ EqualChanced[index].spawned = Spawn1Object(EqualChanced[index].guid);
+ }
+ else
+ EqualChanced[index].spawned = ReSpawn1Object(EqualChanced[index].guid);
+
+ if (EqualChanced[index].spawned)
+ ++Spawned; // limited group use the Spawned variable to store the number of actualy spawned creatures
+ std::vector<uint32>::iterator itr = IndexList.begin()+roll;
+ IndexList.erase(itr);
+ }
+ CacheValue = 0;
+ }
+ else // Not enough objects in pool, so spawn all
+ {
+ for (int i=0; i<EqualChanced.size(); ++i)
+ EqualChanced[i].spawned = Spawn1Object(EqualChanced[i].guid);
+ }
+}
+
+// Method that is actualy doing the spawn job on 1 creature
+template <>
+bool PoolGroup<Creature>::Spawn1Object(uint32 guid)
+{
+ CreatureData const* data = objmgr.GetCreatureData(guid);
+ if (data)
+ {
+ objmgr.AddCreatureToGrid(guid, data);
+
+ // Spawn if necessary (loaded grids only)
+ Map* map = const_cast<Map*>(MapManager::Instance().GetBaseMap(data->mapid));
+ // We use spawn coords to spawn
+ if (!map->Instanceable() && !map->IsRemovalGrid(data->posX, data->posY))
+ {
+ Creature* pCreature = new Creature;
+ //sLog.outDebug("Spawning creature %u",guid);
+ if (!pCreature->LoadFromDB(guid, map))
+ {
+ delete pCreature;
+ }
+ else
+ {
+ map->Add(pCreature);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+// Same for 1 gameobject
+template <>
+bool PoolGroup<GameObject>::Spawn1Object(uint32 guid)
+{
+ GameObjectData const* data = objmgr.GetGOData(guid);
+ if (data)
+ {
+ objmgr.AddGameobjectToGrid(guid, data);
+ // Spawn if necessary (loaded grids only)
+ // this base map checked as non-instanced and then only existed
+ Map* map = const_cast<Map*>(MapManager::Instance().GetBaseMap(data->mapid));
+ // We use current coords to unspawn, not spawn coords since creature can have changed grid
+ if (!map->Instanceable() && !map->IsRemovalGrid(data->posX, data->posY))
+ {
+ GameObject* pGameobject = new GameObject;
+ //sLog.outDebug("Spawning gameobject %u", guid);
+ if (!pGameobject->LoadFromDB(guid, map))
+ {
+ delete pGameobject;
+ }
+ else
+ {
+ if (pGameobject->isSpawnedByDefault())
+ map->Add(pGameobject);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+// Same for 1 pool
+template <>
+bool PoolGroup<Pool>::Spawn1Object(uint32 child_pool_id)
+{
+ poolhandler.SpawnPool(child_pool_id);
+ return true;
+}
+
+// Method that does the respawn job on the specified creature
+template <>
+bool PoolGroup<Creature>::ReSpawn1Object(uint32 guid)
+{
+ CreatureData const* data = objmgr.GetCreatureData(guid);
+ if (data)
+ {
+ if (Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_UNIT), (Creature*)NULL))
+ pCreature->GetMap()->Add(pCreature);
+ return true;
+ }
+ return false;
+}
+
+// Same for 1 gameobject
+template <>
+bool PoolGroup<GameObject>::ReSpawn1Object(uint32 guid)
+{
+ GameObjectData const* data = objmgr.GetGOData(guid);
+ if (data)
+ {
+ if (GameObject* pGameobject = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_GAMEOBJECT), (GameObject*)NULL))
+ pGameobject->GetMap()->Add(pGameobject);
+ return true;
+ }
+ return false;
+}
+
+// Nothing to do for a child Pool
+template <>
+bool PoolGroup<Pool>::ReSpawn1Object(uint32 guid)
+{
+ return true;
+}
+
+
+////////////////////////////////////////////////////////////
+// Methods of class PoolHandler
+
+PoolHandler::PoolHandler()
+{
+ isSystemInit = false;
+}
+
+void PoolHandler::LoadFromDB()
+{
+ QueryResult *result = WorldDatabase.Query("SELECT MAX(entry) FROM pool_template");
+ if (!result)
+ {
+ sLog.outString(">> Table pool_template is empty.");
+ sLog.outString();
+ return;
+ }
+ else
+ {
+ Field *fields = result->Fetch();
+ max_pool_id = fields[0].GetUInt16();
+ delete result;
+ }
+
+ mPoolTemplate.resize(max_pool_id + 1);
+
+ result = WorldDatabase.Query("SELECT entry,max_limit FROM pool_template");
+ if (!result)
+ {
+ mPoolTemplate.clear();
+ sLog.outString(">> Table pool_template is empty:");
+ sLog.outString();
+ return;
+ }
+
+ uint32 count = 0;
+
+ barGoLink bar(result->GetRowCount());
+ do
+ {
+ ++count;
+ Field *fields = result->Fetch();
+
+ bar.step();
+
+ uint16 pool_id = fields[0].GetUInt16();
+
+ PoolTemplateData& pPoolTemplate = mPoolTemplate[pool_id];
+ pPoolTemplate.MaxLimit = fields[1].GetUInt32();
+
+ } while (result->NextRow());
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u objects pools", count );
+ delete result;
+
+ // Creatures
+
+ mPoolCreatureGroups.resize(max_pool_id + 1);
+ mCreatureSearchMap.clear();
+ // 1 2 3
+ result = WorldDatabase.Query("SELECT guid, pool_entry, chance FROM pool_creature");
+
+ count = 0;
+ if (!result)
+ {
+ barGoLink bar2(1);
+ bar2.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u creatures in pools", count );
+ }
+ else
+ {
+
+ barGoLink bar2(result->GetRowCount());
+ do
+ {
+ Field *fields = result->Fetch();
+
+ bar2.step();
+
+ uint32 guid = fields[0].GetUInt32();
+ uint16 pool_id = fields[1].GetUInt16();
+ float chance = fields[2].GetFloat();
+
+ CreatureData const* data = objmgr.GetCreatureData(guid);
+ if (!data)
+ {
+ sLog.outErrorDb("`pool_creature` has a non existing creature spawn (GUID: %u) defined for pool id (%u), skipped.", guid, pool_id );
+ continue;
+ }
+ if (pool_id > max_pool_id)
+ {
+ sLog.outErrorDb("`pool_creature` pool id (%i) is out of range compared to max pool id in `pool_template`, skipped.",pool_id);
+ continue;
+ }
+ if (chance < 0 || chance > 100)
+ {
+ sLog.outErrorDb("`pool_creature` has an invalid chance (%f) for creature guid (%u) in pool id (%i), skipped.", chance, guid, pool_id);
+ continue;
+ }
+ PoolTemplateData *pPoolTemplate = &mPoolTemplate[pool_id];
+ ++count;
+
+ PoolObject plObject = PoolObject(guid, chance);
+ PoolGroup<Creature>& cregroup = mPoolCreatureGroups[pool_id];
+ cregroup.AddEntry(plObject, pPoolTemplate->MaxLimit);
+ SearchPair p(guid, pool_id);
+ mCreatureSearchMap.insert(p);
+
+ } while (result->NextRow());
+ sLog.outString();
+ sLog.outString( ">> Loaded %u creatures in pools", count );
+ delete result;
+ }
+
+ // Gameobjects
+
+ mPoolGameobjectGroups.resize(max_pool_id + 1);
+ mGameobjectSearchMap.clear();
+ // 1 2 3
+ result = WorldDatabase.Query("SELECT guid, pool_entry, chance FROM pool_gameobject");
+
+ count = 0;
+ if (!result)
+ {
+ barGoLink bar2(1);
+ bar2.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u gameobject in pools", count );
+ }
+ else
+ {
+
+ barGoLink bar2(result->GetRowCount());
+ do
+ {
+ Field *fields = result->Fetch();
+
+ bar2.step();
+
+ uint32 guid = fields[0].GetUInt32();
+ uint16 pool_id = fields[1].GetUInt16();
+ float chance = fields[2].GetFloat();
+
+ GameObjectData const* data = objmgr.GetGOData(guid);
+ if (!data)
+ {
+ sLog.outErrorDb("`pool_gameobject` has a non existing gameobject spawn (GUID: %u) defined for pool id (%u), skipped.", guid, pool_id );
+ continue;
+ }
+ GameObjectInfo const* goinfo = objmgr.GetGameObjectInfo(data->id);
+ if (goinfo->type != GAMEOBJECT_TYPE_CHEST &&
+ goinfo->type != GAMEOBJECT_TYPE_GOOBER &&
+ goinfo->type != GAMEOBJECT_TYPE_FISHINGHOLE)
+ {
+ sLog.outErrorDb("`pool_gameobject` has a not lootable gameobject spawn (GUID: %u, type: %u) defined for pool id (%u), skipped.", guid, goinfo->type, pool_id );
+ continue;
+ }
+ if (pool_id > max_pool_id)
+ {
+ sLog.outErrorDb("`pool_gameobject` pool id (%i) is out of range compared to max pool id in `pool_template`, skipped.",pool_id);
+ continue;
+ }
+ if (chance < 0 || chance > 100)
+ {
+ sLog.outErrorDb("`pool_gameobject` has an invalid chance (%f) for gameobject guid (%u) in pool id (%i), skipped.", chance, guid, pool_id);
+ continue;
+ }
+ PoolTemplateData *pPoolTemplate = &mPoolTemplate[pool_id];
+
+ ++count;
+
+ PoolObject plObject = PoolObject(guid, chance);
+ PoolGroup<GameObject>& gogroup = mPoolGameobjectGroups[pool_id];
+ gogroup.AddEntry(plObject, pPoolTemplate->MaxLimit);
+ SearchPair p(guid, pool_id);
+ mGameobjectSearchMap.insert(p);
+
+ } while( result->NextRow() );
+ sLog.outString();
+ sLog.outString( ">> Loaded %u gameobject in pools", count );
+ delete result;
+ }
+
+ // Pool of pools
+ mPoolPoolGroups.resize(max_pool_id + 1);
+ // 1 2 3
+ result = WorldDatabase.Query("SELECT pool_id, mother_pool, chance FROM pool_pool");
+
+ count = 0;
+ if( !result )
+ {
+ barGoLink bar2(1);
+ bar2.step();
+
+ sLog.outString();
+ sLog.outString(">> Loaded %u pools in pools", count );
+ }
+ else
+ {
+
+ barGoLink bar2( result->GetRowCount() );
+ do
+ {
+ Field *fields = result->Fetch();
+
+ bar2.step();
+
+ uint16 child_pool_id = fields[0].GetUInt16();
+ uint16 mother_pool_id = fields[1].GetUInt16();
+ float chance = fields[2].GetFloat();
+
+ if (mother_pool_id > max_pool_id)
+ {
+ sLog.outErrorDb("`pool_pool` mother_pool id (%i) is out of range compared to max pool id in `pool_template`, skipped.",mother_pool_id);
+ continue;
+ }
+ if (child_pool_id > max_pool_id)
+ {
+ sLog.outErrorDb("`pool_pool` included pool_id (%i) is out of range compared to max pool id in `pool_template`, skipped.",child_pool_id);
+ continue;
+ }
+ if (mother_pool_id == child_pool_id)
+ {
+ sLog.outErrorDb("`pool_pool` pool_id (%i) includes itself, dead-lock detected, skipped.",child_pool_id);
+ continue;
+ }
+ if (chance < 0 || chance > 100)
+ {
+ sLog.outErrorDb("`pool_pool` has an invalid chance (%f) for pool id (%u) in mother pool id (%i), skipped.", chance, child_pool_id, mother_pool_id);
+ continue;
+ }
+ PoolTemplateData *pPoolTemplateMother = &mPoolTemplate[mother_pool_id];
+
+ ++count;
+
+ PoolObject plObject = PoolObject(child_pool_id, chance);
+ PoolGroup<Pool>& plgroup = mPoolPoolGroups[mother_pool_id];
+ plgroup.AddEntry(plObject, pPoolTemplateMother->MaxLimit);
+ SearchPair p(child_pool_id, mother_pool_id);
+ mPoolSearchMap.insert(p);
+
+ } while( result->NextRow() );
+
+ // Now check for circular reference
+ for(uint16 i=0; i<max_pool_id; ++i)
+ {
+ std::set<uint16> checkedPools;
+ for(SearchMap::iterator poolItr = mPoolSearchMap.find(i); poolItr != mPoolSearchMap.end(); poolItr = mPoolSearchMap.find(poolItr->second))
+ {
+ checkedPools.insert(poolItr->first);
+ if(checkedPools.find(poolItr->second) != checkedPools.end())
+ {
+ std::ostringstream ss;
+ ss<< "The pool(s) ";
+ for (std::set<uint16>::const_iterator itr=checkedPools.begin(); itr!=checkedPools.end(); ++itr)
+ ss << *itr << " ";
+ ss << "create(s) a circular reference, which can cause the server to freeze.\nRemoving the last link between mother pool "
+ << poolItr->first << " and child pool " << poolItr->second;
+ sLog.outErrorDb(ss.str().c_str());
+ mPoolPoolGroups[poolItr->second].RemoveOneRelation(poolItr->first);
+ mPoolSearchMap.erase(poolItr);
+ --count;
+ break;
+ }
+ }
+ }
+ sLog.outString();
+ sLog.outString( ">> Loaded %u pools in mother pools", count );
+ delete result;
+ }
+}
+
+// The initialize method will spawn all pools not in an event and not in another pool, this is why there is 2 left joins with 2 null checks
+void PoolHandler::Initialize()
+{
+ QueryResult *result = WorldDatabase.Query("SELECT DISTINCT pool_template.entry FROM pool_template LEFT JOIN game_event_pool ON pool_template.entry=game_event_pool.pool_entry LEFT JOIN pool_pool ON pool_template.entry=pool_pool.pool_id WHERE game_event_pool.pool_entry IS NULL AND pool_pool.pool_id IS NULL");
+ uint32 count=0;
+ if (result)
+ {
+ do
+ {
+ Field *fields = result->Fetch();
+ uint16 pool_entry = fields[0].GetUInt16();
+ if (!CheckPool(pool_entry))
+ {
+ sLog.outErrorDb("Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", pool_entry);
+ continue;
+ }
+ SpawnPool(pool_entry);
+ count++;
+ } while (result->NextRow());
+ }
+
+ sLog.outBasic("Pool handling system initialized, %u pools spawned.", count);
+ isSystemInit = true;
+}
+
+// Call to spawn a pool, if cache if true the method will spawn only if cached entry is different
+// If it's same, the gameobject/creature is respawned only (added back to map)
+void PoolHandler::SpawnPool(uint16 pool_id, bool cache)
+{
+ if (!mPoolPoolGroups[pool_id].isEmpty())
+ mPoolPoolGroups[pool_id].SpawnObject(mPoolTemplate[pool_id].MaxLimit, cache);
+ if (!mPoolGameobjectGroups[pool_id].isEmpty())
+ mPoolGameobjectGroups[pool_id].SpawnObject(mPoolTemplate[pool_id].MaxLimit, cache);
+ if (!mPoolCreatureGroups[pool_id].isEmpty())
+ mPoolCreatureGroups[pool_id].SpawnObject(mPoolTemplate[pool_id].MaxLimit, cache);
+}
+
+// Call to despawn a pool, all gameobjects/creatures in this pool are removed
+void PoolHandler::DespawnPool(uint16 pool_id)
+{
+ if (!mPoolPoolGroups[pool_id].isEmpty())
+ mPoolPoolGroups[pool_id].DespawnObject();
+ if (!mPoolGameobjectGroups[pool_id].isEmpty())
+ mPoolGameobjectGroups[pool_id].DespawnObject();
+ if (!mPoolCreatureGroups[pool_id].isEmpty())
+ mPoolCreatureGroups[pool_id].DespawnObject();
+}
+
+// Call to update the pool when a gameobject/creature part of pool [pool_id] is ready to respawn
+// Here we cache only the creature/gameobject whose guid is passed as parameter
+// Then the spawn pool call will use this cache to decide
+void PoolHandler::UpdatePool(uint16 pool_id, uint32 guid, uint32 type)
+{
+ uint16 motherpoolid = IsPartOfAPool(pool_id, 0);
+
+ if (motherpoolid)
+ mPoolPoolGroups[motherpoolid].DespawnObject(pool_id);
+ else if (type == TYPEID_GAMEOBJECT && !mPoolGameobjectGroups[pool_id].isEmpty())
+ mPoolGameobjectGroups[pool_id].DespawnObject(guid);
+ else if (type != TYPEID_GAMEOBJECT && !mPoolCreatureGroups[pool_id].isEmpty())
+ mPoolCreatureGroups[pool_id].DespawnObject(guid);
+
+ if (motherpoolid)
+ SpawnPool(motherpoolid, true);
+ else
+ SpawnPool(pool_id, true);
+}
+
+// Method that tell if the gameobject/creature is part of a pool and return the pool id if yes
+uint16 PoolHandler::IsPartOfAPool(uint32 guid, uint32 type)
+{
+ if (type == 0) // pool of pool
+ {
+ SearchMap::const_iterator itr = mPoolSearchMap.find(guid);
+ if (itr != mPoolSearchMap.end())
+ return itr->second;
+ }
+ else if (type == TYPEID_GAMEOBJECT)
+ {
+ SearchMap::const_iterator itr = mGameobjectSearchMap.find(guid);
+ if (itr != mGameobjectSearchMap.end())
+ return itr->second;
+ }
+ else // creature
+ {
+ SearchMap::const_iterator itr = mCreatureSearchMap.find(guid);
+ if (itr != mCreatureSearchMap.end())
+ return itr->second;
+ }
+ return 0;
+}
+
+// Method that check chance integrity of the creatures and gameobjects in this pool
+bool PoolHandler::CheckPool(uint16 pool_id)
+{
+ return mPoolGameobjectGroups[pool_id].CheckPool() &&
+ mPoolCreatureGroups[pool_id].CheckPool() &&
+ mPoolPoolGroups[pool_id].CheckPool();
+}
+
+// Method that tell if a creature or gameobject in pool_id is spawned currently
+bool PoolHandler::IsSpawnedObject(uint16 pool_id, uint32 guid, uint32 type)
+{
+ if (pool_id > max_pool_id)
+ return false;
+ if (type == 0)
+ return mPoolPoolGroups[pool_id].IsSpawnedObject(guid);
+ else if (type == TYPEID_GAMEOBJECT)
+ return mPoolGameobjectGroups[pool_id].IsSpawnedObject(guid);
+ else
+ return mPoolCreatureGroups[pool_id].IsSpawnedObject(guid);
+}
diff --git a/src/game/PoolHandler.h b/src/game/PoolHandler.h
new file mode 100644
index 00000000000..747dae62edb
--- /dev/null
+++ b/src/game/PoolHandler.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://www.mangosproject.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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef MANGOS_POOLHANDLER_H
+#define MANGOS_POOLHANDLER_H
+
+#include "Platform/Define.h"
+#include "Creature.h"
+#include "GameObject.h"
+
+struct PoolTemplateData
+{
+ uint32 MaxLimit;
+};
+
+struct PoolObject
+{
+ uint32 guid;
+ float chance;
+ bool spawned;
+ PoolObject(uint32 _guid, float _chance): guid(_guid), chance(fabs(_chance)), spawned(false) {}
+};
+
+template <class T>
+class PoolGroup
+{
+ public:
+ PoolGroup();
+ ~PoolGroup() {};
+ bool isEmpty() { return ExplicitlyChanced.size()==0 && EqualChanced.size()==0; }
+ void AddEntry(PoolObject& poolitem, uint32 maxentries);
+ bool CheckPool(void);
+ uint32 RollOne(void);
+ bool IsSpawnedObject(uint32 guid);
+ void DespawnObject(uint32 guid=0);
+ void Despawn1Object(uint32 guid);
+ void SpawnObject(uint32 limit, bool cache=false);
+ bool Spawn1Object(uint32 guid);
+ bool ReSpawn1Object(uint32 guid);
+ void RemoveOneRelation(uint16 child_pool_id);
+ private:
+ typedef std::vector<PoolObject> PoolObjectList;
+ uint32 CacheValue; // Store the guid of the removed creature/gameobject during a pool update
+ PoolObjectList ExplicitlyChanced;
+ PoolObjectList EqualChanced;
+ uint32 Spawned; // Used to know the number of spawned objects
+};
+
+class Pool // for Pool of Pool case
+{
+};
+
+class PoolHandler
+{
+ public:
+ PoolHandler();
+ ~PoolHandler() {};
+ void LoadFromDB();
+ uint16 IsPartOfAPool(uint32 guid, uint32 type);
+ bool IsSpawnedObject(uint16 pool_id, uint32 guid, uint32 type);
+ bool CheckPool(uint16 pool_id);
+ void SpawnPool(uint16 pool_id, bool cache=false);
+ void DespawnPool(uint16 pool_id);
+ void UpdatePool(uint16 pool_id, uint32 guid, uint32 type);
+ void Initialize();
+
+ protected:
+ bool isSystemInit;
+ uint16 max_pool_id;
+ typedef std::vector<PoolTemplateData> PoolTemplateDataMap;
+ typedef std::vector<PoolGroup<Creature> > PoolGroupCreatureMap;
+ typedef std::vector<PoolGroup<GameObject> > PoolGroupGameObjectMap;
+ typedef std::vector<PoolGroup<Pool> > PoolGroupPoolMap;
+ typedef std::pair<uint32, uint16> SearchPair;
+ typedef std::map<uint32, uint16> SearchMap;
+
+ PoolTemplateDataMap mPoolTemplate;
+ PoolGroupCreatureMap mPoolCreatureGroups;
+ PoolGroupGameObjectMap mPoolGameobjectGroups;
+ PoolGroupPoolMap mPoolPoolGroups;
+ SearchMap mCreatureSearchMap;
+ SearchMap mGameobjectSearchMap;
+ SearchMap mPoolSearchMap;
+
+};
+
+#define poolhandler MaNGOS::Singleton<PoolHandler>::Instance()
+#endif
diff --git a/src/game/PossessedAI.cpp b/src/game/PossessedAI.cpp
index 23ac5fae43e..e8d499bf576 100644
--- a/src/game/PossessedAI.cpp
+++ b/src/game/PossessedAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/game/PossessedAI.h b/src/game/PossessedAI.h
index c9ad643eea1..fd90c5429b0 100644
--- a/src/game/PossessedAI.h
+++ b/src/game/PossessedAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
- * Thanks to the original authors: MaNGOS <http://www.mangosproject.org/>
+ * Thanks to the original authors: MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp
index f7777367771..eefecbce078 100644
--- a/src/game/QueryHandler.cpp
+++ b/src/game/QueryHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -33,6 +33,7 @@
#include "NPCHandler.h"
#include "ObjectAccessor.h"
#include "Pet.h"
+#include "MapManager.h"
void WorldSession::SendNameQueryOpcode(Player *p)
{
@@ -185,7 +186,6 @@ void WorldSession::HandleCreatureQueryOpcode( WorldPacket & recv_data )
data << (uint32)ci->type;
data << (uint32)ci->family; // family wdbFeild9
data << (uint32)ci->rank; // rank wdbFeild10
- data << (uint32)0; // unknown wdbFeild11
data << (uint32)ci->PetSpellDataId; // Id from CreatureSpellData.dbc wdbField12
data << (uint32)ci->Modelid1; // Modelid1
data << (uint32)ci->Modelid2; // Modelid2
@@ -276,20 +276,43 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/)
Corpse *corpse = GetPlayer()->GetCorpse();
- uint8 found = 1;
if(!corpse)
- found = 0;
+ {
+ WorldPacket data(MSG_CORPSE_QUERY, 1);
+ data << uint8(0); // corpse not found
+ SendPacket(&data);
+ return;
+ }
+
+ int32 mapid = corpse->GetMapId();
+ float x = corpse->GetPositionX();
+ float y = corpse->GetPositionY();
+ float z = corpse->GetPositionZ();
+ int32 corpsemapid = _player->GetMapId();
- WorldPacket data(MSG_CORPSE_QUERY, (1+found*(5*4)));
- data << uint8(found);
- if(found)
+ if(Map *map = MapManager::Instance().FindMap(corpse->GetMapId(), corpse->GetInstanceId()))
{
- data << corpse->GetMapId();
- data << corpse->GetPositionX();
- data << corpse->GetPositionY();
- data << corpse->GetPositionZ();
- data << _player->GetMapId();
+ if(map->IsDungeon())
+ {
+ if(!map->GetEntrancePos(mapid, x, y))
+ return;
+
+ Map *entrance_map = MapManager::Instance().GetMap(mapid, _player);
+ if(!entrance_map)
+ return;
+
+ z = entrance_map->GetHeight(x, y, MAX_HEIGHT);
+ corpsemapid = corpse->GetMapId();
+ }
}
+
+ WorldPacket data(MSG_CORPSE_QUERY, 1+(5*4));
+ data << uint8(1); // corpse found
+ data << int32(mapid);
+ data << float(x);
+ data << float(y);
+ data << float(z);
+ data << int32(corpsemapid);
SendPacket(&data);
}
@@ -299,8 +322,6 @@ void WorldSession::HandleNpcTextQueryOpcode( WorldPacket & recv_data )
uint32 textID;
uint64 guid;
- GossipText *pGossip;
- std::string GossipStr;
recv_data >> textID;
sLog.outDetail("WORLD: CMSG_NPC_TEXT_QUERY ID '%u'", textID);
@@ -308,7 +329,7 @@ void WorldSession::HandleNpcTextQueryOpcode( WorldPacket & recv_data )
recv_data >> guid;
GetPlayer()->SetUInt64Value(UNIT_FIELD_TARGET, guid);
- pGossip = objmgr.GetGossipText(textID);
+ GossipText const* pGossip = objmgr.GetGossipText(textID);
WorldPacket data( SMSG_NPC_TEXT_UPDATE, 100 ); // guess size
data << textID;
@@ -370,14 +391,11 @@ void WorldSession::HandleNpcTextQueryOpcode( WorldPacket & recv_data )
data << pGossip->Options[i].Language;
- data << pGossip->Options[i].Emotes[0]._Delay;
- data << pGossip->Options[i].Emotes[0]._Emote;
-
- data << pGossip->Options[i].Emotes[1]._Delay;
- data << pGossip->Options[i].Emotes[1]._Emote;
-
- data << pGossip->Options[i].Emotes[2]._Delay;
- data << pGossip->Options[i].Emotes[2]._Emote;
+ for(int j = 0; j < 3; ++j)
+ {
+ data << pGossip->Options[i].Emotes[j]._Delay;
+ data << pGossip->Options[i].Emotes[j]._Emote;
+ }
}
}
diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp
index 3e190d67220..bbc344732b8 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -44,88 +44,90 @@ Quest::Quest(Field * questRecord)
QuestFlags = questRecord[17].GetUInt16();
uint32 SpecialFlags = questRecord[18].GetUInt16();
CharTitleId = questRecord[19].GetUInt32();
- PrevQuestId = questRecord[20].GetInt32();
- NextQuestId = questRecord[21].GetInt32();
- ExclusiveGroup = questRecord[22].GetInt32();
- NextQuestInChain = questRecord[23].GetUInt32();
- SrcItemId = questRecord[24].GetUInt32();
- SrcItemCount = questRecord[25].GetUInt32();
- SrcSpell = questRecord[26].GetUInt32();
- Title = questRecord[27].GetCppString();
- Details = questRecord[28].GetCppString();
- Objectives = questRecord[29].GetCppString();
- OfferRewardText = questRecord[30].GetCppString();
- RequestItemsText = questRecord[31].GetCppString();
- EndText = questRecord[32].GetCppString();
+ PlayersSlain = questRecord[20].GetUInt32();
+ BonusTalents = questRecord[21].GetUInt32();
+ PrevQuestId = questRecord[22].GetInt32();
+ NextQuestId = questRecord[23].GetInt32();
+ ExclusiveGroup = questRecord[24].GetInt32();
+ NextQuestInChain = questRecord[25].GetUInt32();
+ SrcItemId = questRecord[26].GetUInt32();
+ SrcItemCount = questRecord[27].GetUInt32();
+ SrcSpell = questRecord[28].GetUInt32();
+ Title = questRecord[29].GetCppString();
+ Details = questRecord[30].GetCppString();
+ Objectives = questRecord[31].GetCppString();
+ OfferRewardText = questRecord[32].GetCppString();
+ RequestItemsText = questRecord[33].GetCppString();
+ EndText = questRecord[34].GetCppString();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ObjectiveText[i] = questRecord[33+i].GetCppString();
+ ObjectiveText[i] = questRecord[35+i].GetCppString();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqItemId[i] = questRecord[37+i].GetUInt32();
+ ReqItemId[i] = questRecord[39+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqItemCount[i] = questRecord[41+i].GetUInt32();
+ ReqItemCount[i] = questRecord[43+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceId[i] = questRecord[45+i].GetUInt32();
+ ReqSourceId[i] = questRecord[47+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceCount[i] = questRecord[49+i].GetUInt32();
+ ReqSourceCount[i] = questRecord[51+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceRef[i] = questRecord[53+i].GetUInt32();
+ ReqSourceRef[i] = questRecord[55+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOId[i] = questRecord[57+i].GetInt32();
+ ReqCreatureOrGOId[i] = questRecord[59+i].GetInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOCount[i] = questRecord[61+i].GetUInt32();
+ ReqCreatureOrGOCount[i] = questRecord[63+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqSpell[i] = questRecord[65+i].GetUInt32();
+ ReqSpell[i] = questRecord[67+i].GetUInt32();
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemId[i] = questRecord[69+i].GetUInt32();
+ RewChoiceItemId[i] = questRecord[71+i].GetUInt32();
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemCount[i] = questRecord[75+i].GetUInt32();
+ RewChoiceItemCount[i] = questRecord[77+i].GetUInt32();
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemId[i] = questRecord[81+i].GetUInt32();
+ RewItemId[i] = questRecord[83+i].GetUInt32();
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemCount[i] = questRecord[85+i].GetUInt32();
+ RewItemCount[i] = questRecord[87+i].GetUInt32();
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepFaction[i] = questRecord[89+i].GetUInt32();
+ RewRepFaction[i] = questRecord[91+i].GetUInt32();
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepValue[i] = questRecord[94+i].GetInt32();
-
- RewHonorableKills = questRecord[99].GetUInt32();
- RewOrReqMoney = questRecord[100].GetInt32();
- RewMoneyMaxLevel = questRecord[101].GetUInt32();
- RewSpell = questRecord[102].GetUInt32();
- RewSpellCast = questRecord[103].GetUInt32();
- RewMailTemplateId = questRecord[104].GetUInt32();
- RewMailDelaySecs = questRecord[105].GetUInt32();
- PointMapId = questRecord[106].GetUInt32();
- PointX = questRecord[107].GetFloat();
- PointY = questRecord[108].GetFloat();
- PointOpt = questRecord[109].GetUInt32();
+ RewRepValue[i] = questRecord[96+i].GetInt32();
+
+ RewHonorableKills = questRecord[101].GetUInt32();
+ RewOrReqMoney = questRecord[102].GetInt32();
+ RewMoneyMaxLevel = questRecord[103].GetUInt32();
+ RewSpell = questRecord[104].GetUInt32();
+ RewSpellCast = questRecord[105].GetUInt32();
+ RewMailTemplateId = questRecord[106].GetUInt32();
+ RewMailDelaySecs = questRecord[107].GetUInt32();
+ PointMapId = questRecord[108].GetUInt32();
+ PointX = questRecord[109].GetFloat();
+ PointY = questRecord[110].GetFloat();
+ PointOpt = questRecord[111].GetUInt32();
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmote[i] = questRecord[110+i].GetUInt32();
+ DetailsEmote[i] = questRecord[112+i].GetUInt32();
- IncompleteEmote = questRecord[114].GetUInt32();
- CompleteEmote = questRecord[115].GetUInt32();
+ IncompleteEmote = questRecord[116].GetUInt32();
+ CompleteEmote = questRecord[117].GetUInt32();
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmote[i] = questRecord[116+i].GetInt32();
+ OfferRewardEmote[i] = questRecord[118+i].GetInt32();
- QuestStartScript = questRecord[120].GetUInt32();
- QuestCompleteScript = questRecord[121].GetUInt32();
+ QuestStartScript = questRecord[122].GetUInt32();
+ QuestCompleteScript = questRecord[123].GetUInt32();
QuestFlags |= SpecialFlags << 16;
@@ -164,18 +166,20 @@ uint32 Quest::XPValue( Player *pPlayer ) const
uint32 pLevel = pPlayer->getLevel();
uint32 qLevel = QuestLevel;
float fullxp = 0;
- if (qLevel >= 65)
+ if (qLevel >= 15)
fullxp = RewMoneyMaxLevel / 6.0f;
- else if (qLevel == 64)
+ else if (qLevel == 14)
fullxp = RewMoneyMaxLevel / 4.8f;
- else if (qLevel == 63)
- fullxp = RewMoneyMaxLevel / 3.6f;
- else if (qLevel == 62)
+ else if (qLevel == 13)
+ fullxp = RewMoneyMaxLevel / 3.666f;
+ else if (qLevel == 12)
fullxp = RewMoneyMaxLevel / 2.4f;
- else if (qLevel == 61)
+ else if (qLevel == 11)
fullxp = RewMoneyMaxLevel / 1.2f;
- else if (qLevel > 0 && qLevel <= 60)
+ else if (qLevel >= 1 && qLevel <= 10)
fullxp = RewMoneyMaxLevel / 0.6f;
+ else if (qLevel == 0)
+ fullxp = RewMoneyMaxLevel;
if( pLevel <= qLevel + 5 )
return (uint32)fullxp;
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index 7b447c611c2..4d4c9829ba8 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -44,30 +44,33 @@ class ObjectMgr;
enum QuestFailedReasons
{
INVALIDREASON_DONT_HAVE_REQ = 0,
- INVALIDREASON_QUEST_FAILED_LOW_LEVEL = 1, //You are not high enough level for that quest.
- INVALIDREASON_QUEST_FAILED_WRONG_RACE = 6, //That quest is not available to your race.
- INVALIDREASON_QUEST_ALREADY_DONE = 7, //You have completed that quest.
- INVALIDREASON_QUEST_ONLY_ONE_TIMED = 12, //You can only be on one timed quest at a time.
- INVALIDREASON_QUEST_ALREADY_ON = 13, //You are already on that quest
- INVALIDREASON_QUEST_FAILED_EXPANSION = 16, //This quest requires an expansion enabled account.
- INVALIDREASON_QUEST_ALREADY_ON2 = 18, //You are already on that quest
- INVALIDREASON_QUEST_FAILED_MISSING_ITEMS = 21, //You don't have the required items with you. Check storage.
- INVALIDREASON_QUEST_FAILED_NOT_ENOUGH_MONEY = 23, //You don't have enough money for that quest.
- INVALIDREASON_DAILY_QUESTS_REMAINING = 26, //You have already completed 10 daily quests today
- INVALIDREASON_QUEST_FAILED_CAIS = 27, //You cannot complete quests once you have reached tired time
+ INVALIDREASON_QUEST_FAILED_LOW_LEVEL = 1, // You are not high enough level for that quest.
+ INVALIDREASON_QUEST_FAILED_WRONG_RACE = 6, // That quest is not available to your race.
+ INVALIDREASON_QUEST_ALREADY_DONE = 7, // You have completed that quest.
+ INVALIDREASON_QUEST_ONLY_ONE_TIMED = 12, // You can only be on one timed quest at a time.
+ INVALIDREASON_QUEST_ALREADY_ON = 13, // You are already on that quest.
+ INVALIDREASON_QUEST_FAILED_EXPANSION = 16, // This quest requires an expansion enabled account.
+ INVALIDREASON_QUEST_ALREADY_ON2 = 18, // You are already on that quest.
+ INVALIDREASON_QUEST_FAILED_MISSING_ITEMS = 21, // You don't have the required items with you. Check storage.
+ INVALIDREASON_QUEST_FAILED_NOT_ENOUGH_MONEY = 23, // You don't have enough money for that quest.
+ INVALIDREASON_DAILY_QUESTS_REMAINING = 26, // You have already completed 25 daily quests today.
+ INVALIDREASON_QUEST_FAILED_CAIS = 27, // You cannot complete quests once you have reached tired time.
+ INVALIDREASON_DAILY_QUEST_COMPLETED_TODAY = 29 // You have completed that daily quest today.
};
enum QuestShareMessages
{
- QUEST_PARTY_MSG_SHARING_QUEST = 0,
- QUEST_PARTY_MSG_CANT_TAKE_QUEST = 1,
- QUEST_PARTY_MSG_ACCEPT_QUEST = 2,
- QUEST_PARTY_MSG_REFUSE_QUEST = 3,
- QUEST_PARTY_MSG_TOO_FAR = 4,
- QUEST_PARTY_MSG_BUSY = 5,
- QUEST_PARTY_MSG_LOG_FULL = 6,
- QUEST_PARTY_MSG_HAVE_QUEST = 7,
- QUEST_PARTY_MSG_FINISH_QUEST = 8,
+ QUEST_PARTY_MSG_SHARING_QUEST = 0,
+ QUEST_PARTY_MSG_CANT_TAKE_QUEST = 1,
+ QUEST_PARTY_MSG_ACCEPT_QUEST = 2,
+ QUEST_PARTY_MSG_DECLINE_QUEST = 3,
+ QUEST_PARTY_MSG_BUSY = 4,
+ QUEST_PARTY_MSG_LOG_FULL = 5,
+ QUEST_PARTY_MSG_HAVE_QUEST = 6,
+ QUEST_PARTY_MSG_FINISH_QUEST = 7,
+ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY = 8,
+ QUEST_PARTY_MSG_SHARING_TIMER_EXPIRED = 9,
+ QUEST_PARTY_MSG_NOT_IN_PARTY = 10
};
enum __QuestTradeSkill
@@ -190,6 +193,8 @@ class Quest
int32 GetExclusiveGroup() const { return ExclusiveGroup; }
uint32 GetNextQuestInChain() const { return NextQuestInChain; }
uint32 GetCharTitleId() const { return CharTitleId; }
+ uint32 GetPlayersSlain() const { return PlayersSlain; }
+ uint32 GetBonusTalents() const { return BonusTalents; }
uint32 GetSrcItemId() const { return SrcItemId; }
uint32 GetSrcItemCount() const { return SrcItemCount; }
uint32 GetSrcSpell() const { return SrcSpell; }
@@ -277,6 +282,8 @@ class Quest
uint32 LimitTime;
uint32 QuestFlags;
uint32 CharTitleId;
+ uint32 PlayersSlain;
+ uint32 BonusTalents;
int32 PrevQuestId;
int32 NextQuestId;
int32 ExclusiveGroup;
diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp
index c447b170d4c..24d02504d33 100644
--- a/src/game/QuestHandler.cpp
+++ b/src/game/QuestHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -180,7 +180,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
bool destroyItem = true;
for(int i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
{
- if ((qInfo->ReqItemId[i] == ((Item*)pObject)->GetEntry()) && (((Item*)pObject)->GetProto()->MaxCount != 0))
+ if ((qInfo->ReqItemId[i] == ((Item*)pObject)->GetEntry()) && (((Item*)pObject)->GetProto()->MaxCount > 0))
{
destroyItem = false;
break;
@@ -451,12 +451,6 @@ void WorldSession::HandleQuestPushToParty(WorldPacket& recvPacket)
_player->SendPushToPartyResponse(pPlayer, QUEST_PARTY_MSG_SHARING_QUEST);
- if( _player->GetDistance( pPlayer ) > 10 )
- {
- _player->SendPushToPartyResponse( pPlayer, QUEST_PARTY_MSG_TOO_FAR );
- continue;
- }
-
if( !pPlayer->SatisfyQuestStatus( pQuest, false ) )
{
_player->SendPushToPartyResponse( pPlayer, QUEST_PARTY_MSG_HAVE_QUEST );
diff --git a/src/game/RandomMovementGenerator.cpp b/src/game/RandomMovementGenerator.cpp
index cb748883772..3e4912d00cd 100644
--- a/src/game/RandomMovementGenerator.cpp
+++ b/src/game/RandomMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/RandomMovementGenerator.h b/src/game/RandomMovementGenerator.h
index a7105284ac6..20afe23d375 100644
--- a/src/game/RandomMovementGenerator.h
+++ b/src/game/RandomMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ReactorAI.cpp b/src/game/ReactorAI.cpp
index d15c71b28ef..7c4d1a73eb6 100644
--- a/src/game/ReactorAI.cpp
+++ b/src/game/ReactorAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ReactorAI.h b/src/game/ReactorAI.h
index a1c99707736..1cc7da43743 100644
--- a/src/game/ReactorAI.h
+++ b/src/game/ReactorAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ScriptCalls.cpp b/src/game/ScriptCalls.cpp
index 37880cc3dfd..c101cd6c10a 100644
--- a/src/game/ScriptCalls.cpp
+++ b/src/game/ScriptCalls.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -86,7 +86,8 @@ bool LoadScriptingModule(char const* libName)
return false;
}
- printf("Scripts Library %s was successfully loaded.\n",name.c_str());
+ sLog.outString();
+ sLog.outString( ">>> Scripts Library %s was successfully loaded.\n", name.c_str() );
//heh we are still there :P we have a valid library
//we reload script
diff --git a/src/game/ScriptCalls.h b/src/game/ScriptCalls.h
index b66f23563de..bb618e5af9f 100644
--- a/src/game/ScriptCalls.h
+++ b/src/game/ScriptCalls.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index dd45d4700fa..f359fab74f6 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -24,6 +24,9 @@
#include "Platform/Define.h"
#include <cassert>
+#define MaNGOS Trinity
+#define GetMangosString GetTrinityString
+
enum Gender
{
GENDER_MALE = 0,
@@ -88,7 +91,8 @@ enum Classes
#define CLASSMASK_ALL_PLAYABLE \
((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| \
(1<<(CLASS_ROGUE-1)) |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| \
- (1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) )
+ (1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | \
+ (1<<(CLASS_DEATH_KNIGHT-1)) )
#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))
@@ -134,11 +138,12 @@ enum Powers
POWER_FOCUS = 2,
POWER_ENERGY = 3,
POWER_HAPPINESS = 4,
- POWER_RUNES = 5,
+ POWER_RUNE = 5,
+ POWER_RUNIC_POWER = 6,
POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
};
-#define MAX_POWERS 5 // not count POWER_RUNES for now
+#define MAX_POWERS 7
enum SpellSchools
{
@@ -199,10 +204,11 @@ enum ItemQualities
ITEM_QUALITY_RARE = 3, //BLUE
ITEM_QUALITY_EPIC = 4, //PURPLE
ITEM_QUALITY_LEGENDARY = 5, //ORANGE
- ITEM_QUALITY_ARTIFACT = 6 //LIGHT YELLOW
+ ITEM_QUALITY_ARTIFACT = 6, //LIGHT YELLOW
+ ITEM_QUALITY_HEIRLOOM = 7
};
-#define MAX_ITEM_QUALITY 7
+#define MAX_ITEM_QUALITY 8
enum SpellCategory
{
@@ -217,7 +223,7 @@ enum SpellCategory
#define SPELL_ATTR_UNK0 0x00000001 // 0
#define SPELL_ATTR_RANGED 0x00000002 // 1 All ranged abilities have this flag
#define SPELL_ATTR_ON_NEXT_SWING_1 0x00000004 // 2 on next swing
-#define SPELL_ATTR_UNK3 0x00000008 // 3 not set in 2.4.2
+#define SPELL_ATTR_UNK3 0x00000008 // 3 not set in 3.0.3
#define SPELL_ATTR_UNK4 0x00000010 // 4
#define SPELL_ATTR_UNK5 0x00000020 // 5 trade spells?
#define SPELL_ATTR_PASSIVE 0x00000040 // 6 Passive spell
@@ -257,7 +263,7 @@ enum SpellCategory
#define SPELL_ATTR_EX_NEGATIVE 0x00000080 // 7
#define SPELL_ATTR_EX_NOT_IN_COMBAT_TARGET 0x00000100 // 8 Spell req target not to be in combat state
#define SPELL_ATTR_EX_UNK9 0x00000200 // 9
-#define SPELL_ATTR_EX_UNK10 0x00000400 // 10
+#define SPELL_ATTR_EX_NO_INITIAL_AGGRO 0x00000400 // 10 no generates threat on cast 100%
#define SPELL_ATTR_EX_UNK11 0x00000800 // 11
#define SPELL_ATTR_EX_UNK12 0x00001000 // 12
#define SPELL_ATTR_EX_UNK13 0x00002000 // 13
@@ -272,7 +278,7 @@ enum SpellCategory
#define SPELL_ATTR_EX_REQ_COMBO_POINTS2 0x00400000 // 22 Req combo points on target
#define SPELL_ATTR_EX_UNK23 0x00800000 // 23
#define SPELL_ATTR_EX_UNK24 0x01000000 // 24 Req fishing pole??
-#define SPELL_ATTR_EX_UNK25 0x02000000 // 25 not set in 2.4.2
+#define SPELL_ATTR_EX_UNK25 0x02000000 // 25
#define SPELL_ATTR_EX_UNK26 0x04000000 // 26
#define SPELL_ATTR_EX_UNK27 0x08000000 // 27
#define SPELL_ATTR_EX_UNK28 0x10000000 // 28
@@ -282,20 +288,20 @@ enum SpellCategory
#define SPELL_ATTR_EX2_UNK0 0x00000001 // 0
#define SPELL_ATTR_EX2_UNK1 0x00000002 // 1
-#define SPELL_ATTR_EX2_UNK2 0x00000004 // 2 boss spells?
+#define SPELL_ATTR_EX2_CANT_REFLECTED 0x00000004 // 2 ? used for detect can or not spell reflected
#define SPELL_ATTR_EX2_UNK3 0x00000008 // 3
#define SPELL_ATTR_EX2_UNK4 0x00000010 // 4
-#define SPELL_ATTR_EX2_UNK5 0x00000020 // 5
+#define SPELL_ATTR_EX2_AUTOREPEAT_FLAG 0x00000020 // 5
#define SPELL_ATTR_EX2_UNK6 0x00000040 // 6
#define SPELL_ATTR_EX2_UNK7 0x00000080 // 7
-#define SPELL_ATTR_EX2_UNK8 0x00000100 // 8 not set in 2.4.2
+#define SPELL_ATTR_EX2_UNK8 0x00000100 // 8 not set in 3.0.3
#define SPELL_ATTR_EX2_UNK9 0x00000200 // 9
#define SPELL_ATTR_EX2_UNK10 0x00000400 // 10
#define SPELL_ATTR_EX2_HEALTH_FUNNEL 0x00000800 // 11
#define SPELL_ATTR_EX2_UNK12 0x00001000 // 12
#define SPELL_ATTR_EX2_UNK13 0x00002000 // 13
#define SPELL_ATTR_EX2_UNK14 0x00004000 // 14
-#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 2.4.2
+#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 3.0.3
#define SPELL_ATTR_EX2_TAME_BEAST 0x00010000 // 16
#define SPELL_ATTR_EX2_NOT_RESET_AUTOSHOT 0x00020000 // 17 Hunters Shot and Stings only have this flag
#define SPELL_ATTR_EX2_UNK18 0x00040000 // 18 Only Revive pet - possible req dead pet
@@ -308,7 +314,7 @@ enum SpellCategory
#define SPELL_ATTR_EX2_UNK25 0x02000000 // 25
#define SPELL_ATTR_EX2_UNK26 0x04000000 // 26 unaffected by school immunity
#define SPELL_ATTR_EX2_UNK27 0x08000000 // 27
-#define SPELL_ATTR_EX2_UNK28 0x10000000 // 28
+#define SPELL_ATTR_EX2_UNK28 0x10000000 // 28 no breaks stealth if it fails??
#define SPELL_ATTR_EX2_CANT_CRIT 0x20000000 // 29 Spell can't crit
#define SPELL_ATTR_EX2_UNK30 0x40000000 // 30
#define SPELL_ATTR_EX2_FOOD 0x80000000 // 31 food, well-fed, and a few others
@@ -329,8 +335,8 @@ enum SpellCategory
#define SPELL_ATTR_EX3_UNK13 0x00002000 // 13
#define SPELL_ATTR_EX3_UNK14 0x00004000 // 14 "Honorless Target" only this spells have this flag
#define SPELL_ATTR_EX3_UNK15 0x00008000 // 15 Auto Shoot, Shoot, Throw, - this is autoshot flag
-#define SPELL_ATTR_EX3_UNK16 0x00010000 // 16
-#define SPELL_ATTR_EX3_NO_INITIAL_AGGRO 0x00020000 // 17 no initial aggro
+#define SPELL_ATTR_EX3_UNK16 0x00010000 // 16 no triggers effects that trigger on casting a spell??
+#define SPELL_ATTR_EX3_UNK17 0x00020000 // 17 no triggers effects that trigger on casting a spell??
#define SPELL_ATTR_EX3_UNK18 0x00040000 // 18
#define SPELL_ATTR_EX3_UNK19 0x00080000 // 19
#define SPELL_ATTR_EX3_DEATH_PERSISTENT 0x00100000 // 20 Death persistent spells
@@ -338,7 +344,7 @@ enum SpellCategory
#define SPELL_ATTR_EX3_REQ_WAND 0x00400000 // 22 Req wand
#define SPELL_ATTR_EX3_UNK23 0x00800000 // 23
#define SPELL_ATTR_EX3_REQ_OFFHAND 0x01000000 // 24 Req offhand weapon
-#define SPELL_ATTR_EX3_UNK25 0x02000000 // 25
+#define SPELL_ATTR_EX3_UNK25 0x02000000 // 25 no cause spell pushback ?
#define SPELL_ATTR_EX3_UNK26 0x04000000 // 26
#define SPELL_ATTR_EX3_UNK27 0x08000000 // 27
#define SPELL_ATTR_EX3_UNK28 0x10000000 // 28
@@ -350,7 +356,7 @@ enum SpellCategory
#define SPELL_ATTR_EX4_UNK1 0x00000002 // 1 proc on finishing move?
#define SPELL_ATTR_EX4_UNK2 0x00000004 // 2
#define SPELL_ATTR_EX4_UNK3 0x00000008 // 3
-#define SPELL_ATTR_EX4_UNK4 0x00000010 // 4
+#define SPELL_ATTR_EX4_UNK4 0x00000010 // 4 This will no longer cause guards to attack on use??
#define SPELL_ATTR_EX4_UNK5 0x00000020 // 5
#define SPELL_ATTR_EX4_UNK6 0x00000040 // 6
#define SPELL_ATTR_EX4_UNK7 0x00000080 // 7
@@ -388,7 +394,7 @@ enum SpellCategory
#define SPELL_ATTR_EX5_UNK6 0x00000040 // 6
#define SPELL_ATTR_EX5_UNK7 0x00000080 // 7
#define SPELL_ATTR_EX5_UNK8 0x00000100 // 8
-#define SPELL_ATTR_EX5_UNK9 0x00000200 // 9
+#define SPELL_ATTR_EX5_START_PERIODIC_AT_APPLY 0x00000200 // 9 begin periodic tick at aura apply
#define SPELL_ATTR_EX5_UNK10 0x00000400 // 10
#define SPELL_ATTR_EX5_UNK11 0x00000800 // 11
#define SPELL_ATTR_EX5_UNK12 0x00001000 // 12
@@ -413,37 +419,39 @@ enum SpellCategory
#define SPELL_ATTR_EX5_UNK31 0x80000000 // 31 Forces all nearby enemies to focus attacks caster
#define SPELL_ATTR_EX6_UNK0 0x00000001 // 0 Only Move spell have this flag
-#define SPELL_ATTR_EX6_UNK1 0x00000002 // 1 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK1 0x00000002 // 1 not set in 3.0.3
#define SPELL_ATTR_EX6_UNK2 0x00000004 // 2
#define SPELL_ATTR_EX6_UNK3 0x00000008 // 3
-#define SPELL_ATTR_EX6_UNK4 0x00000010 // 4 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK4 0x00000010 // 4
#define SPELL_ATTR_EX6_UNK5 0x00000020 // 5
#define SPELL_ATTR_EX6_UNK6 0x00000040 // 6
#define SPELL_ATTR_EX6_UNK7 0x00000080 // 7
#define SPELL_ATTR_EX6_UNK8 0x00000100 // 8
-#define SPELL_ATTR_EX6_UNK9 0x00000200 // 9 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK9 0x00000200 // 9
#define SPELL_ATTR_EX6_UNK10 0x00000400 // 10
#define SPELL_ATTR_EX6_UNK11 0x00000800 // 11
-#define SPELL_ATTR_EX6_UNK12 0x00001000 // 12 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK13 0x00002000 // 13 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK14 0x00004000 // 14 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK15 0x00008000 // 15 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK16 0x00010000 // 16 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK17 0x00020000 // 17 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK18 0x00040000 // 18 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK19 0x00080000 // 19 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK20 0x00100000 // 20 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK21 0x00200000 // 21 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK22 0x00400000 // 22 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK23 0x00800000 // 23 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK24 0x01000000 // 24 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK25 0x02000000 // 25 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK26 0x04000000 // 26 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK27 0x08000000 // 27 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK28 0x10000000 // 28 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK29 0x20000000 // 29 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK30 0x40000000 // 30 not set in 2.4.2
-#define SPELL_ATTR_EX6_UNK31 0x80000000 // 31 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK12 0x00001000 // 12
+#define SPELL_ATTR_EX6_UNK13 0x00002000 // 13
+#define SPELL_ATTR_EX6_UNK14 0x00004000 // 14
+#define SPELL_ATTR_EX6_UNK15 0x00008000 // 15 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK16 0x00010000 // 16
+#define SPELL_ATTR_EX6_UNK17 0x00020000 // 17
+#define SPELL_ATTR_EX6_UNK18 0x00040000 // 18
+#define SPELL_ATTR_EX6_UNK19 0x00080000 // 19
+#define SPELL_ATTR_EX6_UNK20 0x00100000 // 20
+#define SPELL_ATTR_EX6_UNK21 0x00200000 // 21
+#define SPELL_ATTR_EX6_UNK22 0x00400000 // 22
+#define SPELL_ATTR_EX6_UNK23 0x00800000 // 23 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK24 0x01000000 // 24 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK25 0x02000000 // 25 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK26 0x04000000 // 26 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK27 0x08000000 // 27 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK28 0x10000000 // 28 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK29 0x20000000 // 29 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK30 0x40000000 // 30 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK31 0x80000000 // 31 not set in 3.0.3
+
+#define MAX_GLYPH_SLOT_INDEX 5
enum SheathTypes
{
@@ -562,11 +570,11 @@ enum SpellEffects
SPELL_EFFECT_DISPEL = 38,
SPELL_EFFECT_LANGUAGE = 39,
SPELL_EFFECT_DUAL_WIELD = 40,
- SPELL_EFFECT_SUMMON_WILD = 41,
- SPELL_EFFECT_SUMMON_GUARDIAN = 42,
+ SPELL_EFFECT_JUMP = 41,
+ SPELL_EFFECT_JUMP2 = 42,
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
SPELL_EFFECT_SKILL_STEP = 44,
- SPELL_EFFECT_UNDEFINED_45 = 45,
+ SPELL_EFFECT_ADD_HONOR = 45,
SPELL_EFFECT_SPAWN = 46,
SPELL_EFFECT_TRADE_SKILL = 47,
SPELL_EFFECT_STEALTH = 48,
@@ -586,16 +594,16 @@ enum SpellEffects
SPELL_EFFECT_POWER_BURN = 62,
SPELL_EFFECT_THREAT = 63,
SPELL_EFFECT_TRIGGER_SPELL = 64,
- SPELL_EFFECT_HEALTH_FUNNEL = 65,
- SPELL_EFFECT_POWER_FUNNEL = 66,
+ SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
+ SPELL_EFFECT_CREATE_MANA_GEM = 66,
SPELL_EFFECT_HEAL_MAX_HEALTH = 67,
SPELL_EFFECT_INTERRUPT_CAST = 68,
SPELL_EFFECT_DISTRACT = 69,
SPELL_EFFECT_PULL = 70,
SPELL_EFFECT_PICKPOCKET = 71,
SPELL_EFFECT_ADD_FARSIGHT = 72,
- SPELL_EFFECT_SUMMON_POSSESSED = 73,
- SPELL_EFFECT_SUMMON_TOTEM = 74,
+ SPELL_EFFECT_UNTRAIN_TALENTS = 73,
+ SPELL_EFFECT_APPLY_GLYPH = 74,
SPELL_EFFECT_HEAL_MECHANICAL = 75,
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
SPELL_EFFECT_SCRIPT_EFFECT = 77,
@@ -608,17 +616,17 @@ enum SpellEffects
SPELL_EFFECT_STUCK = 84,
SPELL_EFFECT_SUMMON_PLAYER = 85,
SPELL_EFFECT_ACTIVATE_OBJECT = 86,
- SPELL_EFFECT_SUMMON_TOTEM_SLOT1 = 87,
- SPELL_EFFECT_SUMMON_TOTEM_SLOT2 = 88,
- SPELL_EFFECT_SUMMON_TOTEM_SLOT3 = 89,
- SPELL_EFFECT_SUMMON_TOTEM_SLOT4 = 90,
+ SPELL_EFFECT_WMO_DAMAGE = 87,
+ SPELL_EFFECT_WMO_REPAIR = 88,
+ SPELL_EFFECT_WMO_CHANGE = 89,
+ SPELL_EFFECT_KILL_CREDIT = 90,
SPELL_EFFECT_THREAT_ALL = 91,
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
SPELL_EFFECT_SUMMON_PHANTASM = 93, //unused
SPELL_EFFECT_SELF_RESURRECT = 94,
SPELL_EFFECT_SKINNING = 95,
SPELL_EFFECT_CHARGE = 96,
- SPELL_EFFECT_SUMMON_CRITTER = 97,
+ SPELL_EFFECT_97 = 97,
SPELL_EFFECT_KNOCK_BACK = 98,
SPELL_EFFECT_DISENCHANT = 99,
SPELL_EFFECT_INEBRIATE = 100,
@@ -633,7 +641,7 @@ enum SpellEffects
SPELL_EFFECT_SUMMON_DEAD_PET = 109,
SPELL_EFFECT_DESTROY_ALL_TOTEMS = 110,
SPELL_EFFECT_DURABILITY_DAMAGE = 111,
- SPELL_EFFECT_SUMMON_DEMON = 112,
+ SPELL_EFFECT_112 = 112,
SPELL_EFFECT_RESURRECT_NEW = 113,
SPELL_EFFECT_ATTACK_ME = 114,
SPELL_EFFECT_DURABILITY_DAMAGE_PCT = 115,
@@ -655,19 +663,19 @@ enum SpellEffects
SPELL_EFFECT_131 = 131,
SPELL_EFFECT_132 = 132,
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
- SPELL_EFFECT_KILL_CREDIT = 134,
+ SPELL_EFFECT_KILL_CREDIT2 = 134,
SPELL_EFFECT_135 = 135,
SPELL_EFFECT_HEAL_PCT = 136,
SPELL_EFFECT_ENERGIZE_PCT = 137,
SPELL_EFFECT_138 = 138,
- SPELL_EFFECT_139 = 139,
+ SPELL_EFFECT_CLEAR_QUEST = 139,
SPELL_EFFECT_FORCE_CAST = 140,
SPELL_EFFECT_141 = 141,
SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
SPELL_EFFECT_KNOCK_BACK_2 = 144,
SPELL_EFFECT_145 = 145,
- SPELL_EFFECT_146 = 146,
+ SPELL_EFFECT_ACTIVATE_RUNE = 146,
SPELL_EFFECT_QUEST_FAIL = 147,
SPELL_EFFECT_148 = 148,
SPELL_EFFECT_149 = 149,
@@ -675,7 +683,13 @@ enum SpellEffects
SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
SPELL_EFFECT_152 = 152,
SPELL_EFFECT_153 = 153,
- TOTAL_SPELL_EFFECTS = 154
+ SPELL_EFFECT_154 = 154,
+ SPELL_EFFECT_TITAN_GRIP = 155,
+ SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC = 156,
+ SPELL_EFFECT_CREATE_ITEM_2 = 157,
+ SPELL_EFFECT_MILLING = 158,
+ SPELL_EFFECT_ALLOW_RENAME_PET = 159,
+ TOTAL_SPELL_EFFECTS = 160
};
// Spell aura states
@@ -685,25 +699,28 @@ enum AuraState
AURA_STATE_DEFENSE = 1, // C |
AURA_STATE_HEALTHLESS_20_PERCENT = 2, // CcT |
AURA_STATE_BERSERKING = 3, // C T |
- //AURA_STATE_UNKNOWN4 = 4, // c t| some limitation to charge spells (?) and target test spells
+ AURA_STATE_FROZEN = 4, // c t| frozen target
AURA_STATE_JUDGEMENT = 5, // C |
//AURA_STATE_UNKNOWN6 = 6, // | not used
AURA_STATE_HUNTER_PARRY = 7, // C |
AURA_STATE_ROGUE_ATTACK_FROM_STEALTH = 7, // C | FIX ME: not implemented yet!
- //AURA_STATE_UNKNOWN7c = 7, // c | random/focused bursts spells (?)
+ //AURA_STATE_UNKNOWN7 = 7, // c | random/focused bursts spells (?)
//AURA_STATE_UNKNOWN8 = 8, // | not used
//AURA_STATE_UNKNOWN9 = 9, // | not used
AURA_STATE_WARRIOR_VICTORY_RUSH = 10, // C | warrior victory rush
- AURA_STATE_HUNTER_CRIT_STRIKE = 10, // C | hunter crit strike
- AURA_STATE_CRIT = 11, // C |
+ //AURA_STATE_UNKNOWN11 = 11, // t|
AURA_STATE_FAERIE_FIRE = 12, // c t|
AURA_STATE_HEALTHLESS_35_PERCENT = 13, // C T |
AURA_STATE_IMMOLATE = 14, // T |
AURA_STATE_SWIFTMEND = 15, // T |
AURA_STATE_DEADLY_POISON = 16, // T |
- AURA_STATE_FORBEARANCE = 17, // c t|
- AURA_STATE_WEAKENED_SOUL = 18, // t|
- AURA_STATE_HYPOTHERMIA = 19 // c |
+ AURA_STATE_ENRAGE = 17, // C |
+ //AURA_STATE_UNKNOWN18 = 18, // C t|
+ //AURA_STATE_UNKNOWN19 = 19, // | not used
+ //AURA_STATE_UNKNOWN20 = 20, // c | only (45317 Suicide)
+ //AURA_STATE_UNKNOWN21 = 21, // | not used
+ //AURA_STATE_UNKNOWN22 = 22, // C | not implemented yet (Requires Evasive Charges to use)
+ AURA_STATE_HEALTH_ABOVE_75_PERCENT = 23, // C |
};
// Spell mechanics
@@ -711,11 +728,11 @@ enum Mechanics
{
MECHANIC_NONE = 0,
MECHANIC_CHARM = 1,
- MECHANIC_CONFUSED = 2,
+ MECHANIC_DISORIENTED = 2,
MECHANIC_DISARM = 3,
MECHANIC_DISTRACT = 4,
MECHANIC_FEAR = 5,
- MECHANIC_FUMBLE = 6,
+ MECHANIC_GRIP = 6,
MECHANIC_ROOT = 7,
MECHANIC_PACIFY = 8, //0 spells use this mechanic
MECHANIC_SILENCE = 9,
@@ -731,7 +748,7 @@ enum Mechanics
MECHANIC_SHIELD = 19,
MECHANIC_SHACKLE = 20,
MECHANIC_MOUNT = 21,
- MECHANIC_PERSUADE = 22, //0 spells use this mechanic
+ MECHANIC_INFECTED = 22,
MECHANIC_TURN = 23,
MECHANIC_HORROR = 24,
MECHANIC_INVULNERABILITY = 25,
@@ -739,12 +756,13 @@ enum Mechanics
MECHANIC_DAZE = 27,
MECHANIC_DISCOVERY = 28,
MECHANIC_IMMUNE_SHIELD = 29, // Divine (Blessing) Shield/Protection and Ice Block
- MECHANIC_SAPPED = 30
+ MECHANIC_SAPPED = 30,
+ MECHANIC_ENRAGED = 31
};
// Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967da6)
#define IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK ( \
- (1<<MECHANIC_CHARM )|(1<<MECHANIC_CONFUSED )|(1<<MECHANIC_FEAR )| \
+ (1<<MECHANIC_CHARM )|(1<<MECHANIC_DISORIENTED )|(1<<MECHANIC_FEAR )| \
(1<<MECHANIC_ROOT )|(1<<MECHANIC_PACIFY )|(1<<MECHANIC_SLEEP )| \
(1<<MECHANIC_SNARE )|(1<<MECHANIC_STUN )|(1<<MECHANIC_FREEZE)| \
(1<<MECHANIC_KNOCKOUT)|(1<<MECHANIC_POLYMORPH)|(1<<MECHANIC_BANISH)| \
@@ -764,7 +782,8 @@ enum DispelType
DISPEL_ALL = 7,
DISPEL_SPE_NPC_ONLY = 8,
DISPEL_ENRAGE = 9,
- DISPEL_ZG_TICKET = 10
+ DISPEL_ZG_TICKET = 10,
+ DESPEL_OLD_UNUSED = 11
};
#define DISPEL_ALL_MASK ( (1<<DISPEL_MAGIC) | (1<<DISPEL_CURSE) | (1<<DISPEL_DISEASE) | (1<<DISPEL_POISON) )
@@ -790,10 +809,9 @@ enum Targets
{
TARGET_SELF = 1,
TARGET_UNIT_CASTER = 1,
- TARGET_RANDOM_ENEMY_CHAIN_IN_AREA = 2, // only one spell has that, but regardless, it's a target type after all
- //TARGET_UNIT_NEARBY_ENEMY
- TARGET_UNIT_SINGLE_UNKNOWN = 3,
- TARGET_UNIT_NEARBY_ALLY = 4,
+ TARGET_UNIT_NEARBY_ENEMY = 2,
+ TARGET_UNIT_NEARBY_ALLY = 3,
+ TARGET_UNIT_NEARBY_ALLY_UNK = 4,
TARGET_PET = 5,
TARGET_UNIT_PET = 5,
TARGET_CHAIN_DAMAGE = 6,
@@ -816,7 +834,6 @@ enum Targets
TARGET_UNIT_PARTY_CASTER = 20,
TARGET_SINGLE_FRIEND = 21,
TARGET_UNIT_TARGET_ALLY = 21,
- TARGET_ALL_AROUND_CASTER = 22, // used only in TargetA, target selection dependent from TargetB
TARGET_DEST_CASTER = 22,
TARGET_GAMEOBJECT = 23,
//TARGET_OBJECT_OPEN
@@ -986,9 +1003,10 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_BARBER_CHAIR = 32,
GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33,
GAMEOBJECT_TYPE_GUILD_BANK = 34,
+ GAMEOBJECT_TYPE_TRAPDOOR = 35
};
-#define MAX_GAMEOBJECT_TYPE 35 // sending to client this or greater value can crash client.
+#define MAX_GAMEOBJECT_TYPE 36 // sending to client this or greater value can crash client.
#define GAMEOBJECT_FISHINGNODE_ENTRY 35591 // Better to define it somewhere instead of hardcoding everywhere
@@ -1555,7 +1573,9 @@ enum LockType
LOCKTYPE_BLASTING = 16,
LOCKTYPE_SLOW_OPEN = 17,
LOCKTYPE_SLOW_CLOSE = 18,
- LOCKTYPE_FISHING = 19
+ LOCKTYPE_FISHING = 19,
+ LOCKTYPE_INSCRIPTION = 20,
+ LOCKTYPE_OPEN_FROM_VEHICLE = 21
};
enum TrainerType // this is important type for npcs!
@@ -1568,6 +1588,7 @@ enum TrainerType // this is important
#define MAX_TRAINER_TYPE 4
+// CreatureType.dbc
enum CreatureType
{
CREATURE_TYPE_BEAST = 1,
@@ -1587,6 +1608,7 @@ enum CreatureType
uint32 const CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD = (1 << (CREATURE_TYPE_HUMANOID-1)) | (1 << (CREATURE_TYPE_UNDEAD-1));
+// CreatureFamily.dbc
enum CreatureFamily
{
CREATURE_FAMILY_WOLF = 1,
@@ -1598,6 +1620,7 @@ enum CreatureFamily
CREATURE_FAMILY_CARRION_BIRD = 7,
CREATURE_FAMILY_CRAB = 8,
CREATURE_FAMILY_GORILLA = 9,
+ CREATURE_FAMILY_HORSE_CUSTOM = 10, // not exist in DBC but used for horse like beasts in DB
CREATURE_FAMILY_RAPTOR = 11,
CREATURE_FAMILY_TALLSTRIDER = 12,
CREATURE_FAMILY_FELHUNTER = 15,
@@ -1609,7 +1632,7 @@ enum CreatureFamily
CREATURE_FAMILY_IMP = 23,
CREATURE_FAMILY_BAT = 24,
CREATURE_FAMILY_HYENA = 25,
- CREATURE_FAMILY_OWL = 26,
+ CREATURE_FAMILY_BIRD_OF_PREY = 26,
CREATURE_FAMILY_WIND_SERPENT = 27,
CREATURE_FAMILY_REMOTE_CONTROL = 28,
CREATURE_FAMILY_FELGUARD = 29,
@@ -1619,14 +1642,24 @@ enum CreatureFamily
CREATURE_FAMILY_SPOREBAT = 33,
CREATURE_FAMILY_NETHER_RAY = 34,
CREATURE_FAMILY_SERPENT = 35,
- CREATURE_FAMILY_SEA_LION = 36
+ CREATURE_FAMILY_MOTH = 37,
+ CREATURE_FAMILY_CHIMAERA = 38,
+ CREATURE_FAMILY_DEVILSAUR = 39,
+ CREATURE_FAMILY_GHOUL = 40,
+ CREATURE_FAMILY_SILITHID = 41,
+ CREATURE_FAMILY_WORM = 42,
+ CREATURE_FAMILY_RHINO = 43,
+ CREATURE_FAMILY_WASP = 44,
+ CREATURE_FAMILY_CORE_HOUND = 45,
+ CREATURE_FAMILY_SPIRIT_BEAST = 46
};
enum CreatureTypeFlags
{
- CREATURE_TYPEFLAGS_TAMEABLE = 0x0001,
- CREATURE_TYPEFLAGS_HERBLOOT = 0x0100,
- CREATURE_TYPEFLAGS_MININGLOOT = 0x0200
+ CREATURE_TYPEFLAGS_TAMEABLE = 0x0001,
+ CREATURE_TYPEFLAGS_HERBLOOT = 0x0100,
+ CREATURE_TYPEFLAGS_MININGLOOT = 0x0200,
+ CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x8000
};
enum CreatureEliteType
@@ -1651,6 +1684,8 @@ enum QuestTypes
QUEST_TYPE_LEGENDARY = 83,
QUEST_TYPE_ESCORT = 84,
QUEST_TYPE_HEROIC = 85,
+ QUEST_TYPE_RAID_10 = 88,
+ QUEST_TYPE_RAID_25 = 89
};
// values based at QuestSort.dbc
@@ -1661,7 +1696,7 @@ enum QuestSort
QUEST_SORT_SEASONAL = 22,
QUEST_SORT_UNDERCITY_OLD = 23,
QUEST_SORT_HERBALISM = 24,
- QUEST_SORT_SCARLET_MONASTERY_OLD= 25,
+ QUEST_SORT_BATTLEGROUNDS = 25,
QUEST_SORT_ULDAMN_OLD = 41,
QUEST_SORT_WARLOCK = 61,
QUEST_SORT_WARRIOR = 81,
@@ -1690,22 +1725,26 @@ enum QuestSort
QUEST_SORT_REPUTATION = 367,
QUEST_SORT_INVASION = 368,
QUEST_SORT_MIDSUMMER = 369,
- QUEST_SORT_BREWFEST = 370
+ QUEST_SORT_BREWFEST = 370,
+ QUEST_SORT_INSCRIPTION = 371,
+ QUEST_SORT_DEATH_KNIGHT = 372,
+ QUEST_SORT_JEWELCRAFTING = 373
};
inline uint8 ClassByQuestSort(int32 QuestSort)
{
switch(QuestSort)
{
- case QUEST_SORT_WARLOCK: return CLASS_WARLOCK;
- case QUEST_SORT_WARRIOR: return CLASS_WARRIOR;
- case QUEST_SORT_SHAMAN: return CLASS_SHAMAN;
- case QUEST_SORT_PALADIN: return CLASS_PALADIN;
- case QUEST_SORT_MAGE: return CLASS_MAGE;
- case QUEST_SORT_ROGUE: return CLASS_ROGUE;
- case QUEST_SORT_HUNTER: return CLASS_HUNTER;
- case QUEST_SORT_PRIEST: return CLASS_PRIEST;
- case QUEST_SORT_DRUID: return CLASS_DRUID;
+ case QUEST_SORT_WARLOCK: return CLASS_WARLOCK;
+ case QUEST_SORT_WARRIOR: return CLASS_WARRIOR;
+ case QUEST_SORT_SHAMAN: return CLASS_SHAMAN;
+ case QUEST_SORT_PALADIN: return CLASS_PALADIN;
+ case QUEST_SORT_MAGE: return CLASS_MAGE;
+ case QUEST_SORT_ROGUE: return CLASS_ROGUE;
+ case QUEST_SORT_HUNTER: return CLASS_HUNTER;
+ case QUEST_SORT_PRIEST: return CLASS_PRIEST;
+ case QUEST_SORT_DRUID: return CLASS_DRUID;
+ case QUEST_SORT_DEATH_KNIGHT: return CLASS_DEATH_KNIGHT;
}
return 0;
}
@@ -1717,7 +1756,6 @@ enum SkillType
SKILL_ARMS = 26,
SKILL_COMBAT = 38,
SKILL_SUBTLETY = 39,
- SKILL_POISONS = 40,
SKILL_SWORDS = 43,
SKILL_AXES = 44,
SKILL_BOWS = 45,
@@ -1725,8 +1763,8 @@ enum SkillType
SKILL_BEAST_MASTERY = 50,
SKILL_SURVIVAL = 51,
SKILL_MACES = 54,
- SKILL_HOLY = 56,
SKILL_2H_SWORDS = 55,
+ SKILL_HOLY = 56,
SKILL_SHADOW = 78,
SKILL_DEFENSE = 95,
SKILL_LANG_COMMON = 98,
@@ -1782,24 +1820,20 @@ enum SkillType
SKILL_PET_BOAR = 211,
SKILL_PET_CROCILISK = 212,
SKILL_PET_CARRION_BIRD = 213,
- SKILL_PET_GORILLA = 215,
SKILL_PET_CRAB = 214,
+ SKILL_PET_GORILLA = 215,
SKILL_PET_RAPTOR = 217,
SKILL_PET_TALLSTRIDER = 218,
SKILL_RACIAL_UNDED = 220,
- SKILL_WEAPON_TALENTS = 222,
SKILL_CROSSBOWS = 226,
- SKILL_SPEARS = 227,
SKILL_WANDS = 228,
SKILL_POLEARMS = 229,
SKILL_PET_SCORPID = 236,
SKILL_ARCANE = 237,
- SKILL_OPEN_LOCK = 242,
SKILL_PET_TURTLE = 251,
SKILL_ASSASSINATION = 253,
SKILL_FURY = 256,
SKILL_PROTECTION = 257,
- SKILL_BEAST_TRAINING = 261,
SKILL_PROTECTION2 = 267,
SKILL_PET_TALENTS = 270,
SKILL_PLATE_MAIL = 293,
@@ -1829,7 +1863,7 @@ enum SkillType
SKILL_LOCKPICKING = 633,
SKILL_PET_BAT = 653,
SKILL_PET_HYENA = 654,
- SKILL_PET_OWL = 655,
+ SKILL_PET_BIRD_OF_PREY = 655,
SKILL_PET_WIND_SERPENT = 656,
SKILL_LANG_GUTTERSPEAK = 673,
SKILL_RIDING_KODO = 713,
@@ -1849,10 +1883,27 @@ enum SkillType
SKILL_PET_WARP_STALKER = 766,
SKILL_PET_RAVAGER = 767,
SKILL_PET_SERPENT = 768,
- SKILL_INTERNAL = 769
+ SKILL_INTERNAL = 769,
+ SKILL_DK_BLOOD = 770,
+ SKILL_DK_FROST = 771,
+ SKILL_DK_UNHOLY = 772,
+ SKILL_INSCRIPTION = 773,
+ SKILL_PET_MOTH = 775,
+ SKILL_RUNEFORGING = 776,
+ SKILL_MOUNTS = 777,
+ SKILL_COMPANIONS = 778,
+ SKILL_PET_EXOTIC_CHIMAERA = 780,
+ SKILL_PET_EXOTIC_DEVILSAUR = 781,
+ SKILL_PET_GHOUL = 782,
+ SKILL_PET_EXOTIC_SILITHID = 783,
+ SKILL_PET_EXOTIC_WORM = 784,
+ SKILL_PET_WASP = 785,
+ SKILL_PET_EXOTIC_RHINO = 786,
+ SKILL_PET_EXOTIC_CORE_HOUND = 787,
+ SKILL_PET_EXOTIC_SPIRIT_BEAST = 788
};
-#define MAX_SKILL_TYPE 770
+#define MAX_SKILL_TYPE 789
inline uint32 SkillByQuestSort(int32 QuestSort)
{
@@ -1867,25 +1918,27 @@ inline uint32 SkillByQuestSort(int32 QuestSort)
case QUEST_SORT_TAILORING: return SKILL_TAILORING;
case QUEST_SORT_COOKING: return SKILL_COOKING;
case QUEST_SORT_FIRST_AID: return SKILL_FIRST_AID;
+ case QUEST_SORT_JEWELCRAFTING: return SKILL_JEWELCRAFTING;
+ case QUEST_SORT_INSCRIPTION: return SKILL_INSCRIPTION;
}
return 0;
}
enum SkillCategory
{
- SKILL_CATEGORY_ATTRIBUTES = 5,
- SKILL_CATEGORY_WEAPON = 6,
- SKILL_CATEGORY_CLASS = 7,
- SKILL_CATEGORY_ARMOR = 8,
- SKILL_CATEGORY_SECONDARY = 9, // secondary professions
+ SKILL_CATEGORY_ATTRIBUTES = 5,
+ SKILL_CATEGORY_WEAPON = 6,
+ SKILL_CATEGORY_CLASS = 7,
+ SKILL_CATEGORY_ARMOR = 8,
+ SKILL_CATEGORY_SECONDARY = 9, // secondary professions
SKILL_CATEGORY_LANGUAGES = 10,
SKILL_CATEGORY_PROFESSION = 11, // primary professions
- SKILL_CATEGORY_NOT_DISPLAYED = 12
+ SKILL_CATEGORY_GENERIC = 12
};
enum TotemCategory
{
- TC_SKINNING_SKIFE = 1,
+ TC_SKINNING_SKIFE_OLD = 1,
TC_EARTH_TOTEM = 2,
TC_AIR_TOTEM = 3,
TC_FIRE_TOTEM = 4,
@@ -1895,15 +1948,28 @@ enum TotemCategory
TC_GOLDEN_ROD = 8,
TC_TRUESILVER_ROD = 9,
TC_ARCANITE_ROD = 10,
- TC_MINING_PICK = 11,
+ TC_MINING_PICK_OLD = 11,
TC_PHILOSOPHERS_STONE = 12,
- TC_BLACKSMITH_HAMMER = 13,
+ TC_BLACKSMITH_HAMMER_OLD = 13,
TC_ARCLIGHT_SPANNER = 14,
TC_GYROMATIC_MA = 15,
TC_MASTER_TOTEM = 21,
TC_FEL_IRON_ROD = 41,
TC_ADAMANTITE_ROD = 62,
- TC_ETERNIUM_ROD = 63
+ TC_ETERNIUM_ROD = 63,
+ TC_HOLLOW_QUILL = 81,
+ TC_RUNED_AZURITE_ROD = 101,
+ TC_VIRTUOSO_INKING_SET = 121,
+ TC_DRUMS = 141,
+ TC_GNOMISH_ARMY_KNIFE = 161,
+ TC_BLACKSMITH_HAMMER = 162,
+ TC_MINING_PICK = 165,
+ TC_SKINNING_KNIFE = 166,
+ TC_HAMMER_PICK = 167,
+ TC_BLADED_PICKAXE = 168,
+ TC_FLINT_AND_TINDER = 169,
+ TC_RUNED_COBALT_ROD = 189,
+ TC_RUNED_TITANIUM_ROD = 190
};
enum UnitDynFlags
@@ -1913,7 +1979,8 @@ enum UnitDynFlags
UNIT_DYNFLAG_OTHER_TAGGER = 0x0004,
UNIT_DYNFLAG_ROOTED = 0x0008,
UNIT_DYNFLAG_SPECIALINFO = 0x0010,
- UNIT_DYNFLAG_DEAD = 0x0020
+ UNIT_DYNFLAG_DEAD = 0x0020,
+ UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040
};
enum CorpseDynFlags
@@ -1922,11 +1989,14 @@ enum CorpseDynFlags
};
// Passive Spell codes explicit used in code
-#define SPELL_ID_GENERIC_LEARN 483
-#define SPELL_ID_PASSIVE_BATTLE_STANCE 2457
-#define SPELL_ID_PASSIVE_RESURRECTION_SICKNESS 15007
-#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_5s 6119
-#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_0s 6123
+#define SPELL_ID_GENERIC_LEARN 483
+#define SPELL_ID_GENERIC_LEARN_PET 55884 // used for learning mounts and companions
+#define SPELL_ID_PASSIVE_BATTLE_STANCE 2457
+#define SPELL_ID_PASSIVE_RESURRECTION_SICKNESS 15007
+#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_5s 6119
+#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_0s 6123
+#define SPELL_ID_AUTOSHOT 75 // used for checks in other spells interruption
+#define SPELL_ID_SHADOWMELD 58984 // used for check ignore stealth stance state
enum WeatherType
{
@@ -1990,9 +2060,12 @@ enum ChatMsg
CHAT_MSG_BATTLEGROUND = 0x2C,
CHAT_MSG_BATTLEGROUND_LEADER = 0x2D,
CHAT_MSG_RESTRICTED = 0x2E,
+ CHAT_MSG_BN = 0x2F,
+ CHAT_MSG_ACHIEVEMENT = 0x30,
+ CHAT_MSG_GUILD_ACHIEVEMENT = 0x31
};
-#define MAX_CHAT_MSG_TYPE 0x2F
+#define MAX_CHAT_MSG_TYPE 0x32
// Values from ItemPetFood (power of (value-1) used for compare with CreatureFamilyEntry.petDietMask
enum PetDiet
@@ -2092,7 +2165,9 @@ enum SummonType
SUMMON_TYPE_CRITTER3 = 307,
SUMMON_TYPE_UNKNOWN5 = 409,
SUMMON_TYPE_POSESSED3 = 427,
- SUMMON_TYPE_POSESSED2 = 428
+ SUMMON_TYPE_POSESSED2 = 428,
+ SUMMON_TYPE_FORCE_OF_NATURE = 669,
+ SUMMON_TYPE_GUARDIAN2 = 1161
};
enum ResponseCodes
@@ -2161,42 +2236,45 @@ enum ResponseCodes
CHAR_CREATE_SERVER_QUEUE = 0x37,
CHAR_CREATE_ONLY_EXISTING = 0x38,
CHAR_CREATE_EXPANSION = 0x39,
-
- CHAR_DELETE_IN_PROGRESS = 0x3A,
- CHAR_DELETE_SUCCESS = 0x3B,
- CHAR_DELETE_FAILED = 0x3C,
- CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 0x3D,
- CHAR_DELETE_FAILED_GUILD_LEADER = 0x3E,
- CHAR_DELETE_FAILED_ARENA_CAPTAIN = 0x3F,
-
- CHAR_LOGIN_IN_PROGRESS = 0x40,
- CHAR_LOGIN_SUCCESS = 0x41,
- CHAR_LOGIN_NO_WORLD = 0x42,
- CHAR_LOGIN_DUPLICATE_CHARACTER = 0x43,
- CHAR_LOGIN_NO_INSTANCES = 0x44,
- CHAR_LOGIN_FAILED = 0x45,
- CHAR_LOGIN_DISABLED = 0x46,
- CHAR_LOGIN_NO_CHARACTER = 0x47,
- CHAR_LOGIN_LOCKED_FOR_TRANSFER = 0x48,
- CHAR_LOGIN_LOCKED_BY_BILLING = 0x49,
-
- CHAR_NAME_SUCCESS = 0x4A,
- CHAR_NAME_FAILURE = 0x4B,
- CHAR_NAME_NO_NAME = 0x4C,
- CHAR_NAME_TOO_SHORT = 0x4D,
- CHAR_NAME_TOO_LONG = 0x4E,
- CHAR_NAME_INVALID_CHARACTER = 0x4F,
- CHAR_NAME_MIXED_LANGUAGES = 0x50,
- CHAR_NAME_PROFANE = 0x51,
- CHAR_NAME_RESERVED = 0x52,
- CHAR_NAME_INVALID_APOSTROPHE = 0x53,
- CHAR_NAME_MULTIPLE_APOSTROPHES = 0x54,
- CHAR_NAME_THREE_CONSECUTIVE = 0x55,
- CHAR_NAME_INVALID_SPACE = 0x56,
- CHAR_NAME_CONSECUTIVE_SPACES = 0x57,
- CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 0x58,
- CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x59,
- CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x5A,
+ CHAR_CREATE_EXPANSION_CLASS = 0x3A,
+ CHAR_CREATE_LEVEL_REQUIREMENT = 0x3B,
+ CHAR_CREATE_UNIQUE_CLASS_LIMIT = 0x3C,
+
+ CHAR_DELETE_IN_PROGRESS = 0x3D,
+ CHAR_DELETE_SUCCESS = 0x3E,
+ CHAR_DELETE_FAILED = 0x3F,
+ CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 0x40,
+ CHAR_DELETE_FAILED_GUILD_LEADER = 0x41,
+ CHAR_DELETE_FAILED_ARENA_CAPTAIN = 0x42,
+
+ CHAR_LOGIN_IN_PROGRESS = 0x43,
+ CHAR_LOGIN_SUCCESS = 0x44,
+ CHAR_LOGIN_NO_WORLD = 0x45,
+ CHAR_LOGIN_DUPLICATE_CHARACTER = 0x46,
+ CHAR_LOGIN_NO_INSTANCES = 0x47,
+ CHAR_LOGIN_FAILED = 0x48,
+ CHAR_LOGIN_DISABLED = 0x49,
+ CHAR_LOGIN_NO_CHARACTER = 0x4A,
+ CHAR_LOGIN_LOCKED_FOR_TRANSFER = 0x4B,
+ CHAR_LOGIN_LOCKED_BY_BILLING = 0x4C,
+
+ CHAR_NAME_SUCCESS = 0x4D,
+ CHAR_NAME_FAILURE = 0x4E,
+ CHAR_NAME_NO_NAME = 0x4F,
+ CHAR_NAME_TOO_SHORT = 0x50,
+ CHAR_NAME_TOO_LONG = 0x51,
+ CHAR_NAME_INVALID_CHARACTER = 0x52,
+ CHAR_NAME_MIXED_LANGUAGES = 0x53,
+ CHAR_NAME_PROFANE = 0x54,
+ CHAR_NAME_RESERVED = 0x55,
+ CHAR_NAME_INVALID_APOSTROPHE = 0x56,
+ CHAR_NAME_MULTIPLE_APOSTROPHES = 0x57,
+ CHAR_NAME_THREE_CONSECUTIVE = 0x58,
+ CHAR_NAME_INVALID_SPACE = 0x59,
+ CHAR_NAME_CONSECUTIVE_SPACES = 0x5A,
+ CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 0x5B,
+ CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x5C,
+ CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x5D
};
/// Ban function modes
@@ -2214,5 +2292,23 @@ enum BanReturn
BAN_SYNTAX_ERROR,
BAN_NOTFOUND
};
+
+// indexes of BattlemasterList.dbc
+enum BattleGroundTypeId
+{
+ BATTLEGROUND_AV = 1,
+ BATTLEGROUND_WS = 2,
+ BATTLEGROUND_AB = 3,
+ BATTLEGROUND_NA = 4,
+ BATTLEGROUND_BE = 5,
+ BATTLEGROUND_AA = 6,
+ BATTLEGROUND_EY = 7,
+ BATTLEGROUND_RL = 8,
+ BATTLEGROUND_SA = 9,
+ BATTLEGROUND_DS = 10,
+ BATTLEGROUND_RV = 11
+};
+#define MAX_BATTLEGROUND_TYPE_ID 12
+
#endif
diff --git a/src/game/SkillDiscovery.cpp b/src/game/SkillDiscovery.cpp
index 5a5869047a5..c6c85990e26 100644
--- a/src/game/SkillDiscovery.cpp
+++ b/src/game/SkillDiscovery.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -31,14 +31,15 @@
struct SkillDiscoveryEntry
{
- uint32 spellId;
- float chance;
+ uint32 spellId; // discavered spell
+ uint32 reqSkillValue; // skill level limitation
+ float chance; // chance
SkillDiscoveryEntry()
- : spellId(0), chance(0) {}
+ : spellId(0), reqSkillValue(0), chance(0) {}
- SkillDiscoveryEntry(uint16 _spellId, float _chance)
- : spellId(_spellId), chance(_chance) {}
+ SkillDiscoveryEntry(uint16 _spellId, uint32 req_skill_val, float _chance)
+ : spellId(_spellId), reqSkillValue(req_skill_val), chance(_chance) {}
};
typedef std::list<SkillDiscoveryEntry> SkillDiscoveryList;
@@ -53,8 +54,8 @@ void LoadSkillDiscoveryTable()
uint32 count = 0;
- // 0 1 2
- QueryResult *result = WorldDatabase.Query("SELECT spellId, reqSpell, chance FROM skill_discovery_template");
+ // 0 1 2 3
+ QueryResult *result = WorldDatabase.Query("SELECT spellId, reqSpell, reqSkillValue, chance FROM skill_discovery_template");
if (result)
{
@@ -69,11 +70,13 @@ void LoadSkillDiscoveryTable()
uint32 spellId = fields[0].GetUInt32();
int32 reqSkillOrSpell = fields[1].GetInt32();
- float chance = fields[2].GetFloat();
+ uint32 reqSkillValue = fields[2].GetInt32();
+ float chance = fields[3].GetFloat();
if( chance <= 0 ) // chance
{
- ssNonDiscoverableEntries << "spellId = " << spellId << " reqSkillOrSpell = " << reqSkillOrSpell << " chance = " << chance << "\n";
+ ssNonDiscoverableEntries << "spellId = " << spellId << " reqSkillOrSpell = " << reqSkillOrSpell
+ << " reqSkillValue = " << reqSkillValue << " chance = " << chance << "(chance problem)\n";
continue;
}
@@ -86,13 +89,16 @@ void LoadSkillDiscoveryTable()
continue;
}
- if( spellEntry->Mechanic != MECHANIC_DISCOVERY )
+ // mechanic discovery
+ if (spellEntry->Mechanic != MECHANIC_DISCOVERY &&
+ // explicit discovery ability
+ !IsExplicitDiscoverySpell(spellEntry))
{
- sLog.outErrorDb("Spell (ID: %u) not have have MECHANIC_DISCOVERY (28) value in Mechanic field in spell.dbc but listed in `skill_discovery_template` table",spellId);
+ sLog.outErrorDb("Spell (ID: %u) not have have MECHANIC_DISCOVERY (28) value in Mechanic field in spell.dbc and not 100% chance random discovery ability but listed in `skill_discovery_template` table",spellId);
continue;
}
- SkillDiscoveryStore[reqSkillOrSpell].push_back( SkillDiscoveryEntry(spellId, chance) );
+ SkillDiscoveryStore[reqSkillOrSpell].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
}
else if( reqSkillOrSpell == 0 ) // skill case
{
@@ -107,7 +113,7 @@ void LoadSkillDiscoveryTable()
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
{
- SkillDiscoveryStore[-int32(_spell_idx->second->skillId)].push_back( SkillDiscoveryEntry(spellId, chance) );
+ SkillDiscoveryStore[-int32(_spell_idx->second->skillId)].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
}
}
else
@@ -115,6 +121,7 @@ void LoadSkillDiscoveryTable()
sLog.outErrorDb("Spell (ID: %u) have negative value in `reqSpell` field in `skill_discovery_template` table",spellId);
continue;
}
+
++count;
} while (result->NextRow());
@@ -132,8 +139,48 @@ void LoadSkillDiscoveryTable()
}
}
+uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player)
+{
+ // explicit discovery spell chances (always success if case exist)
+ // in this case we have both skill and spell
+ SkillDiscoveryMap::iterator tab = SkillDiscoveryStore.find(spellId);
+ if(tab == SkillDiscoveryStore.end())
+ return 0;
+
+ SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId);
+ SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellId);
+ uint32 skillvalue = lower != upper ? player->GetSkillValue(lower->second->skillId) : 0;
+
+ float full_chance = 0;
+ for(SkillDiscoveryList::iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
+ if(item_iter->reqSkillValue <= skillvalue)
+ if(!player->HasSpell(item_iter->spellId))
+ full_chance += item_iter->chance;
+
+ float rate = full_chance / 100.0f;
+ float roll = rand_chance() * rate; // roll now in range 0..full_chance
+
+ for(SkillDiscoveryList::iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
+ {
+ if(item_iter->reqSkillValue > skillvalue)
+ continue;
+
+ if(player->HasSpell(item_iter->spellId))
+ continue;
+
+ if(item_iter->chance > roll)
+ return item_iter->spellId;
+
+ roll -= item_iter->chance;
+ }
+
+ return 0;
+}
+
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player)
{
+ uint32 skillvalue = skillId ? player->GetSkillValue(skillId) : 0;
+
// check spell case
SkillDiscoveryMap::iterator tab = SkillDiscoveryStore.find(spellId);
@@ -142,6 +189,7 @@ uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player)
for(SkillDiscoveryList::iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
{
if( roll_chance_f(item_iter->chance * sWorld.getRate(RATE_SKILL_DISCOVERY))
+ && item_iter->reqSkillValue <= skillvalue
&& !player->HasSpell(item_iter->spellId) )
return item_iter->spellId;
}
@@ -149,6 +197,9 @@ uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player)
return 0;
}
+ if(!skillId)
+ return 0;
+
// check skill line case
tab = SkillDiscoveryStore.find(-(int32)skillId);
if(tab != SkillDiscoveryStore.end())
@@ -156,6 +207,7 @@ uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player)
for(SkillDiscoveryList::iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
{
if( roll_chance_f(item_iter->chance * sWorld.getRate(RATE_SKILL_DISCOVERY))
+ && item_iter->reqSkillValue <= skillvalue
&& !player->HasSpell(item_iter->spellId) )
return item_iter->spellId;
}
diff --git a/src/game/SkillDiscovery.h b/src/game/SkillDiscovery.h
index 350062101fe..9981eb133f6 100644
--- a/src/game/SkillDiscovery.h
+++ b/src/game/SkillDiscovery.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -27,5 +27,6 @@ class Player;
void LoadSkillDiscoveryTable();
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player);
+uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player);
#endif
diff --git a/src/game/SkillExtraItems.cpp b/src/game/SkillExtraItems.cpp
index d89cbbdcddf..f0061f97c00 100644
--- a/src/game/SkillExtraItems.cpp
+++ b/src/game/SkillExtraItems.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/SkillExtraItems.h b/src/game/SkillExtraItems.h
index 38684b9933a..3a44619a862 100644
--- a/src/game/SkillExtraItems.h
+++ b/src/game/SkillExtraItems.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp
index 973d0bf9c39..fb00b13c68c 100644
--- a/src/game/SkillHandler.cpp
+++ b/src/game/SkillHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -82,10 +82,6 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data )
}
}
- // Check if it requires spell
- if( talentInfo->DependsOnSpell && !player->HasSpell(talentInfo->DependsOnSpell) )
- return;
-
// Find out how many points we have in this field
uint32 spentPoints = 0;
@@ -133,7 +129,7 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data )
return;
// learn! (other talent ranks will unlearned at learning)
- GetPlayer( )->learnSpell(spellid);
+ GetPlayer( )->learnSpell(spellid,false);
sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talent_id, requested_rank, spellid);
// update free talent points
diff --git a/src/game/SocialMgr.cpp b/src/game/SocialMgr.cpp
index e745d95abb3..b208cc5ece4 100644
--- a/src/game/SocialMgr.cpp
+++ b/src/game/SocialMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -182,13 +182,6 @@ SocialMgr::~SocialMgr()
}
-void SocialMgr::RemovePlayerSocial(uint32 guid)
-{
- SocialMap::iterator itr = m_socialMap.find(guid);
- if(itr != m_socialMap.end())
- m_socialMap.erase(itr);
-}
-
void SocialMgr::GetFriendInfo(Player *player, uint32 friendGUID, FriendInfo &friendInfo)
{
if(!player)
@@ -282,7 +275,7 @@ void SocialMgr::BroadcastToFriendListers(Player *player, WorldPacket *packet)
for(SocialMap::iterator itr = m_socialMap.begin(); itr != m_socialMap.end(); ++itr)
{
- PlayerSocialMap::iterator itr2 = itr->second.m_playerSocialMap.find(guid);
+ PlayerSocialMap::const_iterator itr2 = itr->second.m_playerSocialMap.find(guid);
if(itr2 != itr->second.m_playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND))
{
Player *pFriend = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER));
diff --git a/src/game/SocialMgr.h b/src/game/SocialMgr.h
index f5bf3c8600c..1ca04d69707 100644
--- a/src/game/SocialMgr.h
+++ b/src/game/SocialMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -143,7 +143,8 @@ class SocialMgr
SocialMgr();
~SocialMgr();
// Misc
- void RemovePlayerSocial(uint32 guid);
+ void RemovePlayerSocial(uint32 guid) { m_socialMap.erase(guid); }
+
void GetFriendInfo(Player *player, uint32 friendGUID, FriendInfo &friendInfo);
// Packet management
void MakeFriendStatusPacket(FriendsResult result, uint32 friend_guid, WorldPacket *data);
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index d3923d99233..be224438257 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -43,7 +43,6 @@
#include "CellImpl.h"
#include "Policies/SingletonImp.h"
#include "SharedDefines.h"
-#include "Tools.h"
#include "LootMgr.h"
#include "VMapFactory.h"
#include "BattleGround.h"
@@ -120,6 +119,14 @@ void SpellCastTargets::setDestination(Unit *target, bool send)
m_targetMask |= TARGET_FLAG_DEST_LOCATION;
}
+void SpellCastTargets::setSource(float x, float y, float z)
+{
+ m_srcX = x;
+ m_srcY = y;
+ m_srcZ = z;
+ m_targetMask |= TARGET_FLAG_SOURCE_LOCATION;
+}
+
void SpellCastTargets::setGOTarget(GameObject *target)
{
m_GOTarget = target;
@@ -178,16 +185,20 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
return true;
// TARGET_FLAG_UNK2 is used for non-combat pets, maybe other?
- if( m_targetMask & (TARGET_FLAG_UNIT|TARGET_FLAG_UNK2) )
- if(!readGUID(*data, m_unitTargetGUID))
+ if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 ))
+ if(!data->readPackGUID(m_unitTargetGUID))
return false;
- if( m_targetMask & ( TARGET_FLAG_OBJECT | TARGET_FLAG_OBJECT_UNK ))
- if(!readGUID(*data, m_GOTargetGUID))
+ if( m_targetMask & ( TARGET_FLAG_OBJECT ))
+ if(!data->readPackGUID(m_GOTargetGUID))
return false;
if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER)
- if(!readGUID(*data, m_itemTargetGUID))
+ if(!data->readPackGUID(m_itemTargetGUID))
+ return false;
+
+ if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
+ if(!data->readPackGUID(m_CorpseTargetGUID))
return false;
/*if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
@@ -202,7 +213,10 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
if( m_targetMask & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION) )
{
- if(data->rpos()+4+4+4 > data->size())
+ if(data->rpos()+1+4+4+4 > data->size())
+ return false;
+
+ if(!data->readPackGUID(m_unitTargetGUID))
return false;
*data >> m_destX >> m_destY >> m_destZ;
@@ -219,10 +233,6 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
*data >> m_strTarget;
}
- if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
- if(!readGUID(*data, m_CorpseTargetGUID))
- return false;
-
// find real units/GOs
Update(caster);
return true;
@@ -242,7 +252,7 @@ void SpellCastTargets::write ( WorldPacket * data )
else
*data << uint8(0);
}
- else if( m_targetMask & ( TARGET_FLAG_OBJECT | TARGET_FLAG_OBJECT_UNK ) )
+ else if( m_targetMask & TARGET_FLAG_OBJECT )
{
if(m_GOTarget)
data->append(m_GOTarget->GetPackGUID());
@@ -267,7 +277,14 @@ void SpellCastTargets::write ( WorldPacket * data )
*data << m_srcX << m_srcY << m_srcZ;
if( m_targetMask & TARGET_FLAG_DEST_LOCATION )
+ {
+ if(m_unitTarget)
+ data->append(m_unitTarget->GetPackGUID());
+ else
+ *data << uint8(0);
+
*data << m_destX << m_destY << m_destZ;
+ }
if( m_targetMask & TARGET_FLAG_STRING )
*data << m_strTarget;
@@ -305,7 +322,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
break;
default:
// Wands
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_REQ_WAND)
+ if (m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_AUTOREPEAT_FLAG)
m_attackType = RANGED_ATTACK;
else
m_attackType = BASE_ATTACK;
@@ -355,14 +372,14 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
gameObjTarget = NULL;
focusObject = NULL;
m_cast_count = 0;
+ m_glyphIndex = 0;
+ m_preCastSpell = 0;
m_triggeredByAuraSpell = NULL;
- //Auto Shot & Shoot
- if( m_spellInfo->AttributesEx2 == 0x000020 && !triggered )
- m_autoRepeat = true;
- else
- m_autoRepeat = false;
+ //Auto Shot & Shoot (wand)
+ m_autoRepeat = IsAutoRepeatRangedSpell(m_spellInfo);
+ m_runesState = 0;
m_powerCost = 0; // setup to correct value in Spell::prepare, don't must be used before.
m_casttime = 0; // setup to correct value in Spell::prepare, don't must be used before.
m_timer = 0; // will set to castime in prepare
@@ -372,7 +389,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
// determine reflection
m_canReflect = false;
- if(m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && (m_spellInfo->AttributesEx2 & 0x4)==0)
+ if(m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !(m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_CANT_REFLECTED))
{
for(int j=0;j<3;j++)
{
@@ -457,11 +474,11 @@ void Spell::FillTargetMap()
{
// non-standard target selection
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
- float max_range = GetSpellMaxRange(srange);
+ float max_range = GetSpellMaxRangeForHostile(srange);
WorldObject* result = NULL;
Trinity::CannibalizeObjectCheck u_check(m_caster, max_range);
- Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck > searcher(result, u_check);
+ Trinity::WorldObjectSearcher<Trinity::CannibalizeObjectCheck > searcher(m_caster, result, u_check);
m_caster->VisitNearbyGridObject(max_range, searcher);
if(!result)
m_caster->VisitNearbyWorldObject(max_range, searcher);
@@ -511,6 +528,8 @@ void Spell::FillTargetMap()
case SPELL_EFFECT_CREATE_ITEM:
case SPELL_EFFECT_TRIGGER_SPELL:
case SPELL_EFFECT_SKILL_STEP:
+ case SPELL_EFFECT_PROFICIENCY:
+ case SPELL_EFFECT_SUMMON_OBJECT_WILD:
case SPELL_EFFECT_SELF_RESURRECT:
case SPELL_EFFECT_REPUTATION:
case SPELL_EFFECT_LEARN_SPELL:
@@ -543,7 +562,9 @@ void Spell::FillTargetMap()
break;
case SPELL_EFFECT_SUMMON_CHANGE_ITEM:
case SPELL_EFFECT_ADD_FARSIGHT:
+ case SPELL_EFFECT_APPLY_GLYPH:
case SPELL_EFFECT_STUCK:
+ case SPELL_EFFECT_FEED_PET:
case SPELL_EFFECT_DESTROY_ALL_TOTEMS:
tmpUnitMap.push_back(m_caster);
break;
@@ -553,9 +574,10 @@ void Spell::FillTargetMap()
break;
/*case SPELL_EFFECT_ENCHANT_ITEM:
case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY:
+ case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC:
case SPELL_EFFECT_DISENCHANT:
- case SPELL_EFFECT_FEED_PET:
case SPELL_EFFECT_PROSPECTING:
+ case SPELL_EFFECT_MILLING:
if(m_targets.getItemTarget())
AddItemTarget(m_targets.getItemTarget(), i);
break;*/
@@ -596,7 +618,6 @@ void Spell::FillTargetMap()
}
}
-
if(IsChanneledSpell(m_spellInfo) && !tmpUnitMap.empty())
m_needAliveTargetMask |= (1<<i);
@@ -633,34 +654,43 @@ void Spell::prepareDataForTriggerSystem()
// Ñan spell trigger another or not ( m_canTrigger )
// Create base triggers flags for Attacker and Victim ( m_procAttacker and m_procVictim)
//==========================================================================================
-
// Fill flag can spell trigger or not
- if (!m_IsTriggeredSpell)
+ // TODO: possible exist spell attribute for this
+ m_canTrigger = false;
+
+ if (m_CastItem)
+ m_canTrigger = false; // Do not trigger from item cast spell
+ else if (!m_IsTriggeredSpell)
m_canTrigger = true; // Normal cast - can trigger
else if (!m_triggeredByAuraSpell)
m_canTrigger = true; // Triggered from SPELL_EFFECT_TRIGGER_SPELL - can trigger
- else // Exceptions (some periodic triggers)
+
+ if (!m_canTrigger) // Exceptions (some periodic triggers)
{
- m_canTrigger = false; // Triggered spells can`t trigger another
switch (m_spellInfo->SpellFamilyName)
{
case SPELLFAMILY_MAGE: // Arcane Missles / Blizzard triggers need do it
- if (m_spellInfo->SpellFamilyFlags & 0x0000000000200080LL) m_canTrigger = true;
+ if (m_spellInfo->SpellFamilyFlags[0] & 0x200080) m_canTrigger = true;
break;
case SPELLFAMILY_WARLOCK: // For Hellfire Effect / Rain of Fire / Seed of Corruption triggers need do it
- if (m_spellInfo->SpellFamilyFlags & 0x0000800000000060LL) m_canTrigger = true;
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x00008000 || m_spellInfo->SpellFamilyFlags[0] & 0x00000060) m_canTrigger = true;
break;
- case SPELLFAMILY_HUNTER: // Hunter Explosive Trap Effect/Immolation Trap Effect/Frost Trap Aura/Snake Trap Effect
- if (m_spellInfo->SpellFamilyFlags & 0x0000200000000014LL) m_canTrigger = true;
+ case SPELLFAMILY_PRIEST: // For Penance heal/damage triggers need do it
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x00018000) m_canTrigger = true;
break;
- case SPELLFAMILY_PALADIN: // For Holy Shock triggers need do it
- if (m_spellInfo->SpellFamilyFlags & 0x0001000000200000LL) m_canTrigger = true;
+ case SPELLFAMILY_ROGUE: // For poisons need do it
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x00000010 || m_spellInfo->SpellFamilyFlags[0] & 0x1001E000) m_canTrigger = true;
+ break;
+ case SPELLFAMILY_HUNTER: // Hunter Rapid Killing/Explosive Trap Effect/Immolation Trap Effect/Frost Trap Aura/Snake Trap Effect/Explosive Shot
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x01002000
+ || m_spellInfo->SpellFamilyFlags[0] & 0x00000214 ||
+ m_spellInfo->SpellFamilyFlags[2] & 0x200) m_canTrigger = true;
+ break;
+ case SPELLFAMILY_PALADIN: // For Judgements (all) / Holy Shock triggers need do it
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x00010009 || m_spellInfo->SpellFamilyFlags[0] & 0x00B80400) m_canTrigger = true;
break;
}
}
- // Do not trigger from item cast spell
- if (m_CastItem)
- m_canTrigger = false;
// Get data for type of attack and fill base info for trigger
switch (m_spellInfo->DmgClass)
@@ -670,21 +700,30 @@ void Spell::prepareDataForTriggerSystem()
m_procVictim = PROC_FLAG_TAKEN_MELEE_SPELL_HIT;
break;
case SPELL_DAMAGE_CLASS_RANGED:
- m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT;
- m_procVictim = PROC_FLAG_TAKEN_RANGED_SPELL_HIT;
+ // Auto attack
+ if (m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_AUTOREPEAT_FLAG)
+ {
+ m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_HIT;
+ m_procVictim = PROC_FLAG_TAKEN_RANGED_HIT;
+ }
+ else // Ranged spell attack
+ {
+ m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT;
+ m_procVictim = PROC_FLAG_TAKEN_RANGED_SPELL_HIT;
+ }
break;
default:
- if (IsPositiveSpell(m_spellInfo->Id)) // Check for positive spell
+ if (IsPositiveSpell(m_spellInfo->Id)) // Check for positive spell
{
m_procAttacker = PROC_FLAG_SUCCESSFUL_POSITIVE_SPELL;
m_procVictim = PROC_FLAG_TAKEN_POSITIVE_SPELL;
}
- else if (m_spellInfo->Id == 5019) // Wands
+ else if (m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_AUTOREPEAT_FLAG) // Wands auto attack
{
- m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT;
- m_procVictim = PROC_FLAG_TAKEN_RANGED_SPELL_HIT;
+ m_procAttacker = PROC_FLAG_SUCCESSFUL_RANGED_HIT;
+ m_procVictim = PROC_FLAG_TAKEN_RANGED_HIT;
}
- else
+ else // Negative spell
{
m_procAttacker = PROC_FLAG_SUCCESSFUL_NEGATIVE_SPELL_HIT;
m_procVictim = PROC_FLAG_TAKEN_NEGATIVE_SPELL_HIT;
@@ -693,7 +732,7 @@ void Spell::prepareDataForTriggerSystem()
}
// Hunter traps spells (for Entrapment trigger)
// Gives your Immolation Trap, Frost Trap, Explosive Trap, and Snake Trap ....
- if (m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && m_spellInfo->SpellFamilyFlags & 0x0000200000000014LL)
+ if (m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && (m_spellInfo->SpellFamilyFlags[1] & 0x00002000 || m_spellInfo->SpellFamilyFlags[0] & 0x1C))
m_procAttacker |= PROC_FLAG_ON_TRAP_ACTIVATION;
}
@@ -702,8 +741,6 @@ void Spell::CleanupTargetList()
m_UniqueTargetInfo.clear();
m_UniqueGOTargetInfo.clear();
m_UniqueItemInfo.clear();
- m_countOfHit = 0;
- m_countOfMiss = 0;
m_delayMoment = 0;
}
@@ -712,6 +749,9 @@ void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex)
if( m_spellInfo->Effect[effIndex]==0 )
return;
+ // Check for effect immune skip if immuned
+ bool immuned = pVictim->IsImmunedToSpellEffect(m_spellInfo, effIndex);
+
uint64 targetGUID = pVictim->GetGUID();
// Lookup target in already in list
@@ -719,7 +759,8 @@ void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex)
{
if (targetGUID == ihit->targetGUID) // Found in list
{
- ihit->effectMask |= 1<<effIndex; // Add only effect mask
+ if (!immuned)
+ ihit->effectMask |= 1<<effIndex; // Add only effect mask if not immuned
return;
}
}
@@ -729,7 +770,7 @@ void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex)
// Get spell hit result on target
TargetInfo target;
target.targetGUID = targetGUID; // Store target GUID
- target.effectMask = 1<<effIndex; // Store index of effect
+ target.effectMask = immuned ? 0 : 1<<effIndex; // Store index of effect if not immuned
target.processed = false; // Effects not apply on target
target.damage = 0;
@@ -743,11 +784,6 @@ void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex)
else
target.missCondition = SPELL_MISS_EVADE; //SPELL_MISS_NONE;
- if (target.missCondition == SPELL_MISS_NONE)
- ++m_countOfHit;
- else
- ++m_countOfMiss;
-
// Spell have speed - need calculate incoming time
if (m_spellInfo->speed > 0.0f)
{
@@ -828,8 +864,6 @@ void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
else
target.timeDelay = 0LL;
- ++m_countOfHit;
-
// Add target to list
m_UniqueGOTargetInfo.push_back(target);
}
@@ -863,83 +897,6 @@ void Spell::AddItemTarget(Item* pitem, uint32 effIndex)
target.effectMask = 1<<effIndex;
m_UniqueItemInfo.push_back(target);
}
-/*
-void Spell::doTriggers(SpellMissInfo missInfo, uint32 damage, SpellSchoolMask damageSchoolMask, uint32 block, uint32 absorb, bool crit)
-{
- // Do triggers depends from hit result (triggers on hit do in effects)
- // Set aura states depends from hit result
- if (missInfo!=SPELL_MISS_NONE)
- {
- // Miss/dodge/parry/block only for melee based spells
- // Resist only for magic based spells
- switch (missInfo)
- {
- case SPELL_MISS_MISS:
- if(m_caster->GetTypeId()== TYPEID_PLAYER)
- ((Player*)m_caster)->UpdateWeaponSkill(BASE_ATTACK);
-
- m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_MISS, m_spellInfo, m_IsTriggeredSpell);
- break;
- case SPELL_MISS_RESIST:
- m_caster->ProcDamageAndSpell(unitTarget, PROC_FLAG_TARGET_RESISTS, PROC_FLAG_RESIST_SPELL, 0, damageSchoolMask, m_spellInfo, m_IsTriggeredSpell);
- break;
- case SPELL_MISS_DODGE:
- if(unitTarget->GetTypeId() == TYPEID_PLAYER)
- ((Player*)unitTarget)->UpdateDefense();
-
- // Overpower
- if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->getClass() == CLASS_WARRIOR)
- {
- ((Player*) m_caster)->AddComboPoints(unitTarget, 1);
- m_caster->StartReactiveTimer( REACTIVE_OVERPOWER );
- }
-
- // Riposte
- if (unitTarget->getClass() != CLASS_ROGUE)
- {
- unitTarget->ModifyAuraState(AURA_STATE_DEFENSE, true);
- unitTarget->StartReactiveTimer( REACTIVE_DEFENSE );
- }
-
- m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_DODGE, m_spellInfo, m_IsTriggeredSpell);
- break;
- case SPELL_MISS_PARRY:
- // Update victim defense ?
- if(unitTarget->GetTypeId() == TYPEID_PLAYER)
- ((Player*)unitTarget)->UpdateDefense();
- // Mongoose bite - set only Counterattack here
- if (unitTarget->getClass() == CLASS_HUNTER)
- {
- unitTarget->ModifyAuraState(AURA_STATE_HUNTER_PARRY,true);
- unitTarget->StartReactiveTimer( REACTIVE_HUNTER_PARRY );
- }
- else
- {
- unitTarget->ModifyAuraState(AURA_STATE_DEFENSE, true);
- unitTarget->StartReactiveTimer( REACTIVE_DEFENSE );
- }
- m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_PARRY, m_spellInfo, m_IsTriggeredSpell);
- break;
- case SPELL_MISS_BLOCK:
- unitTarget->ModifyAuraState(AURA_STATE_DEFENSE, true);
- unitTarget->StartReactiveTimer( REACTIVE_DEFENSE );
-
- m_caster->CastMeleeProcDamageAndSpell(unitTarget, 0, damageSchoolMask, m_attackType, MELEE_HIT_BLOCK, m_spellInfo, m_IsTriggeredSpell);
- break;
- // Trigger from this events not supported
- case SPELL_MISS_EVADE:
- case SPELL_MISS_IMMUNE:
- case SPELL_MISS_IMMUNE2:
- case SPELL_MISS_DEFLECT:
- case SPELL_MISS_ABSORB:
- // Trigger from reflects need do after get reflect result
- case SPELL_MISS_REFLECT:
- break;
- default:
- break;
- }
- }
-}*/
void Spell::DoAllEffectOnTarget(TargetInfo *target)
{
@@ -949,15 +906,13 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
// Get mask of effects for target
uint32 mask = target->effectMask;
- if (mask == 0) // No effects
- return;
Unit* unit = m_caster->GetGUID()==target->targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster,target->targetGUID);
if (!unit)
return;
// Get original caster (if exist) and calculate damage/healing from him data
- Unit *caster = m_originalCasterGUID ? m_originalCaster : m_caster;
+ Unit *caster = m_originalCaster ? m_originalCaster : m_caster;
// Skip if m_originalCaster not avaiable
if (!caster)
@@ -1005,7 +960,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
if (crit)
{
procEx |= PROC_EX_CRITICAL_HIT;
- addhealth = caster->SpellCriticalBonus(m_spellInfo, addhealth, NULL);
+ addhealth = caster->SpellCriticalHealingBonus(m_spellInfo, addhealth, NULL);
}
else
procEx |= PROC_EX_NORMAL_HIT;
@@ -1044,44 +999,12 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
caster->DealSpellDamage(&damageInfo, true);
- // Shadow Word: Death - deals damage equal to damage done to caster if victim is not killed
- if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && m_spellInfo->SpellFamilyFlags&0x0000000200000000LL &&
- caster != unitTarget && unitTarget->isAlive())
- {
- // Redirect damage to caster if victim Alive
- damageInfo.target = caster;
- damageInfo.absorb = 0;
- damageInfo.resist = 0;
- damageInfo.blocked = 0;
- // Send log damage message to client
- caster->SendSpellNonMeleeDamageLog(&damageInfo);
- caster->DealSpellDamage(&damageInfo, true);
- }
// Judgement of Blood
- else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags & 0x0000000800000000LL && m_spellInfo->SpellIconID==153)
+ if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && m_spellInfo->SpellFamilyFlags[1] & 0x00000008 && m_spellInfo->SpellIconID==153)
{
int32 damagePoint = damageInfo.damage * 33 / 100;
m_caster->CastCustomSpell(m_caster, 32220, &damagePoint, NULL, NULL, true);
}
- // Bloodthirst
- else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && m_spellInfo->SpellFamilyFlags & 0x40000000000LL)
- {
- uint32 BTAura = 0;
- switch(m_spellInfo->Id)
- {
- case 23881: BTAura = 23885; break;
- case 23892: BTAura = 23886; break;
- case 23893: BTAura = 23887; break;
- case 23894: BTAura = 23888; break;
- case 25251: BTAura = 25252; break;
- case 30335: BTAura = 30339; break;
- default:
- sLog.outError("Spell::EffectSchoolDMG: Spell %u not handled in BTAura",m_spellInfo->Id);
- break;
- }
- if (BTAura)
- m_caster->CastSpell(m_caster,BTAura,true);
- }
}
// Passive spell hits/misses or active spells only misses (only triggers)
else
@@ -1105,14 +1028,14 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
if( !m_caster->IsFriendlyTo(unit) && !IsPositiveSpell(m_spellInfo->Id))
{
- if( !(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_NO_INITIAL_AGGRO) )
+ if( !(m_spellInfo->AttributesEx & SPELL_ATTR_EX_NO_INITIAL_AGGRO) )
{
m_caster->CombatStart(unit);
}
else if(m_customAttr & SPELL_ATTR_CU_AURA_CC)
{
if(!unit->IsStandState())
- unit->SetStandState(PLAYER_STATE_NONE);
+ unit->SetStandState(UNIT_STAND_STATE_STAND);
}
}
}
@@ -1125,25 +1048,37 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
// Recheck immune (only for delayed spells)
if( m_spellInfo->speed &&
!(m_spellInfo->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
- && (unit->IsImmunedToDamage(GetSpellSchoolMask(m_spellInfo),true) ||
- unit->IsImmunedToSpell(m_spellInfo,true) ))
+ && (unit->IsImmunedToDamage(GetSpellSchoolMask(m_spellInfo)) ||
+ unit->IsImmunedToSpell(m_spellInfo)))
{
m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_IMMUNE);
m_damage = 0;
return;
}
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)unit)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id);
+ ((Player*)unit)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, m_spellInfo->Id);
+ }
+
+ if(m_caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)m_caster)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, m_spellInfo->Id, 0, unit);
+ }
+
if( m_caster != unit )
{
- if (unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
+ // Recheck UNIT_FLAG_NON_ATTACKABLE for delayed spells
+ if (m_spellInfo->speed > 0.0f &&
+ unit->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) &&
+ unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
{
- if (unit->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
- {
- m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_EVADE);
+ m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_EVADE);
m_damage = 0;
- return;
- }
+ return;
}
+
if( !m_caster->IsFriendlyTo(unit) )
{
// for delayed spells ignore not visible explicit target
@@ -1175,7 +1110,7 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
m_caster->SetContestedPvP();
//m_caster->UpdatePvP(true);
}
- if( unit->isInCombat() && !(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_NO_INITIAL_AGGRO) )
+ if( unit->isInCombat() && !(m_spellInfo->AttributesEx & SPELL_ATTR_EX_NO_INITIAL_AGGRO) )
{
m_caster->SetInCombatState(unit->GetCombatTimer() > 0);
unit->getHostilRefManager().threatAssist(m_caster, 0.0f);
@@ -1193,6 +1128,23 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
unit->IncrDiminishing(m_diminishGroup);
}
+ // Apply additional spell effects to target
+ if (m_preCastSpell)
+ {
+ // Special spell id
+ // TODO: Handle all of special spells in one place?
+ if(m_preCastSpell==61988)
+ {
+ //Cast forbearance
+ m_caster->CastSpell(unit,25771, true, m_CastItem);
+ // Cast Avenging Wrath Marker
+ m_caster->CastSpell(unit,61987, true, m_CastItem);
+ }
+ else
+ m_caster->CastSpell(unit,m_preCastSpell, true, m_CastItem);
+ }
+
+
for(uint32 effectNumber=0;effectNumber<3;effectNumber++)
{
if (effectMask & (1<<effectNumber))
@@ -1352,6 +1304,16 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin
if(!cur)
return;
+ // Get spell max affected targets
+ /*uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets;
+ Unit::AuraList const& mod = m_caster->GetAurasByType(SPELL_AURA_MOD_MAX_AFFECTED_TARGETS);
+ for(Unit::AuraList::const_iterator m = mod.begin(); m != mod.end(); ++m)
+ {
+ if (!(*m)->isAffectedOnSpell(m_spellInfo))
+ continue;
+ unMaxTargets+=(*m)->GetModifier()->m_amount;
+ }*/
+
//FIXME: This very like horrible hack and wrong for most spells
if(m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)
max_range += num * CHAIN_SPELL_JUMP_RADIUS;
@@ -1463,7 +1425,7 @@ Unit* Spell::SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 en
{
Creature* target = NULL;
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, entry, true, radius);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(target, u_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_caster, target, u_check);
m_caster->VisitNearbyObject(radius, searcher);
return target;
}
@@ -1477,13 +1439,13 @@ Unit* Spell::SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 en
case SPELL_TARGETS_ENEMY:
{
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_caster, m_caster, radius);
- Trinity::UnitLastSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(target, u_check);
+ Trinity::UnitLastSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(m_caster, target, u_check);
m_caster->VisitNearbyObject(radius, searcher);
}break;
case SPELL_TARGETS_ALLY:
{
Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(m_caster, m_caster, radius);
- Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(target, u_check);
+ Trinity::UnitLastSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(m_caster, target, u_check);
m_caster->VisitNearbyObject(radius, searcher);
}break;
}
@@ -1492,21 +1454,35 @@ Unit* Spell::SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 en
void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
{
- float radius;
+ float radius_h, radius_f;
if (m_spellInfo->EffectRadiusIndex[i])
- radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ {
+ radius_h = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ radius_f = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ }
else
- radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
+ {
+ radius_h = GetSpellMaxRangeForHostile(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
+ radius_f = GetSpellMaxRangeForFriend(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
+ }
//Chain: 2, 6, 22, 25, 45, 77
uint32 EffectChainTarget = m_spellInfo->EffectChainTarget[i];
uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets;
+ Unit::AuraList const& Auras = m_caster->GetAurasByType(SPELL_AURA_MOD_MAX_AFFECTED_TARGETS);
+ for(Unit::AuraList::const_iterator j = Auras.begin();j != Auras.end(); ++j)
+ {
+ if((*j)->isAffectedOnSpell(m_spellInfo))
+ unMaxTargets+=(*j)->GetModifier()->m_amount;
+ }
+
if(m_originalCaster)
{
if(Player* modOwner = m_originalCaster->GetSpellModOwner())
{
- modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RADIUS, radius,this);
+ modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RADIUS, radius_f,this);
+ modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RADIUS, radius_h,this);
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_JUMP_TARGETS, EffectChainTarget, this);
}
}
@@ -1537,13 +1513,14 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
TagUnitMap.push_back(pet);
break;
case TARGET_UNIT_PARTY_CASTER:
- m_caster->GetPartyMember(TagUnitMap, radius);
+ m_caster->GetPartyMember(TagUnitMap, radius_f);
break;
case TARGET_UNIT_RAID:
- if(Unit *target = m_targets.getUnitTarget())
- TagUnitMap.push_back(target);
- else
- m_caster->GetRaidMember(TagUnitMap, radius);
+ //if(Unit *target = m_targets.getUnitTarget())
+ // TagUnitMap.push_back(target);
+ //else
+ m_caster->GetRaidMember(TagUnitMap, radius_f);
+ TagUnitMap.push_back(m_caster);
break;
}
}break;
@@ -1567,23 +1544,22 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
case TARGET_UNIT_TARGET_RAID:
case TARGET_UNIT_TARGET_ANY: // SelectMagnetTarget()?
case TARGET_UNIT_TARGET_PARTY:
- case TARGET_UNIT_SINGLE_UNKNOWN:
TagUnitMap.push_back(target);
break;
case TARGET_UNIT_PARTY_TARGET:
- target->GetPartyMember(TagUnitMap, radius);
+ target->GetPartyMember(TagUnitMap, radius_f);
break;
case TARGET_UNIT_TARGET_ENEMY:
if(EffectChainTarget <= 1)
TagUnitMap.push_back(SelectMagnetTarget());
else if(SelectMagnetTarget()) //TODO: chain target should also use magnet target
- SearchChainTarget(TagUnitMap, radius, EffectChainTarget, SPELL_TARGETS_ENEMY);
+ SearchChainTarget(TagUnitMap, radius_h, EffectChainTarget, SPELL_TARGETS_ENEMY);
break;
case TARGET_UNIT_CHAINHEAL:
if(EffectChainTarget <= 1)
TagUnitMap.push_back(target);
else
- SearchChainTarget(TagUnitMap, radius, EffectChainTarget, SPELL_TARGETS_CHAINHEAL);
+ SearchChainTarget(TagUnitMap, radius_f, EffectChainTarget, SPELL_TARGETS_CHAINHEAL);
break;
}
}break;
@@ -1630,17 +1606,17 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
case TARGET_UNIT_AREA_ENEMY_GROUND:
m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
case TARGET_UNIT_AREA_ENEMY:
- SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_ENEMY);
+ SearchAreaTarget(TagUnitMap, radius_h, PUSH_DEST_CENTER, SPELL_TARGETS_ENEMY);
break;
case TARGET_UNIT_AREA_ALLY_GROUND:
m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
case TARGET_UNIT_AREA_ALLY:
- SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_ALLY);
+ SearchAreaTarget(TagUnitMap, radius_f, PUSH_DEST_CENTER, SPELL_TARGETS_ALLY);
break;
case TARGET_UNIT_AREA_PARTY_GROUND:
m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
case TARGET_UNIT_AREA_PARTY:
- m_caster->GetPartyMember(TagUnitMap, radius);
+ m_caster->GetPartyMember(TagUnitMap, radius_f);
break;
case TARGET_UNIT_AREA_ENTRY_GROUND:
m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
@@ -1650,7 +1626,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
SpellScriptTarget::const_iterator upper = spellmgr.GetEndSpellScriptTarget(m_spellInfo->Id);
if(lower==upper)
{
- SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_ENEMY);
+ SearchAreaTarget(TagUnitMap, radius_h, PUSH_DEST_CENTER, SPELL_TARGETS_ENEMY);
sLog.outErrorDb("Spell (ID: %u) (caster Entry: %u) does not have record in `spell_script_target`", m_spellInfo->Id, m_caster->GetEntry());
break;
}
@@ -1662,7 +1638,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
sLog.outError( "SPELL: spell ID %u requires non-creature target\n", m_spellInfo->Id );
continue;
}
- SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_ENTRY, i_spellST->second.targetEntry);
+ SearchAreaTarget(TagUnitMap, radius_f, PUSH_DEST_CENTER, SPELL_TARGETS_ENTRY, i_spellST->second.targetEntry);
}
}
break;
@@ -1706,41 +1682,41 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
m_targets.setDestination(((Player*)m_caster)->m_homebindX,((Player*)m_caster)->m_homebindY,((Player*)m_caster)->m_homebindZ, true, ((Player*)m_caster)->m_homebindMapId);
break;
-
case TARGET_IN_FRONT_OF_CASTER:
case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
if(m_customAttr & SPELL_ATTR_CU_CONE_BACK)
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_ENEMY);
+ SearchAreaTarget(TagUnitMap, radius_h, PUSH_IN_BACK, SPELL_TARGETS_ENEMY);
else if(m_customAttr & SPELL_ATTR_CU_CONE_LINE)
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_ENEMY);
+ SearchAreaTarget(TagUnitMap, radius_h, PUSH_IN_LINE, SPELL_TARGETS_ENEMY);
else
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_ENEMY);
+ SearchAreaTarget(TagUnitMap, radius_h, PUSH_IN_FRONT, SPELL_TARGETS_ENEMY);
break;
case TARGET_UNIT_CONE_ALLY:
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_ALLY);
+ SearchAreaTarget(TagUnitMap, radius_f, PUSH_IN_FRONT, SPELL_TARGETS_ALLY);
break;
// nearby target
case TARGET_UNIT_NEARBY_ALLY:
+ case TARGET_UNIT_NEARBY_ALLY_UNK:
if(!m_targets.getUnitTarget())
- m_targets.setUnitTarget(SearchNearbyTarget(radius, SPELL_TARGETS_ALLY));
+ m_targets.setUnitTarget(SearchNearbyTarget(radius_f, SPELL_TARGETS_ALLY));
if(m_targets.getUnitTarget())
{
if(EffectChainTarget <= 1)
TagUnitMap.push_back(m_targets.getUnitTarget());
else
- SearchChainTarget(TagUnitMap, radius, EffectChainTarget, SPELL_TARGETS_ALLY);
+ SearchChainTarget(TagUnitMap, radius_f, EffectChainTarget, SPELL_TARGETS_ALLY);
}
break;
- case TARGET_RANDOM_ENEMY_CHAIN_IN_AREA:
+ case TARGET_UNIT_NEARBY_ENEMY:
if(!m_targets.getUnitTarget())
- m_targets.setUnitTarget(SearchNearbyTarget(radius, SPELL_TARGETS_ENEMY));
+ m_targets.setUnitTarget(SearchNearbyTarget(radius_h, SPELL_TARGETS_ENEMY));
if(m_targets.getUnitTarget())
{
if(EffectChainTarget <= 1)
TagUnitMap.push_back(m_targets.getUnitTarget());
else
- SearchChainTarget(TagUnitMap, radius, EffectChainTarget, SPELL_TARGETS_ENEMY);
+ SearchChainTarget(TagUnitMap, radius_h, EffectChainTarget, SPELL_TARGETS_ENEMY);
}
break;
case TARGET_SCRIPT:
@@ -1757,7 +1733,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
}
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
- float range = GetSpellMaxRange(srange);
+ float range = GetSpellMaxRangeForHostile(srange);
Creature* creatureScriptTarget = NULL;
GameObject* goScriptTarget = NULL;
@@ -1773,7 +1749,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
if(i_spellST->second.targetEntry)
{
Trinity::NearestGameObjectEntryInObjectRangeCheck go_check(*m_caster,i_spellST->second.targetEntry,range);
- Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> checker(p_GameObject,go_check);
+ Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> checker(m_caster, p_GameObject,go_check);
m_caster->VisitNearbyGridObject(range, checker);
if(p_GameObject)
@@ -1803,7 +1779,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
Creature *p_Creature = NULL;
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster,i_spellST->second.targetEntry,i_spellST->second.type!=SPELL_TARGET_TYPE_DEAD,range);
- Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(p_Creature, u_check);
+ Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_caster, p_Creature, u_check);
m_caster->VisitNearbyObject(range, searcher);
if(p_Creature )
@@ -1852,7 +1828,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
Player* Target = itr->getSource();
// IsHostileTo check duel and controlled by enemy
- if( Target && targetPlayer->IsWithinDistInMap(Target, radius) &&
+ if( Target && targetPlayer->IsWithinDistInMap(Target, radius_f) &&
targetPlayer->getClass() == Target->getClass() &&
!m_caster->IsHostileTo(Target) )
{
@@ -1883,7 +1859,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
float x, y, z, angle, dist;
float objSize = m_caster->GetObjectSize();
- dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ dist = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if(dist < objSize)
dist = objSize;
else if(cur == TARGET_DEST_CASTER_RANDOM)
@@ -1931,7 +1907,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
float x, y, z, angle, dist;
float objSize = target->GetObjectSize();
- dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ dist = target->GetSpellRadiusForTarget(target, sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if(dist < objSize)
dist = objSize;
else if(cur == TARGET_DEST_CASTER_RANDOM)
@@ -1967,7 +1943,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
float x, y, z, angle, dist;
- dist = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ dist = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if (cur == TARGET_DEST_DEST_RANDOM)
dist *= rand_norm();
@@ -2019,7 +1995,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
}
}
-void Spell::prepare(SpellCastTargets * targets, Aura* triggeredByAura)
+void Spell::prepare(SpellCastTargets const* targets, Aura* triggeredByAura)
{
if(m_CastItem)
m_castItemGUID = m_CastItem->GetGUID();
@@ -2041,7 +2017,7 @@ void Spell::prepare(SpellCastTargets * targets, Aura* triggeredByAura)
m_caster->m_Events.AddEvent(Event, m_caster->m_Events.CalculateTime(1));
//Prevent casting at cast another spell (ServerSide check)
- if(m_caster->IsNonMeleeSpellCasted(false, true) && m_cast_count)
+ if(m_caster->IsNonMeleeSpellCasted(false, true, true) && m_cast_count)
{
SendCastResult(SPELL_FAILED_SPELL_IN_PROGRESS);
finish(false);
@@ -2134,11 +2110,11 @@ void Spell::cancel()
{
Unit* unit = m_caster->GetGUID()==(*ihit).targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster, ihit->targetGUID);
if( unit && unit->isAlive() )
- unit->RemoveAurasDueToCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
+ unit->RemoveAurasByCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
}
}
- m_caster->RemoveAurasDueToCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
+ m_caster->RemoveAurasByCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
SendChannelUpdate(0);
SendInterrupted(0);
SendCastResult(SPELL_FAILED_INTERRUPTED);
@@ -2202,16 +2178,36 @@ void Spell::cast(bool skipCheck)
FillTargetMap();
- if(m_spellState == SPELL_STATE_FINISHED) // stop cast if spell marked as finish somewhere in Take*/FillTargetMap
+ if(m_spellInfo->SpellFamilyName)
{
- SetExecutedCurrently(false);
- return;
+ if (m_spellInfo->excludeCasterAuraSpell)
+ m_preCastSpell = m_spellInfo->excludeCasterAuraSpell;
+ else if (m_spellInfo->excludeTargetAuraSpell)
+ m_preCastSpell = m_spellInfo->excludeTargetAuraSpell;
+ }
+ switch (m_spellInfo->SpellFamilyName)
+ {
+ case SPELLFAMILY_GENERIC:
+ {
+ if (m_spellInfo->Mechanic == MECHANIC_BANDAGE) // Bandages
+ m_preCastSpell = 11196; // Recently Bandaged
+ else if(m_spellInfo->SpellIconID == 1662 && m_spellInfo->AttributesEx & 0x20)
+ m_preCastSpell = 23230; // Blood Fury - Healing Reduction
+ break;
+ }
}
-
// traded items have trade slot instead of guid in m_itemTargetGUID
// set to real guid to be sent later to the client
m_targets.updateTradeSlotItem();
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (m_CastItem)
+ ((Player*)m_caster)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, m_CastItem->GetEntry());
+
+ ((Player*)m_caster)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, m_spellInfo->Id);
+ }
+
if(!m_IsTriggeredSpell)
{
//TakePower();
@@ -2226,21 +2222,20 @@ void Spell::cast(bool skipCheck)
if(m_customAttr & SPELL_ATTR_CU_DIRECT_DAMAGE)
CalculateDamageDoneForAllTargets();
- //handle SPELL_AURA_ADD_TARGET_TRIGGER auras
//are there any spells need to be triggered after hit?
+ // handle SPELL_AURA_ADD_TARGET_TRIGGER auras
Unit::AuraList const& targetTriggers = m_caster->GetAurasByType(SPELL_AURA_ADD_TARGET_TRIGGER);
for(Unit::AuraList::const_iterator i = targetTriggers.begin(); i != targetTriggers.end(); ++i)
{
+ if (!(*i)->isAffectedOnSpell(m_spellInfo))
+ continue;
SpellEntry const *auraSpellInfo = (*i)->GetSpellProto();
uint32 auraSpellIdx = (*i)->GetEffIndex();
- if (IsAffectedBy(auraSpellInfo, auraSpellIdx))
+ if(SpellEntry const *spellInfo = sSpellStore.LookupEntry(auraSpellInfo->EffectTriggerSpell[auraSpellIdx]))
{
- if(SpellEntry const *spellInfo = sSpellStore.LookupEntry(auraSpellInfo->EffectTriggerSpell[auraSpellIdx]))
- {
- // Calculate chance at that moment (can be depend for example from combo points)
- int32 chance = m_caster->CalculateSpellDamage(auraSpellInfo, auraSpellIdx, (*i)->GetBasePoints(), NULL);
- m_ChanceTriggerSpells.push_back(std::make_pair(spellInfo, chance * (*i)->GetStackAmount()));
- }
+ // Calculate chance at that moment (can be depend for example from combo points)
+ int32 chance = m_caster->CalculateSpellDamage(auraSpellInfo, auraSpellIdx, (*i)->GetBasePoints(), NULL);
+ m_ChanceTriggerSpells.push_back(std::make_pair(spellInfo, chance * (*i)->GetStackAmount()));
}
}
@@ -2289,9 +2284,18 @@ void Spell::handle_immediate()
// start channeling if applicable
if(IsChanneledSpell(m_spellInfo))
{
- m_spellState = SPELL_STATE_CASTING;
- m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags);
- SendChannelStart(GetSpellDuration(m_spellInfo));
+ int32 duration = GetSpellDuration(m_spellInfo);
+ if (duration)
+ {
+ //apply haste mods
+ m_caster->ModSpellCastTime(m_spellInfo, duration);
+ // Apply duration mod
+ if(Player* modOwner = m_caster->GetSpellModOwner())
+ modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
+ m_spellState = SPELL_STATE_CASTING;
+ m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags);
+ SendChannelStart(duration);
+ }
}
// process immediate effects (items, ground, etc.) also initialize some variables
@@ -2472,7 +2476,7 @@ void Spell::SendSpellCooldown()
// shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
// prevent 0 cooldowns set by another way
- if (rec <= 0 && catrec <= 0 && (cat == 76 || cat == 351))
+ if (rec <= 0 && catrec <= 0 && (cat == 76 || IsAutoRepeatRangedSpell(m_spellInfo) && m_spellInfo->Id != SPELL_ID_AUTOSHOT))
rec = _player->GetAttackTime(RANGED_ATTACK);
// Now we have cooldown data (if found any), time to apply mods
@@ -2510,7 +2514,7 @@ void Spell::SendSpellCooldown()
if(*i_scset == m_spellInfo->Id) // skip main spell, already handled above
continue;
- _player->AddSpellCooldown(m_spellInfo->Id, m_CastItem ? m_CastItem->GetEntry() : 0, catrecTime);
+ _player->AddSpellCooldown(*i_scset, m_CastItem ? m_CastItem->GetEntry() : 0, catrecTime);
}
}
}
@@ -2688,9 +2692,9 @@ void Spell::SendCastResult(uint8 result)
if(result != 0)
{
WorldPacket data(SMSG_CAST_FAILED, (4+1+1));
+ data << uint8(m_cast_count); // single cast or multi 2.3 (0/1)
data << uint32(m_spellInfo->Id);
data << uint8(result); // problem
- data << uint8(m_cast_count); // single cast or multi 2.3 (0/1)
switch (result)
{
case SPELL_FAILED_REQUIRES_SPELL_FOCUS:
@@ -2711,8 +2715,8 @@ void Spell::SendCastResult(uint8 result)
case 45373: // Bloodberry Elixir
data << uint32(4075);
break;
- default: // default case
- data << uint32(m_spellInfo->AreaId);
+ default: // default case (don't must be)
+ data << uint32(0);
break;
}
break;
@@ -2731,18 +2735,11 @@ void Spell::SendCastResult(uint8 result)
case SPELL_FAILED_EQUIPPED_ITEM_CLASS:
data << uint32(m_spellInfo->EquippedItemClass);
data << uint32(m_spellInfo->EquippedItemSubClassMask);
- data << uint32(m_spellInfo->EquippedItemInventoryTypeMask);
+ //data << uint32(m_spellInfo->EquippedItemInventoryTypeMask);
break;
}
((Player*)m_caster)->GetSession()->SendPacket(&data);
}
- else
- {
- WorldPacket data(SMSG_CLEAR_EXTRA_AURA_INFO, (8+4));
- data.append(m_caster->GetPackGUID());
- data << uint32(m_spellInfo->Id);
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
- }
}
void Spell::SendSpellStart()
@@ -2756,6 +2753,9 @@ void Spell::SendSpellStart()
if(IsRangedSpell())
castFlags |= CAST_FLAG_AMMO;
+ if(m_spellInfo->runeCostID)
+ castFlags |= CAST_FLAG_UNKNOWN10;
+
Unit *target = m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster;
WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2));
@@ -2765,14 +2765,32 @@ void Spell::SendSpellStart()
data.append(m_caster->GetPackGUID());
data.append(m_caster->GetPackGUID());
- data << uint32(m_spellInfo->Id);
- data << uint8(m_cast_count); // single cast or multi 2.3 (0/1)
- data << uint16(castFlags);
- data << uint32(m_timer);
+ data << uint8(m_cast_count); // pending spell cast?
+ data << uint32(m_spellInfo->Id); // spellId
+ data << uint32(castFlags); // cast flags
+ data << uint32(m_timer); // delay?
m_targets.write(&data);
- if( castFlags & CAST_FLAG_AMMO )
+ if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power?
+ data << uint32(0);
+
+ if ( castFlags & CAST_FLAG_UNKNOWN7 ) // rune cooldowns list
+ {
+ uint8 v1 = 0;//m_runesState;
+ uint8 v2 = 0;//((Player*)m_caster)->GetRunesState();
+ data << uint8(v1); // runes state before
+ data << uint8(v2); // runes state after
+ for(uint8 i = 0; i < MAX_RUNES; ++i)
+ {
+ uint8 m = (1 << i);
+ if(m & v1) // usable before...
+ if(!(m & v2)) // ...but on cooldown now...
+ data << uint8(0); // some unknown byte (time?)
+ }
+ }
+
+ if ( castFlags & CAST_FLAG_AMMO )
WriteAmmoToPacket(&data);
m_caster->SendMessageToSet(&data, true);
@@ -2792,24 +2810,68 @@ void Spell::SendSpellGo()
if(IsRangedSpell())
castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual
+ if((m_caster->GetTypeId() == TYPEID_PLAYER) && (m_caster->getClass() == CLASS_DEATH_KNIGHT) && m_spellInfo->runeCostID)
+ {
+ castFlags |= CAST_FLAG_UNKNOWN10; // same as in SMSG_SPELL_START
+ castFlags |= CAST_FLAG_UNKNOWN6; // makes cooldowns visible
+ castFlags |= CAST_FLAG_UNKNOWN7; // rune cooldowns list
+ }
+
WorldPacket data(SMSG_SPELL_GO, 50); // guess size
+
if(m_CastItem)
data.append(m_CastItem->GetPackGUID());
else
data.append(m_caster->GetPackGUID());
data.append(m_caster->GetPackGUID());
- data << uint32(m_spellInfo->Id);
- data << uint16(castFlags);
+ data << uint8(m_cast_count); // pending spell cast?
+ data << uint32(m_spellInfo->Id); // spellId
+ data << uint32(castFlags); // cast flags
data << uint32(getMSTime()); // timestamp
WriteSpellGoTargets(&data);
m_targets.write(&data);
- if( castFlags & CAST_FLAG_AMMO )
+ if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power?
+ data << uint32(0);
+
+ if ( castFlags & CAST_FLAG_UNKNOWN7 ) // rune cooldowns list
+ {
+ uint8 v1 = m_runesState;
+ uint8 v2 = ((Player*)m_caster)->GetRunesState();
+ data << uint8(v1); // runes state before
+ data << uint8(v2); // runes state after
+ for(uint8 i = 0; i < MAX_RUNES; ++i)
+ {
+ uint8 m = (1 << i);
+ if(m & v1) // usable before...
+ if(!(m & v2)) // ...but on cooldown now...
+ data << uint8(0); // some unknown byte (time?)
+ }
+ }
+
+ if ( castFlags & CAST_FLAG_UNKNOWN4 ) // unknown wotlk
+ {
+ data << float(0);
+ data << uint32(0);
+ }
+
+ if ( castFlags & CAST_FLAG_AMMO )
WriteAmmoToPacket(&data);
+ if ( castFlags & CAST_FLAG_UNKNOWN5 ) // unknown wotlk
+ {
+ data << uint32(0);
+ data << uint32(0);
+ }
+
+ if ( m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION )
+ {
+ data << uint8(0);
+ }
+
m_caster->SendMessageToSet(&data, true);
}
@@ -2854,15 +2916,36 @@ void Spell::WriteAmmoToPacket( WorldPacket * data )
void Spell::WriteSpellGoTargets( WorldPacket * data )
{
- *data << (uint8)m_countOfHit;
+ // This function also fill data for channeled spells:
+ // m_needAliveTargetMask req for stop channelig if one target die
+ uint32 hit = m_UniqueGOTargetInfo.size(); // Always hits on GO
+ uint32 miss = 0;
+ for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
+ {
+ if ((*ihit).effectMask == 0) // No effect apply - all immuned add state
+ {
+ // possibly SPELL_MISS_IMMUNE2 for this??
+ ihit->missCondition = SPELL_MISS_IMMUNE2;
+ miss++;
+ }
+ else if ((*ihit).missCondition == SPELL_MISS_NONE)
+ hit++;
+ else
+ miss++;
+ }
+
+ *data << (uint8)hit;
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
if ((*ihit).missCondition == SPELL_MISS_NONE) // Add only hits
+ {
*data << uint64(ihit->targetGUID);
+ m_needAliveTargetMask |=ihit->effectMask;
+ }
for(std::list<GOTargetInfo>::iterator ighit= m_UniqueGOTargetInfo.begin();ighit != m_UniqueGOTargetInfo.end();++ighit)
*data << uint64(ighit->targetGUID); // Always hits
- *data << (uint8)m_countOfMiss;
+ *data << (uint8)miss;
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
{
if( ihit->missCondition != SPELL_MISS_NONE ) // Add only miss
@@ -2873,6 +2956,9 @@ void Spell::WriteSpellGoTargets( WorldPacket * data )
*data << uint8(ihit->reflectResult);
}
}
+ // Reset m_needAliveTargetMask for non channeled spell
+ if(!IsChanneledSpell(m_spellInfo))
+ m_needAliveTargetMask = 0;
}
void Spell::SendLogExecute()
@@ -2937,30 +3023,19 @@ void Spell::SendLogExecute()
data << uint8(0);
break;
case SPELL_EFFECT_CREATE_ITEM:
+ case SPELL_EFFECT_CREATE_ITEM_2:
data << uint32(m_spellInfo->EffectItemType[0]);
break;
case SPELL_EFFECT_SUMMON:
- case SPELL_EFFECT_SUMMON_WILD:
- case SPELL_EFFECT_SUMMON_GUARDIAN:
case SPELL_EFFECT_TRANS_DOOR:
case SPELL_EFFECT_SUMMON_PET:
- case SPELL_EFFECT_SUMMON_POSSESSED:
- case SPELL_EFFECT_SUMMON_TOTEM:
case SPELL_EFFECT_SUMMON_OBJECT_WILD:
case SPELL_EFFECT_CREATE_HOUSE:
case SPELL_EFFECT_DUEL:
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT1:
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT2:
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT3:
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT4:
- case SPELL_EFFECT_SUMMON_PHANTASM:
- case SPELL_EFFECT_SUMMON_CRITTER:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT1:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT2:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
- case SPELL_EFFECT_SUMMON_DEMON:
- case SPELL_EFFECT_150:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
else if(m_targets.getItemTargetGUID())
@@ -2979,6 +3054,13 @@ void Spell::SendLogExecute()
else
data << uint8(0);
break;
+ case SPELL_EFFECT_RESURRECT:
+ case SPELL_EFFECT_RESURRECT_NEW:
+ if(Unit *unit = m_targets.getUnitTarget())
+ data.append(unit->GetPackGUID());
+ else
+ data << uint8(0);
+ break;
default:
return;
}
@@ -2992,13 +3074,16 @@ void Spell::SendInterrupted(uint8 result)
{
WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1));
data.append(m_caster->GetPackGUID());
- data << m_spellInfo->Id;
- data << result;
+ data << uint8(m_cast_count);
+ data << uint32(m_spellInfo->Id);
+ data << uint8(result);
m_caster->SendMessageToSet(&data, true);
data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4));
data.append(m_caster->GetPackGUID());
- data << m_spellInfo->Id;
+ data << uint8(m_cast_count);
+ data << uint32(m_spellInfo->Id);
+ data << uint8(result);
m_caster->SendMessageToSet(&data, true);
}
@@ -3066,10 +3151,19 @@ void Spell::SendChannelStart(uint32 duration)
void Spell::SendResurrectRequest(Player* target)
{
- WorldPacket data(SMSG_RESURRECT_REQUEST, (8+4+2+4));
- data << m_caster->GetGUID();
- data << uint32(1) << uint16(0) << uint32(1);
+ // Both players and NPCs can resurrect using spells - have a look at creature 28487 for example
+ // However, the packet structure differs slightly
+
+ const char* sentName = m_caster->GetTypeId()==TYPEID_PLAYER ?"":m_caster->GetNameForLocaleIdx(target->GetSession()->GetSessionDbLocaleIndex());
+
+ WorldPacket data(SMSG_RESURRECT_REQUEST, (8+4+strlen(sentName)+1+1+1));
+ data << uint64(m_caster->GetGUID());
+ data << uint32(strlen(sentName)+1);
+
+ data << sentName;
+ data << uint8(0);
+ data << uint8(m_caster->GetTypeId()==TYPEID_PLAYER ?0:1);
target->GetSession()->SendPacket(&data);
}
@@ -3122,7 +3216,7 @@ void Spell::TakeCastItem()
if (charges)
{
(charges > 0) ? --charges : ++charges; // abs(charges) less at 1 after use
- if (proto->Stackable < 2)
+ if (proto->Stackable == 1)
m_CastItem->SetSpellCharges(i, charges);
m_CastItem->SetState(ITEM_CHANGED, (Player*)m_caster);
}
@@ -3161,6 +3255,12 @@ void Spell::TakePower()
{
if(ihit->missCondition != SPELL_MISS_NONE && ihit->missCondition != SPELL_MISS_MISS/* && ihit->targetGUID!=m_caster->GetGUID()*/)
hit = false;
+ if (ihit->missCondition != SPELL_MISS_NONE)
+ {
+ //lower spell cost on fail (by talent aura)
+ if(Player *modOwner = ((Player*)m_caster)->GetSpellModOwner())
+ modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_SPELL_COST_REFUND_ON_FAIL, m_powerCost);
+ }
break;
}
if(hit && NeedsComboPoints(m_spellInfo))
@@ -3182,6 +3282,12 @@ void Spell::TakePower()
Powers powerType = Powers(m_spellInfo->powerType);
+ if(powerType == POWER_RUNE)
+ {
+ TakeRunePower();
+ return;
+ }
+
if(hit)
m_caster->ModifyPower(powerType, -m_powerCost);
else
@@ -3192,6 +3298,145 @@ void Spell::TakePower()
m_caster->SetLastManaUse(getMSTime());
}
+void Spell::TakeAmmo()
+{
+ if(m_attackType == RANGED_ATTACK && m_caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ Item *pItem = ((Player*)m_caster)->GetWeaponForAttack( RANGED_ATTACK );
+
+ // wands don't have ammo
+ if(!pItem || pItem->IsBroken() || pItem->GetProto()->SubClass==ITEM_SUBCLASS_WEAPON_WAND)
+ return;
+
+ if( pItem->GetProto()->InventoryType == INVTYPE_THROWN )
+ {
+ if(pItem->GetMaxStackCount()==1)
+ {
+ // decrease durability for non-stackable throw weapon
+ ((Player*)m_caster)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_RANGED);
+ }
+ else
+ {
+ // decrease items amount for stackable throw weapon
+ uint32 count = 1;
+ ((Player*)m_caster)->DestroyItemCount( pItem, count, true);
+ }
+ }
+ else if(uint32 ammo = ((Player*)m_caster)->GetUInt32Value(PLAYER_AMMO_ID))
+ ((Player*)m_caster)->DestroyItemCount(ammo, 1, true);
+ }
+}
+
+uint8 Spell::CheckRuneCost(uint32 runeCostID)
+{
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return 0;
+
+ Player *plr = (Player*)m_caster;
+
+ if(plr->getClass() != CLASS_DEATH_KNIGHT)
+ return 0;
+
+ SpellRuneCostEntry const *src = sSpellRuneCostStore.LookupEntry(runeCostID);
+
+ if(!src)
+ return 0;
+
+ if(src->NoRuneCost())
+ return 0;
+
+ int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death
+
+ for(uint32 i = 0; i < RUNE_DEATH; ++i)
+ {
+ runeCost[i] = src->RuneCost[i];
+ }
+
+ runeCost[RUNE_DEATH] = 0; // calculated later
+
+ for(uint32 i = 0; i < MAX_RUNES; ++i)
+ {
+ uint8 rune = plr->GetCurrentRune(i);
+ if((plr->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0))
+ {
+ runeCost[rune]--;
+ }
+ }
+
+ for(uint32 i = 0; i < RUNE_DEATH; ++i)
+ {
+ if(runeCost[i] > 0)
+ {
+ runeCost[RUNE_DEATH] += runeCost[i];
+ }
+ }
+
+ if(runeCost[RUNE_DEATH] > 0)
+ return SPELL_FAILED_NO_POWER; // not sure if result code is correct
+
+ return 0;
+}
+
+void Spell::TakeRunePower()
+{
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ Player *plr = (Player*)m_caster;
+
+ if(plr->getClass() != CLASS_DEATH_KNIGHT)
+ return;
+
+ SpellRuneCostEntry const *src = sSpellRuneCostStore.LookupEntry(m_spellInfo->runeCostID);
+
+ if(!src || (src->NoRuneCost() && src->NoRunicPowerGain()))
+ return;
+
+ m_runesState = plr->GetRunesState(); // store previous state
+
+ int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death
+
+ for(uint32 i = 0; i < RUNE_DEATH; ++i)
+ {
+ runeCost[i] = src->RuneCost[i];
+ }
+
+ runeCost[RUNE_DEATH] = 0; // calculated later
+
+ for(uint32 i = 0; i < MAX_RUNES; ++i)
+ {
+ uint8 rune = plr->GetCurrentRune(i);
+ if((plr->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0))
+ {
+ plr->SetRuneCooldown(i, RUNE_COOLDOWN); // 5*2=10 sec
+ runeCost[rune]--;
+ }
+ }
+
+ runeCost[RUNE_DEATH] = runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST];
+
+ if(runeCost[RUNE_DEATH] > 0)
+ {
+ for(uint32 i = 0; i < MAX_RUNES; ++i)
+ {
+ uint8 rune = plr->GetCurrentRune(i);
+ if((plr->GetRuneCooldown(i) == 0) && (rune == RUNE_DEATH))
+ {
+ plr->SetRuneCooldown(i, RUNE_COOLDOWN); // 5*2=10 sec
+ runeCost[rune]--;
+ plr->ConvertRune(i, plr->GetBaseRune(i));
+ if(runeCost[RUNE_DEATH] == 0)
+ break;
+ }
+ }
+ }
+
+ // you can gain some runic power when use runes
+ float rp = src->runePowerGain;;
+ rp *= sWorld.getRate(RATE_POWER_RUNICPOWER_INCOME);
+ plr->ModifyPower(POWER_RUNIC_POWER, (int32)rp);
+}
+
void Spell::TakeReagents()
{
if(m_IsTriggeredSpell) // reagents used in triggered spell removed by original spell or don't must be removed.
@@ -3200,11 +3445,9 @@ void Spell::TakeReagents()
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
- if (m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
- m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION))
- return;
-
Player* p_caster = (Player*)m_caster;
+ if (p_caster->CanNoReagentCast(m_spellInfo))
+ return;
for(uint32 x=0;x<8;x++)
{
@@ -3267,14 +3510,9 @@ void Spell::HandleEffects(Unit *pUnitTarget,Item *pItemTarget,GameObject *pGOTar
gameObjTarget = pGOTarget;
uint8 eff = m_spellInfo->Effect[i];
- uint32 mechanic = m_spellInfo->EffectMechanic[i];
sLog.outDebug( "Spell: Effect : %u", eff);
- //Simply return. Do not display "immune" in red text on client
- if(unitTarget && unitTarget->IsImmunedToSpellEffect(eff, mechanic))
- return;
-
//we do not need DamageMultiplier here.
damage = CalculateDamage(i, NULL);
@@ -3312,6 +3550,9 @@ uint8 Spell::CanCast(bool strict)
// check cooldowns to prevent cheating
if(m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->HasSpellCooldown(m_spellInfo->Id))
{
+ //can cast triggered (by aura only?) spells while have this flag
+ if (!m_IsTriggeredSpell && ((Player*)m_caster)->HasFlag(PLAYER_FLAGS, PLAYER_ALLOW_ONLY_ABILITY))
+ return SPELL_FAILED_SPELL_IN_PROGRESS;
if(m_triggeredByAuraSpell)
return SPELL_FAILED_DONT_REPORT;
else
@@ -3328,19 +3569,55 @@ uint8 Spell::CanCast(bool strict)
// for now, ignore triggered spells
if( strict && !m_IsTriggeredSpell)
{
- // Cannot be used in this stance/form
- if(uint8 shapeError = GetErrorAtShapeshiftedCast(m_spellInfo, m_caster->m_form))
- return shapeError;
+ bool checkForm = true;
+ // Ignore form req aura
+ Unit::AuraList const& ignore = m_caster->GetAurasByType(SPELL_AURA_MOD_IGNORE_SHAPESHIFT);
+ for(Unit::AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
+ {
+ if (!(*i)->isAffectedOnSpell(m_spellInfo))
+ continue;
+ checkForm = false;
+ break;
+ }
+ if (checkForm)
+ {
+ // Cannot be used in this stance/form
+ if(uint8 shapeError = GetErrorAtShapeshiftedCast(m_spellInfo, m_caster->m_form))
+ return shapeError;
- if ((m_spellInfo->Attributes & SPELL_ATTR_ONLY_STEALTHED) && !(m_caster->HasStealthAura()))
- return SPELL_FAILED_ONLY_STEALTHED;
+ if ((m_spellInfo->Attributes & SPELL_ATTR_ONLY_STEALTHED) && !(m_caster->HasStealthAura()))
+ return SPELL_FAILED_ONLY_STEALTHED;
+ }
+ }
+
+ bool reqAuraState=true;
+ Unit::AuraList const& stateAuras = m_caster->GetAurasByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
+ for(Unit::AuraList::const_iterator j = stateAuras.begin();j != stateAuras.end(); ++j)
+ {
+ if((*j)->isAffectedOnSpell(m_spellInfo))
+ {
+ reqAuraState=false;
+ break;
+ }
+ }
+
+ if (reqAuraState)
+ {
+ // caster state requirements
+ if(m_spellInfo->CasterAuraState && !m_caster->HasAuraState(AuraState(m_spellInfo->CasterAuraState)))
+ return SPELL_FAILED_CASTER_AURASTATE;
+ if(m_spellInfo->CasterAuraStateNot && m_caster->HasAuraState(AuraState(m_spellInfo->CasterAuraStateNot)))
+ return SPELL_FAILED_CASTER_AURASTATE;
+
+ if(m_spellInfo->casterAuraSpell && !m_caster->HasAura(m_spellInfo->casterAuraSpell))
+ return SPELL_FAILED_CASTER_AURASTATE;
+ if(m_spellInfo->excludeCasterAuraSpell && m_caster->HasAura(m_spellInfo->excludeCasterAuraSpell))
+ return SPELL_FAILED_CASTER_AURASTATE;
+
+ if(m_caster->isInCombat() && IsNonCombatSpell(m_spellInfo))
+ return SPELL_FAILED_AFFECTING_COMBAT;
}
- // caster state requirements
- if(m_spellInfo->CasterAuraState && !m_caster->HasAuraState(AuraState(m_spellInfo->CasterAuraState)))
- return SPELL_FAILED_CASTER_AURASTATE;
- if(m_spellInfo->CasterAuraStateNot && m_caster->HasAuraState(AuraState(m_spellInfo->CasterAuraStateNot)))
- return SPELL_FAILED_CASTER_AURASTATE;
// cancel autorepeat spells if cast start when moving
// (not wand currently autorepeat cast delayed to moving stop anyway in spell update code)
@@ -3356,14 +3633,23 @@ uint8 Spell::CanCast(bool strict)
if(target)
{
- // target state requirements (not allowed state), apply to self also
- if(m_spellInfo->TargetAuraStateNot && target->HasAuraState(AuraState(m_spellInfo->TargetAuraStateNot)))
- return SPELL_FAILED_TARGET_AURASTATE;
+ if (reqAuraState)
+ {
+ // target state requirements (not allowed state), apply to self also
+ if(m_spellInfo->TargetAuraStateNot && target->HasAuraState(AuraState(m_spellInfo->TargetAuraStateNot)))
+ return SPELL_FAILED_TARGET_AURASTATE;
+
+ if(m_spellInfo->targetAuraSpell && !target->HasAura(m_spellInfo->targetAuraSpell))
+ return SPELL_FAILED_TARGET_AURASTATE;
+
+ if(m_spellInfo->excludeTargetAuraSpell && target->HasAura(m_spellInfo->excludeTargetAuraSpell))
+ return SPELL_FAILED_TARGET_AURASTATE;
+ }
if(target != m_caster)
{
// target state requirements (apply to non-self only), to allow cast affects to self like Dirty Deeds
- if(m_spellInfo->TargetAuraState && !target->HasAuraState(AuraState(m_spellInfo->TargetAuraState)))
+ if(reqAuraState && m_spellInfo->TargetAuraState && !target->HasAuraState(AuraState(m_spellInfo->TargetAuraState)))
return SPELL_FAILED_TARGET_AURASTATE;
// Not allow casting on flying player
@@ -3385,6 +3671,20 @@ uint8 Spell::CanCast(bool strict)
}
}
}
+ else if (m_caster->GetTypeId()==TYPEID_PLAYER) // Target - is player caster
+ {
+ // Additional check for some spells
+ // If 0 spell effect empty - client not send target data (need use selection)
+ // TODO: check it on next client version
+ if (m_targets.m_targetMask == TARGET_FLAG_SELF &&
+ m_spellInfo->EffectImplicitTargetA[1] == TARGET_CHAIN_DAMAGE)
+ {
+ if (target = m_caster->GetUnit(*m_caster, ((Player *)m_caster)->GetSelection()))
+ m_targets.setUnitTarget(target);
+ else
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+ }
// check pet presents
for(int j=0;j<3;j++)
@@ -3436,13 +3736,16 @@ uint8 Spell::CanCast(bool strict)
if(IsPositiveSpell(m_spellInfo->Id))
{
- if(target->IsImmunedToSpell(m_spellInfo,false))
+ if(target->IsImmunedToSpell(m_spellInfo))
return SPELL_FAILED_TARGET_AURASTATE;
}
//Must be behind the target.
if( m_spellInfo->AttributesEx2 == 0x100000 && (m_spellInfo->AttributesEx & 0x200) == 0x200 && target->HasInArc(M_PI, m_caster)
- && (m_spellInfo->SpellFamilyName != SPELLFAMILY_DRUID || m_spellInfo->SpellFamilyFlags != 0x0000000000020000LL))
+ //Exclusion for Pounce: Facing Limitation was removed in 2.0.1, but it still uses the same, old Ex-Flags
+ && (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags.IsEqual(0x20000,0,0)))
+ //Mutilate no longer requires you be behind the target as of patch 3.0.3
+ && (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && m_spellInfo->SpellFamilyFlags[1] & 0x200000)))
{
SendInterrupted(2);
return SPELL_FAILED_NOT_BEHIND;
@@ -3476,8 +3779,9 @@ uint8 Spell::CanCast(bool strict)
return SPELL_FAILED_NOT_IN_ARENA;
// zone check
- if(!IsSpellAllowedInLocation(m_spellInfo,m_caster->GetMapId(),m_caster->GetZoneId(),m_caster->GetAreaId()))
- return SPELL_FAILED_REQUIRES_AREA;
+ if (uint8 res= GetSpellAllowedInLocationError(m_spellInfo,m_caster->GetMapId(),m_caster->GetZoneId(),m_caster->GetAreaId(),
+ m_caster->GetTypeId()==TYPEID_PLAYER ? ((Player*)m_caster)->GetBattleGroundId() : 0))
+ return res;
// not let players cast spells at mount (and let do it to creatures)
if( m_caster->IsMounted() && m_caster->GetTypeId()==TYPEID_PLAYER && !m_IsTriggeredSpell &&
@@ -3530,7 +3834,7 @@ uint8 Spell::CanCast(bool strict)
cell.data.Part.reserved = ALL_DISTRICT;
MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*m_caster,i_spellST->second.targetEntry,range);
- MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(p_GameObject,go_check);
+ MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(m_caster, p_GameObject,go_check);
TypeContainerVisitor<MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -3568,7 +3872,7 @@ uint8 Spell::CanCast(bool strict)
cell.SetNoCreate(); // Really don't know what is that???
MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster,i_spellST->second.targetEntry,i_spellST->second.type!=SPELL_TARGET_TYPE_DEAD,range);
- MaNGOS::CreatureLastSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(p_Creature, u_check);
+ MaNGOS::CreatureLastSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_caster, p_Creature, u_check);
TypeContainerVisitor<MaNGOS::CreatureLastSearcher<MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher);
@@ -3676,7 +3980,7 @@ uint8 Spell::CanCast(bool strict)
case SPELL_EFFECT_SCHOOL_DAMAGE:
{
// Hammer of Wrath
- if(m_spellInfo->SpellVisual == 7250)
+ if(m_spellInfo->SpellVisual[0] == 7250)
{
if (!m_targets.getUnitTarget())
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
@@ -3701,15 +4005,9 @@ uint8 Spell::CanCast(bool strict)
if(!learn_spellproto)
return SPELL_FAILED_NOT_KNOWN;
- if(!pet->CanTakeMoreActiveSpells(learn_spellproto->Id))
- return SPELL_FAILED_TOO_MANY_SKILLS;
-
if(m_spellInfo->spellLevel > pet->getLevel())
return SPELL_FAILED_LOWLEVEL;
- if(!pet->HasTPForSpell(learn_spellproto->Id))
- return SPELL_FAILED_TRAINING_POINTS;
-
break;
}
case SPELL_EFFECT_LEARN_PET_SPELL:
@@ -3724,20 +4022,18 @@ uint8 Spell::CanCast(bool strict)
if(!learn_spellproto)
return SPELL_FAILED_NOT_KNOWN;
- if(!pet->CanTakeMoreActiveSpells(learn_spellproto->Id))
- return SPELL_FAILED_TOO_MANY_SKILLS;
-
if(m_spellInfo->spellLevel > pet->getLevel())
return SPELL_FAILED_LOWLEVEL;
- if(!pet->HasTPForSpell(learn_spellproto->Id))
- return SPELL_FAILED_TRAINING_POINTS;
-
break;
}
case SPELL_EFFECT_FEED_PET:
{
- if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.getItemTarget() )
+ if (m_caster->GetTypeId() != TYPEID_PLAYER)
+ return SPELL_FAILED_BAD_TARGETS;
+
+ Item* foodItem = m_targets.getItemTarget();
+ if(!foodItem)
return SPELL_FAILED_BAD_TARGETS;
Pet* pet = m_caster->GetPet();
@@ -3745,10 +4041,10 @@ uint8 Spell::CanCast(bool strict)
if(!pet)
return SPELL_FAILED_NO_PET;
- if(!pet->HaveInDiet(m_targets.getItemTarget()->GetProto()))
+ if(!pet->HaveInDiet(foodItem->GetProto()))
return SPELL_FAILED_WRONG_PET_FOOD;
- if(!pet->GetCurrentFoodBenefitLevel(m_targets.getItemTarget()->GetProto()->ItemLevel))
+ if(!pet->GetCurrentFoodBenefitLevel(foodItem->GetProto()->ItemLevel))
return SPELL_FAILED_FOOD_LOWLEVEL;
if(m_caster->isInCombat() || pet->isInCombat())
@@ -3835,27 +4131,27 @@ uint8 Spell::CanCast(bool strict)
{
// check for lock - key pair (checked by client also, just prevent cheating
bool ok_key = false;
- for(int it = 0; it < 5; ++it)
+ for(int it = 0; it < 8; ++it)
{
- switch(lockInfo->keytype[it])
+ switch(lockInfo->Type[it])
{
case LOCK_KEY_NONE:
break;
case LOCK_KEY_ITEM:
{
- if(lockInfo->key[it])
+ if(lockInfo->Index[it])
{
- if(m_CastItem && m_CastItem->GetEntry()==lockInfo->key[it])
+ if(m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[it])
ok_key =true;
break;
}
}
case LOCK_KEY_SKILL:
{
- if(uint32(m_spellInfo->EffectMiscValue[i])!=lockInfo->key[it])
+ if(uint32(m_spellInfo->EffectMiscValue[i])!=lockInfo->Index[it])
break;
- switch(lockInfo->key[it])
+ switch(lockInfo->Index[it])
{
case LOCKTYPE_HERBALISM:
if(((Player*)m_caster)->HasSkill(SKILL_HERBALISM))
@@ -3913,9 +4209,9 @@ uint8 Spell::CanCast(bool strict)
{
// check for lock - key pair
bool ok = false;
- for(int it = 0; it < 5; ++it)
+ for(int it = 0; it < 8; ++it)
{
- if(lockInfo->keytype[it]==LOCK_KEY_ITEM && lockInfo->key[it] && m_CastItem && m_CastItem->GetEntry()==lockInfo->key[it])
+ if(lockInfo->Type[it]==LOCK_KEY_ITEM && lockInfo->Index[it] && m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[it])
{
// if so, we're good to go
ok = true;
@@ -3926,9 +4222,9 @@ uint8 Spell::CanCast(bool strict)
break;
if (m_spellInfo->EffectMiscValue[i] == LOCKTYPE_PICKLOCK)
- ReqValue = lockInfo->requiredlockskill;
+ ReqValue = lockInfo->Skill[1];
else
- ReqValue = lockInfo->requiredminingskill;
+ ReqValue = lockInfo->Skill[0];
}
// skill doesn't meet the required value
@@ -3952,9 +4248,7 @@ uint8 Spell::CanCast(bool strict)
break;
}
- // This is generic summon effect now and don't make this check for summon types similar
- // SPELL_EFFECT_SUMMON_CRITTER, SPELL_EFFECT_SUMMON_WILD or SPELL_EFFECT_SUMMON_GUARDIAN.
- // These won't show up in m_caster->GetPetGUID()
+ // This is generic summon effect
case SPELL_EFFECT_SUMMON:
{
switch(m_spellInfo->EffectMiscValueB[i])
@@ -3975,11 +4269,8 @@ uint8 Spell::CanCast(bool strict)
}
break;
}
- // Don't make this check for SPELL_EFFECT_SUMMON_CRITTER, SPELL_EFFECT_SUMMON_WILD or SPELL_EFFECT_SUMMON_GUARDIAN.
- // These won't show up in m_caster->GetPetGUID()
- case SPELL_EFFECT_SUMMON_POSSESSED:
+ // Not used for summon?
case SPELL_EFFECT_SUMMON_PHANTASM:
- case SPELL_EFFECT_SUMMON_DEMON:
{
if(m_caster->GetPetGUID())
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
@@ -4037,7 +4328,7 @@ uint8 Spell::CanCast(bool strict)
case SPELL_EFFECT_LEAP:
case SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER:
{
- float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float dis = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
float fx = m_caster->GetPositionX() + dis * cos(m_caster->GetOrientation());
float fy = m_caster->GetPositionY() + dis * sin(m_caster->GetOrientation());
// teleport a bit above terrain level to avoid falling below it
@@ -4124,17 +4415,14 @@ uint8 Spell::CanCast(bool strict)
return SPELL_FAILED_NO_MOUNTS_ALLOWED;
// Ignore map check if spell have AreaId. AreaId already checked and this prevent special mount spells
- if (m_caster->GetTypeId()==TYPEID_PLAYER && !sMapStore.LookupEntry(m_caster->GetMapId())->IsMountAllowed() && !m_IsTriggeredSpell && !m_spellInfo->AreaId)
- return SPELL_FAILED_NO_MOUNTS_ALLOWED;
-
- if (m_caster->GetAreaId()==35)
+ if (m_caster->GetTypeId()==TYPEID_PLAYER && !sMapStore.LookupEntry(m_caster->GetMapId())->IsMountAllowed() && !m_IsTriggeredSpell && !m_spellInfo->AreaGroupId)
return SPELL_FAILED_NO_MOUNTS_ALLOWED;
ShapeshiftForm form = m_caster->m_form;
if( form == FORM_CAT || form == FORM_TREE || form == FORM_TRAVEL ||
form == FORM_AQUA || form == FORM_BEAR || form == FORM_DIREBEAR ||
form == FORM_CREATUREBEAR || form == FORM_GHOSTWOLF || form == FORM_FLIGHT ||
- form == FORM_FLIGHT_EPIC || form == FORM_MOONKIN )
+ form == FORM_FLIGHT_EPIC || form == FORM_MOONKIN || form == FORM_METAMORPHOSIS )
return SPELL_FAILED_NOT_SHAPESHIFT;
break;
@@ -4153,11 +4441,10 @@ uint8 Spell::CanCast(bool strict)
case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED:
case SPELL_AURA_FLY:
{
- // not allow cast fly spells at old maps by players (all spells is self target)
+ // not allow cast fly spells at old maps by players (all spells is self target)
if(m_caster->GetTypeId()==TYPEID_PLAYER)
{
- if( !((Player*)m_caster)->isGameMaster() &&
- GetVirtualMapForMapAndZone(m_caster->GetMapId(),m_caster->GetZoneId()) != 530)
+ if( !((Player*)m_caster)->IsAllowUseFlyMountsHere() )
return SPELL_FAILED_NOT_HERE;
}
break;
@@ -4272,15 +4559,16 @@ uint8 Spell::CheckCasterAuras() const
//Check whether the cast should be prevented by any state you might have.
uint8 prevented_reason = 0;
// Have to check if there is a stun aura. Otherwise will have problems with ghost aura apply while logging out
- if(!(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_USABLE_WHILE_STUNNED) && m_caster->HasAuraType(SPELL_AURA_MOD_STUN))
+ uint32 unitflag = m_caster->GetUInt32Value(UNIT_FIELD_FLAGS); // Get unit state
+ if(unitflag & UNIT_FLAG_STUNNED && !(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_USABLE_WHILE_STUNNED))
prevented_reason = SPELL_FAILED_STUNNED;
- else if(m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED) && !(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_USABLE_WHILE_CONFUSED))
+ else if(unitflag & UNIT_FLAG_CONFUSED && !(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_USABLE_WHILE_CONFUSED))
prevented_reason = SPELL_FAILED_CONFUSED;
- else if(m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING) && !(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_USABLE_WHILE_FEARED))
+ else if(unitflag & UNIT_FLAG_FLEEING && !(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_USABLE_WHILE_FEARED))
prevented_reason = SPELL_FAILED_FLEEING;
- else if(m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED) && m_spellInfo->PreventionType==SPELL_PREVENTION_TYPE_SILENCE)
+ else if(unitflag & UNIT_FLAG_SILENCED && m_spellInfo->PreventionType==SPELL_PREVENTION_TYPE_SILENCE)
prevented_reason = SPELL_FAILED_SILENCED;
- else if(m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED) && m_spellInfo->PreventionType==SPELL_PREVENTION_TYPE_PACIFY)
+ else if(unitflag & UNIT_FLAG_PACIFIED && m_spellInfo->PreventionType==SPELL_PREVENTION_TYPE_PACIFY)
prevented_reason = SPELL_FAILED_PACIFIED;
// Attr must make flag drop spell totally immune from all effects
@@ -4389,15 +4677,15 @@ uint8 Spell::CheckRange(bool strict)
range_mod = 6.25;*/
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
- float max_range = GetSpellMaxRange(srange); // + range_mod;
- float min_range = GetSpellMinRange(srange);
+
+ Unit *target = m_targets.getUnitTarget();
+ float max_range = m_caster->GetSpellMaxRangeForTarget(target, srange); // + range_mod;
+ float min_range = m_caster->GetSpellMinRangeForTarget(target, srange);
uint32 range_type = GetSpellRangeType(srange);
if(Player* modOwner = m_caster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, max_range, this);
- Unit *target = m_targets.getUnitTarget();
-
if(target && target != m_caster)
{
if(range_type == SPELL_RANGE_MELEE)
@@ -4471,9 +4759,12 @@ int32 Spell::CalculatePowerCost()
case POWER_FOCUS:
case POWER_ENERGY:
case POWER_HAPPINESS:
- // case POWER_RUNES:
powerCost += m_spellInfo->ManaCostPercentage * m_caster->GetMaxPower(Powers(m_spellInfo->powerType)) / 100;
break;
+ case POWER_RUNE:
+ case POWER_RUNIC_POWER:
+ sLog.outDebug("Spell::CalculateManaCost: Not implemented yet!");
+ break;
default:
sLog.outError("Spell::CalculateManaCost: Unknown power type '%d' in spell %d", m_spellInfo->powerType, m_spellInfo->Id);
return 0;
@@ -4518,6 +4809,11 @@ uint8 Spell::CheckPower()
sLog.outError("Spell::CheckMana: Unknown power type '%d'", m_spellInfo->powerType);
return SPELL_FAILED_UNKNOWN;
}
+
+ uint8 failReason = CheckRuneCost(m_spellInfo->runeCostID);
+ if(failReason)
+ return failReason;
+
// Check power amount
Powers powerType = Powers(m_spellInfo->powerType);
if(m_caster->GetPower(powerType) < m_powerCost)
@@ -4637,8 +4933,8 @@ uint8 Spell::CheckItems()
cell.data.Part.reserved = ALL_DISTRICT;
GameObject* ok = NULL;
- Trinity::GameObjectFocusCheck go_check(m_caster,m_spellInfo->RequiresSpellFocus);
- Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck> checker(ok,go_check);
+ MaNGOS::GameObjectFocusCheck go_check(m_caster,m_spellInfo->RequiresSpellFocus);
+ MaNGOS::GameObjectSearcher<MaNGOS::GameObjectFocusCheck> checker(m_caster,ok,go_check);
TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -4650,8 +4946,7 @@ uint8 Spell::CheckItems()
focusObject = ok; // game object found in range
}
- if (!(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
- m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION)))
+ if (!p_caster->CanNoReagentCast(m_spellInfo))
{
for(uint32 i=0;i<8;i++)
{
@@ -4736,6 +5031,7 @@ uint8 Spell::CheckItems()
break;
}
case SPELL_EFFECT_ENCHANT_ITEM:
+ case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC:
{
Item* targetItem = m_targets.getItemTarget();
if(!targetItem)
@@ -4819,13 +5115,36 @@ uint8 Spell::CheckItems()
return SPELL_FAILED_LOW_CASTLEVEL;
//make sure the player has the required ores in inventory
if(m_targets.getItemTarget()->GetCount() < 5)
- return SPELL_FAILED_PROSPECT_NEED_MORE;
+ return SPELL_FAILED_NEED_MORE_ITEMS;
if(!LootTemplates_Prospecting.HaveLootFor(m_targets.getItemTargetEntry()))
return SPELL_FAILED_CANT_BE_PROSPECTED;
break;
}
+ case SPELL_EFFECT_MILLING:
+ {
+ if(!m_targets.getItemTarget())
+ return SPELL_FAILED_CANT_BE_MILLED;
+ //ensure item is a millable herb
+ if(!(m_targets.getItemTarget()->GetProto()->BagFamily & BAG_FAMILY_MASK_HERBS) || m_targets.getItemTarget()->GetProto()->Class != ITEM_CLASS_TRADE_GOODS)
+ return SPELL_FAILED_CANT_BE_MILLED;
+ //prevent milling in trade slot
+ if( m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID() )
+ return SPELL_FAILED_CANT_BE_MILLED;
+ //Check for enough skill in inscription
+ uint32 item_millingskilllevel = m_targets.getItemTarget()->GetProto()->RequiredSkillRank;
+ if(item_millingskilllevel >p_caster->GetSkillValue(SKILL_INSCRIPTION))
+ return SPELL_FAILED_LOW_CASTLEVEL;
+ //make sure the player has the required herbs in inventory
+ if(m_targets.getItemTarget()->GetCount() < 5)
+ return SPELL_FAILED_NEED_MORE_ITEMS;
+
+ if(!LootTemplates_Milling.HaveLootFor(m_targets.getItemTargetEntry()))
+ return SPELL_FAILED_CANT_BE_MILLED;
+
+ break;
+ }
case SPELL_EFFECT_WEAPON_DAMAGE:
case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:
{
@@ -4905,18 +5224,22 @@ void Spell::Delayed() // only called in DealDamage()
//if (m_spellState == SPELL_STATE_DELAYED)
// return; // spell is active and can't be time-backed
+ if(isDelayableNoMore()) // Spells may only be delayed twice
+ return;
+
// spells not loosing casting time ( slam, dynamites, bombs.. )
//if(!(m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_DAMAGE))
// return;
- //check resist chance
- int32 resistChance = 100; //must be initialized to 100 for percent modifiers
- ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this);
- resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100;
- if (roll_chance_i(resistChance))
+ //check pushback reduce
+ int32 delaytime = 500; // spellcasting delay is normally 500ms
+ int32 delayReduce = 100; // must be initialized to 100 for percent modifiers
+ ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME, delayReduce, this);
+ delayReduce += m_caster->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;
+ if(delayReduce >= 100)
return;
- int32 delaytime = GetNextDelayAtDamageMsTime();
+ delaytime = delaytime * (100 - delayReduce) / 100;
if(int32(m_timer) + delaytime > m_casttime)
{
@@ -4940,14 +5263,18 @@ void Spell::DelayedChannel()
if(!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER || getState() != SPELL_STATE_CASTING)
return;
- //check resist chance
- int32 resistChance = 100; //must be initialized to 100 for percent modifiers
- ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this);
- resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100;
- if (roll_chance_i(resistChance))
+ if(isDelayableNoMore()) // Spells may only be delayed twice
+ return;
+
+ //check pushback reduce
+ int32 delaytime = GetSpellDuration(m_spellInfo) * 25 / 100; // channeling delay is normally 25% of its time per hit
+ int32 delayReduce = 100; // must be initialized to 100 for percent modifiers
+ ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,delayReduce, this);
+ delayReduce += m_caster->GetTotalAuraModifier(SPELL_AURA_REDUCE_PUSHBACK) - 100;
+ if(delayReduce >= 100)
return;
- int32 delaytime = GetNextDelayAtDamageMsTime();
+ delaytime = delaytime * (100 - delayReduce) / 100;
if(int32(m_timer) < delaytime)
{
@@ -5001,9 +5328,9 @@ void Spell::UpdatePointers()
m_targets.Update(m_caster);
}
-bool Spell::IsAffectedBy(SpellEntry const *spellInfo, uint32 effectId)
+bool Spell::IsAffectedByAura(Aura *aura)
{
- return spellmgr.IsAffectedBySpell(m_spellInfo,spellInfo->Id,effectId,spellInfo->EffectItemType[effectId]);
+ return spellmgr.IsAffectedByMod(m_spellInfo, aura->getAuraSpellMod());
}
bool Spell::CheckTargetCreatureType(Unit* target) const
@@ -5011,7 +5338,7 @@ bool Spell::CheckTargetCreatureType(Unit* target) const
uint32 spellCreatureTargetMask = m_spellInfo->TargetCreatureType;
// Curse of Doom : not find another way to fix spell target check :/
- if(m_spellInfo->SpellFamilyName==SPELLFAMILY_WARLOCK && m_spellInfo->SpellFamilyFlags == 0x0200000000LL)
+ if(m_spellInfo->SpellFamilyName==SPELLFAMILY_WARLOCK && m_spellInfo->SpellFamilyFlags.IsEqual(0,0x02,0))
{
// not allow cast at player
if(target->GetTypeId()==TYPEID_PLAYER)
@@ -5054,6 +5381,12 @@ bool Spell::CheckTarget( Unit* target, uint32 eff, bool hitPhase )
return false;
}
+ // Check Aura spell req (need for AoE spells)
+ if(m_spellInfo->targetAuraSpell && !target->HasAura(m_spellInfo->targetAuraSpell))
+ return false;
+ if (m_spellInfo->excludeTargetAuraSpell && target->HasAura(m_spellInfo->excludeTargetAuraSpell))
+ return false;
+
// Check targets for not_selectable unit flag and remove
// A player can cast spells on his pet (or other controlled unit) though in any state
if (target != m_caster && target->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
@@ -5114,7 +5447,13 @@ bool Spell::CheckTarget( Unit* target, uint32 eff, bool hitPhase )
// all ok by some way or another, skip normal check
break;
default: // normal case
- if(target!=m_caster && !target->IsWithinLOSInMap(m_caster))
+ // Get GO cast coordinates if original caster -> GO
+ WorldObject *caster = NULL;
+ if (m_originalCasterGUID)
+ caster = ObjectAccessor::GetGameObject(*m_caster, m_originalCasterGUID);
+ if (!caster)
+ caster = m_caster;
+ if(target!=m_caster && !target->IsWithinLOSInMap(caster))
return false;
break;
}
@@ -5133,9 +5472,8 @@ Unit* Spell::SelectMagnetTarget()
{
if(Unit* magnet = (*itr)->GetCaster())
{
- if((*itr)->m_procCharges>0)
+ if((*itr)->DropAuraCharge())
{
- (*itr)->SetAuraProcCharges((*itr)->m_procCharges-1);
target = magnet;
m_targets.setUnitTarget(target);
AddUnitTarget(target, 0);
@@ -5159,7 +5497,7 @@ Unit* Spell::SelectMagnetTarget()
bool Spell::IsNeedSendToClient() const
{
- return m_spellInfo->SpellVisual!=0 || IsChanneledSpell(m_spellInfo) ||
+ return m_spellInfo->SpellVisual[0] || m_spellInfo->SpellVisual[1] || IsChanneledSpell(m_spellInfo) ||
m_spellInfo->speed > 0.0f || !m_triggeredByAuraSpell && !m_IsTriggeredSpell;
}
@@ -5343,6 +5681,14 @@ void Spell::CalculateDamageDoneForAllTargets()
}
}
+ bool usesAmmo=true;
+ Unit::AuraList const& Auras = m_caster->GetAurasByType(SPELL_AURA_ABILITY_CONSUME_NO_AMMO);
+ for(Unit::AuraList::const_iterator j = Auras.begin();j != Auras.end(); ++j)
+ {
+ if((*j)->isAffectedOnSpell(m_spellInfo))
+ usesAmmo=false;
+ }
+
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
{
TargetInfo &target = *ihit;
@@ -5355,6 +5701,28 @@ void Spell::CalculateDamageDoneForAllTargets()
if (!unit)
continue;
+ if (usesAmmo)
+ {
+ bool ammoTaken=false;
+ for (uint8 i=0;i<3;i++)
+ {
+ if (!(mask & 1<<i))
+ continue;
+ switch (m_spellInfo->Effect[i])
+ {
+ 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;
+ }
+ }
+
if (target.missCondition==SPELL_MISS_NONE) // In case spell hit target, do all effect on that target
target.damage += CalculateDamageDone(unit, mask, multiplier);
else if (target.missCondition == SPELL_MISS_REFLECT) // In case spell reflect from target, do all effect on caster (if hit)
diff --git a/src/game/Spell.h b/src/game/Spell.h
index df630a33432..daeab913345 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -47,26 +47,51 @@ enum SpellCastTargetFlags
TARGET_FLAG_RESURRECTABLE = 0x8000*/
TARGET_FLAG_SELF = 0x00000000,
+ TARGET_FLAG_UNUSED1 = 0x00000001, // not used in any spells as of 3.0.3 (can be set dynamically)
TARGET_FLAG_UNIT = 0x00000002, // pguid
+ TARGET_FLAG_UNUSED2 = 0x00000004, // not used in any spells as of 3.0.3 (can be set dynamically)
+ TARGET_FLAG_UNUSED3 = 0x00000008, // not used in any spells as of 3.0.3 (can be set dynamically)
TARGET_FLAG_ITEM = 0x00000010, // pguid
TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // 3 float
TARGET_FLAG_DEST_LOCATION = 0x00000040, // 3 float
- TARGET_FLAG_OBJECT_UNK = 0x00000080, // ?
+ TARGET_FLAG_OBJECT_UNK = 0x00000080, // used in 7 spells only
+ TARGET_FLAG_UNIT_UNK = 0x00000100, // looks like self target (480 spells)
TARGET_FLAG_PVP_CORPSE = 0x00000200, // pguid
- TARGET_FLAG_OBJECT = 0x00000800, // pguid
- TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
- TARGET_FLAG_STRING = 0x00002000, // string
- TARGET_FLAG_UNK1 = 0x00004000, // ?
- TARGET_FLAG_CORPSE = 0x00008000, // pguid
- TARGET_FLAG_UNK2 = 0x00010000 // pguid
+ TARGET_FLAG_UNIT_CORPSE = 0x00000400, // 10 spells (gathering professions)
+ TARGET_FLAG_OBJECT = 0x00000800, // pguid, 2 spells
+ TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid, 0 spells
+ TARGET_FLAG_STRING = 0x00002000, // string, 0 spells
+ TARGET_FLAG_UNK1 = 0x00004000, // 199 spells, opening object/lock
+ TARGET_FLAG_CORPSE = 0x00008000, // pguid, resurrection spells
+ TARGET_FLAG_UNK2 = 0x00010000, // pguid, not used in any spells as of 3.0.3 (can be set dynamically)
+ TARGET_FLAG_GLYPH = 0x00020000 // used in glyph spells
};
enum SpellCastFlags
{
+ CAST_FLAG_NONE = 0x00000000,
+ CAST_FLAG_UNKNOWN0 = 0x00000001, // may be pending spell cast
CAST_FLAG_UNKNOWN1 = 0x00000002,
+ CAST_FLAG_UNKNOWN11 = 0x00000004,
+ CAST_FLAG_UNKNOWN12 = 0x00000008,
CAST_FLAG_UNKNOWN2 = 0x00000010,
- CAST_FLAG_AMMO = 0x00000020,
- CAST_FLAG_UNKNOWN3 = 0x00000100
+ CAST_FLAG_AMMO = 0x00000020, // Projectiles visual
+ CAST_FLAG_UNKNOWN8 = 0x00000040,
+ CAST_FLAG_UNKNOWN9 = 0x00000080,
+ CAST_FLAG_UNKNOWN3 = 0x00000100,
+ CAST_FLAG_UNKNOWN13 = 0x00000200,
+ CAST_FLAG_UNKNOWN14 = 0x00000400,
+ CAST_FLAG_UNKNOWN6 = 0x00000800, // wotlk, trigger rune cooldown
+ CAST_FLAG_UNKNOWN15 = 0x00001000,
+ CAST_FLAG_UNKNOWN16 = 0x00002000,
+ CAST_FLAG_UNKNOWN17 = 0x00004000,
+ CAST_FLAG_UNKNOWN18 = 0x00008000,
+ CAST_FLAG_UNKNOWN19 = 0x00010000,
+ CAST_FLAG_UNKNOWN4 = 0x00020000, // wotlk
+ CAST_FLAG_UNKNOWN10 = 0x00040000,
+ CAST_FLAG_UNKNOWN5 = 0x00080000, // wotlk
+ CAST_FLAG_UNKNOWN20 = 0x00100000,
+ CAST_FLAG_UNKNOWN7 = 0x00200000 // wotlk, rune cooldown list
};
enum SpellRangeFlag
@@ -136,6 +161,7 @@ class SpellCastTargets
void setUnitTarget(Unit *target);
void setDestination(float x, float y, float z, bool send = true, int32 mapId = -1);
void setDestination(Unit *target, bool send = true);
+ void setSource(float x, float y, float z);
uint64 getGOTargetGUID() const { return m_GOTargetGUID; }
GameObject *getGOTarget() const { return m_GOTarget; }
@@ -234,6 +260,7 @@ class Spell
void EffectHealthLeech(uint32 i);
void EffectQuestComplete(uint32 i);
void EffectCreateItem(uint32 i);
+ void EffectCreateItem2(uint32 i);
void EffectPersistentAA(uint32 i);
void EffectEnergize(uint32 i);
void EffectOpenLock(uint32 i);
@@ -276,6 +303,7 @@ class Spell
void EffectStuck(uint32 i);
void EffectSummonPlayer(uint32 i);
void EffectActivateObject(uint32 i);
+ void EffectApplyGlyph(uint32 i);
void EffectSummonTotem(uint32 i);
void EffectEnchantHeldItem(uint32 i);
void EffectSummonObject(uint32 i);
@@ -293,6 +321,8 @@ class Spell
void EffectSkinning(uint32 i);
void EffectCharge(uint32 i);
void EffectProspecting(uint32 i);
+ void EffectMilling(uint32 i);
+ void EffectRenamePet(uint32 i);
void EffectSendTaxi(uint32 i);
void EffectSummonCritter(uint32 i);
void EffectKnockBack(uint32 i);
@@ -319,16 +349,22 @@ class Spell
void EffectKillCredit(uint32 i);
void EffectQuestFail(uint32 i);
void EffectRedirectThreat(uint32 i);
+ void EffectActivateRune(uint32 i);
+ void EffectTitanGrip(uint32 i);
+ void EffectEnchantItemPrismatic(uint32 i);
Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID = 0, Spell** triggeringContainer = NULL, bool skipCheck = false );
~Spell();
- void prepare(SpellCastTargets * targets, Aura* triggeredByAura = NULL);
+ void prepare(SpellCastTargets const* targets, Aura* triggeredByAura = NULL);
void cancel();
void update(uint32 difftime);
void cast(bool skipCheck = false);
void finish(bool ok = true);
void TakePower();
+ void TakeAmmo();
+ uint8 CheckRuneCost(uint32 runeCostID);
+ void TakeRunePower();
void TakeReagents();
void TakeCastItem();
void TriggerSpell();
@@ -354,11 +390,10 @@ class Spell
bool HaveTargetsForEffect(uint8 effect) const;
void Delayed();
void DelayedChannel();
- inline uint32 getState() const { return m_spellState; }
+ uint32 getState() const { return m_spellState; }
void setState(uint32 state) { m_spellState = state; }
void DoCreateItem(uint32 i, uint32 itemtype);
-
void WriteSpellGoTargets( WorldPacket * data );
void WriteAmmoToPacket( WorldPacket * data );
void FillTargetMap();
@@ -388,6 +423,8 @@ class Spell
Item* m_CastItem;
uint64 m_castItemGUID;
uint8 m_cast_count;
+ uint32 m_glyphIndex;
+ uint32 m_preCastSpell;
SpellCastTargets m_targets;
int32 GetCastTime() const { return m_casttime; }
@@ -424,7 +461,7 @@ class Spell
void UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc)
- bool IsAffectedBy(SpellEntry const *spellInfo, uint32 effectId);
+ bool IsAffectedByAura(Aura *aura);
bool CheckTargetCreatureType(Unit* target) const;
@@ -451,9 +488,17 @@ class Spell
int32 m_casttime; // Calculated spell cast time initialized only in Spell::prepare
bool m_canReflect; // can reflect this spell?
bool m_autoRepeat;
+ uint8 m_runesState;
uint8 m_delayAtDamageCount;
- int32 GetNextDelayAtDamageMsTime() { return m_delayAtDamageCount < 5 ? 1000 - (m_delayAtDamageCount++)* 200 : 200; }
+ bool isDelayableNoMore()
+ {
+ if(m_delayAtDamageCount >= 2)
+ return true;
+
+ m_delayAtDamageCount++;
+ return false;
+ }
// Delayed spells system
uint64 m_delayStart; // time of spell delay start, filled by event handler, zero = just started
@@ -497,8 +542,6 @@ class Spell
// Spell target subsystem
//*****************************************
// Targets store structures and data
- uint32 m_countOfHit;
- uint32 m_countOfMiss;
struct TargetInfo
{
uint64 targetGUID;
diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h
index d8a9d73cf46..7868bb8dcd1 100644
--- a/src/game/SpellAuraDefines.h
+++ b/src/game/SpellAuraDefines.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -20,14 +20,19 @@
#ifndef TRINITY_SPELLAURADEFINES_H
#define TRINITY_SPELLAURADEFINES_H
-#define MAX_AURAS 56
-#define MAX_POSITIVE_AURAS 40
+#define MAX_AURAS 64 // client support up to 255, but it will cause problems with group auras updating
enum AURA_FLAGS
{
- AFLAG_NEGATIVE = 0x09,
- AFLAG_POSITIVE = 0x1F,
- AFLAG_MASK = 0xFF
+ AFLAG_NONE = 0x00,
+ AFLAG_EFF_INDEX_0 = 0x01,
+ AFLAG_EFF_INDEX_1 = 0x02,
+ AFLAG_EFF_INDEX_2 = 0x04,
+ AFLAG_NOT_CASTER = 0x08,
+ AFLAG_POSITIVE = 0x10,
+ AFLAG_DURATION = 0x20,
+ AFLAG_UNK2 = 0x40,
+ AFLAG_NEGATIVE = 0x80
};
//m_schoolAbsorb
@@ -85,11 +90,11 @@ enum AuraType
SPELL_AURA_PROC_TRIGGER_DAMAGE = 43,
SPELL_AURA_TRACK_CREATURES = 44,
SPELL_AURA_TRACK_RESOURCES = 45,
- SPELL_AURA_MOD_PARRY_SKILL = 46,
+ SPELL_AURA_46 = 46, // Ignore all Gear test spells
SPELL_AURA_MOD_PARRY_PERCENT = 47,
- SPELL_AURA_MOD_DODGE_SKILL = 48,
+ SPELL_AURA_48 = 48, // One periodic spell
SPELL_AURA_MOD_DODGE_PERCENT = 49,
- SPELL_AURA_MOD_BLOCK_SKILL = 50,
+ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT = 50,
SPELL_AURA_MOD_BLOCK_PERCENT = 51,
SPELL_AURA_MOD_CRIT_PERCENT = 52,
SPELL_AURA_PERIODIC_LEECH = 53,
@@ -102,9 +107,9 @@ enum AuraType
SPELL_AURA_MOD_PACIFY_SILENCE = 60,
SPELL_AURA_MOD_SCALE = 61,
SPELL_AURA_PERIODIC_HEALTH_FUNNEL = 62,
- SPELL_AURA_PERIODIC_MANA_FUNNEL = 63,
+ SPELL_AURA_63 = 63, // old SPELL_AURA_PERIODIC_MANA_FUNNEL
SPELL_AURA_PERIODIC_MANA_LEECH = 64,
- SPELL_AURA_MOD_CASTING_SPEED = 65,
+ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK = 65,
SPELL_AURA_FEIGN_DEATH = 66,
SPELL_AURA_MOD_DISARM = 67,
SPELL_AURA_MOD_STALKED = 68,
@@ -129,7 +134,7 @@ enum AuraType
SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN = 87,
SPELL_AURA_MOD_HEALTH_REGEN_PERCENT = 88,
SPELL_AURA_PERIODIC_DAMAGE_PERCENT = 89,
- SPELL_AURA_MOD_RESIST_CHANCE = 90,
+ SPELL_AURA_90 = 90, // old SPELL_AURA_MOD_RESIST_CHANCE
SPELL_AURA_MOD_DETECT_RANGE = 91,
SPELL_AURA_PREVENTS_FLEEING = 92,
SPELL_AURA_MOD_UNATTACKABLE = 93,
@@ -158,7 +163,7 @@ enum AuraType
SPELL_AURA_MOD_REGEN_DURING_COMBAT = 116,
SPELL_AURA_MOD_MECHANIC_RESISTANCE = 117,
SPELL_AURA_MOD_HEALING_PCT = 118,
- SPELL_AURA_SHARE_PET_TRACKING = 119,
+ SPELL_AURA_119 = 119, // old SPELL_AURA_SHARE_PET_TRACKING
SPELL_AURA_UNTRACKABLE = 120,
SPELL_AURA_EMPATHY = 121,
SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT = 122,
@@ -184,11 +189,11 @@ enum AuraType
SPELL_AURA_MOD_BASE_RESISTANCE_PCT = 142,
SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE = 143,
SPELL_AURA_SAFE_FALL = 144,
- SPELL_AURA_CHARISMA = 145,
- SPELL_AURA_PERSUADED = 146,
- SPELL_AURA_ADD_CREATURE_IMMUNITY = 147,
+ SPELL_AURA_MOD_PET_TALENT_POINTS = 145,
+ SPELL_AURA_ALLOW_TAME_PET_TYPE = 146,
+ SPELL_AURA_MECHANIC_IMMUNITY_MASK = 147,
SPELL_AURA_RETAIN_COMBO_POINTS = 148,
- SPELL_AURA_RESIST_PUSHBACK = 149, // Resist Pushback
+ SPELL_AURA_REDUCE_PUSHBACK = 149, // Reduce Pushback
SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT = 150,
SPELL_AURA_TRACK_STEALTHED = 151, // Track Stealthed
SPELL_AURA_MOD_DETECTED_RANGE = 152, // Mod Detected Range
@@ -212,15 +217,15 @@ enum AuraType
SPELL_AURA_DETECT_AMORE = 170,
SPELL_AURA_MOD_SPEED_NOT_STACK = 171,
SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK = 172,
- SPELL_AURA_ALLOW_CHAMPION_SPELLS = 173,
- SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT = 174, // by default intellect, dependent from SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
+ SPELL_AURA_173 = 173, // old SPELL_AURA_ALLOW_CHAMPION_SPELLS
+ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT = 174, // by defeult intelect, dependent from SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT = 175,
SPELL_AURA_SPIRIT_OF_REDEMPTION = 176,
SPELL_AURA_AOE_CHARM = 177,
SPELL_AURA_MOD_DEBUFF_RESISTANCE = 178,
SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE = 179,
SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS = 180,
- SPELL_AURA_MOD_FLAT_SPELL_CRIT_DAMAGE_VERSUS = 181, // unused - possible flat spell crit damage versus
+ SPELL_AURA_181 = 181, // old SPELL_AURA_MOD_FLAT_SPELL_CRIT_DAMAGE_VERSUS - possible flat spell crit damage versus
SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT = 182,
SPELL_AURA_MOD_CRITICAL_THREAT = 183,
SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE = 184,
@@ -233,11 +238,11 @@ enum AuraType
SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED = 191,
SPELL_AURA_HASTE_MELEE = 192,
SPELL_AURA_MELEE_SLOW = 193,
- SPELL_AURA_MOD_DEPRICATED_1 = 194, // not used now, old SPELL_AURA_MOD_SPELL_DAMAGE_OF_INTELLECT
- SPELL_AURA_MOD_DEPRICATED_2 = 195, // not used now, old SPELL_AURA_MOD_SPELL_HEALING_OF_INTELLECT
+ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL = 194,
+ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL = 195,
SPELL_AURA_MOD_COOLDOWN = 196, // only 24818 Noxious Breath
SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE = 197,
- SPELL_AURA_MOD_ALL_WEAPON_SKILLS = 198,
+ SPELL_AURA_198 = 198, // old SPELL_AURA_MOD_ALL_WEAPON_SKILLS
SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT = 199,
SPELL_AURA_MOD_XP_PCT = 200,
SPELL_AURA_FLY = 201,
@@ -262,20 +267,20 @@ enum AuraType
SPELL_AURA_MOD_RATING_FROM_STAT = 220,
SPELL_AURA_221 = 221,
SPELL_AURA_222 = 222,
- SPELL_AURA_223 = 223,
+ SPELL_AURA_RAID_PROC_FROM_CHARGE = 223,
SPELL_AURA_224 = 224,
- SPELL_AURA_PRAYER_OF_MENDING = 225,
+ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE = 225,
SPELL_AURA_PERIODIC_DUMMY = 226,
- SPELL_AURA_227 = 227,
+ SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE = 227,
SPELL_AURA_DETECT_STEALTH = 228,
SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE = 229,
SPELL_AURA_230 = 230,
- SPELL_AURA_231 = 231,
+ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE = 231,
SPELL_AURA_MECHANIC_DURATION_MOD = 232,
SPELL_AURA_233 = 233,
SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK = 234,
SPELL_AURA_MOD_DISPEL_RESIST = 235,
- SPELL_AURA_236 = 236,
+ SPELL_AURA_CONTROL_VEHICLE = 236,
SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER = 237,
SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER = 238,
SPELL_AURA_MOD_SCALE_2 = 239,
@@ -284,29 +289,57 @@ enum AuraType
SPELL_AURA_MOD_SPELL_DAMAGE_FROM_HEALING = 242,
SPELL_AURA_243 = 243,
SPELL_AURA_COMPREHEND_LANGUAGE = 244,
- SPELL_AURA_MOD_DURATION_OF_MAGIC_EFFECTS = 245,
- SPELL_AURA_246 = 246,
+ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL = 245,
+ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK = 246,
SPELL_AURA_247 = 247,
SPELL_AURA_MOD_COMBAT_RESULT_CHANCE = 248,
- SPELL_AURA_249 = 249,
+ SPELL_AURA_CONVERT_RUNE = 249,
SPELL_AURA_MOD_INCREASE_HEALTH_2 = 250,
SPELL_AURA_MOD_ENEMY_DODGE = 251,
SPELL_AURA_252 = 252,
- SPELL_AURA_253 = 253,
- SPELL_AURA_254 = 254,
- SPELL_AURA_255 = 255,
- SPELL_AURA_256 = 256,
- SPELL_AURA_257 = 257,
+ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE = 253,
+ SPELL_AURA_MOD_DISARM_OFFHAND = 254,
+ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT = 255,
+ SPELL_AURA_NO_REAGENT_USE = 256,
+ SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS = 257,
SPELL_AURA_258 = 258,
- SPELL_AURA_259 = 259,
- SPELL_AURA_260 = 260,
- SPELL_AURA_261 = 261,
- TOTAL_AURAS=262
+ SPELL_AURA_MOD_HOT_PCT = 259,
+ SPELL_AURA_SCREEN_EFFECT = 260,
+ SPELL_AURA_PHASE = 261,
+ SPELL_AURA_ABILITY_IGNORE_AURASTATE = 262,
+ SPELL_AURA_ALLOW_ONLY_ABILITY = 263,
+ SPELL_AURA_264 = 264,
+ SPELL_AURA_265 = 265,
+ SPELL_AURA_266 = 266,
+ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL = 267,
+ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT = 268,
+ SPELL_AURA_MOD_IGNORE_TARGET_RESIST = 269,
+ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST = 270, // Possibly need swap vs 195 aura used only in 1 spell Chaos Bolt Passive
+ SPELL_AURA_MOD_DAMAGE_FROM_CASTER = 271,
+ SPELL_AURA_272 = 272,
+ SPELL_AURA_273 = 273,
+ SPELL_AURA_ABILITY_CONSUME_NO_AMMO = 274,
+ SPELL_AURA_MOD_IGNORE_SHAPESHIFT = 275,
+ SPELL_AURA_276 = 276, // Only "Test Mod Damage % Mechanic" spell, possible mod damage done
+ SPELL_AURA_MOD_MAX_AFFECTED_TARGETS = 277,
+ SPELL_AURA_MOD_DISARM_RANGED = 278,
+ SPELL_AURA_279 = 279,
+ SPELL_AURA_MOD_WEAPONTYPE_IGNORE_TARGET_RESISTANCE = 280,
+ SPELL_AURA_MOD_HONOR_GAIN_PCT = 281,
+ SPELL_AURA_MOD_BASE_HEALTH_PCT = 282,
+ SPELL_AURA_MOD_HEALING_RECEIVED = 283, // Possibly only for some spell family class spells
+ SPELL_AURA_284,
+ SPELL_AURA_285,
+ SPELL_AURA_286,
+ SPELL_AURA_DEFLECT_SPELLS,
+ SPELL_AURA_288,
+ TOTAL_AURAS = 289
};
enum AreaAuraType
{
AREA_AURA_PARTY,
+ AREA_AURA_RAID,
AREA_AURA_FRIEND,
AREA_AURA_ENEMY,
AREA_AURA_PET,
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 40edea80ce9..d31ec2ff553 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -100,11 +100,11 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, // 43 SPELL_AURA_PROC_TRIGGER_DAMAGE implemented in Unit::ProcDamageAndSpellFor
&Aura::HandleAuraTrackCreatures, // 44 SPELL_AURA_TRACK_CREATURES
&Aura::HandleAuraTrackResources, // 45 SPELL_AURA_TRACK_RESOURCES
- &Aura::HandleUnused, // 46 SPELL_AURA_MOD_PARRY_SKILL obsolete?
+ &Aura::HandleUnused, // 46 SPELL_AURA_46 (used in test spells 54054 and 54058, and spell 48050) (3.0.8a)
&Aura::HandleAuraModParryPercent, // 47 SPELL_AURA_MOD_PARRY_PERCENT
- &Aura::HandleUnused, // 48 SPELL_AURA_MOD_DODGE_SKILL obsolete?
+ &Aura::HandleNULL, // 48 SPELL_AURA_48 spell Napalm (area damage spell with additional delayed damage effect)
&Aura::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT
- &Aura::HandleUnused, // 50 SPELL_AURA_MOD_BLOCK_SKILL obsolete?
+ &Aura::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT implemented in Unit::SpellCriticalHealingBonus
&Aura::HandleAuraModBlockPercent, // 51 SPELL_AURA_MOD_BLOCK_PERCENT
&Aura::HandleAuraModCritPercent, // 52 SPELL_AURA_MOD_CRIT_PERCENT
&Aura::HandlePeriodicLeech, // 53 SPELL_AURA_PERIODIC_LEECH
@@ -116,10 +116,10 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, // 59 SPELL_AURA_MOD_DAMAGE_DONE_CREATURE implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
&Aura::HandleAuraModPacifyAndSilence, // 60 SPELL_AURA_MOD_PACIFY_SILENCE
&Aura::HandleAuraModScale, // 61 SPELL_AURA_MOD_SCALE
- &Aura::HandleNULL, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
- &Aura::HandleUnused, // 63 SPELL_AURA_PERIODIC_MANA_FUNNEL obsolete?
+ &Aura::HandlePeriodicHealthFunnel, // 62 SPELL_AURA_PERIODIC_HEALTH_FUNNEL
+ &Aura::HandleUnused, // 63 unused (3.0.8a) old SPELL_AURA_PERIODIC_MANA_FUNNEL
&Aura::HandlePeriodicManaLeech, // 64 SPELL_AURA_PERIODIC_MANA_LEECH
- &Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED
+ &Aura::HandleModCastingSpeed, // 65 SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
&Aura::HandleFeignDeath, // 66 SPELL_AURA_FEIGN_DEATH
&Aura::HandleAuraModDisarm, // 67 SPELL_AURA_MOD_DISARM
&Aura::HandleAuraModStalked, // 68 SPELL_AURA_MOD_STALKED
@@ -144,7 +144,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, // 87 SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN implemented in Unit::MeleeDamageBonus and Unit::SpellDamageBonus
&Aura::HandleNoImmediateEffect, // 88 SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
&Aura::HandlePeriodicDamagePCT, // 89 SPELL_AURA_PERIODIC_DAMAGE_PERCENT
- &Aura::HandleUnused, // 90 SPELL_AURA_MOD_RESIST_CHANCE Useless
+ &Aura::HandleUnused, // 90 unused (3.0.8a) old SPELL_AURA_MOD_RESIST_CHANCE
&Aura::HandleNoImmediateEffect, // 91 SPELL_AURA_MOD_DETECT_RANGE implemented in Creature::GetAttackDistance
&Aura::HandlePreventFleeing, // 92 SPELL_AURA_PREVENTS_FLEEING
&Aura::HandleModUnattackable, // 93 SPELL_AURA_MOD_UNATTACKABLE
@@ -154,7 +154,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleManaShield, // 97 SPELL_AURA_MANA_SHIELD implemented in Unit::CalcAbsorbResist
&Aura::HandleAuraModSkill, // 98 SPELL_AURA_MOD_SKILL_TALENT
&Aura::HandleAuraModAttackPower, // 99 SPELL_AURA_MOD_ATTACK_POWER
- &Aura::HandleUnused, //100 SPELL_AURA_AURAS_VISIBLE obsolete? all player can see all auras now
+ &Aura::HandleUnused, //100 SPELL_AURA_AURAS_VISIBLE obsolete? all player can see all auras now, but still have spells including GM-spell
&Aura::HandleModResistancePercent, //101 SPELL_AURA_MOD_RESISTANCE_PCT
&Aura::HandleNoImmediateEffect, //102 SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS implemented in Unit::MeleeDamageBonus
&Aura::HandleAuraModTotalThreat, //103 SPELL_AURA_MOD_TOTAL_THREAT
@@ -163,9 +163,9 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleAuraHover, //106 SPELL_AURA_HOVER
&Aura::HandleAddModifier, //107 SPELL_AURA_ADD_FLAT_MODIFIER
&Aura::HandleAddModifier, //108 SPELL_AURA_ADD_PCT_MODIFIER
- &Aura::HandleNoImmediateEffect, //109 SPELL_AURA_ADD_TARGET_TRIGGER
+ &Aura::HandleAddTargetTrigger, //109 SPELL_AURA_ADD_TARGET_TRIGGER
&Aura::HandleModPowerRegenPCT, //110 SPELL_AURA_MOD_POWER_REGEN_PERCENT
- &Aura::HandleNULL, //111 SPELL_AURA_ADD_CASTER_HIT_TRIGGER
+ &Aura::HandleNULL, //111 SPELL_AURA_ADD_CASTER_HIT_TRIGGER chance redirect attack to caster
&Aura::HandleNoImmediateEffect, //112 SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
&Aura::HandleNoImmediateEffect, //113 SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN implemented in Unit::MeleeDamageBonus
&Aura::HandleNoImmediateEffect, //114 SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT implemented in Unit::MeleeDamageBonus
@@ -173,7 +173,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, //116 SPELL_AURA_MOD_REGEN_DURING_COMBAT
&Aura::HandleNoImmediateEffect, //117 SPELL_AURA_MOD_MECHANIC_RESISTANCE implemented in Unit::MagicSpellHitResult
&Aura::HandleNoImmediateEffect, //118 SPELL_AURA_MOD_HEALING_PCT implemented in Unit::SpellHealingBonus
- &Aura::HandleUnused, //119 SPELL_AURA_SHARE_PET_TRACKING useless
+ &Aura::HandleUnused, //119 unused (3.0.8a) old SPELL_AURA_SHARE_PET_TRACKING
&Aura::HandleAuraUntrackable, //120 SPELL_AURA_UNTRACKABLE
&Aura::HandleAuraEmpathy, //121 SPELL_AURA_EMPATHY
&Aura::HandleModOffhandDamagePercent, //122 SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT
@@ -199,11 +199,11 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleAuraModBaseResistancePCT, //142 SPELL_AURA_MOD_BASE_RESISTANCE_PCT
&Aura::HandleAuraModResistanceExclusive, //143 SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE
&Aura::HandleNoImmediateEffect, //144 SPELL_AURA_SAFE_FALL implemented in WorldSession::HandleMovementOpcodes
- &Aura::HandleUnused, //145 SPELL_AURA_CHARISMA obsolete?
- &Aura::HandleUnused, //146 SPELL_AURA_PERSUADED obsolete?
- &Aura::HandleNULL, //147 SPELL_AURA_ADD_CREATURE_IMMUNITY
+ &Aura::HandleAuraModPetTalentsPoints, //145 SPELL_AURA_MOD_PET_TALENT_POINTS
+ &Aura::HandleNoImmediateEffect, //146 SPELL_AURA_ALLOW_TAME_PET_TYPE
+ &Aura::HandleModMechanicImmunity, //147 SPELL_AURA_MECHANIC_IMMUNITY_MASK
&Aura::HandleAuraRetainComboPoints, //148 SPELL_AURA_RETAIN_COMBO_POINTS
- &Aura::HandleNoImmediateEffect, //149 SPELL_AURA_RESIST_PUSHBACK
+ &Aura::HandleNoImmediateEffect, //149 SPELL_AURA_REDUCE_PUSHBACK
&Aura::HandleShieldBlockValue, //150 SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT
&Aura::HandleAuraTrackStealthed, //151 SPELL_AURA_TRACK_STEALTHED
&Aura::HandleNoImmediateEffect, //152 SPELL_AURA_MOD_DETECTED_RANGE implemented in Creature::GetAttackDistance
@@ -218,26 +218,26 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNoImmediateEffect, //161 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
&Aura::HandleAuraPowerBurn, //162 SPELL_AURA_POWER_BURN_MANA
&Aura::HandleNoImmediateEffect, //163 SPELL_AURA_MOD_CRIT_DAMAGE_BONUS_MELEE
- &Aura::HandleUnused, //164 useless, only one test spell
+ &Aura::HandleUnused, //164 unused (3.0.8a), only one test spell
&Aura::HandleNoImmediateEffect, //165 SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS implemented in Unit::MeleeDamageBonus
&Aura::HandleAuraModAttackPowerPercent, //166 SPELL_AURA_MOD_ATTACK_POWER_PCT
&Aura::HandleAuraModRangedAttackPowerPercent, //167 SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT
&Aura::HandleNoImmediateEffect, //168 SPELL_AURA_MOD_DAMAGE_DONE_VERSUS implemented in Unit::SpellDamageBonus, Unit::MeleeDamageBonus
&Aura::HandleNoImmediateEffect, //169 SPELL_AURA_MOD_CRIT_PERCENT_VERSUS implemented in Unit::DealDamageBySchool, Unit::DoAttackDamage, Unit::SpellCriticalBonus
- &Aura::HandleNULL, //170 SPELL_AURA_DETECT_AMORE only for Detect Amore spell
+ &Aura::HandleNULL, //170 SPELL_AURA_DETECT_AMORE different spells that ignore transformation effects
&Aura::HandleAuraModIncreaseSpeed, //171 SPELL_AURA_MOD_SPEED_NOT_STACK
&Aura::HandleAuraModIncreaseMountedSpeed, //172 SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
- &Aura::HandleUnused, //173 SPELL_AURA_ALLOW_CHAMPION_SPELLS only for Proclaim Champion spell
- &Aura::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus (by default intellect, dependent from SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT)
+ &Aura::HandleUnused, //173 unused (3.0.8a) no spells, old SPELL_AURA_ALLOW_CHAMPION_SPELLS only for Proclaim Champion spell
+ &Aura::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus
&Aura::HandleModSpellHealingPercentFromStat, //175 SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT implemented in Unit::SpellBaseHealingBonus
&Aura::HandleSpiritOfRedemption, //176 SPELL_AURA_SPIRIT_OF_REDEMPTION only for Spirit of Redemption spell, die at aura end
&Aura::HandleNULL, //177 SPELL_AURA_AOE_CHARM
&Aura::HandleNoImmediateEffect, //178 SPELL_AURA_MOD_DEBUFF_RESISTANCE implemented in Unit::MagicSpellHitResult
&Aura::HandleNoImmediateEffect, //179 SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE implemented in Unit::SpellCriticalBonus
&Aura::HandleNoImmediateEffect, //180 SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS implemented in Unit::SpellDamageBonus
- &Aura::HandleUnused, //181 SPELL_AURA_MOD_FLAT_SPELL_CRIT_DAMAGE_VERSUS unused
+ &Aura::HandleUnused, //181 unused (3.0.8a) old SPELL_AURA_MOD_FLAT_SPELL_CRIT_DAMAGE_VERSUS
&Aura::HandleAuraModResistenceOfStatPercent, //182 SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
- &Aura::HandleNULL, //183 SPELL_AURA_MOD_CRITICAL_THREAT
+ &Aura::HandleNULL, //183 SPELL_AURA_MOD_CRITICAL_THREAT only used in 28746
&Aura::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
&Aura::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
&Aura::HandleNoImmediateEffect, //186 SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE implemented in Unit::MagicSpellHitResult
@@ -248,11 +248,11 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleAuraModUseNormalSpeed, //191 SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
&Aura::HandleModMeleeRangedSpeedPct, //192 SPELL_AURA_HASTE_MELEE
&Aura::HandleModCombatSpeedPct, //193 SPELL_AURA_MELEE_SLOW (in fact combat (any type attack) speed pct)
- &Aura::HandleUnused, //194 SPELL_AURA_MOD_DEPRICATED_1 not used now (old SPELL_AURA_MOD_SPELL_DAMAGE_OF_INTELLECT)
- &Aura::HandleUnused, //195 SPELL_AURA_MOD_DEPRICATED_2 not used now (old SPELL_AURA_MOD_SPELL_HEALING_OF_INTELLECT)
+ &Aura::HandleNULL, //194 SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL implemented in Unit::CalcAbsorbResist
+ &Aura::HandleNoImmediateEffect, //195 SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL implemented in Unit::CalcAbsorbResist
&Aura::HandleNULL, //196 SPELL_AURA_MOD_COOLDOWN
&Aura::HandleNoImmediateEffect, //197 SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE implemented in Unit::SpellCriticalBonus Unit::GetUnitCriticalChance
- &Aura::HandleUnused, //198 SPELL_AURA_MOD_ALL_WEAPON_SKILLS
+ &Aura::HandleUnused, //198 unused (3.0.8a) old SPELL_AURA_MOD_ALL_WEAPON_SKILLS
&Aura::HandleNoImmediateEffect, //199 SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT implemented in Unit::MagicSpellHitResult
&Aura::HandleNoImmediateEffect, //200 SPELL_AURA_MOD_XP_PCT implemented in Player::GiveXP
&Aura::HandleAuraAllowFlight, //201 SPELL_AURA_FLY this aura enable flight mode...
@@ -271,59 +271,86 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNULL, //214 Tamed Pet Passive
&Aura::HandleArenaPreparation, //215 SPELL_AURA_ARENA_PREPARATION
&Aura::HandleModCastingSpeed, //216 SPELL_AURA_HASTE_SPELLS
- &Aura::HandleUnused, //217 unused
+ &Aura::HandleUnused, //217 unused (3.0.8a)
&Aura::HandleAuraModRangedHaste, //218 SPELL_AURA_HASTE_RANGED
&Aura::HandleModManaRegen, //219 SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
- &Aura::HandleNULL, //220 SPELL_AURA_MOD_RATING_FROM_STAT
+ &Aura::HandleModRatingFromStat, //220 SPELL_AURA_MOD_RATING_FROM_STAT
&Aura::HandleNULL, //221 ignored
- &Aura::HandleUnused, //222 unused
- &Aura::HandleNULL, //223 Cold Stare
- &Aura::HandleUnused, //224 unused
- &Aura::HandleNoImmediateEffect, //225 SPELL_AURA_PRAYER_OF_MENDING
+ &Aura::HandleUnused, //222 unused (3.0.8a) only for spell 44586 that not used in real spell cast
+ &Aura::HandleNoImmediateEffect, //223 SPELL_AURA_RAID_PROC_FROM_CHARGE
+ &Aura::HandleUnused, //224 unused (3.0.8a)
+ &Aura::HandleNoImmediateEffect, //225 SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
&Aura::HandleAuraPeriodicDummy, //226 SPELL_AURA_PERIODIC_DUMMY
- &Aura::HandleNULL, //227 periodic trigger spell
+ &Aura::HandlePeriodicTriggerSpellWithValue, //227 SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE
&Aura::HandleNoImmediateEffect, //228 stealth detection
&Aura::HandleNULL, //229 SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
- &Aura::HandleAuraModIncreaseMaxHealth, //230 Commanding Shout
- &Aura::HandleNULL, //231
+ &Aura::HandleAuraModIncreaseHealth, //230 SPELL_AURA_MOD_INCREASE_HEALTH_2
+ &Aura::HandleNoImmediateEffect, //231 SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
&Aura::HandleNoImmediateEffect, //232 SPELL_AURA_MECHANIC_DURATION_MOD implement in Unit::CalculateSpellDuration
&Aura::HandleNULL, //233 set model id to the one of the creature with id m_modifier.m_miscvalue
&Aura::HandleNoImmediateEffect, //234 SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK implement in Unit::CalculateSpellDuration
&Aura::HandleAuraModDispelResist, //235 SPELL_AURA_MOD_DISPEL_RESIST implement in Unit::MagicSpellHitResult
- &Aura::HandleUnused, //236 unused
+ &Aura::HandleAuraControlVehicle, //236 SPELL_AURA_CONTROL_VEHICLE
&Aura::HandleModSpellDamagePercentFromAttackPower, //237 SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER implemented in Unit::SpellBaseDamageBonus
&Aura::HandleModSpellHealingPercentFromAttackPower, //238 SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER implemented in Unit::SpellBaseHealingBonus
&Aura::HandleAuraModScale, //239 SPELL_AURA_MOD_SCALE_2 only in Noggenfogger Elixir (16595) before 2.3.0 aura 61
&Aura::HandleAuraModExpertise, //240 SPELL_AURA_MOD_EXPERTISE
&Aura::HandleForceMoveForward, //241 Forces the player to move forward
&Aura::HandleUnused, //242 SPELL_AURA_MOD_SPELL_DAMAGE_FROM_HEALING
- &Aura::HandleUnused, //243 used by two test spells
+ &Aura::HandleNULL, //243 faction reaction override spells
&Aura::HandleComprehendLanguage, //244 Comprehend language
- &Aura::HandleUnused, //245 SPELL_AURA_MOD_DURATION_OF_MAGIC_EFFECTS
- &Aura::HandleUnused, //246 unused
- &Aura::HandleUnused, //247 unused
+ &Aura::HandleNoImmediateEffect, //245 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
+ &Aura::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK implemented in Spell::EffectApplyAura
+ &Aura::HandleNULL, //247 target to become a clone of the caster
&Aura::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
- &Aura::HandleNULL, //249
+ &Aura::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE
&Aura::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
- &Aura::HandleNULL, //251 SPELL_AURA_MOD_ENEMY_DODGE
- &Aura::HandleUnused, //252 unused
- &Aura::HandleUnused, //253 unused
- &Aura::HandleUnused, //254 unused
- &Aura::HandleUnused, //255 unused
- &Aura::HandleUnused, //256 unused
- &Aura::HandleUnused, //257 unused
- &Aura::HandleUnused, //258 unused
- &Aura::HandleUnused, //259 unused
- &Aura::HandleUnused, //260 unused
- &Aura::HandleNULL //261 SPELL_AURA_261 some phased state (44856 spell)
+ &Aura::HandleNoImmediateEffect, //251 SPELL_AURA_MOD_ENEMY_DODGE
+ &Aura::HandleNULL, //252 haste all?
+ &Aura::HandleNoImmediateEffect, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE implemented in Unit::isBlockCritical
+ &Aura::HandleAuraModDisarm, //254 SPELL_AURA_MOD_DISARM_OFFHAND
+ &Aura::HandleNoImmediateEffect, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT implemented in Unit::SpellDamageBonus
+ &Aura::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select
+ &Aura::HandleNULL, //257 SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS Use SpellClassMask for spell select
+ &Aura::HandleNULL, //258 SPELL_AURA_MOD_SPELL_VISUAL
+ &Aura::HandleNoImmediateEffect, //259 SPELL_AURA_MOD_HOT_PCT implemented in Unit::SpellHealingBonus
+ &Aura::HandleNoImmediateEffect, //260 SPELL_AURA_SCREEN_EFFECT (miscvalue = id in ScreenEffect.dbc) not required any code
+ &Aura::HandlePhase, //261 SPELL_AURA_PHASE undetactable invisibility? implemented in Unit::isVisibleForOrDetect
+ &Aura::HandleNoImmediateEffect, //262 SPELL_AURA_ABILITY_IGNORE_AURASTATE implemented in spell::cancast
+ &Aura::HandleAuraAllowOnlyAbility, //263 SPELL_AURA_ALLOW_ONLY_ABILITY player can use only abilities set in SpellClassMask
+ &Aura::HandleUnused, //264 unused (3.0.8a)
+ &Aura::HandleUnused, //265 unused (3.0.8a)
+ &Aura::HandleUnused, //266 unused (3.0.8a)
+ &Aura::HandleNoImmediateEffect, //267 SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL implemented in Unit::IsImmunedToSpellEffect
+ &Aura::HandleAuraModAttackPowerOfStatPercent, //268 SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
+ &Aura::HandleNoImmediateEffect, //269 SPELL_AURA_MOD_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage
+ &Aura::HandleNoImmediateEffect, //270 SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST implemented in Unit::CalcAbsorbResist and CalcArmorReducedDamage
+ &Aura::HandleNoImmediateEffect, //271 SPELL_AURA_MOD_DAMAGE_FROM_CASTER implemented in Unit::SpellDamageBonus
+ &Aura::HandleNULL, //272 reduce spell cast time?
+ &Aura::HandleUnused, //273 clientside
+ &Aura::HandleNoImmediateEffect, //274 SPELL_AURA_CONSUME_NO_AMMO implemented in spell::CalculateDamageDoneForAllTargets
+ &Aura::HandleNoImmediateEffect, //275 SPELL_AURA_MOD_IGNORE_SHAPESHIFT Use SpellClassMask for spell select
+ &Aura::HandleNULL, //276 mod damage % mechanic?
+ &Aura::HandleNoImmediateEffect, //277 SPELL_AURA_MOD_ABILITY_AFFECTED_TARGETS implemented in spell::settargetmap
+ &Aura::HandleAuraModDisarm, //278 SPELL_AURA_MOD_DISARM_RANGED disarm ranged weapon
+ &Aura::HandleNULL, //279 visual effects? 58836 and 57507
+ &Aura::HandleNoImmediateEffect, //280 SPELL_AURA_MOD_WEAPONTYPE_IGNORE_TARGET_RESISTANCE
+ &Aura::HandleNoImmediateEffect, //281 SPELL_AURA_MOD_HONOR_GAIN_PCT implemented in Player::RewardHonor
+ &Aura::HandleAuraIncreaseBaseHealthPercent, //282 SPELL_AURA_INCREASE_BASE_HEALTH_PERCENT
+ &Aura::HandleNoImmediateEffect, //283 SPELL_AURA_MOD_HEALING_RECEIVED implemented in Unit::SpellHealingBonus
+ &Aura::HandleUnused, //284 not used by any spells (3.08a)
+ &Aura::HandleUnused, //285 not used by any spells (3.08a)
+ &Aura::HandleUnused, //286 not used by any spells (3.08a)
+ &Aura::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
+ &Aura::HandleUnused, //288 not used by any spells (3.09) except 1 test spell.
};
Aura::Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem) :
-m_procCharges(0), m_stackAmount(1), m_spellmod(NULL), m_effIndex(eff), m_caster_guid(0), m_target(target),
-m_timeCla(1000), m_castItemGuid(castItem?castItem->GetGUID():0), m_auraSlot(MAX_AURAS),
-m_positive(false), m_permanent(false), m_isPeriodic(false), m_isTrigger(false), m_isAreaAura(false),
-m_isPersistent(false), m_updated(false), m_removeMode(AURA_REMOVE_BY_DEFAULT), m_isRemovedOnShapeLost(true), m_in_use(false),
-m_periodicTimer(0), m_PeriodicEventId(0), m_AuraDRGroup(DIMINISHING_NONE)
+m_spellmod(NULL), m_caster_guid(0), m_castItemGuid(castItem?castItem->GetGUID():0), m_target(target),
+m_timeCla(1000), m_periodicTimer(0), m_removeMode(AURA_REMOVE_BY_DEFAULT), m_AuraDRGroup(DIMINISHING_NONE),
+m_effIndex(eff), m_auraSlot(MAX_AURAS), m_auraFlags(AFLAG_NONE), m_auraLevel(1), m_procCharges(0), m_stackAmount(1),
+m_positive(false), m_permanent(false), m_isPeriodic(false), m_isAreaAura(false), m_isPersistent(false),
+m_updated(false), m_isRemovedOnShapeLost(true), m_in_use(false)
{
assert(target);
@@ -348,6 +375,7 @@ m_periodicTimer(0), m_PeriodicEventId(0), m_AuraDRGroup(DIMINISHING_NONE)
m_isPassive = IsPassiveSpell(GetId());
m_positive = IsPositiveEffect(GetId(), m_effIndex);
+ m_auraStateMask = 0;
m_applyTime = time(NULL);
@@ -355,14 +383,14 @@ m_periodicTimer(0), m_PeriodicEventId(0), m_AuraDRGroup(DIMINISHING_NONE)
{
m_caster_guid = target->GetGUID();
//damage = m_currentBasePoints+1; // stored value-1
- m_maxduration = target->CalculateSpellDuration(m_spellProto, m_effIndex, target);
+ m_maxduration = target->CalcSpellDuration(m_spellProto);
}
else
{
m_caster_guid = caster->GetGUID();
//damage = caster->CalculateSpellDamage(m_spellProto,m_effIndex,m_currentBasePoints,target);
- m_maxduration = caster->CalculateSpellDuration(m_spellProto, m_effIndex, target);
+ m_maxduration = caster->CalcSpellDuration(m_spellProto);
if (!damage && castItem && castItem->GetItemSuffixFactor())
{
@@ -395,32 +423,38 @@ m_periodicTimer(0), m_PeriodicEventId(0), m_AuraDRGroup(DIMINISHING_NONE)
Player* modOwner = caster ? caster->GetSpellModOwner() : NULL;
if(!m_permanent && modOwner)
+ {
modOwner->ApplySpellMod(GetId(), SPELLMOD_DURATION, m_maxduration);
+ // Get zero duration aura after - need set m_maxduration > 0 for apply/remove aura work
+ if (m_maxduration<=0)
+ m_maxduration = 1;
+ }
m_duration = m_maxduration;
- if(modOwner)
- modOwner->ApplySpellMod(GetId(), SPELLMOD_ACTIVATION_TIME, m_periodicTimer);
-
sLog.outDebug("Aura: construct Spellid : %u, Aura : %u Duration : %d Target : %d Damage : %d", m_spellProto->Id, m_spellProto->EffectApplyAuraName[eff], m_maxduration, m_spellProto->EffectImplicitTargetA[eff],damage);
m_effIndex = eff;
SetModifier(AuraType(m_spellProto->EffectApplyAuraName[eff]), damage, m_spellProto->EffectAmplitude[eff], m_spellProto->EffectMiscValue[eff]);
- m_isDeathPersist = IsDeathPersistentSpell(m_spellProto);
+ // Apply periodic time mod
+ if(modOwner && m_modifier.periodictime)
+ modOwner->ApplySpellMod(GetId(), SPELLMOD_ACTIVATION_TIME, m_modifier.periodictime);
- if(m_spellProto->procCharges)
- {
- m_procCharges = m_spellProto->procCharges;
+ // Start periodic on next tick or at aura apply
+ if (!(m_spellProto->AttributesEx5 & SPELL_ATTR_EX5_START_PERIODIC_AT_APPLY))
+ m_periodicTimer += m_modifier.periodictime;
- if(modOwner)
- modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, m_procCharges);
- }
- else
- m_procCharges = -1;
+ m_isDeathPersist = IsDeathPersistentSpell(m_spellProto);
+
+ m_procCharges = m_spellProto->procCharges;
+ if(modOwner)
+ modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, m_procCharges);
- m_isRemovedOnShapeLost = (m_caster_guid==m_target->GetGUID() && m_spellProto->Stances &&
- !(m_spellProto->AttributesEx2 & 0x80000) && !(m_spellProto->Attributes & 0x10000));
+ m_isRemovedOnShapeLost = (m_caster_guid==m_target->GetGUID() &&
+ m_spellProto->Stances &&
+ !(m_spellProto->AttributesEx2 & SPELL_ATTR_EX2_NOT_NEED_SHAPESHIFT) &&
+ !(m_spellProto->Attributes & SPELL_ATTR_NOT_SHAPESHIFT));
}
Aura::~Aura()
@@ -435,7 +469,11 @@ Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, target,
// caster==NULL in constructor args if target==caster in fact
Unit* caster_ptr = caster ? caster : target;
- m_radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(GetSpellProto()->EffectRadiusIndex[m_effIndex]));
+ if (spellproto->Effect[eff]==SPELL_EFFECT_APPLY_AREA_AURA_ENEMY)
+ m_radius = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(GetSpellProto()->EffectRadiusIndex[m_effIndex]));
+ else
+ m_radius = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(GetSpellProto()->EffectRadiusIndex[m_effIndex]));
+
if(Player* modOwner = caster_ptr->GetSpellModOwner())
modOwner->ApplySpellMod(GetId(), SPELLMOD_RADIUS, m_radius);
@@ -446,6 +484,11 @@ Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, target,
if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isTotem())
m_modifier.m_auraname = SPELL_AURA_NONE;
break;
+ case SPELL_EFFECT_APPLY_AREA_AURA_RAID:
+ m_areaAuraType = AREA_AURA_RAID;
+ if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isTotem())
+ m_modifier.m_auraname = SPELL_AURA_NONE;
+ break;
case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND:
m_areaAuraType = AREA_AURA_FRIEND;
break;
@@ -554,12 +597,12 @@ void Aura::Update(uint32 diff)
SpellModOp mod;
if (m_spellProto->EffectRadiusIndex[GetEffIndex()])
{
- radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellProto->EffectRadiusIndex[GetEffIndex()]));
+ radius = caster->GetSpellRadiusForTarget(m_target, sSpellRadiusStore.LookupEntry(m_spellProto->EffectRadiusIndex[GetEffIndex()]));
mod = SPELLMOD_RADIUS;
}
else
{
- radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(m_spellProto->rangeIndex));
+ radius = caster->GetSpellMaxRangeForTarget(m_target, sSpellRangeStore.LookupEntry(m_spellProto->rangeIndex)) ;
mod = SPELLMOD_RANGE;
}
@@ -576,28 +619,13 @@ void Aura::Update(uint32 diff)
if(m_isPeriodic && (m_duration >= 0 || m_isPassive || m_permanent))
{
m_periodicTimer -= diff;
- if(m_periodicTimer <= 0) // tick also at m_periodicTimer==0 to prevent lost last tick in case max m_duration == (max m_periodicTimer)*N
+ if(m_periodicTimer <= 0) // tick also at m_periodicTimer==0 to prevent lost last tick in case max m_duration == (max m_periodicTimer)*N
{
- if( m_modifier.m_auraname == SPELL_AURA_MOD_REGEN ||
- m_modifier.m_auraname == SPELL_AURA_MOD_POWER_REGEN ||
- // Cannibalize, eating items and other spells
- m_modifier.m_auraname == SPELL_AURA_OBS_MOD_HEALTH ||
- // Eating items and other spells
- m_modifier.m_auraname == SPELL_AURA_OBS_MOD_MANA )
- {
- ApplyModifier(true);
- return;
- }
// update before applying (aura can be removed in TriggerSpell or PeriodicTick calls)
m_periodicTimer += m_modifier.periodictime;
if(!m_target->hasUnitState(UNIT_STAT_ISOLATED))
- {
- if(m_isTrigger)
- TriggerSpell();
- else
- PeriodicTick();
- }
+ PeriodicTick();
}
}
}
@@ -618,17 +646,20 @@ void AreaAura::Update(uint32 diff)
case AREA_AURA_PARTY:
caster->GetPartyMember(targets, m_radius);
break;
+ case AREA_AURA_RAID:
+ caster->GetRaidMember(targets, m_radius);
+ break;
case AREA_AURA_FRIEND:
{
Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(caster, caster, m_radius);
- Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(caster, targets, u_check);
caster->VisitNearbyObject(m_radius, searcher);
break;
}
case AREA_AURA_ENEMY:
{
Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(caster, caster, m_radius); // No GetCharmer in searcher
- Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(targets, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(caster, targets, u_check);
caster->VisitNearbyObject(m_radius, searcher);
break;
}
@@ -657,6 +688,7 @@ void AreaAura::Update(uint32 diff)
aur = new AreaAura(actualSpellInfo, m_effIndex, &m_modifier.m_amount, (*tIter), caster, NULL);
else
aur = new AreaAura(actualSpellInfo, m_effIndex, NULL, (*tIter), caster, NULL);
+ aur->SetAuraDuration(GetAuraDuration());
(*tIter)->AddAura(aur);
}
}
@@ -690,6 +722,11 @@ void AreaAura::Update(uint32 diff)
if(!tmp_target->IsInPartyWith(caster))
tmp_target->RemoveAura(tmp_spellId, tmp_effIndex);
}
+ else if( m_areaAuraType == AREA_AURA_RAID) // TODO: fix me!
+ {
+ if(!tmp_target->IsInRaidWith(caster))
+ tmp_target->RemoveAura(tmp_spellId, tmp_effIndex);
+ }
else if( m_areaAuraType == AREA_AURA_PET || m_areaAuraType == AREA_AURA_OWNER )
{
if( tmp_target->GetGUID() != caster->GetCharmerOrOwnerGUID() )
@@ -740,58 +777,27 @@ void Aura::ApplyModifier(bool apply, bool Real)
m_in_use = false;
}
-void Aura::UpdateAuraDuration()
+void Aura::_AddAura()
{
- if(m_auraSlot >= MAX_AURAS || m_isPassive)
+ if (!GetId())
return;
-
- if( m_target->GetTypeId() == TYPEID_PLAYER)
- {
- WorldPacket data(SMSG_UPDATE_AURA_DURATION, 5);
- data << (uint8)m_auraSlot << (uint32)m_duration;
- ((Player*)m_target)->SendDirectMessage(&data);
-
- data.Initialize(SMSG_SET_EXTRA_AURA_INFO, (8+1+4+4+4));
- data.append(m_target->GetPackGUID());
- data << uint8(m_auraSlot);
- data << uint32(GetId());
- data << uint32(GetAuraMaxDuration());
- data << uint32(GetAuraDuration());
- ((Player*)m_target)->SendDirectMessage(&data);
- }
-
- // not send in case player loading (will not work anyway until player not added to map), sent in visibility change code
- if(m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading())
+ if(!m_target)
return;
Unit* caster = GetCaster();
- if(caster && caster->GetTypeId() == TYPEID_PLAYER && caster != m_target)
- SendAuraDurationForCaster((Player*)caster);
-}
-
-void Aura::SendAuraDurationForCaster(Player* caster)
-{
- WorldPacket data(SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE, (8+1+4+4+4));
- data.append(m_target->GetPackGUID());
- data << uint8(m_auraSlot);
- data << uint32(GetId());
- data << uint32(GetAuraMaxDuration()); // full
- data << uint32(GetAuraDuration()); // remain
- caster->GetSession()->SendPacket(&data);
-}
-
-void Aura::_AddAura()
-{
- if (!GetId())
- return;
- if(!m_target)
+ // passive auras (except totem auras) do not get placed in the slots
+ // area auras with SPELL_AURA_NONE are not shown on target
+ // all further code applies only to active spells
+ if(!((m_spellProto->Attributes & 0x80 || !m_isPassive || (caster && caster->GetTypeId() == TYPEID_UNIT && ((Creature*)caster)->isTotem())) &&
+ (m_spellProto->Effect[GetEffIndex()] != SPELL_EFFECT_APPLY_AREA_AURA_ENEMY || m_target != caster)))
return;
- // we can found aura in NULL_AURA_SLOT and then need store state instead check slot != NULL_AURA_SLOT
+ // Second aura if some spell
bool secondaura = false;
+ // Try find slot for aura
uint8 slot = NULL_AURA_SLOT;
-
+ // Lookup for auras already applied from spell
for(uint8 i = 0; i < 3; i++)
{
Unit::spellEffectPair spair = Unit::spellEffectPair(GetId(), i);
@@ -800,110 +806,103 @@ void Aura::_AddAura()
// allow use single slot only by auras from same caster
if(itr->second->GetCasterGUID()==GetCasterGUID())
{
- secondaura = true;
slot = itr->second->GetAuraSlot();
+ if(slot >= MAX_AURAS)
+ return;
+ secondaura = true;
break;
}
}
-
- if(secondaura)
+ if (secondaura)
break;
}
- Unit* caster = GetCaster();
-
- // not call total regen auras at adding
- switch (m_modifier.m_auraname)
+ // Lookup free slot
+ if (!secondaura)
{
- /*case SPELL_AURA_PERIODIC_DAMAGE:
- case SPELL_AURA_PERIODIC_LEECH:
- if(caster)
- m_modifier.m_amount = caster->SpellDamageBonus(m_target, m_spellProto, m_modifier.m_amount, DOT);
- break;
- case SPELL_AURA_PERIODIC_HEAL:
- if(caster)
- m_modifier.m_amount = caster->SpellHealingBonus(m_spellProto, m_modifier.m_amount, DOT, m_target);
- break;*/
- case SPELL_AURA_OBS_MOD_HEALTH:
- case SPELL_AURA_OBS_MOD_MANA:
- m_periodicTimer = m_modifier.periodictime;
- break;
- case SPELL_AURA_MOD_REGEN:
- case SPELL_AURA_MOD_POWER_REGEN:
- case SPELL_AURA_MOD_MANA_REGEN_FROM_STAT:
- m_periodicTimer = 5000;
- break;
- }
-
- // register aura
- if (getDiminishGroup() != DIMINISHING_NONE )
- m_target->ApplyDiminishingAura(getDiminishGroup(),true);
+ Unit::VisibleAuraMap const *visibleAuras = m_target->GetVisibleAuras();
+ if(visibleAuras->size() >= MAX_AURAS) // no free slot
+ return;
- // passive auras (except totem auras) do not get placed in the slots
- // area auras with SPELL_AURA_NONE are not shown on target
- if((!m_isPassive || (caster && caster->GetTypeId() == TYPEID_UNIT && ((Creature*)caster)->isTotem())) &&
- (m_spellProto->Effect[GetEffIndex()] != SPELL_EFFECT_APPLY_AREA_AURA_ENEMY || m_target != caster))
- {
- if(!secondaura) // new slot need
+ Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin();
+ for(int freeSlot = 0; freeSlot < MAX_AURAS; ++itr, ++freeSlot)
{
- if (IsPositive()) // empty positive slot
+ if(itr == visibleAuras->end() || itr->first != freeSlot)
{
- for (uint8 i = 0; i < MAX_POSITIVE_AURAS; i++)
- {
- if (m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + i)) == 0)
- {
- slot = i;
- break;
- }
- }
- }
- else // empty negative slot
- {
- for (uint8 i = MAX_POSITIVE_AURAS; i < MAX_AURAS; i++)
- {
- if (m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + i)) == 0)
- {
- slot = i;
- break;
- }
- }
+ slot = freeSlot;
+ break;
}
+ }
+ assert(slot < MAX_AURAS); // assert that we find a slot and it is valid
- SetAuraSlot( slot );
+ AuraSlotEntry t_entry;
+ t_entry.m_Flags=(IsPositive() ? AFLAG_POSITIVE : AFLAG_NEGATIVE) | AFLAG_NOT_CASTER | ((GetAuraMaxDuration() > 0) ? AFLAG_DURATION : AFLAG_NONE);
+ t_entry.m_Level=(caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
- // Not update fields for not first spell's aura, all data already in fields
- if(slot < MAX_AURAS) // slot found
- {
- SetAura(slot, false);
- SetAuraFlag(slot, true);
- SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
- UpdateAuraCharges();
+ //init pointers-prevent unexpected behaviour
+ for(uint8 i = 0; i < 3; i++)
+ t_entry.m_slotAuras[i]=NULL;
- // update for out of range group members
- m_target->UpdateAuraForGroup(slot);
- }
- }
- else // use found slot
- {
- SetAuraSlot( slot );
- }
+ m_target->SetVisibleAura(slot, t_entry);
+ }
+
+ AuraSlotEntry *entry = m_target->GetVisibleAura(slot);
+ if(!entry)
+ return;
- UpdateSlotCounterAndDuration();
+ entry->m_Flags |= (1 << GetEffIndex());
+ entry->m_slotAuras[GetEffIndex()]=this;
- // Update Seals information
- if( IsSealSpell(GetSpellProto()) )
- m_target->ModifyAuraState(AURA_STATE_JUDGEMENT, true);
+ SetAuraSlot( slot );
- // Conflagrate aura state
- if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags & 4))
- m_target->ModifyAuraState(AURA_STATE_IMMOLATE, true);
+ // update for out of range group members (on 1 slot use)
+ m_target->UpdateAuraForGroup(slot);
- if(GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID
- && (GetSpellProto()->SpellFamilyFlags == 0x40 || GetSpellProto()->SpellFamilyFlags == 0x10))
- {
- m_target->ModifyAuraState(AURA_STATE_SWIFTMEND, true);
- }
+ //*****************************************************
+ // Update target aura state flag
+ // TODO: Make it easer
+ //*****************************************************
+
+ if (!secondaura)
+ {
+ // Sitdown on apply aura req seated
+ if (m_spellProto->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED && !m_target->IsSitState())
+ m_target->SetStandState(UNIT_STAND_STATE_SIT);
+
+ // register aura diminishing on apply
+ if (getDiminishGroup() != DIMINISHING_NONE )
+ m_target->ApplyDiminishingAura(getDiminishGroup(),true);
}
+
+ // Update Seals information
+ if (IsSealSpell(m_spellProto))
+ SetAuraState(AURA_STATE_JUDGEMENT);
+
+ // Conflagrate aura state on Immolate
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellProto->SpellFamilyFlags[0] & 4)
+ SetAuraState(AURA_STATE_IMMOLATE);
+
+ // Faerie Fire (druid versions)
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_DRUID && m_spellProto->SpellFamilyFlags[0] & 0x400)
+ SetAuraState(AURA_STATE_FAERIE_FIRE);
+
+ // Victorious
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_WARRIOR && m_spellProto->SpellFamilyFlags[1] & 0x00040000)
+ SetAuraState(AURA_STATE_WARRIOR_VICTORY_RUSH);
+
+ // Swiftmend state on Regrowth & Rejuvenation
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_DRUID && m_spellProto->SpellFamilyFlags[0] & 0x50 )
+ SetAuraState(AURA_STATE_SWIFTMEND);
+
+ // Deadly poison aura state
+ if(m_spellProto->SpellFamilyName == SPELLFAMILY_ROGUE && m_spellProto->SpellFamilyFlags[0] & 0x10000)
+ SetAuraState(AURA_STATE_DEADLY_POISON);
+
+ // Enrage aura state
+ if(m_spellProto->Dispel == DISPEL_ENRAGE)
+ SetAuraState(AURA_STATE_ENRAGE);
+
+ m_target->ApplyModFlag(UNIT_FIELD_AURASTATE, GetAuraStateMask(), true);
}
void Aura::_RemoveAura()
@@ -922,77 +921,55 @@ void Aura::_RemoveAura()
dynObj->RemoveAffected(m_target);
}
- // unregister aura
- if (getDiminishGroup() != DIMINISHING_NONE )
- m_target->ApplyDiminishingAura(getDiminishGroup(),false);
-
//passive auras do not get put in slots
// Note: but totem can be not accessible for aura target in time remove (to far for find in grid)
//if(m_isPassive && !(caster && caster->GetTypeId() == TYPEID_UNIT && ((Creature*)caster)->isTotem()))
// return;
uint8 slot = GetAuraSlot();
-
if(slot >= MAX_AURAS) // slot not set
return;
- if(m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + slot)) == 0)
+ AuraSlotEntry *entry = m_target->GetVisibleAura(slot);
+ if(!entry) //slot already removed-shouldn't happen
return;
- bool samespell = false;
+ entry->m_slotAuras[GetEffIndex()]=NULL; //unregister aura
- // find other aura in same slot (current already removed from list)
- for(uint8 i = 0; i < 3; i++)
+ bool lastaura = true;
+ for(uint8 i = 0; i < 3; ++i) //check slot for more auras of the spell
{
- Unit::spellEffectPair spair = Unit::spellEffectPair(GetId(), i);
- for(Unit::AuraMap::const_iterator itr = m_target->GetAuras().lower_bound(spair); itr != m_target->GetAuras().upper_bound(spair); ++itr)
+ if(entry->m_slotAuras[i])
{
- if(itr->second->GetAuraSlot()==slot)
- {
- samespell = true;
-
- break;
- }
- }
- if(samespell)
+ lastaura = false;
break;
+ }
}
// only remove icon when the last aura of the spell is removed (current aura already removed from list)
- if (!samespell)
+ if(lastaura)
{
- SetAura(slot, true);
- SetAuraFlag(slot, false);
- SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
+ // unregister aura diminishing (and store last time)
+ if (getDiminishGroup() != DIMINISHING_NONE )
+ m_target->ApplyDiminishingAura(getDiminishGroup(),false);
- SetAuraApplication(slot, 0);
// update for out of range group members
m_target->UpdateAuraForGroup(slot);
- if( IsSealSpell(GetSpellProto()) )
- m_target->ModifyAuraState(AURA_STATE_JUDGEMENT,false);
-
- // Conflagrate aura state
- if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags & 4))
- m_target->ModifyAuraState(AURA_STATE_IMMOLATE, false);
-
- // Swiftmend aura state
- if(GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID
- && (GetSpellProto()->SpellFamilyFlags == 0x40 || GetSpellProto()->SpellFamilyFlags == 0x10))
+ // Check needed only if aura applies aurastate
+ if(GetAuraStateMask())
{
- bool found = false;
- Unit::AuraList const& RejorRegr = m_target->GetAurasByType(SPELL_AURA_PERIODIC_HEAL);
- for(Unit::AuraList::const_iterator i = RejorRegr.begin(); i != RejorRegr.end(); ++i)
+ uint32 foundMask = 0;
+ Unit::AuraMap& Auras = m_target->GetAuras();
+ // Get mask of all aurastates from remaining auras
+ for(Unit::AuraMap::iterator i = Auras.begin(); i != Auras.end(); ++i)
{
- if((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID
- && ((*i)->GetSpellProto()->SpellFamilyFlags == 0x40 || (*i)->GetSpellProto()->SpellFamilyFlags == 0x10) )
- {
- found = true;
- break;
- }
+ foundMask|=(*i).second->GetAuraStateMask();
}
- if(!found)
- m_target->ModifyAuraState(AURA_STATE_SWIFTMEND, false);
+ // Remove only aurastates which were not found
+ foundMask&=~GetAuraStateMask();
+ if (foundMask)
+ m_target->ApplyModFlag(UNIT_FIELD_AURASTATE, foundMask, false);
}
// reset cooldown state for spells
@@ -1004,56 +981,66 @@ void Aura::_RemoveAura()
}
}
-void Aura::SetAuraFlag(uint32 slot, bool add)
+void Aura::SetStackAmount(uint8 stackAmount)
{
- uint32 index = slot / 4;
- uint32 byte = (slot % 4) * 8;
- uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURAFLAGS + index);
- val &= ~((uint32)AFLAG_MASK << byte);
- if(add)
+ if (stackAmount != m_stackAmount)
{
- if (IsPositive())
- val |= ((uint32)AFLAG_POSITIVE << byte);
- else
- val |= ((uint32)AFLAG_NEGATIVE << byte);
+ Unit *target = GetTarget();
+ Unit *caster = GetCaster();
+ if (!target || !caster)
+ return;
+ m_stackAmount = stackAmount;
+ int32 amount = m_stackAmount * caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, target);
+ // Reapply if amount change
+ if (amount!=m_modifier.m_amount)
+ {
+ ApplyModifier(false, true);
+ m_modifier.m_amount = amount;
+ ApplyModifier(true, true);
+ }
}
- m_target->SetUInt32Value(UNIT_FIELD_AURAFLAGS + index, val);
+ RefreshAura();
}
-void Aura::SetAuraLevel(uint32 slot,uint32 level)
+bool Aura::modStackAmount(int32 num)
{
- uint32 index = slot / 4;
- uint32 byte = (slot % 4) * 8;
- uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURALEVELS + index);
- val &= ~(0xFF << byte);
- val |= (level << byte);
- m_target->SetUInt32Value(UNIT_FIELD_AURALEVELS + index, val);
+ // Can`t mod
+ if (!m_spellProto->StackAmount)
+ return true;
+
+ // Modify stack but limit it
+ int32 stackAmount = m_stackAmount + num;
+ if (stackAmount > m_spellProto->StackAmount)
+ stackAmount = m_spellProto->StackAmount;
+ else if (stackAmount <=0) // Last aura from stack removed
+ {
+ m_stackAmount = 0;
+ return true; // need remove aura
+ }
+
+ // Update stack amount
+ SetStackAmount(stackAmount);
+ return false;
}
-void Aura::SetAuraApplication(uint32 slot, int8 count)
+void Aura::RefreshAura()
{
- uint32 index = slot / 4;
- uint32 byte = (slot % 4) * 8;
- uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS + index);
- val &= ~(0xFF << byte);
- val |= ((uint8(count)) << byte);
- m_target->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS + index, val);
+ m_duration = m_maxduration;
+ // update for out of range group members (on 1 slot use)
+ m_target->UpdateAuraForGroup(GetAuraSlot());
}
-void Aura::UpdateSlotCounterAndDuration()
+bool Aura::isAffectedOnSpell(SpellEntry const *spell) const
{
- uint8 slot = GetAuraSlot();
- if(slot >= MAX_AURAS)
- return;
-
- // Three possibilities:
- // Charge = 0; Stack >= 0
- // Charge = 1; Stack >= 0
- // Charge > 1; Stack = 0
- if(m_procCharges < 2)
- SetAuraApplication(slot, m_stackAmount-1);
-
- UpdateAuraDuration();
+ if (!spell)
+ return false;
+ // Check family name
+ if (spell->SpellFamilyName != m_spellProto->SpellFamilyName)
+ return false;
+ // Check EffectClassMask
+ if (m_spellProto->EffectSpellClassMask[m_effIndex] & spell->SpellFamilyFlags)
+ return true;
+ return false;
}
/*********************************************************/
@@ -1064,10 +1051,6 @@ void Aura::HandleAddModifier(bool apply, bool Real)
if(m_target->GetTypeId() != TYPEID_PLAYER || !Real)
return;
- SpellEntry const *spellInfo = GetSpellProto();
- if(!spellInfo)
- return;
-
if(m_modifier.m_miscvalue >= MAX_SPELLMOD)
return;
@@ -1078,40 +1061,35 @@ void Aura::HandleAddModifier(bool apply, bool Real)
{
case 17941: // Shadow Trance
case 22008: // Netherwind Focus
+ case 31834: // Light's Grace
+ case 34754: // Clearcasting
case 34936: // Backlash
- m_procCharges = 1;
+ case 48108: // Hot Streak
+ case 54741: // Firestarter
+ case 57761: // Fireball!
+ SetAuraCharges(1);
break;
}
SpellModifier *mod = new SpellModifier;
mod->op = SpellModOp(m_modifier.m_miscvalue);
- mod->value = GetModifierValue();
+ mod->value = m_modifier.m_amount;
mod->type = SpellModType(m_modifier.m_auraname); // SpellModType value == spell aura types
mod->spellId = GetId();
- mod->effectId = m_effIndex;
- mod->lastAffected = NULL;
- uint64 spellAffectMask = spellmgr.GetSpellAffectMask(GetId(), m_effIndex);
-
- if (spellAffectMask)
- mod->mask = spellAffectMask;
- else
- mod->mask = spellInfo->EffectItemType[m_effIndex];
-
- if (m_procCharges > 0)
- mod->charges = m_procCharges;
- else
- mod->charges = 0;
+ flag96 const *spellAffect = spellmgr.GetSpellAffect(GetId(), m_effIndex);
+ if (!spellAffect)
+ spellAffect = &m_spellProto->EffectSpellClassMask[m_effIndex];
+ mod->mask = *spellAffect;
+ mod->charges = m_procCharges;
m_spellmod = mod;
}
- uint64 spellFamilyMask = m_spellmod->mask;
-
((Player*)m_target)->AddSpellMod(m_spellmod, apply);
// reapply some passive spells after add/remove related spellmods
- if(spellInfo->SpellFamilyName==SPELLFAMILY_WARRIOR && (spellFamilyMask & 0x0000100000000000LL))
+ if(m_spellProto->SpellFamilyName==SPELLFAMILY_WARRIOR && (m_spellmod->mask[1] & 0x00001000))
{
m_target->RemoveAurasDueToSpell(45471);
@@ -1119,6 +1097,29 @@ void Aura::HandleAddModifier(bool apply, bool Real)
m_target->CastSpell(m_target,45471,true);
}
}
+void Aura::HandleAddTargetTrigger(bool apply, bool Real)
+{
+ // Use SpellModifier structure for check
+ // used only fields:
+ // spellId, mask, mask2
+ if (apply)
+ {
+ SpellModifier *mod = new SpellModifier;
+ mod->spellId = GetId();
+
+ flag96 const *spellAffect = spellmgr.GetSpellAffect(GetId(), m_effIndex);
+ if (!spellAffect)
+ spellAffect = &m_spellProto->EffectSpellClassMask[m_effIndex];
+
+ mod->mask = *spellAffect;
+ m_spellmod = mod;
+ }
+ else
+ {
+ delete m_spellmod;
+ m_spellmod = NULL;
+ }
+}
void Aura::TriggerSpell()
{
@@ -1131,8 +1132,6 @@ void Aura::TriggerSpell()
// generic casting code with custom spells and target/caster customs
uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex];
- uint64 originalCasterGUID = GetCasterGUID();
-
SpellEntry const *triggeredSpellInfo = sSpellStore.LookupEntry(trigger_spell_id);
SpellEntry const *auraSpellInfo = GetSpellProto();
uint32 auraId = auraSpellInfo->Id;
@@ -1340,26 +1339,10 @@ void Aura::TriggerSpell()
Creature* creature = (Creature*)target;
// missing lootid has been reported on startup - just return
if (!creature->GetCreatureInfo()->SkinLootId)
- {
return;
- }
- Loot *loot = &creature->loot;
- loot->clear();
- loot->FillLoot(creature->GetCreatureInfo()->SkinLootId, LootTemplates_Skinning, NULL);
- for(uint8 i=0;i<loot->items.size();i++)
- {
- LootItem *item = loot->LootItemInSlot(i,player);
- ItemPosCountVec dest;
- uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count );
- if ( msg == EQUIP_ERR_OK )
- {
- Item * newitem = player->StoreNewItem( dest, item->itemid, true, item->randomPropertyId);
-
- player->SendNewItem(newitem, uint32(item->count), false, false, true);
- }
- else
- player->SendEquipError( msg, NULL, NULL );
- }
+
+ player->AutoStoreLoot(creature->GetCreatureInfo()->SkinLootId,LootTemplates_Skinning,true);
+
creature->setDeathState(JUST_DIED);
creature->RemoveCorpse();
creature->SetHealth(0); // just for nice GM-mode view
@@ -1615,11 +1598,8 @@ void Aura::TriggerSpell()
{
// Invisibility
case 66:
- {
- if(!m_duration)
- m_target->CastSpell(m_target, 32612, true, NULL, this);
+ // Here need periodic triger reducing threat spell (or do it manually)
return;
- }
default:
break;
}
@@ -1729,7 +1709,7 @@ void Aura::TriggerSpell()
{
SpellEntry const* spell = itr->second->GetSpellProto();
if( spell->SpellFamilyName == SPELLFAMILY_SHAMAN &&
- spell->SpellFamilyFlags & 0x0000000000000400L)
+ spell->SpellFamilyFlags[0] & 0x400)
return;
}
target->RemoveAurasDueToSpell(28820);
@@ -1799,8 +1779,8 @@ void Aura::TriggerSpell()
{
switch((*i)->GetModifier()->m_miscvalue)
{
- case STAT_INTELLECT: intellectLoss += (*i)->GetModifierValue(); break;
- case STAT_SPIRIT: spiritLoss += (*i)->GetModifierValue(); break;
+ case STAT_INTELLECT: intellectLoss += (*i)->GetModifier()->m_amount; break;
+ case STAT_SPIRIT: spiritLoss += (*i)->GetModifier()->m_amount; break;
default: break;
}
}
@@ -1810,20 +1790,19 @@ void Aura::TriggerSpell()
return;
caster = target;
- originalCasterGUID = 0;
break;
}
// Mana Tide
case 16191:
{
- caster->CastCustomSpell(target, trigger_spell_id, &m_modifier.m_amount, NULL, NULL, true, NULL, this, originalCasterGUID);
+ caster->CastCustomSpell(target, trigger_spell_id, &m_modifier.m_amount, NULL, NULL, true, NULL, this);
return;
}
}
}
- if(!GetSpellMaxRange(sSpellRangeStore.LookupEntry(triggeredSpellInfo->rangeIndex)))
+ if(!caster->GetSpellMaxRangeForTarget(m_target,sSpellRangeStore.LookupEntry(triggeredSpellInfo->rangeIndex)))
target = m_target; //for druid dispel poison
- m_target->CastSpell(target, triggeredSpellInfo, true, 0, this, originalCasterGUID);
+ m_target->CastSpell(target, triggeredSpellInfo, true, 0, this, GetCasterGUID());
}
Unit* Aura::GetTriggerTarget() const
@@ -1835,6 +1814,21 @@ Unit* Aura::GetTriggerTarget() const
return target ? target : m_target;
}
+void Aura::TriggerSpellWithValue()
+{
+ Unit* caster = GetCaster();
+ Unit* target = GetTriggerTarget();
+
+ if(!caster || !target)
+ return;
+
+ // generic casting code with custom spells and target/caster customs
+ uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex];
+ int32 basepoints0 = this->GetModifier()->m_amount;
+
+ caster->CastCustomSpell(target, trigger_spell_id, &basepoints0, 0, 0, true, 0, this);
+}
+
/*********************************************************/
/*** AURA EFFECTS ***/
/*********************************************************/
@@ -1868,7 +1862,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
return;
case 43873: // Headless Horseman Laugh
if(caster->GetTypeId() == TYPEID_PLAYER)
- ((Player*)caster)->SendPlaySound(11965, false);
+ ((Player*)caster)->PlaySound(11965, false);
return;
case 46354: // Blood Elf Illusion
if(caster)
@@ -1893,11 +1887,11 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
}
// Earth Shield
- if ( caster && GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN && (GetSpellProto()->SpellFamilyFlags & 0x40000000000LL))
+ if ( caster && GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN && (GetSpellProto()->SpellFamilyFlags[1] & 0x400))
{
// prevent double apply bonuses
if(m_target->GetTypeId()!=TYPEID_PLAYER || !((Player*)m_target)->GetSession()->PlayerLoading())
- m_modifier.m_amount = caster->SpellHealingBonus(GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE, m_target);
+ m_modifier.m_amount = caster->SpellHealingBonus(m_target, GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE);
return;
}
}
@@ -1964,6 +1958,25 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
m_target->SetReducedThreatPercent(0, 0);
return;
}
+
+ if (caster && m_removeMode == AURA_REMOVE_BY_DEATH)
+ {
+ // Stop caster Arcane Missle chanelling on death
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_MAGE &&
+ m_spellProto->SpellFamilyFlags[0] & 0x800)
+ {
+ caster->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ return;
+ }
+ // Stop caster Penance chanelling on death
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_PRIEST &&
+ m_spellProto->SpellFamilyFlags[2] & 0x00000080)
+ {
+ caster->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ return;
+ }
+
+ }
}
// AT APPLY & REMOVE
@@ -2004,12 +2017,6 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
m_target->RemoveAurasDueToSpell(spellId);
return;
}
- // Victorious
- if(GetId()==32216 && m_target->getClass()==CLASS_WARRIOR)
- {
- m_target->ModifyAuraState(AURA_STATE_WARRIOR_VICTORY_RUSH, apply);
- return;
- }
//Summon Fire Elemental
if (GetId() == 40133 && caster)
{
@@ -2042,10 +2049,25 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
}
case SPELLFAMILY_MAGE:
{
- // Hypothermia
- if( GetId()==41425 )
+ break;
+ }
+ case SPELLFAMILY_PRIEST:
+ {
+ // Pain and Suffering
+ if( m_spellProto->SpellIconID == 2874 && m_target->GetTypeId()==TYPEID_PLAYER )
{
- m_target->ModifyAuraState(AURA_STATE_HYPOTHERMIA,apply);
+ if(apply)
+ {
+ // Reduce backfire damage (dot damage) from Shadow Word: Death
+ SpellModifier *mod = new SpellModifier;
+ mod->op = SPELLMOD_DOT;
+ mod->value = m_modifier.m_amount;
+ mod->type = SPELLMOD_PCT;
+ mod->spellId = GetId();
+ mod->mask[1] = 0x00000002;
+ m_spellmod = mod;
+ }
+ ((Player*)m_target)->AddSpellMod(m_spellmod, apply);
return;
}
break;
@@ -2053,24 +2075,38 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
case SPELLFAMILY_DRUID:
{
// Lifebloom
- if ( GetSpellProto()->SpellFamilyFlags & 0x1000000000LL )
+ if ( GetSpellProto()->SpellFamilyFlags[1] & 0x10 )
{
if ( apply )
{
if ( caster )
// prevent double apply bonuses
if(m_target->GetTypeId()!=TYPEID_PLAYER || !((Player*)m_target)->GetSession()->PlayerLoading())
- m_modifier.m_amount = caster->SpellHealingBonus(GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE, m_target);
+ m_modifier.m_amount = caster->SpellHealingBonus(m_target, GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE);
}
- // Do final heal for real !apply
- else if (Real)
+ else
{
- if (GetAuraDuration() <= 0 || m_removeMode==AURA_REMOVE_BY_DISPEL)
+ // Final heal only on dispelled or duration end
+ if ( !(GetAuraDuration() <= 0 || m_removeMode==AURA_REMOVE_BY_DISPEL) )
+ return;
+
+ // final heal
+ if(m_target->IsInWorld())
+ m_target->CastCustomSpell(m_target,33778,&m_modifier.m_amount,NULL,NULL,true,NULL,this,GetCasterGUID());
+
+ /*// have a look if there is still some other Lifebloom dummy aura
+ Unit::AuraList auras = m_target->GetAurasByType(SPELL_AURA_DUMMY);
+ for(Unit::AuraList::iterator itr = auras.begin(); itr!=auras.end(); ++itr)
+ if((*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID &&
+ (*itr)->GetSpellProto()->SpellFamilyFlags & 0x1000000000LL)
+ return;
+
+ // final heal
+ if(m_target->IsInWorld() && m_stackAmount > 0)
{
- // final heal
- if(m_target->IsInWorld())
- m_target->CastCustomSpell(m_target,33778,&m_modifier.m_amount,NULL,NULL,true,NULL,this,GetCasterGUID());
- }
+ int32 amount = m_modifier.m_amount / m_stackAmount;
+ m_target->CastCustomSpell(m_target,33778,&amount,NULL,NULL,true,NULL,this,GetCasterGUID());
+ }*/
}
return;
}
@@ -2091,10 +2127,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
mod->value = m_modifier.m_amount/7;
mod->type = SPELLMOD_FLAT;
mod->spellId = GetId();
- mod->effectId = m_effIndex;
- mod->lastAffected = NULL;
- mod->mask = 0x001000000000LL;
- mod->charges = 0;
+ mod->mask[1] = 0x0010;
m_spellmod = mod;
}
@@ -2117,10 +2150,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
mod->value = m_modifier.m_amount;
mod->type = SPELLMOD_FLAT;
mod->spellId = GetId();
- mod->effectId = m_effIndex;
- mod->lastAffected = NULL;
- mod->mask = 0x4000000000000LL;
- mod->charges = 0;
+ mod->mask[1] = 0x40000;
m_spellmod = mod;
}
@@ -2142,18 +2172,15 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
mod->value = m_modifier.m_amount;
mod->type = SPELLMOD_PCT;
mod->spellId = GetId();
- mod->effectId = m_effIndex;
- mod->lastAffected = NULL;
switch (m_effIndex)
{
case 0:
- mod->mask = 0x00200000000LL; // Windfury Totem
+ mod->mask[1] = 0x002; // Windfury Totem
break;
case 1:
- mod->mask = 0x00400000000LL; // Flametongue Totem
+ mod->mask[1] = 0x004; // Flametongue Totem
break;
}
- mod->charges = 0;
m_spellmod = mod;
}
@@ -2194,42 +2221,6 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
}
}
-void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
-{
- // spells required only Real aura add/remove
- if(!Real)
- return;
-
- SpellEntry const*spell = GetSpellProto();
- switch( spell->SpellFamilyName)
- {
- case SPELLFAMILY_ROGUE:
- {
- // Master of Subtlety
- if (spell->Id==31666 && !apply && Real)
- {
- m_target->RemoveAurasDueToSpell(31665);
- break;
- }
- break;
- }
- case SPELLFAMILY_HUNTER:
- {
- // Aspect of the Viper
- if (spell->SpellFamilyFlags&0x0004000000000000LL)
- {
- // Update regen on remove
- if (!apply && m_target->GetTypeId() == TYPEID_PLAYER)
- ((Player*)m_target)->UpdateManaRegen();
- break;
- }
- break;
- }
- }
-
- m_isPeriodic = apply;
-}
-
void Aura::HandleAuraMounted(bool apply, bool Real)
{
// only at real add/remove aura
@@ -2312,12 +2303,8 @@ void Aura::HandleAuraHover(bool apply, bool Real)
void Aura::HandleWaterBreathing(bool apply, bool Real)
{
- if(apply)
- m_target->waterbreath = true;
- else if(m_target->GetAurasByType(SPELL_AURA_WATER_BREATHING).empty())
+ if(!apply && !m_target->HasAuraType(SPELL_AURA_WATER_BREATHING))
{
- m_target->waterbreath = false;
-
// update for enable timer in case not moving target
if(m_target->GetTypeId()==TYPEID_PLAYER && m_target->IsInWorld())
{
@@ -2395,6 +2382,9 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real)
else
modelid = 21244;
break;
+ case FORM_METAMORPHOSIS:
+ modelid = 25277;
+ break;
case FORM_AMBIENT:
case FORM_SHADOW:
case FORM_STEALTH:
@@ -2742,7 +2732,7 @@ void Aura::HandleAuraModSkill(bool apply, bool Real)
return;
uint32 prot=GetSpellProto()->EffectMiscValue[m_effIndex];
- int32 points = GetModifierValue();
+ int32 points = m_modifier.m_amount;
((Player*)m_target)->ModifySkillBonus(prot,(apply ? points: -points),m_modifier.m_auraname==SPELL_AURA_MOD_SKILL_TALENT);
if(prot == SKILL_DEFENSE)
@@ -2762,6 +2752,9 @@ void Aura::HandleChannelDeathItem(bool apply, bool Real)
//talent will remove the caster's aura->interrupt channel->remove victim aura
if(victim->GetHealth() > 0)
return;
+ // Item amount
+ if (m_modifier.m_amount <= 0)
+ return;
SpellEntry const *spellInfo = GetSpellProto();
if(spellInfo->EffectItemType[m_effIndex] == 0)
@@ -2772,16 +2765,22 @@ void Aura::HandleChannelDeathItem(bool apply, bool Real)
(victim->getLevel() <= Trinity::XP::GetGrayLevel(caster->getLevel()) ||
victim->GetTypeId()==TYPEID_UNIT && !((Player*)caster)->isAllowedToLoot((Creature*)victim)) )
return;
+ //Adding items
+ uint32 noSpaceForCount = 0;
+ uint32 count = m_modifier.m_amount;
+
ItemPosCountVec dest;
- uint8 msg = ((Player*)caster)->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, spellInfo->EffectItemType[m_effIndex], 1 );
+ uint8 msg = ((Player*)caster)->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, spellInfo->EffectItemType[m_effIndex], count, &noSpaceForCount);
if( msg != EQUIP_ERR_OK )
{
+ count-=noSpaceForCount;
((Player*)caster)->SendEquipError( msg, NULL, NULL );
- return;
+ if (count==0)
+ return;
}
Item* newitem = ((Player*)caster)->StoreNewItem(dest, spellInfo->EffectItemType[m_effIndex], true);
- ((Player*)caster)->SendNewItem(newitem, 1, true, false);
+ ((Player*)caster)->SendNewItem(newitem, count, true, false);
}
}
@@ -2791,7 +2790,7 @@ void Aura::HandleBindSight(bool apply, bool Real)
if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
- if (apply)
+ if(apply)
m_target->AddPlayerToVision((Player*)caster);
else
m_target->RemovePlayerFromVision((Player*)caster);
@@ -2803,7 +2802,7 @@ void Aura::HandleFarSight(bool apply, bool Real)
if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
- ((Player*)caster)->SetFarSight(apply ? m_target->GetGUID() : NULL);
+ ((Player*)caster)->SetFarSightGUID(apply ? m_target->GetGUID() : 0);
}
void Aura::HandleAuraTrackCreatures(bool apply, bool Real)
@@ -2839,30 +2838,78 @@ void Aura::HandleAuraTrackStealthed(bool apply, bool Real)
void Aura::HandleAuraModScale(bool apply, bool Real)
{
- m_target->ApplyPercentModFloatValue(OBJECT_FIELD_SCALE_X,GetModifierValue(),apply);
+ m_target->ApplyPercentModFloatValue(OBJECT_FIELD_SCALE_X,m_modifier.m_amount,apply);
}
-void Aura::HandleModPossess(bool apply, bool Real)
+/*void Aura::HandleModPossess(bool apply, bool Real)
{
if(!Real)
return;
+ if(m_target->getLevel() > m_modifier.m_amount)
+ return;
+
+ // not possess yourself
+ if(GetCasterGUID() == m_target->GetGUID())
+ return;
+
Unit* caster = GetCaster();
- if(caster && caster->GetTypeId() == TYPEID_UNIT)
- {
- HandleModCharm(apply, Real);
+ if(!caster)
return;
- }
- if(apply)
+ if( apply )
{
- if(m_target->getLevel() > m_modifier.m_amount)
- return;
+ m_target->SetCharmerGUID(GetCasterGUID());
+ m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,caster->getFaction());
+ caster->SetCharm(m_target);
- m_target->SetCharmedOrPossessedBy(caster, true);
+ m_target->CombatStop();
+ m_target->DeleteThreatList();
+ if(m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ m_target->StopMoving();
+ m_target->GetMotionMaster()->Clear();
+ m_target->GetMotionMaster()->MoveIdle();
+ CharmInfo *charmInfo = ((Creature*)m_target)->InitCharmInfo(m_target);
+ charmInfo->InitPossessCreateSpells();
+ }
+
+ if(caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)caster)->PossessSpellInitialize();
+ }
}
else
- m_target->RemoveCharmedOrPossessedBy(caster);
+ {
+ m_target->SetCharmerGUID(0);
+
+ if(m_target->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)m_target)->setFactionForRace(m_target->getRace());
+ else if(m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ CreatureInfo const *cinfo = ((Creature*)m_target)->GetCreatureInfo();
+ m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,cinfo->faction_A);
+ }
+
+ caster->SetCharm(0);
+
+ if(caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ WorldPacket data(SMSG_PET_SPELLS, 8);
+ data << uint64(0);
+ data << uint32(0);
+ ((Player*)caster)->GetSession()->SendPacket(&data);
+ }
+ if(m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ ((Creature*)m_target)->AIM_Initialize();
+
+ if (((Creature*)m_target)->AI())
+ ((Creature*)m_target)->AI()->AttackStart(caster);
+ }
+ }
+ if(caster->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)caster)->SetFarSightGUID(apply ? m_target->GetGUID() : 0);
}
void Aura::HandleModPossessPet(bool apply, bool Real)
@@ -2873,42 +2920,151 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
Unit* caster = GetCaster();
if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
- if(caster->GetPet() != m_target)
+
+ Pet *pet = caster->GetPet();
+ if(!pet || pet != m_target)
return;
if(apply)
- m_target->SetCharmedOrPossessedBy(caster, true);
+ pet->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
else
- {
- m_target->RemoveCharmedOrPossessedBy(caster);
+ pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
- // Reinitialize the pet bar and make the pet come back to the owner
- ((Player*)caster)->PetSpellInitialize();
- if(!m_target->getVictim())
- {
- m_target->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
- m_target->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW);
- }
+ ((Player*)caster)->SetFarSightGUID(apply ? pet->GetGUID() : NULL);
+ ((Player*)caster)->SetCharm(apply ? pet : NULL);
+ ((Player*)caster)->SetClientControl(pet, apply ? 1 : 0);
+
+ if(apply)
+ {
+ pet->StopMoving();
+ pet->GetMotionMaster()->Clear();
+ pet->GetMotionMaster()->MoveIdle();
}
+ else
+ {
+ pet->AttackStop();
+ pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ pet->SetUnitMovementFlags(MOVEMENTFLAG_NONE);
+ }
+}*/
+
+void Aura::HandleAuraModPetTalentsPoints(bool Apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ // Recalculate pet tlaent points
+ if (Pet *pet=m_target->GetPet())
+ pet->InitTalentForLevel();
}
-void Aura::HandleModCharm(bool apply, bool Real)
+/*void Aura::HandleModCharm(bool apply, bool Real)
{
if(!Real)
return;
+ // not charm yourself
+ if(GetCasterGUID() == m_target->GetGUID())
+ return;
+
Unit* caster = GetCaster();
+ if(!caster)
+ return;
- if(apply)
+ if(int32(m_target->getLevel()) <= m_modifier.m_amount)
{
- if(int32(m_target->getLevel()) > m_modifier.m_amount)
- return;
+ if( apply )
+ {
+ m_target->SetCharmerGUID(GetCasterGUID());
+ m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,caster->getFaction());
+ m_target->CastStop(m_target==caster ? GetId() : 0);
+ caster->SetCharm(m_target);
- m_target->SetCharmedOrPossessedBy(caster, false);
+ m_target->CombatStop();
+ m_target->DeleteThreatList();
+
+ if(m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ ((Creature*)m_target)->AIM_Initialize();
+ CharmInfo *charmInfo = ((Creature*)m_target)->InitCharmInfo(m_target);
+ charmInfo->InitCharmCreateSpells();
+ charmInfo->SetReactState( REACT_DEFENSIVE );
+
+ if(caster->GetTypeId() == TYPEID_PLAYER && caster->getClass() == CLASS_WARLOCK)
+ {
+ CreatureInfo const *cinfo = ((Creature*)m_target)->GetCreatureInfo();
+ if(cinfo && cinfo->type == CREATURE_TYPE_DEMON)
+ {
+ //to prevent client crash
+ m_target->SetFlag(UNIT_FIELD_BYTES_0, 2048);
+ //just to enable stat window
+ charmInfo->SetPetNumber(objmgr.GeneratePetNumber(), true);
+ //if charmed two demons the same session, the 2nd gets the 1st one's name
+ m_target->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
+ }
+ }
+ }
+
+ if(caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)caster)->CharmSpellInitialize();
+ }
+ }
+ else
+ {
+ m_target->SetCharmerGUID(0);
+
+ if(m_target->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)m_target)->setFactionForRace(m_target->getRace());
+ else
+ {
+ CreatureInfo const *cinfo = ((Creature*)m_target)->GetCreatureInfo();
+
+ // restore faction
+ if(((Creature*)m_target)->isPet())
+ {
+ if(Unit* owner = m_target->GetOwner())
+ m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,owner->getFaction());
+ else if(cinfo)
+ m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,cinfo->faction_A);
+ }
+ else if(cinfo) // normal creature
+ m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,cinfo->faction_A);
+
+ // restore UNIT_FIELD_BYTES_0
+ if(cinfo && caster->GetTypeId() == TYPEID_PLAYER && caster->getClass() == CLASS_WARLOCK && cinfo->type == CREATURE_TYPE_DEMON)
+ {
+ CreatureDataAddon const *cainfo = ((Creature*)m_target)->GetCreatureAddon();
+ if(cainfo && cainfo->bytes0 != 0)
+ m_target->SetUInt32Value(UNIT_FIELD_BYTES_0, cainfo->bytes0);
+ else
+ m_target->RemoveFlag(UNIT_FIELD_BYTES_0, 2048);
+
+ if(m_target->GetCharmInfo())
+ m_target->GetCharmInfo()->SetPetNumber(0, true);
+ else
+ sLog.outError("Aura::HandleModCharm: target="I64FMTD" with typeid=%d has a charm aura but no charm info!", m_target->GetGUID(), m_target->GetTypeId());
+ }
+ }
+
+ caster->SetCharm(0);
+
+ if(caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ WorldPacket data(SMSG_PET_SPELLS, 8);
+ data << uint64(0);
+ data << uint32(0);
+ ((Player*)caster)->GetSession()->SendPacket(&data);
+ }
+ if(m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ ((Creature*)m_target)->AIM_Initialize();
+ if (((Creature*)m_target)->AI())
+ ((Creature*)m_target)->AI()->AttackStart(caster);
+ }
+ }
}
- else
- m_target->RemoveCharmedOrPossessedBy(caster);
-}
+}*/
void Aura::HandleModConfuse(bool apply, bool Real)
{
@@ -2947,7 +3103,7 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
std::list<Unit*> targets;
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_target, m_target, World::GetMaxVisibleDistance());
- Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(m_target, targets, u_check);
m_target->VisitNearbyObject(World::GetMaxVisibleDistance(), searcher);
for(std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter)
{
@@ -2964,7 +3120,7 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
}
}
// blizz like 2.0.x
- m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN6);
+ m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
// blizz like 2.0.x
m_target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
// blizz like 2.0.x
@@ -2989,7 +3145,7 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
m_target->SendMessageToSet(&data,true);
*/
// blizz like 2.0.x
- m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN6);
+ m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
// blizz like 2.0.x
m_target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
// blizz like 2.0.x
@@ -3001,45 +3157,52 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
void Aura::HandleAuraModDisarm(bool apply, bool Real)
{
- if(!Real)
+ if (!Real)
return;
+ AuraType type = GetModifier()->m_auraname;
- if(!apply && m_target->HasAuraType(SPELL_AURA_MOD_DISARM))
+ //Prevent handling aura twice
+ if(apply && m_target->GetAurasByType(type).size()>1)
return;
-
- // not sure for it's correctness
+ if(!apply && m_target->HasAuraType(type))
+ return;
+ uint32 field, flag, slot;
+ WeaponAttackType attType;
+ switch (type)
+ {
+ case SPELL_AURA_MOD_DISARM:
+ field=UNIT_FIELD_FLAGS;
+ flag=UNIT_FLAG_DISARMED;
+ slot=EQUIPMENT_SLOT_MAINHAND;
+ attType=BASE_ATTACK;
+ break;
+ case SPELL_AURA_MOD_DISARM_OFFHAND:
+ field=UNIT_FIELD_FLAGS_2;
+ flag=UNIT_FLAG2_DISARM_OFFHAND;
+ slot=EQUIPMENT_SLOT_OFFHAND;
+ attType=OFF_ATTACK;
+ break;
+ case SPELL_AURA_MOD_DISARM_RANGED:
+ field=UNIT_FIELD_FLAGS_2;
+ flag=UNIT_FLAG2_DISARM_RANGED;
+ slot=EQUIPMENT_SLOT_RANGED;
+ attType=RANGED_ATTACK;
+ break;
+ }
if(apply)
- m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISARMED);
+ m_target->SetFlag(field, flag);
else
- m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISARMED);
+ m_target->RemoveFlag(field, flag);
if (m_target->GetTypeId() == TYPEID_PLAYER)
{
- // main-hand attack speed already set to special value for feral form already and don't must change and reset at remove.
- if (((Player *)m_target)->IsInFeralForm())
+ Item *pItem = ((Player*)m_target)->GetItemByPos( INVENTORY_SLOT_BAG_0, slot );
+ if(!pItem )
return;
-
- if (apply)
- m_target->SetAttackTime(BASE_ATTACK,BASE_ATTACK_TIME);
- else
- ((Player *)m_target)->SetRegularAttackTime();
+ ((Player*)m_target)->_ApplyItemMods(pItem, slot, !apply);
}
- else
- {
- // creature does not have equipment
- if(apply && !((Creature*)m_target)->GetCurrentEquipmentId())
- return;
- }
-
- m_target->UpdateDamagePhysical(BASE_ATTACK);
-}
-
-void Aura::HandleAuraModStun(bool apply, bool Real)
-{
- if(!Real)
- return;
-
- m_target->SetControlled(apply, UNIT_STAT_STUNNED);
+ else if (((Creature*)m_target)->GetCurrentEquipmentId())
+ m_target->UpdateDamagePhysical(attType);
}
void Aura::HandleModStealth(bool apply, bool Real)
@@ -3059,7 +3222,7 @@ void Aura::HandleModStealth(bool apply, bool Real)
// only at real aura add
if(Real)
{
- m_target->SetByteValue(UNIT_FIELD_BYTES_1, 2, 0x02);
+ m_target->SetStandFlags(UNIT_STAND_FLAGS_CREEP);
if(m_target->GetTypeId()==TYPEID_PLAYER)
m_target->SetFlag(PLAYER_FIELD_BYTES2, 0x2000);
@@ -3070,10 +3233,6 @@ void Aura::HandleModStealth(bool apply, bool Real)
//m_target->SetVisibility(VISIBILITY_OFF);
m_target->SetVisibility(VISIBILITY_GROUP_STEALTH);
}
-
- // for RACE_NIGHTELF stealth
- if(m_target->GetTypeId()==TYPEID_PLAYER && GetId()==20580)
- m_target->CastSpell(m_target, 21009, true, NULL, this);
}
}
else
@@ -3081,14 +3240,10 @@ void Aura::HandleModStealth(bool apply, bool Real)
// only at real aura remove
if(Real)
{
- // for RACE_NIGHTELF stealth
- if(m_target->GetTypeId()==TYPEID_PLAYER && GetId()==20580)
- m_target->RemoveAurasDueToSpell(21009);
-
// if last SPELL_AURA_MOD_STEALTH and no GM invisibility
if(!m_target->HasAuraType(SPELL_AURA_MOD_STEALTH) && m_target->GetVisibility()!=VISIBILITY_OFF)
{
- m_target->SetByteValue(UNIT_FIELD_BYTES_1, 2, 0x00);
+ m_target->RemoveStandFlags(UNIT_STAND_FLAGS_CREEP);
if(m_target->GetTypeId()==TYPEID_PLAYER)
m_target->RemoveFlag(PLAYER_FIELD_BYTES2, 0x2000);
@@ -3204,15 +3359,6 @@ void Aura::HandleInvisibilityDetect(bool apply, bool Real)
m_target->SetToNotify();
}
-void Aura::HandleAuraModRoot(bool apply, bool Real)
-{
- // only at real add/remove aura
- if(!Real)
- return;
-
- m_target->SetControlled(apply, UNIT_STAT_ROOT);
-}
-
void Aura::HandleAuraModSilence(bool apply, bool Real)
{
// only at real add/remove aura
@@ -3249,7 +3395,7 @@ void Aura::HandleAuraModSilence(bool apply, bool Real)
return;
// Search Mana Tap auras on caster
- Aura * dummy = m_target->GetDummyAura(28734);
+ Aura * dummy = caster->GetDummyAura(28734);
if (dummy)
{
int32 bp = dummy->GetStackAmount() * 10;
@@ -3306,7 +3452,7 @@ void Aura::HandleModThreat(bool apply, bool Real)
if(m_modifier.m_miscvalue & int32(1<<x))
{
if(m_target->GetTypeId() == TYPEID_PLAYER)
- ApplyPercentModFloatVar(m_target->m_threatModifier[x], m_positive ? GetModifierValue() : -GetModifierValue(), apply);
+ ApplyPercentModFloatVar(m_target->m_threatModifier[x], m_positive ? m_modifier.m_amount : -m_modifier.m_amount, apply);
}
}
}
@@ -3327,9 +3473,9 @@ void Aura::HandleAuraModTotalThreat(bool apply, bool Real)
float threatMod = 0.0f;
if(apply)
- threatMod = float(GetModifierValue());
+ threatMod = float(m_modifier.m_amount);
else
- threatMod = float(-GetModifierValue());
+ threatMod = float(-m_modifier.m_amount);
m_target->getHostilRefManager().threatAssist(caster, threatMod);
}
@@ -3398,7 +3544,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real)
//Players on flying mounts must be immune to polymorph
if (m_target->GetTypeId()==TYPEID_PLAYER)
- m_target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,MECHANIC_POLYMORPH,apply);
+ m_target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,1<<MECHANIC_POLYMORPH,apply);
// Dragonmaw Illusion (overwrite mount model, mounted aura already applied)
if( apply && m_target->HasAura(42016,0) && m_target->GetMountID())
@@ -3445,10 +3591,13 @@ void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real)
void Aura::HandleModMechanicImmunity(bool apply, bool Real)
{
- uint32 mechanic = 1 << m_modifier.m_miscvalue;
-
+ uint32 mechanic;
+ if (GetSpellProto()->EffectApplyAuraName[GetEffIndex()]==SPELL_AURA_MECHANIC_IMMUNITY)
+ mechanic = 1 << m_modifier.m_miscvalue;
+ else //SPELL_AURA_MECHANIC_IMMUNITY_MASK
+ mechanic = m_modifier.m_miscvalue;
//immune movement impairment and loss of control
- if(GetId()==42292)
+ if(GetId()==42292 || GetId()==59752)
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
if(apply && GetSpellProto()->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
@@ -3459,9 +3608,8 @@ void Aura::HandleModMechanicImmunity(bool apply, bool Real)
next = iter;
++next;
SpellEntry const *spell = iter->second->GetSpellProto();
- if (!( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) // spells unaffected by invulnerability
- && !iter->second->IsPositive() // only remove negative spells
- && spell->Id != GetId())
+ if (!( spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY) && // spells unaffected by invulnerability
+ spell->Id != GetId())
{
//check for mechanic mask
if(GetSpellMechanicMask(spell, iter->second->GetEffIndex()) & mechanic)
@@ -3476,18 +3624,7 @@ void Aura::HandleModMechanicImmunity(bool apply, bool Real)
}
}
- m_target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,m_modifier.m_miscvalue,apply);
-
- // special cases
- switch(m_modifier.m_miscvalue)
- {
- case MECHANIC_INVULNERABILITY:
- m_target->ModifyAuraState(AURA_STATE_FORBEARANCE,apply);
- break;
- case MECHANIC_SHIELD:
- m_target->ModifyAuraState(AURA_STATE_WEAKENED_SOUL,apply);
- break;
- }
+ m_target->ApplySpellImmune(GetId(),IMMUNITY_MECHANIC,mechanic,apply);
// Bestial Wrath
if ( GetSpellProto()->SpellFamilyName == SPELLFAMILY_HUNTER && GetSpellProto()->Id == 19574)
@@ -3662,8 +3799,7 @@ void Aura::HandleAuraProcTriggerSpell(bool apply, bool Real)
switch (GetId())
{
case 28200: // Ascendance (Talisman of Ascendance trinket)
- m_procCharges = 6;
- UpdateAuraCharges();
+ SetAuraCharges(6);
break;
default: break;
}
@@ -3685,18 +3821,17 @@ void Aura::HandleAuraModStalked(bool apply, bool Real)
void Aura::HandlePeriodicTriggerSpell(bool apply, bool Real)
{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
-
m_isPeriodic = apply;
- m_isTrigger = apply;
-
- // Curse of the Plaguebringer
- if (!apply && m_spellProto->Id == 29213 && m_removeMode!=AURA_REMOVE_BY_DISPEL)
+ if (m_spellProto->Id == 66 && !apply)
{
- // Cast Wrath of the Plaguebringer if not dispelled
- m_target->CastSpell(m_target, 29214, true, 0, this);
+ if (m_removeMode == AURA_REMOVE_BY_DEFAULT && m_duration<=0)
+ m_target->CastSpell(m_target, 32612, true, NULL, this);
}
+}
+
+void Aura::HandlePeriodicTriggerSpellWithValue(bool apply, bool Real)
+{
+ m_isPeriodic = apply;
// Wrath of the Astromancer
if(!apply && m_spellProto->Id == 42783)
@@ -3707,59 +3842,62 @@ void Aura::HandlePeriodicTriggerSpell(bool apply, bool Real)
void Aura::HandlePeriodicEnergize(bool apply, bool Real)
{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
+ if (!Real)
+ return;
m_isPeriodic = apply;
+
+ // Replenishment (0.25% from max)
+ // Infinite Replenishment
+ if (GetId() == 57669 ||
+ GetId() == 61782)
+ m_modifier.m_amount = m_target->GetMaxPower(POWER_MANA) * 25 / 10000;
}
-void Aura::HandlePeriodicHeal(bool apply, bool Real)
+void Aura::HandleAuraPowerBurn(bool apply, bool Real)
{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
-
m_isPeriodic = apply;
+}
- // only at real apply
- if (Real && apply && GetSpellProto()->Mechanic == MECHANIC_BANDAGE)
- {
- // provided m_target as original caster to prevent apply aura caster selection for this negative buff
- m_target->CastSpell(m_target,11196,true,NULL,this,m_target->GetGUID());
- }
+void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
+{
+ // spells required only Real aura add/remove
+ if(!Real)
+ return;
// For prevent double apply bonuses
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
- if(!loading && apply)
+ Unit* caster = GetCaster();
+
+ SpellEntry const*spell = GetSpellProto();
+ switch( spell->SpellFamilyName)
{
- switch (m_spellProto->SpellFamilyName)
+ case SPELLFAMILY_ROGUE:
{
- case SPELLFAMILY_DRUID:
+ // Master of Subtlety
+ if (spell->Id==31666 && !apply)
{
- // Rejuvenation
- if(m_spellProto->SpellFamilyFlags & 0x0000000000000010LL)
- {
- if(Unit* caster = GetCaster())
- {
- Unit::AuraList const& classScripts = caster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- for(Unit::AuraList::const_iterator k = classScripts.begin(); k != classScripts.end(); ++k)
- {
- int32 tickcount = GetSpellDuration(m_spellProto) / m_spellProto->EffectAmplitude[m_effIndex];
- switch((*k)->GetModifier()->m_miscvalue)
- {
- case 4953: // Increased Rejuvenation Healing - Harold's Rejuvenating Broach Aura
- case 4415: // Increased Rejuvenation Healing - Idol of Rejuvenation Aura
- {
- m_modifier.m_amount += (*k)->GetModifier()->m_amount / tickcount;
- break;
- }
- }
- }
- }
- }
+ m_target->RemoveAurasDueToSpell(31665);
+ break;
}
+ break;
+ }
+ case SPELLFAMILY_HUNTER:
+ {
+ // Explosive Shot
+ if (apply && !loading && caster)
+ m_modifier.m_amount +=caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
+ break;
}
}
+
+ m_isPeriodic = apply;
+}
+
+void Aura::HandlePeriodicHeal(bool apply, bool Real)
+{
+ m_isPeriodic = apply;
}
void Aura::HandlePeriodicDamage(bool apply, bool Real)
@@ -3768,26 +3906,28 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
if(!Real)
return;
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
-
m_isPeriodic = apply;
// For prevent double apply bonuses
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
+ // Custom damage calculation after
+ if (!apply || loading)
+ return;
+
Unit *caster = GetCaster();
+ if (!caster)
+ return;
switch (m_spellProto->SpellFamilyName)
{
case SPELLFAMILY_GENERIC:
{
// Pounce Bleed
- if ( m_spellProto->SpellIconID == 147 && m_spellProto->SpellVisual == 0 )
+ if ( m_spellProto->SpellIconID == 147 && m_spellProto->SpellVisual[0] == 0 )
{
// $AP*0.18/6 bonus per tick
- if (apply && !loading && caster)
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 / 100);
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 / 100);
return;
}
break;
@@ -3795,18 +3935,14 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
case SPELLFAMILY_WARRIOR:
{
// Rend
- if (m_spellProto->SpellFamilyFlags & 0x0000000000000020LL)
+ if (m_spellProto->SpellFamilyFlags[0] & 0x20)
{
- // 0.00743*(($MWB+$mwb)/2+$AP/14*$MWS) bonus per tick
- if (apply && !loading && caster)
- {
- float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
- int32 mws = caster->GetAttackTime(BASE_ATTACK);
- float mwb_min = caster->GetWeaponDamageRange(BASE_ATTACK,MINDAMAGE);
- float mwb_max = caster->GetWeaponDamageRange(BASE_ATTACK,MAXDAMAGE);
- // WARNING! in 3.0 multiplier 0.00743f change to 0.6
- m_modifier.m_amount+=int32(((mwb_min+mwb_max)/2+ap*mws/14000)*0.00743f);
- }
+ // $0.2*(($MWB+$mwb)/2+$AP/14*$MWS) bonus per tick
+ float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 mws = caster->GetAttackTime(BASE_ATTACK);
+ float mwb_min = caster->GetWeaponDamageRange(BASE_ATTACK,MINDAMAGE);
+ float mwb_max = caster->GetWeaponDamageRange(BASE_ATTACK,MAXDAMAGE);
+ m_modifier.m_amount+=int32(((mwb_min+mwb_max)/2+ap*mws/14000)*0.2f);
return;
}
break;
@@ -3814,92 +3950,80 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
case SPELLFAMILY_DRUID:
{
// Rake
- if (m_spellProto->SpellFamilyFlags & 0x0000000000001000LL)
+ if (m_spellProto->SpellFamilyFlags[0] & 0x1000)
{
- // $AP*0.06/3 bonus per tick
- if (apply && !loading && caster)
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 2 / 100);
+ // $AP*0.06 bonus per tick
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 6 / 100);
return;
}
// Lacerate
- if (m_spellProto->SpellFamilyFlags & 0x000000010000000000LL)
+ if (m_spellProto->SpellFamilyFlags[1] & 0x0000000100)
{
// $AP*0.05/5 bonus per tick
- if (apply && !loading && caster)
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
return;
}
// Rip
- if (m_spellProto->SpellFamilyFlags & 0x000000000000800000LL)
+ if (m_spellProto->SpellFamilyFlags[1] & 0x800000)
{
- // $AP * min(0.06*$cp, 0.24)/6 [Yes, there is no difference, whether 4 or 5 CPs are being used]
- if (apply && !loading && caster && caster->GetTypeId() == TYPEID_PLAYER)
- {
- uint8 cp = ((Player*)caster)->GetComboPoints();
+ // 0.01*$AP*cp
+ if (caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ uint8 cp = ((Player*)caster)->GetComboPoints();
- // Idol of Feral Shadows. Cant be handled as SpellMod in SpellAura:Dummy due its dependency from CPs
- Unit::AuraList const& dummyAuras = caster->GetAurasByType(SPELL_AURA_DUMMY);
- for(Unit::AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
+ // Idol of Feral Shadows. Cant be handled as SpellMod in SpellAura:Dummy due its dependency from CPs
+ Unit::AuraList const& dummyAuras = caster->GetAurasByType(SPELL_AURA_DUMMY);
+ for(Unit::AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
+ {
+ if((*itr)->GetId()==34241)
{
- if((*itr)->GetId()==34241)
- {
- m_modifier.m_amount += cp * (*itr)->GetModifier()->m_amount;
- break;
- }
+ m_modifier.m_amount += cp * (*itr)->GetModifier()->m_amount;
+ break;
}
-
- if (cp > 4) cp = 4;
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * cp / 100);
}
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * cp / 100);
+ return;
+ }
+ // Lock Jaw
+ if (m_spellProto->SpellFamilyFlags[1] & 0x10000000)
+ {
+ // 0.15*$AP
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 15 / 100);
return;
}
break;
}
case SPELLFAMILY_ROGUE:
{
- // Deadly poison aura state
- if((m_spellProto->SpellFamilyFlags & 0x10000) && m_spellProto->SpellVisual==5100)
+ // Rupture
+ if (m_spellProto->SpellFamilyFlags[0] & 0x100000)
{
- if(apply)
- m_target->ModifyAuraState(AURA_STATE_DEADLY_POISON,true);
- else
- {
- // current aura already removed, search present of another
- bool found = false;
- Unit::AuraList const& auras = m_target->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
- for(Unit::AuraList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
- {
- SpellEntry const* itr_spell = (*itr)->GetSpellProto();
- if(itr_spell && itr_spell->SpellFamilyName==SPELLFAMILY_ROGUE && (itr_spell->SpellFamilyFlags & 0x10000) && itr_spell->SpellVisual==5100)
- {
- found = true;
- break;
- }
- }
- // this has been last deadly poison aura
- if(!found)
- m_target->ModifyAuraState(AURA_STATE_DEADLY_POISON,false);
- }
+ if (caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+ //1 point : ${($m1+$b1*1+0.015*$AP)*4} damage over 8 secs
+ //2 points: ${($m1+$b1*2+0.024*$AP)*5} damage over 10 secs
+ //3 points: ${($m1+$b1*3+0.03*$AP)*6} damage over 12 secs
+ //4 points: ${($m1+$b1*4+0.03428571*$AP)*7} damage over 14 secs
+ //5 points: ${($m1+$b1*5+0.0375*$AP)*8} damage over 16 secs
+ float AP_per_combo[] = {0, 0.015f, 0.024, 0.03, 0.03428571, 0.0375};
+ uint8 cp = ((Player*)caster)->GetComboPoints();
+ if (cp > 5) cp = 5;
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * AP_per_combo[cp]);
return;
}
- // Rupture
- if (m_spellProto->SpellFamilyFlags & 0x000000000000100000LL)
+ // Garrote
+ if (m_spellProto->SpellFamilyFlags[0] & 0x100)
{
- // Dmg/tick = $AP*min(0.01*$cp, 0.03) [Like Rip: only the first three CP increase the contribution from AP]
- if (apply && !loading && caster && caster->GetTypeId() == TYPEID_PLAYER)
- {
- uint8 cp = ((Player*)caster)->GetComboPoints();
- if (cp > 3) cp = 3;
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * cp / 100);
- }
+ // $AP*0.07 bonus per tick
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 7 / 100);
return;
}
- // Garrote
- if (m_spellProto->SpellFamilyFlags & 0x000000000000000100LL)
+ // Deadly Poison
+ if (m_spellProto->SpellFamilyFlags[0] & 0x10000)
{
- // $AP*0.18/6 bonus per tick
- if (apply && !loading && caster)
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 / 100);
+ // 0.08*$AP / 4 * amount of stack
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 2 * GetStackAmount() / 100);
return;
}
break;
@@ -3907,47 +4031,17 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
case SPELLFAMILY_HUNTER:
{
// Serpent Sting
- if (m_spellProto->SpellFamilyFlags & 0x0000000000004000LL)
+ if (m_spellProto->SpellFamilyFlags[0] & 0x4000)
{
// $RAP*0.1/5 bonus per tick
- if (apply && !loading && caster)
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
return;
}
// Immolation Trap
- if (m_spellProto->SpellFamilyFlags & 0x0000000000000004LL && m_spellProto->SpellIconID == 678)
+ if (m_spellProto->SpellFamilyFlags[0] & 0x4 && m_spellProto->SpellIconID == 678)
{
// $RAP*0.1/5 bonus per tick
- if (apply && !loading && caster)
- m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
- return;
- }
- break;
- }
- case SPELLFAMILY_PALADIN:
- {
- // Consecration
- if (m_spellProto->SpellFamilyFlags & 0x0000000000000020LL)
- {
- if (apply && !loading)
- {
- if(Unit* caster = GetCaster())
- {
- Unit::AuraList const& classScripts = caster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- for(Unit::AuraList::const_iterator k = classScripts.begin(); k != classScripts.end(); ++k)
- {
- int32 tickcount = GetSpellDuration(m_spellProto) / m_spellProto->EffectAmplitude[m_effIndex];
- switch((*k)->GetModifier()->m_miscvalue)
- {
- case 5147: // Improved Consecration - Libram of the Eternal Rest
- {
- m_modifier.m_amount += (*k)->GetModifier()->m_amount / tickcount;
- break;
- }
- }
- }
- }
- }
+ m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
return;
}
break;
@@ -3959,25 +4053,21 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
void Aura::HandlePeriodicDamagePCT(bool apply, bool Real)
{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
-
m_isPeriodic = apply;
}
void Aura::HandlePeriodicLeech(bool apply, bool Real)
{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
-
m_isPeriodic = apply;
}
void Aura::HandlePeriodicManaLeech(bool apply, bool Real)
{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
+ m_isPeriodic = apply;
+}
+void Aura::HandlePeriodicHealthFunnel(bool apply, bool Real)
+{
m_isPeriodic = apply;
}
@@ -3995,9 +4085,9 @@ void Aura::HandleAuraModResistanceExclusive(bool apply, bool Real)
{
if(m_modifier.m_miscvalue & int32(1<<x))
{
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), BASE_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), BASE_VALUE, float(m_modifier.m_amount), apply);
if(m_target->GetTypeId() == TYPEID_PLAYER)
- m_target->ApplyResistanceBuffModsMod(SpellSchools(x),m_positive,GetModifierValue(), apply);
+ m_target->ApplyResistanceBuffModsMod(SpellSchools(x),m_positive,m_modifier.m_amount, apply);
}
}
}
@@ -4008,19 +4098,11 @@ void Aura::HandleAuraModResistance(bool apply, bool Real)
{
if(m_modifier.m_miscvalue & int32(1<<x))
{
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), TOTAL_VALUE, float(m_modifier.m_amount), apply);
if(m_target->GetTypeId() == TYPEID_PLAYER || ((Creature*)m_target)->isPet())
- m_target->ApplyResistanceBuffModsMod(SpellSchools(x),m_positive,GetModifierValue(), apply);
+ m_target->ApplyResistanceBuffModsMod(SpellSchools(x),m_positive,m_modifier.m_amount, apply);
}
}
-
- // Faerie Fire (druid versions)
- if( m_spellProto->SpellIconID == 109 &&
- m_spellProto->SpellFamilyName == SPELLFAMILY_DRUID &&
- m_spellProto->SpellFamilyFlags & 0x0000000000000400LL )
- {
- m_target->ModifyAuraState(AURA_STATE_FAERIE_FIRE,apply);
- }
}
void Aura::HandleAuraModBaseResistancePCT(bool apply, bool Real)
@@ -4030,14 +4112,14 @@ void Aura::HandleAuraModBaseResistancePCT(bool apply, bool Real)
{
//pets only have base armor
if(((Creature*)m_target)->isPet() && (m_modifier.m_miscvalue & SPELL_SCHOOL_MASK_NORMAL))
- m_target->HandleStatModifier(UNIT_MOD_ARMOR, BASE_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_ARMOR, BASE_PCT, float(m_modifier.m_amount), apply);
}
else
{
for(int8 x = SPELL_SCHOOL_NORMAL; x < MAX_SPELL_SCHOOL;x++)
{
if(m_modifier.m_miscvalue & int32(1<<x))
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), BASE_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), BASE_PCT, float(m_modifier.m_amount), apply);
}
}
}
@@ -4048,11 +4130,11 @@ void Aura::HandleModResistancePercent(bool apply, bool Real)
{
if(m_modifier.m_miscvalue & int32(1<<i))
{
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + i), TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + i), TOTAL_PCT, float(m_modifier.m_amount), apply);
if(m_target->GetTypeId() == TYPEID_PLAYER || ((Creature*)m_target)->isPet())
{
- m_target->ApplyResistanceBuffModsPercentMod(SpellSchools(i),true,GetModifierValue(), apply);
- m_target->ApplyResistanceBuffModsPercentMod(SpellSchools(i),false,GetModifierValue(), apply);
+ m_target->ApplyResistanceBuffModsPercentMod(SpellSchools(i),true,m_modifier.m_amount, apply);
+ m_target->ApplyResistanceBuffModsPercentMod(SpellSchools(i),false,m_modifier.m_amount, apply);
}
}
}
@@ -4065,13 +4147,13 @@ void Aura::HandleModBaseResistance(bool apply, bool Real)
{
//only pets have base stats
if(((Creature*)m_target)->isPet() && (m_modifier.m_miscvalue & SPELL_SCHOOL_MASK_NORMAL))
- m_target->HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
else
{
for(int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; i++)
if(m_modifier.m_miscvalue & (1<<i))
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + i), TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + i), TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
}
@@ -4093,9 +4175,9 @@ void Aura::HandleAuraModStat(bool apply, bool Real)
if (m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue == i)
{
//m_target->ApplyStatMod(Stats(i), m_modifier.m_amount,apply);
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_VALUE, float(m_modifier.m_amount), apply);
if(m_target->GetTypeId() == TYPEID_PLAYER || ((Creature*)m_target)->isPet())
- m_target->ApplyStatBuffMod(Stats(i),GetModifierValue(),apply);
+ m_target->ApplyStatBuffMod(Stats(i),m_modifier.m_amount,apply);
}
}
}
@@ -4115,7 +4197,7 @@ void Aura::HandleModPercentStat(bool apply, bool Real)
for (int32 i = STAT_STRENGTH; i < MAX_STATS; ++i)
{
if(m_modifier.m_miscvalue == i || m_modifier.m_miscvalue == -1)
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), BASE_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), BASE_PCT, float(m_modifier.m_amount), apply);
}
}
@@ -4193,9 +4275,9 @@ void Aura::HandleModTotalPercentStat(bool apply, bool Real)
{
if(m_modifier.m_miscvalue == i || m_modifier.m_miscvalue == -1)
{
- m_target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), TOTAL_PCT, float(m_modifier.m_amount), apply);
if(m_target->GetTypeId() == TYPEID_PLAYER || ((Creature*)m_target)->isPet())
- m_target->ApplyStatPercentBuffMod(Stats(i), GetModifierValue(), apply );
+ m_target->ApplyStatPercentBuffMod(Stats(i), m_modifier.m_amount, apply );
}
}
@@ -4230,117 +4312,48 @@ void Aura::HandleAuraModResistenceOfStatPercent(bool /*apply*/, bool Real)
/********************************/
void Aura::HandleAuraModTotalHealthPercentRegen(bool apply, bool Real)
{
- /*
- Need additional checking for auras who reduce or increase healing, magic effect like Dumpen Magic,
- so this aura not fully working.
- */
- if(apply)
- {
- if(!m_target->isAlive())
- return;
-
- if((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && !m_target->IsSitState())
- m_target->SetStandState(PLAYER_STATE_SIT);
-
- if(m_periodicTimer <= 0)
- {
- m_periodicTimer += m_modifier.periodictime;
-
- if(m_target->GetHealth() < m_target->GetMaxHealth())
- {
- // PeriodicTick can cast triggered spells with stats changes
- PeriodicTick();
- }
- }
- }
-
m_isPeriodic = apply;
}
void Aura::HandleAuraModTotalManaPercentRegen(bool apply, bool Real)
{
- if((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && apply && !m_target->IsSitState())
- m_target->SetStandState(PLAYER_STATE_SIT);
- if(apply)
- {
- if(m_modifier.periodictime == 0)
- m_modifier.periodictime = 1000;
- if(m_periodicTimer <= 0 && m_target->getPowerType() == POWER_MANA)
- {
- m_periodicTimer += m_modifier.periodictime;
-
- if(m_target->GetPower(POWER_MANA) < m_target->GetMaxPower(POWER_MANA))
- {
- // PeriodicTick can cast triggered spells with stats changes
- PeriodicTick();
- }
- }
- }
+ if(m_modifier.periodictime == 0)
+ m_modifier.periodictime = 1000;
+ m_periodicTimer = m_modifier.periodictime;
m_isPeriodic = apply;
}
void Aura::HandleModRegen(bool apply, bool Real) // eating
{
- if(apply)
- {
- if(!m_target->isAlive())
- return;
-
- if ((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && !m_target->IsSitState())
- m_target->SetStandState(PLAYER_STATE_SIT);
-
- if(m_periodicTimer <= 0)
- {
- m_periodicTimer += 5000;
- int32 gain = m_target->ModifyHealth(GetModifierValue());
- Unit *caster = GetCaster();
- if (caster)
- {
- SpellEntry const *spellProto = GetSpellProto();
- if (spellProto)
- m_target->getHostilRefManager().threatAssist(caster, float(gain) * 0.5f, spellProto);
- }
- }
- }
+ if(m_modifier.periodictime == 0)
+ m_modifier.periodictime = 5000;
+ m_periodicTimer = 5000;
m_isPeriodic = apply;
}
void Aura::HandleModPowerRegen(bool apply, bool Real) // drinking
{
- if ((GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) && apply && !m_target->IsSitState())
- m_target->SetStandState(PLAYER_STATE_SIT);
+ if (!Real)
+ return;
- if(apply && m_periodicTimer <= 0)
+ Powers pt = m_target->getPowerType();
+ if(m_modifier.periodictime == 0)
{
- m_periodicTimer += 2000;
+ // Anger Management (only spell use this aura for rage)
+ if (pt == POWER_RAGE)
+ m_modifier.periodictime = 3000;
+ else
+ m_modifier.periodictime = 2000;
+ }
- Powers pt = m_target->getPowerType();
- if(int32(pt) != m_modifier.m_miscvalue)
- return;
+ m_periodicTimer = 5000;
- if ( GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED )
- {
- // eating anim
- m_target->HandleEmoteCommand(EMOTE_ONESHOT_EAT);
- }
- else if( GetId() == 20577 )
- {
- // cannibalize anim
- m_target->HandleEmoteCommand(398);
- }
+ if (m_target->GetTypeId() == TYPEID_PLAYER && m_modifier.m_miscvalue == POWER_MANA)
+ ((Player*)m_target)->UpdateManaRegen();
- // Warrior talent, gain 1 rage every 3 seconds while in combat
- if(pt == POWER_RAGE && m_target->isInCombat())
- {
- m_target->ModifyPower(pt, m_modifier.m_amount*10/17);
- m_periodicTimer += 1000;
- }
- }
m_isPeriodic = apply;
- if (Real && m_target->GetTypeId() == TYPEID_PLAYER && m_modifier.m_miscvalue == POWER_MANA)
- ((Player*)m_target)->UpdateManaRegen();
}
void Aura::HandleModPowerRegenPCT(bool /*apply*/, bool Real)
@@ -4384,7 +4397,7 @@ void Aura::HandleAuraModIncreaseHealth(bool apply, bool Real)
{
if(apply)
{
- m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_VALUE, float(m_modifier.m_amount), apply);
m_target->ModifyHealth(m_modifier.m_amount);
}
else
@@ -4393,7 +4406,7 @@ void Aura::HandleAuraModIncreaseHealth(bool apply, bool Real)
m_target->ModifyHealth(-m_modifier.m_amount);
else
m_target->SetHealth(1);
- m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
}
}
@@ -4424,7 +4437,7 @@ void Aura::HandleAuraModIncreaseEnergy(bool apply, bool Real)
UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + powerType);
- m_target->HandleStatModifier(unitMod, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(unitMod, TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraModIncreaseEnergyPercent(bool apply, bool /*Real*/)
@@ -4435,12 +4448,17 @@ void Aura::HandleAuraModIncreaseEnergyPercent(bool apply, bool /*Real*/)
UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + powerType);
- m_target->HandleStatModifier(unitMod, TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(unitMod, TOTAL_PCT, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraModIncreaseHealthPercent(bool apply, bool /*Real*/)
{
- m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_PCT, float(m_modifier.m_amount), apply);
+}
+
+void Aura::HandleAuraIncreaseBaseHealthPercent(bool apply, bool /*Real*/)
+{
+ m_target->HandleStatModifier(UNIT_MOD_HEALTH, BASE_PCT, float(m_modifier.m_amount), apply);
}
/********************************/
@@ -4504,9 +4522,9 @@ void Aura::HandleAuraModCritPercent(bool apply, bool Real)
if (GetSpellProto()->EquippedItemClass == -1)
{
- ((Player*)m_target)->HandleBaseModValue(CRIT_PERCENTAGE, FLAT_MOD, float (GetModifierValue()), apply);
- ((Player*)m_target)->HandleBaseModValue(OFFHAND_CRIT_PERCENTAGE, FLAT_MOD, float (GetModifierValue()), apply);
- ((Player*)m_target)->HandleBaseModValue(RANGED_CRIT_PERCENTAGE, FLAT_MOD, float (GetModifierValue()), apply);
+ ((Player*)m_target)->HandleBaseModValue(CRIT_PERCENTAGE, FLAT_MOD, float (m_modifier.m_amount), apply);
+ ((Player*)m_target)->HandleBaseModValue(OFFHAND_CRIT_PERCENTAGE, FLAT_MOD, float (m_modifier.m_amount), apply);
+ ((Player*)m_target)->HandleBaseModValue(RANGED_CRIT_PERCENTAGE, FLAT_MOD, float (m_modifier.m_amount), apply);
}
else
{
@@ -4516,13 +4534,28 @@ void Aura::HandleAuraModCritPercent(bool apply, bool Real)
void Aura::HandleModHitChance(bool apply, bool Real)
{
- m_target->m_modMeleeHitChance += apply ? GetModifierValue() : -GetModifierValue();
- m_target->m_modRangedHitChance += apply ? GetModifierValue() : -GetModifierValue();
+ if(m_target->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)m_target)->UpdateMeleeHitChances();
+ ((Player*)m_target)->UpdateRangedHitChances();
+ }
+ else
+ {
+ m_target->m_modMeleeHitChance += apply ? m_modifier.m_amount : (-m_modifier.m_amount);
+ m_target->m_modRangedHitChance += apply ? m_modifier.m_amount : (-m_modifier.m_amount);
+ }
}
void Aura::HandleModSpellHitChance(bool apply, bool Real)
{
- m_target->m_modSpellHitChance += apply ? GetModifierValue(): -GetModifierValue();
+ if(m_target->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)m_target)->UpdateSpellHitChances();
+ }
+ else
+ {
+ m_target->m_modSpellHitChance += apply ? m_modifier.m_amount: (-m_modifier.m_amount);
+ }
}
void Aura::HandleModSpellCritChance(bool apply, bool Real)
@@ -4537,7 +4570,7 @@ void Aura::HandleModSpellCritChance(bool apply, bool Real)
}
else
{
- m_target->m_baseSpellCritChance += apply ? GetModifierValue():-GetModifierValue();
+ m_target->m_baseSpellCritChance += apply ? m_modifier.m_amount:-m_modifier.m_amount;
}
}
@@ -4561,22 +4594,22 @@ void Aura::HandleModSpellCritChanceShool(bool /*apply*/, bool Real)
void Aura::HandleModCastingSpeed(bool apply, bool Real)
{
- m_target->ApplyCastTimePercentMod(GetModifierValue(),apply);
+ m_target->ApplyCastTimePercentMod(m_modifier.m_amount,apply);
}
void Aura::HandleModMeleeRangedSpeedPct(bool apply, bool Real)
{
- m_target->ApplyAttackTimePercentMod(BASE_ATTACK,GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(OFF_ATTACK,GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(RANGED_ATTACK, GetModifierValue(), apply);
+ m_target->ApplyAttackTimePercentMod(BASE_ATTACK,m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(OFF_ATTACK,m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(RANGED_ATTACK, m_modifier.m_amount, apply);
}
void Aura::HandleModCombatSpeedPct(bool apply, bool Real)
{
- m_target->ApplyCastTimePercentMod(GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(BASE_ATTACK,GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(OFF_ATTACK,GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(RANGED_ATTACK, GetModifierValue(), apply);
+ m_target->ApplyCastTimePercentMod(m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(BASE_ATTACK,m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(OFF_ATTACK,m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(RANGED_ATTACK, m_modifier.m_amount, apply);
}
void Aura::HandleModAttackSpeed(bool apply, bool Real)
@@ -4584,26 +4617,26 @@ void Aura::HandleModAttackSpeed(bool apply, bool Real)
if(!m_target->isAlive() )
return;
- m_target->ApplyAttackTimePercentMod(BASE_ATTACK,GetModifierValue(),apply);
+ m_target->ApplyAttackTimePercentMod(BASE_ATTACK,m_modifier.m_amount,apply);
}
void Aura::HandleHaste(bool apply, bool Real)
{
- m_target->ApplyAttackTimePercentMod(BASE_ATTACK, GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(OFF_ATTACK, GetModifierValue(),apply);
- m_target->ApplyAttackTimePercentMod(RANGED_ATTACK,GetModifierValue(),apply);
+ m_target->ApplyAttackTimePercentMod(BASE_ATTACK, m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(OFF_ATTACK, m_modifier.m_amount,apply);
+ m_target->ApplyAttackTimePercentMod(RANGED_ATTACK,m_modifier.m_amount,apply);
}
void Aura::HandleAuraModRangedHaste(bool apply, bool Real)
{
- m_target->ApplyAttackTimePercentMod(RANGED_ATTACK, GetModifierValue(), apply);
+ m_target->ApplyAttackTimePercentMod(RANGED_ATTACK, m_modifier.m_amount, apply);
}
void Aura::HandleRangedAmmoHaste(bool apply, bool Real)
{
if(m_target->GetTypeId() != TYPEID_PLAYER)
return;
- m_target->ApplyAttackTimePercentMod(RANGED_ATTACK,GetModifierValue(), apply);
+ m_target->ApplyAttackTimePercentMod(RANGED_ATTACK,m_modifier.m_amount, apply);
}
/********************************/
@@ -4612,7 +4645,7 @@ void Aura::HandleRangedAmmoHaste(bool apply, bool Real)
void Aura::HandleAuraModAttackPower(bool apply, bool Real)
{
- m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraModRangedAttackPower(bool apply, bool Real)
@@ -4620,13 +4653,13 @@ void Aura::HandleAuraModRangedAttackPower(bool apply, bool Real)
if((m_target->getClassMask() & CLASSMASK_WAND_USERS)!=0)
return;
- m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraModAttackPowerPercent(bool apply, bool Real)
{
//UNIT_FIELD_ATTACK_POWER_MULTIPLIER = multiplier - 1
- m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_PCT, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraModRangedAttackPowerPercent(bool apply, bool Real)
@@ -4635,7 +4668,7 @@ void Aura::HandleAuraModRangedAttackPowerPercent(bool apply, bool Real)
return;
//UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = multiplier - 1
- m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_PCT, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real)
@@ -4644,18 +4677,20 @@ void Aura::HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real)
if(!Real)
return;
- if(m_target->GetTypeId() == TYPEID_PLAYER && (m_target->getClassMask() & CLASSMASK_WAND_USERS)!=0)
- return;
+ // Recalculate bonus
+ if(m_target->GetTypeId() == TYPEID_PLAYER && !(m_target->getClassMask() & CLASSMASK_WAND_USERS))
+ ((Player*)m_target)->UpdateAttackPowerAndDamage(true);
+}
- if(m_modifier.m_miscvalue != STAT_INTELLECT)
- {
- // support required adding UpdateAttackPowerAndDamage calls at stat update
- sLog.outError("Aura SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT (212) need support non-intellect stats!");
+void Aura::HandleAuraModAttackPowerOfStatPercent(bool apply, bool Real)
+{
+ // spells required only Real aura add/remove
+ if(!Real)
return;
- }
// Recalculate bonus
- ((Player*)m_target)->UpdateAttackPowerAndDamage(true);
+ if(m_target->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)m_target)->UpdateAttackPowerAndDamage(false);
}
/********************************/
@@ -4685,9 +4720,9 @@ void Aura::HandleModDamageDone(bool apply, bool Real)
// apply generic physical damage bonuses including wand case
if (GetSpellProto()->EquippedItemClass == -1 || m_target->GetTypeId() != TYPEID_PLAYER)
{
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(GetModifierValue()), apply);
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(GetModifierValue()), apply);
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(m_modifier.m_amount), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(m_modifier.m_amount), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(m_modifier.m_amount), apply);
}
else
{
@@ -4697,9 +4732,9 @@ void Aura::HandleModDamageDone(bool apply, bool Real)
if(m_target->GetTypeId() == TYPEID_PLAYER)
{
if(m_positive)
- m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS,GetModifierValue(),apply);
+ m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS,m_modifier.m_amount,apply);
else
- m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG,GetModifierValue(),apply);
+ m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG,m_modifier.m_amount,apply);
}
}
@@ -4725,7 +4760,7 @@ void Aura::HandleModDamageDone(bool apply, bool Real)
for(int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; i++)
{
if((m_modifier.m_miscvalue & (1<<i)) != 0)
- m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i,GetModifierValue(),apply);
+ m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i,m_modifier.m_amount,apply);
}
}
else
@@ -4733,7 +4768,7 @@ void Aura::HandleModDamageDone(bool apply, bool Real)
for(int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; i++)
{
if((m_modifier.m_miscvalue & (1<<i)) != 0)
- m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+i,GetModifierValue(),apply);
+ m_target->ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+i,m_modifier.m_amount,apply);
}
}
Pet* pet = m_target->GetPet();
@@ -4768,9 +4803,9 @@ void Aura::HandleModDamagePercentDone(bool apply, bool Real)
// apply generic physical damage bonuses including wand case
if (GetSpellProto()->EquippedItemClass == -1 || m_target->GetTypeId() != TYPEID_PLAYER)
{
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(GetModifierValue()), apply);
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(GetModifierValue()), apply);
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, float(m_modifier.m_amount), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(m_modifier.m_amount), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_PCT, float(m_modifier.m_amount), apply);
}
else
{
@@ -4809,7 +4844,7 @@ void Aura::HandleModOffhandDamagePercent(bool apply, bool Real)
sLog.outDebug("AURA MOD OFFHAND DAMAGE");
- m_target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(GetModifierValue()), apply);
+ m_target->HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, float(m_modifier.m_amount), apply);
}
/********************************/
@@ -4822,7 +4857,7 @@ void Aura::HandleModPowerCostPCT(bool apply, bool Real)
if(!Real)
return;
- float amount = GetModifierValue() /100.0f;
+ float amount = m_modifier.m_amount /100.0f;
for(int i = 0; i < MAX_SPELL_SCHOOL; ++i)
if(m_modifier.m_miscvalue & (1<<i))
m_target->ApplyModSignedFloatValue(UNIT_FIELD_POWER_COST_MULTIPLIER+i,amount,apply);
@@ -4836,13 +4871,47 @@ void Aura::HandleModPowerCost(bool apply, bool Real)
for(int i = 0; i < MAX_SPELL_SCHOOL; ++i)
if(m_modifier.m_miscvalue & (1<<i))
- m_target->ApplyModInt32Value(UNIT_FIELD_POWER_COST_MODIFIER+i,GetModifierValue(),apply);
+ m_target->ApplyModInt32Value(UNIT_FIELD_POWER_COST_MODIFIER+i,m_modifier.m_amount,apply);
+}
+
+void Aura::HandleNoReagentUseAura(bool Apply, bool Real)
+{
+ // spells required only Real aura add/remove
+ if(!Real)
+ return;
+ if(m_target->GetTypeId() != TYPEID_PLAYER)
+ return;
+ flag96 mask;
+ Unit::AuraList const& noReagent = m_target->GetAurasByType(SPELL_AURA_NO_REAGENT_USE);
+ for(Unit::AuraList::const_iterator i = noReagent.begin(); i != noReagent.end(); ++i)
+ mask |= (*i)->m_spellProto->EffectSpellClassMask[(*i)->m_effIndex];
+
+ m_target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1 , mask[0]);
+ m_target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1+1, mask[1]);
+ m_target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1+2, mask[2]);
}
/*********************************************************/
/*** OTHERS ***/
/*********************************************************/
+void Aura::HandleAuraAllowOnlyAbility(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ if(!apply && m_target->HasAuraType(SPELL_AURA_ALLOW_ONLY_ABILITY))
+ return;
+
+ if(m_target->GetTypeId()==TYPEID_PLAYER)
+ {
+ if (apply)
+ m_target->SetFlag(PLAYER_FLAGS, PLAYER_ALLOW_ONLY_ABILITY);
+ else
+ m_target->RemoveFlag(PLAYER_FLAGS, PLAYER_ALLOW_ONLY_ABILITY);
+ }
+}
+
void Aura::HandleShapeshiftBoosts(bool apply)
{
uint32 spellId = 0;
@@ -4857,6 +4926,7 @@ void Aura::HandleShapeshiftBoosts(bool apply)
break;
case FORM_TREE:
spellId = 5420;
+ spellId2 = 34123;
break;
case FORM_TRAVEL:
spellId = 5419;
@@ -4890,11 +4960,16 @@ void Aura::HandleShapeshiftBoosts(bool apply)
break;
case FORM_FLIGHT:
spellId = 33948;
+ spellId2 = 34764;
break;
case FORM_FLIGHT_EPIC:
spellId = 40122;
spellId2 = 40121;
break;
+ case FORM_METAMORPHOSIS:
+ spellId = 54817;
+ spellId2 = 54879;
+ break;
case FORM_SPIRITOFREDEMPTION:
spellId = 27792;
spellId2 = 27795; // must be second, this important at aura remove to prevent to early iterator invalidation.
@@ -4925,7 +5000,7 @@ void Aura::HandleShapeshiftBoosts(bool apply)
if(itr->second->state == PLAYERSPELL_REMOVED) continue;
if(itr->first==spellId || itr->first==spellId2) continue;
SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first);
- if (!spellInfo || !(spellInfo->Attributes & ((1<<6) | (1<<7)))) continue;
+ if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR_PASSIVE | (1<<7)))) continue;
if (spellInfo->Stances & (1<<form))
m_target->CastSpell(m_target, itr->first, true, NULL, this);
}
@@ -4992,9 +5067,9 @@ void Aura::HandleAuraEmpathy(bool apply, bool Real)
void Aura::HandleAuraUntrackable(bool apply, bool Real)
{
if(apply)
- m_target->SetFlag(UNIT_FIELD_BYTES_1, PLAYER_STATE_FLAG_UNTRACKABLE);
+ m_target->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_UNTRACKABLE);
else
- m_target->RemoveFlag(UNIT_FIELD_BYTES_1, PLAYER_STATE_FLAG_UNTRACKABLE);
+ m_target->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_UNTRACKABLE);
}
void Aura::HandleAuraModPacify(bool apply, bool Real)
@@ -5057,7 +5132,21 @@ void Aura::HandleModRating(bool apply, bool Real)
for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
if (m_modifier.m_miscvalue & (1 << rating))
- ((Player*)m_target)->ApplyRatingMod(CombatRating(rating), GetModifierValue(), apply);
+ ((Player*)m_target)->ApplyRatingMod(CombatRating(rating), m_modifier.m_amount, apply);
+}
+
+void Aura::HandleModRatingFromStat(bool apply, bool Real)
+{
+ // spells required only Real aura add/remove
+ if(!Real)
+ return;
+
+ if(m_target->GetTypeId() != TYPEID_PLAYER)
+ return;
+ // Just recalculate ratings
+ for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
+ if (m_modifier.m_miscvalue & (1 << rating))
+ ((Player*)m_target)->ApplyRatingMod(CombatRating(rating), 0, apply);
}
void Aura::HandleForceMoveForward(bool apply, bool Real)
@@ -5088,11 +5177,11 @@ void Aura::HandleModTargetResistance(bool apply, bool Real)
// show armor penetration
if (m_target->GetTypeId() == TYPEID_PLAYER && (m_modifier.m_miscvalue & SPELL_SCHOOL_MASK_NORMAL))
- m_target->ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE,GetModifierValue(), apply);
+ m_target->ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE,m_modifier.m_amount, apply);
// show as spell penetration only full spell penetration bonuses (all resistances except armor and holy
if (m_target->GetTypeId() == TYPEID_PLAYER && (m_modifier.m_miscvalue & SPELL_SCHOOL_MASK_SPELL)==SPELL_SCHOOL_MASK_SPELL)
- m_target->ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE,GetModifierValue(), apply);
+ m_target->ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE,m_modifier.m_amount, apply);
}
void Aura::HandleShieldBlockValue(bool apply, bool Real)
@@ -5102,7 +5191,7 @@ void Aura::HandleShieldBlockValue(bool apply, bool Real)
modType = PCT_MOD;
if(m_target->GetTypeId() == TYPEID_PLAYER)
- ((Player*)m_target)->HandleBaseModValue(SHIELD_BLOCK_VALUE, modType, float(GetModifierValue()), apply);
+ ((Player*)m_target)->HandleBaseModValue(SHIELD_BLOCK_VALUE, modType, float(m_modifier.m_amount), apply);
}
void Aura::HandleAuraRetainComboPoints(bool apply, bool Real)
@@ -5120,7 +5209,7 @@ void Aura::HandleAuraRetainComboPoints(bool apply, bool Real)
// remove only if aura expire by time (in case combo points amount change aura removed without combo points lost)
if( !apply && m_duration==0 && target->GetComboTarget())
if(Unit* unit = ObjectAccessor::GetUnit(*m_target,target->GetComboTarget()))
- target->AddComboPoints(unit, -GetModifierValue());
+ target->AddComboPoints(unit, -m_modifier.m_amount);
}
void Aura::HandleModUnattackable( bool Apply, bool Real )
@@ -5150,7 +5239,7 @@ void Aura::HandleSpiritOfRedemption( bool apply, bool Real )
// set stand state (expected in this form)
if(!m_target->IsStandState())
- m_target->SetStandState(PLAYER_STATE_NONE);
+ m_target->SetStandState(UNIT_STAND_STATE_STAND);
}
m_target->SetHealth(1);
@@ -5162,6 +5251,14 @@ void Aura::HandleSpiritOfRedemption( bool apply, bool Real )
void Aura::CleanupTriggeredSpells()
{
+ if (m_spellProto->SpellFamilyName == SPELLFAMILY_WARRIOR && m_spellProto->SpellFamilyFlags[1] & 0x00000010 || m_spellProto->SpellFamilyFlags[0] & 0x00000020)
+ {
+ // Blood Frenzy remove
+ m_target->RemoveAurasDueToSpell(30069);
+ m_target->RemoveAurasDueToSpell(30070);
+ return;
+ }
+
uint32 tSpellId = m_spellProto->EffectTriggerSpell[GetEffIndex()];
if(!tSpellId)
return;
@@ -5181,14 +5278,6 @@ void Aura::CleanupTriggeredSpells()
m_target->RemoveAurasDueToSpell(tSpellId);
}
-void Aura::HandleAuraPowerBurn(bool apply, bool Real)
-{
- if (m_periodicTimer <= 0)
- m_periodicTimer += m_modifier.periodictime;
-
- m_isPeriodic = apply;
-}
-
void Aura::HandleSchoolAbsorb(bool apply, bool Real)
{
if(!Real)
@@ -5211,7 +5300,7 @@ void Aura::HandleSchoolAbsorb(bool apply, bool Real)
}
break;
case SPELLFAMILY_MAGE:
- if(m_spellProto->SpellFamilyFlags == 0x80100 || m_spellProto->SpellFamilyFlags == 0x8 || m_spellProto->SpellFamilyFlags == 0x100000000LL)
+ if(m_spellProto->SpellFamilyFlags.IsEqual(0x80100) || m_spellProto->SpellFamilyFlags.IsEqual(0x8) || m_spellProto->SpellFamilyFlags.IsEqual(0,0x1))
{
//frost ward, fire ward, ice barrier
//+10% from +spd bonus
@@ -5220,7 +5309,7 @@ void Aura::HandleSchoolAbsorb(bool apply, bool Real)
}
break;
case SPELLFAMILY_WARLOCK:
- if(m_spellProto->SpellFamilyFlags == 0x00)
+ if(m_spellProto->SpellFamilyFlags.IsEqual(0,0,0x40))
{
//shadow ward
//+10% from +spd bonus
@@ -5312,28 +5401,25 @@ void Aura::PeriodicTick()
CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL );
// ignore non positive values (can be result apply spellmods to aura damage
- uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
-
- uint32 pdamage;
+ //uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
+ uint32 pdamage = GetModifier()->m_amount > 0 ? GetModifier()->m_amount : 0;
if(m_modifier.m_auraname == SPELL_AURA_PERIODIC_DAMAGE)
{
- pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),amount,DOT);
+ pdamage = pCaster->SpellDamageBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
// Calculate armor mitigation if it is a physical spell
// But not for bleed mechanic spells
if ( GetSpellSchoolMask(GetSpellProto()) & SPELL_SCHOOL_MASK_NORMAL &&
GetEffectMechanic(GetSpellProto(), m_effIndex) != MECHANIC_BLEED)
{
- uint32 pdamageReductedArmor = pCaster->CalcArmorReducedDamage(m_target, pdamage);
+ uint32 pdamageReductedArmor = pCaster->CalcArmorReducedDamage(m_target, pdamage, GetSpellProto());
cleanDamage.damage += pdamage - pdamageReductedArmor;
pdamage = pdamageReductedArmor;
}
- //pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),pdamage,DOT);
-
// Curse of Agony damage-per-tick calculation
- if (GetSpellProto()->SpellFamilyName==SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags & 0x0000000000000400LL) && GetSpellProto()->SpellIconID==544)
+ if (GetSpellProto()->SpellFamilyName==SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags[0] & 0x400) && GetSpellProto()->SpellIconID==544)
{
// 1..4 ticks, 1/2 from normal tick damage
if (m_duration>=((m_maxduration-m_modifier.periodictime)*2/3))
@@ -5345,16 +5431,14 @@ void Aura::PeriodicTick()
}
}
else
- pdamage = uint32(m_target->GetMaxHealth()*amount/100);
+ pdamage = uint32(m_target->GetMaxHealth()*pdamage/100);
//As of 2.2 resilience reduces damage from DoT ticks as much as the chance to not be critically hit
// Reduce dot damage from resilience for players
if (m_target->GetTypeId()==TYPEID_PLAYER)
pdamage-=((Player*)m_target)->GetDotDamageReduction(pdamage);
- pdamage *= GetStackAmount();
-
- pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist);
+ pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist, m_spellProto);
sLog.outDetail("PeriodicTick: %u (TypeId: %u) attacked %u (TypeId: %u) for %u dmg inflicted by %u abs is %u",
GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId(),absorb);
@@ -5366,6 +5450,7 @@ void Aura::PeriodicTick()
data << uint32(1);
data << uint32(m_modifier.m_auraname);
data << (uint32)pdamage;
+ data << uint32(0); // overkill
data << (uint32)GetSpellSchoolMask(GetSpellProto()); // will be mask in 2.4.x
data << (uint32)absorb;
data << (uint32)resist;
@@ -5386,6 +5471,7 @@ void Aura::PeriodicTick()
break;
}
case SPELL_AURA_PERIODIC_LEECH:
+ case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
{
Unit *pCaster = GetCaster();
if(!pCaster)
@@ -5398,7 +5484,7 @@ void Aura::PeriodicTick()
pCaster->SpellHitResult(m_target,GetSpellProto(),false)!=SPELL_MISS_NONE)
return;
- // Check for immune (not use charges)
+ // Check for immune
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
return;
@@ -5406,80 +5492,24 @@ void Aura::PeriodicTick()
uint32 resist=0;
CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL );
- uint32 pdamage = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
- pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),pdamage,DOT);
+ //uint32 pdamage = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
+ uint32 pdamage = GetModifier()->m_amount > 0 ? GetModifier()->m_amount : 0;
+ pdamage = pCaster->SpellDamageBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
//Calculate armor mitigation if it is a physical spell
if (GetSpellSchoolMask(GetSpellProto()) & SPELL_SCHOOL_MASK_NORMAL)
{
- uint32 pdamageReductedArmor = pCaster->CalcArmorReducedDamage(m_target, pdamage);
+ uint32 pdamageReductedArmor = pCaster->CalcArmorReducedDamage(m_target, pdamage, GetSpellProto());
cleanDamage.damage += pdamage - pdamageReductedArmor;
pdamage = pdamageReductedArmor;
}
- //pdamage = pCaster->SpellDamageBonus(m_target,GetSpellProto(),pdamage,DOT);
-
- // talent Soul Siphon add bonus to Drain Life spells
- if( GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags & 0x8) )
- {
- // find talent max bonus percentage
- Unit::AuraList const& mClassScriptAuras = pCaster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- for(Unit::AuraList::const_iterator i = mClassScriptAuras.begin(); i != mClassScriptAuras.end(); ++i)
- {
- if ((*i)->GetModifier()->m_miscvalue == 4992 || (*i)->GetModifier()->m_miscvalue == 4993)
- {
- if((*i)->GetEffIndex()!=1)
- {
- sLog.outError("Expected spell %u structure change, need code update",(*i)->GetId());
- break;
- }
-
- // effect 1 m_amount
- int32 maxPercent = (*i)->GetModifier()->m_amount;
- // effect 0 m_amount
- int32 stepPercent = pCaster->CalculateSpellDamage((*i)->GetSpellProto(),0,(*i)->GetSpellProto()->EffectBasePoints[0],pCaster);
-
- // count affliction effects and calc additional damage in percentage
- int32 modPercent = 0;
- Unit::AuraMap const& victimAuras = m_target->GetAuras();
- for (Unit::AuraMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
- {
- Aura* aura = itr->second;
- if (aura->IsPositive())continue;
- SpellEntry const* m_spell = aura->GetSpellProto();
- if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK)
- continue;
-
- SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(m_spell->Id);
- SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(m_spell->Id);
-
- for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
- {
- if(_spell_idx->second->skillId == SKILL_AFFLICTION)
- {
- modPercent += stepPercent;
- if (modPercent >= maxPercent)
- {
- modPercent = maxPercent;
- break;
- }
- }
- }
- }
- pdamage += (pdamage*modPercent/100);
- break;
- }
- }
- }
-
//As of 2.2 resilience reduces damage from DoT ticks as much as the chance to not be critically hit
// Reduce dot damage from resilience for players
if (m_target->GetTypeId()==TYPEID_PLAYER)
pdamage-=((Player*)m_target)->GetDotDamageReduction(pdamage);
- pdamage *= GetStackAmount();
-
- pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist);
+ pCaster->CalcAbsorbResist(m_target, GetSpellSchoolMask(GetSpellProto()), DOT, pdamage, &absorb, &resist, m_spellProto);
if(m_target->GetHealth() < pdamage)
pdamage = uint32(m_target->GetHealth());
@@ -5493,6 +5523,7 @@ void Aura::PeriodicTick()
Unit* target = m_target; // aura can be deleted in DealDamage
SpellEntry const* spellProto = GetSpellProto();
float multiplier = spellProto->EffectMultipleValue[GetEffIndex()] > 0 ? spellProto->EffectMultipleValue[GetEffIndex()] : 1;
+ int32 stackAmount = GetStackAmount();
// Set trigger flag
uint32 procAttacker = PROC_FLAG_ON_DO_PERIODIC;// | PROC_FLAG_SUCCESSFUL_HARMFUL_SPELL_HIT;
@@ -5516,7 +5547,7 @@ void Aura::PeriodicTick()
if(Player *modOwner = pCaster->GetSpellModOwner())
modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_MULTIPLE_VALUE, multiplier);
- uint32 heal = pCaster->SpellHealingBonus(spellProto, uint32(new_damage * multiplier), DOT, pCaster);
+ uint32 heal = pCaster->SpellHealingBonus(pCaster, spellProto, uint32(new_damage * multiplier), DOT, stackAmount);
int32 gain = pCaster->ModifyHealth(heal);
pCaster->getHostilRefManager().threatAssist(pCaster, gain * 0.5f, spellProto);
@@ -5532,22 +5563,17 @@ void Aura::PeriodicTick()
return;
// heal for caster damage (must be alive)
- if(m_target != pCaster && GetSpellProto()->SpellVisual==163 && !pCaster->isAlive())
+ if(m_target != pCaster && GetSpellProto()->SpellVisual[0]==163 && !pCaster->isAlive())
return;
// ignore non positive values (can be result apply spellmods to aura damage
- uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
-
- uint32 pdamage;
+ //uint32 amount = GetModifierValuePerStack() > 0 ? GetModifierValuePerStack() : 0;
+ uint32 pdamage = GetModifier()->m_amount > 0 ? GetModifier()->m_amount : 0;
if(m_modifier.m_auraname==SPELL_AURA_OBS_MOD_HEALTH)
- pdamage = uint32(m_target->GetMaxHealth() * amount/100);
+ pdamage = uint32(m_target->GetMaxHealth() * pdamage * GetStackAmount() / 100);
else
- pdamage = pCaster->SpellHealingBonus(GetSpellProto(), amount, DOT, m_target);
-
- pdamage *= GetStackAmount();
-
- //pdamage = pCaster->SpellHealingBonus(GetSpellProto(), pdamage, DOT, m_target);
+ pdamage = pCaster->SpellHealingBonus(m_target, GetSpellProto(), pdamage, DOT, GetStackAmount());
sLog.outDetail("PeriodicTick: %u (TypeId: %u) heal of %u (TypeId: %u) for %u health inflicted by %u",
GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId());
@@ -5559,6 +5585,7 @@ void Aura::PeriodicTick()
data << uint32(1);
data << uint32(m_modifier.m_auraname);
data << (uint32)pdamage;
+ data << uint32(0); // wotlk
m_target->SendMessageToSet(&data,true);
int32 gain = m_target->ModifyHealth(pdamage);
@@ -5578,7 +5605,7 @@ void Aura::PeriodicTick()
bool haveCastItem = GetCastItemGUID()!=0;
// heal for caster damage
- if(m_target!=pCaster && spellProto->SpellVisual==163)
+ if(m_target!=pCaster && spellProto->SpellVisual[0]==163)
{
uint32 dmg = spellProto->manaPerSecond;
if(pCaster->GetHealth() <= dmg && pCaster->GetTypeId()==TYPEID_PLAYER)
@@ -5630,12 +5657,12 @@ void Aura::PeriodicTick()
return;
// ignore non positive values (can be result apply spellmods to aura damage
- uint32 pdamage = GetModifierValue() > 0 ? GetModifierValue() : 0;
+ uint32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
sLog.outDetail("PeriodicTick: %u (TypeId: %u) power leech of %u (TypeId: %u) for %u dmg inflicted by %u",
GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId());
- if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue > 4)
+ if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue >= MAX_POWERS)
break;
Powers power = Powers(m_modifier.m_miscvalue);
@@ -5707,12 +5734,12 @@ void Aura::PeriodicTick()
case SPELL_AURA_PERIODIC_ENERGIZE:
{
// ignore non positive values (can be result apply spellmods to aura damage
- uint32 pdamage = GetModifierValue() > 0 ? GetModifierValue() : 0;
+ uint32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
sLog.outDetail("PeriodicTick: %u (TypeId: %u) energize %u (TypeId: %u) for %u dmg inflicted by %u",
GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId());
- if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue > 4)
+ if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue >= MAX_POWERS)
break;
Powers power = Powers(m_modifier.m_miscvalue);
@@ -5739,7 +5766,7 @@ void Aura::PeriodicTick()
case SPELL_AURA_OBS_MOD_MANA:
{
// ignore non positive values (can be result apply spellmods to aura damage
- uint32 amount = GetModifierValue() > 0 ? GetModifierValue() : 0;
+ uint32 amount = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
uint32 pdamage = uint32(m_target->GetMaxPower(POWER_MANA) * amount/100);
@@ -5775,7 +5802,7 @@ void Aura::PeriodicTick()
if(m_target->IsImmunedToDamage(GetSpellSchoolMask(GetSpellProto())))
return;
- int32 pdamage = GetModifierValue() > 0 ? GetModifierValue() : 0;
+ int32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0;
Powers powerType = Powers(m_modifier.m_miscvalue);
@@ -5809,12 +5836,53 @@ void Aura::PeriodicTick()
pCaster->DealSpellDamage(&damageInfo, true);
break;
}
+ case SPELL_AURA_MOD_REGEN:
+ {
+ int32 gain = m_target->ModifyHealth(m_modifier.m_amount);
+ if (Unit *caster = GetCaster())
+ m_target->getHostilRefManager().threatAssist(caster, float(gain) * 0.5f, GetSpellProto());
+ break;
+ }
+ case SPELL_AURA_MOD_POWER_REGEN:
+ {
+ Powers pt = m_target->getPowerType();
+ if(int32(pt) != m_modifier.m_miscvalue)
+ return;
+
+ if ( GetSpellProto()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED )
+ {
+ // eating anim
+ m_target->HandleEmoteCommand(EMOTE_ONESHOT_EAT);
+ }
+ else if( GetId() == 20577 )
+ {
+ // cannibalize anim
+ m_target->HandleEmoteCommand(EMOTE_STATE_CANNIBALIZE);
+ }
+
+ // Anger Management
+ // amount = 1+ 16 = 17 = 3,4*5 = 10,2*5/3
+ // so 17 is rounded amount for 5 sec tick grow ~ 1 range grow in 3 sec
+ if(pt == POWER_RAGE)
+ m_target->ModifyPower(pt, m_modifier.m_amount*3/5);
+ break;
+ }
// Here tick dummy auras
case SPELL_AURA_PERIODIC_DUMMY:
{
PeriodicDummyTick();
break;
}
+ case SPELL_AURA_PERIODIC_TRIGGER_SPELL:
+ {
+ TriggerSpell();
+ break;
+ }
+ case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE:
+ {
+ TriggerSpellWithValue();
+ break;
+ }
default:
break;
}
@@ -5822,114 +5890,77 @@ void Aura::PeriodicTick()
void Aura::PeriodicDummyTick()
{
+ Unit *caster = GetCaster();
SpellEntry const* spell = GetSpellProto();
- switch (spell->Id)
- {
- // Drink
- case 430:
- case 431:
- case 432:
- case 1133:
- case 1135:
- case 1137:
- case 10250:
- case 22734:
- case 27089:
- case 34291:
- case 43706:
- case 46755:
+ switch (spell->SpellFamilyName)
+ {
+ case SPELLFAMILY_GENERIC:
+ switch (spell->Id)
{
- if (m_target->GetTypeId() != TYPEID_PLAYER)
- return;
- // Search SPELL_AURA_MOD_POWER_REGEN aura for this spell and add bonus
- Unit::AuraList const& aura = m_target->GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);
- for(Unit::AuraList::const_iterator i = aura.begin(); i != aura.end(); ++i)
+ // Drink
+ case 430:
+ case 431:
+ case 432:
+ case 1133:
+ case 1135:
+ case 1137:
+ case 10250:
+ case 22734:
+ case 27089:
+ case 34291:
+ case 43706:
+ case 46755:
+ case 49472: // Drink Coffee
+ case 61830:
{
- if ((*i)->GetId() == GetId())
+ if (m_target->GetTypeId() != TYPEID_PLAYER)
+ return;
+ // Search SPELL_AURA_MOD_POWER_REGEN aura for this spell and add bonus
+ Unit::AuraList const& aura = m_target->GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);
+ for(Unit::AuraList::const_iterator i = aura.begin(); i != aura.end(); ++i)
{
- // Get tick number
- int32 tick = (m_maxduration - m_duration) / m_modifier.periodictime;
- // Default case (not on arenas)
- if (tick == 0)
+ if ((*i)->GetId() == GetId())
{
(*i)->GetModifier()->m_amount = m_modifier.m_amount;
((Player*)m_target)->UpdateManaRegen();
// Disable continue
m_isPeriodic = false;
- }
- return;
- //**********************************************
- // Code commended since arena patch not added
- // This feature uses only in arenas
- //**********************************************
- // Here need increase mana regen per tick (6 second rule)
- // on 0 tick - 0 (handled in 2 second)
- // on 1 tick - 166% (handled in 4 second)
- // on 2 tick - 133% (handled in 6 second)
- // Not need update after 3 tick
- /*
- if (tick > 3)
return;
- // Apply bonus for 0 - 3 tick
- switch (tick)
- {
- case 0: // 0%
- (*i)->GetModifier()->m_amount = m_modifier.m_amount = 0;
- break;
- case 1: // 166%
- (*i)->GetModifier()->m_amount = m_modifier.m_amount * 5 / 3;
- break;
- case 2: // 133%
- (*i)->GetModifier()->m_amount = m_modifier.m_amount * 4 / 3;
- break;
- default: // 100% - normal regen
- (*i)->GetModifier()->m_amount = m_modifier.m_amount;
- break;
}
- ((Player*)m_target)->UpdateManaRegen();
- return;*/
}
+ return;
+ }
+ // Forsaken Skills
+ case 7054:
+ {
+ // Possibly need cast one of them (but
+ // 7038 Forsaken Skill: Swords
+ // 7039 Forsaken Skill: Axes
+ // 7040 Forsaken Skill: Daggers
+ // 7041 Forsaken Skill: Maces
+ // 7042 Forsaken Skill: Staves
+ // 7043 Forsaken Skill: Bows
+ // 7044 Forsaken Skill: Guns
+ // 7045 Forsaken Skill: 2H Axes
+ // 7046 Forsaken Skill: 2H Maces
+ // 7047 Forsaken Skill: 2H Swords
+ // 7048 Forsaken Skill: Defense
+ // 7049 Forsaken Skill: Fire
+ // 7050 Forsaken Skill: Frost
+ // 7051 Forsaken Skill: Holy
+ // 7053 Forsaken Skill: Shadow
+ return;
}
- return;
- }
// // Panda
// case 19230: break;
-// // Master of Subtlety
-// case 31666: break;
// // Gossip NPC Periodic - Talk
// case 33208: break;
// // Gossip NPC Periodic - Despawn
// case 33209: break;
-// // Force of Nature
-// case 33831: break;
- // Aspect of the Viper
- case 34074:
- {
- if (m_target->GetTypeId() != TYPEID_PLAYER)
- return;
- // Should be manauser
- if (m_target->getPowerType()!=POWER_MANA)
- return;
- Unit *caster = GetCaster();
- if (!caster)
- return;
- // Regen amount is max (100% from spell) on 21% or less mana and min on 92.5% or greater mana (20% from spell)
- int mana = m_target->GetPower(POWER_MANA);
- int max_mana = m_target->GetMaxPower(POWER_MANA);
- int32 base_regen = caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, m_target);
- float regen_pct = 1.20f - 1.1f * mana / max_mana;
- if (regen_pct > 1.0f) regen_pct = 1.0f;
- else if (regen_pct < 0.2f) regen_pct = 0.2f;
- m_modifier.m_amount = int32 (base_regen * regen_pct);
- ((Player*)m_target)->UpdateManaRegen();
- return;
- }
// // Steal Weapon
// case 36207: break;
// // Simon Game START timer, (DND)
// case 39993: break;
-// // Harpooner's Mark
-// case 40084: break;
// // Knockdown Fel Cannon: break; The Aggro Burst
// case 40119: break;
// // Old Mount Spell
@@ -5942,6 +5973,8 @@ void Aura::PeriodicDummyTick()
// case 40846: break;
// // Copy Weapon
// case 41054: break;
+// // Dementia
+// case 41404: break;
// // Ethereal Ring Visual, Lightning Aura
// case 41477: break;
// // Ethereal Ring Visual, Lightning Aura (Fork)
@@ -5990,6 +6023,8 @@ void Aura::PeriodicDummyTick()
// case 43310: break;
// // Headless Horseman - Maniacal Laugh, Maniacal, Delayed 17
// case 43884: break;
+// // Wretched!
+// case 43963: break;
// // Headless Horseman - Maniacal Laugh, Maniacal, other, Delayed 17
// case 44000: break;
// // Energy Feedback
@@ -6056,14 +6091,190 @@ void Aura::PeriodicDummyTick()
// case 47407: break;
// // Mole Machine Port Schedule
// case 47489: break;
+// case 47941: break; // Crystal Spike
+// case 48200: break; // Healer Aura
+// case 48630: break; // Summon Gauntlet Mobs Periodic
+// case 49313: break; // Proximity Mine Area Aura
// // Mole Machine Portal Schedule
// case 49466: break;
-// // Drink Coffee
-// case 49472: break;
+// case 49555: break; // Corpse Explode
+// case 49592: break; // Temporal Rift
+// case 49957: break; // Cutting Laser
+// case 50085: break; // Slow Fall
// // Listening to Music
// case 50493: break;
// // Love Rocket Barrage
// case 50530: break;
+// Exist more after, need add later
+ default:
+ break;
+ }
+ break;
+ case SPELLFAMILY_MAGE:
+ {
+ // Mirror Image
+// if (spell->Id == 55342)
+// return;
+ break;
+ }
+ case SPELLFAMILY_WARRIOR:
+ {
+ // Armored to the Teeth
+ if (spell->SpellIconID == 3516)
+ {
+ // Increases your attack power by $s1 for every $s2 armor value you have.
+ // Calculate AP bonus (from 1 efect of this spell)
+ int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
+ m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this);
+ return;
+ }
+ break;
+ }
+ case SPELLFAMILY_DRUID:
+ {
+ switch (spell->Id)
+ {
+ // Frenzied Regeneration
+ case 22842:
+ {
+ // Converts up to 10 rage per second into health for $d. Each point of rage is converted into ${$m2/10}.1% of max health.
+ // Should be manauser
+ if (m_target->getPowerType()!=POWER_RAGE)
+ return;
+ uint32 rage = m_target->GetPower(POWER_RAGE);
+ // Nothing todo
+ if (rage == 0)
+ return;
+ int32 mod = (rage < 100) ? rage : 100;
+ int32 points = m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
+ int32 regen = m_target->GetMaxHealth() * (mod * points / 10) / 1000;
+ m_target->CastCustomSpell(m_target, 22845, &regen, 0, 0, true, 0, this);
+ m_target->SetPower(POWER_RAGE, rage-mod);
+ return;
+ }
+ // Force of Nature
+ case 33831:
+ return;
+ default:
+ break;
+ }
+ break;
+ }
+ case SPELLFAMILY_ROGUE:
+ {
+// switch (spell->Id)
+// {
+ // Master of Subtlety
+// case 31666: break;
+ // Killing Spree
+// case 51690: break;
+ // Overkill
+// case 58428: break;
+// default:
+// break;
+// }
+ break;
+ }
+ case SPELLFAMILY_HUNTER:
+ {
+ // Explosive Shot
+ if (spell->SpellFamilyFlags[1] & 0x80000000)
+ {
+ if (!caster)
+ return;
+ int32 damage = m_modifier.m_amount;
+ // Full damage to target at 0 tick
+ if (m_duration > m_modifier.periodictime)
+ {
+ caster->CastCustomSpell(m_target, 53352, &damage, 0, 0, true, 0, this);
+ return;
+ }
+ damage/=4;
+ caster->CastCustomSpell(m_target, 56298, &damage, 0, 0, true, 0, this);
+ return;
+ }
+ switch (spell->Id)
+ {
+ // Harpooner's Mark
+ // case 40084:
+ // return;
+ // Feeding Frenzy Rank 1
+ case 53511:
+ if ( m_target->GetHealth() * 100 < m_target->GetMaxHealth() * 35 )
+ m_target->CastSpell(m_target, 60096, true, 0, this);
+ return;
+ // Feeding Frenzy Rank 2
+ case 53512:
+ if ( m_target->GetHealth() * 100 < m_target->GetMaxHealth() * 35 )
+ m_target->CastSpell(m_target, 60097, true, 0, this);
+ return;
+ default:
+ break;
+ }
+ break;
+ }
+ case SPELLFAMILY_SHAMAN:
+ {
+ // Astral Shift
+ if (spell->Id == 52179)
+ {
+ // Periodic need for remove visual on stun/fear/silence lost
+ if (!(m_target->GetUInt32Value(UNIT_FIELD_FLAGS)&(UNIT_FLAG_STUNNED|UNIT_FLAG_FLEEING|UNIT_FLAG_SILENCED)))
+ m_target->RemoveAurasDueToSpell(52179);
+ return;
+ }
+ break;
+ }
+ case SPELLFAMILY_DEATHKNIGHT:
+ {
+ // Death and Decay
+ if (spell->SpellFamilyFlags[0] & 0x20)
+ {
+ if (caster)
+ caster->CastCustomSpell(m_target, 52212, &m_modifier.m_amount, NULL, NULL, true, 0, this);
+ return;
+ }
+ // Raise Dead
+// if (spell->SpellFamilyFlags & 0x0000000000001000LL)
+// return;
+ // Chains of Ice
+ if (spell->SpellFamilyFlags[1] & 0x00004000)
+ {
+ // Get 0 effect aura
+ Aura *slow = m_target->GetAura(GetId(), 0);
+ if (slow)
+ {
+ slow->ApplyModifier(false, true);
+ Modifier *mod = slow->GetModifier();
+ mod->m_amount+= m_modifier.m_amount;
+ if (mod->m_amount > 0) mod->m_amount = 0;
+ slow->ApplyModifier(true, true);
+ }
+ return;
+ }
+ // Summon Gargoyle
+// if (spell->SpellFamilyFlags & 0x0000008000000000LL)
+// return;
+ // Death Rune Mastery
+// if (spell->SpellFamilyFlags & 0x0000000000004000LL)
+// return;
+ // Bladed Armor
+ if (spell->SpellIconID == 2653)
+ {
+ // Increases your attack power by $s1 for every $s2 armor value you have.
+ // Calculate AP bonus (from 1 efect of this spell)
+ int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
+ m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this);
+ return;
+ }
+ // Reaping
+// if (spell->SpellIconID == 22)
+// return;
+ // Blood of the North
+// if (spell->SpellIconID == 30412)
+// return;
+ break;
+ }
default:
break;
}
@@ -6099,7 +6310,7 @@ void Aura::HandleManaShield(bool apply, bool Real)
switch(m_spellProto->SpellFamilyName)
{
case SPELLFAMILY_MAGE:
- if(m_spellProto->SpellFamilyFlags & 0x8000)
+ if(m_spellProto->SpellFamilyFlags[0] & 0x8000)
{
// Mana Shield
// +50% from +spd bonus
@@ -6129,3 +6340,213 @@ void Aura::HandleArenaPreparation(bool apply, bool Real)
m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION);
}
+void Aura::HandleAuraControlVehicle(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ if(m_target->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if(Pet *pet = m_target->GetPet())
+ pet->Remove(PET_SAVE_AS_CURRENT);
+
+ WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
+ ((Player*)m_target)->GetSession()->SendPacket(&data);
+}
+
+void Aura::HandleAuraConvertRune(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ if(m_target->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ Player *plr = (Player*)m_target;
+
+ if(plr->getClass() != CLASS_DEATH_KNIGHT)
+ return;
+
+ // how to determine what rune need to be converted?
+ for(uint32 i = 0; i < MAX_RUNES; ++i)
+ {
+ if(apply)
+ {
+ if(!plr->GetRuneCooldown(i))
+ {
+ plr->ConvertRune(i, GetSpellProto()->EffectMiscValueB[m_effIndex]);
+ break;
+ }
+ }
+ else
+ {
+ if(plr->GetCurrentRune(i) == GetSpellProto()->EffectMiscValueB[m_effIndex])
+ {
+ plr->ConvertRune(i, plr->GetBaseRune(i));
+ break;
+ }
+ }
+ }
+}
+
+// Control Auras
+
+void Aura::HandleAuraModStun(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ m_target->SetControlled(apply, UNIT_STAT_STUNNED);
+ if(GetSpellSchoolMask(m_spellProto) & SPELL_SCHOOL_MASK_FROST)
+ HandleAuraStateFrozen(apply);
+}
+
+void Aura::HandleAuraModRoot(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ m_target->SetControlled(apply, UNIT_STAT_ROOT);
+ if(GetSpellSchoolMask(m_spellProto) & SPELL_SCHOOL_MASK_FROST)
+ HandleAuraStateFrozen(apply);
+}
+
+static AuraType const frozenAuraTypes[] = { SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_NONE };
+
+void Aura::HandleAuraStateFrozen(bool apply)
+{
+ if(apply)
+ {
+ m_target->ModifyAuraState(AURA_STATE_FROZEN, true);
+ }
+ else
+ {
+ bool found_another = false;
+ for(AuraType const* itr = &frozenAuraTypes[0]; *itr != SPELL_AURA_NONE; itr++)
+ {
+ Unit::AuraList const& auras = m_target->GetAurasByType(*itr);
+ for(Unit::AuraList::const_iterator i = auras.begin(); i != auras.end(); i++)
+ {
+ if( GetSpellSchoolMask((*i)->GetSpellProto()) & SPELL_SCHOOL_MASK_FROST)
+ {
+ found_another = true;
+ break;
+ }
+ }
+ if(found_another)
+ break;
+ }
+
+ if(!found_another)
+ m_target->ModifyAuraState(AURA_STATE_FROZEN, false);
+ }
+}
+
+// Charm Auras
+
+void Aura::HandleModPossess(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ Unit* caster = GetCaster();
+ if(caster && caster->GetTypeId() == TYPEID_UNIT)
+ {
+ HandleModCharm(apply, Real);
+ return;
+ }
+
+ if(apply)
+ {
+ if(m_target->getLevel() > m_modifier.m_amount)
+ return;
+
+ m_target->SetCharmedOrPossessedBy(caster, true);
+ }
+ else
+ m_target->RemoveCharmedOrPossessedBy(caster);
+}
+
+void Aura::HandleModPossessPet(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ Unit* caster = GetCaster();
+ if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+ if(caster->GetPet() != m_target)
+ return;
+
+ if(apply)
+ m_target->SetCharmedOrPossessedBy(caster, true);
+ else
+ {
+ m_target->RemoveCharmedOrPossessedBy(caster);
+
+ // Reinitialize the pet bar and make the pet come back to the owner
+ ((Player*)caster)->PetSpellInitialize();
+ if(!m_target->getVictim())
+ {
+ m_target->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+ m_target->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW);
+ }
+ }
+}
+
+void Aura::HandleModCharm(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ Unit* caster = GetCaster();
+
+ if(apply)
+ {
+ if(int32(m_target->getLevel()) > m_modifier.m_amount)
+ return;
+
+ m_target->SetCharmedOrPossessedBy(caster, false);
+ }
+ else
+ m_target->RemoveCharmedOrPossessedBy(caster);
+}
+
+void Aura::HandlePhase(bool apply, bool Real)
+{
+ if(!Real)
+ return;
+
+ // always non stackable
+ if(apply)
+ {
+ Unit::AuraList const& phases = m_target->GetAurasByType(SPELL_AURA_PHASE);
+ if(!phases.empty())
+ m_target->RemoveAurasDueToSpell(phases.front()->GetId(),this);
+ }
+
+ // no-phase is also phase state so same code for apply and remove
+
+ // phase auras normally not expected at BG but anyway better check
+ if(m_target->GetTypeId()==TYPEID_PLAYER)
+ {
+ // drop flag at invisible in bg
+ if(((Player*)m_target)->InBattleGround())
+ if(BattleGround *bg = ((Player*)m_target)->GetBattleGround())
+ bg->EventPlayerDroppedFlag((Player*)m_target);
+
+ // GM-mode have mask 0xFFFFFFFF
+ if(!((Player*)m_target)->isGameMaster())
+ m_target->SetPhaseMask(apply ? GetMiscValue() : PHASEMASK_NORMAL,false);
+
+ ((Player*)m_target)->GetSession()->SendSetPhaseShift(apply ? GetMiscValue() : PHASEMASK_NORMAL);
+ }
+ else
+ m_target->SetPhaseMask(apply ? GetMiscValue() : PHASEMASK_NORMAL,false);
+
+ // need triggering visibility update base at phase update of not GM invisible (other GMs anyway see in any phases)
+ if(m_target->GetVisibility()!=VISIBILITY_OFF)
+ m_target->SetVisibility(m_target->GetVisibility());
+}
+
diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h
index 249eb4b6762..602772f3491 100644
--- a/src/game/SpellAuras.h
+++ b/src/game/SpellAuras.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -22,15 +22,6 @@
#include "SpellAuraDefines.h"
-struct DamageManaShield
-{
- uint32 m_spellId;
- uint32 m_modType;
- int32 m_schoolType;
- uint32 m_totalAbsorb;
- uint32 m_currAbsorb;
-};
-
struct Modifier
{
AuraType m_auraname;
@@ -100,6 +91,7 @@ class TRINITY_DLL_SPEC Aura
void HandleAuraFeatherFall(bool Apply, bool Real);
void HandleAuraHover(bool Apply, bool Real);
void HandleAddModifier(bool Apply, bool Real);
+ void HandleAddTargetTrigger(bool Apply, bool Real);
void HandleAuraModStun(bool Apply, bool Real);
void HandleModDamageDone(bool Apply, bool Real);
void HandleAuraUntrackable(bool Apply, bool Real);
@@ -111,8 +103,10 @@ class TRINITY_DLL_SPEC Aura
void HandleAuraModRegenInterrupt(bool Apply, bool Real);
void HandleHaste(bool Apply, bool Real);
void HandlePeriodicTriggerSpell(bool Apply, bool Real);
+ void HandlePeriodicTriggerSpellWithValue(bool apply, bool Real);
void HandlePeriodicEnergize(bool Apply, bool Real);
void HandleAuraModResistanceExclusive(bool Apply, bool Real);
+ void HandleAuraModPetTalentsPoints(bool Apply, bool Real);
void HandleModStealth(bool Apply, bool Real);
void HandleInvisibility(bool Apply, bool Real);
void HandleInvisibilityDetect(bool Apply, bool Real);
@@ -147,6 +141,7 @@ class TRINITY_DLL_SPEC Aura
void HandleModSpellHitChance(bool Apply, bool Real);
void HandleAuraModScale(bool Apply, bool Real);
void HandlePeriodicManaLeech(bool Apply, bool Real);
+ void HandlePeriodicHealthFunnel(bool apply, bool Real);
void HandleModCastingSpeed(bool Apply, bool Real);
void HandleAuraMounted(bool Apply, bool Real);
void HandleWaterBreathing(bool Apply, bool Real);
@@ -184,10 +179,12 @@ class TRINITY_DLL_SPEC Aura
void HandleAuraGhost(bool Apply, bool Real);
void HandleAuraAllowFlight(bool Apply, bool Real);
void HandleModRating(bool apply, bool Real);
+ void HandleModRatingFromStat(bool apply, bool Real);
void HandleModTargetResistance(bool apply, bool Real);
void HandleAuraModAttackPowerPercent(bool apply, bool Real);
void HandleAuraModRangedAttackPowerPercent(bool apply, bool Real);
void HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real);
+ void HandleAuraModAttackPowerOfStatPercent(bool apply, bool Real);
void HandleSpiritOfRedemption(bool apply, bool Real);
void HandleModManaRegen(bool apply, bool Real);
void HandleComprehendLanguage(bool apply, bool Real);
@@ -197,6 +194,7 @@ class TRINITY_DLL_SPEC Aura
void HandleModSpellDamagePercentFromStat(bool apply, bool Real);
void HandleModSpellHealingPercentFromStat(bool apply, bool Real);
void HandleAuraModDispelResist(bool apply, bool Real);
+ void HandleAuraControlVehicle(bool apply, bool Real);
void HandleModSpellDamagePercentFromAttackPower(bool apply, bool Real);
void HandleModSpellHealingPercentFromAttackPower(bool apply, bool Real);
void HandleAuraModPacifyAndSilence(bool Apply, bool Real);
@@ -209,13 +207,17 @@ class TRINITY_DLL_SPEC Aura
void HandlePreventFleeing(bool apply, bool Real);
void HandleManaShield(bool apply, bool Real);
void HandleArenaPreparation(bool apply, bool Real);
+ void HandleAuraConvertRune(bool apply, bool Real);
+ void HandleAuraIncreaseBaseHealthPercent(bool Apply, bool Real);
+ void HandleNoReagentUseAura(bool Apply, bool Real);
+ void HandlePhase(bool Apply, bool Real);
+
+ void HandleAuraStateFrozen(bool apply);
virtual ~Aura();
void SetModifier(AuraType t, int32 a, uint32 pt, int32 miscValue);
Modifier* GetModifier() {return &m_modifier;}
- int32 GetModifierValuePerStack() {return m_modifier.m_amount;}
- int32 GetModifierValue() {return m_modifier.m_amount * m_stackAmount;}
int32 GetMiscValue() {return m_spellProto->EffectMiscValue[m_effIndex];}
int32 GetMiscBValue() {return m_spellProto->EffectMiscValueB[m_effIndex];}
@@ -229,10 +231,15 @@ class TRINITY_DLL_SPEC Aura
void SetAuraMaxDuration(int32 duration) { m_maxduration = duration; }
int32 GetAuraDuration() const { return m_duration; }
void SetAuraDuration(int32 duration) { m_duration = duration; }
+ void SetAuraDurationAndUpdate(int32 duration)
+ {
+ m_duration = duration;
+ if(GetAuraSlot() < MAX_AURAS) // slot found send data to client
+ { m_target->UpdateAuraForGroup(GetAuraSlot()); }
+ }
time_t GetAuraApplyTime() { return m_applyTime; }
- void UpdateAuraDuration();
- void SendAuraDurationForCaster(Player* caster);
- void UpdateSlotCounterAndDuration();
+
+ SpellModifier *getAuraSpellMod() {return m_spellmod; }
uint64 const& GetCasterGUID() const { return m_caster_guid; }
Unit* GetCaster() const;
@@ -249,15 +256,33 @@ class TRINITY_DLL_SPEC Aura
uint8 GetAuraSlot() const { return m_auraSlot; }
void SetAuraSlot(uint8 slot) { m_auraSlot = slot; }
- void UpdateAuraCharges()
+ uint8 GetAuraCharges() const { return m_procCharges; }
+ void SetAuraCharges(uint8 charges)
{
- uint8 slot = GetAuraSlot();
-
- // only aura in slot with charges and without stack limitation
- if (slot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
- SetAuraApplication(slot, m_procCharges - 1);
+ if (m_procCharges == charges)
+ return;
+ m_procCharges = charges;
+ if(GetAuraSlot() < MAX_AURAS) // slot found send data to client
+ { m_target->UpdateAuraForGroup(GetAuraSlot()); }
+ }
+ bool DropAuraCharge() // return true if last charge dropped
+ {
+ if (m_procCharges == 0)
+ return false;
+ m_procCharges--;
+ if(GetAuraSlot() < MAX_AURAS) // slot found send data to client
+ { m_target->UpdateAuraForGroup(GetAuraSlot()); }
+ return m_procCharges == 0;
}
+ int8 GetStackAmount() {return m_stackAmount;}
+ //int32 GetModifierValuePerStack() {return m_modifier.m_amount / m_stackAmount;}
+ void SetStackAmount(uint8 num);
+ bool modStackAmount(int32 num); // return true if last charge dropped
+ uint32 GetAuraStateMask(){return m_auraStateMask;}
+ void SetAuraState(uint8 num){m_auraStateMask |= 1<<(num-1);} //modifies aura's aura state (not unit!)
+ void RefreshAura();
+
bool IsPositive() { return m_positive; }
void SetNegative() { m_positive = false; }
void SetPositive() { m_positive = true; }
@@ -265,7 +290,6 @@ class TRINITY_DLL_SPEC Aura
bool IsPermanent() const { return m_permanent; }
bool IsAreaAura() const { return m_isAreaAura; }
bool IsPeriodic() const { return m_isPeriodic; }
- bool IsTrigger() const { return m_isTrigger; }
bool IsPassive() const { return m_isPassive; }
bool IsPersistent() const { return m_isPersistent; }
bool IsDeathPersistent() const { return m_isDeathPersist; }
@@ -278,72 +302,68 @@ class TRINITY_DLL_SPEC Aura
void _AddAura();
void _RemoveAura();
- void TriggerSpell();
-
bool IsUpdated() { return m_updated; }
void SetUpdated(bool val) { m_updated = val; }
void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; }
- int32 m_procCharges;
- void SetAuraProcCharges(int32 charges) { m_procCharges = charges; }
-
Unit* GetTriggerTarget() const;
// add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
+ void HandleAuraAllowOnlyAbility(bool apply, bool Real);
void HandleShapeshiftBoosts(bool apply);
// Allow Apply Aura Handler to modify and access m_AuraDRGroup
void setDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
DiminishingGroup getDiminishGroup() const { return m_AuraDRGroup; }
+ void TriggerSpell();
+ void TriggerSpellWithValue();
void PeriodicTick();
void PeriodicDummyTick();
- int32 GetStackAmount() {return m_stackAmount;}
- void SetStackAmount(int32 amount) {m_stackAmount=amount;}
+ bool isAffectedOnSpell(SpellEntry const *spell) const;
protected:
Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
Modifier m_modifier;
SpellModifier *m_spellmod;
- uint32 m_effIndex;
+
SpellEntry const *m_spellProto;
- int32 m_currentBasePoints; // cache SpellEntry::EffectBasePoints and use for set custom base points
- uint64 m_caster_guid;
Unit* m_target;
- int32 m_maxduration;
- int32 m_duration;
- int32 m_timeCla;
+ uint64 m_caster_guid;
uint64 m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
time_t m_applyTime;
- AuraRemoveMode m_removeMode;
-
- uint8 m_auraSlot;
+ int32 m_currentBasePoints; // cache SpellEntry::EffectBasePoints and use for set custom base points
+ int32 m_maxduration; // Max aura duration
+ int32 m_duration; // Current time
+ int32 m_timeCla; // Timer for power per sec calcultion
+ int32 m_periodicTimer; // Timer for periodic auras
+
+ AuraRemoveMode m_removeMode:8; // Store info for know remove aura reason
+ DiminishingGroup m_AuraDRGroup:8; // Diminishing
+
+ uint8 m_effIndex; // Aura effect index in spell
+ uint8 m_auraSlot; // Aura slot on unit (for show in client)
+ uint8 m_auraFlags; // Aura info flag (for send data to client)
+ uint8 m_auraLevel; // Aura level (store caster level for correct show level dep amount)
+ uint8 m_procCharges; // Aura charges (0 for infinite)
+ uint8 m_stackAmount; // Aura stack amount
+ uint8 m_auraStateMask;
bool m_positive:1;
bool m_permanent:1;
bool m_isPeriodic:1;
- bool m_isTrigger:1;
bool m_isAreaAura:1;
bool m_isPassive:1;
bool m_isPersistent:1;
bool m_isDeathPersist:1;
bool m_isRemovedOnShapeLost:1;
- bool m_updated:1;
+ bool m_updated:1; // Prevent remove aura by stack if set
bool m_in_use:1; // true while in Aura::ApplyModifier call
- int32 m_periodicTimer;
- uint32 m_PeriodicEventId;
- DiminishingGroup m_AuraDRGroup;
-
- int32 m_stackAmount;
private:
void CleanupTriggeredSpells();
- void SetAura(uint32 slot, bool remove) { m_target->SetUInt32Value(UNIT_FIELD_AURA + slot, remove ? 0 : GetId()); }
- void SetAuraFlag(uint32 slot, bool add);
- void SetAuraLevel(uint32 slot, uint32 level);
- void SetAuraApplication(uint32 slot, int8 count);
};
class TRINITY_DLL_SPEC AreaAura : public Aura
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index c9e0d1e0647..468e79cb510 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -47,6 +47,7 @@
#include "Creature.h"
#include "Totem.h"
#include "CreatureAI.h"
+#include "BattleGroundMgr.h"
#include "BattleGround.h"
#include "BattleGroundEY.h"
#include "BattleGroundWS.h"
@@ -60,6 +61,7 @@
#include "CellImpl.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
+#include "SkillDiscovery.h"
pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
{
@@ -104,8 +106,8 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectDispel, // 38 SPELL_EFFECT_DISPEL
&Spell::EffectUnused, // 39 SPELL_EFFECT_LANGUAGE
&Spell::EffectDualWield, // 40 SPELL_EFFECT_DUAL_WIELD
- &Spell::EffectSummonWild, // 41 SPELL_EFFECT_SUMMON_WILD
- &Spell::EffectSummonGuardian, // 42 SPELL_EFFECT_SUMMON_GUARDIAN
+ &Spell::EffectUnused, // 41 SPELL_EFFECT_JUMP
+ &Spell::EffectUnused, // 42 SPELL_EFFECT_JUMP2
&Spell::EffectTeleUnitsFaceCaster, // 43 SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER
&Spell::EffectLearnSkill, // 44 SPELL_EFFECT_SKILL_STEP
&Spell::EffectAddHonor, // 45 SPELL_EFFECT_ADD_HONOR honor/pvp related
@@ -128,16 +130,16 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectPowerBurn, // 62 SPELL_EFFECT_POWER_BURN
&Spell::EffectThreat, // 63 SPELL_EFFECT_THREAT
&Spell::EffectTriggerSpell, // 64 SPELL_EFFECT_TRIGGER_SPELL
- &Spell::EffectUnused, // 65 SPELL_EFFECT_HEALTH_FUNNEL unused
- &Spell::EffectUnused, // 66 SPELL_EFFECT_POWER_FUNNEL unused
+ &Spell::EffectApplyAreaAura, // 65 SPELL_EFFECT_APPLY_AREA_AURA_RAID
+ &Spell::EffectUnused, // 66 SPELL_EFFECT_CREATE_MANA_GEM (possibly recharge it, misc - is item ID)
&Spell::EffectHealMaxHealth, // 67 SPELL_EFFECT_HEAL_MAX_HEALTH
&Spell::EffectInterruptCast, // 68 SPELL_EFFECT_INTERRUPT_CAST
&Spell::EffectDistract, // 69 SPELL_EFFECT_DISTRACT
&Spell::EffectPull, // 70 SPELL_EFFECT_PULL one spell: Distract Move
&Spell::EffectPickPocket, // 71 SPELL_EFFECT_PICKPOCKET
&Spell::EffectAddFarsight, // 72 SPELL_EFFECT_ADD_FARSIGHT
- &Spell::EffectSummonPossessed, // 73 SPELL_EFFECT_SUMMON_POSSESSED
- &Spell::EffectSummonTotem, // 74 SPELL_EFFECT_SUMMON_TOTEM
+ &Spell::EffectUnused, // 73 SPELL_EFFECT_UNTRAIN_TALENTS
+ &Spell::EffectApplyGlyph, // 74 SPELL_EFFECT_APPLY_GLYPH
&Spell::EffectHealMechanical, // 75 SPELL_EFFECT_HEAL_MECHANICAL one spell: Mechanical Patch Kit
&Spell::EffectSummonObjectWild, // 76 SPELL_EFFECT_SUMMON_OBJECT_WILD
&Spell::EffectScriptEffect, // 77 SPELL_EFFECT_SCRIPT_EFFECT
@@ -150,17 +152,17 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectStuck, // 84 SPELL_EFFECT_STUCK
&Spell::EffectSummonPlayer, // 85 SPELL_EFFECT_SUMMON_PLAYER
&Spell::EffectActivateObject, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
- &Spell::EffectSummonTotem, // 87 SPELL_EFFECT_SUMMON_TOTEM_SLOT1
- &Spell::EffectSummonTotem, // 88 SPELL_EFFECT_SUMMON_TOTEM_SLOT2
- &Spell::EffectSummonTotem, // 89 SPELL_EFFECT_SUMMON_TOTEM_SLOT3
- &Spell::EffectSummonTotem, // 90 SPELL_EFFECT_SUMMON_TOTEM_SLOT4
+ &Spell::EffectUnused, // 87 SPELL_EFFECT_WMO_DAMAGE
+ &Spell::EffectUnused, // 88 SPELL_EFFECT_WMO_REPAIR
+ &Spell::EffectUnused, // 89 SPELL_EFFECT_WMO_CHANGE
+ &Spell::EffectUnused, // 90 SPELL_EFFECT_KILL_CREDIT
&Spell::EffectUnused, // 91 SPELL_EFFECT_THREAT_ALL one spell: zzOLDBrainwash
&Spell::EffectEnchantHeldItem, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
&Spell::EffectUnused, // 93 SPELL_EFFECT_SUMMON_PHANTASM
&Spell::EffectSelfResurrect, // 94 SPELL_EFFECT_SELF_RESURRECT
&Spell::EffectSkinning, // 95 SPELL_EFFECT_SKINNING
&Spell::EffectUnused, // 96 SPELL_EFFECT_CHARGE
- &Spell::EffectSummonCritter, // 97 SPELL_EFFECT_SUMMON_CRITTER
+ &Spell::EffectUnused, // 97 SPELL_EFFECT_97
&Spell::EffectKnockBack, // 98 SPELL_EFFECT_KNOCK_BACK
&Spell::EffectDisEnchant, // 99 SPELL_EFFECT_DISENCHANT
&Spell::EffectInebriate, //100 SPELL_EFFECT_INEBRIATE
@@ -175,7 +177,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectSummonDeadPet, //109 SPELL_EFFECT_SUMMON_DEAD_PET
&Spell::EffectDestroyAllTotems, //110 SPELL_EFFECT_DESTROY_ALL_TOTEMS
&Spell::EffectDurabilityDamage, //111 SPELL_EFFECT_DURABILITY_DAMAGE
- &Spell::EffectSummonDemon, //112 SPELL_EFFECT_SUMMON_DEMON
+ &Spell::EffectUnused, //112 SPELL_EFFECT_112
&Spell::EffectResurrectNew, //113 SPELL_EFFECT_RESURRECT_NEW
&Spell::EffectTaunt, //114 SPELL_EFFECT_ATTACK_ME
&Spell::EffectDurabilityDamagePCT, //115 SPELL_EFFECT_DURABILITY_DAMAGE_PCT
@@ -195,21 +197,21 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectApplyAreaAura, //129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
&Spell::EffectRedirectThreat, //130 SPELL_EFFECT_REDIRECT_THREAT
&Spell::EffectUnused, //131 SPELL_EFFECT_131 used in some test spells
- &Spell::EffectNULL, //132 SPELL_EFFECT_PLAY_MUSIC sound id in misc value
+ &Spell::EffectNULL, //132 SPELL_EFFECT_PLAY_MUSIC sound id in misc value (SoundEntries.dbc)
&Spell::EffectUnlearnSpecialization, //133 SPELL_EFFECT_UNLEARN_SPECIALIZATION unlearn profession specialization
&Spell::EffectKillCredit, //134 SPELL_EFFECT_KILL_CREDIT misc value is creature entry
&Spell::EffectNULL, //135 SPELL_EFFECT_CALL_PET
&Spell::EffectHealPct, //136 SPELL_EFFECT_HEAL_PCT
&Spell::EffectEnergisePct, //137 SPELL_EFFECT_ENERGIZE_PCT
&Spell::EffectNULL, //138 SPELL_EFFECT_138 Leap
- &Spell::EffectUnused, //139 SPELL_EFFECT_139 unused
+ &Spell::EffectUnused, //139 SPELL_EFFECT_CLEAR_QUEST (misc - is quest ID)
&Spell::EffectForceCast, //140 SPELL_EFFECT_FORCE_CAST
&Spell::EffectNULL, //141 SPELL_EFFECT_141 damage and reduce speed?
&Spell::EffectTriggerSpellWithValue, //142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE
&Spell::EffectApplyAreaAura, //143 SPELL_EFFECT_APPLY_AREA_AURA_OWNER
&Spell::EffectKnockBack, //144 SPELL_EFFECT_KNOCK_BACK_2 Spectral Blast
&Spell::EffectNULL, //145 SPELL_EFFECT_145 Black Hole Effect
- &Spell::EffectUnused, //146 SPELL_EFFECT_146 unused
+ &Spell::EffectActivateRune, //146 SPELL_EFFECT_ACTIVATE_RUNE
&Spell::EffectQuestFail, //147 SPELL_EFFECT_QUEST_FAIL quest fail
&Spell::EffectUnused, //148 SPELL_EFFECT_148 unused
&Spell::EffectNULL, //149 SPELL_EFFECT_149 swoop
@@ -217,6 +219,12 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectTriggerRitualOfSummoning, //151 SPELL_EFFECT_TRIGGER_SPELL_2
&Spell::EffectNULL, //152 SPELL_EFFECT_152 summon Refer-a-Friend
&Spell::EffectNULL, //153 SPELL_EFFECT_CREATE_PET misc value is creature entry
+ &Spell::EffectNULL, //154 unused
+ &Spell::EffectTitanGrip, //155 SPELL_EFFECT_TITAN_GRIP Allows you to equip two-handed axes, maces and swords in one hand, but you attack $49152s1% slower than normal.
+ &Spell::EffectEnchantItemPrismatic, //156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
+ &Spell::EffectCreateItem2, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession
+ &Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling
+ &Spell::EffectRenamePet //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again
};
void Spell::EffectNULL(uint32 /*i*/)
@@ -293,7 +301,7 @@ void Spell::EffectEnvirinmentalDMG(uint32 i)
// currently each enemy selected explicitly and self cast damage, we prevent apply self casted spell bonuses/etc
damage = m_spellInfo->EffectBasePoints[i]+m_spellInfo->EffectBaseDice[i];
- m_caster->CalcAbsorbResist(m_caster,GetSpellSchoolMask(m_spellInfo), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
+ m_caster->CalcAbsorbResist(m_caster,GetSpellSchoolMask(m_spellInfo), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist, m_spellInfo);
m_caster->SendSpellNonMeleeDamageLog(m_caster, m_spellInfo->Id, damage, GetSpellSchoolMask(m_spellInfo), absorb, resist, false, 0, false);
if(m_caster->GetTypeId() == TYPEID_PLAYER)
@@ -355,6 +363,13 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
damage = 200;
break;
}
+ // Intercept (warrior spell trigger)
+ case 20253:
+ case 61491:
+ {
+ damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.12f);
+ break;
+ }
// arcane charge. must only affect demons (also undead?)
case 45072:
{
@@ -370,7 +385,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
if(unitTarget->GetGUID() == m_caster->GetGUID() || unitTarget->GetTypeId() != TYPEID_PLAYER)
return;
- float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[0]));
+ float radius = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[0]));
if(!radius) return;
float distance = m_caster->GetDistance2d(unitTarget);
damage = (distance > radius ) ? 0 : (int32)(m_spellInfo->EffectBasePoints[0]*((radius - distance)/radius));
@@ -382,7 +397,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
case SPELLFAMILY_MAGE:
{
// Arcane Blast
- if(m_spellInfo->SpellFamilyFlags & 0x20000000LL)
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x20000000)
{
m_caster->CastSpell(m_caster,36032,true);
}
@@ -391,29 +406,43 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
case SPELLFAMILY_WARRIOR:
{
// Bloodthirst
- if(m_spellInfo->SpellFamilyFlags & 0x40000000000LL)
+ if(m_spellInfo->SpellFamilyFlags[1] & 0x400)
{
damage = uint32(damage * (m_caster->GetTotalAttackPowerValue(BASE_ATTACK)) / 100);
}
// Shield Slam
- else if(m_spellInfo->SpellFamilyFlags & 0x100000000LL)
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x1)
damage += int32(m_caster->GetShieldBlockValue());
// Victory Rush
- else if(m_spellInfo->SpellFamilyFlags & 0x10000000000LL)
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x100)
{
damage = uint32(damage * m_caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
m_caster->ModifyAuraState(AURA_STATE_WARRIOR_VICTORY_RUSH, false);
}
+ // Revenge ${$m1+$AP*0.207} to ${$M1+$AP*0.207}
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x400)
+ damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.207f);
+ // Heroic Throw ${$m1+$AP*.50}
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x00000001)
+ damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.5f);
+ // Shockwave ${$m3/100*$AP}
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x00008000)
+ {
+ int32 pct = m_caster->CalculateSpellDamage(m_spellInfo, 2, m_spellInfo->EffectBasePoints[2], unitTarget);
+ if (pct > 0)
+ damage+= int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * pct / 100);
+ break;
+ }
break;
}
case SPELLFAMILY_WARLOCK:
{
// Incinerate Rank 1 & 2
- if((m_spellInfo->SpellFamilyFlags & 0x00004000000000LL) && m_spellInfo->SpellIconID==2128)
+ if((m_spellInfo->SpellFamilyFlags[1] & 0x000040) && m_spellInfo->SpellIconID==2128)
{
// Incinerate does more dmg (dmg*0.25) if the target is Immolated.
if(unitTarget->HasAuraState(AURA_STATE_IMMOLATE))
- damage += int32(damage*0.25);
+ damage += int32(damage*0.25f);
}
// Conflagrate - consumes immolate
@@ -423,75 +452,52 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
Unit::AuraList const &mPeriodic = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
for(Unit::AuraList::const_iterator i = mPeriodic.begin(); i != mPeriodic.end(); ++i)
{
- if( (*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && ((*i)->GetSpellProto()->SpellFamilyFlags & 4) &&
+ if( (*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && ((*i)->GetSpellProto()->SpellFamilyFlags[0] & 4) &&
(*i)->GetCasterGUID()==m_caster->GetGUID() )
{
- unitTarget->RemoveAurasDueToCasterSpell((*i)->GetId(), m_caster->GetGUID());
+ unitTarget->RemoveAurasByCasterSpell((*i)->GetId(), m_caster->GetGUID());
break;
}
}
}
break;
}
+ case SPELLFAMILY_PRIEST:
+ {
+ // Shadow Word: Death - deals damage equal to damage done to caster
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x2)
+ m_caster->CastCustomSpell(m_caster, 32409, &damage, 0, 0, true);
+ break;
+ }
case SPELLFAMILY_DRUID:
{
// Ferocious Bite
- if((m_spellInfo->SpellFamilyFlags & 0x000800000) && m_spellInfo->SpellVisual==6587)
+ if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags[0] & 0x000800000) && m_spellInfo->SpellVisual[0]==6587)
{
- // converts each extra point of energy into ($f1+$AP/630) additional damage
- float multiple = m_caster->GetTotalAttackPowerValue(BASE_ATTACK) / 630 + m_spellInfo->DmgMultiplier[effect_idx];
+ // converts each extra point of energy into ($f1+$AP/410) additional damage
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ float multiple = ap / 410 + m_spellInfo->DmgMultiplier[effect_idx];
damage += int32(m_caster->GetPower(POWER_ENERGY) * multiple);
+ damage += int32(((Player*)m_caster)->GetComboPoints() * ap * 7 / 100);
m_caster->SetPower(POWER_ENERGY,0);
}
// Rake
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000000001000LL)
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x1000)
{
damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
}
// Swipe
- else if(m_spellInfo->SpellFamilyFlags & 0x0010000000000000LL)
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x00100000)
{
damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.08f);
}
- // Starfire
- else if ( m_spellInfo->SpellFamilyFlags & 0x0004LL )
- {
- Unit::AuraList const& m_OverrideClassScript = m_caster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- for(Unit::AuraList::const_iterator i = m_OverrideClassScript.begin(); i != m_OverrideClassScript.end(); ++i)
- {
- // Starfire Bonus (caster)
- switch((*i)->GetModifier()->m_miscvalue)
- {
- case 5481: // Nordrassil Regalia - bonus
- {
- Unit::AuraList const& m_periodicDamageAuras = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
- for(Unit::AuraList::const_iterator itr = m_periodicDamageAuras.begin(); itr != m_periodicDamageAuras.end(); ++itr)
- {
- // Moonfire or Insect Swarm (target debuff from any casters)
- if ( (*itr)->GetSpellProto()->SpellFamilyFlags & 0x00200002LL )
- {
- int32 mod = (*i)->GetModifier()->m_amount;
- damage += damage*mod/100;
- break;
- }
- }
- break;
- }
- case 5148: //Improved Starfire - Ivory Idol of the Moongoddes Aura
- {
- damage += (*i)->GetModifier()->m_amount;
- break;
- }
- }
- }
- }
//Mangle Bonus for the initial damage of Lacerate and Rake
- if((m_spellInfo->SpellFamilyFlags==0x0000000000001000LL && m_spellInfo->SpellIconID==494) ||
- (m_spellInfo->SpellFamilyFlags==0x0000010000000000LL && m_spellInfo->SpellIconID==2246))
+ if((m_spellInfo->SpellFamilyFlags.IsEqual(0x1000,0,0) && m_spellInfo->SpellIconID==494) ||
+ (m_spellInfo->SpellFamilyFlags.IsEqual(0,0x100,0) && m_spellInfo->SpellIconID==2246))
{
Unit::AuraList const& mDummyAuras = unitTarget->GetAurasByType(SPELL_AURA_DUMMY);
for(Unit::AuraList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
- if((*i)->GetSpellProto()->SpellFamilyFlags & 0x0000044000000000LL && (*i)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_DRUID)
+ if((*i)->GetSpellProto()->SpellFamilyFlags[1] & 0x00000440 && (*i)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_DRUID)
{
damage = int32(damage*(100.0f+(*i)->GetModifier()->m_amount)/100.0f);
break;
@@ -502,69 +508,88 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
case SPELLFAMILY_ROGUE:
{
// Envenom
- if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & 0x800000000LL))
+ if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags[1] & 0x8))
{
// consume from stack dozes not more that have combo-points
if(uint32 combo = ((Player*)m_caster)->GetComboPoints())
{
- // count consumed deadly poison doses at target
- uint32 doses = 0;
-
- // remove consumed poison doses
+ Aura *poison = 0;
+ // Lookup for Deadly poison (only attacker applied)
Unit::AuraList const& auras = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
- for(Unit::AuraList::const_iterator itr = auras.begin(); itr!=auras.end() && combo;)
- {
- // Deadly poison (only attacker applied)
- if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE && ((*itr)->GetSpellProto()->SpellFamilyFlags & 0x10000) &&
- (*itr)->GetSpellProto()->SpellVisual==5100 && (*itr)->GetCasterGUID()==m_caster->GetGUID() )
+ for(Unit::AuraList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr)
+ if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE &&
+ (*itr)->GetSpellProto()->SpellFamilyFlags[0] & 0x10000 &&
+ (*itr)->GetCasterGUID()==m_caster->GetGUID() )
{
- --combo;
- ++doses;
-
- unitTarget->RemoveSingleAuraFromStack((*itr)->GetId(), (*itr)->GetEffIndex());
-
- itr = auras.begin();
+ poison = *itr;
+ break;
}
- else
- ++itr;
+ // count consumed deadly poison doses at target
+ if (poison)
+ {
+ uint32 spellId = poison->GetId();
+ uint32 doses = poison->GetStackAmount();
+ if (doses > combo)
+ doses = combo;
+ for (int i=0; i< doses; i++)
+ unitTarget->RemoveSingleSpellAurasFromStack(spellId);
+ damage *= doses;
+ damage += int32(((Player*)m_caster)->GetTotalAttackPowerValue(BASE_ATTACK) * 0.03f * doses);
}
-
- damage *= doses;
- damage += int32(((Player*)m_caster)->GetTotalAttackPowerValue(BASE_ATTACK) * 0.03f * doses);
-
// Eviscerate and Envenom Bonus Damage (item set effect)
if(m_caster->GetDummyAura(37169))
damage += ((Player*)m_caster)->GetComboPoints()*40;
}
}
// Eviscerate
- else if((m_spellInfo->SpellFamilyFlags & 0x00020000LL) && m_caster->GetTypeId()==TYPEID_PLAYER)
+ else if((m_spellInfo->SpellFamilyFlags[0] & 0x00020000) && m_caster->GetTypeId()==TYPEID_PLAYER)
{
if(uint32 combo = ((Player*)m_caster)->GetComboPoints())
{
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * combo * 0.03f);
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ damage += irand(int32(ap * combo * 0.03f), int32(ap * combo * 0.07f));
// Eviscerate and Envenom Bonus Damage (item set effect)
if(m_caster->GetDummyAura(37169))
damage += combo*40;
}
}
+ // Gouge
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x8)
+ {
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.02f);
+ }
+ // Instant Poison
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x2000)
+ {
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.10f);
+ }
+ // Wound Poison
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x10000000)
+ {
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.04f);
+ }
break;
}
case SPELLFAMILY_HUNTER:
{
// Mongoose Bite
- if((m_spellInfo->SpellFamilyFlags & 0x000000002) && m_spellInfo->SpellVisual==342)
+ if((m_spellInfo->SpellFamilyFlags[0] & 0x2) && m_spellInfo->SpellVisual[0]==342)
+ {
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
+ }
+ // Counterattack
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x00080000)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2);
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
}
// Arcane Shot
- else if((m_spellInfo->SpellFamilyFlags & 0x00000800) && m_spellInfo->maxLevel > 0)
+ else if((m_spellInfo->SpellFamilyFlags[0] & 0x00000800) && m_spellInfo->maxLevel > 0)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15);
+ damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15f);
}
// Steady Shot
- else if(m_spellInfo->SpellFamilyFlags & 0x100000000LL)
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x1)
{
int32 base = irand((int32)m_caster->GetWeaponDamageRange(RANGED_ATTACK, MINDAMAGE),(int32)m_caster->GetWeaponDamageRange(RANGED_ATTACK, MAXDAMAGE));
damage += int32(float(base)/m_caster->GetAttackTime(RANGED_ATTACK)*2800 + m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.2f);
@@ -586,28 +611,58 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
if(found)
damage += m_spellInfo->EffectBasePoints[1];
}
- //Explosive Trap Effect
- else if(m_spellInfo->SpellFamilyFlags & 0x00000004)
+ // Explosive Trap Effect
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x00000004)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1);
+ damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1f);
}
break;
}
case SPELLFAMILY_PALADIN:
{
- //Judgement of Vengeance
- if((m_spellInfo->SpellFamilyFlags & 0x800000000LL) && m_spellInfo->SpellIconID==2292)
+ // Judgement of Vengeance/Corruption ${1+0.22*$SPH+0.14*$AP} + 10% for each application of Holy Vengeance/Blood Corruption on the target
+ if((m_spellInfo->SpellFamilyFlags[1] & 0x800) && m_spellInfo->SpellIconID==2292)
{
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
+ m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
+ damage+=int32(ap * 0.14f) + int32(holy * 22 / 100);
+ // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
uint32 stacks = 0;
Unit::AuraList const& auras = unitTarget->GetAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
for(Unit::AuraList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr)
- if((*itr)->GetId() == 31803 && (*itr)->GetCasterGUID()==m_caster->GetGUID())
- ++stacks;
- if(!stacks)
- //No damage if the target isn't affected by this
- damage = -1;
- else
- damage *= stacks;
+ if(((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID()==m_caster->GetGUID())
+ {
+ stacks = (*itr)->GetStackAmount();
+ break;
+ }
+ // + 10% for each application of Holy Vengeance/Blood Corruption on the target
+ if(stacks)
+ damage += damage * stacks * 10 /100;
+ }
+ // Avenger's Shield ($m1+0.07*$SPH+0.07*$AP) - ranged sdb for future
+ else if(m_spellInfo->SpellFamilyFlags[0] & 0x4000)
+ {
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
+ m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
+ damage += int32(ap * 0.07f) + int32(holy * 7 / 100);
+ }
+ // Hammer of Wrath ($m1+0.15*$SPH+0.15*$AP) - ranged type sdb future fix
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x00000080)
+ {
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
+ m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
+ damage += int32(ap * 0.15f) + int32(holy * 15 / 100);
+ }
+ // Hammer of the Righteous
+ else if(m_spellInfo->SpellFamilyFlags[1]&0x00040000)
+ {
+ // Add main hand dps * effect[2] amount
+ float averange = (m_caster->GetFloatValue(UNIT_FIELD_MINDAMAGE) + m_caster->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) / 2;
+ int32 count = m_caster->CalculateSpellDamage(m_spellInfo, 2, m_spellInfo->EffectBasePoints[2], unitTarget);
+ damage += count * int32(averange * 1000) / m_caster->GetAttackTime(BASE_ATTACK);
}
break;
}
@@ -667,7 +722,7 @@ void Spell::EffectDummy(uint32 i)
if (!creatureTarget || !pGameObj) return;
- if (!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), 181574, creatureTarget->GetMap(),
+ if (!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), 181574, creatureTarget->GetMap(), creatureTarget->GetPhaseMask(),
creatureTarget->GetPositionX(), creatureTarget->GetPositionY(), creatureTarget->GetPositionZ(),
creatureTarget->GetOrientation(), 0, 0, 0, 0, 100, 1))
{
@@ -775,12 +830,6 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastCustomSpell(unitTarget, 12721, &deepWoundsDotBasePoints0, NULL, NULL, true, NULL);
return;
}
- case 12975: //Last Stand
- {
- int32 healthModSpellBasePoints0 = int32(m_caster->GetMaxHealth()*0.3);
- m_caster->CastCustomSpell(m_caster, 12976, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
- return;
- }
case 13120: // net-o-matic
{
if(!unitTarget)
@@ -817,30 +866,6 @@ void Spell::EffectDummy(uint32 i)
}
return;
}
- case 14185: // Preparation Rogue
- {
- if(m_caster->GetTypeId()!=TYPEID_PLAYER)
- return;
-
- //immediately finishes the cooldown on certain Rogue abilities
- const PlayerSpellMap& sp_list = ((Player *)m_caster)->GetSpellMap();
- for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
- {
- uint32 classspell = itr->first;
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
-
- if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags & 0x26000000860LL))
- {
- ((Player*)m_caster)->RemoveSpellCooldown(classspell);
-
- WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
- data << uint32(classspell);
- data << uint64(m_caster->GetGUID());
- ((Player*)m_caster)->GetSession()->SendPacket(&data);
- }
- }
- return;
- }
case 15998: // Capture Worg Pup
case 29435: // Capture Female Kaliri Hatchling
{
@@ -905,19 +930,20 @@ void Spell::EffectDummy(uint32 i)
if(creatureTarget->isPet())
return;
+ GameObject* Crystal_Prison = m_caster->SummonGameObject(179644, creatureTarget->GetPositionX(), creatureTarget->GetPositionY(), creatureTarget->GetPositionZ(), creatureTarget->GetOrientation(), 0, 0, 0, 0, creatureTarget->GetRespawnTime()-time(NULL));
+ sLog.outDebug("SummonGameObject at SpellEfects.cpp EffectDummy for Spell 23019\n");
+
creatureTarget->setDeathState(JUST_DIED);
creatureTarget->RemoveCorpse();
creatureTarget->SetHealth(0); // just for nice GM-mode view
- GameObject* Crystal_Prison = m_caster->SummonGameObject(179644, creatureTarget->GetPositionX(), creatureTarget->GetPositionY(), creatureTarget->GetPositionZ(), creatureTarget->GetOrientation(), 0, 0, 0, 0, creatureTarget->GetRespawnTime()-time(NULL));
- sLog.outDebug("SummonGameObject at SpellEfects.cpp EffectDummy for Spell 23019\n");
WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8);
data << uint64(Crystal_Prison->GetGUID());
m_caster->SendMessageToSet(&data,true);
return;
}
- case 23074: // Arc. Dragonling
+ case 23074: // Arcanite Dragonling
if (!m_CastItem) return;
m_caster->CastSpell(m_caster,19804,true,m_CastItem);
return;
@@ -1129,36 +1155,6 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(m_caster,42337,true,NULL);
return;
}
- case 37573: //Temporal Phase Modulator
- {
- if(!unitTarget)
- return;
-
- TemporarySummon* tempSummon = dynamic_cast<TemporarySummon*>(unitTarget);
- if(!tempSummon)
- return;
-
- uint32 health = tempSummon->GetHealth();
- const uint32 entry_list[6] = {21821, 21820, 21817};
-
- float x = tempSummon->GetPositionX();
- float y = tempSummon->GetPositionY();
- float z = tempSummon->GetPositionZ();
- float o = tempSummon->GetOrientation();
-
- tempSummon->UnSummon();
-
- Creature* pCreature = m_caster->SummonCreature(entry_list[urand(0, 2)], x, y, z, o,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,180000);
- if (!pCreature)
- return;
-
- pCreature->SetHealth(health);
-
- if(pCreature->AI())
- pCreature->AI()->AttackStart(m_caster);
-
- return;
- }
case 34665: //Administer Antidote
{
if(!unitTarget || m_caster->GetTypeId() != TYPEID_PLAYER )
@@ -1235,6 +1231,12 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(m_caster, 30452, true, NULL);
return;
}
+ case 53341:
+ case 53343:
+ {
+ m_caster->CastSpell(m_caster,54586,true);
+ return;
+ }
}
//All IconID Check in there
@@ -1308,65 +1310,119 @@ void Spell::EffectDummy(uint32 i)
break;
case SPELLFAMILY_WARRIOR:
// Charge
- if(m_spellInfo->SpellFamilyFlags & 0x1 && m_spellInfo->SpellVisual == 867)
+ if(m_spellInfo->SpellFamilyFlags & 0x1 && m_spellInfo->SpellVisual[0] == 867)
{
int32 chargeBasePoints0 = damage;
m_caster->CastCustomSpell(m_caster,34846,&chargeBasePoints0,NULL,NULL,true);
return;
}
+ //Slam
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x200000 && m_spellInfo->SpellIconID == 559)
+ {
+ int32 bp0 = damage;
+ m_caster->CastCustomSpell(unitTarget, 50783, &bp0, NULL, NULL, true, 0);
+ }
// Execute
- if(m_spellInfo->SpellFamilyFlags & 0x20000000)
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x20000000)
{
if(!unitTarget)
return;
+ uint32 rage = m_caster->GetPower(POWER_RAGE);
+ // Glyph of Execution bonus
+ if (Aura *aura = m_caster->GetDummyAura(58367))
+ rage+=aura->GetModifier()->m_amount;
+
spell_id = 20647;
- bp = damage+int32(m_caster->GetPower(POWER_RAGE) * m_spellInfo->DmgMultiplier[i]);
+ bp = damage+int32(rage * m_spellInfo->DmgMultiplier[i] +
+ m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
m_caster->SetPower(POWER_RAGE,0);
break;
}
- if(m_spellInfo->Id==21977) //Warrior's Wrath
+ // Slam
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x200000)
{
if(!unitTarget)
return;
-
- m_caster->CastSpell(unitTarget,21887,true); // spell mod
+ m_damage+=m_caster->CalculateDamage(m_attackType, false);
+ m_damage+=damage;
return;
}
+ switch(m_spellInfo->Id)
+ {
+ // Warrior's Wrath
+ case 21977:
+ {
+ if(!unitTarget)
+ return;
+ m_caster->CastSpell(unitTarget,21887,true); // spell mod
+ return;
+ }
+ // Last Stand
+ case 12975:
+ {
+ int32 healthModSpellBasePoints0 = int32(m_caster->GetMaxHealth()*0.3);
+ m_caster->CastCustomSpell(m_caster, 12976, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
+ return;
+ }
+ // Bloodthirst
+ case 23881:
+ {
+ m_caster->CastCustomSpell(unitTarget, 23885, &damage, NULL, NULL, true, NULL);
+ return;
+ }
+ }
break;
case SPELLFAMILY_WARLOCK:
- //Life Tap (only it have this with dummy effect)
- if (m_spellInfo->SpellFamilyFlags == 0x40000)
+ // Life Tap
+ if (m_spellInfo->SpellFamilyFlags[0] & 0x40000)
{
- float cost = damage;
-
- if(Player* modOwner = m_caster->GetSpellModOwner())
- modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, cost,this);
-
- int32 dmg = m_caster->SpellDamageBonus(m_caster, m_spellInfo,uint32(cost > 0 ? cost : 0), SPELL_DIRECT_DAMAGE);
-
- if(int32(m_caster->GetHealth()) > dmg)
+ // In 303 exist spirit depend
+ uint32 spirit = m_caster->GetStat(STAT_SPIRIT);
+ switch (m_spellInfo->Id)
+ {
+ case 1454: damage+=spirit; break;
+ case 1455: damage+=spirit*15/10; break;
+ case 1456: damage+=spirit*2; break;
+ case 11687: damage+=spirit*25/10; break;
+ case 11688:
+ case 11689:
+ case 27222:
+ case 57946: damage+=spirit*3; break;
+ default:
+ sLog.outError("Spell::EffectDummy: %u Life Tap need set spirit multipler", m_spellInfo->Id);
+ return;
+ }
+// Think its not need (also need remove Life Tap from SpellDamageBonus or add new value)
+// damage = m_caster->SpellDamageBonus(m_caster, m_spellInfo,uint32(damage > 0 ? damage : 0), SPELL_DIRECT_DAMAGE);
+ if(int32(unitTarget->GetHealth()) > damage)
{
// Shouldn't Appear in Combat Log
- m_caster->ModifyHealth(-dmg);
-
- int32 mana = dmg;
+ unitTarget->ModifyHealth(-damage);
+ int32 mana = damage;
+ // Improved Life Tap mod
Unit::AuraList const& auraDummy = m_caster->GetAurasByType(SPELL_AURA_DUMMY);
for(Unit::AuraList::const_iterator itr = auraDummy.begin(); itr != auraDummy.end(); ++itr)
{
- // only Imp. Life Tap have this in combination with dummy aura
if((*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_WARLOCK && (*itr)->GetSpellProto()->SpellIconID == 208)
mana = ((*itr)->GetModifier()->m_amount + 100)* mana / 100;
}
-
- m_caster->CastCustomSpell(m_caster,31818,&mana,NULL,NULL,true,NULL);
+ m_caster->CastCustomSpell(unitTarget, 31818, &mana, NULL, NULL, true);
// Mana Feed
- int32 manaFeedVal = m_caster->CalculateSpellDamage(m_spellInfo,1, m_spellInfo->EffectBasePoints[1],m_caster);
- manaFeedVal = manaFeedVal * mana / 100;
+ int32 manaFeedVal = 0;
+ Unit::AuraList const& mod = m_caster->GetAurasByType(SPELL_AURA_ADD_FLAT_MODIFIER);
+ for(Unit::AuraList::const_iterator itr = mod.begin(); itr != mod.end(); ++itr)
+ {
+ if((*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_WARLOCK && (*itr)->GetSpellProto()->SpellIconID == 1982)
+ manaFeedVal+= (*itr)->GetModifier()->m_amount;
+ }
if(manaFeedVal > 0)
- m_caster->CastCustomSpell(m_caster,32553,&manaFeedVal,NULL,NULL,true,NULL);
+ {
+ manaFeedVal = manaFeedVal * mana / 100;
+ m_caster->CastCustomSpell(m_caster, 32553, &manaFeedVal, NULL, NULL, true, NULL);
+ }
}
else
SendCastResult(SPELL_FAILED_FIZZLE);
@@ -1374,6 +1430,30 @@ void Spell::EffectDummy(uint32 i)
}
break;
case SPELLFAMILY_PRIEST:
+ // Penance
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x00800000)
+ {
+ if (!unitTarget)
+ return;
+
+ int hurt = 0;
+ int heal = 0;
+ switch(m_spellInfo->Id)
+ {
+ case 47540: hurt = 47758; heal = 47757; break;
+ case 53005: hurt = 53001; heal = 52986; break;
+ case 53006: hurt = 53002; heal = 52987; break;
+ case 53007: hurt = 53003; heal = 52988; break;
+ default:
+ sLog.outError("Spell::EffectDummy: Spell %u Penance need set correct heal/damage spell", m_spellInfo->Id);
+ return;
+ }
+ if (m_caster->IsFriendlyTo(unitTarget))
+ m_caster->CastSpell(unitTarget, heal, true, 0);
+ else
+ m_caster->CastSpell(unitTarget, hurt, true, 0);
+ return;
+ }
switch(m_spellInfo->Id )
{
case 28598: // Touch of Weakness triggered spell
@@ -1401,25 +1481,10 @@ void Spell::EffectDummy(uint32 i)
}
break;
case SPELLFAMILY_DRUID:
- switch(m_spellInfo->Id )
- {
- case 5420: // Tree of Life passive
- {
- // Tree of Life area effect
- int32 health_mod = int32(m_caster->GetStat(STAT_SPIRIT)/4);
- m_caster->CastCustomSpell(m_caster,34123,&health_mod,NULL,NULL,true,NULL);
- return;
- }
- }
break;
case SPELLFAMILY_ROGUE:
switch(m_spellInfo->Id )
{
- case 31231: // Cheat Death
- {
- m_caster->CastSpell(m_caster,45182,true);
- return;
- }
case 5938: // Shiv
{
if(m_caster->GetTypeId() != TYPEID_PLAYER)
@@ -1455,36 +1520,38 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(unitTarget, 5940, true);
return;
}
- }
- break;
- case SPELLFAMILY_HUNTER:
- // Kill command
- if(m_spellInfo->SpellFamilyFlags & 0x00080000000000LL)
- {
- if(m_caster->getClass()!=CLASS_HUNTER)
- return;
+ case 14185: // Preparation Rogue
+ {
+ if(m_caster->GetTypeId()!=TYPEID_PLAYER)
+ return;
- // clear hunter crit aura state
- m_caster->ModifyAuraState(AURA_STATE_HUNTER_CRIT_STRIKE,false);
+ //immediately finishes the cooldown on certain Rogue abilities
+ const PlayerSpellMap& sp_list = ((Player *)m_caster)->GetSpellMap();
+ for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
+ {
+ uint32 classspell = itr->first;
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell);
- // additional damage from pet to pet target
- Pet* pet = m_caster->GetPet();
- if(!pet || !pet->getVictim())
- return;
+ if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags[1] & 0x00000240 || spellInfo->SpellFamilyFlags[0] & 0x00000860))
+ {
+ ((Player*)m_caster)->RemoveSpellCooldown(classspell);
- uint32 spell_id = 0;
- switch (m_spellInfo->Id)
+ WorldPacket data(SMSG_CLEAR_COOLDOWN, (4+8));
+ data << uint32(classspell);
+ data << uint64(m_caster->GetGUID());
+ ((Player*)m_caster)->GetSession()->SendPacket(&data);
+ }
+ }
+ return;
+ }
+ case 31231: // Cheat Death
{
- case 34026: spell_id = 34027; break; // rank 1
- default:
- sLog.outError("Spell::EffectDummy: Spell %u not handled in KC",m_spellInfo->Id);
+ m_caster->CastSpell(m_caster,45182,true);
return;
}
-
- pet->CastSpell(pet->getVictim(), spell_id, true);
- return;
}
-
+ break;
+ case SPELLFAMILY_HUNTER:
switch(m_spellInfo->Id)
{
case 23989: //Readiness talent
@@ -1542,6 +1609,8 @@ void Spell::EffectDummy(uint32 i)
case 20930: hurt = 25902; heal = 25903; break;
case 27174: hurt = 27176; heal = 27175; break;
case 33072: hurt = 33073; heal = 33074; break;
+ case 48824: hurt = 48822; heal = 48820; break;
+ case 48825: hurt = 48823; heal = 48821; break;
default:
sLog.outError("Spell::EffectDummy: Spell %u not handled in HS",m_spellInfo->Id);
return;
@@ -1572,10 +1641,7 @@ void Spell::EffectDummy(uint32 i)
mod->value = -50;
mod->type = SPELLMOD_PCT;
mod->spellId = m_spellInfo->Id;
- mod->effectId = i;
- mod->lastAffected = NULL;
- mod->mask = 0x0000020000000000LL;
- mod->charges = 0;
+ mod->mask[1] = 0x00000200;
((Player*)m_caster)->AddSpellMod(mod, true);
m_caster->CastSpell(unitTarget,spell_proto,true,NULL);
@@ -1591,6 +1657,14 @@ void Spell::EffectDummy(uint32 i)
switch(m_spellInfo->Id)
{
+ // Judgement of Righteousness (0.2*$AP+0.32*$SPH) holy added in spellDamagBonus
+ case 20187:
+ {
+ if (!unitTarget)
+ return;
+ m_damage+=int32(0.2f*m_caster->GetTotalAttackPowerValue(BASE_ATTACK));
+ return;
+ }
case 31789: // Righteous Defense (step 1)
{
// 31989 -> dummy effect (step 1) + dummy effect (step 2) -> 31709 (taunt like spell for each target)
@@ -1657,8 +1731,10 @@ void Spell::EffectDummy(uint32 i)
break;
case SPELLFAMILY_SHAMAN:
//Shaman Rockbiter Weapon
- if (m_spellInfo->SpellFamilyFlags == 0x400000)
+ if (m_spellInfo->SpellFamilyFlags.IsEqual(0x400000))
{
+ // TODO: use expect spell for enchant (if exist talent)
+ // In 3.0.3 no mods present for rockbiter
uint32 spell_id = 0;
switch(m_spellInfo->Id)
{
@@ -1666,11 +1742,6 @@ void Spell::EffectDummy(uint32 i)
case 8018: spell_id = 36750; break; // Rank 2
case 8019: spell_id = 36755; break; // Rank 3
case 10399: spell_id = 36759; break; // Rank 4
- case 16314: spell_id = 36763; break; // Rank 5
- case 16315: spell_id = 36766; break; // Rank 6
- case 16316: spell_id = 36771; break; // Rank 7
- case 25479: spell_id = 36775; break; // Rank 8
- case 25485: spell_id = 36499; break; // Rank 9
default:
sLog.outError("Spell::EffectDummy: Spell %u not handled in RW",m_spellInfo->Id);
return;
@@ -1708,18 +1779,57 @@ void Spell::EffectDummy(uint32 i)
}
return;
}
-
- if(m_spellInfo->Id == 39610) // Mana-Tide Totem effect
+ // Healing Stream Totem
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x2000)
+ {
+ m_caster->CastCustomSpell(unitTarget, 52042, &damage, 0, 0, true, 0, 0, m_originalCasterGUID);
+ return;
+ }
+ // Mana Spring Totem
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x4000)
+ {
+ if(unitTarget->getPowerType()!=POWER_MANA)
+ return;
+ m_caster->CastCustomSpell(unitTarget, 52032, &damage, 0, 0, true, 0, 0, m_originalCasterGUID);
+ return;
+ }
+ if(m_spellInfo->Id == 39610) // Mana Tide Totem effect
{
if(!unitTarget || unitTarget->getPowerType() != POWER_MANA)
return;
-
+ // Glyph of Mana Tide
+ Unit *owner = m_caster->GetOwner();
+ if (owner)
+ if (Aura *dummy = owner->GetDummyAura(55441))
+ damage+=dummy->GetModifier()->m_amount;
// Regenerate 6% of Total Mana Every 3 secs
int32 EffectBasePoints0 = unitTarget->GetMaxPower(POWER_MANA) * damage / 100;
m_caster->CastCustomSpell(unitTarget,39609,&EffectBasePoints0,NULL,NULL,true,NULL,NULL,m_originalCasterGUID);
return;
}
-
+ // Lava Lash
+ if (m_spellInfo->SpellFamilyFlags[2] & 0x00000004)
+ {
+ if (m_caster->GetTypeId()!=TYPEID_PLAYER)
+ return;
+ Item *item = ((Player*)m_caster)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+ if (item)
+ {
+ // Damage is increased if your off-hand weapon is enchanted with Flametongue.
+ Unit::AuraList const& auraDummy = m_caster->GetAurasByType(SPELL_AURA_DUMMY);
+ for(Unit::AuraList::const_iterator itr = auraDummy.begin(); itr != auraDummy.end(); ++itr)
+ {
+ if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_SHAMAN &&
+ (*itr)->GetSpellProto()->SpellFamilyFlags[0] & 0x200000 &&
+ (*itr)->GetCastItemGUID() == item->GetGUID())
+ {
+ m_damage += m_damage * damage / 100;
+ return;
+ }
+ }
+ }
+ return;
+ }
break;
}
@@ -1733,7 +1843,7 @@ void Spell::EffectDummy(uint32 i)
sLog.outError("EffectDummy of spell %u: triggering unknown spell id %i\n", m_spellInfo->Id, spell_id);
return;
}
-
+
Spell* spell = new Spell(m_caster, spellInfo, true, m_originalCasterGUID, NULL, true);
if(bp) spell->m_currentBasePoints[0] = bp;
SpellCastTargets targets;
@@ -1839,7 +1949,7 @@ void Spell::EffectTriggerSpell(uint32 i)
if (!spellInfo)
continue;
- if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && spellInfo->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE_STEALTH)
+ if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_STEALTH)
{
spellId = spellInfo->Id;
break;
@@ -1996,12 +2106,7 @@ void Spell::EffectTriggerMissileSpell(uint32 effect_idx)
if (m_CastItem)
DEBUG_LOG("WORLD: cast Item spellId - %i", spellInfo->Id);
- Spell *spell = new Spell(m_caster, spellInfo, true, m_originalCasterGUID );
-
- SpellCastTargets targets;
- targets.setDestination(m_targets.m_destX,m_targets.m_destY,m_targets.m_destZ);
- spell->m_CastItem = m_CastItem;
- spell->prepare(&targets, NULL);
+ m_caster->CastSpell(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, spellInfo->Id, true, m_CastItem, 0, m_originalCasterGUID);
}
void Spell::EffectTeleportUnits(uint32 i)
@@ -2136,17 +2241,12 @@ void Spell::EffectApplyAura(uint32 i)
if(!unitTarget)
return;
- SpellImmuneList const& list = unitTarget->m_spellImmune[IMMUNITY_STATE];
- for(SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
- if(itr->type == m_spellInfo->EffectApplyAuraName[i])
- return;
-
// ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
if( !unitTarget->isAlive() && m_spellInfo->Id != 20584 && m_spellInfo->Id != 8326 &&
(unitTarget->GetTypeId()!=TYPEID_PLAYER || !((Player*)unitTarget)->GetSession()->PlayerLoading()) )
return;
- Unit* caster = m_originalCasterGUID ? m_originalCaster : m_caster;
+ Unit* caster = m_originalCaster ? m_originalCaster : m_caster;
if(!caster)
return;
@@ -2159,6 +2259,13 @@ void Spell::EffectApplyAura(uint32 i)
unitTarget->ApplyDiminishingToDuration(m_diminishGroup,duration,caster,m_diminishLevel);
Aur->setDiminishGroup(m_diminishGroup);
+ //apply mods only here, area auras don't have duration
+ duration = caster->ModSpellDuration(m_spellInfo, i, unitTarget, duration);
+
+ //mod duration of channeled aura by spell haste
+ if (IsChanneledSpell(m_spellInfo))
+ caster->ModSpellCastTime(m_spellInfo, duration);
+
// if Aura removed and deleted, do not continue.
if(duration== 0 && !(Aur->IsPermanent()))
{
@@ -2183,33 +2290,8 @@ void Spell::EffectApplyAura(uint32 i)
if(!Aur)
return;
- // TODO Make a way so it works for every related spell!
- if(unitTarget->GetTypeId()==TYPEID_PLAYER) // Negative buff should only be applied on players
- {
- uint32 spellId = 0;
- if(m_spellInfo->CasterAuraStateNot==AURA_STATE_WEAKENED_SOUL || m_spellInfo->TargetAuraStateNot==AURA_STATE_WEAKENED_SOUL)
- spellId = 6788; // Weakened Soul
- else if(m_spellInfo->CasterAuraStateNot==AURA_STATE_FORBEARANCE || m_spellInfo->TargetAuraStateNot==AURA_STATE_FORBEARANCE)
- spellId = 25771; // Forbearance
- else if(m_spellInfo->CasterAuraStateNot==AURA_STATE_HYPOTHERMIA)
- spellId = 41425; // Hypothermia
- else if (m_spellInfo->Mechanic == MECHANIC_BANDAGE) // Bandages
- spellId = 11196; // Recently Bandaged
- else if( (m_spellInfo->AttributesEx & 0x20) && (m_spellInfo->AttributesEx2 & 0x20000) )
- spellId = 23230; // Blood Fury - Healing Reduction
-
- SpellEntry const *AdditionalSpellInfo = sSpellStore.LookupEntry(spellId);
- if (AdditionalSpellInfo)
- {
- // applied at target by target
- Aura* AdditionalAura = CreateAura(AdditionalSpellInfo, 0, NULL, unitTarget,unitTarget, 0);
- unitTarget->AddAura(AdditionalAura);
- sLog.outDebug("Spell: Additional Aura is: %u", AdditionalSpellInfo->EffectApplyAuraName[0]);
- }
- }
-
// Prayer of Mending (jump animation), we need formal caster instead original for correct animation
- if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && (m_spellInfo->SpellFamilyFlags & 0x00002000000000LL))
+ if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && (m_spellInfo->SpellFamilyFlags[1] & 0x000020))
m_caster->CastSpell(unitTarget, 41637, true, NULL, Aur, m_originalCasterGUID);
}
@@ -2260,7 +2342,8 @@ void Spell::EffectPowerDrain(uint32 i)
unitTarget->ModifyPower(drain_power,-new_damage);
- if(drain_power == POWER_MANA)
+ // Don`t restore from self drain
+ if(drain_power == POWER_MANA && m_caster != unitTarget)
{
float manaMultiplier = m_spellInfo->EffectMultipleValue[i];
if(manaMultiplier==0)
@@ -2401,7 +2484,7 @@ void Spell::SpellDamageHeal(uint32 /*i*/)
Unit::AuraList const& mDummyAuras = m_caster->GetAurasByType(SPELL_AURA_DUMMY);
for(Unit::AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
if((*i)->GetId() == 45062)
- damageAmount+=(*i)->GetModifierValue();
+ damageAmount+=(*i)->GetModifier()->m_amount;
if (damageAmount)
m_caster->RemoveAurasDueToSpell(45062);
@@ -2416,7 +2499,7 @@ void Spell::SpellDamageHeal(uint32 /*i*/)
for(Unit::AuraList::const_iterator i = RejorRegr.begin(); i != RejorRegr.end(); ++i)
{
if((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID
- && ((*i)->GetSpellProto()->SpellFamilyFlags == 0x40 || (*i)->GetSpellProto()->SpellFamilyFlags == 0x10) )
+ && ((*i)->GetSpellProto()->SpellFamilyFlags.IsEqual(0x40) || (*i)->GetSpellProto()->SpellFamilyFlags.IsEqual(0x10)) )
{
if(!targetAura || (*i)->GetAuraDuration() < targetAura->GetAuraDuration())
targetAura = *i;
@@ -2436,21 +2519,21 @@ void Spell::SpellDamageHeal(uint32 /*i*/)
idx++;
}
- int32 tickheal = targetAura->GetModifierValuePerStack();
+ int32 tickheal = targetAura->GetModifier()->m_amount;
if(Unit* auraCaster = targetAura->GetCaster())
- tickheal = auraCaster->SpellHealingBonus(targetAura->GetSpellProto(), tickheal, DOT, unitTarget);
+ tickheal = auraCaster->SpellHealingBonus(unitTarget, targetAura->GetSpellProto(), tickheal, DOT);
//int32 tickheal = targetAura->GetSpellProto()->EffectBasePoints[idx] + 1;
//It is said that talent bonus should not be included
- //int32 tickheal = targetAura->GetModifierValue();
+
int32 tickcount = GetSpellDuration(targetAura->GetSpellProto()) / targetAura->GetSpellProto()->EffectAmplitude[idx];
addhealth += tickheal * tickcount;
- unitTarget->RemoveAurasDueToCasterSpell(targetAura->GetId(), targetAura->GetCasterGUID());
+ unitTarget->RemoveAurasByCasterSpell(targetAura->GetId(), targetAura->GetCasterGUID());
//addhealth += tickheal * tickcount;
//addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth,HEAL, unitTarget);
}
else
- addhealth = caster->SpellHealingBonus(m_spellInfo, addhealth,HEAL, unitTarget);
+ addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, addhealth, HEAL);
m_damage -= addhealth;
}
@@ -2491,7 +2574,7 @@ void Spell::EffectHealMechanical( uint32 /*i*/ )
if (!caster)
return;
- uint32 addhealth = caster->SpellHealingBonus(m_spellInfo, uint32(damage), HEAL, unitTarget);
+ uint32 addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, uint32(damage), HEAL);
caster->SendHealSpellLog(unitTarget, m_spellInfo->Id, addhealth, false);
unitTarget->ModifyHealth( int32(damage) );
}
@@ -2522,7 +2605,7 @@ void Spell::EffectHealthLeech(uint32 i)
if(m_caster->isAlive())
{
- new_damage = m_caster->SpellHealingBonus(m_spellInfo, new_damage, HEAL, m_caster);
+ new_damage = m_caster->SpellHealingBonus(m_caster, m_spellInfo, new_damage, HEAL);
m_caster->ModifyHealth(new_damage);
@@ -2575,8 +2658,8 @@ void Spell::DoCreateItem(uint32 i, uint32 itemtype)
if (num_to_add < 1)
num_to_add = 1;
- if (num_to_add > pProto->Stackable)
- num_to_add = pProto->Stackable;
+ if (num_to_add > pProto->GetMaxStackSize())
+ num_to_add = pProto->GetMaxStackSize();
// init items_count to 1, since 1 item will be created regardless of specialization
int items_count=1;
@@ -2668,9 +2751,24 @@ void Spell::EffectCreateItem(uint32 i)
DoCreateItem(i,m_spellInfo->EffectItemType[i]);
}
+void Spell::EffectCreateItem2(uint32 i)
+{
+ // special case: generate using spell_loot_template
+ if(!m_spellInfo->EffectItemType[i])
+ {
+ if(m_caster->GetTypeId()!=TYPEID_PLAYER)
+ return;
+
+ // create some random items
+ ((Player*)m_caster)->AutoStoreLoot(m_spellInfo->Id,LootTemplates_Spell);
+ return;
+ }
+ DoCreateItem(i,m_spellInfo->EffectItemType[i]);
+}
+
void Spell::EffectPersistentAA(uint32 i)
{
- float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float radius = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if(Player* modOwner = m_originalCaster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RADIUS, radius);
@@ -2698,6 +2796,8 @@ void Spell::EffectEnergize(uint32 i)
if(m_spellInfo->EffectMiscValue[i] < 0 || m_spellInfo->EffectMiscValue[i] >= MAX_POWERS)
return;
+ Powers power = Powers(m_spellInfo->EffectMiscValue[i]);
+
// Some level depends spells
int multiplier = 0;
int level_diff = 0;
@@ -2728,8 +2828,6 @@ void Spell::EffectEnergize(uint32 i)
if(damage < 0)
return;
- Powers power = Powers(m_spellInfo->EffectMiscValue[i]);
-
if(unitTarget->GetMaxPower(power) == 0)
return;
@@ -2797,7 +2895,7 @@ void Spell::EffectEnergisePct(uint32 i)
uint32 gain = damage * maxPower / 100;
unitTarget->ModifyPower(power, gain);
- m_caster->SendEnergizeSpellLog(unitTarget, m_spellInfo->Id, damage, power);
+ m_caster->SendEnergizeSpellLog(unitTarget, m_spellInfo->Id, gain, power);
}
void Spell::SendLoot(uint64 guid, LootType loottype)
@@ -2960,10 +3058,10 @@ void Spell::EffectOpenLock(uint32 /*i*/)
}
// check key
- for(int i = 0; i < 5; ++i)
+ for(int i = 0; i < 8; ++i)
{
- // type==1 This means lockInfo->key[i] is an item
- if(lockInfo->keytype[i]==LOCK_KEY_ITEM && lockInfo->key[i] && m_CastItem && m_CastItem->GetEntry()==lockInfo->key[i])
+ // Type==1 This means lockInfo->Index[i] is an item
+ if(lockInfo->Type[i]==LOCK_KEY_ITEM && lockInfo->Index[i] && m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[i])
{
SendLoot(guid, loottype);
return;
@@ -2981,9 +3079,9 @@ void Spell::EffectOpenLock(uint32 /*i*/)
// skill bonus provided by casting spell (mostly item spells)
uint32 spellSkillBonus = uint32(damage/*m_currentBasePoints[0]+1*/);
- uint32 reqSkillValue = lockInfo->requiredminingskill;
+ uint32 reqSkillValue = lockInfo->Skill[0];
- if(lockInfo->requiredlockskill) // required pick lock skill applying
+ if(lockInfo->Skill[1]) // required pick lock skill applying
{
if(SkillId != SKILL_LOCKPICKING) // wrong skill (cheating?)
{
@@ -2991,7 +3089,7 @@ void Spell::EffectOpenLock(uint32 /*i*/)
return;
}
- reqSkillValue = lockInfo->requiredlockskill;
+ reqSkillValue = lockInfo->Skill[1];
}
else if(SkillId == SKILL_LOCKPICKING) // apply picklock skill to wrong target
{
@@ -3009,8 +3107,7 @@ void Spell::EffectOpenLock(uint32 /*i*/)
}
// update skill if really known
- uint32 SkillValue = player->GetPureSkillValue(SkillId);
- if(SkillValue) // non only item base skill
+ if(uint32 SkillValue = player->GetPureSkillValue(SkillId))
{
if(gameObjTarget)
{
@@ -3022,7 +3119,6 @@ void Spell::EffectOpenLock(uint32 /*i*/)
else if(itemTarget)
{
// Do one skill-up
- uint32 SkillValue = player->GetPureSkillValue(SkillId);
player->UpdateGatherSkill(SkillId, SkillValue, reqSkillValue);
}
}
@@ -3174,6 +3270,9 @@ void Spell::EffectSummonType(uint32 i)
case SUMMON_TYPE_POSESSED2:
case SUMMON_TYPE_POSESSED3:
EffectSummonPossessed(i);
+ case SUMMON_TYPE_FORCE_OF_NATURE:
+ case SUMMON_TYPE_GUARDIAN2:
+ EffectSummonGuardian(i);
break;
case SUMMON_TYPE_WILD:
EffectSummonWild(i);
@@ -3265,8 +3364,8 @@ void Spell::EffectLearnSpell(uint32 i)
Player *player = (Player*)unitTarget;
- uint32 spellToLearn = (m_spellInfo->Id==SPELL_ID_GENERIC_LEARN) ? damage : m_spellInfo->EffectTriggerSpell[i];
- player->learnSpell(spellToLearn);
+ uint32 spellToLearn = ((m_spellInfo->Id==SPELL_ID_GENERIC_LEARN) || (m_spellInfo->Id==SPELL_ID_GENERIC_LEARN_PET)) ? damage : m_spellInfo->EffectTriggerSpell[i];
+ player->learnSpell(spellToLearn,false);
sLog.outDebug( "Spell: Player %u have learned spell %u from NpcGUID=%u", player->GetGUIDLow(), spellToLearn, m_caster->GetGUIDLow() );
}
@@ -3362,12 +3461,7 @@ void Spell::EffectDispel(uint32 i)
SpellEntry const* spellInfo = sSpellStore.LookupEntry(j->first);
data << uint32(spellInfo->Id); // Spell Id
data << uint8(0); // 0 - dispelled !=0 cleansed
- if(spellInfo->StackAmount!= 0)
- {
- //Why are Aura's Removed by EffIndex? Auras should be removed as a whole.....
- unitTarget->RemoveSingleAuraFromStackByDispel(spellInfo->Id);
- }
- else
+ //Why are Aura's Removed by EffIndex? Auras should be removed as a whole.....
unitTarget->RemoveAurasDueToSpellByDispel(spellInfo->Id, j->second, m_caster);
}
m_caster->SendMessageToSet(&data, true);
@@ -3485,7 +3579,7 @@ void Spell::EffectAddFarsight(uint32 i)
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
- float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float radius = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
int32 duration = GetSpellDuration(m_spellInfo);
DynamicObject* dynObj = new DynamicObject;
if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, i, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius))
@@ -3532,7 +3626,7 @@ void Spell::EffectSummonWild(uint32 i)
float center_y = m_targets.m_destY;
float center_z = m_targets.m_destZ;
- float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float radius = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
int32 amount = damage > 0 ? damage : 1;
@@ -3628,12 +3722,13 @@ void Spell::EffectSummonGuardian(uint32 i)
float center_y = m_targets.m_destY;
float center_z = m_targets.m_destZ;
- float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float radius = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
int32 amount = damage > 0 ? damage : 1;
for(int32 count = 0; count < amount; ++count)
{
+
float px, py, pz;
// If dest location if present
if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)
@@ -3695,7 +3790,7 @@ void Spell::EffectTeleUnitsFaceCaster(uint32 i)
return;
uint32 mapid = m_caster->GetMapId();
- float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float dis = m_caster->GetSpellRadiusForTarget(unitTarget, sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
float fx,fy,fz;
m_caster->GetClosePoint(fx,fy,fz,unitTarget->GetObjectSize(),dis);
@@ -3742,7 +3837,7 @@ void Spell::EffectTradeSkill(uint32 /*i*/)
// ((Player*)unitTarget)->SetSkill(skillid,skillval?skillval:1,skillmax+75);
}
-void Spell::EffectEnchantItemPerm(uint32 i)
+void Spell::EffectEnchantItemPerm(uint32 effect_idx)
{
if(m_caster->GetTypeId() != TYPEID_PLAYER)
return;
@@ -3751,37 +3846,95 @@ void Spell::EffectEnchantItemPerm(uint32 i)
Player* p_caster = (Player*)m_caster;
+ // not grow at item use at item case
p_caster->UpdateCraftSkill(m_spellInfo->Id);
- if (m_spellInfo->EffectMiscValue[i])
+ uint32 enchant_id = m_spellInfo->EffectMiscValue[effect_idx];
+ if (!enchant_id)
+ return;
+
+ SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
+ if(!pEnchant)
+ return;
+
+ // item can be in trade slot and have owner diff. from caster
+ Player* item_owner = itemTarget->GetOwner();
+ if(!item_owner)
+ return;
+
+ if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
{
- uint32 enchant_id = m_spellInfo->EffectMiscValue[i];
+ sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
+ p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
+ itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
+ item_owner->GetName(),item_owner->GetSession()->GetAccountId());
+ }
- SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
- if(!pEnchant)
- return;
+ // remove old enchanting before applying new if equipped
+ item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,false);
- // item can be in trade slot and have owner diff. from caster
- Player* item_owner = itemTarget->GetOwner();
- if(!item_owner)
- return;
+ itemTarget->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0);
+
+ // add new enchanting if equipped
+ item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,true);
+}
+
+void Spell::EffectEnchantItemPrismatic(uint32 effect_idx)
+{
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+ if (!itemTarget)
+ return;
+
+ Player* p_caster = (Player*)m_caster;
+
+ uint32 enchant_id = m_spellInfo->EffectMiscValue[effect_idx];
+ if (!enchant_id)
+ return;
+
+ SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
+ if(!pEnchant)
+ return;
- if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
+ // support only enchantings with add socket in this slot
+ {
+ bool add_socket = false;
+ for(int i = 0; i < 3; ++i)
{
- sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
- p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
- itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
- item_owner->GetName(),item_owner->GetSession()->GetAccountId());
+ if(pEnchant->type[i]==ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET)
+ {
+ add_socket = true;
+ break;
+ }
}
+ if(!add_socket)
+ {
+ sLog.outError("Spell::EffectEnchantItemPrismatic: attempt apply enchant spell %u with SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC (%u) but without ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET (u), not suppoted yet.",
+ m_spellInfo->Id,SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC,ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET);
+ return;
+ }
+ }
- // remove old enchanting before applying new if equipped
- item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,false);
-
- itemTarget->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0);
+ // item can be in trade slot and have owner diff. from caster
+ Player* item_owner = itemTarget->GetOwner();
+ if(!item_owner)
+ return;
- // add new enchanting if equipped
- item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,true);
+ if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
+ {
+ sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
+ p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
+ itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
+ item_owner->GetName(),item_owner->GetSession()->GetAccountId());
}
+
+ // remove old enchanting before applying new if equipped
+ item_owner->ApplyEnchantment(itemTarget,PRISMATIC_ENCHANTMENT_SLOT,false);
+
+ itemTarget->SetEnchantment(PRISMATIC_ENCHANTMENT_SLOT, enchant_id, 0, 0);
+
+ // add new enchanting if equipped
+ item_owner->ApplyEnchantment(itemTarget,PRISMATIC_ENCHANTMENT_SLOT,true);
}
void Spell::EffectEnchantItemTmp(uint32 i)
@@ -3876,13 +4029,13 @@ void Spell::EffectEnchantItemTmp(uint32 i)
else if(m_spellInfo->SpellFamilyName==SPELLFAMILY_SHAMAN)
duration = 1800; // 30 mins
// other cases with this SpellVisual already selected
- else if(m_spellInfo->SpellVisual==215)
+ else if(m_spellInfo->SpellVisual[0]==215)
duration = 1800; // 30 mins
// some fishing pole bonuses
- else if(m_spellInfo->SpellVisual==563)
+ else if(m_spellInfo->SpellVisual[0]==563)
duration = 600; // 10 mins
// shaman rockbiter enchantments
- else if(m_spellInfo->SpellVisual==0)
+ else if(m_spellInfo->SpellVisual[0]==0)
duration = 1800; // 30 mins
else if(m_spellInfo->Id==29702)
duration = 300; // 5 mins
@@ -3945,14 +4098,16 @@ void Spell::EffectTameCreature(uint32 /*i*/)
creatureTarget->RemoveCorpse();
creatureTarget->SetHealth(0); // just for nice GM-mode view
+ uint32 level = (creatureTarget->getLevel() < (m_caster->getLevel() - 5)) ? (m_caster->getLevel() - 5) : creatureTarget->getLevel();
+
// prepare visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel()-1);
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
// add to world
pet->GetMap()->Add((Creature*)pet);
// visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel());
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
// caster have pet now
m_caster->SetPet(pet);
@@ -4020,6 +4175,7 @@ void Spell::EffectSummonPet(uint32 i)
owner->GetClosePoint(x, y, z, owner->GetObjectSize());
Pet* pet = owner->SummonPet(petentry, x, y, z, owner->GetOrientation(), SUMMON_PET, 0);
if(!pet)
+
return;
if(m_caster->GetTypeId() == TYPEID_UNIT)
@@ -4033,9 +4189,12 @@ void Spell::EffectSummonPet(uint32 i)
pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id);
// this enables popup window (pet dismiss, cancel), hunter pet additional flags set later
- pet->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
+ if(m_caster->GetTypeId() == TYPEID_PLAYER)
+ pet->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
+
pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
+ pet->InitTalentForLevel();
// generate new name for summon pet
std::string new_name=objmgr.GeneratePetName(petentry);
if(!new_name.empty())
@@ -4059,7 +4218,6 @@ void Spell::EffectLearnPetSpell(uint32 i)
if(!learn_spellproto)
return;
- pet->SetTP(pet->m_TrainingPoints - pet->GetTPForSpell(learn_spellproto->Id));
pet->learnSpell(learn_spellproto->Id);
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
@@ -4123,20 +4281,18 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
case SPELLFAMILY_WARRIOR:
{
// Devastate bonus and sunder armor refresh
- if(m_spellInfo->SpellVisual == 671 && m_spellInfo->SpellIconID == 1508)
+ if(m_spellInfo->SpellVisual[0] == 671 && m_spellInfo->SpellIconID == 1508)
{
uint32 stack = 0;
-
Unit::AuraList const& list = unitTarget->GetAurasByType(SPELL_AURA_MOD_RESISTANCE);
for(Unit::AuraList::const_iterator itr=list.begin();itr!=list.end();++itr)
{
SpellEntry const *proto = (*itr)->GetSpellProto();
if(proto->SpellFamilyName == SPELLFAMILY_WARRIOR
- && proto->SpellFamilyFlags == SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR)
+ && proto->SpellFamilyFlags.IsEqual(SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR)
+ && (*itr)->GetCasterGUID() == m_caster->GetGUID())
{
- int32 duration = GetSpellDuration(proto);
- (*itr)->SetAuraDuration(duration);
- (*itr)->UpdateAuraDuration();
+ (*itr)->RefreshAura();
stack = (*itr)->GetStackAmount();
break;
}
@@ -4165,7 +4321,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
if (!spellInfo)
continue;
- if (spellInfo->SpellFamilyFlags == SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR
+ if (spellInfo->SpellFamilyFlags.IsEqual(SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR)
&& spellInfo->Id != m_spellInfo->Id
&& spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR)
{
@@ -4174,19 +4330,21 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
}
}
}
+ if (stack)
+ spell_bonus += stack * CalculateDamage(2, unitTarget);
}
break;
}
case SPELLFAMILY_ROGUE:
{
// Hemorrhage
- if(m_spellInfo->SpellFamilyFlags & 0x2000000)
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x2000000)
{
if(m_caster->GetTypeId()==TYPEID_PLAYER)
((Player*)m_caster)->AddComboPoints(unitTarget, 1);
}
// Mutilate (for each hand)
- else if(m_spellInfo->SpellFamilyFlags & 0x600000000LL)
+ else if(m_spellInfo->SpellFamilyFlags[1] & 0x6)
{
bool found = false;
// fast check
@@ -4207,16 +4365,16 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
}
if(found)
- totalDamagePercentMod *= 1.5f; // 150% if poisoned
+ totalDamagePercentMod *= 1.2f; // 120% if poisoned
}
break;
}
case SPELLFAMILY_PALADIN:
{
// Seal of Command - receive benefit from Spell Damage and Healing
- if(m_spellInfo->SpellFamilyFlags & 0x00000002000000LL)
+ if(m_spellInfo->SpellFamilyFlags[0] & 0x2000000)
{
- spell_bonus += int32(0.20f*m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)));
+ spell_bonus += int32(0.23f*m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)));
spell_bonus += int32(0.29f*m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget));
}
break;
@@ -4225,7 +4383,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
{
// Skyshatter Harness item set bonus
// Stormstrike
- if(m_spellInfo->SpellFamilyFlags & 0x001000000000LL)
+ if(m_spellInfo->SpellFamilyFlags[1] & 0x0010)
{
Unit::AuraList const& m_OverrideClassScript = m_caster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
for(Unit::AuraList::const_iterator i = m_OverrideClassScript.begin(); i != m_OverrideClassScript.end(); ++i)
@@ -4243,7 +4401,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
case SPELLFAMILY_DRUID:
{
// Mangle (Cat): CP
- if(m_spellInfo->SpellFamilyFlags==0x0000040000000000LL)
+ if(m_spellInfo->SpellFamilyFlags.IsEqual(0,0x00000400))
{
if(m_caster->GetTypeId()==TYPEID_PLAYER)
((Player*)m_caster)->AddComboPoints(unitTarget,1);
@@ -4328,33 +4486,6 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
// Add melee damage bonuses (also check for negative)
m_caster->MeleeDamageBonus(unitTarget, &eff_damage, m_attackType, m_spellInfo);
m_damage+= eff_damage;
-
- // take ammo
- if(m_attackType == RANGED_ATTACK && m_caster->GetTypeId() == TYPEID_PLAYER)
- {
- Item *pItem = ((Player*)m_caster)->GetWeaponForAttack( RANGED_ATTACK );
-
- // wands don't have ammo
- if(!pItem || pItem->IsBroken() || pItem->GetProto()->SubClass==ITEM_SUBCLASS_WEAPON_WAND)
- return;
-
- if( pItem->GetProto()->InventoryType == INVTYPE_THROWN )
- {
- if(pItem->GetMaxStackCount()==1)
- {
- // decrease durability for non-stackable throw weapon
- ((Player*)m_caster)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_RANGED);
- }
- else
- {
- // decrease items amount for stackable throw weapon
- uint32 count = 1;
- ((Player*)m_caster)->DestroyItemCount( pItem, count, true);
- }
- }
- else if(uint32 ammo = ((Player*)m_caster)->GetUInt32Value(PLAYER_AMMO_ID))
- ((Player*)m_caster)->DestroyItemCount(ammo, 1, true);
- }
}
void Spell::EffectThreat(uint32 /*i*/)
@@ -4399,7 +4530,7 @@ void Spell::EffectInterruptCast(uint32 i)
{
if(m_originalCaster)
{
- int32 duration = m_originalCaster->CalculateSpellDuration(m_spellInfo, i, unitTarget);
+ int32 duration = m_originalCaster->ModSpellDuration(m_spellInfo, i, unitTarget, m_originalCaster->CalcSpellDuration(m_spellInfo));
unitTarget->ProhibitSpellScholl(GetSpellSchoolMask(unitTarget->m_currentSpells[i]->m_spellInfo), duration/*GetSpellDuration(m_spellInfo)*/);
}
unitTarget->InterruptSpell(i,false);
@@ -4431,7 +4562,7 @@ void Spell::EffectSummonObjectWild(uint32 i)
Map *map = target->GetMap();
if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), gameobject_id, map,
- x, y, z, target->GetOrientation(), 0, 0, 0, 0, 100, 1))
+ m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0, 0, 0, 0, 100, 1))
{
delete pGameObj;
return;
@@ -4479,7 +4610,7 @@ void Spell::EffectSummonObjectWild(uint32 i)
{
GameObject* linkedGO = new GameObject;
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, map,
- x, y, z, target->GetOrientation(), 0, 0, 0, 0, 100, 1))
+ m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0, 0, 0, 0, 100, 1))
{
linkedGO->SetRespawnTime(duration > 0 ? duration/1000 : 0);
linkedGO->SetSpellId(m_spellInfo->Id);
@@ -4500,441 +4631,587 @@ void Spell::EffectScriptEffect(uint32 effIndex)
{
// TODO: we must implement hunter pet summon at login there (spell 6962)
- // by spell id
- switch(m_spellInfo->Id)
+ switch(m_spellInfo->SpellFamilyName)
{
- // PX-238 Winter Wondervolt TRAP
- case 26275:
+ case SPELLFAMILY_GENERIC:
{
- if( unitTarget->HasAura(26272,0)
- || unitTarget->HasAura(26157,0)
- || unitTarget->HasAura(26273,0)
- || unitTarget->HasAura(26274,0))
- return;
+ switch(m_spellInfo->Id)
+ {
+ // PX-238 Winter Wondervolt TRAP
+ case 26275:
+ {
+ uint32 spells[4] = { 26272, 26157, 26273, 26274 };
- uint32 iTmpSpellId;
+ // check presence
+ for(int j = 0; j < 4; ++j)
+ if(unitTarget->HasAura(spells[j],0))
+ return;
- switch(urand(0,3))
- {
- case 0:
- iTmpSpellId = 26272;
- break;
- case 1:
- iTmpSpellId = 26157;
- break;
- case 2:
- iTmpSpellId = 26273;
- break;
- case 3:
- iTmpSpellId = 26274;
- break;
- }
+ // select spell
+ uint32 iTmpSpellId = spells[urand(0,3)];
- unitTarget->CastSpell(unitTarget, iTmpSpellId, true);
+ // cast
+ unitTarget->CastSpell(unitTarget, iTmpSpellId, true);
+ return;
+ }
+ // Bending Shinbone
+ case 8856:
+ {
+ if(!itemTarget && m_caster->GetTypeId()!=TYPEID_PLAYER)
+ return;
- return;
- }
+ uint32 spell_id = 0;
+ switch(urand(1,5))
+ {
+ case 1: spell_id = 8854; break;
+ default: spell_id = 8855; break;
+ }
- // Bending Shinbone
- case 8856:
- {
- if(!itemTarget && m_caster->GetTypeId()!=TYPEID_PLAYER)
- return;
+ m_caster->CastSpell(m_caster,spell_id,true,NULL);
+ return;
+ }
+ // Brittle Armor - need remove one 24575 Brittle Armor aura
+ case 24590:
+ unitTarget->RemoveSingleSpellAurasFromStack(24575);
+ return;
+ // Mercurial Shield - need remove one 26464 Mercurial Shield aura
+ case 26465:
+ unitTarget->RemoveSingleSpellAurasFromStack(26464);
+ return;
+ // Orb teleport spells
+ case 25140:
+ case 25143:
+ case 25650:
+ case 25652:
+ case 29128:
+ case 29129:
+ case 35376:
+ case 35727:
+ {
+ if(!unitTarget)
+ return;
- uint32 spell_id = 0;
- switch(urand(1,5))
- {
- case 1: spell_id = 8854; break;
- default: spell_id = 8855; break;
- }
+ uint32 spellid;
+ switch(m_spellInfo->Id)
+ {
+ case 25140: spellid = 32571; break;
+ case 25143: spellid = 32572; break;
+ case 25650: spellid = 30140; break;
+ case 25652: spellid = 30141; break;
+ case 29128: spellid = 32568; break;
+ case 29129: spellid = 32569; break;
+ case 35376: spellid = 25649; break;
+ case 35727: spellid = 35730; break;
+ default:
+ return;
+ }
- m_caster->CastSpell(m_caster,spell_id,true,NULL);
- return;
- }
+ unitTarget->CastSpell(unitTarget,spellid,false);
+ return;
+ }
+ // Shadow Flame (All script effects, not just end ones to prevent player from dodging the last triggered spell)
+ case 22539:
+ case 22972:
+ case 22975:
+ case 22976:
+ case 22977:
+ case 22978:
+ case 22979:
+ case 22980:
+ case 22981:
+ case 22982:
+ case 22983:
+ case 22984:
+ case 22985:
+ {
+ if(!unitTarget || !unitTarget->isAlive())
+ return;
- // Healthstone creating spells
- case 6201:
- case 6202:
- case 5699:
- case 11729:
- case 11730:
- case 27230:
- {
- uint32 itemtype;
- uint32 rank = 0;
- Unit::AuraList const& mDummyAuras = unitTarget->GetAurasByType(SPELL_AURA_DUMMY);
- for(Unit::AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
- {
- if((*i)->GetId() == 18692)
+ // Onyxia Scale Cloak
+ if(unitTarget->GetDummyAura(22683))
+ return;
+
+ // Shadow Flame
+ m_caster->CastSpell(unitTarget, 22682, true);
+ return;
+ }
+ // Summon Black Qiraji Battle Tank
+ case 26656:
{
- rank = 1;
+ if(!unitTarget)
+ return;
+
+ // Prevent stacking of mounts
+ unitTarget->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
+
+ // Two separate mounts depending on area id (allows use both in and out of specific instance)
+ if (unitTarget->GetAreaId() == 3428)
+ unitTarget->CastSpell(unitTarget, 25863, false);
+ else
+ unitTarget->CastSpell(unitTarget, 26655, false);
break;
}
- else if((*i)->GetId() == 18693)
+ // Piccolo of the Flaming Fire
+ case 17512:
{
- rank = 2;
+ if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
+ return;
+ unitTarget->HandleEmoteCommand(EMOTE_STATE_DANCE);
break;
}
- }
+ // Mirren's Drinking Hat
+ case 29830:
+ {
+ uint32 item = 0;
+ switch ( urand(1,6) )
+ {
+ case 1:case 2:case 3:
+ item = 23584;break; // Loch Modan Lager
+ case 4:case 5:
+ item = 23585;break; // Stouthammer Lite
+ case 6:
+ item = 23586;break; // Aerie Peak Pale Ale
+ }
+ if (item)
+ DoCreateItem(effIndex,item);
+ break;
+ }
+ // Improved Sprint
+ case 30918:
+ {
+ // Removes snares and roots.
+ uint32 mechanic_mask = (1<<MECHANIC_ROOT) | (1<<MECHANIC_SNARE);
+ Unit::AuraMap& Auras = unitTarget->GetAuras();
+ for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
+ {
+ next = iter;
+ ++next;
+ Aura *aur = iter->second;
+ if (!aur->IsPositive()) //only remove negative spells
+ {
+ // check for mechanic mask
+ if(GetSpellMechanicMask(aur->GetSpellProto(), aur->GetEffIndex()) & mechanic_mask)
+ {
+ unitTarget->RemoveAurasDueToSpell(aur->GetId());
+ if(Auras.empty())
+ break;
+ else
+ next = Auras.begin();
+ }
+ }
+ }
+ break;
+ }
+ /*// Flame Crash
+ case 41126:
+ {
+ if(!unitTarget)
+ return;
- static uint32 const itypes[6][3] = {
- { 5512,19004,19005}, // Minor Healthstone
- { 5511,19006,19007}, // Lesser Healthstone
- { 5509,19008,19009}, // Healthstone
- { 5510,19010,19011}, // Greater Healthstone
- { 9421,19012,19013}, // Major Healthstone
- {22103,22104,22105} // Master Healthstone
- };
+ unitTarget->CastSpell(unitTarget, 41131, true);
+ break;
+ }*/
+ // Draw Soul
+ case 40904:
+ {
+ if(!unitTarget)
+ return;
- switch(m_spellInfo->Id)
- {
- case 6201: itemtype=itypes[0][rank];break; // Minor Healthstone
- case 6202: itemtype=itypes[1][rank];break; // Lesser Healthstone
- case 5699: itemtype=itypes[2][rank];break; // Healthstone
- case 11729: itemtype=itypes[3][rank];break; // Greater Healthstone
- case 11730: itemtype=itypes[4][rank];break; // Major Healthstone
- case 27230: itemtype=itypes[5][rank];break; // Master Healthstone
- default:
- return;
- }
- DoCreateItem( effIndex, itemtype );
- return;
- }
- // Brittle Armor - need remove one 24575 Brittle Armor aura
- case 24590:
- unitTarget->RemoveSingleAuraFromStack(24575, 0);
- unitTarget->RemoveSingleAuraFromStack(24575, 1);
- return;
- // Mercurial Shield - need remove one 26464 Mercurial Shield aura
- case 26465:
- unitTarget->RemoveSingleAuraFromStack(26464, 0);
- return;
- // Orb teleport spells
- case 25140:
- case 25143:
- case 25650:
- case 25652:
- case 29128:
- case 29129:
- case 35376:
- case 35727:
- {
- if(!unitTarget)
- return;
+ unitTarget->CastSpell(m_caster, 40903, true);
+ break;
+ }
+ case 48025: // Headless Horseman's Mount
+ {
+ if(!unitTarget)
+ return;
+
+ switch(((Player*)unitTarget)->GetBaseSkillValue(762))
+ {
+ case 75: unitTarget->CastSpell(unitTarget, 51621, true); break;;
+ case 150: unitTarget->CastSpell(unitTarget, 48024, true); break;
+ case 225: unitTarget->CastSpell(unitTarget, 51617, true); break;
+ case 300: unitTarget->CastSpell(unitTarget, 48023, true); break;
+ default: break;
+ }
+ break;
+ }
+ case 47977: // Magic Broom
+ {
+ if(!unitTarget)
+ return;
- uint32 spellid;
- switch(m_spellInfo->Id)
- {
- case 25140: spellid = 32571; break;
- case 25143: spellid = 32572; break;
- case 25650: spellid = 30140; break;
- case 25652: spellid = 30141; break;
- case 29128: spellid = 32568; break;
- case 29129: spellid = 32569; break;
- case 35376: spellid = 25649; break;
- case 35727: spellid = 35730; break;
- default:
- return;
- }
+ if(unitTarget)
+ {
+ switch(((Player*)unitTarget)->GetBaseSkillValue(762))
+ {
+ case 75: unitTarget->CastSpell(unitTarget, 42680, true); break;;
+ case 150: case 225: case 300: unitTarget->CastSpell(unitTarget, 42683, true); break;
+ default: break;
+ }
+ }
+ break;
+ }
+ case 41931:
+ {
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
- unitTarget->CastSpell(unitTarget,spellid,false);
- return;
- }
+ int bag=19;
+ int slot=0;
+ Item* item = NULL;
+
+ while (bag < 256)
+ {
+ item = ((Player*)m_caster)->GetItemByPos(bag,slot);
+ if (item && item->GetEntry() == 38587) break;
+ slot++;
+ if (slot == 39)
+ {
+ slot = 0;
+ bag++;
+ }
+ }
+ if (bag < 256)
+ {
+ if (((Player*)m_caster)->GetItemByPos(bag,slot)->GetCount() == 1) ((Player*)m_caster)->RemoveItem(bag,slot,true);
+ else ((Player*)m_caster)->GetItemByPos(bag,slot)->SetCount(((Player*)m_caster)->GetItemByPos(bag,slot)->GetCount()-1);
+ // Spell 42518 (Braufest - Gratisprobe des Braufest herstellen)
+ m_caster->CastSpell(m_caster,42518,true);
+ return;
+ }
+ break;
+ }
+ // Force Cast - Portal Effect: Sunwell Isle
+ case 44876:
+ {
+ if(!unitTarget)
+ return;
- // Shadow Flame (All script effects, not just end ones to prevent player from dodging the last triggered spell)
- case 22539:
- case 22972:
- case 22975:
- case 22976:
- case 22977:
- case 22978:
- case 22979:
- case 22980:
- case 22981:
- case 22982:
- case 22983:
- case 22984:
- case 22985:
- {
- if(!unitTarget || !unitTarget->isAlive())
- return;
+ unitTarget->CastSpell(unitTarget, 44870, true);
+ break;
+ }
+ // Goblin Weather Machine
+ case 46203:
+ {
+ if(!unitTarget)
+ return;
- // Onyxia Scale Cloak
- if(unitTarget->GetDummyAura(22683))
- return;
+ uint32 spellId;
+ switch(rand()%4)
+ {
+ case 0: spellId = 46740; break;
+ case 1: spellId = 46739; break;
+ case 2: spellId = 46738; break;
+ case 3: spellId = 46736; break;
+ }
+ unitTarget->CastSpell(unitTarget, spellId, true);
+ break;
+ }
+ //5,000 Gold
+ case 46642:
+ {
+ if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
+ return;
- // Shadow Flame
- m_caster->CastSpell(unitTarget, 22682, true);
- return;
- }
- break;
+ ((Player*)unitTarget)->ModifyMoney(50000000);
- // Summon Black Qiraji Battle Tank
- case 26656:
- {
- if(!unitTarget)
- return;
+ break;
+ }
+ // Emblazon Runeblade
+ case 51770:
+ {
+ if(!unitTarget)
+ return;
+
+ unitTarget->CastSpell(unitTarget,51771,false);
+ break;
+ }
+ // Death Gate
+ case 52751:
+ {
+ if(!unitTarget || unitTarget->getClass() != CLASS_DEATH_KNIGHT)
+ return;
+ // triggered spell is stored in m_spellInfo->EffectBasePoints[0]
+ unitTarget->CastSpell(unitTarget, damage, false);
+ break;
+ }
+ // random spell learn instead placeholder
+ case 60893: // Northrend Alchemy Research
+ case 61177: // Northrend Inscription Research
+ case 61288: // Minor Inscription Research
+ case 61756: // Northrend Inscription Research (FAST QA VERSION)
+ {
+ if(!IsExplicitDiscoverySpell(m_spellInfo))
+ {
+ sLog.outError("Wrong explicit discovery spell %u structure, or outdated...",m_spellInfo->Id);
+ return;
+ }
- // Prevent stacking of mounts
- unitTarget->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
+ if(m_caster->GetTypeId()!=TYPEID_PLAYER)
+ return;
+ Player* player = (Player*)m_caster;
- // Two separate mounts depending on area id (allows use both in and out of specific instance)
- if (unitTarget->GetAreaId() == 3428)
- unitTarget->CastSpell(unitTarget, 25863, false);
- else
- unitTarget->CastSpell(unitTarget, 26655, false);
- break;
- }
- // Piccolo of the Flaming Fire
- case 17512:
- {
- if(!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
- return;
- unitTarget->HandleEmoteCommand(EMOTE_STATE_DANCE);
- break;
- }
- // Netherbloom
- case 28702:
- {
- if(!unitTarget)
- return;
- // 25% chance of casting a random buff
- if(roll_chance_i(75))
- return;
+ // need replace effect 0 item by loot
+ uint32 reagent_id = m_spellInfo->EffectItemType[0];
- // triggered spells are 28703 to 28707
- // Note: some sources say, that there was the possibility of
- // receiving a debuff. However, this seems to be removed by a patch.
- const uint32 spellid = 28703;
+ if(!player->HasItemCount(reagent_id,1))
+ return;
- // don't overwrite an existing aura
- for(uint8 i=0; i<5; i++)
- if(unitTarget->HasAura(spellid+i, 0))
- return;
- unitTarget->CastSpell(unitTarget, spellid+urand(0, 4), true);
- break;
- }
+ // remove reagent
+ uint32 count = 1;
+ player->DestroyItemCount (reagent_id,count,true);
- // Nightmare Vine
- case 28720:
- {
- if(!unitTarget)
- return;
- // 25% chance of casting Nightmare Pollen
- if(roll_chance_i(75))
- return;
- unitTarget->CastSpell(unitTarget, 28721, true);
- break;
- }
+ // create some random items
+ player->AutoStoreLoot(m_spellInfo->Id,LootTemplates_Spell);
- // Mirren's Drinking Hat
- case 29830:
- {
- uint32 item = 0;
- switch ( urand(1,6) )
- {
- case 1: case 2: case 3: item = 23584; break;// Loch Modan Lager
- case 4: case 5: item = 23585; break;// Stouthammer Lite
- case 6: item = 23586; break;// Aerie Peak Pale Ale
+ // learn random explicit discovery recipe (if any)
+ if(uint32 discoveredSpell = GetExplicitDiscoverySpell(m_spellInfo->Id, player))
+ player->learnSpell(discoveredSpell,false);
+ return;
+ }
}
- if (item)
- DoCreateItem(effIndex,item);
break;
}
- // Improved Sprint
- case 30918:
+ case SPELLFAMILY_WARLOCK:
{
- // Removes snares and roots.
- uint32 mechanic_mask = (1<<MECHANIC_ROOT) | (1<<MECHANIC_SNARE);
- Unit::AuraMap& Auras = unitTarget->GetAuras();
- for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
+ switch(m_spellInfo->Id)
{
- next = iter;
- ++next;
- Aura *aur = iter->second;
- if (!aur->IsPositive()) //only remove negative spells
+ // Healthstone creating spells
+ case 6201:
+ case 6202:
+ case 5699:
+ case 11729:
+ case 11730:
+ case 27230:
+ case 47871:
+ case 47878:
{
- // check for mechanic mask
- if(GetSpellMechanicMask(aur->GetSpellProto(), aur->GetEffIndex()) & mechanic_mask)
+ uint32 itemtype;
+ uint32 rank = 0;
+ Unit::AuraList const& mDummyAuras = unitTarget->GetAurasByType(SPELL_AURA_DUMMY);
+ for(Unit::AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
{
- unitTarget->RemoveAurasDueToSpell(aur->GetId());
- if(Auras.empty())
+ if((*i)->GetId() == 18692)
+ {
+ rank = 1;
break;
- else
- next = Auras.begin();
+ }
+ else if((*i)->GetId() == 18693)
+ {
+ rank = 2;
+ break;
+ }
}
- }
- }
- break;
- }
-
- // Goblin Weather Machine
- case 46203:
- {
- if(!unitTarget)
- return;
- uint32 spellId;
- switch(rand()%4)
- {
- case 0:
- spellId=46740;
- break;
- case 1:
- spellId=46739;
- break;
- case 2:
- spellId=46738;
- break;
- case 3:
- spellId=46736;
- break;
- }
- unitTarget->CastSpell(unitTarget, spellId, true);
- break;
- }
- case 48025: // Headless Horseman's Mount
- {
- if(!unitTarget)
- return;
+ static uint32 const itypes[8][3] = {
+ { 5512,19004,19005}, // Minor Healthstone
+ { 5511,19006,19007}, // Lesser Healthstone
+ { 5509,19008,19009}, // Healthstone
+ { 5510,19010,19011}, // Greater Healthstone
+ { 9421,19012,19013}, // Major Healthstone
+ {22103,22104,22105}, // Master Healthstone
+ {36889,36890,36891}, // Demonic Healthstone
+ {36892,36893,36894} // Fel Healthstone
+ };
- if(unitTarget)
- {
- switch(((Player*)unitTarget)->GetBaseSkillValue(762))
+ switch(m_spellInfo->Id)
{
- case 75: unitTarget->CastSpell(unitTarget, 51621, true); break;;
- case 150: unitTarget->CastSpell(unitTarget, 48024, true); break;
- case 225: unitTarget->CastSpell(unitTarget, 51617, true); break;
- case 300: unitTarget->CastSpell(unitTarget, 48023, true); break;
- default: break;
+ case 6201:
+ itemtype=itypes[0][rank];break; // Minor Healthstone
+ case 6202:
+ itemtype=itypes[1][rank];break; // Lesser Healthstone
+ case 5699:
+ itemtype=itypes[2][rank];break; // Healthstone
+ case 11729:
+ itemtype=itypes[3][rank];break; // Greater Healthstone
+ case 11730:
+ itemtype=itypes[4][rank];break; // Major Healthstone
+ case 27230:
+ itemtype=itypes[5][rank];break; // Master Healthstone
+ case 47871:
+ itemtype=itypes[6][rank];break; // Demonic Healthstone
+ case 47878:
+ itemtype=itypes[7][rank];break; // Fel Healthstone
+ default:
+ return;
}
+ DoCreateItem( effIndex, itemtype );
+ return;
}
- break;
+ }
+ break;
}
- case 47977: // Magic Broom
+ case SPELLFAMILY_PRIEST:
{
- if(!unitTarget)
- return;
-
- if(unitTarget)
+ switch(m_spellInfo->Id)
{
- switch(((Player*)unitTarget)->GetBaseSkillValue(762))
+ // Pain and Suffering
+ case 47948:
{
- case 75: unitTarget->CastSpell(unitTarget, 42680, true); break;;
- case 150: case 225: case 300: unitTarget->CastSpell(unitTarget, 42683, true); break;
- default: break;
+ if (!unitTarget)
+ return;
+ // Refresh Shadow Word: Pain on target
+ Unit::AuraMap& auras = unitTarget->GetAuras();
+ for(Unit::AuraMap::iterator itr = auras.begin(); itr != auras.end(); ++itr)
+ {
+ SpellEntry const *spellInfo = (*itr).second->GetSpellProto();
+ if( spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST &&
+ spellInfo->SpellFamilyFlags[0] & 0x8000 &&
+ (*itr).second->GetCasterGUID() == m_caster->GetGUID())
+ {
+ (*itr).second->RefreshAura();
+ return;
+ }
+ }
+ return;
}
+ default:
+ break;
}
break;
}
- }
-
- if(!unitTarget || !unitTarget->isAlive()) // can we remove this check?
- {
- sLog.outError("Spell %u in EffectScriptEffect does not have unitTarget", m_spellInfo->Id);
- return;
- }
-
- switch(m_spellInfo->Id)
- {
- // Dreaming Glory
- case 28698: unitTarget->CastSpell(unitTarget, 28694, true); break;
- // Needle Spine
- //case 39835: unitTarget->CastSpell(unitTarget, 39968, true); break;
- // Draw Soul
- case 40904: unitTarget->CastSpell(m_caster, 40903, true); break;
- // Flame Crash
- //case 41126: unitTarget->CastSpell(unitTarget, 41131, true); break;
- case 41931:
+ case SPELLFAMILY_HUNTER:
{
- int bag=19;
- int slot=0;
- Item* item = NULL;
-
- while (bag < 256)
+ switch(m_spellInfo->Id)
{
- item = ((Player*)m_caster)->GetItemByPos(bag,slot);
- if (item && item->GetEntry() == 38587) break;
- slot++;
- if (slot == 39)
+ // Chimera Shot
+ case 53209:
{
- slot = 0;
- bag++;
+ uint32 spellId = 0;
+ int32 basePoint = 0;
+ Unit::AuraMap& Auras = unitTarget->GetAuras();
+ for(Unit::AuraMap::iterator i = Auras.begin(); i != Auras.end(); ++i)
+ {
+ Aura *aura = (*i).second;
+ if (aura->GetCasterGUID() != m_caster->GetGUID())
+ continue;
+ // Search only Serpent Sting, Viper Sting, Scorpid Sting auras
+ uint64 familyFlag = aura->GetSpellProto()->SpellFamilyFlags;
+ if (!(familyFlag & 0x000000800000C000LL))
+ continue;
+ // Refresh aura duration
+ aura->RefreshAura();
+
+ // Serpent Sting - Instantly deals 40% of the damage done by your Serpent Sting.
+ if (familyFlag & 0x0000000000004000LL && aura->GetEffIndex() == 0)
+ {
+ spellId = 53353; // 53353 Chimera Shot - Serpent
+ basePoint = aura->GetModifier()->m_amount * 5 * 40 / 100;
+ }
+ // Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting.
+ if (familyFlag & 0x0000008000000000LL && aura->GetEffIndex() == 0)
+ {
+ spellId = 53358; // 53358 Chimera Shot - Viper
+ basePoint = aura->GetModifier()->m_amount * 4 * 60 / 100;
+ }
+ // Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute.
+ if (familyFlag & 0x0000000000008000LL)
+ spellId = 53359; // 53359 Chimera Shot - Scorpid
+ // ?? nothing say in spell desc (possibly need addition check)
+ //if (familyFlag & 0x0000010000000000LL || // dot
+ // familyFlag & 0x0000100000000000LL) // stun
+ //{
+ // spellId = 53366; // 53366 Chimera Shot - Wyvern
+ //}
+ }
+ if (spellId)
+ m_caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, false);
+ return;
}
+ default:
+ break;
}
- if (bag < 256)
- {
- if (((Player*)m_caster)->GetItemByPos(bag,slot)->GetCount() == 1) ((Player*)m_caster)->RemoveItem(bag,slot,true);
- else ((Player*)m_caster)->GetItemByPos(bag,slot)->SetCount(((Player*)m_caster)->GetItemByPos(bag,slot)->GetCount()-1);
- // Spell 42518 (Braufest - Gratisprobe des Braufest herstellen)
- m_caster->CastSpell(m_caster,42518,true);
- return;
- }
- }
- // Force Cast - Portal Effect: Sunwell Isle
- case 44876: unitTarget->CastSpell(unitTarget, 44870, true); break;
- //5,000 Gold
- case 46642:
- {
- if(unitTarget->GetTypeId() == TYPEID_PLAYER)
- ((Player*)unitTarget)->ModifyMoney(50000000);
break;
}
- }
-
- if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN )
- {
- switch(m_spellInfo->SpellFamilyFlags)
+ case SPELLFAMILY_PALADIN:
{
// Judgement
- case 0x800000:
+ if (m_spellInfo->SpellFamilyFlags[0] & 0x800000)
{
+ if(!unitTarget || !unitTarget->isAlive())
+ return;
+ uint32 spellId1 = 0;
uint32 spellId2 = 0;
- // all seals have aura dummy
+ // Judgement self add switch
+ switch (m_spellInfo->Id)
+ {
+ case 41467: break; // Judgement
+ case 53407: spellId1 = 20184; break; // Judgement of Justice
+ case 20271: // Judgement of Light
+ case 57774: spellId1 = 20185; break; // Judgement of Light
+ case 53408: spellId1 = 20186; break; // Judgement of Wisdom
+ default:
+ return;
+ }
+ // all seals have aura dummy in 2 effect
Unit::AuraList const& m_dummyAuras = m_caster->GetAurasByType(SPELL_AURA_DUMMY);
for(Unit::AuraList::const_iterator itr = m_dummyAuras.begin(); itr != m_dummyAuras.end(); ++itr)
{
SpellEntry const *spellInfo = (*itr)->GetSpellProto();
-
// search seal (all seals have judgement's aura dummy spell id in 2 effect
- if ( !spellInfo || !IsSealSpell((*itr)->GetSpellProto()) || (*itr)->GetEffIndex() != 2 )
+ if ((*itr)->GetEffIndex() != 2 || !spellInfo || !IsSealSpell(spellInfo))
continue;
-
- // must be calculated base at raw base points in spell proto, GetModifier()->m_value for S.Righteousness modified by SPELLMOD_DAMAGE
- spellId2 = (*itr)->GetSpellProto()->EffectBasePoints[2]+1;
-
- if(spellId2 <= 1)
+ spellId2 = (*itr)->GetModifier()->m_amount;
+ SpellEntry const *judge = sSpellStore.LookupEntry(spellId2);
+ if (!judge)
continue;
+ break;
+ }
+ if (spellId1)
+ m_caster->CastSpell(unitTarget, spellId1, true);
+ if (spellId2)
+ m_caster->CastSpell(unitTarget, spellId2, true);
+ return;
+ }
+ }
+ case SPELLFAMILY_POTION:
+ {
+ switch(m_spellInfo->Id)
+ {
+ // Dreaming Glory
+ case 28698:
+ {
+ if(!unitTarget)
+ return;
+ unitTarget->CastSpell(unitTarget, 28694, true);
+ break;
+ }
+ // Netherbloom
+ case 28702:
+ {
+ if(!unitTarget)
+ return;
+ // 25% chance of casting a random buff
+ if(roll_chance_i(75))
+ return;
- // found, remove seal
- m_caster->RemoveAurasDueToSpell((*itr)->GetId());
-
- // Sanctified Judgement
- Unit::AuraList const& m_auras = m_caster->GetAurasByType(SPELL_AURA_DUMMY);
- for(Unit::AuraList::const_iterator i = m_auras.begin(); i != m_auras.end(); ++i)
- {
- if ((*i)->GetSpellProto()->SpellIconID == 205 && (*i)->GetSpellProto()->Attributes == 0x01D0LL)
- {
- int32 chance = (*i)->GetModifier()->m_amount;
- if ( roll_chance_i(chance) )
- {
- int32 mana = spellInfo->manaCost;
- if ( Player* modOwner = m_caster->GetSpellModOwner() )
- modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_COST, mana);
- mana = int32(mana* 0.8f);
- m_caster->CastCustomSpell(m_caster,31930,&mana,NULL,NULL,true,NULL,*i);
- }
- break;
- }
- }
+ // triggered spells are 28703 to 28707
+ // Note: some sources say, that there was the possibility of
+ // receiving a debuff. However, this seems to be removed by a patch.
+ const uint32 spellid = 28703;
+ // don't overwrite an existing aura
+ for(uint8 i=0; i<5; i++)
+ if(unitTarget->HasAura(spellid+i, 0))
+ return;
+ unitTarget->CastSpell(unitTarget, spellid+urand(0, 4), true);
break;
}
- m_caster->CastSpell(unitTarget,spellId2,true);
- return;
+ // Nightmare Vine
+ case 28720:
+ {
+ if(!unitTarget)
+ return;
+ // 25% chance of casting Nightmare Pollen
+ if(roll_chance_i(75))
+ return;
+ unitTarget->CastSpell(unitTarget, 28721, true);
+ break;
+ }
}
+ break;
}
}
@@ -4950,7 +5227,7 @@ void Spell::EffectSanctuary(uint32 /*i*/)
std::list<Unit*> targets;
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(unitTarget, unitTarget, World::GetMaxVisibleDistance());
- Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(unitTarget, targets, u_check);
unitTarget->VisitNearbyObject(World::GetMaxVisibleDistance(), searcher);
for(std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter)
{
@@ -4970,7 +5247,7 @@ void Spell::EffectSanctuary(uint32 /*i*/)
unitTarget->CombatStop();
unitTarget->getHostilRefManager().deleteReferences(); // stop all fighting
// Vanish allows to remove all threat and cast regular stealth so other spells can be used
- if(m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (m_spellInfo->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE_VANISH))
+ if(m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (m_spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VANISH))
{
((Player *)m_caster)->RemoveSpellsCausingAura(SPELL_AURA_MOD_ROOT);
}
@@ -5005,6 +5282,7 @@ void Spell::EffectDuel(uint32 i)
// Players can only fight a duel with each other outside (=not inside dungeons and not in capital cities)
// Don't have to check the target's map since you cannot challenge someone across maps
if(caster->GetMap()->Instanceable())
+ //if( mapid != 0 && mapid != 1 && mapid != 530 && mapid != 571 && mapid != 609)
{
SendCastResult(SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here
return;
@@ -5030,7 +5308,8 @@ void Spell::EffectDuel(uint32 i)
uint32 gameobject_id = m_spellInfo->EffectMiscValue[i];
Map *map = m_caster->GetMap();
- if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), gameobject_id, map,
+ if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), gameobject_id,
+ map, m_caster->GetPhaseMask(),
m_caster->GetPositionX()+(unitTarget->GetPositionX()-m_caster->GetPositionX())/2 ,
m_caster->GetPositionY()+(unitTarget->GetPositionY()-m_caster->GetPositionY())/2 ,
m_caster->GetPositionZ(),
@@ -5143,6 +5422,43 @@ void Spell::EffectActivateObject(uint32 effect_idx)
sWorld.ScriptCommandStart(activateCommand, delay_secs, m_caster, gameObjTarget);
}
+void Spell::EffectApplyGlyph(uint32 i)
+{
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ Player *player = (Player*)m_caster;
+
+ // remove old glyph
+ if(uint32 oldglyph = player->GetGlyph(m_glyphIndex))
+ {
+ if(GlyphPropertiesEntry const *old_gp = sGlyphPropertiesStore.LookupEntry(oldglyph))
+ {
+ player->RemoveAurasDueToSpell(old_gp->SpellId);
+ player->SetGlyph(m_glyphIndex, 0);
+ }
+ }
+
+ // apply new one
+ if(uint32 glyph = m_spellInfo->EffectMiscValue[i])
+ {
+ if(GlyphPropertiesEntry const *gp = sGlyphPropertiesStore.LookupEntry(glyph))
+ {
+ if(GlyphSlotEntry const *gs = sGlyphSlotStore.LookupEntry(player->GetGlyphSlot(m_glyphIndex)))
+ {
+ if(gp->TypeFlags != gs->TypeFlags)
+ {
+ SendCastResult(SPELL_FAILED_INVALID_GLYPH);
+ return; // glyph slot missmatch
+ }
+ }
+
+ player->CastSpell(m_caster, gp->SpellId, true);
+ player->SetGlyph(m_glyphIndex, glyph);
+ }
+ }
+}
+
void Spell::EffectSummonTotem(uint32 i)
{
uint8 slot = 0;
@@ -5176,7 +5492,8 @@ void Spell::EffectSummonTotem(uint32 i)
Totem* pTotem = new Totem;
- if(!pTotem->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), m_caster->GetMap(), m_spellInfo->EffectMiscValue[i], team ))
+ if(!pTotem->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), m_caster->GetMap(), m_caster->GetPhaseMask(),
+ m_spellInfo->EffectMiscValue[i], team ))
{
delete pTotem;
return;
@@ -5211,10 +5528,9 @@ void Spell::EffectSummonTotem(uint32 i)
}
pTotem->SetUInt32Value(UNIT_CREATED_BY_SPELL,m_spellInfo->Id);
- pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
- pTotem->ApplySpellImmune(m_spellInfo->Id,IMMUNITY_STATE,SPELL_AURA_MOD_FEAR,true);
- pTotem->ApplySpellImmune(m_spellInfo->Id,IMMUNITY_STATE,SPELL_AURA_TRANSFORM,true);
+ if(m_caster->GetTypeId() == TYPEID_PLAYER)
+ pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
pTotem->Summon(m_caster);
@@ -5309,7 +5625,8 @@ void Spell::EffectFeedPet(uint32 i)
Player *_player = (Player*)m_caster;
- if(!itemTarget)
+ Item* foodItem = m_targets.getItemTarget();
+ if(!foodItem)
return;
Pet *pet = _player->GetPet();
@@ -5319,15 +5636,15 @@ void Spell::EffectFeedPet(uint32 i)
if(!pet->isAlive())
return;
- int32 benefit = pet->GetCurrentFoodBenefitLevel(itemTarget->GetProto()->ItemLevel);
+ int32 benefit = pet->GetCurrentFoodBenefitLevel(foodItem->GetProto()->ItemLevel);
if(benefit <= 0)
return;
uint32 count = 1;
- _player->DestroyItemCount(itemTarget,count,true);
+ _player->DestroyItemCount(foodItem,count,true);
// TODO: fix crash when a spell has two effects, both pointed at the same item target
- m_caster->CastCustomSpell(m_caster,m_spellInfo->EffectTriggerSpell[i],&benefit,NULL,NULL,true);
+ m_caster->CastCustomSpell(pet,m_spellInfo->EffectTriggerSpell[i],&benefit,NULL,NULL,true);
}
void Spell::EffectDismissPet(uint32 /*i*/)
@@ -5387,7 +5704,8 @@ void Spell::EffectSummonObject(uint32 i)
m_caster->GetClosePoint(x,y,z,DEFAULT_WORLD_OBJECT_SIZE);
Map *map = m_caster->GetMap();
- if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), go_id, map, x, y, z, m_caster->GetOrientation(), 0, 0, rot2, rot3, 0, 1))
+ if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), go_id, map,
+ m_caster->GetPhaseMask(), x, y, z, m_caster->GetOrientation(), 0, 0, rot2, rot3, 0, 1))
{
delete pGameObj;
return;
@@ -5466,18 +5784,14 @@ void Spell::EffectAddExtraAttacks(uint32 /*i*/)
void Spell::EffectParry(uint32 /*i*/)
{
- if (unitTarget->GetTypeId() == TYPEID_PLAYER)
- {
+ if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
((Player*)unitTarget)->SetCanParry(true);
- }
}
void Spell::EffectBlock(uint32 /*i*/)
{
- if (unitTarget->GetTypeId() != TYPEID_PLAYER)
- return;
-
- ((Player*)unitTarget)->SetCanBlock(true);
+ if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)unitTarget)->SetCanBlock(true);
}
void Spell::EffectMomentMove(uint32 i)
@@ -5489,7 +5803,7 @@ void Spell::EffectMomentMove(uint32 i)
return;
uint32 mapid = m_caster->GetMapId();
- float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
+ float dis = m_caster->GetSpellRadiusForTarget(unitTarget, sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
// src point
float *fx = new float[11], *fy = new float[11], *fz = new float[11];
@@ -5687,8 +6001,8 @@ void Spell::EffectSummonCritter(uint32 i)
Map *map = m_caster->GetMap();
uint32 pet_number = objmgr.GeneratePetNumber();
- if(!critter->Create(objmgr.GenerateLowGuid(HIGHGUID_PET),
- map, pet_entry, pet_number))
+ if(!critter->Create(objmgr.GenerateLowGuid(HIGHGUID_PET), map, m_caster->GetPhaseMask(),
+ pet_entry, pet_number))
{
sLog.outError("Spell::EffectSummonCritter, spellid %u: no such creature entry %u", m_spellInfo->Id, pet_entry);
delete critter;
@@ -5777,14 +6091,16 @@ void Spell::EffectKnockBack(uint32 i)
vcos = dx / dist;
vsin = dy / dist;
}
+ float speedxy = float(m_spellInfo->EffectMiscValue[i])/10;
+ float speedz = float(damage/-10);
WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8+4+4+4+4+4));
data.append(unitTarget->GetPackGUID());
data << uint32(0); // Sequence
data << float(vcos); // x direction
data << float(vsin); // y direction
- data << float(m_spellInfo->EffectMiscValue[i])/10; // Horizontal speed
- data << float(damage/-10); // Z Movement speed (vertical)
+ data << float(speedxy); // Horizontal speed
+ data << float(speedz); // Z Movement speed (vertical)
((Player*)unitTarget)->GetSession()->SendPacket(&data);
}
@@ -5807,17 +6123,26 @@ void Spell::EffectSendTaxi(uint32 i)
uint32 mountid = 0;
switch(m_spellInfo->Id)
{
- case 31606: //Stormcrow Amulet
+ case 31606: //Stormcrow Amulet
mountid = 17447;
break;
- case 45071: //Quest - Sunwell Daily - Dead Scar Bombing Run
- case 45113: //Quest - Sunwell Daily - Ship Bombing Run
- case 45353: //Quest - Sunwell Daily - Ship Bombing Run Return
+ case 45071: //Quest - Sunwell Daily - Dead Scar Bombing Run
+ case 45113: //Quest - Sunwell Daily - Ship Bombing Run
+ case 45353: //Quest - Sunwell Daily - Ship Bombing Run Return
mountid = 22840;
break;
- case 34905: //Stealth Flight
+ case 34905: //Stealth Flight
mountid = 6851;
break;
+ case 45883: //Amber Ledge to Beryl Point
+ mountid = 23524;
+ break;
+ case 46064: //Amber Ledge to Coldarra
+ mountid = 6371;
+ break;
+ case 53335: //Stormwind Harbor Flight - Peaceful
+ mountid = 6852;
+ break;
case 41533: //Fly of the Netherwing
case 41540: //Fly of the Netherwing
mountid = 23468;
@@ -6004,13 +6329,14 @@ void Spell::EffectTransmitted(uint32 effIndex)
//FIXME: this can be better check for most objects but still hack
else if(m_spellInfo->EffectRadiusIndex[effIndex] && m_spellInfo->speed==0)
{
- float dis = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[effIndex]));
+ float dis = GetSpellRadiusForFriend(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[effIndex]));
m_caster->GetClosePoint(fx,fy,fz,DEFAULT_WORLD_OBJECT_SIZE, dis);
}
else
{
- float min_dis = GetSpellMinRange(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
- float max_dis = GetSpellMaxRange(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
+ //GO is always friendly to it's creator, get range for friends
+ float min_dis = GetSpellMinRangeForFriend(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
+ float max_dis = GetSpellMaxRangeForFriend(sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex));
float dis = rand_norm() * (max_dis - min_dis) + min_dis;
m_caster->GetClosePoint(fx,fy,fz,DEFAULT_WORLD_OBJECT_SIZE, dis);
@@ -6039,7 +6365,7 @@ void Spell::EffectTransmitted(uint32 effIndex)
GameObject* pGameObj = new GameObject;
if(!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), name_id, cMap,
- fx, fy, fz, m_caster->GetOrientation(), 0, 0, 0, 0, 100, 1))
+ m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), 0, 0, 0, 0, 100, 1))
{
delete pGameObj;
return;
@@ -6053,9 +6379,9 @@ void Spell::EffectTransmitted(uint32 effIndex)
{
m_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT,pGameObj->GetGUID());
// Orientation3
- pGameObj->SetFloatValue(GAMEOBJECT_ROTATION + 2, 0.88431775569915771 );
+ pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 2, 0.88431775569915771 );
// Orientation4
- pGameObj->SetFloatValue(GAMEOBJECT_ROTATION + 3, -0.4668855369091033 );
+ pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 3, -0.4668855369091033 );
m_caster->AddGameObject(pGameObj); // will removed at spell cancel
// end time of range when possible catch fish (FISHING_BOBBER_READY_TIME..GetDuration(m_spellInfo))
@@ -6110,7 +6436,7 @@ void Spell::EffectTransmitted(uint32 effIndex)
{
GameObject* linkedGO = new GameObject;
if(linkedGO->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, cMap,
- fx, fy, fz, m_caster->GetOrientation(), 0, 0, 0, 0, 100, 1))
+ m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), 0, 0, 0, 0, 100, 1))
{
linkedGO->SetRespawnTime(duration > 0 ? duration/1000 : 0);
//linkedGO->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel() );
@@ -6150,6 +6476,28 @@ void Spell::EffectProspecting(uint32 /*i*/)
((Player*)m_caster)->SendLoot(itemTarget->GetGUID(), LOOT_PROSPECTING);
}
+void Spell::EffectMilling(uint32 /*i*/)
+{
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ Player* p_caster = (Player*)m_caster;
+ if(!itemTarget || !(itemTarget->GetProto()->BagFamily & BAG_FAMILY_MASK_HERBS))
+ return;
+
+ if(itemTarget->GetCount() < 5)
+ return;
+
+ if( sWorld.getConfig(CONFIG_SKILL_MILLING))
+ {
+ uint32 SkillValue = p_caster->GetPureSkillValue(SKILL_INSCRIPTION);
+ uint32 reqSkillValue = itemTarget->GetProto()->RequiredSkillRank;
+ p_caster->UpdateGatherSkill(SKILL_INSCRIPTION, SkillValue, reqSkillValue);
+ }
+
+ ((Player*)m_caster)->SendLoot(itemTarget->GetGUID(), LOOT_MILLING);
+}
+
void Spell::EffectSkill(uint32 /*i*/)
{
sLog.outDebug("WORLD: SkillEFFECT");
@@ -6297,9 +6645,42 @@ void Spell::EffectQuestFail(uint32 i)
((Player*)unitTarget)->FailQuest(m_spellInfo->EffectMiscValue[i]);
}
+void Spell::EffectActivateRune(uint32 eff_idx)
+{
+ if(m_caster->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ Player *plr = (Player*)m_caster;
+
+ if(plr->getClass() != CLASS_DEATH_KNIGHT)
+ return;
+
+ for(uint32 j = 0; j < MAX_RUNES; ++j)
+ {
+ if(plr->GetRuneCooldown(j) && plr->GetCurrentRune(j) == m_spellInfo->EffectMiscValue[eff_idx])
+ {
+ plr->SetRuneCooldown(j, 0);
+ }
+ }
+}
+
+void Spell::EffectTitanGrip(uint32 /*eff_idx*/)
+{
+ if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)unitTarget)->SetCanTitanGrip(true);
+}
+
void Spell::EffectRedirectThreat(uint32 /*i*/)
{
if(unitTarget)
m_caster->SetReducedThreatPercent((uint32)damage, unitTarget->GetGUID());
}
+void Spell::EffectRenamePet(uint32 /*eff_idx*/)
+{
+ if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT ||
+ !((Creature*)unitTarget)->isPet() || ((Pet*)unitTarget)->getPetType() != HUNTER_PET)
+ return;
+
+ unitTarget->SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED);
+}
diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp
index c4bbfe88be4..3c739a85bb0 100644
--- a/src/game/SpellHandler.cpp
+++ b/src/game/SpellHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -38,17 +38,19 @@
void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
{
// TODO: add targets.read() check
- CHECK_PACKET_SIZE(recvPacket,1+1+1+1+8);
+ CHECK_PACKET_SIZE(recvPacket,1+1+1+4+8+4+1);
Player* pUser = _player;
uint8 bagIndex, slot;
- uint8 spell_count; // number of spells at item, not used
+ uint8 unk_flags; // flags (if 0x02 - some additional data are received)
uint8 cast_count; // next cast if exists (single or not)
uint64 item_guid;
+ uint32 glyphIndex; // something to do with glyphs?
+ uint32 spellid; // casted spell id
- recvPacket >> bagIndex >> slot >> spell_count >> cast_count >> item_guid;
+ recvPacket >> bagIndex >> slot >> cast_count >> spellid >> item_guid >> glyphIndex >> unk_flags;
- Item *pItem = pUser->GetItemByPos(bagIndex, slot);
+ Item *pItem = pUser->GetUseableItemByPos(bagIndex, slot);
if(!pItem)
{
pUser->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL );
@@ -61,7 +63,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
return;
}
- sLog.outDetail("WORLD: CMSG_USE_ITEM packet, bagIndex: %u, slot: %u, spell_count: %u , cast_count: %u, Item: %u, data length = %i", bagIndex, slot, spell_count, cast_count, pItem->GetEntry(), recvPacket.size());
+ sLog.outDetail("WORLD: CMSG_USE_ITEM packet, bagIndex: %u, slot: %u, cast_count: %u, spellid: %u, Item: %u, glyphIndex: %u, unk_flags: %u, data length = %i", bagIndex, slot, cast_count, spellid, pItem->GetEntry(), glyphIndex, unk_flags, recvPacket.size());
ItemPrototype const *proto = pItem->GetProto();
if(!proto)
@@ -126,57 +128,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
if(!Script->ItemUse(pUser,pItem,targets))
{
// no script or script not process request by self
-
- // special learning case
- if(pItem->GetProto()->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN)
- {
- uint32 learning_spell_id = pItem->GetProto()->Spells[1].SpellId;
-
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(SPELL_ID_GENERIC_LEARN);
- if(!spellInfo)
- {
- sLog.outError("Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, SPELL_ID_GENERIC_LEARN);
- pUser->SendEquipError(EQUIP_ERR_NONE,pItem,NULL);
- return;
- }
-
- Spell *spell = new Spell(pUser, spellInfo, false);
- spell->m_CastItem = pItem;
- spell->m_cast_count = cast_count; //set count of casts
- spell->m_currentBasePoints[0] = learning_spell_id;
- spell->prepare(&targets);
- return;
- }
-
- // use triggered flag only for items with many spell casts and for not first cast
- int count = 0;
-
- for(int i = 0; i < 5; ++i)
- {
- _Spell const& spellData = pItem->GetProto()->Spells[i];
-
- // no spell
- if(!spellData.SpellId)
- continue;
-
- // wrong triggering type
- if( spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE && spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_NO_DELAY_USE)
- continue;
-
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellData.SpellId);
- if(!spellInfo)
- {
- sLog.outError("Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, spellData.SpellId);
- continue;
- }
-
- Spell *spell = new Spell(pUser, spellInfo, (count > 0));
- spell->m_CastItem = pItem;
- spell->m_cast_count = cast_count; //set count of casts
- spell->prepare(&targets);
-
- ++count;
- }
+ pUser->CastItemUseSpell(pItem,targets,cast_count,glyphIndex);
}
}
@@ -227,7 +179,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket)
}
// required picklocking
- if(lockInfo->requiredlockskill || lockInfo->requiredminingskill)
+ if(lockInfo->Skill[1] || lockInfo->Skill[0])
{
pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, pItem, NULL );
return;
@@ -281,17 +233,28 @@ void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data )
obj->Use(_player);
}
+void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket)
+{
+ CHECK_PACKET_SIZE(recvPacket,8);
+
+ uint64 guid;
+ recvPacket >> guid;
+
+ sLog.outDebug( "WORLD: Recvd CMSG_GAMEOBJ_REPORT_USE Message [in game guid: %u]", GUID_LOPART(guid));
+}
+
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
{
- CHECK_PACKET_SIZE(recvPacket,4+1+2);
+ CHECK_PACKET_SIZE(recvPacket,1+4+1);
uint32 spellId;
- uint8 cast_count;
- recvPacket >> spellId;
+ uint8 cast_count, unk_flags;
recvPacket >> cast_count;
+ recvPacket >> spellId;
+ recvPacket >> unk_flags; // flags (if 0x02 - some additional data are received)
- sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i",
- spellId, cast_count, recvPacket.size());
+ sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u, unk_flags %u, data length = %i",
+ spellId, cast_count, unk_flags, recvPacket.size());
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId );
@@ -301,8 +264,8 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
return;
}
- // not have spell or spell passive and not casted by client
- if ( !_player->HasSpell (spellId) || IsPassiveSpell(spellId) )
+ // not have spell in spellbook or spell passive and not casted by client
+ if ( !_player->HasActiveSpell (spellId) || IsPassiveSpell(spellId) )
{
//cheater? kick? ban?
return;
@@ -334,9 +297,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
void WorldSession::HandleCancelCastOpcode(WorldPacket& recvPacket)
{
- CHECK_PACKET_SIZE(recvPacket,4);
+ CHECK_PACKET_SIZE(recvPacket,5);
+ // increments with every CANCEL packet, don't use for now
+ uint8 counter;
uint32 spellId;
+ recvPacket >> counter;
recvPacket >> spellId;
//FIXME: hack, ignore unexpected client cancel Deadly Throw cast
@@ -363,7 +329,7 @@ void WorldSession::HandleCancelAuraOpcode( WorldPacket& recvPacket)
return;
// lifebloom must delete final heal effect
- if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && (spellInfo->SpellFamilyFlags & 0x1000000000LL) )
+ if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && (spellInfo->SpellFamilyFlags[1] & 0x10) )
{
Unit::AuraMap::iterator iter;
while((iter = _player->m_Auras.find(Unit::spellEffectPair(spellId, 1))) != _player->m_Auras.end())
@@ -420,7 +386,7 @@ void WorldSession::HandlePetCancelAuraOpcode( WorldPacket& recvPacket)
return;
}
- Creature* pet=ObjectAccessor::GetCreatureOrPet(*_player,guid);
+ Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid);
if(!pet)
{
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 43ee5d7d4a5..95a52acf57c 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -26,6 +26,7 @@
#include "World.h"
#include "Chat.h"
#include "Spell.h"
+#include "BattleGroundMgr.h"
bool IsAreaEffectTarget[TOTAL_SPELL_TARGETS];
@@ -38,25 +39,25 @@ SpellMgr::SpellMgr()
case SPELL_EFFECT_PERSISTENT_AREA_AURA: //27
case SPELL_EFFECT_SUMMON: //28
case SPELL_EFFECT_TRIGGER_MISSILE: //32
- case SPELL_EFFECT_SUMMON_WILD: //41
- case SPELL_EFFECT_SUMMON_GUARDIAN: //42
+ //case SPELL_EFFECT_SUMMON_WILD: //41 not 303
+ //case SPELL_EFFECT_SUMMON_GUARDIAN: //42 not 303
case SPELL_EFFECT_TRANS_DOOR: //50 summon object
case SPELL_EFFECT_SUMMON_PET: //56
case SPELL_EFFECT_ADD_FARSIGHT: //72
- case SPELL_EFFECT_SUMMON_POSSESSED: //73
- case SPELL_EFFECT_SUMMON_TOTEM: //74
+ //case SPELL_EFFECT_SUMMON_POSSESSED: //73
+ //case SPELL_EFFECT_SUMMON_TOTEM: //74
case SPELL_EFFECT_SUMMON_OBJECT_WILD: //76
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: //87
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: //88
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: //89
- case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: //90
- case SPELL_EFFECT_SUMMON_CRITTER: //97
+ //case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: //87
+ //case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: //88
+ //case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: //89
+ //case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: //90
+ //case SPELL_EFFECT_SUMMON_CRITTER: //97 not 303
case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: //104
case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: //105
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: //106
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: //107
case SPELL_EFFECT_SUMMON_DEAD_PET: //109
- case SPELL_EFFECT_SUMMON_DEMON: //112
+ //case SPELL_EFFECT_SUMMON_DEMON: //112 not 303
case SPELL_EFFECT_TRIGGER_SPELL_2: //151 ritual of summon
EffectTargetType[i] = SPELL_REQUIRE_DEST;
break;
@@ -105,7 +106,6 @@ SpellMgr::SpellMgr()
case TARGET_UNIT_TARGET_ALLY:
case TARGET_UNIT_TARGET_RAID:
case TARGET_UNIT_TARGET_ANY:
- case TARGET_UNIT_SINGLE_UNKNOWN:
case TARGET_UNIT_TARGET_ENEMY:
case TARGET_UNIT_TARGET_PARTY:
case TARGET_UNIT_PARTY_TARGET:
@@ -244,19 +244,8 @@ uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell)
int32 castTime = spellCastTimeEntry->CastTime;
- if (spell)
- {
- if(Player* modOwner = spell->GetCaster()->GetSpellModOwner())
- modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell);
-
- if( !(spellInfo->Attributes & (SPELL_ATTR_UNK4|SPELL_ATTR_UNK5)) )
- castTime = int32(castTime * spell->GetCaster()->GetFloatValue(UNIT_MOD_CAST_SPEED));
- else
- {
- if (spell->IsRangedSpell() && !spell->IsAutoRepeat())
- castTime = int32(castTime * spell->GetCaster()->m_modAttackSpeedPct[RANGED_ATTACK]);
- }
- }
+ if (spell && spell->GetCaster())
+ spell->GetCaster()->ModSpellCastTime(spellInfo, castTime);
if (spellInfo->Attributes & SPELL_ATTR_RANGED && (!spell || !(spell->IsAutoRepeat())))
castTime += 500;
@@ -328,17 +317,17 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
case SPELLFAMILY_MAGE:
{
// family flags 18(Molten), 25(Frost/Ice), 28(Mage)
- if (spellInfo->SpellFamilyFlags & 0x12040000)
+ if (spellInfo->SpellFamilyFlags[0] & 0x12040000)
return SPELL_MAGE_ARMOR;
- if ((spellInfo->SpellFamilyFlags & 0x1000000) && spellInfo->EffectApplyAuraName[0]==SPELL_AURA_MOD_CONFUSE)
+ if ((spellInfo->SpellFamilyFlags[0] & 0x1000000) && spellInfo->EffectApplyAuraName[0]==SPELL_AURA_MOD_CONFUSE)
return SPELL_MAGE_POLYMORPH;
break;
}
case SPELLFAMILY_WARRIOR:
{
- if (spellInfo->SpellFamilyFlags & 0x00008000010000LL)
+ if (spellInfo->SpellFamilyFlags[1] & 0x000080 || spellInfo->SpellFamilyFlags[0] & 0x10000LL)
return SPELL_POSITIVE_SHOUT;
break;
@@ -349,12 +338,12 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
if (spellInfo->Dispel == DISPEL_CURSE)
return SPELL_CURSE;
- // family flag 37 (only part spells have family name)
- if (spellInfo->SpellFamilyFlags & 0x2000000000LL)
+ // Warlock (Demon Armor | Demon Skin | Fel Armor)
+ if (spellInfo->SpellFamilyFlags[1] & 0x20000020 || spellInfo->SpellFamilyFlags[2] & 0x00000010)
return SPELL_WARLOCK_ARMOR;
//seed of corruption and corruption
- if (spellInfo->SpellFamilyFlags & 0x1000000002LL)
+ if (spellInfo->SpellFamilyFlags[1] & 0x10 || spellInfo->SpellFamilyFlags[0] & 0x2)
return SPELL_WARLOCK_CORRUPTION;
break;
}
@@ -364,6 +353,13 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
if (spellInfo->Dispel == DISPEL_POISON)
return SPELL_STING;
+ // only hunter aspects have this
+ if( spellInfo->SpellFamilyFlags[1] & 0x00440000 || spellInfo->SpellFamilyFlags[0] & 0x00380000 || spellInfo->SpellFamilyFlags[2] & 0x00003010)
+ return SPELL_ASPECT;
+
+ if( spellInfo->SpellFamilyFlags[2] & 0x00000002 )
+ return SPELL_TRACKER;
+
break;
}
case SPELLFAMILY_PALADIN:
@@ -371,16 +367,16 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
if (IsSealSpell(spellInfo))
return SPELL_SEAL;
- if (spellInfo->SpellFamilyFlags & 0x10000100LL)
+ if (spellInfo->SpellFamilyFlags[0] & 0x11010002)
return SPELL_BLESSING;
- if ((spellInfo->SpellFamilyFlags & 0x00000820180400LL) && (spellInfo->AttributesEx3 & 0x200))
+ if ((spellInfo->SpellFamilyFlags[1] & 0x000008 || spellInfo->SpellFamilyFlags[0] & 20180400) && (spellInfo->AttributesEx3 & 0x200))
return SPELL_JUDGEMENT;
for (int i = 0; i < 3; i++)
{
- // only paladin auras have this
- if (spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
+ // only paladin auras have this (for palaldin class family)
+ if (spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_RAID)
return SPELL_AURA;
}
break;
@@ -395,19 +391,11 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
case SPELLFAMILY_POTION:
return spellmgr.GetSpellElixirSpecific(spellInfo->Id);
- }
- // only warlock armor/skin have this (in additional to family cases)
- if( spellInfo->SpellVisual == 130 && spellInfo->SpellIconID == 89)
- {
- return SPELL_WARLOCK_ARMOR;
- }
-
- // only hunter aspects have this (but not all aspects in hunter family)
- if( spellInfo->activeIconID == 122 && (GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_NATURE) &&
- (spellInfo->Attributes & 0x50000) != 0 && (spellInfo->Attributes & 0x9000010) == 0)
- {
- return SPELL_ASPECT;
+ case SPELLFAMILY_DEATHKNIGHT:
+ if ((spellInfo->Attributes & 0x10) && (spellInfo->AttributesEx2 & 0x10) && (spellInfo->AttributesEx4 & 0x200000))
+ return SPELL_PRESENCE;
+ break;
}
for(int i = 0; i < 3; ++i)
@@ -416,10 +404,6 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
{
switch(spellInfo->EffectApplyAuraName[i])
{
- case SPELL_AURA_TRACK_CREATURES:
- case SPELL_AURA_TRACK_RESOURCES:
- case SPELL_AURA_TRACK_STEALTHED:
- return SPELL_TRACKER;
case SPELL_AURA_MOD_CHARM:
case SPELL_AURA_MOD_POSSESS_PET:
case SPELL_AURA_MOD_POSSESS:
@@ -427,7 +411,6 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
}
}
}
-
// elixirs can have different families, but potion most ofc.
if(SpellSpecific sp = spellmgr.GetSpellElixirSpecific(spellInfo->Id))
return sp;
@@ -463,6 +446,7 @@ bool IsSingleFromSpellSpecificPerTarget(uint32 spellSpec1,uint32 spellSpec2)
case SPELL_MAGE_ARMOR:
case SPELL_ELEMENTAL_SHIELD:
case SPELL_MAGE_POLYMORPH:
+ case SPELL_PRESENCE:
case SPELL_WELL_FED:
case SPELL_DRINK:
case SPELL_FOOD:
@@ -496,8 +480,6 @@ bool IsPositiveTarget(uint32 targetA, uint32 targetB)
case TARGET_CURRENT_ENEMY_COORDINATES:
case TARGET_UNIT_CHANNEL:
return false;
- case TARGET_ALL_AROUND_CASTER:
- return (targetB == TARGET_ALL_PARTY || targetB == TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER);
default:
break;
}
@@ -906,8 +888,8 @@ void SpellMgr::LoadSpellAffects()
uint32 count = 0;
- // 0 1 2
- QueryResult *result = WorldDatabase.Query("SELECT entry, effectId, SpellFamilyMask FROM spell_affect");
+ // 0 1 2 3 4
+ QueryResult *result = WorldDatabase.Query("SELECT entry, effectId, SpellClassMask0, SpellClassMask1, SpellClassMask2 FROM spell_affect");
if( !result )
{
@@ -954,26 +936,22 @@ void SpellMgr::LoadSpellAffects()
continue;
}
- uint64 spellAffectMask = fields[2].GetUInt64();
+ flag96 affect(fields[2].GetUInt32(), fields[3].GetUInt32(), fields[4].GetUInt32());
- // Spell.dbc have own data for low part of SpellFamilyMask
- if( spellInfo->EffectItemType[effectId])
- {
- if(spellInfo->EffectItemType[effectId] == spellAffectMask)
- {
- sLog.outErrorDb("Spell %u listed in `spell_affect` have redundant (same with EffectItemType%d) data for effect index (%u) and not needed, skipped.", entry,effectId+1,effectId);
- continue;
- }
+ // Spell.dbc have own data
+ if (effectId>3)
+ continue;
- // 24429 have wrong data in EffectItemType and overwrites by DB, possible bug in client
- if(spellInfo->Id!=24429 && spellInfo->EffectItemType[effectId] != spellAffectMask)
- {
- sLog.outErrorDb("Spell %u listed in `spell_affect` have different low part from EffectItemType%d for effect index (%u) and not needed, skipped.", entry,effectId+1,effectId);
- continue;
- }
+ flag96 dbc_affect;
+ dbc_affect = spellInfo->EffectSpellClassMask[effectId];
+ if(dbc_affect[0] == affect[0] || dbc_affect[1] == affect[1] || dbc_affect[2] == affect[2])
+ {
+ char text[]="ABC";
+ sLog.outErrorDb("Spell %u listed in `spell_affect` have redundant (same with EffectSpellClassMask%c) data for effect index (%u) and not needed, skipped.", entry, text[effectId], effectId);
+ continue;
}
- mSpellAffectMap.insert(SpellAffectMap::value_type((entry<<8) + effectId,spellAffectMask));
+ mSpellAffectMap[(entry<<8) + effectId] = affect;
++count;
} while( result->NextRow() );
@@ -981,7 +959,7 @@ void SpellMgr::LoadSpellAffects()
delete result;
sLog.outString();
- sLog.outString( ">> Loaded %u spell affect definitions", count );
+ sLog.outString( ">> Loaded %u custom spell affect definitions", count );
for (uint32 id = 0; id < sSpellStore.GetNumRows(); ++id)
{
@@ -997,7 +975,9 @@ void SpellMgr::LoadSpellAffects()
spellInfo->EffectApplyAuraName[effectId] != SPELL_AURA_ADD_TARGET_TRIGGER) )
continue;
- if(spellInfo->EffectItemType[effectId] != 0)
+ flag96 dbc_affect;
+ dbc_affect = spellInfo->EffectSpellClassMask[effectId];
+ if(dbc_affect)
continue;
if(mSpellAffectMap.find((id<<8) + effectId) != mSpellAffectMap.end())
@@ -1008,33 +988,19 @@ void SpellMgr::LoadSpellAffects()
}
}
-bool SpellMgr::IsAffectedBySpell(SpellEntry const *spellInfo, uint32 spellId, uint8 effectId, uint64 familyFlags) const
+bool SpellMgr::IsAffectedByMod(SpellEntry const *spellInfo, SpellModifier *mod) const
{
// false for spellInfo == NULL
- if (!spellInfo)
+ if (!spellInfo || !mod)
return false;
- SpellEntry const *affect_spell = sSpellStore.LookupEntry(spellId);
- // false for affect_spell == NULL
- if (!affect_spell)
+ SpellEntry const *affect_spell = sSpellStore.LookupEntry(mod->spellId);
+ // False if affect_spell == NULL or spellFamily not equal
+ if (!affect_spell || affect_spell->SpellFamilyName != spellInfo->SpellFamilyName)
return false;
- // False if spellFamily not equal
- if (affect_spell->SpellFamilyName != spellInfo->SpellFamilyName)
- return false;
-
- // If familyFlags == 0
- if (!familyFlags)
- {
- // Get it from spellAffect table
- familyFlags = GetSpellAffectMask(spellId,effectId);
- // false if familyFlags == 0
- if (!familyFlags)
- return false;
- }
-
// true
- if (familyFlags & spellInfo->SpellFamilyFlags)
+ if (mod->mask & spellInfo->SpellFamilyFlags)
return true;
return false;
@@ -1046,15 +1012,12 @@ void SpellMgr::LoadSpellProcEvents()
uint32 count = 0;
- // 0 1 2 3 4 5 6 7 8
- QueryResult *result = WorldDatabase.Query("SELECT entry, SchoolMask, SpellFamilyName, SpellFamilyMask, procFlags, procEx, ppmRate, CustomChance, Cooldown FROM spell_proc_event");
+ // 0 1 2 3 4 5 6 7 8 9 10
+ QueryResult *result = WorldDatabase.Query("SELECT entry, SchoolMask, SpellFamilyName, SpellFamilyMask0, SpellFamilyMask1, SpellFamilyMask2, procFlags, procEx, ppmRate, CustomChance, Cooldown FROM spell_proc_event");
if( !result )
{
-
barGoLink bar( 1 );
-
bar.step();
-
sLog.outString();
sLog.outString( ">> Loaded %u spell proc event conditions", count );
return;
@@ -1068,7 +1031,7 @@ void SpellMgr::LoadSpellProcEvents()
bar.step();
- uint16 entry = fields[0].GetUInt16();
+ uint32 entry = fields[0].GetUInt32();
const SpellEntry *spell = sSpellStore.LookupEntry(entry);
if (!spell)
@@ -1081,12 +1044,14 @@ void SpellMgr::LoadSpellProcEvents()
spe.schoolMask = fields[1].GetUInt32();
spe.spellFamilyName = fields[2].GetUInt32();
- spe.spellFamilyMask = fields[3].GetUInt64();
- spe.procFlags = fields[4].GetUInt32();
- spe.procEx = fields[5].GetUInt32();
- spe.ppmRate = fields[6].GetFloat();
- spe.customChance = fields[7].GetFloat();
- spe.cooldown = fields[8].GetUInt32();
+ spe.spellFamilyMask[0] = fields[3].GetUInt32();
+ spe.spellFamilyMask[1] = fields[4].GetUInt32();
+ spe.spellFamilyMask[2] = fields[5].GetUInt32();
+ spe.procFlags = fields[6].GetUInt32();
+ spe.procEx = fields[7].GetUInt32();
+ spe.ppmRate = fields[8].GetFloat();
+ spe.customChance = fields[9].GetFloat();
+ spe.cooldown = fields[10].GetUInt32();
mSpellProcEventMap[entry] = spe;
@@ -1106,80 +1071,54 @@ void SpellMgr::LoadSpellProcEvents()
sLog.outString();
if (customProc)
- sLog.outString( ">> Loaded %u custom spell proc event conditions +%u custom", count, customProc );
+ sLog.outString( ">> Loaded %u extra spell proc event conditions +%u custom", count, customProc );
else
- sLog.outString( ">> Loaded %u spell proc event conditions", count );
+ sLog.outString( ">> Loaded %u extra spell proc event conditions", count );
+}
- /*
- // Commented for now, as it still produces many errors (still quite many spells miss spell_proc_event)
- for (uint32 id = 0; id < sSpellStore.GetNumRows(); ++id)
+void SpellMgr::LoadSpellBonusess()
+{
+ mSpellBonusMap.clear(); // need for reload case
+ uint32 count = 0;
+ // 0 1 2 3
+ QueryResult *result = WorldDatabase.Query("SELECT entry, direct_bonus, dot_bonus, ap_bonus FROM spell_bonus_data");
+ if( !result )
{
- SpellEntry const* spellInfo = sSpellStore.LookupEntry(id);
- if (!spellInfo)
- continue;
-
- bool found = false;
- for (int effectId = 0; effectId < 3; ++effectId)
- {
- // at this moment check only SPELL_AURA_PROC_TRIGGER_SPELL
- if( spellInfo->EffectApplyAuraName[effectId] == SPELL_AURA_PROC_TRIGGER_SPELL )
- {
- found = true;
- break;
- }
- }
+ barGoLink bar( 1 );
+ bar.step();
+ sLog.outString();
+ sLog.outString( ">> Loaded %u spell bonus data", count);
+ return;
+ }
- if(!found)
- continue;
+ barGoLink bar( result->GetRowCount() );
+ do
+ {
+ Field *fields = result->Fetch();
+ bar.step();
+ uint32 entry = fields[0].GetUInt32();
- if(GetSpellProcEvent(id))
+ const SpellEntry *spell = sSpellStore.LookupEntry(entry);
+ if (!spell)
+ {
+ sLog.outErrorDb("Spell %u listed in `spell_bonus_data` does not exist", entry);
continue;
+ }
- sLog.outErrorDb("Spell %u (%s) misses spell_proc_event",id,spellInfo->SpellName[sWorld.GetDBClang()]);
- }
- */
-}
-
-/*
-bool SpellMgr::IsSpellProcEventCanTriggeredBy( SpellProcEventEntry const * spellProcEvent, SpellEntry const * procSpell, uint32 procFlags )
-{
- if((procFlags & spellProcEvent->procFlags) == 0)
- return false;
+ SpellBonusEntry sbe;
- // Additional checks in case spell cast/hit/crit is the event
- // Check (if set) school, category, skill line, spell talent mask
- if(spellProcEvent->schoolMask && (!procSpell || (GetSpellSchoolMask(procSpell) & spellProcEvent->schoolMask) == 0))
- return false;
- if(spellProcEvent->category && (!procSpell || procSpell->Category != spellProcEvent->category))
- return false;
- if(spellProcEvent->skillId)
- {
- if (!procSpell)
- return false;
+ sbe.direct_damage = fields[1].GetFloat();
+ sbe.dot_damage = fields[2].GetFloat();
+ sbe.ap_bonus = fields[3].GetFloat();
- SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(procSpell->Id);
- SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(procSpell->Id);
+ mSpellBonusMap[entry] = sbe;
+ } while( result->NextRow() );
- bool found = false;
- for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
- {
- if(_spell_idx->second->skillId == spellProcEvent->skillId)
- {
- found = true;
- break;
- }
- }
- if (!found)
- return false;
- }
- if(spellProcEvent->spellFamilyName && (!procSpell || spellProcEvent->spellFamilyName != procSpell->SpellFamilyName))
- return false;
- if(spellProcEvent->spellFamilyMask && (!procSpell || (spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags) == 0))
- return false;
+ delete result;
- return true;
+ sLog.outString();
+ sLog.outString( ">> Loaded %u extra spell bonus data", count);
}
-*/
bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const * spellProcEvent, uint32 EventProcFlag, SpellEntry const * procSpell, uint32 procFlags, uint32 procExtra, bool active)
{
@@ -1191,7 +1130,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const * spellP
return false;
// Always trigger for this
- if (EventProcFlag & (PROC_FLAG_KILLED | PROC_FLAG_KILL_AND_GET_XP))
+ if (EventProcFlag & (PROC_FLAG_KILLED | PROC_FLAG_KILL | PROC_FLAG_ON_TRAP_ACTIVATION))
return true;
if (spellProcEvent) // Exist event data
@@ -1219,7 +1158,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const * spellP
// spellFamilyName is Ok need check for spellFamilyMask if present
if(spellProcEvent->spellFamilyMask)
{
- if ((spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags) == 0)
+ if ((spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags ) == 0)
return false;
active = true; // Spell added manualy -> so its active spell
}
@@ -1318,28 +1257,38 @@ bool SpellMgr::IsRankSpellDueToSpell(SpellEntry const *spellInfo_1,uint32 spellI
bool SpellMgr::canStackSpellRanks(SpellEntry const *spellInfo)
{
+ if(IsPassiveSpell(spellInfo->Id)) // ranked passive spell
+ return false;
if(spellInfo->powerType != POWER_MANA && spellInfo->powerType != POWER_HEALTH)
return false;
- if(IsProfessionSpell(spellInfo->Id))
+ if(IsProfessionOrRidingSpell(spellInfo->Id))
+ return false;
+
+ if(spellmgr.IsSkillBonusSpell(spellInfo->Id))
return false;
// All stance spells. if any better way, change it.
for (int i = 0; i < 3; i++)
{
- // Paladin aura Spell
- if(spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN
- && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
- return false;
- // Druid form Spell
- if(spellInfo->SpellFamilyName == SPELLFAMILY_DRUID
- && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AURA
- && spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_SHAPESHIFT)
- return false;
- // Rogue Stealth
- if(spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE
- && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AURA
- && spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_SHAPESHIFT)
- return false;
+ switch(spellInfo->SpellFamilyName)
+ {
+ case SPELLFAMILY_PALADIN:
+ // Paladin aura Spell
+ if (spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AREA_AURA_RAID)
+ return false;
+ break;
+ case SPELLFAMILY_DRUID:
+ // Druid form Spell
+ if (spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AURA &&
+ spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_SHAPESHIFT)
+ return false;
+ break;
+ case SPELLFAMILY_ROGUE:
+ // Rogue Stealth
+ if (spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AURA &&
+ spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_SHAPESHIFT)
+ return false;
+ }
}
return true;
}
@@ -1368,6 +1317,11 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool
if(spellInfo_1->SpellFamilyName != spellInfo_2->SpellFamilyName)
return false;
+ // TODO: Is this needed?
+ // Allow stack passive and not passive spells
+ if ((spellInfo_1->Attributes & SPELL_ATTR_PASSIVE)!=(spellInfo_2->Attributes & SPELL_ATTR_PASSIVE))
+ return false;
+
// generic spells
if(!spellInfo_1->SpellFamilyName)
{
@@ -1422,6 +1376,21 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool
return true;
}
+
+bool SpellMgr::IsProfessionOrRidingSpell(uint32 spellId)
+{
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
+ if(!spellInfo)
+ return false;
+
+ if(spellInfo->Effect[1] != SPELL_EFFECT_SKILL)
+ return false;
+
+ uint32 skill = spellInfo->EffectMiscValue[1];
+
+ return IsProfessionOrRidingSkill(skill);
+}
+
bool SpellMgr::IsProfessionSpell(uint32 spellId)
{
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
@@ -1455,6 +1424,24 @@ bool SpellMgr::IsPrimaryProfessionFirstRankSpell(uint32 spellId) const
return IsPrimaryProfessionSpell(spellId) && GetSpellRank(spellId)==1;
}
+bool SpellMgr::IsSkillBonusSpell(uint32 spellId) const
+{
+ SkillLineAbilityMap::const_iterator lower = GetBeginSkillLineAbilityMap(spellId);
+ SkillLineAbilityMap::const_iterator upper = GetEndSkillLineAbilityMap(spellId);
+
+ for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
+ {
+ SkillLineAbilityEntry const *pAbility = _spell_idx->second;
+ if (!pAbility || pAbility->learnOnGetSkill != ABILITY_LEARNED_ON_GET_PROFESSION_SKILL)
+ continue;
+
+ if(pAbility->req_skill_value > 0)
+ return true;
+ }
+
+ return false;
+}
+
SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const
{
// ignore passive spells
@@ -1466,7 +1453,8 @@ SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spell
{
if( IsPositiveEffect(spellInfo->Id, i) && (
spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA ||
- spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY
+ spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ||
+ spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_RAID
) )
{
needRankSelection = true;
@@ -1541,21 +1529,31 @@ struct SpellRankEntry
uint32 RangeIndex;
uint32 SpellVisual;
uint32 ProcFlags;
- uint64 SpellFamilyFlags;
+ flag96 SpellFamilyFlags;
uint32 TargetAuraState;
uint32 ManaCost;
-
- bool operator()(const SpellRankEntry & _Left,const SpellRankEntry & _Right)const
- {
- return (_Left.SkillId != _Right.SkillId ? _Left.SkillId < _Right.SkillId
- : _Left.SpellName!=_Right.SpellName ? _Left.SpellName < _Right.SpellName
- : _Left.ProcFlags!=_Right.ProcFlags ? _Left.ProcFlags < _Right.ProcFlags
- : _Left.SpellFamilyFlags!=_Right.SpellFamilyFlags ? _Left.SpellFamilyFlags < _Right.SpellFamilyFlags
- : (_Left.SpellVisual!=_Right.SpellVisual) && (!_Left.SpellVisual || !_Right.SpellVisual) ? _Left.SpellVisual < _Right.SpellVisual
- : (_Left.ManaCost!=_Right.ManaCost) && (!_Left.ManaCost || !_Right.ManaCost) ? _Left.ManaCost < _Right.ManaCost
- : (_Left.DurationIndex!=_Right.DurationIndex) && (!_Left.DurationIndex || !_Right.DurationIndex)? _Left.DurationIndex < _Right.DurationIndex
- : (_Left.RangeIndex!=_Right.RangeIndex) && (!_Left.RangeIndex || !_Right.RangeIndex || _Left.RangeIndex==1 || !_Right.RangeIndex==1) ? _Left.RangeIndex < _Right.RangeIndex
- : _Left.TargetAuraState < _Right.TargetAuraState
+ uint32 CastingTimeIndex;
+ flag96 Effect;
+ flag96 Aura;
+ uint16 TalentID;
+
+ bool operator < (const SpellRankEntry & _Right) const
+ {
+ return (SkillId != _Right.SkillId ? SkillId < _Right.SkillId
+ : SpellName!=_Right.SpellName ? SpellName < _Right.SpellName
+ : ProcFlags!=_Right.ProcFlags ? ProcFlags < _Right.ProcFlags
+
+ : Effect!=_Right.Effect ? Effect < _Right.Effect
+ : Aura!=_Right.Aura ? Aura < _Right.Aura
+ : TalentID!=_Right.TalentID ? TalentID < _Right.TalentID
+ : (CastingTimeIndex!=_Right.CastingTimeIndex) && (!CastingTimeIndex || !_Right.CastingTimeIndex || CastingTimeIndex==1 || !_Right.CastingTimeIndex==1) ? CastingTimeIndex < _Right.CastingTimeIndex
+
+ : SpellFamilyFlags!=_Right.SpellFamilyFlags ? SpellFamilyFlags < _Right.SpellFamilyFlags
+ : (SpellVisual!=_Right.SpellVisual) && (!SpellVisual || !_Right.SpellVisual) ? SpellVisual < _Right.SpellVisual
+ : (ManaCost!=_Right.ManaCost) && (!ManaCost || !_Right.ManaCost) ? ManaCost < _Right.ManaCost
+ : (DurationIndex!=_Right.DurationIndex) && (!DurationIndex || !_Right.DurationIndex)? DurationIndex < _Right.DurationIndex
+ : (RangeIndex!=_Right.RangeIndex) && (!RangeIndex || !_Right.RangeIndex || RangeIndex==1 || !_Right.RangeIndex==1) ? RangeIndex < _Right.RangeIndex
+ : TargetAuraState < _Right.TargetAuraState
);
}
};
@@ -1564,6 +1562,7 @@ struct SpellRankValue
{
uint32 Id;
char const *Rank;
+ bool strict;
};
void SpellMgr::LoadSpellChains()
@@ -1576,14 +1575,12 @@ void SpellMgr::LoadSpellChains()
SkillLineAbilityEntry const *AbilityInfo=sSkillLineAbilityStore.LookupEntry(ability_id);
if (!AbilityInfo)
continue;
- if (AbilityInfo->spellId==20154) //exception to these rules (not needed in 3.0.3)
- continue;
if (!AbilityInfo->forward_spellid)
continue;
ChainedSpells.push_back(AbilityInfo->forward_spellid);
}
- std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry> RankMap;
+ std::multimap<SpellRankEntry, SpellRankValue> RankMap;
for (uint32 ability_id=0;ability_id<sSkillLineAbilityStore.GetNumRows();ability_id++)
{
@@ -1593,8 +1590,6 @@ void SpellMgr::LoadSpellChains()
//get only spell with lowest ability_id to prevent doubles
uint32 spell_id=AbilityInfo->spellId;
- if (spell_id==20154) //exception to these rules (not needed in 3.0.3)
- continue;
bool found=false;
for (uint32 i=0; i<ChainedSpells.size(); i++)
{
@@ -1613,7 +1608,7 @@ void SpellMgr::LoadSpellChains()
if(sRank.empty())
continue;
//exception to polymorph spells-make pig and turtle other chain than sheep
- if ((SpellInfo->SpellFamilyName==SPELLFAMILY_MAGE) && (SpellInfo->SpellFamilyFlags & 0x1000000) && (SpellInfo->SpellIconID!=82))
+ if ((SpellInfo->SpellFamilyName==SPELLFAMILY_MAGE) && (SpellInfo->SpellFamilyFlags[0] & 0x1000000) && (SpellInfo->SpellIconID!=82))
continue;
SpellRankEntry entry;
@@ -1625,14 +1620,16 @@ void SpellMgr::LoadSpellChains()
entry.ProcFlags=SpellInfo->procFlags;
entry.SpellFamilyFlags=SpellInfo->SpellFamilyFlags;
entry.TargetAuraState=SpellInfo->TargetAuraState;
- entry.SpellVisual=SpellInfo->SpellVisual;
+ entry.SpellVisual=SpellInfo->SpellVisual[0];
entry.ManaCost=SpellInfo->manaCost;
-
+ entry.CastingTimeIndex=0;
+ entry.TalentID=0;
for (;;)
{
AbilityInfo=mSkillLineAbilityMap.lower_bound(spell_id)->second;
value.Id=spell_id;
value.Rank=SpellInfo->Rank[sWorld.GetDefaultDbcLocale()];
+ value.strict=false;
RankMap.insert(std::pair<SpellRankEntry, SpellRankValue>(entry,value));
spell_id=AbilityInfo->forward_spellid;
SpellInfo=sSpellStore.LookupEntry(spell_id);
@@ -1645,48 +1642,109 @@ void SpellMgr::LoadSpellChains()
uint32 count=0;
- for (std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator itr = RankMap.begin();itr!=RankMap.end();)
+ for (std::multimap<SpellRankEntry, SpellRankValue>::iterator itr = RankMap.begin();itr!=RankMap.end();)
{
SpellRankEntry entry=itr->first;
//trac errors in extracted data
- std::multimap<char const *, std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator> RankErrorMap;
- for (std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator itr2 = RankMap.lower_bound(entry);itr2!=RankMap.upper_bound(entry);itr2++)
+ std::multimap<char const *, std::multimap<SpellRankEntry, SpellRankValue>::iterator> RankErrorMap;
+ for (std::multimap<SpellRankEntry, SpellRankValue>::iterator itr2 = RankMap.lower_bound(entry);itr2!=RankMap.upper_bound(entry);itr2++)
{
bar.step();
- RankErrorMap.insert(std::pair<char const *, std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator>(itr2->second.Rank,itr2));
- }
- for (std::multimap<char const *, std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator>::iterator itr2 = RankErrorMap.begin();itr2!=RankErrorMap.end();)
- {
- char const * err_entry=itr2->first;
- uint32 rank_count=RankErrorMap.count(itr2->first);
- if (rank_count>1)
- for (itr2 = RankErrorMap.lower_bound(err_entry);itr2!=RankErrorMap.upper_bound(err_entry);itr2++)
+ RankErrorMap.insert(std::pair<char const *, std::multimap<SpellRankEntry, SpellRankValue>::iterator>(itr2->second.Rank,itr2));
+ }
+
+ bool error=false;
+ //if strict == true strict check is not needed
+ if (!itr->second.strict)
+ //check for rank duplicates, if there are any do strict check
+ for (std::multimap<char const *, std::multimap<SpellRankEntry, SpellRankValue>::iterator>::iterator itr2 = RankErrorMap.begin();itr2!=RankErrorMap.end();)
{
- sLog.outDebug("There is a duplicate rank entry (%s) for spell: %u",itr2->first,itr2->second->second.Id);
- sLog.outDebug("Spell %u removed from chain data.",itr2->second->second.Id);
- RankMap.erase(itr2->second);
- itr=RankMap.lower_bound(entry);
+ char const * err_entry=itr2->first;
+ uint32 rank_count=RankErrorMap.count(itr2->first);
+ if (rank_count>1)
+ {
+ error=true;
+ break;
+ }
+ else
+ itr2++;
}
- else
- itr2++;
- }
- //do not proceed for spells with less than 2 ranks
- uint32 spell_max_rank=RankMap.count(entry);
- if (spell_max_rank<2)
+ bool allHaveTalents=true;
+ if (error)
{
- itr=RankMap.upper_bound(entry);
+ std::list<uint32> ConflictedSpells;
+ for (std::multimap<SpellRankEntry, SpellRankValue>::iterator itr2 = RankMap.lower_bound(entry);itr2!=RankMap.upper_bound(entry);itr2=RankMap.lower_bound(entry))
+ {
+ ConflictedSpells.push_back(itr2->second.Id);
+ if (!GetTalentSpellPos(itr2->second.Id))
+ allHaveTalents=false;
+ RankMap.erase(itr2);
+ }
+ SpellRankEntry nextEntry, currEntry;
+ for (;!ConflictedSpells.empty();ConflictedSpells.pop_front())
+ {
+ SpellEntry const *SpellInfo=sSpellStore.LookupEntry(ConflictedSpells.front());
+ currEntry.SkillId=entry.SkillId;
+ currEntry.SpellName=SpellInfo->SpellName[sWorld.GetDefaultDbcLocale()];
+ currEntry.DurationIndex=SpellInfo->DurationIndex;
+ currEntry.RangeIndex=SpellInfo->rangeIndex;
+ currEntry.ProcFlags=SpellInfo->procFlags;
+ currEntry.SpellFamilyFlags=SpellInfo->SpellFamilyFlags;
+ //compare talents only when all spells from chain have entry
+ //to prevent wrong results with spells which have first rank talented and other not
+ if (allHaveTalents)
+ currEntry.TalentID=GetTalentSpellPos(ConflictedSpells.front())->talent_id;
+ else
+ currEntry.TalentID=0;
+ currEntry.TargetAuraState=SpellInfo->TargetAuraState;
+ currEntry.SpellVisual=SpellInfo->SpellVisual[0];
+ currEntry.ManaCost=SpellInfo->manaCost;
+
+ //compare effects and casting time
+ currEntry.CastingTimeIndex=SpellInfo->CastingTimeIndex;
+ currEntry.Effect[0]=SpellInfo->Effect[0];
+ currEntry.Effect[1]=SpellInfo->Effect[1];
+ currEntry.Effect[2]=SpellInfo->Effect[2];
+
+ currEntry.Aura[0]=SpellInfo->EffectApplyAuraName[0];
+ currEntry.Aura[1]=SpellInfo->EffectApplyAuraName[1];
+ currEntry.Aura[2]=SpellInfo->EffectApplyAuraName[2];
+
+ SpellRankValue currValue;
+ currValue.Id=ConflictedSpells.front();
+ currValue.Rank=SpellInfo->Rank[sWorld.GetDefaultDbcLocale()];
+ currValue.strict=true;
+ RankMap.insert(std::pair<SpellRankEntry, SpellRankValue>(currEntry,currValue));
+ }
+ itr=RankMap.begin();
continue;
}
+ else
+ for (std::multimap<char const *, std::multimap<SpellRankEntry, SpellRankValue>::iterator>::iterator itr2 = RankErrorMap.begin();itr2!=RankErrorMap.end();)
+ {
+ char const * err_entry=itr2->first;
+ uint32 rank_count=RankErrorMap.count(itr2->first);
+ if (rank_count>1)
+ for (itr2 = RankErrorMap.lower_bound(err_entry);itr2!=RankErrorMap.upper_bound(err_entry);itr2++)
+ {
+ sLog.outDebug("There is a duplicate rank entry (%s) for spell: %u",itr2->first,itr2->second->second.Id);
+ if (!(itr2->second->second.Id==52375 || itr2->second->second.Id==45902))
+ {
+ sLog.outDebug("Spell %u removed from chain data.",itr2->second->second.Id);
+ RankMap.erase(itr2->second);
+ }
+ }
+ else
+ itr2++;
+ }
- itr=RankMap.upper_bound(entry);
-
- //order spells by spells by spellLevel
+ //order spells by spellLevel
std::list<uint32> RankedSpells;
uint32 min_spell_lvl=0;
- std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator min_itr;
+ std::multimap<SpellRankEntry, SpellRankValue>::iterator min_itr;
for (;RankMap.count(entry);)
{
- for (std::multimap<SpellRankEntry, SpellRankValue,SpellRankEntry>::iterator itr2 = RankMap.lower_bound(entry);itr2!=RankMap.upper_bound(entry);itr2++)
+ for (std::multimap<SpellRankEntry, SpellRankValue>::iterator itr2 = RankMap.lower_bound(entry);itr2!=RankMap.upper_bound(entry);itr2++)
{
SpellEntry const *SpellInfo=sSpellStore.LookupEntry(itr2->second.Id);
if (SpellInfo->spellLevel<min_spell_lvl || itr2==RankMap.lower_bound(entry))
@@ -1722,9 +1780,13 @@ void SpellMgr::LoadSpellChains()
}
}
+ //do not proceed for spells with less than 2 ranks
+ itr=RankMap.begin();
+ if (RankedSpells.size()<2)
+ continue;
+
count++;
- itr=RankMap.upper_bound(entry);
uint32 spell_rank=1;
for(std::list<uint32>::iterator itr2 = RankedSpells.begin();itr2!=RankedSpells.end();spell_rank++)
{
@@ -1748,8 +1810,8 @@ void SpellMgr::LoadSpellChains()
}
//uncomment these two lines to print yourself list of spell_chains on startup
-// for (UNORDERED_MAP<uint32, SpellChainNode>::iterator itr=mSpellChains.begin();itr!=mSpellChains.end();itr++)
-// sLog.outString( "Id: %u, Rank: %d , %s",itr->first,itr->second.rank, sSpellStore.LookupEntry(itr->first)->Rank[sWorld.GetDefaultDbcLocale()]);
+ //for (UNORDERED_MAP<uint32, SpellChainNode>::iterator itr=mSpellChains.begin();itr!=mSpellChains.end();itr++)
+ //sLog.outString( "Id: %u, Rank: %d , %s, %u, %u, %u, %u",itr->first,itr->second.rank, sSpellStore.LookupEntry(itr->first)->Rank[sWorld.GetDefaultDbcLocale()], itr->second.first, itr->second.last,itr->second.next ,itr->second.prev);
sLog.outString();
sLog.outString( ">> Loaded %u spell chains",count);
@@ -1761,8 +1823,10 @@ void SpellMgr::LoadSpellLearnSkills()
// search auto-learned skills and add its to map also for use in unlearn spells/talents
uint32 dbc_count = 0;
+ barGoLink bar( sSpellStore.GetNumRows() );
for(uint32 spell = 0; spell < sSpellStore.GetNumRows(); ++spell)
{
+ bar.step();
SpellEntry const* entry = sSpellStore.LookupEntry(spell);
if(!entry)
@@ -1797,7 +1861,8 @@ void SpellMgr::LoadSpellLearnSpells()
{
mSpellLearnSpells.clear(); // need for reload case
- QueryResult *result = WorldDatabase.Query("SELECT entry, SpellID FROM spell_learn_spell");
+ // 0 1 2
+ QueryResult *result = WorldDatabase.Query("SELECT entry, SpellID, Active FROM spell_learn_spell");
if(!result)
{
barGoLink bar( 1 );
@@ -1821,6 +1886,7 @@ void SpellMgr::LoadSpellLearnSpells()
SpellLearnSpellNode node;
node.spell = fields[1].GetUInt32();
+ node.active = fields[2].GetBool();
node.autoLearned= false;
if(!sSpellStore.LookupEntry(spell_id))
@@ -1857,7 +1923,16 @@ void SpellMgr::LoadSpellLearnSpells()
{
SpellLearnSpellNode dbc_node;
dbc_node.spell = entry->EffectTriggerSpell[i];
- dbc_node.autoLearned = true;
+ 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
+ if(!sSpellStore.LookupEntry(dbc_node.spell))
+ continue;
+
+ // talent or passive spells or skill-step spells auto-casted and not need dependent learning,
+ // pet teaching spells don't must be dependent learning (casted)
+ // other required explicit dependent learning
+ dbc_node.autoLearned = entry->EffectImplicitTargetA[i]==TARGET_PET || GetTalentSpellCost(spell) > 0 || IsPassiveSpell(spell) || IsSpellHaveEffect(entry,SPELL_EFFECT_SKILL_STEP);
SpellLearnSpellMap::const_iterator db_node_begin = GetBeginSpellLearnSpell(spell);
SpellLearnSpellMap::const_iterator db_node_end = GetEndSpellLearnSpell(spell);
@@ -2176,7 +2251,7 @@ void SpellMgr::LoadSpellCustomAttr()
}
}
- if(spellInfo->SpellVisual == 3879)
+ if(spellInfo->SpellVisual[0] == 3879)
mSpellCustomAttr[i] |= SPELL_ATTR_CU_CONE_BACK;
switch(i)
@@ -2319,6 +2394,187 @@ void SpellMgr::LoadSpellLinked()
}
/// Some checks for spells, to prevent adding depricated/broken spells for trainers, spell book, etc
+void SpellMgr::LoadPetLevelupSpellMap()
+{
+ CreatureFamilyEntry const *creatureFamily;
+ SpellEntry const *spell;
+ uint32 count = 0;
+
+ for (uint32 i = 0; i < sCreatureFamilyStore.GetNumRows(); ++i)
+ {
+ creatureFamily = sCreatureFamilyStore.LookupEntry(i);
+
+ if(!creatureFamily) // not exist
+ continue;
+
+ if(creatureFamily->petTalentType < 0) // not hunter pet family
+ continue;
+
+ for(uint32 j = 0; j < sSpellStore.GetNumRows(); ++j)
+ {
+ spell = sSpellStore.LookupEntry(j);
+
+ // not exist
+ if(!spell)
+ continue;
+
+ // not hunter spell
+ if(spell->SpellFamilyName != SPELLFAMILY_HUNTER)
+ continue;
+
+ // not pet spell
+ if(!(spell->SpellFamilyFlags[1] & 0x10000000))
+ continue;
+
+ // not Growl or Cower (generics)
+ if(spell->SpellIconID != 201 && spell->SpellIconID != 958)
+ {
+ switch(creatureFamily->ID)
+ {
+ case CREATURE_FAMILY_BAT: // Bite and Sonic Blast
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1577)
+ continue;
+ break;
+ case CREATURE_FAMILY_BEAR: // Claw and Swipe
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 1562)
+ continue;
+ break;
+ case CREATURE_FAMILY_BIRD_OF_PREY: // Claw and Snatch
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 168)
+ continue;
+ break;
+ case CREATURE_FAMILY_BOAR: // Bite and Gore
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1578)
+ continue;
+ break;
+ case CREATURE_FAMILY_CARRION_BIRD: // Bite and Demoralizing Screech
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1579)
+ continue;
+ break;
+ case CREATURE_FAMILY_CAT: // Claw and Prowl and Rake
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 495 && spell->SpellIconID != 494)
+ continue;
+ break;
+ case CREATURE_FAMILY_CHIMAERA: // Bite and Froststorm Breath
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 62)
+ continue;
+ break;
+ case CREATURE_FAMILY_CORE_HOUND: // Bite and Lava Breath
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1197)
+ continue;
+ break;
+ case CREATURE_FAMILY_CRAB: // Claw and Pin
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 2679)
+ continue;
+ break;
+ case CREATURE_FAMILY_CROCOLISK: // Bite and Bad Attitude
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1581)
+ continue;
+ break;
+ case CREATURE_FAMILY_DEVILSAUR: // Bite and Monstrous Bite
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 599)
+ continue;
+ break;
+ case CREATURE_FAMILY_DRAGONHAWK: // Bite and Fire Breath
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 2128)
+ continue;
+ break;
+ case CREATURE_FAMILY_GORILLA: // Smack and Thunderstomp
+ if(spell->SpellIconID != 473 && spell->SpellIconID != 148)
+ continue;
+ break;
+ case CREATURE_FAMILY_HYENA: // Bite and Tendon Rip
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 138)
+ continue;
+ break;
+ case CREATURE_FAMILY_MOTH: // Serenity Dust and Smack
+ if(spell->SpellIconID != 1714 && spell->SpellIconID != 473)
+ continue;
+ break;
+ case CREATURE_FAMILY_NETHER_RAY: // Bite and Nether Shock
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 2027)
+ continue;
+ break;
+ case CREATURE_FAMILY_RAPTOR: // Claw and Savage Rend
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 245)
+ continue;
+ break;
+ case CREATURE_FAMILY_RAVAGER: // Bite and Ravage
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 2253)
+ continue;
+ break;
+ case CREATURE_FAMILY_RHINO: // Smack and Stampede
+ if(spell->SpellIconID != 473 && spell->SpellIconID != 3066)
+ continue;
+ break;
+ case CREATURE_FAMILY_SCORPID: // Claw and Scorpid Poison
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 163)
+ continue;
+ break;
+ case CREATURE_FAMILY_SERPENT: // Bite and Poison Spit
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 68)
+ continue;
+ break;
+ case CREATURE_FAMILY_SILITHID: // Claw and Venom Web Spray
+ if(spell->SpellIconID != 262 && (spell->SpellIconID != 272 && spell->SpellVisual[0] != 12013))
+ continue;
+ break;
+ case CREATURE_FAMILY_SPIDER: // Bite and Web
+ if(spell->SpellIconID != 1680 && (spell->SpellIconID != 272 && spell->SpellVisual[0] != 684))
+ continue;
+ break;
+ case CREATURE_FAMILY_SPIRIT_BEAST: // Claw and Prowl and Spirit Strike
+ if(spell->SpellIconID != 262 && spell->SpellIconID != 495 && spell->SpellIconID != 255)
+ continue;
+ break;
+ case CREATURE_FAMILY_SPOREBAT: // Smack and Spore Cloud
+ if(spell->SpellIconID != 473 && spell->SpellIconID != 2681)
+ continue;
+ break;
+ case CREATURE_FAMILY_TALLSTRIDER: // Claw and Dust Cloud
+ if(spell->SpellIconID != 262 && (spell->SpellIconID != 157 && !(spell->Attributes & 0x4000000)))
+ continue;
+ break;
+ case CREATURE_FAMILY_TURTLE: // Bite and Shell Shield
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1588)
+ continue;
+ break;
+ case CREATURE_FAMILY_WARP_STALKER: // Bite and Warp
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1952)
+ continue;
+ break;
+ case CREATURE_FAMILY_WASP: // Smack and Sting
+ if(spell->SpellIconID != 473 && spell->SpellIconID != 110)
+ continue;
+ break;
+ case CREATURE_FAMILY_WIND_SERPENT: // Bite and Lightning Breath
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 62)
+ continue;
+ break;
+ case CREATURE_FAMILY_WOLF: // Bite and Furious Howl
+ if(spell->SpellIconID != 1680 && spell->SpellIconID != 1573)
+ continue;
+ break;
+ case CREATURE_FAMILY_WORM: // Acid Spit and Bite
+ if(spell->SpellIconID != 636 && spell->SpellIconID != 1680)
+ continue;
+ break;
+ default:
+ sLog.outError("LoadPetLevelupSpellMap: Unhandled creature family %u", creatureFamily->ID);
+ continue;
+ }
+ }
+
+ mPetLevelupSpellMap[creatureFamily->ID][spell->spellLevel] = spell->Id;
+ count++;
+ }
+ }
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u pet levelup spells", count );
+}
+
+/// Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book, etc
bool SpellMgr::IsSpellValid(SpellEntry const* spellInfo, Player* pl, bool msg)
{
// not exist
@@ -2393,11 +2649,24 @@ bool SpellMgr::IsSpellValid(SpellEntry const* spellInfo, Player* pl, bool msg)
return true;
}
-bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 zone_id,uint32 area_id)
+uint8 GetSpellAllowedInLocationError(SpellEntry const *spellInfo,uint32 map_id,uint32 zone_id,uint32 area_id, uint32 bgInstanceId)
{
// normal case
- if( spellInfo->AreaId && spellInfo->AreaId != zone_id && spellInfo->AreaId != area_id )
- return false;
+ if( spellInfo->AreaGroupId > 0)
+ {
+ bool found = false;
+
+ AreaGroupEntry const* groupEntry = sAreaGroupStore.LookupEntry(spellInfo->AreaGroupId);
+ if(groupEntry)
+ {
+ for (uint8 i=0; i<7; i++)
+ if( groupEntry->AreaId[i] == zone_id || groupEntry->AreaId[i] == area_id )
+ found = true;
+ }
+
+ if(!found)
+ return SPELL_FAILED_INCORRECT_AREA;
+ }
// elixirs (all area dependent elixirs have family SPELLFAMILY_POTION, use this for speedup)
if(spellInfo->SpellFamilyName==SPELLFAMILY_POTION)
@@ -2407,28 +2676,28 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z
if(mask & ELIXIR_BATTLE_MASK)
{
if(spellInfo->Id==45373) // Bloodberry Elixir
- return zone_id==4075;
+ return zone_id==4075 ? 0 : SPELL_FAILED_REQUIRES_AREA;
}
if(mask & ELIXIR_UNSTABLE_MASK)
{
// in the Blade's Edge Mountains Plateaus and Gruul's Lair.
- return zone_id ==3522 || map_id==565;
+ return zone_id ==3522 || map_id==565 ? 0 : SPELL_FAILED_INCORRECT_AREA;
}
if(mask & ELIXIR_SHATTRATH_MASK)
{
// in Tempest Keep, Serpentshrine Cavern, Caverns of Time: Mount Hyjal, Black Temple, Sunwell Plateau
if(zone_id ==3607 || map_id==534 || map_id==564 || zone_id==4075)
- return true;
+ return 0;
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
if(!mapEntry)
- return false;
+ return SPELL_FAILED_INCORRECT_AREA;
- return mapEntry->multimap_id==206;
+ return mapEntry->multimap_id==206 ? 0 : SPELL_FAILED_INCORRECT_AREA;
}
// elixirs not have another limitations
- return true;
+ return 0;
}
}
@@ -2440,35 +2709,104 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z
{
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
if(!mapEntry)
- return false;
+ return SPELL_FAILED_INCORRECT_AREA;
- return mapEntry->multimap_id==206;
+ return mapEntry->multimap_id==206 ? 0 : SPELL_FAILED_REQUIRES_AREA;
}
case 41617: // Cenarion Mana Salve
case 41619: // Cenarion Healing Salve
{
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
if(!mapEntry)
- return false;
+ return SPELL_FAILED_INCORRECT_AREA;
- return mapEntry->multimap_id==207;
+ return mapEntry->multimap_id==207 ? 0 : SPELL_FAILED_REQUIRES_AREA;
}
case 40216: // Dragonmaw Illusion
case 42016: // Dragonmaw Illusion
- return area_id == 3759 || area_id == 3966 || area_id == 3939;
+ return area_id == 3759 || area_id == 3966 || area_id == 3939 ? 0 : SPELL_FAILED_INCORRECT_AREA;
+ case 51721: // Dominion Over Acherus
+ case 54055: // Dominion Over Acherus
+ return area_id == 4281 || area_id == 4342 ? 0 : SPELL_FAILED_INCORRECT_AREA;
+ case 51852: // The Eye of Acherus
+ return map_id == 609 ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ case 54119: // Mist of the Kvaldir
+ return area_id == 4028 || area_id == 4029 || area_id == 4106 || area_id == 4031 ? 0 : SPELL_FAILED_INCORRECT_AREA;
+ case 23333: // Warsong Flag
+ case 23335: // Silverwing Flag
+ return map_id == 489 && bgInstanceId ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ case 34976: // Netherstorm Flag
+ return map_id == 566 && bgInstanceId ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ case 2584: // Waiting to Resurrect
+ case 22011: // Spirit Heal Channel
+ case 22012: // Spirit Heal
+ case 24171: // Resurrection Impact Visual
+ case 42792: // Recently Dropped Flag
+ case 43681: // Inactive
+ case 44535: // Spirit Heal (mana)
+ {
+ MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
+ if(!mapEntry)
+ return SPELL_FAILED_INCORRECT_AREA;
+
+ return mapEntry->IsBattleGround() && bgInstanceId ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ }
+ case 44521: // Preparation
+ {
+ if(!bgInstanceId)
+ return SPELL_FAILED_REQUIRES_AREA;
+
+ MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
+ if(!mapEntry)
+ return SPELL_FAILED_INCORRECT_AREA;
+
+ if(!mapEntry->IsBattleGround())
+ return SPELL_FAILED_REQUIRES_AREA;
+
+ BattleGround* bg = sBattleGroundMgr.GetBattleGround(bgInstanceId);
+ return bg && bg->GetStatus()==STATUS_WAIT_JOIN ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ }
+ case 32724: // Gold Team (Alliance)
+ case 32725: // Green Team (Alliance)
+ case 35774: // Gold Team (Horde)
+ case 35775: // Green Team (Horde)
+ {
+ MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
+ if(!mapEntry)
+ return SPELL_FAILED_INCORRECT_AREA;
+
+ return mapEntry->IsBattleArena() && bgInstanceId ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ }
+ case 32727: // Arena Preparation
+ {
+ if(!bgInstanceId)
+ return SPELL_FAILED_REQUIRES_AREA;
+
+ MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
+ if(!mapEntry)
+ return SPELL_FAILED_INCORRECT_AREA;
+
+ if(!mapEntry->IsBattleArena())
+ return SPELL_FAILED_REQUIRES_AREA;
+
+ BattleGround* bg = sBattleGroundMgr.GetBattleGround(bgInstanceId);
+ return bg && bg->GetStatus()==STATUS_WAIT_JOIN ? 0 : SPELL_FAILED_REQUIRES_AREA;
+ }
}
- return true;
+ return 0;
}
void SpellMgr::LoadSkillLineAbilityMap()
{
mSkillLineAbilityMap.clear();
+ barGoLink bar( sSkillLineAbilityStore.GetNumRows() );
uint32 count = 0;
for (uint32 i = 0; i < sSkillLineAbilityStore.GetNumRows(); i++)
{
+ bar.step();
SkillLineAbilityEntry const *SkillInfo = sSkillLineAbilityStore.LookupEntry(i);
if(!SkillInfo)
continue;
@@ -2478,7 +2816,7 @@ void SpellMgr::LoadSkillLineAbilityMap()
}
sLog.outString();
- sLog.outString(">> Loaded %u SkillLineAbility MultiMap", count);
+ sLog.outString(">> Loaded %u SkillLineAbility MultiMap Data", count);
}
DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered)
@@ -2486,56 +2824,49 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
// Explicit Diminishing Groups
switch(spellproto->SpellFamilyName)
{
- case SPELLFAMILY_MAGE:
- {
- // Polymorph
- if ((spellproto->SpellFamilyFlags & 0x00001000000LL) && spellproto->EffectApplyAuraName[0]==SPELL_AURA_MOD_CONFUSE)
- return DIMINISHING_POLYMORPH;
- break;
- }
case SPELLFAMILY_ROGUE:
{
// Kidney Shot
- if (spellproto->SpellFamilyFlags & 0x00000200000LL)
+ if (spellproto->SpellFamilyFlags[0] & 0x200000)
return DIMINISHING_KIDNEYSHOT;
// Sap
- else if (spellproto->SpellFamilyFlags & 0x00000000080LL)
+ else if (spellproto->SpellFamilyFlags[0] & 0x80)
return DIMINISHING_POLYMORPH;
// Gouge
- else if (spellproto->SpellFamilyFlags & 0x00000000008LL)
+ else if (spellproto->SpellFamilyFlags[0] & 0x8)
return DIMINISHING_POLYMORPH;
// Blind
- else if (spellproto->SpellFamilyFlags & 0x00001000000LL)
+ else if (spellproto->SpellFamilyFlags[0] & 0x00001000000)
return DIMINISHING_BLIND_CYCLONE;
break;
}
case SPELLFAMILY_WARLOCK:
{
// Death Coil
- if (spellproto->SpellFamilyFlags & 0x00000080000LL)
+ if (spellproto->SpellFamilyFlags[0] & 0x00000080000)
return DIMINISHING_DEATHCOIL;
// Seduction
- if (spellproto->SpellFamilyFlags & 0x00040000000LL)
+ if (spellproto->SpellFamilyFlags[0] & 0x00040000000)
return DIMINISHING_FEAR;
// Fear
//else if (spellproto->SpellFamilyFlags & 0x40840000000LL)
// return DIMINISHING_WARLOCK_FEAR;
// Curses/etc
- else if (spellproto->SpellFamilyFlags & 0x00080000000LL)
+ else if (spellproto->SpellFamilyFlags[0] & 0x80000000)
return DIMINISHING_LIMITONLY;
break;
}
case SPELLFAMILY_DRUID:
{
// Cyclone
- if (spellproto->SpellFamilyFlags & 0x02000000000LL)
+ if (spellproto->SpellFamilyFlags[1] & 0x020)
return DIMINISHING_BLIND_CYCLONE;
break;
}
case SPELLFAMILY_WARRIOR:
{
// Hamstring - limit duration to 10s in PvP
- if (spellproto->SpellFamilyFlags & 0x00000000002LL)
+ if (spellproto->SpellFamilyFlags[0] & 0x00000000002)
return DIMINISHING_LIMITONLY;
break;
}
@@ -2544,30 +2875,21 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
}
// Get by mechanic
- for (uint8 i=0;i<3;++i)
- {
- if (spellproto->Mechanic == MECHANIC_STUN || spellproto->EffectMechanic[i] == MECHANIC_STUN)
- return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
- else if (spellproto->Mechanic == MECHANIC_SLEEP || spellproto->EffectMechanic[i] == MECHANIC_SLEEP)
- return DIMINISHING_SLEEP;
- else if (spellproto->Mechanic == MECHANIC_ROOT || spellproto->EffectMechanic[i] == MECHANIC_ROOT)
- return triggered ? DIMINISHING_TRIGGER_ROOT : DIMINISHING_CONTROL_ROOT;
- else if (spellproto->Mechanic == MECHANIC_FEAR || spellproto->EffectMechanic[i] == MECHANIC_FEAR)
- return DIMINISHING_FEAR;
- else if (spellproto->Mechanic == MECHANIC_CHARM || spellproto->EffectMechanic[i] == MECHANIC_CHARM)
- return DIMINISHING_CHARM;
- else if (spellproto->Mechanic == MECHANIC_SILENCE || spellproto->EffectMechanic[i] == MECHANIC_SILENCE)
- return DIMINISHING_SILENCE;
- else if (spellproto->Mechanic == MECHANIC_DISARM || spellproto->EffectMechanic[i] == MECHANIC_DISARM)
- return DIMINISHING_DISARM;
- else if (spellproto->Mechanic == MECHANIC_FREEZE || spellproto->EffectMechanic[i] == MECHANIC_FREEZE)
- return DIMINISHING_FREEZE;
- else if (spellproto->Mechanic == MECHANIC_KNOCKOUT|| spellproto->EffectMechanic[i] == MECHANIC_KNOCKOUT ||
- spellproto->Mechanic == MECHANIC_SAPPED || spellproto->EffectMechanic[i] == MECHANIC_SAPPED)
- return DIMINISHING_KNOCKOUT;
- else if (spellproto->Mechanic == MECHANIC_BANISH || spellproto->EffectMechanic[i] == MECHANIC_BANISH)
- return DIMINISHING_BANISH;
- }
+ uint32 mechanic = GetAllSpellMechanicMask(spellproto);
+ if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE;
+ if (mechanic & (1<<MECHANIC_STUN)) return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
+ if (mechanic & (1<<MECHANIC_SLEEP)) return DIMINISHING_SLEEP;
+ if (mechanic & (1<<MECHANIC_POLYMORPH)) return DIMINISHING_POLYMORPH;
+ if (mechanic & (1<<MECHANIC_ROOT)) return triggered ? DIMINISHING_TRIGGER_ROOT : DIMINISHING_CONTROL_ROOT;
+ if (mechanic & (1<<MECHANIC_FEAR)) return DIMINISHING_FEAR;
+ if (mechanic & (1<<MECHANIC_CHARM)) return DIMINISHING_CHARM;
+ if (mechanic & (1<<MECHANIC_SILENCE)) return DIMINISHING_SILENCE;
+ if (mechanic & (1<<MECHANIC_DISARM)) return DIMINISHING_DISARM;
+ if (mechanic & (1<<MECHANIC_FREEZE)) return DIMINISHING_FREEZE;
+ if (mechanic & ((1<<MECHANIC_KNOCKOUT) | (1<<MECHANIC_SAPPED))) return DIMINISHING_KNOCKOUT;
+ if (mechanic & (1<<MECHANIC_BANISH)) return DIMINISHING_BANISH;
+ if (mechanic & (1<<MECHANIC_HORROR)) return DIMINISHING_DEATHCOIL;
+
return DIMINISHING_NONE;
}
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index 4ac0871e853..119dbed9eb8 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -10,12 +10,12 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _SPELLMGR_H
@@ -29,6 +29,9 @@
#include "Database/SQLStorage.h"
#include "Utilities/UnorderedMap.h"
+
+#include "Player.h"
+
#include <map>
class Player;
@@ -38,175 +41,188 @@ extern SQLStorage sSpellThreatStore;
enum SpellFailedReason
{
- SPELL_FAILED_AFFECTING_COMBAT = 0x00,
- SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 0x01,
- SPELL_FAILED_ALREADY_AT_FULL_MANA = 0x02,
- SPELL_FAILED_ALREADY_AT_FULL_POWER = 0x03,
- SPELL_FAILED_ALREADY_BEING_TAMED = 0x04,
- SPELL_FAILED_ALREADY_HAVE_CHARM = 0x05,
- SPELL_FAILED_ALREADY_HAVE_SUMMON = 0x06,
- SPELL_FAILED_ALREADY_OPEN = 0x07,
- SPELL_FAILED_AURA_BOUNCED = 0x08,
- SPELL_FAILED_AUTOTRACK_INTERRUPTED = 0x09,
- SPELL_FAILED_BAD_IMPLICIT_TARGETS = 0x0A,
- SPELL_FAILED_BAD_TARGETS = 0x0B,
- SPELL_FAILED_CANT_BE_CHARMED = 0x0C,
- SPELL_FAILED_CANT_BE_DISENCHANTED = 0x0D,
- SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 0x0E,
- SPELL_FAILED_CANT_BE_PROSPECTED = 0x0F,
- SPELL_FAILED_CANT_CAST_ON_TAPPED = 0x10,
- SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 0x11,
- SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 0x12,
- SPELL_FAILED_CANT_STEALTH = 0x13,
- SPELL_FAILED_CASTER_AURASTATE = 0x14,
- SPELL_FAILED_CASTER_DEAD = 0x15,
- SPELL_FAILED_CHARMED = 0x16,
- SPELL_FAILED_CHEST_IN_USE = 0x17,
- SPELL_FAILED_CONFUSED = 0x18,
- SPELL_FAILED_DONT_REPORT = 0x19,
- SPELL_FAILED_EQUIPPED_ITEM = 0x1A,
- SPELL_FAILED_EQUIPPED_ITEM_CLASS = 0x1B,
- SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 0x1C,
- SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 0x1D,
- SPELL_FAILED_ERROR = 0x1E,
- SPELL_FAILED_FIZZLE = 0x1F,
- SPELL_FAILED_FLEEING = 0x20,
- SPELL_FAILED_FOOD_LOWLEVEL = 0x21,
- SPELL_FAILED_HIGHLEVEL = 0x22,
- SPELL_FAILED_HUNGER_SATIATED = 0x23,
- SPELL_FAILED_IMMUNE = 0x24,
- SPELL_FAILED_INTERRUPTED = 0x25,
- SPELL_FAILED_INTERRUPTED_COMBAT = 0x26,
- SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 0x27,
- SPELL_FAILED_ITEM_GONE = 0x28,
- SPELL_FAILED_ITEM_NOT_FOUND = 0x29,
- SPELL_FAILED_ITEM_NOT_READY = 0x2A,
- SPELL_FAILED_LEVEL_REQUIREMENT = 0x2B,
- SPELL_FAILED_LINE_OF_SIGHT = 0x2C,
- SPELL_FAILED_LOWLEVEL = 0x2D,
- SPELL_FAILED_LOW_CASTLEVEL = 0x2E,
- SPELL_FAILED_MAINHAND_EMPTY = 0x2F,
- SPELL_FAILED_MOVING = 0x30,
- SPELL_FAILED_NEED_AMMO = 0x31,
- SPELL_FAILED_NEED_AMMO_POUCH = 0x32,
- SPELL_FAILED_NEED_EXOTIC_AMMO = 0x33,
- SPELL_FAILED_NOPATH = 0x34,
- SPELL_FAILED_NOT_BEHIND = 0x35,
- SPELL_FAILED_NOT_FISHABLE = 0x36,
- SPELL_FAILED_NOT_FLYING = 0x37,
- SPELL_FAILED_NOT_HERE = 0x38,
- SPELL_FAILED_NOT_INFRONT = 0x39,
- SPELL_FAILED_NOT_IN_CONTROL = 0x3A,
- SPELL_FAILED_NOT_KNOWN = 0x3B,
- SPELL_FAILED_NOT_MOUNTED = 0x3C,
- SPELL_FAILED_NOT_ON_TAXI = 0x3D,
- SPELL_FAILED_NOT_ON_TRANSPORT = 0x3E,
- SPELL_FAILED_NOT_READY = 0x3F,
- SPELL_FAILED_NOT_SHAPESHIFT = 0x40,
- SPELL_FAILED_NOT_STANDING = 0x41,
- SPELL_FAILED_NOT_TRADEABLE = 0x42,
- SPELL_FAILED_NOT_TRADING = 0x43,
- SPELL_FAILED_NOT_UNSHEATHED = 0x44,
- SPELL_FAILED_NOT_WHILE_GHOST = 0x45,
- SPELL_FAILED_NO_AMMO = 0x46,
- SPELL_FAILED_NO_CHARGES_REMAIN = 0x47,
- SPELL_FAILED_NO_CHAMPION = 0x48,
- SPELL_FAILED_NO_COMBO_POINTS = 0x49,
- SPELL_FAILED_NO_DUELING = 0x4A,
- SPELL_FAILED_NO_ENDURANCE = 0x4B,
- SPELL_FAILED_NO_FISH = 0x4C,
- SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 0x4D,
- SPELL_FAILED_NO_MOUNTS_ALLOWED = 0x4E,
- SPELL_FAILED_NO_PET = 0x4F,
- SPELL_FAILED_NO_POWER = 0x50,
- SPELL_FAILED_NOTHING_TO_DISPEL = 0x51,
- SPELL_FAILED_NOTHING_TO_STEAL = 0x52,
- SPELL_FAILED_ONLY_ABOVEWATER = 0x53,
- SPELL_FAILED_ONLY_DAYTIME = 0x54,
- SPELL_FAILED_ONLY_INDOORS = 0x55,
- SPELL_FAILED_ONLY_MOUNTED = 0x56,
- SPELL_FAILED_ONLY_NIGHTTIME = 0x57,
- SPELL_FAILED_ONLY_OUTDOORS = 0x58,
- SPELL_FAILED_ONLY_SHAPESHIFT = 0x59,
- SPELL_FAILED_ONLY_STEALTHED = 0x5A,
- SPELL_FAILED_ONLY_UNDERWATER = 0x5B,
- SPELL_FAILED_OUT_OF_RANGE = 0x5C,
- SPELL_FAILED_PACIFIED = 0x5D,
- SPELL_FAILED_POSSESSED = 0x5E,
- SPELL_FAILED_REAGENTS = 0x5F,
- SPELL_FAILED_REQUIRES_AREA = 0x60,
- SPELL_FAILED_REQUIRES_SPELL_FOCUS = 0x61,
- SPELL_FAILED_ROOTED = 0x62,
- SPELL_FAILED_SILENCED = 0x63,
- SPELL_FAILED_SPELL_IN_PROGRESS = 0x64,
- SPELL_FAILED_SPELL_LEARNED = 0x65,
- SPELL_FAILED_SPELL_UNAVAILABLE = 0x66,
- SPELL_FAILED_STUNNED = 0x67,
- SPELL_FAILED_TARGETS_DEAD = 0x68,
- SPELL_FAILED_TARGET_AFFECTING_COMBAT = 0x69,
- SPELL_FAILED_TARGET_AURASTATE = 0x6A,
- SPELL_FAILED_TARGET_DUELING = 0x6B,
- SPELL_FAILED_TARGET_ENEMY = 0x6C,
- SPELL_FAILED_TARGET_ENRAGED = 0x6D,
- SPELL_FAILED_TARGET_FRIENDLY = 0x6E,
- SPELL_FAILED_TARGET_IN_COMBAT = 0x6F,
- SPELL_FAILED_TARGET_IS_PLAYER = 0x70,
- SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 0x71,
- SPELL_FAILED_TARGET_NOT_DEAD = 0x72,
- SPELL_FAILED_TARGET_NOT_IN_PARTY = 0x73,
- SPELL_FAILED_TARGET_NOT_LOOTED = 0x74,
- SPELL_FAILED_TARGET_NOT_PLAYER = 0x75,
- SPELL_FAILED_TARGET_NO_POCKETS = 0x76,
- SPELL_FAILED_TARGET_NO_WEAPONS = 0x77,
- SPELL_FAILED_TARGET_UNSKINNABLE = 0x78,
- SPELL_FAILED_THIRST_SATIATED = 0x79,
- SPELL_FAILED_TOO_CLOSE = 0x7A,
- SPELL_FAILED_TOO_MANY_OF_ITEM = 0x7B,
- SPELL_FAILED_TOTEM_CATEGORY = 0x7C,
- SPELL_FAILED_TOTEMS = 0x7D,
- SPELL_FAILED_TRAINING_POINTS = 0x7E,
- SPELL_FAILED_TRY_AGAIN = 0x7F,
- SPELL_FAILED_UNIT_NOT_BEHIND = 0x80,
- SPELL_FAILED_UNIT_NOT_INFRONT = 0x81,
- SPELL_FAILED_WRONG_PET_FOOD = 0x82,
- SPELL_FAILED_NOT_WHILE_FATIGUED = 0x83,
- SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 0x84,
- SPELL_FAILED_NOT_WHILE_TRADING = 0x85,
- SPELL_FAILED_TARGET_NOT_IN_RAID = 0x86,
- SPELL_FAILED_DISENCHANT_WHILE_LOOTING = 0x87,
- SPELL_FAILED_PROSPECT_WHILE_LOOTING = 0x88,
- SPELL_FAILED_PROSPECT_NEED_MORE = 0x89,
- SPELL_FAILED_TARGET_FREEFORALL = 0x8A,
- SPELL_FAILED_NO_EDIBLE_CORPSES = 0x8B,
- SPELL_FAILED_ONLY_BATTLEGROUNDS = 0x8C,
- SPELL_FAILED_TARGET_NOT_GHOST = 0x8D,
- SPELL_FAILED_TOO_MANY_SKILLS = 0x8E,
- SPELL_FAILED_TRANSFORM_UNUSABLE = 0x8F,
- SPELL_FAILED_WRONG_WEATHER = 0x90,
- SPELL_FAILED_DAMAGE_IMMUNE = 0x91,
- SPELL_FAILED_PREVENTED_BY_MECHANIC = 0x92,
- SPELL_FAILED_PLAY_TIME = 0x93,
- SPELL_FAILED_REPUTATION = 0x94,
- SPELL_FAILED_MIN_SKILL = 0x95,
- SPELL_FAILED_NOT_IN_ARENA = 0x96,
- SPELL_FAILED_NOT_ON_SHAPESHIFT = 0x97,
- SPELL_FAILED_NOT_ON_STEALTHED = 0x98,
- SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 0x99,
- SPELL_FAILED_NOT_ON_MOUNTED = 0x9A,
- SPELL_FAILED_TOO_SHALLOW = 0x9B,
- SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 0x9C,
- SPELL_FAILED_TARGET_IS_TRIVIAL = 0x9D,
- SPELL_FAILED_BM_OR_INVISGOD = 0x9E,
- SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 0x9F,
- SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 0xA0,
- SPELL_FAILED_NOT_IDLE = 0xA1,
- SPELL_FAILED_NOT_INACTIVE = 0xA2,
- SPELL_FAILED_PARTIAL_PLAYTIME = 0xA3,
- SPELL_FAILED_NO_PLAYTIME = 0xA4,
- SPELL_FAILED_NOT_IN_BATTLEGROUND = 0xA5,
- SPELL_FAILED_ONLY_IN_ARENA = 0xA6,
- SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 0xA7,
- SPELL_FAILED_UNKNOWN = 0xA8,
+ SPELL_FAILED_AFFECTING_COMBAT = 0,
+ SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 1,
+ SPELL_FAILED_ALREADY_AT_FULL_MANA = 2,
+ SPELL_FAILED_ALREADY_AT_FULL_POWER = 3,
+ SPELL_FAILED_ALREADY_BEING_TAMED = 4,
+ SPELL_FAILED_ALREADY_HAVE_CHARM = 5,
+ SPELL_FAILED_ALREADY_HAVE_SUMMON = 6,
+ SPELL_FAILED_ALREADY_OPEN = 7,
+ SPELL_FAILED_AURA_BOUNCED = 8,
+ SPELL_FAILED_AUTOTRACK_INTERRUPTED = 9,
+ SPELL_FAILED_BAD_IMPLICIT_TARGETS = 10,
+ SPELL_FAILED_BAD_TARGETS = 11,
+ SPELL_FAILED_CANT_BE_CHARMED = 12,
+ SPELL_FAILED_CANT_BE_DISENCHANTED = 13,
+ SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 14,
+ SPELL_FAILED_CANT_BE_MILLED = 15,
+ SPELL_FAILED_CANT_BE_PROSPECTED = 16,
+ SPELL_FAILED_CANT_CAST_ON_TAPPED = 17,
+ SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 18,
+ SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 19,
+ SPELL_FAILED_CANT_STEALTH = 20,
+ SPELL_FAILED_CASTER_AURASTATE = 21,
+ SPELL_FAILED_CASTER_DEAD = 22,
+ SPELL_FAILED_CHARMED = 23,
+ SPELL_FAILED_CHEST_IN_USE = 24,
+ SPELL_FAILED_CONFUSED = 25,
+ SPELL_FAILED_DONT_REPORT = 26,
+ SPELL_FAILED_EQUIPPED_ITEM = 27,
+ SPELL_FAILED_EQUIPPED_ITEM_CLASS = 28,
+ SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 29,
+ SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 30,
+ SPELL_FAILED_ERROR = 31,
+ SPELL_FAILED_FIZZLE = 32,
+ SPELL_FAILED_FLEEING = 33,
+ SPELL_FAILED_FOOD_LOWLEVEL = 34,
+ SPELL_FAILED_HIGHLEVEL = 35,
+ SPELL_FAILED_HUNGER_SATIATED = 36,
+ SPELL_FAILED_IMMUNE = 37,
+ SPELL_FAILED_INCORRECT_AREA = 38,
+ SPELL_FAILED_INTERRUPTED = 39,
+ SPELL_FAILED_INTERRUPTED_COMBAT = 40,
+ SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 41,
+ SPELL_FAILED_ITEM_GONE = 42,
+ SPELL_FAILED_ITEM_NOT_FOUND = 43,
+ SPELL_FAILED_ITEM_NOT_READY = 44,
+ SPELL_FAILED_LEVEL_REQUIREMENT = 45,
+ SPELL_FAILED_LINE_OF_SIGHT = 46,
+ SPELL_FAILED_LOWLEVEL = 47,
+ SPELL_FAILED_LOW_CASTLEVEL = 48,
+ SPELL_FAILED_MAINHAND_EMPTY = 49,
+ SPELL_FAILED_MOVING = 50,
+ SPELL_FAILED_NEED_AMMO = 51,
+ SPELL_FAILED_NEED_AMMO_POUCH = 52,
+ SPELL_FAILED_NEED_EXOTIC_AMMO = 53,
+ SPELL_FAILED_NEED_MORE_ITEMS = 54,
+ SPELL_FAILED_NOPATH = 55,
+ SPELL_FAILED_NOT_BEHIND = 56,
+ SPELL_FAILED_NOT_FISHABLE = 57,
+ SPELL_FAILED_NOT_FLYING = 58,
+ SPELL_FAILED_NOT_HERE = 59,
+ SPELL_FAILED_NOT_INFRONT = 60,
+ SPELL_FAILED_NOT_IN_CONTROL = 61,
+ SPELL_FAILED_NOT_KNOWN = 62,
+ SPELL_FAILED_NOT_MOUNTED = 63,
+ SPELL_FAILED_NOT_ON_TAXI = 64,
+ SPELL_FAILED_NOT_ON_TRANSPORT = 65,
+ SPELL_FAILED_NOT_READY = 66,
+ SPELL_FAILED_NOT_SHAPESHIFT = 67,
+ SPELL_FAILED_NOT_STANDING = 68,
+ SPELL_FAILED_NOT_TRADEABLE = 69,
+ SPELL_FAILED_NOT_TRADING = 70,
+ SPELL_FAILED_NOT_UNSHEATHED = 71,
+ SPELL_FAILED_NOT_WHILE_GHOST = 72,
+ SPELL_FAILED_NOT_WHILE_LOOTING = 73,
+ SPELL_FAILED_NO_AMMO = 74,
+ SPELL_FAILED_NO_CHARGES_REMAIN = 75,
+ SPELL_FAILED_NO_CHAMPION = 76,
+ SPELL_FAILED_NO_COMBO_POINTS = 77,
+ SPELL_FAILED_NO_DUELING = 78,
+ SPELL_FAILED_NO_ENDURANCE = 79,
+ SPELL_FAILED_NO_FISH = 80,
+ SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 81,
+ SPELL_FAILED_NO_MOUNTS_ALLOWED = 82,
+ SPELL_FAILED_NO_PET = 83,
+ SPELL_FAILED_NO_POWER = 84,
+ SPELL_FAILED_NOTHING_TO_DISPEL = 85,
+ SPELL_FAILED_NOTHING_TO_STEAL = 86,
+ SPELL_FAILED_ONLY_ABOVEWATER = 87,
+ SPELL_FAILED_ONLY_DAYTIME = 88,
+ SPELL_FAILED_ONLY_INDOORS = 89,
+ SPELL_FAILED_ONLY_MOUNTED = 90,
+ SPELL_FAILED_ONLY_NIGHTTIME = 91,
+ SPELL_FAILED_ONLY_OUTDOORS = 92,
+ SPELL_FAILED_ONLY_SHAPESHIFT = 93,
+ SPELL_FAILED_ONLY_STEALTHED = 94,
+ SPELL_FAILED_ONLY_UNDERWATER = 95,
+ SPELL_FAILED_OUT_OF_RANGE = 96,
+ SPELL_FAILED_PACIFIED = 97,
+ SPELL_FAILED_POSSESSED = 98,
+ SPELL_FAILED_REAGENTS = 99,
+ SPELL_FAILED_REQUIRES_AREA = 100,
+ SPELL_FAILED_REQUIRES_SPELL_FOCUS = 101,
+ SPELL_FAILED_ROOTED = 102,
+ SPELL_FAILED_SILENCED = 103,
+ SPELL_FAILED_SPELL_IN_PROGRESS = 104,
+ SPELL_FAILED_SPELL_LEARNED = 105,
+ SPELL_FAILED_SPELL_UNAVAILABLE = 106,
+ SPELL_FAILED_STUNNED = 107,
+ SPELL_FAILED_TARGETS_DEAD = 108,
+ SPELL_FAILED_TARGET_AFFECTING_COMBAT = 109,
+ SPELL_FAILED_TARGET_AURASTATE = 110,
+ SPELL_FAILED_TARGET_DUELING = 111,
+ SPELL_FAILED_TARGET_ENEMY = 112,
+ SPELL_FAILED_TARGET_ENRAGED = 113,
+ SPELL_FAILED_TARGET_FRIENDLY = 114,
+ SPELL_FAILED_TARGET_IN_COMBAT = 115,
+ SPELL_FAILED_TARGET_IS_PLAYER = 116,
+ SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 117,
+ SPELL_FAILED_TARGET_NOT_DEAD = 118,
+ SPELL_FAILED_TARGET_NOT_IN_PARTY = 119,
+ SPELL_FAILED_TARGET_NOT_LOOTED = 120,
+ SPELL_FAILED_TARGET_NOT_PLAYER = 121,
+ SPELL_FAILED_TARGET_NO_POCKETS = 122,
+ SPELL_FAILED_TARGET_NO_WEAPONS = 123,
+ SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 124,
+ SPELL_FAILED_TARGET_UNSKINNABLE = 125,
+ SPELL_FAILED_THIRST_SATIATED = 126,
+ SPELL_FAILED_TOO_CLOSE = 127,
+ SPELL_FAILED_TOO_MANY_OF_ITEM = 128,
+ SPELL_FAILED_TOTEM_CATEGORY = 129,
+ SPELL_FAILED_TOTEMS = 130,
+ SPELL_FAILED_TRY_AGAIN = 131,
+ SPELL_FAILED_UNIT_NOT_BEHIND = 132,
+ SPELL_FAILED_UNIT_NOT_INFRONT = 133,
+ SPELL_FAILED_WRONG_PET_FOOD = 134,
+ SPELL_FAILED_NOT_WHILE_FATIGUED = 135,
+ SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 136,
+ SPELL_FAILED_NOT_WHILE_TRADING = 137,
+ SPELL_FAILED_TARGET_NOT_IN_RAID = 138,
+ SPELL_FAILED_TARGET_FREEFORALL = 139,
+ SPELL_FAILED_NO_EDIBLE_CORPSES = 140,
+ SPELL_FAILED_ONLY_BATTLEGROUNDS = 141,
+ SPELL_FAILED_TARGET_NOT_GHOST = 142,
+ SPELL_FAILED_TRANSFORM_UNUSABLE = 143,
+ SPELL_FAILED_WRONG_WEATHER = 144,
+ SPELL_FAILED_DAMAGE_IMMUNE = 145,
+ SPELL_FAILED_PREVENTED_BY_MECHANIC = 146,
+ SPELL_FAILED_PLAY_TIME = 147,
+ SPELL_FAILED_REPUTATION = 148,
+ SPELL_FAILED_MIN_SKILL = 149,
+ SPELL_FAILED_NOT_IN_ARENA = 150,
+ SPELL_FAILED_NOT_ON_SHAPESHIFT = 151,
+ SPELL_FAILED_NOT_ON_STEALTHED = 152,
+ SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 153,
+ SPELL_FAILED_NOT_ON_MOUNTED = 154,
+ SPELL_FAILED_TOO_SHALLOW = 155,
+ SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 156,
+ SPELL_FAILED_TARGET_IS_TRIVIAL = 157,
+ SPELL_FAILED_BM_OR_INVISGOD = 158,
+ SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 159,
+ SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 160,
+ SPELL_FAILED_NOT_IDLE = 161,
+ SPELL_FAILED_NOT_INACTIVE = 162,
+ SPELL_FAILED_PARTIAL_PLAYTIME = 163,
+ SPELL_FAILED_NO_PLAYTIME = 164,
+ SPELL_FAILED_NOT_IN_BATTLEGROUND = 165,
+ SPELL_FAILED_NOT_IN_RAID_INSTANCE = 166,
+ SPELL_FAILED_ONLY_IN_ARENA = 167,
+ SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 168,
+ SPELL_FAILED_ON_USE_ENCHANT = 169,
+ SPELL_FAILED_NOT_ON_GROUND = 170,
+ SPELL_FAILED_CUSTOM_ERROR = 171,
+ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 172,
+ SPELL_FAILED_TOO_MANY_SOCKETS = 173,
+ SPELL_FAILED_INVALID_GLYPH = 174,
+ SPELL_FAILED_UNIQUE_GLYPH = 175,
+ SPELL_FAILED_GLYPH_SOCKET_LOCKED = 176,
+ SPELL_FAILED_NO_VALID_TARGETS = 177,
+ SPELL_FAILED_ITEM_AT_MAX_CHARGES = 178,
+ SPELL_FAILED_NOT_IN_BARBERSHOP = 179,
+ SPELL_FAILED_FISHING_TOO_LOW = 180,
+ SPELL_FAILED_UNKNOWN = 181
};
enum SpellFamilyNames
@@ -223,8 +239,12 @@ enum SpellFamilyNames
SPELLFAMILY_HUNTER = 9,
SPELLFAMILY_PALADIN = 10,
SPELLFAMILY_SHAMAN = 11,
- SPELLFAMILY_UNK2 = 12,
- SPELLFAMILY_POTION = 13
+ SPELLFAMILY_UNK2 = 12, // 2 spells (silence resistance)
+ SPELLFAMILY_POTION = 13,
+ // 14 - unused
+ SPELLFAMILY_DEATHKNIGHT = 15,
+ // 16 - unused
+ SPELLFAMILY_PET = 17
};
enum SpellDisableTypes
@@ -255,15 +275,15 @@ enum SpellSelectTargetTypes
};
//Some SpellFamilyFlags
-#define SPELLFAMILYFLAG_ROGUE_VANISH 0x000000800LL
-#define SPELLFAMILYFLAG_ROGUE_STEALTH 0x000400000LL
-#define SPELLFAMILYFLAG_ROGUE_BACKSTAB 0x000800004LL
-#define SPELLFAMILYFLAG_ROGUE_SAP 0x000000080LL
-#define SPELLFAMILYFLAG_ROGUE_FEINT 0x008000000LL
-#define SPELLFAMILYFLAG_ROGUE_KIDNEYSHOT 0x000200000LL
-#define SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE 0x9003E0000LL
-#define SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR 0x000004000LL
-#define SPELLFAMILYFLAG_SHAMAN_FROST_SHOCK 0x080000000LL
+#define SPELLFAMILYFLAG_ROGUE_VANISH 0x00000800
+#define SPELLFAMILYFLAG_ROGUE_STEALTH 0x00400000
+#define SPELLFAMILYFLAG_ROGUE_BACKSTAB 0x00800004
+#define SPELLFAMILYFLAG_ROGUE_SAP 0x00000080
+#define SPELLFAMILYFLAG_ROGUE_FEINT 0x08000000
+#define SPELLFAMILYFLAG_ROGUE_KIDNEYSHOT 0x00200000
+//#define SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE 0x9003E0000LL
+#define SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR 0x00004000
+#define SPELLFAMILYFLAG_SHAMAN_FROST_SHOCK 0x80000000
// Spell clasification
enum SpellSpecific
@@ -289,7 +309,8 @@ enum SpellSpecific
SPELL_WELL_FED = 18,
SPELL_DRINK = 19,
SPELL_FOOD = 20,
- SPELL_CHARM = 21,
+ SPELL_PRESENCE = 21,
+ SPELL_CHARM = 22,
};
#define SPELL_LINKED_MAX_SPELLS 200000
@@ -305,10 +326,13 @@ enum SpellLinkedType
SpellSpecific GetSpellSpecific(uint32 spellId);
// Different spell properties
-inline float GetSpellRadius(SpellRadiusEntry const *radius) { return (radius ? radius->Radius : 0); }
+inline float GetSpellRadiusForHostile(SpellRadiusEntry const *radius) { return (radius ? radius->radiusHostile : 0); }
+inline float GetSpellRadiusForFriend(SpellRadiusEntry const *radius) { return (radius ? radius->radiusFriend : 0); }
uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell = NULL);
-inline float GetSpellMinRange(SpellRangeEntry const *range) { return (range ? range->minRange : 0); }
-inline float GetSpellMaxRange(SpellRangeEntry const *range) { return (range ? range->maxRange : 0); }
+inline float GetSpellMinRangeForHostile(SpellRangeEntry const *range) { return (range ? range->minRangeHostile : 0); }
+inline float GetSpellMaxRangeForHostile(SpellRangeEntry const *range) { return (range ? range->maxRangeHostile : 0); }
+inline float GetSpellMinRangeForFriend(SpellRangeEntry const *range) { return (range ? range->minRangeFriend : 0); }
+inline float GetSpellMaxRangeForFriend(SpellRangeEntry const *range) { return (range ? range->maxRangeFriend : 0); }
inline uint32 GetSpellRangeType(SpellRangeEntry const *range) { return (range ? range->type : 0); }
inline uint32 GetSpellRecoveryTime(SpellEntry const *spellInfo) { return spellInfo->RecoveryTime > spellInfo->CategoryRecoveryTime ? spellInfo->RecoveryTime : spellInfo->CategoryRecoveryTime; }
int32 GetSpellDuration(SpellEntry const *spellInfo);
@@ -317,7 +341,7 @@ int32 GetSpellMaxDuration(SpellEntry const *spellInfo);
inline bool IsSpellHaveEffect(SpellEntry const *spellInfo, SpellEffects effect)
{
for(int i= 0; i < 3; ++i)
- if(spellInfo->Effect[i]==effect)
+ if(SpellEffects(spellInfo->Effect[i])==effect)
return true;
return false;
}
@@ -328,13 +352,27 @@ inline bool IsSealSpell(SpellEntry const *spellInfo)
{
//Collection of all the seal family flags. No other paladin spell has any of those.
return spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN &&
- ( spellInfo->SpellFamilyFlags & 0x4000A000200LL );
+ ( spellInfo->SpellFamilyFlags[1] & 0x26000C00
+ || spellInfo->SpellFamilyFlags[0] & 0x0A000000 );
}
inline bool IsElementalShield(SpellEntry const *spellInfo)
{
// family flags 10 (Lightning), 42 (Earth), 37 (Water), proc shield from T2 8 pieces bonus
- return (spellInfo->SpellFamilyFlags & 0x42000000400LL) || spellInfo->Id == 23552;
+ return (spellInfo->SpellFamilyFlags[1] & 0x420
+ || spellInfo->SpellFamilyFlags[0] & 0x00000400)
+ || spellInfo->Id == 23552;
+}
+
+inline bool IsExplicitDiscoverySpell(SpellEntry const *spellInfo)
+{
+ return spellInfo->Effect[0]==SPELL_EFFECT_CREATE_ITEM_2 && spellInfo->Effect[1]==SPELL_EFFECT_SCRIPT_EFFECT;
+}
+
+inline bool IsLootCraftingSpell(SpellEntry const *spellInfo)
+{
+ return spellInfo->Effect[0]==SPELL_EFFECT_CREATE_ITEM_2 &&
+ (spellInfo->Effect[1]==SPELL_EFFECT_SCRIPT_EFFECT || !spellInfo->EffectItemType[0]);
}
int32 CompareAuraRanks(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2);
@@ -342,6 +380,15 @@ bool IsSingleFromSpellSpecificPerCaster(uint32 spellSpec1, uint32 spellSpec2);
bool IsSingleFromSpellSpecificPerTarget(uint32 spellSpec1, uint32 spellSpec2);
bool IsPassiveSpell(uint32 spellId);
+inline bool IsPassiveSpellStackableWithRanks(SpellEntry const* spellProto)
+{
+ if(!IsPassiveSpell(spellProto->Id))
+ return false;
+
+ return !IsSpellHaveEffect(spellProto,SPELL_EFFECT_APPLY_AURA);
+}
+
+
inline bool IsDeathPersistentSpell(SpellEntry const *spellInfo)
{
switch(spellInfo->Id)
@@ -369,9 +416,10 @@ bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellI
bool IsAuraAddedBySpell(uint32 auraType, uint32 spellId);
-bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 zone_id,uint32 area_id);
+uint8 GetSpellAllowedInLocationError(SpellEntry const *spellInfo,uint32 map_id,uint32 zone_id,uint32 area_id,uint32 bgInstanceId);
extern bool IsAreaEffectTarget[TOTAL_SPELL_TARGETS];
+
inline bool IsAreaOfEffectSpell(SpellEntry const *spellInfo)
{
if(IsAreaEffectTarget[spellInfo->EffectImplicitTargetA[0]] || IsAreaEffectTarget[spellInfo->EffectImplicitTargetB[0]])
@@ -386,6 +434,7 @@ inline bool IsAreaOfEffectSpell(SpellEntry const *spellInfo)
inline bool IsAreaAuraEffect(uint32 effect)
{
if( effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ||
+ effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID ||
effect == SPELL_EFFECT_APPLY_AREA_AURA_FRIEND ||
effect == SPELL_EFFECT_APPLY_AREA_AURA_ENEMY ||
effect == SPELL_EFFECT_APPLY_AREA_AURA_PET ||
@@ -418,6 +467,11 @@ inline bool isSpellBreakStealth(SpellEntry const* spellInfo)
return !(spellInfo->AttributesEx & SPELL_ATTR_EX_NOT_BREAK_STEALTH);
}
+inline bool IsAutoRepeatRangedSpell(SpellEntry const* spellInfo)
+{
+ return (spellInfo->Attributes & SPELL_ATTR_RANGED) && (spellInfo->AttributesEx2 & SPELL_ATTR_EX2_AUTOREPEAT_FLAG);
+}
+
uint8 GetErrorAtShapeshiftedCast (SpellEntry const *spellInfo, uint32 form);
inline bool IsChanneledSpell(SpellEntry const* spellInfo)
@@ -445,6 +499,17 @@ inline uint32 GetSpellMechanicMask(SpellEntry const* spellInfo, int32 effect)
return mask;
}
+inline uint32 GetAllSpellMechanicMask(SpellEntry const* spellInfo)
+{
+ uint32 mask = 0;
+ if (spellInfo->Mechanic)
+ mask |= 1<<spellInfo->Mechanic;
+ for (int i=0; i< 3; ++i)
+ if (spellInfo->EffectMechanic[i])
+ mask |= 1<<spellInfo->EffectMechanic[i];
+ return mask;
+}
+
inline Mechanics GetEffectMechanic(SpellEntry const* spellInfo, int32 effect)
{
if (spellInfo->EffectMechanic[effect])
@@ -469,7 +534,7 @@ bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group);
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
// Spell affects related declarations (accessed using SpellMgr functions)
-typedef std::map<uint32, uint64> SpellAffectMap;
+typedef UNORDERED_MAP<uint32, flag96> SpellAffectMap;
// Spell proc event related declarations (accessed using SpellMgr functions)
enum ProcFlags
@@ -477,16 +542,16 @@ enum ProcFlags
PROC_FLAG_NONE = 0x00000000,
PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor
- PROC_FLAG_KILL_AND_GET_XP = 0x00000002, // 01 Kill that yields experience or honor
+ PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward)
- PROC_FLAG_SUCCESSFUL_MILEE_HIT = 0x00000004, // 02 Successful melee attack
- PROC_FLAG_TAKEN_MELEE_HIT = 0x00000008, // 03 Taken damage from melee strike hit
+ PROC_FLAG_SUCCESSFUL_MILEE_HIT = 0x00000004, // 02 Successful melee auto attack
+ PROC_FLAG_TAKEN_MELEE_HIT = 0x00000008, // 03 Taken damage from melee auto attack hit
PROC_FLAG_SUCCESSFUL_MELEE_SPELL_HIT = 0x00000010, // 04 Successful attack by Spell that use melee weapon
PROC_FLAG_TAKEN_MELEE_SPELL_HIT = 0x00000020, // 05 Taken damage by Spell that use melee weapon
- PROC_FLAG_SUCCESSFUL_RANGED_HIT = 0x00000040, // 06 Successful Ranged attack (all ranged attack deal as spell so newer set :( )
- PROC_FLAG_TAKEN_RANGED_HIT = 0x00000080, // 07 Taken damage from ranged attack (all ranged attack deal as spell so newer set :( )
+ PROC_FLAG_SUCCESSFUL_RANGED_HIT = 0x00000040, // 06 Successful Ranged auto attack
+ PROC_FLAG_TAKEN_RANGED_HIT = 0x00000080, // 07 Taken damage from ranged auto attack
PROC_FLAG_SUCCESSFUL_RANGED_SPELL_HIT = 0x00000100, // 08 Successful Ranged attack by Spell that use ranged weapon
PROC_FLAG_TAKEN_RANGED_SPELL_HIT = 0x00000200, // 09 Taken damage by Spell that use ranged weapon
@@ -537,19 +602,19 @@ enum ProcFlagsEx
PROC_EX_DEFLECT = 0x0000200,
PROC_EX_ABSORB = 0x0000400,
PROC_EX_REFLECT = 0x0000800,
- PROC_EX_INTERRUPT = 0x0001000, // Melle hit result can be Interrupt (not used)
+ PROC_EX_INTERRUPT = 0x0001000, // Melee hit result can be Interrupt (not used)
PROC_EX_RESERVED1 = 0x0002000,
PROC_EX_RESERVED2 = 0x0004000,
PROC_EX_RESERVED3 = 0x0008000,
PROC_EX_EX_TRIGGER_ALWAYS = 0x0010000, // If set trigger always ( no matter another flags) used for drop charges
- PROC_EX_EX_ONE_TIME_TRIGGER = 0x0020000 // If set trigger always but only one time
+ PROC_EX_EX_ONE_TIME_TRIGGER = 0x0020000 // If set trigger always but only one time (not used)
};
struct SpellProcEventEntry
{
uint32 schoolMask; // if nonzero - bit mask for matching proc condition based on spell candidate's school: Fire=2, Mask=1<<(2-1)=2
uint32 spellFamilyName; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyNamer value
- uint64 spellFamilyMask; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyFlags (like auras 107 and 108 do)
+ flag96 spellFamilyMask; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyFlags (like auras 107 and 108 do)
uint32 procFlags; // bitmask for matching proc event
uint32 procEx; // proc Extend info (see ProcFlagsEx)
float ppmRate; // for melee (ranged?) damage spells - proc rate per minute. if zero, falls back to flat chance from Spell.dbc
@@ -557,7 +622,15 @@ struct SpellProcEventEntry
uint32 cooldown; // hidden cooldown used for some spell proc events, applied to _triggered_spell_
};
+struct SpellBonusEntry
+{
+ float direct_damage;
+ float dot_damage;
+ float ap_bonus;
+};
+
typedef UNORDERED_MAP<uint32, SpellProcEventEntry> SpellProcEventMap;
+typedef UNORDERED_MAP<uint32, SpellBonusEntry> SpellBonusMap;
#define ELIXIR_BATTLE_MASK 0x1
#define ELIXIR_GUARDIAN_MASK 0x2
@@ -680,6 +753,7 @@ typedef std::map<uint32, SpellLearnSkillNode> SpellLearnSkillMap;
struct SpellLearnSpellNode
{
uint32 spell;
+ bool active; // show in spellbook or not
bool autoLearned;
};
@@ -687,6 +761,9 @@ typedef std::multimap<uint32, SpellLearnSpellNode> SpellLearnSpellMap;
typedef std::multimap<uint32, SkillLineAbilityEntry const*> SkillLineAbilityMap;
+typedef std::map<uint32, uint32> PetLevelupSpellSet;
+typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap;
+
inline bool IsPrimaryProfessionSkill(uint32 skill)
{
SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(skill);
@@ -724,6 +801,11 @@ typedef std::vector<uint32> SpellCustomAttribute;
typedef std::map<int32, std::vector<int32> > SpellLinkedMap;
+inline bool IsProfessionOrRidingSkill(uint32 skill)
+{
+ return IsProfessionSkill(skill) || skill == SKILL_RIDING;
+}
+
class SpellMgr
{
// Constructors
@@ -731,18 +813,18 @@ class SpellMgr
SpellMgr();
~SpellMgr();
- // Accessors (const or static functions)
+ // Accessors (const or static functions)
public:
// Spell affects
- uint64 GetSpellAffectMask(uint16 spellId, uint8 effectId) const
+ flag96 const*GetSpellAffect(uint16 spellId, uint8 effectId) const
{
SpellAffectMap::const_iterator itr = mSpellAffectMap.find((spellId<<8) + effectId);
if( itr != mSpellAffectMap.end( ) )
- return itr->second;
+ return &itr->second;
return 0;
}
- bool IsAffectedBySpell(SpellEntry const *spellInfo, uint32 spellId, uint8 effectId, uint64 familyFlags) const;
+ bool IsAffectedByMod(SpellEntry const *spellInfo, SpellModifier *mod) const;
SpellElixirMap const& GetSpellElixirMap() const { return mSpellElixirs; }
@@ -779,6 +861,23 @@ class SpellMgr
static bool IsSpellProcEventCanTriggeredBy( SpellProcEventEntry const * spellProcEvent, uint32 EventProcFlag, SpellEntry const * procSpell, uint32 procFlags, uint32 procExtra, bool active);
+ // Spell bonus data
+ SpellBonusEntry const* 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 itr = mSpellBonusMap.find(rank_1);
+ if( itr != mSpellBonusMap.end( ) )
+ return &itr->second;
+ }
+ return NULL;
+ }
+
// Spell target coordinates
SpellTargetPosition const* GetSpellTargetPosition(uint32 spell_id) const
{
@@ -823,6 +922,14 @@ class SpellMgr
return 0;
}
+ uint32 GetNextSpellInChain(uint32 spell_id) const
+ {
+ if(SpellChainNode const* node = GetSpellChainNode(spell_id))
+ return node->next;
+
+ return 0;
+ }
+
SpellsRequiringSpellMap const& GetSpellsRequiringSpell() const { return mSpellsReqSpell; }
// Note: not use rank for compare to spell ranks: spell chains isn't linear order
@@ -879,7 +986,7 @@ class SpellMgr
bool IsSpellLearnSpell(uint32 spell_id) const
{
- return mSpellLearnSpells.count(spell_id)!=0;
+ return mSpellLearnSpells.find(spell_id) != mSpellLearnSpells.end();
}
SpellLearnSpellMap::const_iterator GetBeginSpellLearnSpell(uint32 spell_id) const
@@ -902,10 +1009,14 @@ class SpellMgr
return false;
}
+ static bool IsProfessionOrRidingSpell(uint32 spellId);
static bool IsProfessionSpell(uint32 spellId);
static bool IsPrimaryProfessionSpell(uint32 spellId);
bool IsPrimaryProfessionFirstRankSpell(uint32 spellId) const;
+ bool IsSkillBonusSpell(uint32 spellId) const;
+
+
// Spell script targets
SpellScriptTarget::const_iterator GetBeginSpellScriptTarget(uint32 spell_id) const
{
@@ -945,11 +1056,6 @@ class SpellMgr
return 0;
else
return mSpellCustomAttr[spell_id];
- /*SpellCustomAttrMap::const_iterator itr = mSpellCustomAttrMap.find(spell_id);
- if(itr != mSpellCustomAttrMap.end())
- return itr->second;
- else
- return 0;*/
}
const std::vector<int32> *GetSpellLinked(int32 spell_id) const
@@ -961,7 +1067,16 @@ class SpellMgr
SpellEffectTargetTypes EffectTargetType[TOTAL_SPELL_EFFECTS];
SpellSelectTargetTypes SpellTargetType[TOTAL_SPELL_TARGETS];
- // Modifiers
+ PetLevelupSpellSet const* GetPetLevelupSpellList(uint32 petFamily) const
+ {
+ PetLevelupSpellMap::const_iterator itr = mPetLevelupSpellMap.find(petFamily);
+ if(itr != mPetLevelupSpellMap.end())
+ return &itr->second;
+ else
+ return NULL;
+ }
+
+ // Modifiers
public:
static SpellMgr& Instance();
@@ -974,12 +1089,14 @@ class SpellMgr
void LoadSpellAffects();
void LoadSpellElixirs();
void LoadSpellProcEvents();
+ void LoadSpellBonusess();
void LoadSpellTargetPositions();
void LoadSpellThreats();
void LoadSkillLineAbilityMap();
void LoadSpellPetAuras();
void LoadSpellCustomAttr();
void LoadSpellLinked();
+ void LoadPetLevelupSpellMap();
private:
SpellScriptTarget mSpellScriptTarget;
@@ -992,10 +1109,12 @@ class SpellMgr
SpellAffectMap mSpellAffectMap;
SpellElixirMap mSpellElixirs;
SpellProcEventMap mSpellProcEventMap;
+ SpellBonusMap mSpellBonusMap;
SkillLineAbilityMap mSkillLineAbilityMap;
SpellPetAuraMap mSpellPetAuraMap;
SpellCustomAttribute mSpellCustomAttr;
SpellLinkedMap mSpellLinkedMap;
+ PetLevelupSpellMap mPetLevelupSpellMap;
};
#define spellmgr SpellMgr::Instance()
diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp
index ae96953e337..5d31614cecb 100644
--- a/src/game/StatSystem.cpp
+++ b/src/game/StatSystem.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -51,24 +51,17 @@ bool Player::UpdateStats(Stats stat)
switch(stat)
{
case STAT_STRENGTH:
- UpdateAttackPowerAndDamage();
UpdateShieldBlockValue();
break;
case STAT_AGILITY:
UpdateArmor();
- UpdateAttackPowerAndDamage(true);
- if(getClass() == CLASS_ROGUE || getClass() == CLASS_HUNTER || getClass() == CLASS_DRUID && m_form==FORM_CAT)
- UpdateAttackPowerAndDamage();
-
UpdateAllCritPercentages();
UpdateDodgePercentage();
break;
-
case STAT_STAMINA: UpdateMaxHealth(); break;
case STAT_INTELLECT:
UpdateMaxPower(POWER_MANA);
UpdateAllSpellCritChances();
- UpdateAttackPowerAndDamage(true); //SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, only intellect currently
UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
break;
@@ -78,11 +71,60 @@ bool Player::UpdateStats(Stats stat)
default:
break;
}
+
+ if (stat == STAT_STRENGTH)
+ {
+ UpdateAttackPowerAndDamage(false);
+ if (HasAuraTypeWithMiscvalue(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, stat))
+ UpdateAttackPowerAndDamage(true);
+ }
+ else if (stat == STAT_AGILITY)
+ {
+ UpdateAttackPowerAndDamage(false);
+ UpdateAttackPowerAndDamage(true);
+ }
+ else
+ {
+ // Need update (exist AP from stat auras)
+ if (HasAuraTypeWithMiscvalue(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, stat))
+ UpdateAttackPowerAndDamage(false);
+ if (HasAuraTypeWithMiscvalue(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, stat))
+ UpdateAttackPowerAndDamage(true);
+ }
+
UpdateSpellDamageAndHealingBonus();
UpdateManaRegen();
+
+ // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
+ uint32 mask = 0;
+ AuraList const& modRatingFromStat = GetAurasByType(SPELL_AURA_MOD_RATING_FROM_STAT);
+ for(AuraList::const_iterator i = modRatingFromStat.begin();i != modRatingFromStat.end(); ++i)
+ if (Stats((*i)->GetMiscBValue()) == stat)
+ mask |= (*i)->GetMiscValue();
+ if (mask)
+ {
+ for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
+ if (mask & (1 << rating))
+ ApplyRatingMod(CombatRating(rating), 0, true);
+ }
return true;
}
+void Player::ApplySpellDamageBonus(int32 amount, bool apply)
+{
+ m_baseSpellDamage+=apply?amount:-amount;
+ // For speed just update for client
+ ApplyModUInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS, amount, apply);
+}
+
+void Player::ApplySpellHealingBonus(int32 amount, bool apply)
+{
+ m_baseSpellHealing+=apply?amount:-amount;
+ // For speed just update for client
+ for(int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; i++)
+ ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i, amount, apply);;
+}
+
void Player::UpdateSpellDamageAndHealingBonus()
{
// Magic damage modifiers implemented in Unit::SpellDamageBonus
@@ -155,7 +197,7 @@ void Player::UpdateArmor()
{
Modifier* mod = (*i)->GetModifier();
if(mod->m_miscvalue & SPELL_SCHOOL_MASK_NORMAL)
- value += int32(GetStat(Stats((*i)->GetMiscBValue())) * (*i)->GetModifierValue() / 100.0f);
+ value += int32(GetStat(Stats((*i)->GetMiscBValue())) * mod->m_amount / 100.0f);
}
value *= GetModifierValue(unitMod, TOTAL_PCT);
@@ -213,6 +255,12 @@ void Player::UpdateMaxPower(Powers power)
SetMaxPower(power, uint32(value));
}
+void Player::ApplyFeralAPBonus(int32 amount, bool apply)
+{
+ m_baseFeralAP+= apply ? amount:-amount;
+ UpdateAttackPowerAndDamage();
+}
+
void Player::UpdateAttackPowerAndDamage(bool ranged )
{
float val2 = 0.0f;
@@ -253,11 +301,12 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
{
switch(getClass())
{
- case CLASS_WARRIOR: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
- case CLASS_PALADIN: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
- case CLASS_ROGUE: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
- case CLASS_HUNTER: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
- case CLASS_SHAMAN: val2 = level*2.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
+ case CLASS_WARRIOR: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
+ case CLASS_PALADIN: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
+ case CLASS_DEATH_KNIGHT: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
+ case CLASS_ROGUE: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
+ case CLASS_HUNTER: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
+ case CLASS_SHAMAN: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
case CLASS_DRUID:
{
//Check if Predatory Strikes is skilled
@@ -286,12 +335,12 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
switch(m_form)
{
case FORM_CAT:
- val2 = getLevel()*(mLevelMult+2.0f) + GetStat(STAT_STRENGTH)*2.0f + GetStat(STAT_AGILITY) - 20.0f; break;
+ val2 = getLevel()*(mLevelMult+2.0f) + GetStat(STAT_STRENGTH)*2.0f + GetStat(STAT_AGILITY) - 20.0f + m_baseFeralAP; break;
case FORM_BEAR:
case FORM_DIREBEAR:
- val2 = getLevel()*(mLevelMult+3.0f) + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
+ val2 = getLevel()*(mLevelMult+3.0f) + GetStat(STAT_STRENGTH)*2.0f - 20.0f + m_baseFeralAP; break;
case FORM_MOONKIN:
- val2 = getLevel()*(mLevelMult+1.5f) + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
+ val2 = getLevel()*(mLevelMult+1.5f) + GetStat(STAT_STRENGTH)*2.0f - 20.0f + m_baseFeralAP; break;
default:
val2 = GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
}
@@ -309,17 +358,26 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
//add dynamic flat mods
- if( ranged && (getClassMask() & CLASSMASK_WAND_USERS)==0)
+ if( ranged )
+ {
+ if ((getClassMask() & CLASSMASK_WAND_USERS)==0)
+ {
+ AuraList const& mRAPbyStat = GetAurasByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT);
+ for(AuraList::const_iterator i = mRAPbyStat.begin();i != mRAPbyStat.end(); ++i)
+ attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifier()->m_amount / 100.0f);
+ }
+ }
+ else
{
- AuraList const& mRAPbyIntellect = GetAurasByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT);
- for(AuraList::const_iterator i = mRAPbyIntellect.begin();i != mRAPbyIntellect.end(); ++i)
- attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifierValue() / 100.0f);
+ AuraList const& mAPbyStat = GetAurasByType(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT);
+ for(AuraList::const_iterator i = mAPbyStat.begin();i != mAPbyStat.end(); ++i)
+ attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifier()->m_amount / 100.0f);
}
float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
- SetUInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
- SetUInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
+ SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
+ SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
//automatically update weapon damage after attack power modification
@@ -386,8 +444,15 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, fl
weapon_mindamage = lvl*0.85*att_speed;
weapon_maxdamage = lvl*1.25*att_speed;
}
- else if(!IsUseEquipedWeapon(attType==BASE_ATTACK)) //check if player not in form but still can't use weapon (broken/etc)
+ else if(!CanUseAttackType(attType)) //check if player not in form but still can't use (disarm case)
{
+ //cannot use ranged/off attack, set values to 0
+ if (attType != BASE_ATTACK)
+ {
+ min_damage=0;
+ max_damage=0;
+ return;
+ }
weapon_mindamage = BASE_MINDAMAGE;
weapon_maxdamage = BASE_MAXDAMAGE;
}
@@ -554,6 +619,24 @@ void Player::UpdateSpellCritChance(uint32 school)
SetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + school, crit);
}
+void Player::UpdateMeleeHitChances()
+{
+ m_modMeleeHitChance = GetTotalAuraModifier(SPELL_AURA_MOD_HIT_CHANCE);
+ m_modMeleeHitChance+= GetRatingBonusValue(CR_HIT_MELEE);
+}
+
+void Player::UpdateRangedHitChances()
+{
+ m_modRangedHitChance = GetTotalAuraModifier(SPELL_AURA_MOD_HIT_CHANCE);
+ m_modRangedHitChance+= GetRatingBonusValue(CR_HIT_RANGED);
+}
+
+void Player::UpdateSpellHitChances()
+{
+ m_modSpellHitChance = GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_HIT_CHANCE);
+ m_modSpellHitChance+= GetRatingBonusValue(CR_HIT_SPELL);
+}
+
void Player::UpdateAllSpellCritChances()
{
for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; i++)
@@ -574,10 +657,10 @@ void Player::UpdateExpertise(WeaponAttackType attack)
{
// item neutral spell
if((*itr)->GetSpellProto()->EquippedItemClass == -1)
- expertise += (*itr)->GetModifierValue();
+ expertise += (*itr)->GetModifier()->m_amount;
// item dependent spell
else if(weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellProto()))
- expertise += (*itr)->GetModifierValue();
+ expertise += (*itr)->GetModifier()->m_amount;
}
if(expertise < 0)
@@ -591,6 +674,12 @@ void Player::UpdateExpertise(WeaponAttackType attack)
}
}
+void Player::ApplyManaRegenBonus(int32 amount, bool apply)
+{
+ m_baseManaRegen+= apply ? amount : -amount;
+ UpdateManaRegen();
+}
+
void Player::UpdateManaRegen()
{
float Intellect = GetStat(STAT_INTELLECT);
@@ -600,14 +689,14 @@ void Player::UpdateManaRegen()
power_regen *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);
// Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
- float power_regen_mp5 = GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) / 5.0f;
+ float power_regen_mp5 = (GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) + m_baseManaRegen) / 5.0f;
// Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
AuraList const& regenAura = GetAurasByType(SPELL_AURA_MOD_MANA_REGEN_FROM_STAT);
for(AuraList::const_iterator i = regenAura.begin();i != regenAura.end(); ++i)
{
Modifier* mod = (*i)->GetModifier();
- power_regen_mp5 += GetStat(Stats(mod->m_miscvalue)) * (*i)->GetModifierValue() / 500.0f;
+ power_regen_mp5 += GetStat(Stats(mod->m_miscvalue)) * mod->m_amount / 500.0f;
}
// Bonus from some dummy auras
@@ -624,9 +713,9 @@ void Player::UpdateManaRegen()
int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
if (modManaRegenInterrupt > 100)
modManaRegenInterrupt = 100;
- SetStatFloatValue(PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT, power_regen_mp5 + power_regen * modManaRegenInterrupt / 100.0f);
+ SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + power_regen * modManaRegenInterrupt / 100.0f);
- SetStatFloatValue(PLAYER_FIELD_MOD_MANA_REGEN, power_regen_mp5 + power_regen);
+ SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
}
void Player::_ApplyAllStatBonuses()
@@ -712,6 +801,27 @@ void Creature::UpdateMaxPower(Powers power)
void Creature::UpdateAttackPowerAndDamage(bool ranged)
{
+ UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER;
+
+ uint16 index = UNIT_FIELD_ATTACK_POWER;
+ uint16 index_mod = UNIT_FIELD_ATTACK_POWER_MODS;
+ uint16 index_mult = UNIT_FIELD_ATTACK_POWER_MULTIPLIER;
+
+ if(ranged)
+ {
+ index = UNIT_FIELD_RANGED_ATTACK_POWER;
+ index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MODS;
+ index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER;
+ }
+
+ float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
+ float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
+ float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
+
+ SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
+ SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
+ SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
+
//automatically update weapon damage after attack power modification
if(ranged)
UpdateDamagePhysical(RANGED_ATTACK);
@@ -755,7 +865,7 @@ void Creature::UpdateDamagePhysical(WeaponAttackType attType)
float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
float total_pct = GetModifierValue(unitMod, TOTAL_PCT);
- if(attType == BASE_ATTACK && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISARMED))
+ if(!CanUseAttackType(attType))
{
weapon_mindamage = 0;
weapon_maxdamage = 0;
@@ -923,7 +1033,7 @@ void Pet::UpdateAttackPowerAndDamage(bool ranged)
if(getPetType() == HUNTER_PET) //hunter pets benefit from owner's attack power
{
bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.22f;
- SetBonusDamage( int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.125f));
+ SetBonusDamage( int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.1287f));
}
//demons benefit from warlocks shadow or fire damage
else if(getPetType() == SUMMON_PET && owner->getClass() == CLASS_WARLOCK)
@@ -954,9 +1064,9 @@ void Pet::UpdateAttackPowerAndDamage(bool ranged)
float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
//UNIT_FIELD_(RANGED)_ATTACK_POWER field
- SetUInt32Value(UNIT_FIELD_ATTACK_POWER, (uint32)base_attPower);
+ SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)base_attPower);
//UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
- SetUInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (uint32)attPowerMod);
+ SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)attPowerMod);
//UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, attPowerMultiplier);
diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp
index acdf7762b71..bb8486c8beb 100644
--- a/src/game/TargetedMovementGenerator.cpp
+++ b/src/game/TargetedMovementGenerator.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/TargetedMovementGenerator.h b/src/game/TargetedMovementGenerator.h
index 609e517078c..2083dd95369 100644
--- a/src/game/TargetedMovementGenerator.h
+++ b/src/game/TargetedMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/TaxiHandler.cpp b/src/game/TaxiHandler.cpp
index c65a4214892..289e141fdd3 100644
--- a/src/game/TaxiHandler.cpp
+++ b/src/game/TaxiHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -56,7 +56,7 @@ void WorldSession::SendTaxiStatus( uint64 guid )
return;
}
- uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId());
+ uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId(),GetPlayer( )->GetTeam());
// not found nearest
if(curloc == 0)
@@ -71,7 +71,7 @@ void WorldSession::SendTaxiStatus( uint64 guid )
sLog.outDebug( "WORLD: Sent SMSG_TAXINODE_STATUS" );
}
-void WorldSession::HandleTaxiQueryAvailableNodesOpcode( WorldPacket & recv_data )
+void WorldSession::HandleTaxiQueryAvailableNodes( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data,8);
@@ -103,7 +103,7 @@ void WorldSession::HandleTaxiQueryAvailableNodesOpcode( WorldPacket & recv_data
void WorldSession::SendTaxiMenu( Creature* unit )
{
// find current node
- uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId());
+ uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId(),GetPlayer( )->GetTeam());
if ( curloc == 0 )
return;
@@ -136,7 +136,7 @@ void WorldSession::SendDoFlight( uint16 MountId, uint32 path, uint32 pathNode )
bool WorldSession::SendLearnNewTaxiNode( Creature* unit )
{
// find current node
- uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId());
+ uint32 curloc = objmgr.GetNearestTaxiNode(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),unit->GetMapId(),GetPlayer( )->GetTeam());
if ( curloc == 0 )
return true; // `true` send to avoid WorldSession::SendTaxiMenu call with one more curlock seartch with same false result.
diff --git a/src/game/TemporarySummon.cpp b/src/game/TemporarySummon.cpp
index d30ad9ec56e..147133bd362 100644
--- a/src/game/TemporarySummon.cpp
+++ b/src/game/TemporarySummon.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/TemporarySummon.h b/src/game/TemporarySummon.h
index fe9763f5301..eaefbab1d84 100644
--- a/src/game/TemporarySummon.h
+++ b/src/game/TemporarySummon.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/ThreatManager.cpp b/src/game/ThreatManager.cpp
index ac124da6951..111da6bff48 100644
--- a/src/game/ThreatManager.cpp
+++ b/src/game/ThreatManager.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -267,26 +267,36 @@ HostilReference* ThreatContainer::selectNextVictim(Creature* pAttacker, HostilRe
{
HostilReference* currentRef = NULL;
bool found = false;
+ bool noPriorityTargetFound = false;
std::list<HostilReference*>::iterator lastRef = iThreatList.end();
lastRef--;
- for(std::list<HostilReference*>::iterator iter = iThreatList.begin(); iter != iThreatList.end() && !found; ++iter)
+ for(std::list<HostilReference*>::iterator iter = iThreatList.begin(); iter != iThreatList.end() && !found;)
{
currentRef = (*iter);
Unit* target = currentRef->getTarget();
assert(target); // if the ref has status online the target must be there !
- // some units are preferred in comparison to others
- if(iter != lastRef && (target->IsImmunedToDamage(pAttacker->GetMeleeDamageSchoolMask(), false) ||
- target->hasUnitState(UNIT_STAT_CONFUSED)
- ) )
+ // some units are prefered in comparison to others
+ if(!noPriorityTargetFound && (target->IsImmunedToDamage(pAttacker->GetMeleeDamageSchoolMask()) || target->hasNegativeAuraWithInterruptFlag(AURA_INTERRUPT_FLAG_DAMAGE)) )
{
- // current victim is a second choice target, so don't compare threat with it below
- if(currentRef == pCurrentVictim)
- pCurrentVictim = NULL;
- continue;
+ if(iter != lastRef)
+ {
+ // current victim is a second choice target, so don't compare threat with it below
+ if(currentRef == pCurrentVictim)
+ pCurrentVictim = NULL;
+ ++iter;
+ continue;
+ }
+ else
+ {
+ // if we reached to this point, everyone in the threatlist is a second choice target. In such a situation the target with the highest threat should be attacked.
+ noPriorityTargetFound = true;
+ iter = iThreatList.begin();
+ continue;
+ }
}
if(!pAttacker->IsOutOfThreatArea(target)) // skip non attackable currently targets
@@ -314,6 +324,7 @@ HostilReference* ThreatContainer::selectNextVictim(Creature* pAttacker, HostilRe
break;
}
}
+ ++iter;
}
if(!found)
currentRef = NULL;
diff --git a/src/game/ThreatManager.h b/src/game/ThreatManager.h
index 56281b9f8f3..3b07a4ec43d 100644
--- a/src/game/ThreatManager.h
+++ b/src/game/ThreatManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -208,10 +208,10 @@ class TRINITY_DLL_SPEC ThreatManager
// methods to access the lists from the outside to do sume dirty manipulation (scriping and such)
// I hope they are used as little as possible.
- inline std::list<HostilReference*>& getThreatList() { return iThreatContainer.getThreatList(); }
- inline std::list<HostilReference*>& getOfflieThreatList() { return iThreatOfflineContainer.getThreatList(); }
- inline ThreatContainer& getOnlineContainer() { return iThreatContainer; }
- inline ThreatContainer& getOfflineContainer() { return iThreatOfflineContainer; }
+ std::list<HostilReference*>& getThreatList() { return iThreatContainer.getThreatList(); }
+ std::list<HostilReference*>& getOfflieThreatList() { return iThreatOfflineContainer.getThreatList(); }
+ ThreatContainer& getOnlineContainer() { return iThreatContainer; }
+ ThreatContainer& getOfflineContainer() { return iThreatOfflineContainer; }
};
//=================================================
diff --git a/src/game/TicketHandler.cpp b/src/game/TicketHandler.cpp
index 6a4606aadca..068a1592df1 100644
--- a/src/game/TicketHandler.cpp
+++ b/src/game/TicketHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS
+ * Copyright (C) 2005-2009 MaNGOS
*
- * Copyright (C) 2008 Trinity
+ * Copyright (C) 2008-2009 Trinity
*
* 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
diff --git a/src/game/TicketMgr.cpp b/src/game/TicketMgr.cpp
index e8b75c9f284..8d89bf9d20b 100644
--- a/src/game/TicketMgr.cpp
+++ b/src/game/TicketMgr.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS
+ * Copyright (C) 2005-2009 MaNGOS
*
- * Copyright (C) 2008 Trinity
+ * Copyright (C) 2008-2009 Trinity
*
* 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
diff --git a/src/game/TicketMgr.h b/src/game/TicketMgr.h
index f3fa7d98f7d..bee4d49fa0d 100644
--- a/src/game/TicketMgr.h
+++ b/src/game/TicketMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS
+ * Copyright (C) 2005-2009 MaNGOS
*
- * Copyright (C) 2008 Trinity
+ * Copyright (C) 2008-2009 Trinity
*
* 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
diff --git a/src/game/Tools.cpp b/src/game/Tools.cpp
index e553b86f8e9..d1728c78c9e 100644
--- a/src/game/Tools.cpp
+++ b/src/game/Tools.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Tools.h b/src/game/Tools.h
index 2a71121129b..bdb3ad8e762 100644
--- a/src/game/Tools.h
+++ b/src/game/Tools.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Totem.cpp b/src/game/Totem.cpp
index 2889f6f9188..ae06be79187 100644
--- a/src/game/Totem.cpp
+++ b/src/game/Totem.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -178,19 +178,19 @@ void Totem::SetTypeBySummonSpell(SpellEntry const * spellProto)
m_type = TOTEM_STATUE; //Jewelery statue
}
-bool Totem::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
+bool Totem::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const
{
-/* for (int i=0;i<3;i++)
+ // TODO: possibly all negative auras immuned?
+ switch(spellInfo->EffectApplyAuraName[index])
{
- switch(spellInfo->EffectApplyAuraName[i])
- {
- case SPELL_AURA_PERIODIC_DAMAGE:
- case SPELL_AURA_PERIODIC_LEECH:
- return true;
- default:
- continue;
- }
- }*/
- return Creature::IsImmunedToSpell(spellInfo, useCharges);
+ case SPELL_AURA_PERIODIC_DAMAGE:
+ case SPELL_AURA_PERIODIC_LEECH:
+ case SPELL_AURA_MOD_FEAR:
+ case SPELL_AURA_TRANSFORM:
+ return true;
+ default:
+ break;
+ }
+ return Creature::IsImmunedToSpellEffect(spellInfo, index);
}
diff --git a/src/game/Totem.h b/src/game/Totem.h
index 82b183d5d62..af2ca7a4023 100644
--- a/src/game/Totem.h
+++ b/src/game/Totem.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -57,7 +57,7 @@ class Totem : public Creature
void UpdateAttackPowerAndDamage(bool /*ranged*/ ) {}
void UpdateDamagePhysical(WeaponAttackType /*attType*/) {}
- bool IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges = false);
+ bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
protected:
TotemType m_type;
diff --git a/src/game/TotemAI.cpp b/src/game/TotemAI.cpp
index 3593f8396a1..7d9a6cfd058 100644
--- a/src/game/TotemAI.cpp
+++ b/src/game/TotemAI.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -68,9 +68,9 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
if (!spellInfo)
return;
- // Get spell rangy
+ // Get spell range
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
- float max_range = GetSpellMaxRange(srange);
+ float max_range = GetSpellMaxRangeForHostile(srange);
// SPELLMOD_RANGE not applied in this place just because not existence range mods for attacking totems
@@ -82,21 +82,10 @@ TotemAI::UpdateAI(const uint32 /*diff*/)
!victim->isTargetableForAttack() || !i_totem.IsWithinDistInMap(victim, max_range) ||
i_totem.IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(&i_totem,false) )
{
- CellPair p(Trinity::ComputeCellPair(i_totem.GetPositionX(),i_totem.GetPositionY()));
- Cell cell(p);
- cell.data.Part.reserved = ALL_DISTRICT;
-
victim = NULL;
-
Trinity::NearestAttackableUnitInObjectRangeCheck u_check(&i_totem, &i_totem, max_range);
- Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck> checker(victim, u_check);
-
- TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
- TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
-
- CellLock<GridReadGuard> cell_lock(cell, p);
- cell_lock->Visit(cell_lock, grid_object_checker, *MapManager::Instance().GetMap(i_totem.GetMapId(), &i_totem));
- cell_lock->Visit(cell_lock, world_object_checker, *MapManager::Instance().GetMap(i_totem.GetMapId(), &i_totem));
+ Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck> checker(&i_totem, victim, u_check);
+ i_totem.VisitNearbyObject(max_range, checker);
}
// If have target
diff --git a/src/game/TotemAI.h b/src/game/TotemAI.h
index 50ea764abfd..9a19d2c99e5 100644
--- a/src/game/TotemAI.h
+++ b/src/game/TotemAI.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/TradeHandler.cpp b/src/game/TradeHandler.cpp
index 278bb37c81c..cc3bcab62d2 100644
--- a/src/game/TradeHandler.cpp
+++ b/src/game/TradeHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp
index 86d21c9a724..a46fdee553b 100644
--- a/src/game/Transports.cpp
+++ b/src/game/Transports.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -139,7 +139,7 @@ void MapManager::LoadTransports()
Transport::Transport() : GameObject()
{
// 2.3.2 - 0x5A
- m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
}
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)
@@ -147,6 +147,7 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
Relocate(x,y,z,ang);
SetMapId(mapid);
+ // instance id and phaseMask isn't set to values different from std.
if(!IsPositionValid())
{
@@ -170,9 +171,10 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size);
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
- SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
-
- SetUInt32Value(OBJECT_FIELD_ENTRY, goinfo->id);
+ //SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
+ SetUInt32Value(GAMEOBJECT_FLAGS, MAKE_PAIR32(0x28, 0x64));
+ SetUInt32Value(GAMEOBJECT_LEVEL, m_period);
+ SetEntry(goinfo->id);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -181,7 +183,7 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
SetGoAnimProgress(animprogress);
if(dynflags)
- SetUInt32Value(GAMEOBJECT_DYN_FLAGS, dynflags);
+ SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags));
return true;
}
@@ -479,11 +481,8 @@ bool Transport::AddPassenger(Player* passenger)
bool Transport::RemovePassenger(Player* passenger)
{
- if (m_passengers.find(passenger) != m_passengers.end())
- {
- sLog.outDetail("Player %s removed from transport %s.", passenger->GetName(), this->m_name.c_str());
- m_passengers.erase(passenger);
- }
+ if (m_passengers.erase(passenger))
+ sLog.outDetail("Player %s removed from transport %s.", passenger->GetName(), m_name.c_str());
return true;
}
diff --git a/src/game/Transports.h b/src/game/Transports.h
index a814a0f70b9..6fd0898362c 100644
--- a/src/game/Transports.h
+++ b/src/game/Transports.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -38,16 +38,16 @@ class TransportPath
uint32 delay;
};
- inline void SetLength(const unsigned int sz)
+ void SetLength(const unsigned int sz)
{
i_nodes.resize( sz );
}
- inline unsigned int Size(void) const { return i_nodes.size(); }
- inline bool Empty(void) const { return i_nodes.empty(); }
- inline void Resize(unsigned int sz) { i_nodes.resize(sz); }
- inline void Clear(void) { i_nodes.clear(); }
- inline PathNode* GetNodes(void) { return static_cast<PathNode *>(&i_nodes[0]); }
+ unsigned int Size(void) const { return i_nodes.size(); }
+ bool Empty(void) const { return i_nodes.empty(); }
+ void Resize(unsigned int sz) { i_nodes.resize(sz); }
+ void Clear(void) { i_nodes.clear(); }
+ PathNode* GetNodes(void) { return static_cast<PathNode *>(&i_nodes[0]); }
PathNode& operator[](const unsigned int idx) { return i_nodes[idx]; }
const PathNode& operator()(const unsigned int idx) const { return i_nodes[idx]; }
diff --git a/src/game/Traveller.h b/src/game/Traveller.h
index b8865282672..89af68154e2 100644
--- a/src/game/Traveller.h
+++ b/src/game/Traveller.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -47,17 +47,33 @@ struct TRINITY_DLL_DECL Traveller
operator T&(void) { return i_traveller; }
operator const T&(void) { return i_traveller; }
- inline float GetPositionX() const { return i_traveller.GetPositionX(); }
- inline float GetPositionY() const { return i_traveller.GetPositionY(); }
- inline float GetPositionZ() const { return i_traveller.GetPositionZ(); }
- inline T& GetTraveller(void) { return i_traveller; }
+ float GetPositionX() const { return i_traveller.GetPositionX(); }
+ float GetPositionY() const { return i_traveller.GetPositionY(); }
+ float GetPositionZ() const { return i_traveller.GetPositionZ(); }
+ T& GetTraveller(void) { return i_traveller; }
float Speed(void) { assert(false); return 0.0f; }
+ float GetMoveDestinationTo(float x, float y, float z);
+ uint32 GetTotalTrevelTimeTo(float x, float y, float z);
+
void Relocation(float x, float y, float z, float orientation) {}
void Relocation(float x, float y, float z) { Relocation(x, y, z, i_traveller.GetOrientation()); }
void MoveTo(float x, float y, float z, uint32 t) {}
};
+template<class T>
+inline uint32 Traveller<T>::GetTotalTrevelTimeTo(float x, float y, float z)
+{
+ float dist = GetMoveDestinationTo(x,y,z);
+ float speed = 0.001f;
+ if(GetTraveller().hasUnitState(UNIT_STAT_CHARGING))
+ speed *= SPEED_CHARGE;
+ else
+ speed *= Speed(); // speed is in seconds so convert from second to millisecond
+
+ return static_cast<uint32>(dist/speed);
+}
+
// specialization for creatures
template<>
inline float Traveller<Creature>::Speed()
@@ -77,6 +93,20 @@ inline void Traveller<Creature>::Relocation(float x, float y, float z, float ori
}
template<>
+inline float Traveller<Creature>::GetMoveDestinationTo(float x, float y, float z)
+{
+ float dx = x - GetPositionX();
+ float dy = y - GetPositionY();
+ float dz = z - GetPositionZ();
+
+ if(i_traveller.hasUnitState(UNIT_STAT_IN_FLIGHT))
+ return sqrt((dx*dx) + (dy*dy) + (dz*dz));
+ else //Walking on the ground
+ return sqrt((dx*dx) + (dy*dy));
+}
+
+
+template<>
inline void Traveller<Creature>::MoveTo(float x, float y, float z, uint32 t)
{
//Call for creature group update
@@ -98,6 +128,19 @@ inline float Traveller<Player>::Speed()
}
template<>
+inline float Traveller<Player>::GetMoveDestinationTo(float x, float y, float z)
+{
+ float dx = x - GetPositionX();
+ float dy = y - GetPositionY();
+ float dz = z - GetPositionZ();
+
+ if (i_traveller.isInFlight())
+ return sqrt((dx*dx) + (dy*dy) + (dz*dz));
+ else //Walking on the ground
+ return sqrt((dx*dx) + (dy*dy));
+}
+
+template<>
inline void Traveller<Player>::Relocation(float x, float y, float z, float orientation)
{
MapManager::Instance().GetMap(i_traveller.GetMapId(), &i_traveller)->PlayerRelocation(&i_traveller, x, y, z, orientation);
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 0fbeb5a9f7d..dbffb58c481 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -47,6 +47,7 @@
#include "CellImpl.h"
#include "Path.h"
#include "CreatureGroups.h"
+#include "Traveller.h"
#include <math.h>
@@ -60,92 +61,17 @@ float baseMoveSpeed[MAX_MOVE_TYPE] =
3.141594f, // MOVE_TURN_RATE
7.0f, // MOVE_FLIGHT
4.5f, // MOVE_FLIGHT_BACK
+ 3.14f // MOVE_PITCH_RATE
};
-void InitTriggerAuraData();
-
-// auraTypes contains attacker auras capable of proc'ing cast auras
-static Unit::AuraTypeSet GenerateAttakerProcCastAuraTypes()
-{
- static Unit::AuraTypeSet auraTypes;
- auraTypes.insert(SPELL_AURA_DUMMY);
- auraTypes.insert(SPELL_AURA_PROC_TRIGGER_SPELL);
- auraTypes.insert(SPELL_AURA_MOD_HASTE);
- auraTypes.insert(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- return auraTypes;
-}
-
-// auraTypes contains victim auras capable of proc'ing cast auras
-static Unit::AuraTypeSet GenerateVictimProcCastAuraTypes()
-{
- static Unit::AuraTypeSet auraTypes;
- auraTypes.insert(SPELL_AURA_DUMMY);
- auraTypes.insert(SPELL_AURA_PRAYER_OF_MENDING);
- auraTypes.insert(SPELL_AURA_PROC_TRIGGER_SPELL);
- return auraTypes;
-}
-
-// auraTypes contains auras capable of proc effect/damage (but not cast) for attacker
-static Unit::AuraTypeSet GenerateAttakerProcEffectAuraTypes()
-{
- static Unit::AuraTypeSet auraTypes;
- auraTypes.insert(SPELL_AURA_MOD_DAMAGE_DONE);
- auraTypes.insert(SPELL_AURA_PROC_TRIGGER_DAMAGE);
- auraTypes.insert(SPELL_AURA_MOD_CASTING_SPEED);
- auraTypes.insert(SPELL_AURA_MOD_RATING);
- return auraTypes;
-}
-
-// auraTypes contains auras capable of proc effect/damage (but not cast) for victim
-static Unit::AuraTypeSet GenerateVictimProcEffectAuraTypes()
-{
- static Unit::AuraTypeSet auraTypes;
- auraTypes.insert(SPELL_AURA_MOD_RESISTANCE);
- auraTypes.insert(SPELL_AURA_PROC_TRIGGER_DAMAGE);
- auraTypes.insert(SPELL_AURA_MOD_PARRY_PERCENT);
- auraTypes.insert(SPELL_AURA_MOD_BLOCK_PERCENT);
- auraTypes.insert(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
- return auraTypes;
-}
-
-static Unit::AuraTypeSet attackerProcCastAuraTypes = GenerateAttakerProcCastAuraTypes();
-static Unit::AuraTypeSet attackerProcEffectAuraTypes = GenerateAttakerProcEffectAuraTypes();
-
-static Unit::AuraTypeSet victimProcCastAuraTypes = GenerateVictimProcCastAuraTypes();
-static Unit::AuraTypeSet victimProcEffectAuraTypes = GenerateVictimProcEffectAuraTypes();
-
-// auraTypes contains auras capable of proc'ing for attacker and victim
-static Unit::AuraTypeSet GenerateProcAuraTypes()
-{
- InitTriggerAuraData();
-
- Unit::AuraTypeSet auraTypes;
- auraTypes.insert(attackerProcCastAuraTypes.begin(),attackerProcCastAuraTypes.end());
- auraTypes.insert(attackerProcEffectAuraTypes.begin(),attackerProcEffectAuraTypes.end());
- auraTypes.insert(victimProcCastAuraTypes.begin(),victimProcCastAuraTypes.end());
- auraTypes.insert(victimProcEffectAuraTypes.begin(),victimProcEffectAuraTypes.end());
- return auraTypes;
-}
-
-static Unit::AuraTypeSet procAuraTypes = GenerateProcAuraTypes();
-
-bool IsPassiveStackableSpell( uint32 spellId )
-{
- if(!IsPassiveSpell(spellId))
- return false;
-
- SpellEntry const* spellProto = sSpellStore.LookupEntry(spellId);
- if(!spellProto)
- return false;
-
- for(int j = 0; j < 3; ++j)
- {
- if(std::find(procAuraTypes.begin(),procAuraTypes.end(),spellProto->EffectApplyAuraName[j])!=procAuraTypes.end())
- return false;
- }
-
- return true;
-}
+// Used for prepare can/can`t triggr aura
+static bool InitTriggerAuraData();
+// Define can trigger auras
+static bool isTriggerAura[TOTAL_AURAS];
+// Define can`t trigger auras (need for disable second trigger)
+static bool isNonTriggerAura[TOTAL_AURAS];
+// Prepare lists
+static bool procPrepared = InitTriggerAuraData();
Unit::Unit()
: WorldObject(), i_motionMaster(this), m_ThreatManager(this), m_HostilRefManager(this)
@@ -154,7 +80,7 @@ Unit::Unit()
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
// 2.3.2 - 0x70
- m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
m_attackTimer[BASE_ATTACK] = 0;
m_attackTimer[OFF_ATTACK] = 0;
@@ -169,6 +95,7 @@ Unit::Unit()
m_state = 0;
m_form = FORM_NONE;
m_deathState = ALIVE;
+ m_auraUpdateMask = 0;
for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
m_currentSpells[i] = NULL;
@@ -176,14 +103,13 @@ Unit::Unit()
m_addDmgOnce = 0;
for(int i = 0; i < MAX_TOTEM; ++i)
- m_TotemSlot[i] = 0;
+ m_TotemSlot[i] = 0;
m_ObjectSlot[0] = m_ObjectSlot[1] = m_ObjectSlot[2] = m_ObjectSlot[3] = 0;
//m_Aura = NULL;
//m_AurasCheck = 2000;
//m_removeAuraTimer = 4;
//tmpAura = NULL;
- waterbreath = false;
m_Visibility = VISIBILITY_ON;
@@ -194,9 +120,9 @@ Unit::Unit()
m_ShapeShiftFormSpellId = 0;
m_canModifyStats = false;
- for (int i = 0; i < MAX_SPELL_IMMUNITY; i++)
+ for (int i = 0; i < MAX_SPELL_IMMUNITY; ++i)
m_spellImmune[i].clear();
- for (int i = 0; i < UNIT_MOD_END; i++)
+ for (int i = 0; i < UNIT_MOD_END; ++i)
{
m_auraModifiersGroup[i][BASE_VALUE] = 0.0f;
m_auraModifiersGroup[i][BASE_PCT] = 1.0f;
@@ -206,12 +132,12 @@ Unit::Unit()
// implement 50% base damage from offhand
m_auraModifiersGroup[UNIT_MOD_DAMAGE_OFFHAND][TOTAL_PCT] = 0.5f;
- for (int i = 0; i < 3; i++)
+ for (int i = 0; i < MAX_ATTACK; ++i)
{
m_weaponDamage[i][MINDAMAGE] = BASE_MINDAMAGE;
m_weaponDamage[i][MAXDAMAGE] = BASE_MAXDAMAGE;
}
- for (int i = 0; i < MAX_STATS; i++)
+ for (int i = 0; i < MAX_STATS; ++i)
m_createStats[i] = 0.0f;
m_attacking = NULL;
@@ -283,6 +209,7 @@ void Unit::Update( uint32 p_time )
_UpdateAura();
}else
m_AurasCheck -= p_time;*/
+ UpdateAuras();
// WARNING! Order of execution here is important, do not change.
// Spells must be processed with event system BEFORE they go to _UpdateSpells.
@@ -322,10 +249,27 @@ void Unit::Update( uint32 p_time )
ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, GetHealth() < GetMaxHealth()*0.20f);
ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, GetHealth() < GetMaxHealth()*0.35f);
+ ModifyAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetHealth() > GetMaxHealth()*0.75f);
i_motionMaster.UpdateMotion(p_time);
}
+void Unit::UpdateAuras()
+{
+ const uint64& auramask = GetAuraUpdateMask();
+ if (auramask)
+ {
+ for(uint32 i = 0; i < MAX_AURAS; ++i)
+ {
+ if(auramask & (uint64(1) << i))
+ {
+ SendAuraUpdate(i);
+ }
+ }
+ ResetAuraUpdateMask();
+ }
+}
+
bool Unit::haveOffhandWeapon() const
{
if(GetTypeId() == TYPEID_PLAYER)
@@ -338,28 +282,23 @@ void Unit::SendMonsterMoveWithSpeedToCurrentDestination(Player* player)
{
float x, y, z;
if(GetMotionMaster()->GetDestination(x, y, z))
- SendMonsterMoveWithSpeed(x, y, z, GetUnitMovementFlags(), 0, player);
+ SendMonsterMoveWithSpeed(x, y, z, 0, player);
}
-void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFlags, uint32 transitTime, Player* player)
+void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime, Player* player)
{
if (!transitTime)
{
- float dx = x - GetPositionX();
- float dy = y - GetPositionY();
- float dz = z - GetPositionZ();
-
- float dist = ((dx*dx) + (dy*dy) + (dz*dz));
- if(dist<0)
- dist = 0;
+ if(GetTypeId()==TYPEID_PLAYER)
+ {
+ Traveller<Player> traveller(*(Player*)this);
+ transitTime = traveller.GetTotalTrevelTimeTo(x,y,z);
+ }
else
- dist = sqrt(dist);
-
- double speed = GetSpeed((MovementFlags & MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
- if(speed<=0)
- speed = 2.5f;
- speed *= 0.001f;
- transitTime = static_cast<uint32>(dist / speed + 0.5);
+ {
+ Traveller<Creature> traveller(*(Creature*)this);
+ transitTime = traveller.GetTotalTrevelTimeTo(x,y,z);
+ }
}
//float orientation = (float)atan2((double)dy, (double)dx);
SendMonsterMove(x, y, z, transitTime, player);
@@ -416,6 +355,11 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 T
case 1: // stop packet
SendMessageToSet( &data, true );
return;
+ case 2: // not used currently
+ data << float(0); // orientation
+ data << float(0);
+ data << float(0);
+ break;
case 3: // not used currently
data << uint64(0); // probably target guid
break;
@@ -766,6 +710,167 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
{
DEBUG_LOG("DealDamage: victim just died");
Kill(pVictim, durabilityLoss);
+
+ /*// find player: owner of controlled `this` or `this` itself maybe
+ Player *player = GetCharmerOrOwnerPlayerOrPlayerItself();
+
+ if(pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->GetLootRecipient())
+ player = ((Creature*)pVictim)->GetLootRecipient();
+ // Reward player, his pets, and group/raid members
+ // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
+ if(player && player!=pVictim)
+ {
+ player->RewardPlayerAndGroupAtKill(pVictim);
+ player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
+ }
+
+ DEBUG_LOG("DealDamageAttackStop");
+
+ // stop combat
+ pVictim->CombatStop();
+ pVictim->getHostilRefManager().deleteReferences();
+
+ bool damageFromSpiritOfRedemtionTalent = spellProto && spellProto->Id == 27795;
+
+ // if talent known but not triggered (check priest class for speedup check)
+ Aura* spiritOfRedemtionTalentReady = NULL;
+ if( !damageFromSpiritOfRedemtionTalent && // not called from SPELL_AURA_SPIRIT_OF_REDEMPTION
+ pVictim->GetTypeId()==TYPEID_PLAYER && pVictim->getClass()==CLASS_PRIEST )
+ {
+ AuraList const& vDummyAuras = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
+ for(AuraList::const_iterator itr = vDummyAuras.begin(); itr != vDummyAuras.end(); ++itr)
+ {
+ if((*itr)->GetSpellProto()->SpellIconID==1654)
+ {
+ spiritOfRedemtionTalentReady = *itr;
+ break;
+ }
+ }
+ }
+
+ DEBUG_LOG("SET JUST_DIED");
+ if(!spiritOfRedemtionTalentReady)
+ pVictim->setDeathState(JUST_DIED);
+
+ DEBUG_LOG("DealDamageHealth1");
+
+ if(spiritOfRedemtionTalentReady)
+ {
+ // save value before aura remove
+ uint32 ressSpellId = pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
+ if(!ressSpellId)
+ ressSpellId = ((Player*)pVictim)->GetResurrectionSpellId();
+
+ //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
+ pVictim->RemoveAllAurasOnDeath();
+
+ // restore for use at real death
+ pVictim->SetUInt32Value(PLAYER_SELF_RES_SPELL,ressSpellId);
+
+ // FORM_SPIRITOFREDEMPTION and related auras
+ pVictim->CastSpell(pVictim,27827,true,NULL,spiritOfRedemtionTalentReady);
+ }
+ else
+ pVictim->SetHealth(0);
+
+ // remember victim PvP death for corpse type and corpse reclaim delay
+ // at original death (not at SpiritOfRedemtionTalent timeout)
+ if( pVictim->GetTypeId()==TYPEID_PLAYER && !damageFromSpiritOfRedemtionTalent )
+ ((Player*)pVictim)->SetPvPDeath(player!=NULL);
+
+ // Call KilledUnit for creatures
+ if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI())
+ ((Creature*)this)->AI()->KilledUnit(pVictim);
+
+ // achievement stuff
+ if ( pVictim->GetTypeId() == TYPEID_PLAYER)
+ {
+ if(GetTypeId() == TYPEID_UNIT)
+ ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
+ else if(GetTypeId() == TYPEID_PLAYER)
+ ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1);
+ }
+
+ // 10% durability loss on death
+ // clean InHateListOf
+ if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ {
+ // only if not player and not controlled by player pet. And not at BG
+ if (durabilityLoss && !player && !((Player*)pVictim)->InBattleGround())
+ {
+ DEBUG_LOG("We are dead, loosing 10 percents durability");
+ ((Player*)pVictim)->DurabilityLossAll(0.10f,false);
+ // durability lost message
+ WorldPacket data(SMSG_DURABILITY_DAMAGE_DEATH, 0);
+ ((Player*)pVictim)->GetSession()->SendPacket(&data);
+ }
+ }
+ else // creature died
+ {
+ DEBUG_LOG("DealDamageNotPlayer");
+ Creature *cVictim = (Creature*)pVictim;
+
+ if(!cVictim->isPet())
+ {
+ cVictim->DeleteThreatList();
+ cVictim->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
+ }
+ // Call creature just died function
+ if (cVictim->AI())
+ cVictim->AI()->JustDied(this);
+
+ // Dungeon specific stuff, only applies to players killing creatures
+ if(cVictim->GetInstanceId())
+ {
+ Map *m = cVictim->GetMap();
+ Player *creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
+ // TODO: do instance binding anyway if the charmer/owner is offline
+
+ if(m->IsDungeon() && creditedPlayer)
+ {
+ if(m->IsRaid() || m->IsHeroic())
+ {
+ if(cVictim->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND)
+ ((InstanceMap *)m)->PermBindAllPlayers(creditedPlayer);
+ }
+ else
+ {
+ // the reset time is set but not added to the scheduler
+ // until the players leave the instance
+ time_t resettime = cVictim->GetRespawnTimeEx() + 2 * HOUR;
+ if(InstanceSave *save = sInstanceSaveManager.GetInstanceSave(cVictim->GetInstanceId()))
+ if(save->GetResetTime() < resettime) save->SetResetTime(resettime);
+ }
+ }
+ }
+ }
+
+ // last damage from non duel opponent or opponent controlled creature
+ if(duel_hasEnded)
+ {
+ assert(pVictim->GetTypeId()==TYPEID_PLAYER);
+ Player *he = (Player*)pVictim;
+
+ assert(he->duel);
+
+ he->duel->opponent->CombatStopWithPets(true);
+ he->CombatStopWithPets(true);
+
+ he->DuelComplete(DUEL_INTERUPTED);
+ }
+
+ // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
+ if(pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)pVictim)->InBattleGround())
+ {
+ Player *killed = ((Player*)pVictim);
+ if(BattleGround *bg = killed->GetBattleGround())
+ if(player)
+ bg->HandleKillPlayer(killed, player);
+ //later we can add support for creature->player kills here i'm
+ //not sure, but i guess those kills also get counted in av
+ //else if(GetTypeId() == TYPEID_UNIT)
+ // bg->HandleKillPlayer(killed,(Creature*)this);
+ }*/
}
else // if (health <= damage)
{
@@ -796,7 +901,6 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
//if (!spellProto || !(spellProto->AuraInterruptFlags&AURA_INTERRUPT_FLAG_DIRECT_DAMAGE))
pVictim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
}
-
if (pVictim->GetTypeId() != TYPEID_PLAYER)
{
if(spellProto && IsDamageToThreatSpell(spellProto))
@@ -863,7 +967,7 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
if(spell->getState() == SPELL_STATE_PREPARING)
{
uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
- if(interruptFlags & SPELL_INTERRUPT_FLAG_DAMAGE)
+ if(interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
pVictim->InterruptNonMeleeSpells(false);
else if(interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
spell->Delayed();
@@ -1102,419 +1206,6 @@ void Unit::CastSpell(GameObject *go, uint32 spellId, bool triggered, Item *castI
spell->prepare(&targets, triggeredByAura);
}
-/*
-void Unit::DealFlatDamage(Unit *pVictim, SpellEntry const *spellInfo, uint32 *damage, CleanDamage *cleanDamage, bool *crit, bool isTriggeredSpell)
-{
- // TODO this in only generic way, check for exceptions
- DEBUG_LOG("DealFlatDamage (BEFORE) >> DMG:%u", *damage);
-
- // Per-damage class calculation
- switch (spellInfo->DmgClass)
- {
- // Melee and Ranged Spells
- case SPELL_DAMAGE_CLASS_RANGED:
- case SPELL_DAMAGE_CLASS_MELEE:
- {
- // Calculate physical outcome
- MeleeHitOutcome outcome = RollPhysicalOutcomeAgainst(pVictim, BASE_ATTACK, spellInfo);
-
- //Used to store the Hit Outcome
- cleanDamage->hitOutCome = outcome;
-
- // Return miss/evade first (sends miss message)
- switch(outcome)
- {
- case MELEE_HIT_EVADE:
- {
- SendAttackStateUpdate(HITINFO_MISS, pVictim, 1, GetSpellSchoolMask(spellInfo), 0, 0,0,VICTIMSTATE_EVADES,0);
- *damage = 0;
- return;
- }
- case MELEE_HIT_MISS:
- {
- SendAttackStateUpdate(HITINFO_MISS, pVictim, 1, GetSpellSchoolMask(spellInfo), 0, 0,0,VICTIMSTATE_NORMAL,0);
- *damage = 0;
-
- if(GetTypeId()== TYPEID_PLAYER)
- ((Player*)this)->UpdateWeaponSkill(BASE_ATTACK);
-
- CastMeleeProcDamageAndSpell(pVictim,0,GetSpellSchoolMask(spellInfo),BASE_ATTACK,MELEE_HIT_MISS,spellInfo,isTriggeredSpell);
- return;
- }
- }
-
- // Hitinfo, Victimstate
- uint32 hitInfo = HITINFO_NORMALSWING;
- VictimState victimState = VICTIMSTATE_NORMAL;
-
- // Physical Damage
- if ( GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_NORMAL )
- {
- // apply spellmod to Done damage
- if(Player* modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_DAMAGE, *damage);
-
- //Calculate armor mitigation
- uint32 damageAfterArmor = CalcArmorReducedDamage(pVictim, *damage);
-
- // random durability for main hand weapon (ABSORB)
- if(damageAfterArmor < *damage)
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_ABSORB)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EquipmentSlots(urand(EQUIPMENT_SLOT_START,EQUIPMENT_SLOT_BACK)));
-
- cleanDamage->damage += *damage - damageAfterArmor;
- *damage = damageAfterArmor;
- }
- // Magical Damage
- else
- {
- // Calculate damage bonus
- *damage = SpellDamageBonus(pVictim, spellInfo, *damage, SPELL_DIRECT_DAMAGE);
- }
-
- // Classify outcome
- switch (outcome)
- {
- case MELEE_HIT_BLOCK_CRIT:
- case MELEE_HIT_CRIT:
- {
- uint32 bonusDmg = *damage;
-
- // Apply crit_damage bonus
- if(Player* modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, bonusDmg);
-
- uint32 creatureTypeMask = pVictim->GetCreatureTypeMask();
- AuraList const& mDamageDoneVersus = GetAurasByType(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS);
- for(AuraList::const_iterator i = mDamageDoneVersus.begin();i != mDamageDoneVersus.end(); ++i)
- if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- bonusDmg = uint32(bonusDmg * ((*i)->GetModifierValue()+100.0f)/100.0f);
-
- *damage += bonusDmg;
-
- // Resilience - reduce crit damage
- if (pVictim->GetTypeId()==TYPEID_PLAYER)
- {
- uint32 resilienceReduction = ((Player*)pVictim)->GetMeleeCritDamageReduction(*damage);
- cleanDamage->damage += resilienceReduction;
- *damage -= resilienceReduction;
- }
-
- *crit = true;
- hitInfo |= HITINFO_CRITICALHIT;
-
- ModifyAuraState(AURA_STATE_CRIT, true);
- StartReactiveTimer( REACTIVE_CRIT );
-
- if(getClass()==CLASS_HUNTER)
- {
- ModifyAuraState(AURA_STATE_HUNTER_CRIT_STRIKE, true);
- StartReactiveTimer( REACTIVE_HUNTER_CRIT );
- }
-
- if ( outcome == MELEE_HIT_BLOCK_CRIT )
- {
- uint32 blocked_amount = uint32(pVictim->GetShieldBlockValue());
- if (blocked_amount >= *damage)
- {
- hitInfo |= HITINFO_SWINGNOHITSOUND;
- victimState = VICTIMSTATE_BLOCKS;
- cleanDamage->damage += *damage; // To Help Calculate Rage
- *damage = 0;
- }
- else
- {
- // To Help Calculate Rage
- cleanDamage->damage += blocked_amount;
- *damage = *damage - blocked_amount;
- }
-
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE, true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // Update defense
- ((Player*)pVictim)->UpdateDefense();
-
- // random durability for main hand weapon (BLOCK)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_BLOCK)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_OFFHAND);
- }
- }
- break;
- }
- case MELEE_HIT_PARRY:
- {
- cleanDamage->damage += *damage; // To Help Calculate Rage
- *damage = 0;
- victimState = VICTIMSTATE_PARRY;
-
- // Counter-attack ( explained in Unit::DoAttackDamage() )
- if(pVictim->GetTypeId()==TYPEID_PLAYER || !(((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN) )
- {
- // Get attack timers
- float offtime = float(pVictim->getAttackTimer(OFF_ATTACK));
- float basetime = float(pVictim->getAttackTimer(BASE_ATTACK));
-
- // Reduce attack time
- if (pVictim->haveOffhandWeapon() && offtime < basetime)
- {
- float percent20 = pVictim->GetAttackTime(OFF_ATTACK) * 0.20;
- float percent60 = 3 * percent20;
- if(offtime > percent20 && offtime <= percent60)
- {
- pVictim->setAttackTimer(OFF_ATTACK, uint32(percent20));
- }
- else if(offtime > percent60)
- {
- offtime -= 2 * percent20;
- pVictim->setAttackTimer(OFF_ATTACK, uint32(offtime));
- }
- }
- else
- {
- float percent20 = pVictim->GetAttackTime(BASE_ATTACK) * 0.20;
- float percent60 = 3 * percent20;
- if(basetime > percent20 && basetime <= percent60)
- {
- pVictim->setAttackTimer(BASE_ATTACK, uint32(percent20));
- }
- else if(basetime > percent60)
- {
- basetime -= 2 * percent20;
- pVictim->setAttackTimer(BASE_ATTACK, uint32(basetime));
- }
- }
- }
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // Update victim defense ?
- ((Player*)pVictim)->UpdateDefense();
-
- // random durability for main hand weapon (PARRY)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_PARRY)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_MAINHAND);
- }
-
- // Set parry flags
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYUNARMED);
-
- // Mongoose bite - set only Counterattack here
- if (pVictim->getClass() == CLASS_HUNTER)
- {
- pVictim->ModifyAuraState(AURA_STATE_HUNTER_PARRY,true);
- pVictim->StartReactiveTimer( REACTIVE_HUNTER_PARRY );
- }
- else
- {
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE, true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
- }
- break;
- }
- case MELEE_HIT_DODGE:
- {
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- ((Player*)pVictim)->UpdateDefense();
-
- cleanDamage->damage += *damage; // To Help Calculate Rage
- *damage = 0;
- hitInfo |= HITINFO_SWINGNOHITSOUND;
- victimState = VICTIMSTATE_DODGE;
-
- // Set dodge flags
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYUNARMED);
-
- // Overpower
- if (GetTypeId() == TYPEID_PLAYER && getClass() == CLASS_WARRIOR)
- {
- ((Player*)this)->AddComboPoints(pVictim, 1);
- StartReactiveTimer( REACTIVE_OVERPOWER );
- }
-
- // Riposte
- if (pVictim->getClass() != CLASS_ROGUE)
- {
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE, true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
- }
- break;
- }
- case MELEE_HIT_BLOCK:
- {
- uint32 blocked_amount = uint32(pVictim->GetShieldBlockValue());
- if (blocked_amount >= *damage)
- {
- hitInfo |= HITINFO_SWINGNOHITSOUND;
- victimState = VICTIMSTATE_BLOCKS;
- cleanDamage->damage += *damage; // To Help Calculate Rage
- *damage = 0;
- }
- else
- {
- // To Help Calculate Rage
- cleanDamage->damage += blocked_amount;
- *damage = *damage - blocked_amount;
- }
-
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE, true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // Update defense
- ((Player*)pVictim)->UpdateDefense();
-
- // random durability for main hand weapon (BLOCK)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_BLOCK)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_OFFHAND);
- }
- break;
- }
- case MELEE_HIT_EVADE: // already processed early
- case MELEE_HIT_MISS: // already processed early
- case MELEE_HIT_GLANCING:
- case MELEE_HIT_CRUSHING:
- case MELEE_HIT_NORMAL:
- break;
- }
-
- // do all damage=0 cases here
- if(*damage == 0)
- CastMeleeProcDamageAndSpell(pVictim,0,GetSpellSchoolMask(spellInfo),BASE_ATTACK,outcome,spellInfo,isTriggeredSpell);
-
- break;
- }
- // Magical Attacks
- case SPELL_DAMAGE_CLASS_NONE:
- case SPELL_DAMAGE_CLASS_MAGIC:
- {
- // Calculate damage bonus
- *damage = SpellDamageBonus(pVictim, spellInfo, *damage, SPELL_DIRECT_DAMAGE);
-
- *crit = isSpellCrit(pVictim, spellInfo, GetSpellSchoolMask(spellInfo), BASE_ATTACK);
- if (*crit)
- {
- *damage = SpellCriticalBonus(spellInfo, *damage, pVictim);
-
- // Resilience - reduce crit damage
- if (pVictim && pVictim->GetTypeId()==TYPEID_PLAYER)
- {
- uint32 damage_reduction = ((Player *)pVictim)->GetSpellCritDamageReduction(*damage);
- if(*damage > damage_reduction)
- *damage -= damage_reduction;
- else
- *damage = 0;
- }
-
- cleanDamage->hitOutCome = MELEE_HIT_CRIT;
- }
- // spell proc all magic damage==0 case in this function
- if(*damage == 0)
- {
- // Procflags
- uint32 procAttacker = PROC_FLAG_HIT_SPELL;
- uint32 procVictim = (PROC_FLAG_STRUCK_SPELL|PROC_FLAG_TAKE_DAMAGE);
-
- ProcDamageAndSpell(pVictim, procAttacker, procVictim, 0, GetSpellSchoolMask(spellInfo), spellInfo, isTriggeredSpell);
- }
-
- break;
- }
- }
-
- // TODO this in only generic way, check for exceptions
- DEBUG_LOG("DealFlatDamage (AFTER) >> DMG:%u", *damage);
-}
-
-uint32 Unit::SpellNonMeleeDamageLog(Unit *pVictim, uint32 spellID, uint32 damage, bool isTriggeredSpell, bool useSpellDamage)
-{
- if(!this || !pVictim)
- return 0;
- if(!isAlive() || !pVictim->isAlive())
- return 0;
-
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellID);
- if(!spellInfo)
- return 0;
-
- CleanDamage cleanDamage = CleanDamage(0, BASE_ATTACK, MELEE_HIT_NORMAL);
- bool crit = false;
-
- if (useSpellDamage)
- DealFlatDamage(pVictim, spellInfo, &damage, &cleanDamage, &crit, isTriggeredSpell);
-
- // If we actually dealt some damage (spell proc's for 0 damage (normal and magic) called in DealFlatDamage)
- if(damage > 0)
- {
- // Calculate absorb & resists
- uint32 absorb = 0;
- uint32 resist = 0;
-
- CalcAbsorbResist(pVictim,GetSpellSchoolMask(spellInfo), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
-
- //No more damage left, target absorbed and/or resisted all damage
- if (damage > absorb + resist)
- damage -= absorb + resist; //Remove Absorbed and Resisted from damage actually dealt
- else
- {
- uint32 HitInfo = HITINFO_SWINGNOHITSOUND;
-
- if (absorb)
- HitInfo |= HITINFO_ABSORB;
- if (resist)
- {
- HitInfo |= HITINFO_RESIST;
- ProcDamageAndSpell(pVictim, PROC_FLAG_TARGET_RESISTS, PROC_FLAG_RESIST_SPELL, 0, GetSpellSchoolMask(spellInfo), spellInfo,isTriggeredSpell);
- }
-
- //Send resist
- SendAttackStateUpdate(HitInfo, pVictim, 1, GetSpellSchoolMask(spellInfo), damage, absorb,resist,VICTIMSTATE_NORMAL,0);
- return 0;
- }
-
- // Deal damage done
- damage = DealDamage(pVictim, damage, &cleanDamage, SPELL_DIRECT_DAMAGE, GetSpellSchoolMask(spellInfo), spellInfo, true);
-
- // Send damage log
- sLog.outDetail("SpellNonMeleeDamageLog: %u (TypeId: %u) attacked %u (TypeId: %u) for %u dmg inflicted by %u,absorb is %u,resist is %u",
- GetGUIDLow(), GetTypeId(), pVictim->GetGUIDLow(), pVictim->GetTypeId(), damage, spellID, absorb,resist);
-
- // Actual log sent to client
- SendSpellNonMeleeDamageLog(pVictim, spellID, damage + resist, GetSpellSchoolMask(spellInfo), absorb, resist, false, 0, crit);
-
- // Procflags
- uint32 procAttacker = PROC_FLAG_HIT_SPELL;
- uint32 procVictim = (PROC_FLAG_STRUCK_SPELL|PROC_FLAG_TAKE_DAMAGE);
-
- if (crit)
- {
- procAttacker |= PROC_FLAG_CRIT_SPELL;
- procVictim |= PROC_FLAG_STRUCK_CRIT_SPELL;
- }
-
- ProcDamageAndSpell(pVictim, procAttacker, procVictim, damage, GetSpellSchoolMask(spellInfo), spellInfo, isTriggeredSpell);
-
- return damage;
- }
- else
- {
- // all spell proc for 0 normal and magic damage called in DealFlatDamage
-
- //Check for rage
- if(cleanDamage.damage)
- // Rage from damage received.
- if(pVictim->GetTypeId() == TYPEID_PLAYER && (pVictim->getPowerType() == POWER_RAGE))
- ((Player*)pVictim)->RewardRage(cleanDamage.damage, 0, false);
-
- return 0;
- }
-}
-*/
-
// Obsolete func need remove, here only for comotability vs another patches
uint32 Unit::SpellNonMeleeDamageLog(Unit *pVictim, uint32 spellID, uint32 damage, bool isTriggeredSpell, bool useSpellDamage)
{
@@ -1589,6 +1280,9 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
if (blocked)
{
damageInfo->blocked = uint32(pVictim->GetShieldBlockValue());
+ //double blocked amount if block is critical
+ if (isBlockCritical())
+ damageInfo->blocked+=damageInfo->blocked;
if (damage < damageInfo->blocked)
damageInfo->blocked = damage;
damage-=damageInfo->blocked;
@@ -1603,7 +1297,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
if (crit)
{
damageInfo->HitInfo|= SPELL_HIT_TYPE_CRIT;
- damage = SpellCriticalBonus(spellInfo, damage, pVictim);
+ damage = SpellCriticalDamageBonus(spellInfo, damage, pVictim);
// Resilience - reduce crit damage
if (pVictim->GetTypeId()==TYPEID_PLAYER)
damage -= ((Player*)pVictim)->GetSpellCritDamageReduction(damage);
@@ -1613,12 +1307,12 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
}
if( damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL )
- damage = CalcArmorReducedDamage(pVictim, damage);
+ damage = CalcArmorReducedDamage(pVictim, damage, spellInfo, attackType);
// Calculate absorb resist
if(damage > 0)
{
- CalcAbsorbResist(pVictim, damageSchoolMask, SPELL_DIRECT_DAMAGE, damage, &damageInfo->absorb, &damageInfo->resist);
+ CalcAbsorbResist(pVictim, damageSchoolMask, SPELL_DIRECT_DAMAGE, damage, &damageInfo->absorb, &damageInfo->resist, spellInfo);
damage-= damageInfo->absorb + damageInfo->resist;
}
else
@@ -1626,6 +1320,37 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 dama
damageInfo->damage = damage;
}
+int32 Unit::GetIgnoredArmorMultiplier(SpellEntry const *spellInfo, WeaponAttackType attackType)
+{
+ if (GetTypeId() != TYPEID_PLAYER)
+ return 0;
+ //check if spell uses weapon
+ if (!spellInfo || spellInfo->EquippedItemClass!=ITEM_CLASS_WEAPON)
+ return 0;
+ Item *item = NULL;
+ if(attackType == BASE_ATTACK)
+ item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
+ else if (attackType == OFF_ATTACK)
+ item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+ else if (attackType == RANGED_ATTACK)
+ item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED);
+ if (!item)
+ return 0;
+
+ AuraList const& armAuras = GetAurasByType(SPELL_AURA_MOD_WEAPONTYPE_IGNORE_TARGET_RESISTANCE);
+ int32 armorIgnored = 0;
+ for(AuraList::const_iterator i = armAuras.begin();i != armAuras.end(); ++i)
+ {
+ if (!((*i)->GetSpellProto()->EquippedItemClass==item->GetProto()->Class
+ && (*i)->GetSpellProto()->EquippedItemSubClassMask & (1<<item->GetProto()->SubClass)))
+ continue;
+
+ if((*i)->GetModifier()->m_amount)
+ armorIgnored += (*i)->GetModifier()->m_amount;
+ }
+ return (-armorIgnored);
+}
+
void Unit::DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss)
{
if (damageInfo==0)
@@ -1655,20 +1380,6 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss)
return;
}
- // update at damage Judgement aura duration that applied by attacker at victim
- if(damageInfo->damage && spellProto->Id == 35395)
- {
- AuraMap& vAuras = pVictim->GetAuras();
- for(AuraMap::iterator itr = vAuras.begin(); itr != vAuras.end(); ++itr)
- {
- SpellEntry const *spellInfo = (*itr).second->GetSpellProto();
- if( spellInfo->AttributesEx3 & 0x40000 && spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && ((*itr).second->GetCasterGUID() == GetGUID()))
- {
- (*itr).second->SetAuraDuration((*itr).second->GetAuraMaxDuration());
- (*itr).second->UpdateAuraDuration();
- }
- }
- }
// Call default DealDamage
CleanDamage cleanDamage(damageInfo->cleanDamage, BASE_ATTACK, MELEE_HIT_NORMAL);
DealDamage(pVictim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss);
@@ -1722,7 +1433,7 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da
}
// Physical Immune check
- if(damageInfo->target->IsImmunedToDamage(SpellSchoolMask(damageInfo->damageSchoolMask),true))
+ if(damageInfo->target->IsImmunedToDamage(SpellSchoolMask(damageInfo->damageSchoolMask)))
{
damageInfo->HitInfo |= HITINFO_NORMALSWING;
damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
@@ -1736,7 +1447,7 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da
// Add melee damage bonus
MeleeDamageBonus(damageInfo->target, &damage, damageInfo->attackType);
// Calculate armor reduction
- damageInfo->damage = CalcArmorReducedDamage(damageInfo->target, damage);
+ damageInfo->damage = CalcArmorReducedDamage(damageInfo->target, damage, NULL , damageInfo->attackType);
damageInfo->cleanDamage += damage - damageInfo->damage;
damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
@@ -1824,8 +1535,12 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da
case MELEE_HIT_BLOCK:
{
damageInfo->TargetState = VICTIMSTATE_NORMAL;
+ damageInfo->HitInfo |= HITINFO_BLOCK;
damageInfo->procEx|=PROC_EX_BLOCK;
damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
+ //double blocked amount if block is critical
+ if (isBlockCritical())
+ damageInfo->blocked_amount+=damageInfo->blocked_amount;
if (damageInfo->blocked_amount >= damageInfo->damage)
{
damageInfo->TargetState = VICTIMSTATE_BLOCKS;
@@ -1971,28 +1686,13 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
CastSpell(pVictim, 1604, true);
}
- // update at damage Judgement aura duration that applied by attacker at victim
- if(damageInfo->damage)
- {
- AuraMap& vAuras = pVictim->GetAuras();
- for(AuraMap::iterator itr = vAuras.begin(); itr != vAuras.end(); ++itr)
- {
- SpellEntry const *spellInfo = (*itr).second->GetSpellProto();
- if( spellInfo->AttributesEx3 & 0x40000 && spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && ((*itr).second->GetCasterGUID() == GetGUID()))
- {
- (*itr).second->SetAuraDuration((*itr).second->GetAuraMaxDuration());
- (*itr).second->UpdateAuraDuration();
- }
- }
- }
-
// If not miss
if (!(damageInfo->HitInfo & HITINFO_MISS))
{
if(GetTypeId() == TYPEID_PLAYER && pVictim->isAlive())
{
for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; i++)
- ((Player*)this)->CastItemCombatSpell(((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0,i), pVictim, damageInfo->attackType);
+ ((Player*)this)->CastItemCombatSpell(((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0,i), pVictim, damageInfo->attackType);
}
// victim's damage shield
@@ -2015,11 +1715,13 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
//CalcAbsorbResist(pVictim, SpellSchools(spellProto->School), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
//damage-=absorb + resist;
- WorldPacket data(SMSG_SPELLDAMAGESHIELD,(8+8+4+4));
+ WorldPacket data(SMSG_SPELLDAMAGESHIELD,(8+8+4+4+4+4));
data << uint64(pVictim->GetGUID());
data << uint64(GetGUID());
+ data << uint32(spellProto->Id);
+ data << uint32(damage); // Damage
+ data << uint32(0); // Overkill
data << uint32(spellProto->SchoolMask);
- data << uint32(damage);
pVictim->SendMessageToSet(&data, true );
pVictim->DealDamage(this, damage, 0, SPELL_DIRECT_DAMAGE, GetSpellSchoolMask(spellProto), spellProto, true);
@@ -2038,28 +1740,50 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
void Unit::HandleEmoteCommand(uint32 anim_id)
{
WorldPacket data( SMSG_EMOTE, 12 );
- data << anim_id << GetGUID();
- WPAssert(data.size() == 12);
-
+ data << uint32(anim_id);
+ data << uint64(GetGUID());
SendMessageToSet(&data, true);
}
-uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage)
+uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType)
{
uint32 newdamage = 0;
float armor = pVictim->GetArmor();
// Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
armor += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
- if (armor<0.0f) armor=0.0f;
+ armor *= float((GetIgnoredArmorMultiplier(spellInfo, attackType)+100.0f)/100.0f);
+ if(spellInfo)
+ if(Player *modOwner = GetSpellModOwner())
+ modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
+
+ AuraList const& ResIgnoreAurasAb = GetAurasByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
+ for(AuraList::const_iterator j = ResIgnoreAurasAb.begin();j != ResIgnoreAurasAb.end(); ++j)
+ {
+ if( (*j)->GetModifier()->m_miscvalue & SPELL_SCHOOL_MASK_NORMAL
+ && (*j)->isAffectedOnSpell(spellInfo))
+ armor= int32(float(armor) * (float(100-(*j)->GetModifier()->m_amount)/100.0f));
+ }
+
+ AuraList const& ResIgnoreAuras = GetAurasByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
+ for(AuraList::const_iterator j = ResIgnoreAuras.begin();j != ResIgnoreAuras.end(); ++j)
+ {
+ if( (*j)->GetModifier()->m_miscvalue & SPELL_SCHOOL_MASK_NORMAL)
+ armor= int32(float(armor) * (float(100-(*j)->GetModifier()->m_amount)/100.0f));
+ }
- float tmpvalue = 0.0f;
- if(getLevel() <= 59) //Level 1-59
- tmpvalue = armor / (armor + 400.0f + 85.0f * getLevel());
- else if(getLevel() < 70) //Level 60-69
- tmpvalue = armor / (armor - 22167.5f + 467.5f * getLevel());
- else //Level 70+
- tmpvalue = armor / (armor + 10557.5f);
+ // Apply Player CR_ARMOR_PENETRATION rating
+ if (GetTypeId()==TYPEID_PLAYER)
+ armor *= 1.0f - ((Player*)this)->GetRatingBonusValue(CR_ARMOR_PENETRATION) / 100.0f;
+
+ if (armor < 0.0f) armor=0.0f;
+
+ float levelModifier = getLevel();
+ if ( levelModifier > 59 )
+ levelModifier = levelModifier + (4.5f * (levelModifier-59));
+
+ float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
+ tmpvalue = tmpvalue/(1.0f + tmpvalue);
if(tmpvalue < 0.0f)
tmpvalue = 0.0f;
@@ -2070,7 +1794,7 @@ uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage)
return (newdamage > 1) ? newdamage : 1;
}
-void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist)
+void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellEntry const *spellInfo)
{
if(!pVictim || !pVictim->isAlive() || !damage)
return;
@@ -2106,95 +1830,272 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
*resist += uint32(damage * m / 4);
if(*resist > damage)
*resist = damage;
+
+ AuraList const& ResIgnoreAurasAb = GetAurasByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
+ for(AuraList::const_iterator j = ResIgnoreAurasAb.begin();j != ResIgnoreAurasAb.end(); ++j)
+ {
+ if( (*j)->GetModifier()->m_miscvalue & schoolMask
+ && (*j)->isAffectedOnSpell(spellInfo))
+ *resist= int32(float(*resist) * (float(100-(*j)->GetModifier()->m_amount)/100.0f));
+ }
+
+ AuraList const& ResIgnoreAuras = GetAurasByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
+ for(AuraList::const_iterator j = ResIgnoreAuras.begin();j != ResIgnoreAuras.end(); ++j)
+ {
+ if( (*j)->GetModifier()->m_miscvalue & schoolMask)
+ *resist= int32(float(*resist) * (float(100-(*j)->GetModifier()->m_amount)/100.0f));
+ }
}
else
*resist = 0;
int32 RemainingDamage = damage - *resist;
+ // Get unit state (need for some absorb check)
+ uint32 unitflag = pVictim->GetUInt32Value(UNIT_FIELD_FLAGS);
+ // Reflect damage spells (not cast any damage spell in aura lookup)
+ uint32 reflectSpell = 0;
+ int32 reflectDamage = 0;
+ // Need remove expired auras after
+ bool existExpired = false;
// absorb without mana cost
- int32 reflectDamage = 0;
- Aura* reflectAura = NULL;
AuraList const& vSchoolAbsorb = pVictim->GetAurasByType(SPELL_AURA_SCHOOL_ABSORB);
- for(AuraList::const_iterator i = vSchoolAbsorb.begin(), next; i != vSchoolAbsorb.end() && RemainingDamage > 0; i = next)
+ for(AuraList::const_iterator i = vSchoolAbsorb.begin(); i != vSchoolAbsorb.end() && RemainingDamage > 0; ++i)
{
- next = i; ++next;
-
- if (((*i)->GetModifier()->m_miscvalue & schoolMask)==0)
+ Modifier* mod = (*i)->GetModifier();
+ if (!(mod->m_miscvalue & schoolMask))
continue;
- // Cheat Death
- if((*i)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE && (*i)->GetSpellProto()->SpellIconID == 2109)
+ SpellEntry const* spellProto = (*i)->GetSpellProto();
+
+ // Max Amount can be absorbed by this aura
+ int32 currentAbsorb = mod->m_amount;
+
+ // Found empty aura (umpossible but..)
+ if (currentAbsorb <=0)
{
- if (((Player*)pVictim)->HasSpellCooldown(31231))
- continue;
- if (pVictim->GetHealth() <= RemainingDamage)
+ existExpired = true;
+ continue;
+ }
+ // Handle custom absorb auras
+ // TODO: try find better way
+ switch(spellProto->SpellFamilyName)
+ {
+ case SPELLFAMILY_GENERIC:
{
- int32 chance = (*i)->GetModifier()->m_amount;
- if (roll_chance_i(chance))
+ // Astral Shift
+ if (spellProto->SpellIconID == 3066)
{
- pVictim->CastSpell(pVictim,31231,true);
- ((Player*)pVictim)->AddSpellCooldown(31231,0,time(NULL)+60);
-
- // with health > 10% lost health until health==10%, in other case no losses
- uint32 health10 = pVictim->GetMaxHealth()/10;
- RemainingDamage = pVictim->GetHealth() > health10 ? pVictim->GetHealth() - health10 : 0;
+ //reduces all damage taken while stun, fear or silence
+ if (unitflag & (UNIT_FLAG_STUNNED|UNIT_FLAG_FLEEING|UNIT_FLAG_SILENCED))
+ RemainingDamage -= RemainingDamage * currentAbsorb / 100;
+ continue;
+ }
+ // Nerves of Steel
+ if (spellProto->SpellIconID == 2115)
+ {
+ // while affected by Stun and Fear
+ if (unitflag&(UNIT_FLAG_STUNNED|UNIT_FLAG_FLEEING))
+ RemainingDamage -= RemainingDamage * currentAbsorb / 100;
+ continue;
}
+ // Spell Deflection
+ if (spellProto->SpellIconID == 3006)
+ {
+ // You have a chance equal to your Parry chance
+ if (damagetype == DIRECT_DAMAGE && // Only for direct damage
+ roll_chance_f(pVictim->GetUnitParryChance())) // Roll chance
+ RemainingDamage -= RemainingDamage * currentAbsorb / 100;
+ continue;
+ }
+ // Reflective Shield (Lady Malande boss)
+ if (spellProto->Id == 41475)
+ {
+ if(RemainingDamage < currentAbsorb)
+ reflectDamage = RemainingDamage / 2;
+ else
+ reflectDamage = currentAbsorb / 2;
+ reflectSpell = 33619;
+ break;
+ }
+ if (spellProto->Id == 39228 || // Argussian Compass
+ spellProto->Id == 60218) // Essence of Gossamer
+ {
+ // Max absorb stored in 1 dummy effect
+ if (spellProto->EffectBasePoints[1] < currentAbsorb)
+ currentAbsorb = spellProto->EffectBasePoints[1];
+ break;
+ }
+ break;
}
- continue;
- }
-
- int32 currentAbsorb;
-
- //Reflective Shield
- if ((pVictim != this) && (*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_PRIEST && (*i)->GetSpellProto()->SpellFamilyFlags == 0x1)
- {
- if(Unit* caster = (*i)->GetCaster())
+ case SPELLFAMILY_DRUID:
+ {
+ // Primal Tenacity
+ if (spellProto->SpellIconID == 2253)
+ {
+ //reduces all damage taken while Stunned
+ if (unitflag & UNIT_FLAG_STUNNED)
+ RemainingDamage -= RemainingDamage * currentAbsorb / 100;
+ continue;
+ }
+ break;
+ }
+ case SPELLFAMILY_ROGUE:
{
- AuraList const& vOverRideCS = caster->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- for(AuraList::const_iterator k = vOverRideCS.begin(); k != vOverRideCS.end(); ++k)
+ // Cheat Death
+ if(spellProto->SpellIconID == 2109)
{
- switch((*k)->GetModifier()->m_miscvalue)
+ if (pVictim->GetTypeId()==TYPEID_PLAYER && // Only players
+ pVictim->GetHealth() <= RemainingDamage && // Only if damage kill
+ !((Player*)pVictim)->HasSpellCooldown(31231) && // Only if no cooldown
+ roll_chance_i(currentAbsorb)) // Only if roll
{
- case 5065: // Rank 1
- case 5064: // Rank 2
- case 5063: // Rank 3
- case 5062: // Rank 4
- case 5061: // Rank 5
- {
- if(RemainingDamage >= (*i)->GetModifier()->m_amount)
- reflectDamage = (*i)->GetModifier()->m_amount * (*k)->GetModifier()->m_amount/100;
- else
- reflectDamage = (*k)->GetModifier()->m_amount * RemainingDamage/100;
- reflectAura = *i;
-
- } break;
- default: break;
+ pVictim->CastSpell(pVictim,31231,true);
+ ((Player*)pVictim)->AddSpellCooldown(31231,0,time(NULL)+60);
+ // with health > 10% lost health until health==10%, in other case no losses
+ uint32 health10 = pVictim->GetMaxHealth()/10;
+ RemainingDamage = pVictim->GetHealth() > health10 ? pVictim->GetHealth() - health10 : 0;
}
-
- if(reflectDamage)
+ continue;
+ }
+ break;
+ }
+ case SPELLFAMILY_PRIEST:
+ {
+ // Reflective Shield
+ if (spellProto->SpellFamilyFlags == 0x1)
+ {
+ if (pVictim == this)
break;
+ Unit* caster = (*i)->GetCaster();
+ if (!caster)
+ break;
+ int32 reflectDamage = 0;
+ AuraList const& vOverRideCS = caster->GetAurasByType(SPELL_AURA_DUMMY);
+ for(AuraList::const_iterator k = vOverRideCS.begin(); k != vOverRideCS.end(); ++k)
+ {
+ switch((*k)->GetModifier()->m_miscvalue)
+ {
+ case 5065: // Rank 1
+ case 5064: // Rank 2
+ case 5063: // Rank 3
+ {
+ if(RemainingDamage >= currentAbsorb)
+ reflectDamage = (*k)->GetModifier()->m_amount * currentAbsorb/100;
+ else
+ reflectDamage = (*k)->GetModifier()->m_amount * RemainingDamage/100;
+ reflectSpell = 33619;
+ } break;
+ default: break;
+ }
+ }
+ break;
+ }
+ break;
+ }
+ case SPELLFAMILY_SHAMAN:
+ {
+ // Astral Shift
+ if (spellProto->SpellIconID == 3066)
+ {
+ //reduces all damage taken while stun, fear or silence
+ if (unitflag & (UNIT_FLAG_STUNNED|UNIT_FLAG_FLEEING|UNIT_FLAG_SILENCED))
+ RemainingDamage -= RemainingDamage * currentAbsorb / 100;
+ continue;
+ }
+ break;
+ }
+ case SPELLFAMILY_DEATHKNIGHT:
+ {
+ // Shadow of Death
+ if (spellProto->SpellIconID == 1958)
+ {
+ // TODO: absorb only while transform
+ continue;
}
+ // Anti-Magic Shell (on self)
+ if (spellProto->Id == 48707)
+ {
+ // damage absorbed by Anti-Magic Shell energizes the DK with additional runic power.
+ // This, if I'm not mistaken, shows that we get back ~2% of the absorbed damage as runic power.
+ int32 absorbed = RemainingDamage * currentAbsorb / 100;
+ int32 regen = absorbed * 2 / 10;
+ pVictim->CastCustomSpell(pVictim, 49088, &regen, 0, 0, true, 0, *i);
+ RemainingDamage -= absorbed;
+ continue;
+ }
+ // Anti-Magic Shell (on single party/raid member)
+ if (spellProto->Id == 50462)
+ {
+ RemainingDamage -= RemainingDamage * currentAbsorb / 100;
+ continue;
+ }
+ // Anti-Magic Zone
+ if (spellProto->Id == 50461)
+ {
+ Unit* caster = (*i)->GetCaster();
+ if (!caster)
+ continue;
+ int32 absorbed = RemainingDamage * currentAbsorb / 100;
+ int32 canabsorb = caster->GetHealth();
+ if (canabsorb < absorbed)
+ absorbed = canabsorb;
+ DealDamage(caster, absorbed, NULL, damagetype, schoolMask, 0, false);
+ RemainingDamage -= absorbed;
+ continue;
+ }
+ break;
}
+ default:
+ break;
}
- if (RemainingDamage >= (*i)->GetModifier()->m_amount)
+ // currentAbsorb - damage can be absorbed by shield
+ // If need absorb less damage
+ if (RemainingDamage < currentAbsorb)
+ currentAbsorb = RemainingDamage;
+
+ AuraList const& AbsIgnoreAurasAb = GetAurasByType(SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL);
+ for(AuraList::const_iterator j = AbsIgnoreAurasAb.begin();j != AbsIgnoreAurasAb.end(); ++j)
{
- currentAbsorb = (*i)->GetModifier()->m_amount;
- pVictim->RemoveAurasDueToSpell((*i)->GetId());
- next = vSchoolAbsorb.begin();
+ if( (*j)->GetModifier()->m_miscvalue & (*i)->GetModifier()->m_miscvalue
+ && (*j)->isAffectedOnSpell(spellInfo))
+ currentAbsorb= int32(float(currentAbsorb) * (float(100-(*j)->GetModifier()->m_amount)/100.0f));
}
- else
+
+ AuraList const& AbsIgnoreAuras = GetAurasByType(SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL);
+ for(AuraList::const_iterator j = AbsIgnoreAuras.begin();j != AbsIgnoreAuras.end(); ++j)
{
- currentAbsorb = RemainingDamage;
- (*i)->GetModifier()->m_amount -= RemainingDamage;
+ if( (*j)->GetModifier()->m_miscvalue & (*i)->GetModifier()->m_miscvalue)
+ currentAbsorb= int32(float(currentAbsorb) * (float(100-(*j)->GetModifier()->m_amount)/100.0f));
}
RemainingDamage -= currentAbsorb;
+
+ // Reduce shield amount
+ mod->m_amount-=currentAbsorb;
+ // Need remove it later
+ if (mod->m_amount<=0)
+ existExpired = true;
}
- // do not cast spells while looping auras; auras can get invalid otherwise
- if (reflectDamage)
- pVictim->CastCustomSpell(this, 33619, &reflectDamage, NULL, NULL, true, NULL, reflectAura);
+
+ // Remove all expired absorb auras
+ if (existExpired)
+ {
+ for(AuraList::const_iterator i = vSchoolAbsorb.begin(); i != vSchoolAbsorb.end();)
+ {
+ if ((*i)->GetModifier()->m_amount<=0)
+ {
+ pVictim->RemoveAurasDueToSpell((*i)->GetId());
+ i = vSchoolAbsorb.begin();
+ }
+ else
+ ++i;
+ }
+ }
+ // Cast back reflect damage spell
+ if (reflectSpell)
+ pVictim->CastCustomSpell(this, reflectSpell, &reflectDamage, NULL, NULL, true);
// absorb by mana cost
AuraList const& vManaShield = pVictim->GetAurasByType(SPELL_AURA_MANA_SHIELD);
@@ -2213,7 +2114,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
currentAbsorb = RemainingDamage;
float manaMultiplier = (*i)->GetSpellProto()->EffectMultipleValue[(*i)->GetEffIndex()];
- if(Player *modOwner = GetSpellModOwner())
+ if(Player *modOwner = pVictim->GetSpellModOwner())
modOwner->ApplySpellMod((*i)->GetId(), SPELLMOD_MULTIPLE_VALUE, manaMultiplier);
int32 maxAbsorb = int32(pVictim->GetPower(POWER_MANA) / manaMultiplier);
@@ -2292,407 +2193,6 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
*absorb = damage - RemainingDamage - *resist;
}
-/*
-void Unit::DoAttackDamage (Unit *pVictim, uint32 *damage, CleanDamage *cleanDamage, uint32 *blocked_amount, SpellSchoolMask damageSchoolMask, uint32 *hitInfo, VictimState *victimState, uint32 *absorbDamage, uint32 *resistDamage, WeaponAttackType attType, SpellEntry const *spellCasted, bool isTriggeredSpell)
-{
- MeleeHitOutcome outcome;
-
- // If is casted Melee spell, calculate like physical
- if(!spellCasted)
- outcome = RollMeleeOutcomeAgainst (pVictim, attType);
- else
- outcome = RollPhysicalOutcomeAgainst (pVictim, attType, spellCasted);
-
- if(outcome == MELEE_HIT_MISS ||outcome == MELEE_HIT_DODGE ||outcome == MELEE_HIT_BLOCK ||outcome == MELEE_HIT_PARRY)
- pVictim->AddThreat(this, 0.0f);
- switch(outcome)
- {
- case MELEE_HIT_EVADE:
- {
- *hitInfo |= HITINFO_MISS;
- *damage = 0;
- cleanDamage->damage = 0;
- return;
- }
- case MELEE_HIT_MISS:
- {
- *hitInfo |= HITINFO_MISS;
- *damage = 0;
- cleanDamage->damage = 0;
- if(GetTypeId()== TYPEID_PLAYER)
- ((Player*)this)->UpdateWeaponSkill(attType);
- return;
- }
- }
-
- /// If this is a creature and it attacks from behind it has a probability to daze it's victim
- if( (outcome==MELEE_HIT_CRIT || outcome==MELEE_HIT_CRUSHING || outcome==MELEE_HIT_NORMAL || outcome==MELEE_HIT_GLANCING) &&
- GetTypeId() != TYPEID_PLAYER && !((Creature*)this)->GetCharmerOrOwnerGUID() && !pVictim->HasInArc(M_PI, this)
- && pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // -probability is between 0% and 40%
- // 20% base chance
- float Probability = 20;
-
- //there is a newbie protection, at level 10 just 7% base chance; assuming linear function
- if( pVictim->getLevel() < 30 )
- Probability = 0.65f*pVictim->getLevel()+0.5;
-
- uint32 VictimDefense=pVictim->GetDefenseSkillValue(this);
- uint32 AttackerMeleeSkill=GetUnitMeleeSkill(pVictim);
-
- Probability *= AttackerMeleeSkill/(float)VictimDefense;
-
- if(Probability > 40.0f)
- Probability = 40.0f;
-
- if(roll_chance_f(Probability))
- CastSpell(pVictim, 1604, true);
- }
-
- //Calculate the damage after armor mitigation if SPELL_SCHOOL_NORMAL
- if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
- {
- uint32 damageAfterArmor = CalcArmorReducedDamage(pVictim, *damage);
-
- // random durability for main hand weapon (ABSORB)
- if(damageAfterArmor < *damage)
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_ABSORB)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EquipmentSlots(urand(EQUIPMENT_SLOT_START,EQUIPMENT_SLOT_BACK)));
-
- cleanDamage->damage += *damage - damageAfterArmor;
- *damage = damageAfterArmor;
- }
-
- if(GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() != TYPEID_PLAYER && pVictim->GetCreatureType() != CREATURE_TYPE_CRITTER )
- ((Player*)this)->UpdateCombatSkills(pVictim, attType, outcome, false);
-
- if(GetTypeId() != TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
- ((Player*)pVictim)->UpdateCombatSkills(this, attType, outcome, true);
-
- switch (outcome)
- {
- case MELEE_HIT_BLOCK_CRIT:
- case MELEE_HIT_CRIT:
- {
- //*hitInfo = 0xEA;
- // 0xEA
- *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | 0x8;
-
- // Crit bonus calc
- uint32 crit_bonus;
- crit_bonus = *damage;
-
- // Apply crit_damage bonus for melee spells
- if (spellCasted)
- {
- if(Player* modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellCasted->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
-
- uint32 creatureTypeMask = pVictim->GetCreatureTypeMask();
- AuraList const& mDamageDoneVersus = GetAurasByType(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS);
- for(AuraList::const_iterator i = mDamageDoneVersus.begin();i != mDamageDoneVersus.end(); ++i)
- if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- crit_bonus = uint32(crit_bonus * ((*i)->GetModifierValue()+100.0f)/100.0f);
- }
-
- *damage += crit_bonus;
-
- uint32 resilienceReduction = 0;
-
- if(attType == RANGED_ATTACK)
- {
- int32 mod = pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE);
- *damage = int32((*damage) * float((100.0f + mod)/100.0f));
- // Resilience - reduce crit damage
- if (pVictim->GetTypeId()==TYPEID_PLAYER)
- resilienceReduction = ((Player*)pVictim)->GetRangedCritDamageReduction(*damage);
- }
- else
- {
- int32 mod = pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE);
- mod += GetTotalAuraModifier(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS_MELEE);
- *damage = int32((*damage) * float((100.0f + mod)/100.0f));
- // Resilience - reduce crit damage
- if (pVictim->GetTypeId()==TYPEID_PLAYER)
- resilienceReduction = ((Player*)pVictim)->GetMeleeCritDamageReduction(*damage);
- }
-
- *damage -= resilienceReduction;
- cleanDamage->damage += resilienceReduction;
-
- if(GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() != TYPEID_PLAYER && pVictim->GetCreatureType() != CREATURE_TYPE_CRITTER )
- ((Player*)this)->UpdateWeaponSkill(attType);
-
- ModifyAuraState(AURA_STATE_CRIT, true);
- StartReactiveTimer( REACTIVE_CRIT );
-
- if(getClass()==CLASS_HUNTER)
- {
- ModifyAuraState(AURA_STATE_HUNTER_CRIT_STRIKE, true);
- StartReactiveTimer( REACTIVE_HUNTER_CRIT );
- }
-
- if ( outcome == MELEE_HIT_BLOCK_CRIT )
- {
- *blocked_amount = pVictim->GetShieldBlockValue();
-
- if (pVictim->GetUnitBlockChance())
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYSHIELD);
- else
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYUNARMED);
-
- //Only set VICTIMSTATE_BLOCK on a full block
- if (*blocked_amount >= uint32(*damage))
- {
- *victimState = VICTIMSTATE_BLOCKS;
- *blocked_amount = uint32(*damage);
- }
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // Update defense
- ((Player*)pVictim)->UpdateDefense();
-
- // random durability for main hand weapon (BLOCK)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_BLOCK)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_OFFHAND);
- }
-
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE,true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
- break;
- }
-
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_WOUNDCRITICAL);
- break;
- }
- case MELEE_HIT_PARRY:
- {
- if(attType == RANGED_ATTACK) //range attack - no parry
- {
- outcome = MELEE_HIT_NORMAL;
- break;
- }
-
- cleanDamage->damage += *damage;
- *damage = 0;
- *victimState = VICTIMSTATE_PARRY;
-
- // instant (maybe with small delay) counter attack
- {
- float offtime = float(pVictim->getAttackTimer(OFF_ATTACK));
- float basetime = float(pVictim->getAttackTimer(BASE_ATTACK));
-
- // after parry nearest next attack time will reduced at %40 from full attack time.
- // The delay cannot be reduced to less than 20% of your weapon base swing delay.
- if (pVictim->haveOffhandWeapon() && offtime < basetime)
- {
- float percent20 = pVictim->GetAttackTime(OFF_ATTACK)*0.20;
- float percent60 = 3*percent20;
- // set to 20% if in range 20%...20+40% of full time
- if(offtime > percent20 && offtime <= percent60)
- {
- pVictim->setAttackTimer(OFF_ATTACK,uint32(percent20));
- }
- // decrease at %40 from full time
- else if(offtime > percent60)
- {
- offtime -= 2*percent20;
- pVictim->setAttackTimer(OFF_ATTACK,uint32(offtime));
- }
- // ELSE not changed
- }
- else
- {
- float percent20 = pVictim->GetAttackTime(BASE_ATTACK)*0.20;
- float percent60 = 3*percent20;
- // set to 20% if in range 20%...20+40% of full time
- if(basetime > percent20 && basetime <= percent60)
- {
- pVictim->setAttackTimer(BASE_ATTACK,uint32(percent20));
- }
- // decrease at %40 from full time
- else if(basetime > percent60)
- {
- basetime -= 2*percent20;
- pVictim->setAttackTimer(BASE_ATTACK,uint32(basetime));
- }
- // ELSE not changed
- }
- }
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // Update victim defense ?
- ((Player*)pVictim)->UpdateDefense();
-
- // random durability for main hand weapon (PARRY)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_PARRY)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_MAINHAND);
- }
-
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYUNARMED);
-
- if (pVictim->getClass() == CLASS_HUNTER)
- {
- pVictim->ModifyAuraState(AURA_STATE_HUNTER_PARRY,true);
- pVictim->StartReactiveTimer( REACTIVE_HUNTER_PARRY );
- }
- else
- {
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE, true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
- }
-
- CastMeleeProcDamageAndSpell(pVictim, 0, damageSchoolMask, attType, outcome, spellCasted, isTriggeredSpell);
- return;
- }
- case MELEE_HIT_DODGE:
- {
- if(attType == RANGED_ATTACK) //range attack - no dodge
- {
- outcome = MELEE_HIT_NORMAL;
- break;
- }
-
- cleanDamage->damage += *damage;
- *damage = 0;
- *victimState = VICTIMSTATE_DODGE;
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- ((Player*)pVictim)->UpdateDefense();
-
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYUNARMED);
-
- if (pVictim->getClass() != CLASS_ROGUE) // Riposte
- {
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE, true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
- }
-
- // Overpower
- if (GetTypeId() == TYPEID_PLAYER && getClass() == CLASS_WARRIOR)
- {
- ((Player*)this)->AddComboPoints(pVictim, 1);
- StartReactiveTimer( REACTIVE_OVERPOWER );
- }
-
- CastMeleeProcDamageAndSpell(pVictim, 0, damageSchoolMask, attType, outcome, spellCasted, isTriggeredSpell);
- return;
- }
- case MELEE_HIT_BLOCK:
- {
- *blocked_amount = pVictim->GetShieldBlockValue();
-
- if (pVictim->GetUnitBlockChance())
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYSHIELD);
- else
- pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYUNARMED);
-
- //Only set VICTIMSTATE_BLOCK on a full block
- if (*blocked_amount >= uint32(*damage))
- {
- *victimState = VICTIMSTATE_BLOCKS;
- *blocked_amount = uint32(*damage);
- }
-
- if(pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- // Update defense
- ((Player*)pVictim)->UpdateDefense();
-
- // random durability for main hand weapon (BLOCK)
- if (roll_chance_f(sWorld.getRate(RATE_DURABILITY_LOSS_BLOCK)))
- ((Player*)pVictim)->DurabilityPointLossForEquipSlot(EQUIPMENT_SLOT_OFFHAND);
- }
-
- pVictim->ModifyAuraState(AURA_STATE_DEFENSE,true);
- pVictim->StartReactiveTimer( REACTIVE_DEFENSE );
-
- break;
- }
- case MELEE_HIT_GLANCING:
- {
- int32 leveldif = int32(pVictim->getLevel()) - int32(getLevel());
- if (leveldif > 3) leveldif = 3;
- *damage *= (1 - leveldif * 0.1f);
- cleanDamage->damage = *damage;
- *hitInfo |= HITINFO_GLANCING;
- break;
- }
- case MELEE_HIT_CRUSHING:
- {
- // 150% normal damage
- *damage += (*damage / 2);
- cleanDamage->damage = *damage;
- *hitInfo |= HITINFO_CRUSHING;
- // TODO: victimState, victim animation?
- break;
- }
- default:
- break;
- }
-
- // apply melee damage bonus and absorb only if base damage not fully blocked to prevent negative damage or damage with full block
- if(*victimState != VICTIMSTATE_BLOCKS)
- {
- MeleeDamageBonus(pVictim, damage,attType,spellCasted);
- CalcAbsorbResist(pVictim, damageSchoolMask, DIRECT_DAMAGE, *damage-*blocked_amount, absorbDamage, resistDamage);
- }
-
- if (*absorbDamage) *hitInfo |= HITINFO_ABSORB;
- if (*resistDamage) *hitInfo |= HITINFO_RESIST;
-
- cleanDamage->damage += *blocked_amount;
-
- if (*damage <= *absorbDamage + *resistDamage + *blocked_amount)
- {
- //*hitInfo = 0x00010020;
- //*hitInfo |= HITINFO_SWINGNOHITSOUND;
- //*damageType = 0;
- CastMeleeProcDamageAndSpell(pVictim, 0, damageSchoolMask, attType, outcome, spellCasted, isTriggeredSpell);
- return;
- }
-
- // update at damage Judgement aura duration that applied by attacker at victim
- if(*damage)
- {
- AuraMap const& vAuras = pVictim->GetAuras();
- for(AuraMap::const_iterator itr = vAuras.begin(); itr != vAuras.end(); ++itr)
- {
- SpellEntry const *spellInfo = (*itr).second->GetSpellProto();
- if( (spellInfo->AttributesEx3 & 0x40000) && spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN &&
- ((*itr).second->GetCasterGUID() == GetGUID() && (!spellCasted || spellCasted->Id == 35395)) )
- {
- (*itr).second->SetAuraDuration((*itr).second->GetAuraMaxDuration());
- (*itr).second->UpdateAuraDuration();
- }
- }
- }
-
- CastMeleeProcDamageAndSpell(pVictim, (*damage - *absorbDamage pVictim->SpellNonMeleeDamageLog(this, (*i)->GetId(), (*i)->GetModifier()->m_amount, false, false);eld
- // yet another hack to fix crashes related to the aura getting removed during iteration
- std::set<Aura*> alreadyDone;
- uint32 removedAuras = pVictim->m_removedAuras;
- AuraList const& vDamageShields = pVictim->GetAurasByType(SPELL_AURA_DAMAGE_SHIELD);
- for(AuraList::const_iterator i = vDamageShields.begin(), next = vDamageShields.begin(); i != vDamageShields.end(); i = next)
- {
- ++next;
- if (alreadyDone.find(*i) == alreadyDone.end())
- {
- alreadyDone.insert(*i);
- pVictim->SpellNonMeleeDamageLog(this, (*i)->GetId(), (*i)->GetModifierValue(), false, false);
- if (pVictim->m_removedAuras > removedAuras)
- {
- removedAuras = pVictim->m_removedAuras;
- next = vDamageShields.begin();
- }
- }
- }
-}*/
-
void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool extra )
{
if(hasUnitState(UNIT_STAT_CANNOT_AUTOATTACK) || HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED) )
@@ -2759,67 +2259,6 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex
}
}
-/*
-MeleeHitOutcome Unit::RollPhysicalOutcomeAgainst (Unit const *pVictim, WeaponAttackType attType, SpellEntry const *spellInfo)
-{
- // Miss chance based on melee
- float miss_chance = MeleeMissChanceCalc(pVictim, attType);
-
- // Critical hit chance
- float crit_chance = GetUnitCriticalChance(attType, pVictim);
- // this is to avoid compiler issue when declaring variables inside if
- float block_chance, parry_chance, dodge_chance;
-
- // cannot be dodged/parried/blocked
- if(spellInfo->Attributes & SPELL_ATTR_IMPOSSIBLE_DODGE_PARRY_BLOCK)
- {
- block_chance = 0.0f;
- parry_chance = 0.0f;
- dodge_chance = 0.0f;
- }
- else
- {
- // parry can be avoided only by some abilities
- parry_chance = pVictim->GetUnitParryChance();
- // block might be bypassed by it as well
- block_chance = pVictim->GetUnitBlockChance();
- // stunned target cannot dodge and this is check in GetUnitDodgeChance()
- dodge_chance = pVictim->GetUnitDodgeChance();
- }
-
- // Only players can have Talent&Spell bonuses
- if (GetTypeId() == TYPEID_PLAYER)
- {
- // Increase from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL aura
- crit_chance += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, spellInfo->SchoolMask);
-
- if( dodge_chance != 0.0f ) // if dodge chance is already 0, ignore talents for speed
- {
- AuraList const& mCanNotBeDodge = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
- for(AuraList::const_iterator i = mCanNotBeDodge.begin(); i != mCanNotBeDodge.end(); ++i)
- {
- // can't be dodged rogue finishing move
- if((*i)->GetModifier()->m_miscvalue == VICTIMSTATE_DODGE)
- {
- if(spellInfo->SpellFamilyName==SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE))
- {
- dodge_chance = 0.0f;
- break;
- }
- }
- }
- }
- }
-
- // Spellmods
- if(Player* modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
-
- DEBUG_LOG("PHYSICAL OUTCOME: miss %f crit %f dodge %f parry %f block %f",miss_chance,crit_chance,dodge_chance,parry_chance, block_chance);
-
- return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance*100), int32(miss_chance*100),int32(dodge_chance*100),int32(parry_chance*100),int32(block_chance*100), true);
-}*/
-
MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(const Unit *pVictim, WeaponAttackType attType) const
{
// This is only wrapper
@@ -2839,10 +2278,10 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(const Unit *pVictim, WeaponAttackT
// Useful if want to specify crit & miss chances for melee, else it could be removed
DEBUG_LOG("MELEE OUTCOME: miss %f crit %f dodge %f parry %f block %f", miss_chance,crit_chance,dodge_chance,parry_chance,block_chance);
- return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance*100), int32(miss_chance*100), int32(dodge_chance*100),int32(parry_chance*100),int32(block_chance*100), false);
+ return RollMeleeOutcomeAgainst(pVictim, attType, int32(crit_chance*100), int32(miss_chance*100), int32(dodge_chance*100),int32(parry_chance*100),int32(block_chance*100));
}
-MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance, bool SpellCasted ) const
+MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
{
if(pVictim->GetTypeId()==TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())
return MELEE_HIT_EVADE;
@@ -2855,7 +2294,6 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
// bonus from skills is 0.04%
int32 skillBonus = 4 * ( attackerWeaponSkill - victimMaxSkillValueForLevel );
- int32 skillBonus2 = 4 * ( attackerMaxSkillValueForLevel - victimDefenseSkill );
int32 sum = 0, tmp = 0;
int32 roll = urand (0, 10000);
@@ -2893,6 +2331,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
// Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
dodge_chance+= GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, VICTIMSTATE_DODGE);
+ dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
tmp = dodge_chance;
if ( (tmp > 0) // check if unit _can_ dodge
@@ -2936,16 +2375,6 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
&& ((tmp -= skillBonus) > 0)
&& (roll < (sum += tmp)))
{
- // Critical chance
- tmp = crit_chance + skillBonus2;
- if ( GetTypeId() == TYPEID_PLAYER && SpellCasted && tmp > 0 )
- {
- if ( roll_chance_i(tmp/100))
- {
- DEBUG_LOG ("RollMeleeOutcomeAgainst: BLOCKED CRIT");
- return MELEE_HIT_BLOCK_CRIT;
- }
- }
DEBUG_LOG ("RollMeleeOutcomeAgainst: BLOCK <%d, %d)", sum-tmp, sum);
return MELEE_HIT_BLOCK;
}
@@ -2953,7 +2382,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
}
// Critical chance
- tmp = crit_chance + skillBonus2;
+ tmp = crit_chance;
if (tmp > 0 && roll < (sum += tmp))
{
@@ -2962,7 +2391,7 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
}
// Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
- if( attType != RANGED_ATTACK && !SpellCasted &&
+ if( attType != RANGED_ATTACK &&
(GetTypeId() == TYPEID_PLAYER || ((Creature*)this)->isPet()) &&
pVictim->GetTypeId() != TYPEID_PLAYER && !((Creature*)pVictim)->isPet() &&
getLevel() < pVictim->getLevelForTarget(this) )
@@ -2981,10 +2410,14 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttack
}
}
- if(GetTypeId()!=TYPEID_PLAYER && !(((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH) && !((Creature*)this)->isPet() && !SpellCasted /*Only autoattack can be crushing blow*/ )
+ // mobs can score crushing blows if they're 4 or more levels above victim
+ if (getLevelForTarget(pVictim) >= pVictim->getLevelForTarget(this) + 4 &&
+ // can be from by creature (if can) or from controlled player that considered as creature
+ (GetTypeId()!=TYPEID_PLAYER && !((Creature*)this)->isPet() &&
+ !(((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSH) ||
+ GetTypeId()==TYPEID_PLAYER && GetCharmerOrOwnerGUID()))
{
- // mobs can score crushing blows if they're 3 or more levels above victim
- // or when their weapon skill is 15 or more above victim's defense skill
+ // when their weapon skill is 15 or more above victim's defense skill
tmp = victimDefenseSkill;
int32 tmpmax = victimMaxSkillValueForLevel;
// having defense above your maximum (from items, talents etc.) has no effect
@@ -3094,6 +2527,23 @@ bool Unit::isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAtt
{
if (pVictim->HasInArc(M_PI,this))
{
+ /* Currently not exist spells with ignore block
+ // Ignore combat result aura (parry/dodge check on prepare)
+ AuraList const& ignore = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
+ for(AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
+ {
+ if (!(*i)->isAffectedOnSpell(spellProto))
+ continue;
+ if ((*i)->GetModifier()->m_miscvalue == )
+ return false;
+ }
+ */
+
+ // Check creatures flags_extra for disable block
+ if(pVictim->GetTypeId()==TYPEID_UNIT &&
+ ((Creature*)pVictim)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK )
+ return false;
+
float blockChance = GetUnitBlockChance();
blockChance += (GetWeaponSkillValue(attackType) - pVictim->GetMaxSkillValueForLevel() )*0.04;
if (roll_chance_f(blockChance))
@@ -3102,24 +2552,27 @@ bool Unit::isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAtt
return false;
}
+bool Unit::isBlockCritical()
+{
+ if (roll_chance_i(GetTotalAuraModifier(SPELL_AURA_MOD_BLOCK_CRIT_CHANCE)))
+ return true;
+ return false;
+}
+
// Melee based spells can be miss, parry or dodge on this step
// Crit or block - determined on damage calculation phase! (and can be both in some time)
-float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
+/*float Unit::MeleeSpellMissChance(Unit *pVictim, WeaponAttackType attType, int32 skillDiff, SpellEntry const *spell)
{
// Calculate hit chance (more correct for chance mod)
int32 HitChance;
// PvP - PvE melee chances
- /*int32 lchance = pVictim->GetTypeId() == TYPEID_PLAYER ? 5 : 7;
+ int32 lchance = pVictim->GetTypeId() == TYPEID_PLAYER ? 5 : 7;
int32 leveldif = pVictim->getLevelForTarget(this) - getLevelForTarget(pVictim);
if(leveldif < 3)
HitChance = 95 - leveldif;
else
- HitChance = 93 - (leveldif - 2) * lchance;*/
- if (spellId || attType == RANGED_ATTACK || !haveOffhandWeapon())
- HitChance = 95.0f;
- else
- HitChance = 76.0f;
+ HitChance = 93 - (leveldif - 2) * lchance;
// Hit chance depends from victim auras
if(attType == RANGED_ATTACK)
@@ -3128,11 +2581,8 @@ float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType,
HitChance += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE);
// Spellmod from SPELLMOD_RESIST_MISS_CHANCE
- if(spellId)
- {
- if(Player *modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, HitChance);
- }
+ if(Player *modOwner = GetSpellModOwner())
+ modOwner->ApplySpellMod(spell->Id, SPELLMOD_RESIST_MISS_CHANCE, HitChance);
// Miss = 100 - hit
float miss_chance= 100.0f - HitChance;
@@ -3144,12 +2594,7 @@ float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType,
miss_chance -= m_modMeleeHitChance;
// bonus from skills is 0.04%
- //miss_chance -= skillDiff * 0.04f;
- int32 diff = -skillDiff;
- if(pVictim->GetTypeId()==TYPEID_PLAYER)
- miss_chance += diff > 0 ? diff * 0.04 : diff * 0.02;
- else
- miss_chance += diff > 10 ? 2 + (diff - 10) * 0.4 : diff * 0.1;
+ miss_chance -= skillDiff * 0.04f;
// Limit miss chance from 0 to 60%
if (miss_chance < 0.0f)
@@ -3157,7 +2602,7 @@ float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType,
if (miss_chance > 60.0f)
return 60.0f;
return miss_chance;
-}
+}*/
// Melee based spells hit result calculations
SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell)
@@ -3173,68 +2618,117 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell)
int32 fullSkillDiff = attackerWeaponSkill - int32(pVictim->GetDefenseSkillValue(this));
uint32 roll = urand (0, 10000);
- uint32 missChance = uint32(MeleeSpellMissChance(pVictim, attType, fullSkillDiff, spell->Id)*100.0f);
+ uint32 missChance = uint32(MeleeSpellMissChance(pVictim, attType, fullSkillDiff, spell->Id)*100.0f);
// Roll miss
uint32 tmp = missChance;
if (roll < tmp)
return SPELL_MISS_MISS;
+ // Chance resist mechanic (select max value from every mechanic spell effect)
+ int32 resist_mech = 0;
+ // Get effects mechanic and chance
+ for(int eff = 0; eff < 3; ++eff)
+ {
+ int32 effect_mech = GetEffectMechanic(spell, eff);
+ if (effect_mech)
+ {
+ int32 temp = pVictim->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MECHANIC_RESISTANCE, effect_mech);
+ if (resist_mech < temp*100)
+ resist_mech = temp*100;
+ }
+ }
+ // Roll chance
+ tmp += resist_mech;
+ if (roll < tmp)
+ return SPELL_MISS_RESIST;
+
+ bool canDodge = true;
+ bool canParry = true;
+
// Same spells cannot be parry/dodge
if (spell->Attributes & SPELL_ATTR_IMPOSSIBLE_DODGE_PARRY_BLOCK)
return SPELL_MISS_NONE;
- // Ranged attack can`t miss too
+ // Ranged attack cannot be parry/dodge only deflect
if (attType == RANGED_ATTACK)
+ {
+ // only if in front
+ if (pVictim->HasInArc(M_PI,this))
+ {
+ int32 deflect_chance = pVictim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS)*100;
+ tmp+=deflect_chance;
+ if (roll < tmp)
+ return SPELL_MISS_DEFLECT;
+ }
return SPELL_MISS_NONE;
+ }
- bool attackFromBehind = !pVictim->HasInArc(M_PI,this);
-
- // Roll dodge
- int32 dodgeChance = int32(pVictim->GetUnitDodgeChance()*100.0f) - skillDiff * 4;
- // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
- dodgeChance+= GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, VICTIMSTATE_DODGE);
-
- // Reduce dodge chance by attacker expertise rating
- if (GetTypeId() == TYPEID_PLAYER)
- dodgeChance-=int32(((Player*)this)->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
- if (dodgeChance < 0)
- dodgeChance = 0;
-
- // Can`t dodge from behind in PvP (but its possible in PvE)
- if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER && attackFromBehind)
- dodgeChance = 0;
-
- // Rogue talent`s cant be dodged
- AuraList const& mCanNotBeDodge = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
- for(AuraList::const_iterator i = mCanNotBeDodge.begin(); i != mCanNotBeDodge.end(); ++i)
+ // Check for attack from behind
+ if (!pVictim->HasInArc(M_PI,this))
+ {
+ // Can`t dodge from behind in PvP (but its possible in PvE)
+ if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
+ canDodge = false;
+ // Can`t parry
+ canParry = false;
+ }
+ // Check creatures flags_extra for disable parry
+ if(pVictim->GetTypeId()==TYPEID_UNIT)
{
- if((*i)->GetModifier()->m_miscvalue == VICTIMSTATE_DODGE) // can't be dodged rogue finishing move
+ uint32 flagEx = ((Creature*)pVictim)->GetCreatureInfo()->flags_extra;
+ if( flagEx & CREATURE_FLAG_EXTRA_NO_PARRY )
+ canParry = false;
+ }
+ // Ignore combat result aura
+ AuraList const& ignore = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
+ for(AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
+ {
+ if (!(*i)->isAffectedOnSpell(spell))
+ continue;
+ switch((*i)->GetModifier()->m_miscvalue)
{
- if(spell->SpellFamilyName==SPELLFAMILY_ROGUE && (spell->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE))
- {
- dodgeChance = 0;
+ case MELEE_HIT_DODGE: canDodge = false; break;
+ case MELEE_HIT_BLOCK: break; // Block check in hit step
+ case MELEE_HIT_PARRY: canParry = false; break;
+ default:
+ DEBUG_LOG("Spell %u SPELL_AURA_IGNORE_COMBAT_RESULT have unhandled state %d", (*i)->GetId(), (*i)->GetModifier()->m_miscvalue);
break;
- }
}
}
- tmp += dodgeChance;
- if (roll < tmp)
- return SPELL_MISS_DODGE;
+ if (canDodge)
+ {
+ // Roll dodge
+ int32 dodgeChance = int32(pVictim->GetUnitDodgeChance()*100.0f) - skillDiff * 4;
+ // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
+ dodgeChance+= GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, VICTIMSTATE_DODGE)*100;
+ dodgeChance = int32 (float (dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
+ // Reduce dodge chance by attacker expertise rating
+ if (GetTypeId() == TYPEID_PLAYER)
+ dodgeChance-=int32(((Player*)this)->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
+ if (dodgeChance < 0)
+ dodgeChance = 0;
- // Roll parry
- int32 parryChance = int32(pVictim->GetUnitParryChance()*100.0f) - skillDiff * 4;
- // Reduce parry chance by attacker expertise rating
- if (GetTypeId() == TYPEID_PLAYER)
- parryChance-=int32(((Player*)this)->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
- // Can`t parry from behind
- if (parryChance < 0 || attackFromBehind)
- parryChance = 0;
+ tmp += dodgeChance;
+ if (roll < tmp)
+ return SPELL_MISS_DODGE;
+ }
- tmp += parryChance;
- if (roll < tmp)
- return SPELL_MISS_PARRY;
+ if (canParry)
+ {
+ // Roll parry
+ int32 parryChance = int32(pVictim->GetUnitParryChance()*100.0f) - skillDiff * 4;
+ // Reduce parry chance by attacker expertise rating
+ if (GetTypeId() == TYPEID_PLAYER)
+ parryChance-=int32(((Player*)this)->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
+ if (parryChance < 0)
+ parryChance = 0;
+
+ tmp += parryChance;
+ if (roll < tmp)
+ return SPELL_MISS_PARRY;
+ }
return SPELL_MISS_NONE;
}
@@ -3301,9 +2795,22 @@ SpellMissInfo Unit::MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell)
if (HitChance < 100) HitChance = 100;
if (HitChance > 9900) HitChance = 9900;
+ int32 tmp = 10000 - HitChance;
+
uint32 rand = urand(0,10000);
- if (rand > HitChance)
+
+ if (rand < tmp)
return SPELL_MISS_RESIST;
+
+ // cast by caster in front of victim
+ if (pVictim->HasInArc(M_PI,this))
+ {
+ int32 deflect_chance = pVictim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS)*100;
+ tmp+=deflect_chance;
+ if (rand < tmp)
+ return SPELL_MISS_DEFLECT;
+ }
+
return SPELL_MISS_NONE;
}
@@ -3325,8 +2832,8 @@ SpellMissInfo Unit::SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool
if (spell->Attributes & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY)
return SPELL_MISS_NONE;
- // Check for immune (use charges)
- if (pVictim->IsImmunedToSpell(spell,true))
+ // Check for immune
+ if (pVictim->IsImmunedToSpell(spell))
return SPELL_MISS_IMMUNE;
// All positive spells can`t miss
@@ -3335,8 +2842,8 @@ SpellMissInfo Unit::SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool
&&(!IsHostileTo(pVictim))) //prevent from affecting enemy by "positive" spell
return SPELL_MISS_NONE;
- // Check for immune (use charges)
- if (pVictim->IsImmunedToDamage(GetSpellSchoolMask(spell),true))
+ // Check for immune
+ if (pVictim->IsImmunedToDamage(GetSpellSchoolMask(spell)))
return SPELL_MISS_IMMUNE;
if(this == pVictim)
@@ -3349,7 +2856,7 @@ SpellMissInfo Unit::SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool
Unit::AuraList const& mReflectSpellsSchool = pVictim->GetAurasByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
for(Unit::AuraList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
if((*i)->GetModifier()->m_miscvalue & GetSpellSchoolMask(spell))
- reflectchance = (*i)->GetModifierValue();
+ reflectchance += (*i)->GetModifier()->m_amount;
if (reflectchance > 0 && roll_chance_i(reflectchance))
{
// Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
@@ -3524,7 +3031,7 @@ float Unit::GetUnitBlockChance() const
Player const* player = (Player const*)this;
if(player->CanBlock() )
{
- Item *tmpitem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+ Item *tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
if(tmpitem && !tmpitem->IsBroken() && tmpitem->GetProto()->Block)
return GetFloatValue(PLAYER_BLOCK_PERCENTAGE);
}
@@ -3590,6 +3097,9 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVict
crit -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE);
}
+ // Apply crit chance from defence skill
+ crit += (int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetDefenseSkillValue(this))) * 0.04f;
+
if (crit < 0.0f)
crit = 0.0f;
return crit;
@@ -3606,7 +3116,7 @@ uint32 Unit::GetWeaponSkillValue (WeaponAttackType attType, Unit const* target)
if(attType != BASE_ATTACK && !item )
{
if(attType == RANGED_ATTACK && getClass() == CLASS_PALADIN) //hammer
- return GetMaxSkillValueForLevel();
+ return GetMaxSkillValueForLevel();
return 0;
}
@@ -3721,7 +3231,7 @@ void Unit::_UpdateAutoRepeatSpell()
if ( (GetTypeId() == TYPEID_PLAYER && ((Player*)this)->isMoving()) || IsNonMeleeSpellCasted(false,false,true) )
{
// cancel wand shoot
- if(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Category == 351)
+ if(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != SPELL_ID_AUTOSHOT)
InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
m_AutoRepeatFirstCast = true;
return;
@@ -3774,7 +3284,7 @@ void Unit::SetCurrentCastedSpell( Spell * pSpell )
if ( m_currentSpells[CURRENT_AUTOREPEAT_SPELL] )
{
// break autorepeat if not Auto Shot
- if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Category == 351)
+ if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != SPELL_ID_AUTOSHOT)
InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
m_AutoRepeatFirstCast = true;
}
@@ -3789,7 +3299,7 @@ void Unit::SetCurrentCastedSpell( Spell * pSpell )
// it also does break autorepeat if not Auto Shot
if ( m_currentSpells[CURRENT_AUTOREPEAT_SPELL] &&
- m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Category == 351 )
+ m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != SPELL_ID_AUTOSHOT )
InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
addUnitState(UNIT_STAT_CASTING);
} break;
@@ -3797,7 +3307,7 @@ void Unit::SetCurrentCastedSpell( Spell * pSpell )
case CURRENT_AUTOREPEAT_SPELL:
{
// only Auto Shoot does not break anything
- if (pSpell->m_spellInfo->Category == 351)
+ if (pSpell->m_spellInfo->Id != SPELL_ID_AUTOSHOT)
{
// generic autorepeats break generic non-delayed and channeled non-delayed spells
InterruptSpell(CURRENT_GENERIC_SPELL,false);
@@ -3960,13 +3470,23 @@ void Unit::DeMorph()
SetDisplayId(GetNativeDisplayId());
}
+bool Unit::HasAuraTypeWithMiscvalue(AuraType auratype, uint32 miscvalue) const
+{
+ AuraList const& mTotalAuraList = GetAurasByType(auratype);
+ for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
+ if (miscvalue == (*i)->GetModifier()->m_miscvalue)
+ return true;
+
+ return false;
+}
+
int32 Unit::GetTotalAuraModifier(AuraType auratype) const
{
int32 modifier = 0;
AuraList const& mTotalAuraList = GetAurasByType(auratype);
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
- modifier += (*i)->GetModifierValue();
+ modifier += (*i)->GetModifier()->m_amount;
return modifier;
}
@@ -3977,7 +3497,7 @@ float Unit::GetTotalAuraMultiplier(AuraType auratype) const
AuraList const& mTotalAuraList = GetAurasByType(auratype);
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
- multiplier *= (100.0f + (*i)->GetModifierValue())/100.0f;
+ multiplier *= (100.0f + (*i)->GetModifier()->m_amount)/100.0f;
return multiplier;
}
@@ -3988,11 +3508,8 @@ int32 Unit::GetMaxPositiveAuraModifier(AuraType auratype) const
AuraList const& mTotalAuraList = GetAurasByType(auratype);
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
- {
- int32 amount = (*i)->GetModifierValue();
- if (amount > modifier)
- modifier = amount;
- }
+ if ((*i)->GetModifier()->m_amount > modifier)
+ modifier = (*i)->GetModifier()->m_amount;
return modifier;
}
@@ -4003,11 +3520,8 @@ int32 Unit::GetMaxNegativeAuraModifier(AuraType auratype) const
AuraList const& mTotalAuraList = GetAurasByType(auratype);
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
- {
- int32 amount = (*i)->GetModifierValue();
- if (amount < modifier)
- modifier = amount;
- }
+ if ((*i)->GetModifier()->m_amount < modifier)
+ modifier = (*i)->GetModifier()->m_amount;
return modifier;
}
@@ -4021,7 +3535,7 @@ int32 Unit::GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask)
{
Modifier* mod = (*i)->GetModifier();
if (mod->m_miscvalue & misc_mask)
- modifier += (*i)->GetModifierValue();
+ modifier += mod->m_amount;
}
return modifier;
}
@@ -4035,7 +3549,7 @@ float Unit::GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask
{
Modifier* mod = (*i)->GetModifier();
if (mod->m_miscvalue & misc_mask)
- multiplier *= (100.0f + (*i)->GetModifierValue())/100.0f;
+ multiplier *= (100.0f + mod->m_amount)/100.0f;
}
return multiplier;
}
@@ -4048,9 +3562,8 @@ int32 Unit::GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
{
Modifier* mod = (*i)->GetModifier();
- int32 amount = (*i)->GetModifierValue();
- if (mod->m_miscvalue & misc_mask && amount > modifier)
- modifier = amount;
+ if (mod->m_miscvalue & misc_mask && mod->m_amount > modifier)
+ modifier = mod->m_amount;
}
return modifier;
@@ -4064,9 +3577,8 @@ int32 Unit::GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
{
Modifier* mod = (*i)->GetModifier();
- int32 amount = (*i)->GetModifierValue();
- if (mod->m_miscvalue & misc_mask && amount < modifier)
- modifier = amount;
+ if (mod->m_miscvalue & misc_mask && mod->m_amount < modifier)
+ modifier = mod->m_amount;
}
return modifier;
@@ -4081,7 +3593,7 @@ int32 Unit::GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value)
{
Modifier* mod = (*i)->GetModifier();
if (mod->m_miscvalue == misc_value)
- modifier += (*i)->GetModifierValue();
+ modifier += mod->m_amount;
}
return modifier;
}
@@ -4095,7 +3607,7 @@ float Unit::GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_valu
{
Modifier* mod = (*i)->GetModifier();
if (mod->m_miscvalue == misc_value)
- multiplier *= (100.0f + (*i)->GetModifierValue())/100.0f;
+ multiplier *= (100.0f + mod->m_amount)/100.0f;
}
return multiplier;
}
@@ -4108,9 +3620,8 @@ int32 Unit::GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
{
Modifier* mod = (*i)->GetModifier();
- int32 amount = (*i)->GetModifierValue();
- if (mod->m_miscvalue == misc_value && amount > modifier)
- modifier = amount;
+ if (mod->m_miscvalue == misc_value && mod->m_amount > modifier)
+ modifier = mod->m_amount;
}
return modifier;
@@ -4124,9 +3635,8 @@ int32 Unit::GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_
for(AuraList::const_iterator i = mTotalAuraList.begin();i != mTotalAuraList.end(); ++i)
{
Modifier* mod = (*i)->GetModifier();
- int32 amount = (*i)->GetModifierValue();
- if (mod->m_miscvalue == misc_value && amount < modifier)
- modifier = amount;
+ if (mod->m_miscvalue == misc_value && mod->m_amount < modifier)
+ modifier = mod->m_amount;
}
return modifier;
@@ -4162,57 +3672,51 @@ bool Unit::AddAura(Aura *Aur)
// passive and persistent auras can stack with themselves any number of times
if (!Aur->IsPassive() && !Aur->IsPersistent())
{
- // replace aura if next will > spell StackAmount
- if(aurSpellInfo->StackAmount)
+ for(AuraMap::iterator i2 = m_Auras.lower_bound(spair); i2 != m_Auras.upper_bound(spair); ++i2)
{
- Aur->SetStackAmount(i->second->GetStackAmount());
- if(Aur->GetStackAmount() < aurSpellInfo->StackAmount)
- Aur->SetStackAmount(Aur->GetStackAmount()+1);
- RemoveAura(i,AURA_REMOVE_BY_STACK);
- }
- // if StackAmount==0 not allow auras from same caster
- else
- {
- for(AuraMap::iterator i2 = m_Auras.lower_bound(spair); i2 != m_Auras.upper_bound(spair); ++i2)
+ if(i2->second->GetCasterGUID()==Aur->GetCasterGUID())
{
- if(i2->second->GetCasterGUID()==Aur->GetCasterGUID())
+ // Aura can stack on self -> Stack it;
+ if(aurSpellInfo->StackAmount)
{
- // can be only single (this check done at _each_ aura add
- RemoveAura(i2,AURA_REMOVE_BY_STACK);
- break;
- }
-
- bool stop = false;
- switch(aurSpellInfo->EffectApplyAuraName[Aur->GetEffIndex()])
- {
- // DoT/HoT/etc
- case SPELL_AURA_PERIODIC_DAMAGE: // allow stack
- case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
- case SPELL_AURA_PERIODIC_LEECH:
- case SPELL_AURA_PERIODIC_HEAL:
- case SPELL_AURA_OBS_MOD_HEALTH:
- case SPELL_AURA_PERIODIC_MANA_LEECH:
- case SPELL_AURA_PERIODIC_ENERGIZE:
- case SPELL_AURA_OBS_MOD_MANA:
- case SPELL_AURA_POWER_BURN_MANA:
- break;
- default: // not allow
- // can be only single (this check done at _each_ aura add
- RemoveAura(i2,AURA_REMOVE_BY_STACK);
- stop = true;
- break;
+ i2->second->modStackAmount(1);
+ delete Aur;
+ return false;
}
+ // can be only single (this check done at _each_ aura add
+ RemoveAura(i2,AURA_REMOVE_BY_STACK);
+ break;
+ }
- if(stop)
+ bool stop = false;
+ switch(aurSpellInfo->EffectApplyAuraName[Aur->GetEffIndex()])
+ {
+ // DoT/HoT/etc
+ case SPELL_AURA_PERIODIC_DAMAGE: // allow stack
+ case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
+ case SPELL_AURA_PERIODIC_LEECH:
+ case SPELL_AURA_PERIODIC_HEAL:
+ case SPELL_AURA_OBS_MOD_HEALTH:
+ case SPELL_AURA_PERIODIC_MANA_LEECH:
+ case SPELL_AURA_PERIODIC_ENERGIZE:
+ case SPELL_AURA_OBS_MOD_MANA:
+ case SPELL_AURA_POWER_BURN_MANA:
+ break;
+ default: // not allow
+ // can be only single (this check done at _each_ aura add
+ RemoveAura(i2,AURA_REMOVE_BY_STACK);
+ stop = true;
break;
}
+
+ if(stop)
+ break;
}
}
}
- // passive auras stack with all (except passive spell proc auras)
- if ((!Aur->IsPassive() || !IsPassiveStackableSpell(Aur->GetId())) &&
- !(Aur->GetId() == 20584 || Aur->GetId() == 8326))
+ // passive auras not stacable with other ranks
+ if (!IsPassiveSpellStackableWithRanks(aurSpellInfo))
{
if (!RemoveNoStackAurasDueToAura(Aur))
{
@@ -4331,6 +3835,13 @@ bool Unit::RemoveNoStackAurasDueToAura(Aura *Aur)
uint32 spellId = Aur->GetId();
uint32 effIndex = Aur->GetEffIndex();
+ // passive spell special case (only non stackable with ranks)
+ if(IsPassiveSpell(spellId))
+ {
+ if(IsPassiveSpellStackableWithRanks(spellProto))
+ return true;
+ }
+
SpellSpecific spellId_spec = GetSpellSpecific(spellId);
AuraMap::iterator i,next;
@@ -4347,9 +3858,11 @@ bool Unit::RemoveNoStackAurasDueToAura(Aura *Aur)
uint32 i_spellId = i_spellProto->Id;
+ // early checks that spellId is passive non stackable spell
if(IsPassiveSpell(i_spellId))
{
- if(IsPassiveStackableSpell(i_spellId))
+ // passive non-stackable spells not stackable only for same caster
+ if(Aur->GetCasterGUID()!=i->second->GetCasterGUID())
continue;
// passive non-stackable spells not stackable only with another rank of same spell
@@ -4366,65 +3879,36 @@ bool Unit::RemoveNoStackAurasDueToAura(Aura *Aur)
for(int j = 0; j < 3; ++j)
if (i_spellProto->EffectTriggerSpell[j] == spellProto->Id)
is_triggered_by_spell = true;
- if (is_triggered_by_spell) continue;
- for(int j = 0; j < 3; ++j)
- {
- // prevent remove dummy triggered spells at next effect aura add
- switch(spellProto->Effect[j]) // main spell auras added added after triggered spell
- {
- case SPELL_EFFECT_DUMMY:
- switch(spellId)
- {
- case 5420: if(i_spellId==34123) is_triggered_by_spell = true; break;
- }
- break;
- }
+ if (is_triggered_by_spell)
+ continue;
- if(is_triggered_by_spell)
- break;
+ // check if they can stack
+ bool sameCaster = Aur->GetCasterGUID() == (*i).second->GetCasterGUID();
+ if(!spellmgr.IsNoStackSpellDueToSpell(spellId, i_spellId, sameCaster))
+ continue;
- // prevent remove form main spell by triggered passive spells
- switch(i_spellProto->EffectApplyAuraName[j]) // main aura added before triggered spell
- {
- case SPELL_AURA_MOD_SHAPESHIFT:
- switch(i_spellId)
- {
- case 24858: if(spellId==24905) is_triggered_by_spell = true; break;
- case 33891: if(spellId==5420 || spellId==34123) is_triggered_by_spell = true; break;
- case 34551: if(spellId==22688) is_triggered_by_spell = true; break;
- }
- break;
- }
- }
+ //some spells should be not removed by lower rank of them (totem, paladin aura)
+ if (!sameCaster
+ &&(spellProto->Effect[effIndex]==SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
+ &&(spellProto->DurationIndex==21)
+ &&(spellmgr.IsRankSpellDueToSpell(spellProto, i_spellId))
+ &&(CompareAuraRanks(spellId, effIndex, i_spellId, i_effIndex) < 0))
+ return false;
- if(!is_triggered_by_spell)
+ // Its a parent aura (create this aura in ApplyModifier)
+ if ((*i).second->IsInUse())
{
- bool sameCaster = Aur->GetCasterGUID() == (*i).second->GetCasterGUID();
- if( spellmgr.IsNoStackSpellDueToSpell(spellId, i_spellId, sameCaster) )
- {
- //some spells should be not removed by lower rank of them (totem, paladin aura)
- if (!sameCaster
- &&(spellProto->Effect[effIndex]==SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
- &&(spellProto->DurationIndex==21)
- &&(spellmgr.IsRankSpellDueToSpell(spellProto, i_spellId))
- &&(CompareAuraRanks(spellId, effIndex, i_spellId, i_effIndex) < 0))
- return false;
+ sLog.outError("Aura (Spell %u Effect %u) is in process but attempt removed at aura (Spell %u Effect %u) adding, need add stack rule for Unit::RemoveNoStackAurasDueToAura", i->second->GetId(), i->second->GetEffIndex(),Aur->GetId(), Aur->GetEffIndex());
+ continue;
+ }
- // Its a parent aura (create this aura in ApplyModifier)
- if ((*i).second->IsInUse())
- {
- sLog.outError("Aura (Spell %u Effect %u) is in process but attempt removed at aura (Spell %u Effect %u) adding, need add stack rule for Unit::RemoveNoStackAurasDueToAura", i->second->GetId(), i->second->GetEffIndex(),Aur->GetId(), Aur->GetEffIndex());
- continue;
- }
- RemoveAurasDueToSpell(i_spellId);
+ RemoveAurasDueToSpell(i_spellId);
- if( m_Auras.empty() )
- break;
- else
- next = m_Auras.begin();
- }
- }
+ if( m_Auras.empty() )
+ break;
+ else
+ next = m_Auras.begin();
}
return true;
}
@@ -4444,6 +3928,18 @@ void Unit::RemoveAura(uint32 spellId, uint32 effindex, Aura* except)
}
}
+void Unit::RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID)
+{
+ for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
+ {
+ Aura *aur = iter->second;
+ if (aur->GetId() == spellId && aur->GetCasterGUID() == casterGUID)
+ RemoveAura(iter);
+ else
+ ++iter;
+ }
+}
+
void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler)
{
for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
@@ -4453,20 +3949,21 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit
{
// Custom dispel case
// Unstable Affliction
- if (aur->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (aur->GetSpellProto()->SpellFamilyFlags & 0x010000000000LL))
+ if (aur->GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (aur->GetSpellProto()->SpellFamilyFlags[1] & 0x0100))
{
int32 damage = aur->GetModifier()->m_amount*9;
uint64 caster_guid = aur->GetCasterGUID();
// Remove aura
- RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
+ if (iter->second->modStackAmount(-1))
+ RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
// backfire damage and silence
dispeler->CastCustomSpell(dispeler, 31117, &damage, NULL, NULL, true, NULL, NULL,caster_guid);
iter = m_Auras.begin(); // iterator can be invalidate at cast if self-dispel
}
- else
+ else if (iter->second->modStackAmount(-1))
RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
}
else
@@ -4498,7 +3995,8 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit
stealer->AddAura(new_aur);
// Remove aura as dispel
- RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
+ if (iter->second->modStackAmount(-1))
+ RemoveAura(iter, AURA_REMOVE_BY_DISPEL);
}
else
++iter;
@@ -4536,73 +4034,26 @@ void Unit::RemoveAurasWithDispelType( DispelType type )
}
}
-void Unit::RemoveSingleAuraFromStackByDispel(uint32 spellId)
-{
- for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
- {
- Aura *aur = iter->second;
- if (aur->GetId() == spellId)
- {
- if(iter->second->GetStackAmount() > 1)
- {
- // reapply modifier with reduced stack amount
- iter->second->ApplyModifier(false,true);
- iter->second->SetStackAmount(iter->second->GetStackAmount()-1);
- iter->second->ApplyModifier(true,true);
-
- iter->second->UpdateSlotCounterAndDuration();
- return; // not remove aura if stack amount > 1
- }
- else
- RemoveAura(iter,AURA_REMOVE_BY_DISPEL);
- }
- else
- ++iter;
- }
-}
-
void Unit::RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex)
{
AuraMap::iterator iter = m_Auras.find(spellEffectPair(spellId, effindex));
if(iter != m_Auras.end())
{
- if(iter->second->GetStackAmount() > 1)
- {
- // reapply modifier with reduced stack amount
- iter->second->ApplyModifier(false,true);
- iter->second->SetStackAmount(iter->second->GetStackAmount()-1);
- iter->second->ApplyModifier(true,true);
-
- iter->second->UpdateSlotCounterAndDuration();
- return; // not remove aura if stack amount > 1
- }
- RemoveAura(iter);
+ if (iter->second->modStackAmount(-1))
+ RemoveAura(iter);
}
}
-void Unit::RemoveAurasDueToSpell(uint32 spellId, Aura* except)
+void Unit::RemoveSingleSpellAurasFromStack(uint32 spellId)
{
- for (int i = 0; i < 3; ++i)
- RemoveAura(spellId,i,except);
+ for (int i=0; i<3; ++i)
+ RemoveSingleAuraFromStack(spellId, i);
}
-void Unit::RemoveAurasDueToCasterSpell(uint32 spellId, uint64 guid)
+void Unit::RemoveAurasDueToSpell(uint32 spellId, Aura* except)
{
- for (int k=0; k < 3; ++k)
- {
- spellEffectPair spair = spellEffectPair(spellId, k);
- for (AuraMap::iterator iter = m_Auras.lower_bound(spair); iter != m_Auras.upper_bound(spair);)
- {
- if (iter->second->GetCasterGUID() == guid)
- {
- RemoveAura(iter);
- break;
- //iter = m_Auras.upper_bound(spair); // overwrite by more appropriate
- }
- else
- ++iter;
- }
- }
+ for (int i = 0; i < 3; ++i)
+ RemoveAura(spellId,i,except);
}
void Unit::RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId)
@@ -4750,9 +4201,6 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
sLog.outDebug("Aura %u (%u) now is remove mode %d", Aur->GetId(), Aur->GetModifier()->m_auraname, mode);
assert(!Aur->IsInUse());
Aur->ApplyModifier(false,true);
-
- Aur->SetStackAmount(0);
-
Aur->_RemoveAura();
if(mode != AURA_REMOVE_BY_STACK)
@@ -4837,7 +4285,8 @@ void Unit::DelayAura(uint32 spellId, uint32 effindex, int32 delaytime)
iter->second->SetAuraDuration(0);
else
iter->second->SetAuraDuration(iter->second->GetAuraDuration() - delaytime);
- iter->second->UpdateAuraDuration();
+ // update for out of range group members (on 1 slot use)
+ UpdateAuraForGroup(iter->second->GetAuraSlot());
sLog.outDebug("Aura %u partially interrupted on unit %u, new duration: %u ms",iter->second->GetModifier()->m_auraname, GetGUIDLow(), iter->second->GetAuraDuration());
}
}
@@ -4866,6 +4315,36 @@ Aura* Unit::GetAura(uint32 spellId, uint32 effindex)
return NULL;
}
+Aura* Unit::GetAura(AuraType type, uint32 family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, uint64 casterGUID)
+{
+ AuraList const& auras = GetAurasByType(type);
+ for(AuraList::const_iterator i = auras.begin();i != auras.end(); ++i)
+ {
+ SpellEntry const *spell = (*i)->GetSpellProto();
+ if (spell->SpellFamilyName == family && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
+ {
+ if (casterGUID && (*i)->GetCasterGUID()!=casterGUID)
+ continue;
+ return (*i);
+ }
+ }
+ return NULL;
+}
+
+bool Unit::HasAura(uint32 spellId) const
+{
+ //Special case for non existing spell
+ if (spellId==61988)
+ return HasAura(61987) || HasAura(25771);
+ for (int i = 0; i < 3 ; ++i)
+ {
+ AuraMap::const_iterator iter = m_Auras.find(spellEffectPair(spellId, i));
+ if (iter != m_Auras.end())
+ return true;
+ }
+ return false;
+}
+
void Unit::AddDynObject(DynamicObject* dynObj)
{
m_dynObjGUIDs.push_back(dynObj->GetGUID());
@@ -5010,6 +4489,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
data.append(log->attacker->GetPackGUID());
data << uint32(log->SpellID);
data << uint32(log->damage); //damage amount
+ data << uint32(0);
data << uint8 (log->schoolMask); //damage school
data << uint32(log->absorb); //AbsorbedDamage
data << uint32(log->resist); //resist
@@ -5029,6 +4509,7 @@ void Unit::SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage,
data.append(GetPackGUID());
data << uint32(SpellID);
data << uint32(Damage-AbsorbedDamage-Resist-Blocked);
+ data << uint32(0); // wotlk
data << uint8(damageSchoolMask); // spell school
data << uint32(AbsorbedDamage); // AbsorbedDamage
data << uint32(Resist); // resist
@@ -5067,25 +4548,65 @@ void Unit::SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
void Unit::SendAttackStateUpdate(CalcDamageInfo *damageInfo)
{
- WorldPacket data(SMSG_ATTACKERSTATEUPDATE, (16+84)); // we guess size
+ uint32 count = 1;
+ WorldPacket data(SMSG_ATTACKERSTATEUPDATE, (16+45)); // we guess size
data << (uint32)damageInfo->HitInfo;
data.append(GetPackGUID());
data.append(damageInfo->target->GetPackGUID());
data << (uint32)(damageInfo->damage); // Full damage
+ data << uint32(0); // overkill value
+
+ data << (uint8)count; // Sub damage count
+
+ for(int 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
+ }
+
+ if(damageInfo->HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2))
+ {
+ for(int i = 0; i < count; ++i)
+ data << (uint32)damageInfo->absorb; // Absorb
+ }
- data << (uint8)1; // Sub damage count
- //=== Sub damage description
- data << (uint32)(damageInfo->damageSchoolMask); // School of sub damage
- data << (float)damageInfo->damage; // sub damage
- data << (uint32)damageInfo->damage; // Sub Damage
- data << (uint32)damageInfo->absorb; // Absorb
- data << (uint32)damageInfo->resist; // Resist
- //=================================================
- data << (uint32)damageInfo->TargetState;
+ if(damageInfo->HitInfo & (HITINFO_RESIST | HITINFO_RESIST2))
+ {
+ for(int i = 0; i < count; ++i)
+ data << (uint32)damageInfo->resist; // Resist
+ }
+
+ data << (uint8)damageInfo->TargetState;
data << (uint32)0;
data << (uint32)0;
- data << (uint32)damageInfo->blocked_amount;
- SendMessageToSet( &data, true );/**/
+
+ if(damageInfo->HitInfo & HITINFO_BLOCK)
+ data << (uint32)damageInfo->blocked_amount;
+
+ if(damageInfo->HitInfo & HITINFO_UNK3)
+ data << uint32(0);
+
+ 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 < 5; ++i)
+ {
+ data << float(0);
+ data << float(0);
+ }
+ data << uint32(0);
+ }
+
+ SendMessageToSet( &data, true );
}
void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
@@ -5093,169 +4614,69 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType,
sLog.outDebug("WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
WorldPacket data(SMSG_ATTACKERSTATEUPDATE, (16+45)); // we guess size
- data << (uint32)HitInfo;
+ data << uint32(HitInfo); // flags
data.append(GetPackGUID());
data.append(target->GetPackGUID());
- data << (uint32)(Damage-AbsorbDamage-Resist-BlockedAmount);
+ data << uint32(Damage-AbsorbDamage-Resist-BlockedAmount);// damage
+ data << uint32(0); // overkill value
data << (uint8)SwingType; // count?
// for(i = 0; i < SwingType; ++i)
data << (uint32)damageSchoolMask;
data << (float)(Damage-AbsorbDamage-Resist-BlockedAmount);
- // still need to double check damage
data << (uint32)(Damage-AbsorbDamage-Resist-BlockedAmount);
- data << (uint32)AbsorbDamage;
- data << (uint32)Resist;
// end loop
- data << (uint32)TargetState;
-
- if( AbsorbDamage == 0 ) //also 0x3E8 = 0x3E8, check when that happens
- data << (uint32)0;
- else
- data << (uint32)-1;
-
- data << (uint32)0;
- data << (uint32)BlockedAmount;
-
- SendMessageToSet( &data, true );
-}
-/*
-void Unit::ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 damage, SpellSchoolMask damageSchoolMask, SpellEntry const *procSpell, bool isTriggeredSpell, WeaponAttackType attType)
-{
- sLog.outDebug("ProcDamageAndSpell: attacker flags are 0x%x, victim flags 0x%x", procAttacker, procVictim);
- if(procSpell)
- sLog.outDebug("ProcDamageAndSpell: invoked due to spell id %u %s", procSpell->Id, (isTriggeredSpell?"(triggered)":""));
-
- // Assign melee/ranged proc flags for magic attacks, that are actually melee/ranged abilities
- // not assign for spell proc triggered spell to prevent infinity (or unexpected 2-3 times) melee damage spell proc call with melee damage effect
- // That is the question though if it's fully correct
- if(procSpell && !isTriggeredSpell)
+ if(HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2))
{
- if(procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE)
- {
- if(procAttacker & PROC_FLAG_HIT_SPELL) procAttacker |= PROC_FLAG_HIT_MELEE;
- if(procAttacker & PROC_FLAG_CRIT_SPELL) procAttacker |= PROC_FLAG_CRIT_MELEE;
- if(procVictim & PROC_FLAG_STRUCK_SPELL) procVictim |= PROC_FLAG_STRUCK_MELEE;
- if(procVictim & PROC_FLAG_STRUCK_CRIT_SPELL) procVictim |= PROC_FLAG_STRUCK_CRIT_MELEE;
- attType = BASE_ATTACK; // Melee abilities are assumed to be dealt with mainhand weapon
- }
- else if (procSpell->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
- {
- if(procAttacker & PROC_FLAG_HIT_SPELL) procAttacker |= PROC_FLAG_HIT_RANGED;
- if(procAttacker & PROC_FLAG_CRIT_SPELL) procAttacker |= PROC_FLAG_CRIT_RANGED;
- if(procVictim & PROC_FLAG_STRUCK_SPELL) procVictim |= PROC_FLAG_STRUCK_RANGED;
- if(procVictim & PROC_FLAG_STRUCK_CRIT_SPELL) procVictim |= PROC_FLAG_STRUCK_CRIT_RANGED;
- attType = RANGED_ATTACK;
- }
+ // for(i = 0; i < SwingType; ++i)
+ data << uint32(AbsorbDamage);
+ // end loop
}
- if(damage && (procVictim & (PROC_FLAG_STRUCK_MELEE|PROC_FLAG_STRUCK_RANGED|PROC_FLAG_STRUCK_SPELL)))
- procVictim |= (PROC_FLAG_TAKE_DAMAGE|PROC_FLAG_TOUCH);
- // Not much to do if no flags are set.
- if (procAttacker)
+ if(HitInfo & (HITINFO_RESIST | HITINFO_RESIST2))
{
- // processing auras that not generate casts at proc event before auras that generate casts to prevent proc aura added at prev. proc aura execute in set
- ProcDamageAndSpellFor(false,pVictim,procAttacker,attackerProcEffectAuraTypes,attType, procSpell, damage, damageSchoolMask);
- ProcDamageAndSpellFor(false,pVictim,procAttacker,attackerProcCastAuraTypes,attType, procSpell, damage, damageSchoolMask);
+ // for(i = 0; i < SwingType; ++i)
+ data << uint32(Resist);
+ // end loop
}
- // Now go on with a victim's events'n'auras
- // Not much to do if no flags are set or there is no victim
- if(pVictim && pVictim->isAlive() && procVictim)
+ data << (uint8)TargetState;
+ data << (uint32)0;
+ data << (uint32)0;
+
+ if(HitInfo & HITINFO_BLOCK)
{
- // processing auras that not generate casts at proc event before auras that generate casts to prevent proc aura added at prev. proc aura execute in set
- pVictim->ProcDamageAndSpellFor(true,this,procVictim,victimProcEffectAuraTypes,attType,procSpell, damage, damageSchoolMask);
- pVictim->ProcDamageAndSpellFor(true,this,procVictim,victimProcCastAuraTypes,attType,procSpell, damage, damageSchoolMask);
+ data << uint32(BlockedAmount);
}
-}
-void Unit::CastMeleeProcDamageAndSpell(Unit* pVictim, uint32 damage, SpellSchoolMask damageSchoolMask, WeaponAttackType attType, MeleeHitOutcome outcome, SpellEntry const *spellCasted, bool isTriggeredSpell)
-{
- if(!pVictim)
- return;
-
- uint32 procAttacker = PROC_FLAG_NONE;
- uint32 procVictim = PROC_FLAG_NONE;
-
- switch(outcome)
+ if(HitInfo & HITINFO_UNK3)
{
- case MELEE_HIT_EVADE:
- return;
- case MELEE_HIT_MISS:
- if(attType == BASE_ATTACK || attType == OFF_ATTACK)
- {
- procAttacker = PROC_FLAG_MISS;
- }
- break;
- case MELEE_HIT_BLOCK_CRIT:
- case MELEE_HIT_CRIT:
- if(spellCasted && attType == BASE_ATTACK)
- {
- procAttacker |= PROC_FLAG_CRIT_SPELL;
- procVictim |= PROC_FLAG_STRUCK_CRIT_SPELL;
- if ( outcome == MELEE_HIT_BLOCK_CRIT )
- {
- procVictim |= PROC_FLAG_BLOCK;
- procAttacker |= PROC_FLAG_TARGET_BLOCK;
- }
- }
- else if(attType == BASE_ATTACK || attType == OFF_ATTACK)
- {
- procAttacker = PROC_FLAG_HIT_MELEE | PROC_FLAG_CRIT_MELEE;
- procVictim = PROC_FLAG_STRUCK_MELEE | PROC_FLAG_STRUCK_CRIT_MELEE;
- }
- else
- {
- procAttacker = PROC_FLAG_HIT_RANGED | PROC_FLAG_CRIT_RANGED;
- procVictim = PROC_FLAG_STRUCK_RANGED | PROC_FLAG_STRUCK_CRIT_RANGED;
- }
- break;
- case MELEE_HIT_PARRY:
- procAttacker = PROC_FLAG_TARGET_DODGE_OR_PARRY;
- procVictim = PROC_FLAG_PARRY;
- break;
- case MELEE_HIT_BLOCK:
- procAttacker = PROC_FLAG_TARGET_BLOCK;
- procVictim = PROC_FLAG_BLOCK;
- break;
- case MELEE_HIT_DODGE:
- procAttacker = PROC_FLAG_TARGET_DODGE_OR_PARRY;
- procVictim = PROC_FLAG_DODGE;
- break;
- case MELEE_HIT_CRUSHING:
- if(attType == BASE_ATTACK || attType == OFF_ATTACK)
- {
- procAttacker = PROC_FLAG_HIT_MELEE | PROC_FLAG_CRIT_MELEE;
- procVictim = PROC_FLAG_STRUCK_MELEE | PROC_FLAG_STRUCK_CRIT_MELEE;
- }
- else
- {
- procAttacker = PROC_FLAG_HIT_RANGED | PROC_FLAG_CRIT_RANGED;
- procVictim = PROC_FLAG_STRUCK_RANGED | PROC_FLAG_STRUCK_CRIT_RANGED;
- }
- break;
- default:
- if(attType == BASE_ATTACK || attType == OFF_ATTACK)
- {
- procAttacker = PROC_FLAG_HIT_MELEE;
- procVictim = PROC_FLAG_STRUCK_MELEE;
- }
- else
- {
- procAttacker = PROC_FLAG_HIT_RANGED;
- procVictim = PROC_FLAG_STRUCK_RANGED;
- }
- break;
+ data << uint32(0);
}
- if(damage > 0)
- procVictim |= PROC_FLAG_TAKE_DAMAGE;
+ if(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 < 5; ++i)
+ {
+ data << float(0);
+ data << float(0);
+ }
+ data << uint32(0);
+ }
- if(procAttacker != PROC_FLAG_NONE || procVictim != PROC_FLAG_NONE)
- ProcDamageAndSpell(pVictim, procAttacker, procVictim, damage, damageSchoolMask, spellCasted, isTriggeredSpell, attType);
-}*/
+ SendMessageToSet( &data, true );
+}
bool Unit::HandleHasteAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const * procSpell, uint32 /*procFlag*/, uint32 /*procEx*/, uint32 cooldown)
{
@@ -5323,7 +4744,8 @@ bool Unit::HandleHasteAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const * procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown)
{
SpellEntry const *dummySpell = triggeredByAura->GetSpellProto ();
- uint32 effIndex = triggeredByAura->GetEffIndex ();
+ uint32 effIndex = triggeredByAura->GetEffIndex();
+ int32 triggerAmount = triggeredByAura->GetModifier()->m_amount;
Item* castItem = triggeredByAura->GetCastItemGUID() && GetTypeId()==TYPEID_PLAYER
? ((Player*)this)->GetItemByGuid(triggeredByAura->GetCastItemGUID()) : NULL;
@@ -5338,7 +4760,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
{
switch (dummySpell->Id)
{
- // Eye of Eye
+ // Eye for an Eye
case 9799:
case 25988:
{
@@ -5347,7 +4769,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// return damage % to attacker but < 50% own total health
- basepoints0 = triggeredByAura->GetModifier()->m_amount*int32(damage)/100;
+ basepoints0 = triggerAmount*int32(damage)/100;
if(basepoints0 > GetMaxHealth()/2)
basepoints0 = GetMaxHealth()/2;
@@ -5376,15 +4798,14 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
if (!procSpell || procSpell->Id == 24659)
return false;
// Need remove one 24659 aura
- RemoveSingleAuraFromStack(24659, 0);
- RemoveSingleAuraFromStack(24659, 1);
+ RemoveSingleSpellAurasFromStack(24659);
return true;
}
// Restless Strength
case 24661:
{
// Need remove one 24662 aura
- RemoveSingleAuraFromStack(24662, 0);
+ RemoveSingleSpellAurasFromStack(24662);
return true;
}
// Adaptive Warding (Frostfire Regalia set)
@@ -5400,7 +4821,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
{
if(SpellEntry const* iterSpellProto = (*iter)->GetSpellProto())
{
- if(iterSpellProto->SpellFamilyName==SPELLFAMILY_MAGE && (iterSpellProto->SpellFamilyFlags & 0x10000000))
+ if(iterSpellProto->SpellFamilyName==SPELLFAMILY_MAGE && (iterSpellProto->SpellFamilyFlags[0] & 0x10000000))
{
found=true;
break;
@@ -5458,7 +4879,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
if(!target)
return false;
- basepoints0 = int32(damage * 2.5f); // manaregen
triggered_spell_id = 34650;
break;
}
@@ -5466,7 +4886,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 33493:
{
// Cast finish spell at last charge
- if (triggeredByAura->m_procCharges > 1)
+ if (triggeredByAura->GetAuraCharges() > 1)
return false;
target = this;
@@ -5669,6 +5089,47 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
return false;
}
+ // Living Seed
+ case 48504:
+ {
+ triggered_spell_id = 48503;
+ basepoints0 = triggerAmount;
+ target = this;
+ break;
+ }
+ // Vampiric Touch (generic, used by some boss)
+ case 52723:
+ case 60501:
+ {
+ triggered_spell_id = 52724;
+ basepoints0 = damage / 2;
+ target = this;
+ break;
+ }
+ // Divine purpose
+ case 31871:
+ case 31872:
+ {
+ // Roll chane
+ if (!roll_chance_i(triggerAmount))
+ return false;
+
+ // Remove any stun effect on target
+ AuraMap& Auras = pVictim->GetAuras();
+ for(AuraMap::iterator iter = Auras.begin(); iter != Auras.end();)
+ {
+ SpellEntry const *spell = iter->second->GetSpellProto();
+ if( spell->Mechanic == MECHANIC_STUN ||
+ spell->EffectMechanic[iter->second->GetEffIndex()] == MECHANIC_STUN)
+ {
+ pVictim->RemoveAurasDueToSpell(spell->Id);
+ iter = Auras.begin();
+ }
+ else
+ ++iter;
+ }
+ return true;
+ }
}
break;
}
@@ -5681,7 +5142,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// mana reward
- basepoints0 = (triggeredByAura->GetModifier()->m_amount * GetMaxPower(POWER_MANA) / 100);
+ basepoints0 = (triggerAmount * GetMaxPower(POWER_MANA) / 100);
target = this;
triggered_spell_id = 29442;
break;
@@ -5693,7 +5154,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// mana cost save
- basepoints0 = procSpell->manaCost * triggeredByAura->GetModifier()->m_amount/100;
+ int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100;
+ basepoints0 = cost * triggerAmount/100;
if( basepoints0 <=0 )
return false;
@@ -5701,8 +5163,45 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 29077;
break;
}
+ // Hot Streak
+ if (dummySpell->SpellIconID == 2999)
+ {
+ if (effIndex!=0)
+ return true;
+ Aura *counter = GetAura(triggeredByAura->GetId(), 1);
+ if (!counter)
+ return true;
+
+ // Count spell criticals in a row in second aura
+ Modifier *mod = counter->GetModifier();
+ if (procEx & PROC_EX_CRITICAL_HIT)
+ {
+ mod->m_amount *=2;
+ if (mod->m_amount < 100) // not enough
+ return true;
+ // Crititcal counted -> roll chance
+ if (roll_chance_i(triggerAmount))
+ CastSpell(this, 48108, true, castItem, triggeredByAura);
+ }
+ mod->m_amount = 25;
+ return true;
+ }
+ // Burnout
+ if (dummySpell->SpellIconID == 2998)
+ {
+ if(!procSpell)
+ return false;
+
+ int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100;
+ basepoints0 = cost * triggerAmount/100;
+ if( basepoints0 <=0 )
+ return false;
+ triggered_spell_id = 44450;
+ target = this;
+ break;
+ }
// Incanter's Regalia set (add trigger chance to Mana Shield)
- if (dummySpell->SpellFamilyFlags & 0x0000000000008000LL)
+ if (dummySpell->SpellFamilyFlags[0] & 0x8000)
{
if(GetTypeId() != TYPEID_PLAYER)
return false;
@@ -5739,7 +5238,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 11129:
{
//last charge and crit
- if (triggeredByAura->m_procCharges <= 1 && (procEx & PROC_EX_CRITICAL_HIT) )
+ if (triggeredByAura->GetAuraCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT) )
{
RemoveAurasDueToSpell(28682); //-> remove Combustion auras
return true; // charge counting (will removed)
@@ -5754,7 +5253,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case SPELLFAMILY_WARRIOR:
{
// Retaliation
- if(dummySpell->SpellFamilyFlags==0x0000000800000000LL)
+ if(dummySpell->SpellFamilyFlags.IsEqual(0, 0x8, 0))
{
// check attack comes not from behind
if (!HasInArc(M_PI, pVictim))
@@ -5763,26 +5262,21 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 22858;
break;
}
- else if (dummySpell->SpellIconID == 1697) // Second Wind
+ // Second Wind
+ if (dummySpell->SpellIconID == 1697)
{
// only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
return false;
// Need stun or root mechanic
- if (procSpell->Mechanic != MECHANIC_ROOT && procSpell->Mechanic != MECHANIC_STUN)
- {
- int32 i;
- for (i=0; i<3; i++)
- if (procSpell->EffectMechanic[i] == MECHANIC_ROOT || procSpell->EffectMechanic[i] == MECHANIC_STUN)
- break;
- if (i == 3)
- return false;
- }
+ if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_ROOT)|(1<<MECHANIC_STUN))))
+ return false;
switch (dummySpell->Id)
{
case 29838: triggered_spell_id=29842; break;
case 29834: triggered_spell_id=29841; break;
+ case 42770: triggered_spell_id=42771; break;
default:
sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (SW)",dummySpell->Id);
return false;
@@ -5791,12 +5285,19 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
target = this;
break;
}
+ // Damage Shield
+ if (dummySpell->SpellIconID == 3214)
+ {
+ triggered_spell_id = 59653;
+ basepoints0 = GetShieldBlockValue() * triggerAmount / 100;
+ break;
+ }
break;
}
case SPELLFAMILY_WARLOCK:
{
// Seed of Corruption
- if (dummySpell->SpellFamilyFlags & 0x0000001000000000LL)
+ if (dummySpell->SpellFamilyFlags[1] & 0x00000010)
{
Modifier* mod = triggeredByAura->GetModifier();
// if damage is more than need or target die from damage deal finish spell
@@ -5840,6 +5341,16 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
mod->m_amount-=damage;
return true;
}
+ // Fel Synergy
+ if (dummySpell->SpellIconID == 3222)
+ {
+ target = GetPet();
+ if (!target)
+ return false;
+ triggered_spell_id = 54181;
+ basepoints0 = damage * triggerAmount / 100;
+ break;
+ }
switch(dummySpell->Id)
{
// Nightfall
@@ -5856,7 +5367,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 30296:
{
// health
- basepoints0 = int32(damage*triggeredByAura->GetModifier()->m_amount/100);
+ basepoints0 = int32(damage*triggerAmount/100);
target = this;
triggered_spell_id = 30294;
break;
@@ -5875,7 +5386,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// heal amount
- basepoints0 = damage * triggeredByAura->GetModifier()->m_amount/100;
+ basepoints0 = damage * triggerAmount/100;
triggered_spell_id = 37382;
break;
}
@@ -5891,7 +5402,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case SPELLFAMILY_PRIEST:
{
// Vampiric Touch
- if( dummySpell->SpellFamilyFlags & 0x0000040000000000LL )
+ if( dummySpell->SpellFamilyFlags[1] & 0x00000400 )
{
if(!pVictim || !pVictim->isAlive())
return false;
@@ -5901,10 +5412,17 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// energize amount
- basepoints0 = triggeredByAura->GetModifier()->m_amount*damage/100;
+ basepoints0 = triggerAmount*damage/100;
pVictim->CastCustomSpell(pVictim,34919,&basepoints0,NULL,NULL,true,castItem,triggeredByAura);
return true; // no hidden cooldown
}
+ // Divine Aegis
+ if (dummySpell->SpellIconID == 2820)
+ {
+ basepoints0 = damage * triggerAmount/100;
+ triggered_spell_id = 47753;
+ break;
+ }
switch(dummySpell->Id)
{
// Vampiric Embrace
@@ -5918,18 +5436,19 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// heal amount
- basepoints0 = triggeredByAura->GetModifier()->m_amount*damage/100;
- pVictim->CastCustomSpell(pVictim,15290,&basepoints0,NULL,NULL,true,castItem,triggeredByAura);
+ int32 team = triggerAmount*damage/500;
+ int32 self = triggerAmount*damage/100 - team;
+ pVictim->CastCustomSpell(pVictim,15290,&team,&self,NULL,true,castItem,triggeredByAura);
return true; // no hidden cooldown
}
// Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
case 40438:
{
// Shadow Word: Pain
- if( procSpell->SpellFamilyFlags & 0x0000000000008000LL )
+ if( procSpell->SpellFamilyFlags[0] & 0x8000 )
triggered_spell_id = 40441;
// Renew
- else if( procSpell->SpellFamilyFlags & 0x0000000000000010LL )
+ else if( procSpell->SpellFamilyFlags[0] & 0x10 )
triggered_spell_id = 40440;
else
return false;
@@ -5953,12 +5472,12 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// heal amount
- basepoints0 = int32(damage * 2 / 100);
+ basepoints0 = damage * triggerAmount/100;
target = this;
triggered_spell_id = 39373;
break;
}
- // Vestments of Faith (Priest Tier 3) - 4 pieces bonus
+ // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
case 28809:
{
triggered_spell_id = 28810;
@@ -6001,19 +5520,19 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
float chance;
// Starfire
- if( procSpell->SpellFamilyFlags & 0x0000000000000004LL )
+ if( procSpell->SpellFamilyFlags[0] & 0x4 )
{
triggered_spell_id = 40445;
chance = 25.f;
}
// Rejuvenation
- else if( procSpell->SpellFamilyFlags & 0x0000000000000010LL )
+ else if( procSpell->SpellFamilyFlags[0] & 0x10 )
{
triggered_spell_id = 40446;
chance = 25.f;
}
// Mangle (cat/bear)
- else if( procSpell->SpellFamilyFlags & 0x0000044000000000LL )
+ else if( procSpell->SpellFamilyFlags[1] & 0x00000440)
{
triggered_spell_id = 40452;
chance = 40.f;
@@ -6035,6 +5554,39 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
break;
}
}
+ // Eclipse
+ if (dummySpell->SpellIconID == 2856)
+ {
+ if (!procSpell)
+ return false;
+ // Only 0 aura can proc
+ if (effIndex!=0)
+ return true;
+ // Wrath crit
+ if (procSpell->SpellFamilyFlags[0] & 0x1)
+ {
+ if (!roll_chance_i(60))
+ return false;
+ triggered_spell_id = 48518;
+ target = this;
+ break;
+ }
+ // Starfire crit
+ if (procSpell->SpellFamilyFlags[0] & 0x4)
+ {
+ triggered_spell_id = 48517;
+ target = this;
+ break;
+ }
+ return false;
+ }
+ // Living Seed
+ else if (dummySpell->SpellIconID == 2860)
+ {
+ triggered_spell_id = 48504;
+ basepoints0 = triggerAmount * damage / 100;
+ break;
+ }
break;
}
case SPELLFAMILY_ROGUE:
@@ -6052,19 +5604,39 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
break;
}
}
+ // Cut to the Chase
+ if( dummySpell->SpellIconID == 2909 )
+ {
+ // "refresh your Slice and Dice duration to its 5 combo point maximum"
+ // lookup Slice and Dice
+ AuraList const& sd = GetAurasByType(SPELL_AURA_MOD_HASTE);
+ for(AuraList::const_iterator itr = sd.begin(); itr != sd.end(); ++itr)
+ {
+ SpellEntry const *spellProto = (*itr)->GetSpellProto();
+ if( spellProto->SpellFamilyName == SPELLFAMILY_ROGUE &&
+ spellProto->SpellFamilyFlags[0] & 0x40000)
+ {
+ (*itr)->SetAuraMaxDuration(GetSpellMaxDuration(spellProto));
+ (*itr)->RefreshAura();
+ return true;
+ }
+ }
+ return false;
+ }
+ // Deadly Brew
+ if( dummySpell->SpellIconID == 2963 )
+ {
+ triggered_spell_id = 25809;
+ break;
+ }
// Quick Recovery
if( dummySpell->SpellIconID == 2116 )
{
if(!procSpell)
return false;
- // only rogue's finishing moves (maybe need additional checks)
- if( procSpell->SpellFamilyName!=SPELLFAMILY_ROGUE ||
- (procSpell->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE) == 0)
- return false;
-
// energy cost save
- basepoints0 = procSpell->manaCost * triggeredByAura->GetModifier()->m_amount/100;
+ basepoints0 = procSpell->manaCost * triggerAmount/100;
if(basepoints0 <= 0)
return false;
@@ -6083,7 +5655,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// mana cost save
- basepoints0 = procSpell->manaCost * 40/100;
+ int32 mana = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100;
+ basepoints0 = mana * 40/100;
if(basepoints0 <= 0)
return false;
@@ -6091,75 +5664,93 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 34720;
break;
}
+ // Hunting Party
+ if ( dummySpell->SpellIconID == 3406 )
+ {
+ triggered_spell_id = 57669;
+ target = this;
+ break;
+ }
+ // Lock and Load
+ if ( dummySpell->SpellIconID == 3579 )
+ {
+ // Proc only from periodic (from trap activation proc another aura of this spell)
+ if (!(procFlag & PROC_FLAG_ON_DO_PERIODIC) || !roll_chance_i(triggerAmount))
+ return false;
+ triggered_spell_id = 56453;
+ target = this;
+ break;
+ }
+ // Rapid Recuperation
+ if ( dummySpell->SpellIconID == 3560 )
+ {
+ // This effect only from Rapid Killing (mana regen)
+ if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
+ return false;
+ triggered_spell_id = 56654;
+ target = this;
+ break;
+ }
break;
}
case SPELLFAMILY_PALADIN:
{
- // Seal of Righteousness - melee proc dummy
- if (dummySpell->SpellFamilyFlags&0x000000008000000LL && triggeredByAura->GetEffIndex()==0)
+ // Seal of Righteousness - melee proc dummy (addition ${$MWS*(0.022*$AP+0.044*$SPH)} damage)
+ if (dummySpell->SpellFamilyFlags[0]&0x8000000 && effIndex==0)
{
- if(GetTypeId() != TYPEID_PLAYER)
- return false;
-
- uint32 spellId;
- switch (triggeredByAura->GetId())
- {
- case 21084: spellId = 25742; break; // Rank 1
- case 20287: spellId = 25740; break; // Rank 2
- case 20288: spellId = 25739; break; // Rank 3
- case 20289: spellId = 25738; break; // Rank 4
- case 20290: spellId = 25737; break; // Rank 5
- case 20291: spellId = 25736; break; // Rank 6
- case 20292: spellId = 25735; break; // Rank 7
- case 20293: spellId = 25713; break; // Rank 8
- case 27155: spellId = 27156; break; // Rank 9
- default:
- sLog.outError("Unit::HandleDummyAuraProc: non handled possibly SoR (Id = %u)", triggeredByAura->GetId());
- return false;
- }
- Item *item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
- float speed = (item ? item->GetProto()->Delay : BASE_ATTACK_TIME)/1000.0f;
-
- float damageBasePoints;
- if(item && item->GetProto()->InventoryType == INVTYPE_2HWEAPON)
- // two hand weapon
- damageBasePoints=1.20f*triggeredByAura->GetModifier()->m_amount * 1.2f * 1.03f * speed/100.0f + 1;
- else
- // one hand weapon/no weapon
- damageBasePoints=0.85f*ceil(triggeredByAura->GetModifier()->m_amount * 1.2f * 1.03f * speed/100.0f) - 1;
-
- int32 damagePoint = int32(damageBasePoints + 0.03f * (GetWeaponDamageRange(BASE_ATTACK,MINDAMAGE)+GetWeaponDamageRange(BASE_ATTACK,MAXDAMAGE))/2.0f) + 1;
-
- // apply damage bonuses manually
- if(damagePoint >= 0)
- damagePoint = SpellDamageBonus(pVictim, dummySpell, damagePoint, SPELL_DIRECT_DAMAGE);
-
- CastCustomSpell(pVictim,spellId,&damagePoint,NULL,NULL,true,NULL, triggeredByAura);
- return true; // no hidden cooldown
+ triggered_spell_id = 25742;
+ float ap = GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = SpellBaseDamageBonus(SPELL_SCHOOL_MASK_HOLY) +
+ SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_HOLY, pVictim);
+ basepoints0 = GetAttackTime(BASE_ATTACK) * int32(ap*0.022f + 0.044f * holy) / 1000;
+ break;
}
- // Seal of Blood do damage trigger
- if(dummySpell->SpellFamilyFlags & 0x0000040000000000LL)
+ // Sacred Shield
+ if (dummySpell->SpellFamilyFlags[1]&0x00080000)
{
- switch(triggeredByAura->GetEffIndex())
- {
- case 0:
- triggered_spell_id = 31893;
- break;
- case 1:
- {
- // damage
- damage += CalculateDamage(BASE_ATTACK, false) * 35 / 100; // add spell damage from prev effect (35%)
- basepoints0 = triggeredByAura->GetModifier()->m_amount * damage / 100;
-
- target = this;
- triggered_spell_id = 32221;
- break;
- }
- }
+ triggered_spell_id = 58597;
+ target = this;
+ break;
+ }
+ // Righteous Vengeance
+ if (dummySpell->SpellIconID == 3025)
+ {
+ // 4 damage tick
+ basepoints0 = triggerAmount*damage/400;
+ triggered_spell_id = 61840;
+ break;
+ }
+ // Sheath of Light
+ if (dummySpell->SpellIconID == 3030)
+ {
+ // 4 healing tick
+ basepoints0 = triggerAmount*damage/400;
+ triggered_spell_id = 54203;
+ break;
}
-
switch(dummySpell->Id)
{
+ // Judgement of Light
+ case 20185:
+ {
+ // Get judgement caster
+ Unit *caster = triggeredByAura->GetCaster();
+ if (!caster)
+ return false;
+ float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = caster->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_HOLY) +
+ caster->SpellBaseDamageBonusForVictim(SPELL_SCHOOL_MASK_HOLY, this);
+ basepoints0 = int32(ap*0.10f + 0.10f*holy);
+ pVictim->CastCustomSpell(pVictim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
+ return true;
+ }
+ // Judgement of Wisdom
+ case 20186:
+ {
+ if (pVictim->getPowerType() == POWER_MANA)
+ pVictim->CastSpell(pVictim, 20268, true, 0, triggeredByAura);
+ return true;
+ }
// Holy Power (Redemption Armor set)
case 28789:
{
@@ -6191,7 +5782,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
break;
}
- //Seal of Vengeance
+ // Seal of Vengeance (damage calc on apply aura)
case 31801:
{
if(effIndex != 0) // effect 1,2 used by seal unleashing code
@@ -6200,7 +5791,16 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 31803;
break;
}
- // Spiritual Att.
+ // Seal of Corruption
+ case 53736:
+ {
+ if(effIndex != 0) // effect 1,2 used by seal unleashing code
+ return false;
+
+ triggered_spell_id = 53742;
+ break;
+ }
+ // Spiritual Attunement
case 31785:
case 33776:
{
@@ -6209,11 +5809,45 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
// heal amount
- basepoints0 = triggeredByAura->GetModifier()->m_amount*damage/100;
+ basepoints0 = triggerAmount*damage/100;
target = this;
triggered_spell_id = 31786;
break;
}
+ // Seal of Blood do damage trigger
+ case 31892:
+ {
+ if (effIndex == 0) // 0 effect - is proc on enemy
+ triggered_spell_id = 31893;
+ else if (effIndex == 1) // 1 effect - is proc on self
+ {
+ // add spell damage from prev effect (27%)
+ damage += CalculateDamage(BASE_ATTACK, false) * 27 / 100;
+ basepoints0 = triggerAmount * damage / 100;
+ target = this;
+ triggered_spell_id = 32221;
+ }
+ else
+ return true;
+ break;
+ }
+ // Seal of the Martyr do damage trigger
+ case 53720:
+ {
+ if (effIndex == 0) // 0 effect - is proc on enemy
+ triggered_spell_id = 53719;
+ else if (effIndex == 1) // 1 effect - is proc on self
+ {
+ // add spell damage from prev effect (27%)
+ damage += CalculateDamage(BASE_ATTACK, false) * 27 / 100;
+ basepoints0 = triggerAmount * damage / 100;
+ target = this;
+ triggered_spell_id = 53718;
+ }
+ else
+ return true;
+ break;
+ }
// Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
case 40470:
{
@@ -6223,13 +5857,13 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
float chance;
// Flash of light/Holy light
- if( procSpell->SpellFamilyFlags & 0x00000000C0000000LL)
+ if( procSpell->SpellFamilyFlags[0] & 0xC0000000)
{
triggered_spell_id = 40471;
chance = 15.f;
}
// Judgement
- else if( procSpell->SpellFamilyFlags & 0x0000000000800000LL )
+ else if( procSpell->SpellFamilyFlags[0] & 0x800000 )
{
triggered_spell_id = 40472;
chance = 50.f;
@@ -6242,6 +5876,33 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
break;
}
+ // Glyph of Divinity
+ case 54939:
+ {
+ // Lookup base amount mana restore
+ for (int i=0; i<3;i++)
+ if (procSpell->Effect[i] == SPELL_EFFECT_ENERGIZE)
+ {
+ int32 mana = procSpell->EffectBasePoints[i];
+ CastCustomSpell(this, 54986, 0, &mana, 0, true, castItem, triggeredByAura);
+ break;
+ }
+ return true;
+ }
+ // Glyph of Flash of Light
+ case 54936:
+ {
+ triggered_spell_id = 54957;
+ basepoints0 = triggerAmount*damage/100;
+ break;
+ }
+ // Glyph of Holy Light
+ case 54937:
+ {
+ triggered_spell_id = 54968;
+ basepoints0 = triggerAmount*damage/100;
+ break;
+ }
}
break;
}
@@ -6300,14 +5961,19 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
if( cooldown && ((Player*)this)->HasSpellCooldown(dummySpell->Id))
return false;
+ // Now amount of extra power stored in 1 effect of Enchant spell
+ // Get it by item enchant id
uint32 spellId;
switch (castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)))
{
- case 283: spellId = 33757; break; //1 Rank
- case 284: spellId = 33756; break; //2 Rank
- case 525: spellId = 33755; break; //3 Rank
- case 1669:spellId = 33754; break; //4 Rank
- case 2636:spellId = 33727; break; //5 Rank
+ case 283: spellId = 8232; break; // 1 Rank
+ case 284: spellId = 8235; break; // 2 Rank
+ case 525: spellId = 10486; break; // 3 Rank
+ case 1669:spellId = 16362; break; // 4 Rank
+ case 2636:spellId = 25505; break; // 5 Rank
+ case 3785:spellId = 58801; break; // 6 Rank
+ case 3786:spellId = 58803; break; // 7 Rank
+ case 3787:spellId = 58804; break; // 8 Rank
default:
{
sLog.outError("Unit::HandleDummyAuraProc: non handled item enchantment (rank?) %u for spell id: %u (Windfury)",
@@ -6323,7 +5989,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
}
- int32 extra_attack_power = CalculateSpellDamage(windfurySpellEntry,0,windfurySpellEntry->EffectBasePoints[0],pVictim);
+ int32 extra_attack_power = CalculateSpellDamage(windfurySpellEntry, 1, windfurySpellEntry->EffectBasePoints[1], pVictim);
// Off-Hand case
if ( castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND )
@@ -6357,17 +6023,17 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false;
float chance;
- if (procSpell->SpellFamilyFlags & 0x0000000000000001LL)
+ if (procSpell->SpellFamilyFlags[0] & 0x1)
{
triggered_spell_id = 40465; // Lightning Bolt
chance = 15.f;
}
- else if (procSpell->SpellFamilyFlags & 0x0000000000000080LL)
+ else if (procSpell->SpellFamilyFlags[0] & 0x80)
{
triggered_spell_id = 40465; // Lesser Healing Wave
chance = 10.f;
}
- else if (procSpell->SpellFamilyFlags & 0x0000001000000000LL)
+ else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
{
triggered_spell_id = 40466; // Stormstrike
chance = 50.f;
@@ -6381,20 +6047,69 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
target = this;
break;
}
+ // Glyph of Healing Wave
+ case 55440:
+ {
+ // Not proc from self heals
+ if (this==pVictim)
+ return false;
+ basepoints0 = triggerAmount * damage / 100;
+ target = this;
+ triggered_spell_id = 55533;
+ break;
+ }
+ // Spirit Hunt
+ case 58877:
+ {
+ // Cast on owner
+ target = GetOwner();
+ if(!target)
+ return false;
+ basepoints0 = triggerAmount * damage / 100;
+ triggered_spell_id = 58879;
+ break;
+ }
+ }
+ // Ancestral Awakening
+ if (dummySpell->SpellIconID == 3065)
+ {
+ // TODO: frite dummy fot triggered spell
+ triggered_spell_id = 52759;
+ basepoints0 = triggerAmount * damage / 100;
+ target = this;
+ break;
}
-
// Earth Shield
- if(dummySpell->SpellFamilyFlags==0x40000000000LL)
+ if(dummySpell->SpellFamilyFlags[1] & 0x00000400)
{
- if(GetTypeId() != TYPEID_PLAYER)
- return false;
-
- // heal
- basepoints0 = triggeredByAura->GetModifier()->m_amount;
+ basepoints0 = triggerAmount;
target = this;
triggered_spell_id = 379;
break;
}
+ // Improved Water Shield
+ if (dummySpell->SpellIconID == 2287)
+ {
+ // Lesser Healing Wave need aditional 60% roll
+ if (procSpell->SpellFamilyFlags[0] & 0x80 && !roll_chance_i(60))
+ return false;
+ // lookup water shield
+ AuraList const& vs = GetAurasByType(SPELL_AURA_PROC_TRIGGER_SPELL);
+ for(AuraList::const_iterator itr = vs.begin(); itr != vs.end(); ++itr)
+ {
+ if( (*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN &&
+ (*itr)->GetSpellProto()->SpellFamilyFlags[1] & 0x00000020)
+ {
+ uint32 spell = (*itr)->GetSpellProto()->EffectTriggerSpell[(*itr)->GetEffIndex()];
+ CastSpell(this, spell, true, castItem, triggeredByAura);
+ if ((*itr)->DropAuraCharge())
+ RemoveAurasDueToSpell((*itr)->GetId());
+ return true;
+ }
+ }
+ return false;
+ break;
+ }
// Lightning Overload
if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
{
@@ -6422,6 +6137,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 15208: spellId = 45294; break; // Rank 10
case 25448: spellId = 45295; break; // Rank 11
case 25449: spellId = 45296; break; // Rank 12
+ case 49237: spellId = 49239; break; // Rank 13
+ case 49238: spellId = 49240; break; // Rank 14
// Chain Lightning
case 421: spellId = 45297; break; // Rank 1
case 930: spellId = 45298; break; // Rank 2
@@ -6429,31 +6146,26 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 10605: spellId = 45300; break; // Rank 4
case 25439: spellId = 45301; break; // Rank 5
case 25442: spellId = 45302; break; // Rank 6
+ case 49268: spellId = 49270; break; // Rank 7
+ case 49269: spellId = 49271; break; // Rank 8
default:
sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (LO)", procSpell->Id);
return false;
}
// No thread generated mod
+ // TODO: exist special flag in spell attributes for this, need found and use!
SpellModifier *mod = new SpellModifier;
mod->op = SPELLMOD_THREAT;
mod->value = -100;
mod->type = SPELLMOD_PCT;
mod->spellId = dummySpell->Id;
- mod->effectId = 0;
- mod->lastAffected = NULL;
- mod->mask = 0x0000000000000003LL;
- mod->charges = 0;
+ mod->mask[0] = 0x3;
((Player*)this)->AddSpellMod(mod, true);
// Remove cooldown (Chain Lightning - have Category Recovery time)
- if (procSpell->SpellFamilyFlags & 0x0000000000000002LL)
+ if (procSpell->SpellFamilyFlags[0] & 0x2)
((Player*)this)->RemoveSpellCooldown(spellId);
- // Hmmm.. in most case spells already set half basepoints but...
- // Lightning Bolt (2-10 rank) have full basepoint and half bonus from level
- // As on wiki:
- // BUG: Rank 2 to 10 (and maybe 11) of Lightning Bolt will proc another Bolt with FULL damage (not halved). This bug is known and will probably be fixed soon.
- // So - no add changes :)
CastSpell(pVictim, spellId, true, castItem, triggeredByAura);
((Player*)this)->AddSpellMod(mod, false);
@@ -6463,6 +6175,117 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return true;
}
+ // Static Shock
+ if(dummySpell->SpellIconID == 3059)
+ {
+ // lookup Lightning Shield
+ AuraList const& vs = GetAurasByType(SPELL_AURA_PROC_TRIGGER_SPELL);
+ for(AuraList::const_iterator itr = vs.begin(); itr != vs.end(); ++itr)
+ {
+ if( (*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN &&
+ (*itr)->GetSpellProto()->SpellFamilyFlags[0] & 0x400)
+ {
+ uint32 spell = 0;
+ switch ((*itr)->GetId())
+ {
+ case 324: spell = 26364; break;
+ case 325: spell = 26365; break;
+ case 905: spell = 26366; break;
+ case 945: spell = 26367; break;
+ case 8134: spell = 26369; break;
+ case 10431: spell = 26370; break;
+ case 10432: spell = 26363; break;
+ case 25469: spell = 26371; break;
+ case 25472: spell = 26372; break;
+ case 49280: spell = 49278; break;
+ case 49281: spell = 49279; break;
+ default:
+ return false;
+ }
+ CastSpell(this, spell, true, castItem, triggeredByAura);
+ if ((*itr)->DropAuraCharge())
+ RemoveAurasDueToSpell((*itr)->GetId());
+ return true;
+ }
+ }
+ return false;
+ break;
+ }
+ break;
+ }
+ case SPELLFAMILY_DEATHKNIGHT:
+ {
+ // Blood Aura
+ if (dummySpell->SpellIconID == 2636)
+ {
+ if (GetTypeId() != TYPEID_PLAYER || !((Player*)this)->isHonorOrXPTarget(pVictim))
+ return false;
+ basepoints0 = triggerAmount * damage / 100;
+ triggered_spell_id = 53168;
+ break;
+ }
+ // Butchery
+ if (dummySpell->SpellIconID == 2664)
+ {
+ basepoints0 = triggerAmount;
+ triggered_spell_id = 50163;
+ target = this;
+ break;
+ }
+ // Dancing Rune Weapon
+ if (dummySpell->Id == 49028)
+ {
+ // 1 dummy aura for dismiss rune blade
+ if (effIndex!=2)
+ return false;
+ // TODO: wite script for this "fights on its own, doing the same attacks"
+ // NOTE: Trigger here on every attack and spell cast
+ return false;
+ }
+ // Mark of Blood
+ if (dummySpell->Id == 49005)
+ {
+ // TODO: need more info (cooldowns/PPM)
+ triggered_spell_id = 50424;
+ break;
+ }
+ // Vendetta
+ if (dummySpell->SpellFamilyFlags[0] & 0x10000)
+ {
+ basepoints0 = triggerAmount * GetMaxHealth() / 100;
+ triggered_spell_id = 50181;
+ target = this;
+ break;
+ }
+ // Necrosis
+ if (dummySpell->SpellIconID == 2709)
+ {
+ basepoints0 = triggerAmount * damage / 100;
+ triggered_spell_id = 51460;
+ break;
+ }
+ // Runic Power Back on Snare/Root
+ if (dummySpell->Id == 61257)
+ {
+ // only for spells and hit/crit (trigger start always) and not start from self casted spells
+ if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
+ return false;
+ // Need snare or root mechanic
+ if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_ROOT)|(1<<MECHANIC_SNARE))))
+ return false;
+ triggered_spell_id = 61258;
+ target = this;
+ break;
+ }
+ // Wandering Plague
+ if (dummySpell->SpellIconID == 1614)
+ {
+ if (!roll_chance_f(GetUnitCriticalChance(BASE_ATTACK, pVictim)))
+ return false;
+ basepoints0 = triggerAmount * damage / 100;
+ triggered_spell_id = 50526;
+ break;
+ }
break;
}
default:
@@ -6498,1172 +6321,518 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return true;
}
-/*
-bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const *procSpell, uint32 procFlags,WeaponAttackType attackType, uint32 cooldown)
+
+bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const *procSpell, uint32 procFlags, uint32 procEx, uint32 cooldown)
{
+ // Get triggered aura spell info
SpellEntry const* auraSpellInfo = triggeredByAura->GetSpellProto();
+ // Basepoints of trigger aura
+ int32 triggerAmount = triggeredByAura->GetModifier()->m_amount;
+
+ // Set trigger spell id, target, custom basepoints
+ uint32 trigger_spell_id = auraSpellInfo->EffectTriggerSpell[triggeredByAura->GetEffIndex()];
+ Unit* target = NULL;
+ int32 basepoints0 = 0;
+
+ if(triggeredByAura->GetModifier()->m_auraname == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
+ basepoints0 = triggerAmount;
+
Item* castItem = triggeredByAura->GetCastItemGUID() && GetTypeId()==TYPEID_PLAYER
? ((Player*)this)->GetItemByGuid(triggeredByAura->GetCastItemGUID()) : NULL;
- uint32 triggered_spell_id = auraSpellInfo->EffectTriggerSpell[triggeredByAura->GetEffIndex()];
- Unit* target = !(procFlags & PROC_FLAG_HEAL) && IsPositiveSpell(triggered_spell_id) ? this : pVictim;
- int32 basepoints0 = 0;
-
- switch(auraSpellInfo->SpellFamilyName)
+ // Try handle uncnown trigger spells
+ if (sSpellStore.LookupEntry(trigger_spell_id)==NULL)
{
- case SPELLFAMILY_GENERIC:
- {
- switch(auraSpellInfo->Id)
- {
- // Aegis of Preservation
- case 23780:
- //Aegis Heal (instead non-existed triggered spell)
- triggered_spell_id = 23781;
- target = this;
- break;
- // Elune's Touch (moonkin mana restore)
- case 24905:
- {
- // Elune's Touch (instead non-existed triggered spell)
- triggered_spell_id = 33926;
- basepoints0 = int32(0.3f * GetTotalAttackPowerValue(BASE_ATTACK));
- target = this;
+ switch (auraSpellInfo->SpellFamilyName)
+ {
+ case SPELLFAMILY_GENERIC:
+ //if (auraSpellInfo->Id==59532) // Abandon Passengers on Poly
+ //if (auraSpellInfo->Id==54775) // Abandon Vehicle on Poly
+ //if (auraSpellInfo->Id==34082) // Advantaged State (DND)
+ if (auraSpellInfo->Id == 23780) // Aegis of Preservation (Aegis of Preservation trinket)
+ trigger_spell_id = 23781;
+ //else if (auraSpellInfo->Id==43504) // Alterac Valley OnKill Proc Aura
+ //else if (auraSpellInfo->Id == 48876) // Beast's Mark
+ //{
+ // trigger_spell_id = 48877;
+ //}
+ //else if (auraSpellInfo->Id == 59237) // Beast's Mark
+ //{
+ // trigger_spell_id = 59233;
+ //}
+ //else if (auraSpellInfo->Id==46939) // Black Bow of the Betrayer
+ //{
+ // trigger_spell_id = 29471; // gain mana
+ // 27526; // drain mana if possible
+ //}
+ //else if (auraSpellInfo->Id==50844) // Blood Mirror
+ //else if (auraSpellInfo->Id==54476) // Blood Presence
+ //else if (auraSpellInfo->Id==50689) // Blood Presence (Rank 1)
+ //else if (auraSpellInfo->Id==37030) // Chaotic Temperament
+ //else if (auraSpellInfo->Id==52856) // Charge
+ else if (auraSpellInfo->Id==43820) // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
+ {
+ // Pct value stored in dummy
+ basepoints0 = pVictim->GetCreateHealth() * auraSpellInfo->EffectBasePoints[1] / 100;
+ target = pVictim;
break;
}
- // Enlightenment
- case 29601:
- {
- // only for cast with mana price
- if(!procSpell || procSpell->powerType!=POWER_MANA || procSpell->manaCost==0 && procSpell->ManaCostPercentage==0 && procSpell->manaCostPerlevel==0)
- return false;
- break; // fall through to normal cast
- }
- // Health Restore
- case 33510:
+ //else if (auraSpellInfo->Id==41248) // Consuming Strikes
+ // trigger_spell_id = 41249;
+ //else if (auraSpellInfo->Id==45205) // Copy Offhand Weapon
+ //else if (auraSpellInfo->Id==57594) // Copy Ranged Weapon
+ //else if (auraSpellInfo->Id==41054) // Copy Weapon
+ // trigger_spell_id = 41055;
+ //else if (auraSpellInfo->Id==45343) // Dark Flame Aura
+ //else if (auraSpellInfo->Id==47300) // Dark Flame Aura
+ else if (auraSpellInfo->Id==57345) // Darkmoon Card: Greatness
+ {
+ uint32 stat = 0;
+ // strength
+ if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229;stat = GetStat(STAT_STRENGTH); }
+ // agility
+ if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233;stat = GetStat(STAT_AGILITY); }
+ // intellect
+ if (GetStat(STAT_INTELLECT)> stat) { trigger_spell_id = 60234;stat = GetStat(STAT_INTELLECT);}
+ // spirit
+ if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235;stat = GetStat(STAT_SPIRIT); }
+ }
+ //else if (auraSpellInfo->Id==31255) // Deadly Swiftness (Rank 1)
+ //else if (auraSpellInfo->Id==5301) // Defensive State (DND)
+ //else if (auraSpellInfo->Id==13358) // Defensive State (DND)
+ //else if (auraSpellInfo->Id==16092) // Defensive State (DND)
+ //else if (auraSpellInfo->Id==24949) // Defensive State 2 (DND)
+ //else if (auraSpellInfo->Id==40329) // Demo Shout Sensor
+ else if (auraSpellInfo->Id == 33896) // Desperate Defense (Stonescythe Whelp, Stonescythe Alpha, Stonescythe Ambusher)
+ trigger_spell_id = 33898;
+ //else if (auraSpellInfo->Id==18943) // Double Attack
+ //else if (auraSpellInfo->Id==19194) // Double Attack
+ //else if (auraSpellInfo->Id==19817) // Double Attack
+ //else if (auraSpellInfo->Id==19818) // Double Attack
+ //else if (auraSpellInfo->Id==22835) // Drunken Rage
+ // trigger_spell_id = 14822;
+ /*
+ else if (auraSpellInfo->SpellIconID==191) // Elemental Response
{
- // at melee hit call std triggered spell
- if(procFlags & PROC_FLAG_HIT_MELEE)
- break; // fall through to normal cast
-
- // Mark of Conquest - else (at range hit) called custom case
- triggered_spell_id = 39557;
- target = this;
- break;
+ switch (auraSpellInfo->Id && auraSpellInfo->AttributesEx==0)
+ {
+ case 34191:
+ case 34329:
+ case 34524:
+ case 34582:
+ case 36733:
+ break;
+ default:
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Elemental Response",auraSpellInfo->Id);
+ return false;
+ }
+ //This generic aura self-triggers a different spell for each school of magic that lands on the wearer:
+ switch (procSpell->School)
+ {
+ case SPELL_SCHOOL_FIRE: trigger_spell_id = 34192; break;
+ case SPELL_SCHOOL_FROST: trigger_spell_id = 34193; break;
+ case SPELL_SCHOOL_ARCANE:trigger_spell_id = 34194; break;
+ case SPELL_SCHOOL_NATURE:trigger_spell_id = 34195; break;
+ case SPELL_SCHOOL_SHADOW:trigger_spell_id = 34196; break;
+ case SPELL_SCHOOL_HOLY: trigger_spell_id = 34197; break;
+ case SPELL_SCHOOL_NORMAL:trigger_spell_id = 34198; break;
+ default:
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u Elemental Response wrong school",auraSpellInfo->Id);
+ return false;
+ }
}
- // Shaleskin
- case 36576:
- return true; // nothing to do
- // Forgotten Knowledge (Blade of Wizardry)
- case 38319:
- // only for harmful enemy targeted spell
- if(!pVictim || pVictim==this || !procSpell || IsPositiveSpell(procSpell->Id))
- return false;
- break; // fall through to normal cast
- // Aura of Wrath (Darkmoon Card: Wrath trinket bonus)
- case 39442:
- {
- // proc only at non-crit hits
- if(procFlags & (PROC_FLAG_CRIT_MELEE|PROC_FLAG_CRIT_RANGED|PROC_FLAG_CRIT_SPELL))
- return false;
- break; // fall through to normal cast
+ */
+ //else if (auraSpellInfo->Id==40364) // Entangling Roots Sensor
+ //else if (auraSpellInfo->Id==33207) // Gossip NPC Periodic - Fidget
+ //else if (auraSpellInfo->Id==50051) // Ethereal Pet Aura
+ //else if (auraSpellInfo->Id==35321) // Gushing Wound
+ //else if (auraSpellInfo->Id==38363) // Gushing Wound
+ //else if (auraSpellInfo->Id==39215) // Gushing Wound
+ //else if (auraSpellInfo->Id==44527) // Hate Monster (Spar Buddy) (30 sec)
+ //else if (auraSpellInfo->Id==44819) // Hate Monster (Spar Buddy) (>30% Health)
+ //else if (auraSpellInfo->Id==44526) // Hate Monster (Spar) (30 sec)
+ //else if (auraSpellInfo->Id==44820) // Hate Monster (Spar) (<30%)
+ //else if (auraSpellInfo->Id==49059) // Horde, Hate Monster (Spar Buddy) (>30% Health)
+ //else if (auraSpellInfo->Id==40250) // Improved Duration
+ //else if (auraSpellInfo->Id==59288) // Infra-Green Shield
+ //else if (auraSpellInfo->Id==54072) // Knockback Ball Passive
+ else if (auraSpellInfo->Id==27522 || auraSpellInfo->Id==40336)
+ // Mana Drain Trigger
+ {
+ // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
+ if (this && this->isAlive())
+ CastSpell(this, 29471, true, castItem, triggeredByAura);
+ if (pVictim && pVictim->isAlive())
+ CastSpell(pVictim, 27526, true, castItem, triggeredByAura);
+ return true;
}
- // Augment Pain (Timbal's Focusing Crystal trinket bonus)
- case 45054:
+ //else if (auraSpellInfo->Id==55580) // Mana Link
+ //else if (auraSpellInfo->Id==45903) // Offensive State
+ //else if (auraSpellInfo->Id==44326) // Pure Energy Passive
+ //else if (auraSpellInfo->Id==43453) // Rune Ward
+ //else if (auraSpellInfo->Id== 7137) // Shadow Charge (Rank 1)
+ //else if (auraSpellInfo->Id==36576) // Shaleskin (Shaleskin Flayer, Shaleskin Ripper) 30023 trigger
+ //else if (auraSpellInfo->Id==34783) // Spell Reflection
+ //else if (auraSpellInfo->Id==36096) // Spell Reflection
+ //else if (auraSpellInfo->Id==57587) // Steal Ranged ()
+ //else if (auraSpellInfo->Id==36207) // Steal Weapon
+ //else if (auraSpellInfo->Id== 7377) // Take Immune Periodic Damage <Not Working>
+ //else if (auraSpellInfo->Id==35205) // Vanish
+ //else if (auraSpellInfo->Id==42730) // Woe Strike
+ //else if (auraSpellInfo->Id==59735) // Woe Strike
+ //else if (auraSpellInfo->Id==46146) // [PH] Ahune Spanky Hands
+ break;
+ case SPELLFAMILY_MAGE:
+ if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
{
- if(!procSpell)
- return false;
-
- //only periodic damage can trigger spell
- bool found = false;
- for(int j = 0; j < 3; ++j)
+ switch (auraSpellInfo->Id)
{
- if( procSpell->EffectApplyAuraName[j]==SPELL_AURA_PERIODIC_DAMAGE ||
- procSpell->EffectApplyAuraName[j]==SPELL_AURA_PERIODIC_DAMAGE_PERCENT ||
- procSpell->EffectApplyAuraName[j]==SPELL_AURA_PERIODIC_LEECH )
- {
- found = true;
+ case 31641: // Rank 1
+ case 31642: // Rank 2
+ trigger_spell_id = 31643;
break;
- }
+ default:
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Blazing Speed",auraSpellInfo->Id);
+ return false;
}
- if(!found)
- return false;
-
- break; // fall through to normal cast
}
- // Evasive Maneuvers (Commendation of Kael'thas)
- case 45057:
+ break;
+ case SPELLFAMILY_WARRIOR:
+ if (auraSpellInfo->Id == 50421) // Scent of Blood
+ trigger_spell_id = 50422;
+ break;
+ case SPELLFAMILY_WARLOCK:
+ {
+ // Pyroclasm
+ if (auraSpellInfo->SpellIconID == 1137)
{
- // damage taken that reduces below 35% health
- // does NOT mean you must have been >= 35% before
- if (int32(GetHealth())-int32(damage) >= int32(GetMaxHealth()*0.35f))
+ if(!pVictim || !pVictim->isAlive() || pVictim == this || procSpell == NULL)
+ return false;
+ // Calculate spell tick count for spells
+ uint32 tick = 1; // Default tick = 1
+
+ // Hellfire have 15 tick
+ if (procSpell->SpellFamilyFlags[0]&0x40)
+ tick = 15;
+ // Rain of Fire have 4 tick
+ else if (procSpell->SpellFamilyFlags[0]&0x20)
+ tick = 4;
+ else
return false;
- break; // fall through to normal cast
- }
- }
- switch(triggered_spell_id)
- {
- // Setup
- case 15250:
- {
- // applied only for main target
- if(!pVictim || pVictim != getVictim())
+ // Calculate chance = baseChance / tick
+ float chance = 0;
+ switch (auraSpellInfo->Id)
+ {
+ case 18096: chance = 13.0f / tick; break;
+ case 18073: chance = 26.0f / tick; break;
+ }
+ // Roll chance
+ if (!roll_chance_f(chance))
return false;
- // continue normal case
- break;
+ trigger_spell_id = 18093;
}
- // Shamanistic Rage triggered spell
- case 30824:
- basepoints0 = int32(GetTotalAttackPowerValue(BASE_ATTACK)*triggeredByAura->GetModifier()->m_amount/100);
- break;
- }
- break;
- }
- case SPELLFAMILY_MAGE:
- {
- switch(auraSpellInfo->SpellIconID)
- {
- // Blazing Speed
- case 2127:
- //Blazing Speed (instead non-existed triggered spell)
- triggered_spell_id = 31643;
- target = this;
- break;
- }
- switch(auraSpellInfo->Id)
- {
- // Persistent Shield (Scarab Brooch)
- case 26467:
- basepoints0 = int32(damage * 0.15f);
- break;
- }
- break;
- }
- case SPELLFAMILY_WARRIOR:
- {
- //Rampage
- if((auraSpellInfo->SpellFamilyFlags & 0x100000) && auraSpellInfo->SpellIconID==2006)
- {
- //all ranks have effect[0]==AURA (Proc Trigger Spell, non-existed)
- //and effect[1]==TriggerSpell
- if(auraSpellInfo->Effect[1]!=SPELL_EFFECT_TRIGGER_SPELL)
+ // Drain Soul
+ else if (auraSpellInfo->SpellFamilyFlags[0] & 0x4000)
{
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u have wrong effect in RM",triggeredByAura->GetSpellProto()->Id);
- return false;
- }
- triggered_spell_id = auraSpellInfo->EffectTriggerSpell[1];
- break; // fall through to normal cast
- }
- break;
- }
- case SPELLFAMILY_WARLOCK:
- {
- // Pyroclasm
- if(auraSpellInfo->SpellFamilyFlags == 0x0000000000000000 && auraSpellInfo->SpellIconID==1137)
- {
- // last case for Hellfire that damage caster also but don't must stun caster
- if( pVictim == this )
+ Unit::AuraList const& mAddFlatModifier = GetAurasByType(SPELL_AURA_ADD_FLAT_MODIFIER);
+ for(Unit::AuraList::const_iterator i = mAddFlatModifier.begin(); i != mAddFlatModifier.end(); ++i)
+ {
+ if ((*i)->GetModifier()->m_miscvalue == SPELLMOD_CHANCE_OF_SUCCESS && (*i)->GetSpellProto()->SpellIconID == 113)
+ {
+ int32 value2 = CalculateSpellDamage((*i)->GetSpellProto(),2,(*i)->GetSpellProto()->EffectBasePoints[2],this);
+ // Drain Soul
+ CastCustomSpell(this, 18371, &basepoints0, NULL, NULL, true, castItem, triggeredByAura);
+ break;
+ }
+ }
+ // Not remove charge (aura removed on death in any cases)
+ // Need for correct work Drain Soul SPELL_AURA_CHANNEL_DEATH_ITEM aura
return false;
-
- // custom chance
- float chance = 0;
- switch (triggeredByAura->GetId())
- {
- case 18096: chance = 13.0f; break;
- case 18073: chance = 26.0f; break;
}
- if (!roll_chance_f(chance))
- return false;
-
- // Pyroclasm (instead non-existed triggered spell)
- triggered_spell_id = 18093;
- target = pVictim;
- break;
- }
- // Drain Soul
- if(auraSpellInfo->SpellFamilyFlags & 0x0000000000004000)
- {
- bool found = false;
- Unit::AuraList const& mAddFlatModifier = GetAurasByType(SPELL_AURA_ADD_FLAT_MODIFIER);
- for(Unit::AuraList::const_iterator i = mAddFlatModifier.begin(); i != mAddFlatModifier.end(); ++i)
+ // Nether Protection
+ else if (auraSpellInfo->SpellIconID == 1985)
{
- //Improved Drain Soul
- if ((*i)->GetModifier()->m_miscvalue == SPELLMOD_CHANCE_OF_SUCCESS && (*i)->GetSpellProto()->SpellIconID == 113)
+ if (!procSpell)
+ return false;
+ switch(GetFirstSchoolInMask(GetSpellSchoolMask(procSpell)))
{
- int32 value2 = CalculateSpellDamage((*i)->GetSpellProto(),2,(*i)->GetSpellProto()->EffectBasePoints[2],this);
- basepoints0 = value2 * GetMaxPower(POWER_MANA) / 100;
- // Drain Soul
- CastCustomSpell(this, 18371, &basepoints0, NULL, NULL, true, castItem, triggeredByAura);
- break;
+ case SPELL_SCHOOL_NORMAL:
+ case SPELL_SCHOOL_HOLY:
+ return false; // ignore
+ case SPELL_SCHOOL_FIRE: trigger_spell_id = 54371; break;
+ case SPELL_SCHOOL_NATURE: trigger_spell_id = 54375; break;
+ case SPELL_SCHOOL_FROST: trigger_spell_id = 54372; break;
+ case SPELL_SCHOOL_SHADOW: trigger_spell_id = 54374; break;
+ case SPELL_SCHOOL_ARCANE: trigger_spell_id = 54373; break;
+ default:
+ return false;
}
}
- // Not remove charge (aura removed on death in any cases)
- // Need for correct work Drain Soul SPELL_AURA_CHANNEL_DEATH_ITEM aura
- return false;
+ break;
}
- break;
- }
- case SPELLFAMILY_PRIEST:
- {
- //Blessed Recovery
- if(auraSpellInfo->SpellFamilyFlags == 0x00000000LL && auraSpellInfo->SpellIconID==1875)
+ case SPELLFAMILY_PRIEST:
{
- switch (triggeredByAura->GetSpellProto()->Id)
+ // Greater Heal Refund
+ if (auraSpellInfo->Id==37594)
+ trigger_spell_id = 37595;
+ // Blessed Recovery
+ else if (auraSpellInfo->SpellIconID == 1875)
{
- case 27811: triggered_spell_id = 27813; break;
- case 27815: triggered_spell_id = 27817; break;
- case 27816: triggered_spell_id = 27818; break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in BR",triggeredByAura->GetSpellProto()->Id);
- return false;
- }
-
- int32 heal_amount = damage * triggeredByAura->GetModifier()->m_amount / 100;
- basepoints0 = heal_amount/3;
- target = this;
- break;
- }
- // Shadowguard
- if((auraSpellInfo->SpellFamilyFlags & 0x80000000LL) && auraSpellInfo->SpellVisual==7958)
- {
- switch(triggeredByAura->GetSpellProto()->Id)
- {
- case 18137:
- triggered_spell_id = 28377; break; // Rank 1
- case 19308:
- triggered_spell_id = 28378; break; // Rank 2
- case 19309:
- triggered_spell_id = 28379; break; // Rank 3
- case 19310:
- triggered_spell_id = 28380; break; // Rank 4
- case 19311:
- triggered_spell_id = 28381; break; // Rank 5
- case 19312:
- triggered_spell_id = 28382; break; // Rank 6
- case 25477:
- triggered_spell_id = 28385; break; // Rank 7
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in SG",triggeredByAura->GetSpellProto()->Id);
+ switch (auraSpellInfo->Id)
+ {
+ case 27811: trigger_spell_id = 27813; break;
+ case 27815: trigger_spell_id = 27817; break;
+ case 27816: trigger_spell_id = 27818; break;
+ default:
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in BR", auraSpellInfo->Id);
return false;
+ }
+ basepoints0 = damage * triggerAmount / 100 / 3;
+ target = this;
}
- target = pVictim;
break;
}
- break;
- }
- case SPELLFAMILY_DRUID:
- {
- switch(auraSpellInfo->Id)
+ case SPELLFAMILY_DRUID:
{
- // Leader of the Pack (triggering Improved Leader of the Pack heal)
- case 24932:
- {
- if (triggeredByAura->GetModifier()->m_amount == 0)
- return false;
- basepoints0 = triggeredByAura->GetModifier()->m_amount * GetMaxHealth() / 100;
- triggered_spell_id = 34299;
- break;
- };
- // Druid Forms Trinket (Druid Tier5 Trinket, triggers different spells per Form)
- case 37336:
+ // Druid Forms Trinket
+ if (auraSpellInfo->Id==37336)
{
switch(m_form)
{
+ case FORM_NONE: trigger_spell_id = 37344;break;
+ case FORM_CAT: trigger_spell_id = 37341;break;
case FORM_BEAR:
- case FORM_DIREBEAR:
- triggered_spell_id=37340; break;// Ursine Blessing
- case FORM_CAT:
- triggered_spell_id=37341; break;// Feline Blessing
- case FORM_TREE:
- triggered_spell_id=37342; break;// Slyvan Blessing
- case FORM_MOONKIN:
- triggered_spell_id=37343; break;// Lunar Blessing
- case FORM_NONE:
- triggered_spell_id=37344; break;// Cenarion Blessing (for caster form, except FORM_MOONKIN)
+ case FORM_DIREBEAR: trigger_spell_id = 37340;break;
+ case FORM_TREE: trigger_spell_id = 37342;break;
+ case FORM_MOONKIN: trigger_spell_id = 37343;break;
default:
return false;
}
-
- target = this;
- break;
}
- }
- break;
- }
- case SPELLFAMILY_ROGUE:
- {
- if(auraSpellInfo->SpellFamilyFlags == 0x0000000000000000LL)
- {
- switch(auraSpellInfo->SpellIconID)
+ //else if (auraSpellInfo->Id==40363)// Entangling Roots ()
+ // trigger_spell_id = ????;
+ // Leader of the Pack
+ else if (auraSpellInfo->Id == 24932)
{
- // Combat Potency
- case 2260:
- {
- // skip non offhand attacks
- if(attackType!=OFF_ATTACK)
- return false;
- break; // fall through to normal cast
- }
+ if (triggerAmount == 0)
+ return false;
+ basepoints0 = triggerAmount * GetMaxHealth() / 100;
+ trigger_spell_id = 34299;
}
+ break;
}
- break;
- }
- case SPELLFAMILY_PALADIN:
- {
- if(auraSpellInfo->SpellFamilyFlags == 0x00000000LL)
+ case SPELLFAMILY_HUNTER:
+ break;
+ case SPELLFAMILY_PALADIN:
{
- switch(auraSpellInfo->Id)
+ /*
+ // Blessed Life
+ if (auraSpellInfo->SpellIconID == 2137)
{
- // Lightning Capacitor
- case 37657:
- {
- // trinket ProcTriggerSpell but for safe checks for player
- if(!castItem || !pVictim || !pVictim->isAlive() || GetTypeId()!=TYPEID_PLAYER)
- return false;
-
- if(((Player*)this)->HasSpellCooldown(37657))
- return false;
-
- // stacking
- CastSpell(this, 37658, true, castItem, triggeredByAura);
- // 2.5s cooldown before it can stack again, current system allow 1 sec step in cooldown
- ((Player*)this)->AddSpellCooldown(37657,0,time(NULL)+(roll_chance_i(50) ? 2 : 3));
-
- // counting
- Aura * dummy = GetDummyAura(37658);
- if (!dummy)
- return false;
-
- // release at 3 aura in stack
- if(dummy->GetStackAmount() <= 2)
- return true; // main triggered spell casted anyway
-
- RemoveAurasDueToSpell(37658);
- CastSpell(pVictim, 37661, true, castItem, triggeredByAura);
- return true;
- }
- // Healing Discount
- case 37705:
- // Healing Trance (instead non-existed triggered spell)
- triggered_spell_id = 37706;
- target = this;
- break;
- // HoTs on Heals (Fel Reaver's Piston trinket)
- case 38299:
+ switch (auraSpellInfo->Id)
{
- // at direct heal effect
- if(!procSpell || !IsSpellHaveEffect(procSpell,SPELL_EFFECT_HEAL))
+ case 31828: // Rank 1
+ case 31829: // Rank 2
+ case 31830: // Rank 3
+ break;
+ default:
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Blessed Life", auraSpellInfo->Id);
return false;
-
- // single proc at time
- AuraList const& scAuras = GetSingleCastAuras();
- for(AuraList::const_iterator itr = scAuras.begin(); itr != scAuras.end(); ++itr)
- if((*itr)->GetId()==triggered_spell_id)
- return false;
-
- // positive cast at victim instead self
- target = pVictim;
- break;
}
}
- switch(auraSpellInfo->SpellIconID)
+ */
+ // Healing Discount
+ if (auraSpellInfo->Id==37705)
{
- case 241:
- {
- switch(auraSpellInfo->EffectTriggerSpell[0])
- {
- //Illumination
- case 18350:
- {
- if(!procSpell)
- return false;
-
- // procspell is triggered spell but we need mana cost of original casted spell
- uint32 originalSpellId = procSpell->Id;
-
- // Holy Shock
- if(procSpell->SpellFamilyName == SPELLFAMILY_PALADIN)
- {
- if(procSpell->SpellFamilyFlags & 0x0001000000000000LL)
- {
- switch(procSpell->Id)
- {
- case 25914: originalSpellId = 20473; break;
- case 25913: originalSpellId = 20929; break;
- case 25903: originalSpellId = 20930; break;
- case 27175: originalSpellId = 27174; break;
- case 33074: originalSpellId = 33072; break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in HShock",procSpell->Id);
- return false;
- }
- }
- }
-
- SpellEntry const *originalSpell = sSpellStore.LookupEntry(originalSpellId);
- if(!originalSpell)
- {
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u unknown but selected as original in Illu",originalSpellId);
- return false;
- }
-
- // percent stored in effect 1 (class scripts) base points
- int32 percent = auraSpellInfo->EffectBasePoints[1]+1;
-
- basepoints0 = originalSpell->manaCost*percent/100;
- triggered_spell_id = 20272;
- target = this;
- break;
- }
- }
- break;
- }
+ trigger_spell_id = 37706;
+ target = this;
}
- }
- if(auraSpellInfo->SpellFamilyFlags & 0x00080000)
- {
- switch(auraSpellInfo->SpellIconID)
+ // Soul Preserver
+ if (auraSpellInfo->Id==60510)
{
- //Judgement of Wisdom (overwrite non existing triggered spell call in spell.dbc
- case 206:
+ trigger_spell_id = 60515;
+ target = this;
+ }
+ // Illumination
+ else if (auraSpellInfo->SpellIconID==241)
+ {
+ if(!procSpell)
+ return false;
+ // procspell is triggered spell but we need mana cost of original casted spell
+ uint32 originalSpellId = procSpell->Id;
+ // Holy Shock heal
+ if(procSpell->SpellFamilyFlags[1] & 0x00010000)
{
- if(!pVictim || !pVictim->isAlive())
- return false;
-
- switch(triggeredByAura->GetSpellProto()->Id)
+ switch(procSpell->Id)
{
- case 20186:
- triggered_spell_id = 20268; // Rank 1
- break;
- case 20354:
- triggered_spell_id = 20352; // Rank 2
- break;
- case 20355:
- triggered_spell_id = 20353; // Rank 3
- break;
- case 27164:
- triggered_spell_id = 27165; // Rank 4
- break;
+ case 25914: originalSpellId = 20473; break;
+ case 25913: originalSpellId = 20929; break;
+ case 25903: originalSpellId = 20930; break;
+ case 27175: originalSpellId = 27174; break;
+ case 33074: originalSpellId = 33072; break;
+ case 48820: originalSpellId = 48824; break;
+ case 48821: originalSpellId = 48825; break;
default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in JoW",triggeredByAura->GetSpellProto()->Id);
- return false;
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in HShock",procSpell->Id);
+ return false;
}
-
- pVictim->CastSpell(pVictim,triggered_spell_id,true,castItem,triggeredByAura,GetGUID());
- return true; // no hidden cooldown
}
- //Judgement of Light
- case 299:
+ SpellEntry const *originalSpell = sSpellStore.LookupEntry(originalSpellId);
+ if(!originalSpell)
{
- if(!pVictim || !pVictim->isAlive())
- return false;
-
- // overwrite non existing triggered spell call in spell.dbc
- switch(triggeredByAura->GetSpellProto()->Id)
- {
- case 20185:
- triggered_spell_id = 20267; // Rank 1
- break;
- case 20344:
- triggered_spell_id = 20341; // Rank 2
- break;
- case 20345:
- triggered_spell_id = 20342; // Rank 3
- break;
- case 20346:
- triggered_spell_id = 20343; // Rank 4
- break;
- case 27162:
- triggered_spell_id = 27163; // Rank 5
- break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in JoL",triggeredByAura->GetSpellProto()->Id);
- return false;
- }
- pVictim->CastSpell(pVictim,triggered_spell_id,true,castItem,triggeredByAura,GetGUID());
- return true; // no hidden cooldown
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u unknown but selected as original in Illu",originalSpellId);
+ return false;
}
+ // percent stored in effect 1 (class scripts) base points
+ int32 cost = originalSpell->manaCost + originalSpell->ManaCostPercentage * GetCreateMana() / 100;
+ basepoints0 = cost*(auraSpellInfo->EffectBasePoints[1]+1)/100;
+ trigger_spell_id = 20272;
+ target = this;
}
- }
- // custom check for proc spell
- switch(auraSpellInfo->Id)
- {
- // Bonus Healing (item spell)
- case 40971:
+ // Lightning Capacitor
+ else if (auraSpellInfo->Id==37657)
{
if(!pVictim || !pVictim->isAlive())
return false;
+ // stacking
+ CastSpell(this, 37658, true, NULL, triggeredByAura);
- // bonus if health < 50%
- if(pVictim->GetHealth() >= pVictim->GetMaxHealth()*triggeredByAura->GetModifier()->m_amount/100)
+ Aura * dummy = GetDummyAura(37658);
+ // release at 3 aura in stack (cont contain in basepoint of trigger aura)
+ if(!dummy || dummy->GetStackAmount() < triggerAmount)
return false;
- // cast at target positive spell
+ RemoveAurasDueToSpell(37658);
+ trigger_spell_id = 37661;
target = pVictim;
- break;
}
- }
- switch(triggered_spell_id)
- {
- // Seal of Command
- case 20424:
- // prevent chain of triggered spell from same triggered spell
- if(procSpell && procSpell->Id==20424)
+ // Thunder Capacitor
+ else if (auraSpellInfo->Id == 54841)
+ {
+ if(!pVictim || !pVictim->isAlive())
return false;
- break;
+ // stacking
+ CastSpell(this, 54842, true, NULL, triggeredByAura);
+
+ // counting
+ Aura * dummy = GetDummyAura(54842);
+ // release at 3 aura in stack (cont contain in basepoint of trigger aura)
+ if(!dummy || dummy->GetStackAmount() < triggerAmount)
+ return false;
+
+ RemoveAurasDueToSpell(54842);
+ trigger_spell_id = 54843;
+ target = pVictim;
+ }
+ break;
}
- break;
- }
- case SPELLFAMILY_SHAMAN:
- {
- if(auraSpellInfo->SpellFamilyFlags == 0x0000000000000000)
+ case SPELLFAMILY_SHAMAN:
{
- switch(auraSpellInfo->SpellIconID)
+ // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
+ if(auraSpellInfo->SpellFamilyFlags[0] & 0x400)
{
- case 19:
- {
- switch(auraSpellInfo->Id)
- {
- case 23551: // Lightning Shield - Tier2: 8 pieces proc shield
- {
- // Lightning Shield (overwrite non existing triggered spell call in spell.dbc)
- triggered_spell_id = 23552;
- target = pVictim;
- break;
- }
- case 23552: // Lightning Shield - trigger shield damage
- {
- // Lightning Shield (overwrite non existing triggered spell call in spell.dbc)
- triggered_spell_id = 27635;
- target = pVictim;
- break;
- }
- }
- break;
- }
- // Mana Surge (Shaman T1 bonus)
- case 87:
+ switch(auraSpellInfo->Id)
{
- if(!procSpell)
- return false;
-
- basepoints0 = procSpell->manaCost * 35/100;
- triggered_spell_id = 23571;
- target = this;
- break;
+ case 324: // Rank 1
+ trigger_spell_id = 26364; break;
+ case 325: // Rank 2
+ trigger_spell_id = 26365; break;
+ case 905: // Rank 3
+ trigger_spell_id = 26366; break;
+ case 945: // Rank 4
+ trigger_spell_id = 26367; break;
+ case 8134: // Rank 5
+ trigger_spell_id = 26369; break;
+ case 10431: // Rank 6
+ trigger_spell_id = 26370; break;
+ case 10432: // Rank 7
+ trigger_spell_id = 26363; break;
+ case 25469: // Rank 8
+ trigger_spell_id = 26371; break;
+ case 25472: // Rank 9
+ trigger_spell_id = 26372; break;
+ case 49280: // Rank 10
+ trigger_spell_id = 49278; break;
+ case 49281: // Rank 11
+ trigger_spell_id = 49279; break;
+ default:
+ sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in LShield", auraSpellInfo->Id);
+ return false;
}
- //Nature's Guardian
- case 2013:
- {
- if(GetTypeId()!=TYPEID_PLAYER)
- return false;
-
- // damage taken that reduces below 30% health
- // does NOT mean you must have been >= 30% before
- if (10*(int32(GetHealth())-int32(damage)) >= 3*GetMaxHealth())
- return false;
-
- triggered_spell_id = 31616;
+ }
+ // Lightning Shield (The Ten Storms set)
+ else if (auraSpellInfo->Id == 23551)
+ {
+ trigger_spell_id = 23552;
+ target = pVictim;
+ }
+ // Damage from Lightning Shield (The Ten Storms set)
+ else if (auraSpellInfo->Id == 23552)
+ trigger_spell_id = 27635;
+ // Mana Surge (The Earthfury set)
+ else if (auraSpellInfo->Id == 23572)
+ {
+ if(!procSpell)
+ return false;
+ basepoints0 = procSpell->manaCost * 35 / 100;
+ trigger_spell_id = 23571;
+ target = this;
+ }
+ // Nature's Guardian
+ else if (auraSpellInfo->SpellIconID == 2013)
+ {
+ // Check health condition - should drop to less 30% (damage deal after this!)
+ if (!(10*(int32(GetHealth() - damage)) < 3 * GetMaxHealth()))
+ return false;
- // need check cooldown now
- if( cooldown && ((Player*)this)->HasSpellCooldown(triggered_spell_id))
- return false;
+ if(pVictim && pVictim->isAlive())
+ pVictim->getThreatManager().modifyThreatPercent(this,-10);
- basepoints0 = triggeredByAura->GetModifier()->m_amount * GetMaxHealth() / 100;
- target = this;
- if(pVictim && pVictim->isAlive())
- pVictim->getThreatManager().modifyThreatPercent(this,-10);
- break;
- }
+ basepoints0 = triggerAmount * GetMaxHealth() / 100;
+ trigger_spell_id = 31616;
+ target = this;
}
- }
-
- // Water Shield (we can't set cooldown for main spell - it's player casted spell
- if((auraSpellInfo->SpellFamilyFlags & 0x0000002000000000LL) && auraSpellInfo->SpellVisual==7358)
- {
- target = this;
break;
}
-
- // Lightning Shield
- if((auraSpellInfo->SpellFamilyFlags & 0x00000400) && auraSpellInfo->SpellVisual==37)
- {
- // overwrite non existing triggered spell call in spell.dbc
- switch(triggeredByAura->GetSpellProto()->Id)
- {
- case 324:
- triggered_spell_id = 26364; break; // Rank 1
- case 325:
- triggered_spell_id = 26365; break; // Rank 2
- case 905:
- triggered_spell_id = 26366; break; // Rank 3
- case 945:
- triggered_spell_id = 26367; break; // Rank 4
- case 8134:
- triggered_spell_id = 26369; break; // Rank 5
- case 10431:
- triggered_spell_id = 26370; break; // Rank 6
- case 10432:
- triggered_spell_id = 26363; break; // Rank 7
- case 25469:
- triggered_spell_id = 26371; break; // Rank 8
- case 25472:
- triggered_spell_id = 26372; break; // Rank 9
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in LShield",triggeredByAura->GetSpellProto()->Id);
+ case SPELLFAMILY_DEATHKNIGHT:
+ {
+ // Acclimation
+ if (auraSpellInfo->SpellIconID == 1930)
+ {
+ if (!procSpell)
return false;
+ switch(GetFirstSchoolInMask(GetSpellSchoolMask(procSpell)))
+ {
+ case SPELL_SCHOOL_NORMAL:
+ return false; // ignore
+ case SPELL_SCHOOL_HOLY: trigger_spell_id = 50490; break;
+ case SPELL_SCHOOL_FIRE: trigger_spell_id = 50362; break;
+ case SPELL_SCHOOL_NATURE: trigger_spell_id = 50488; break;
+ case SPELL_SCHOOL_FROST: trigger_spell_id = 50485; break;
+ case SPELL_SCHOOL_SHADOW: trigger_spell_id = 50489; break;
+ case SPELL_SCHOOL_ARCANE: trigger_spell_id = 54373; break;
+ default:
+ return false;
+ }
+ }
+ // Blood Presence
+ else if (auraSpellInfo->Id == 48266)
+ {
+ if (GetTypeId() != TYPEID_PLAYER)
+ return false;
+ if (!((Player*)this)->isHonorOrXPTarget(pVictim))
+ return false;
+ trigger_spell_id = 50475;
+ basepoints0 = damage * triggerAmount / 100;
}
-
- target = pVictim;
break;
}
- break;
- }
- }
-
- // standard non-dummy case
- if(!triggered_spell_id)
- {
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u have 0 in EffectTriggered[%d], not handled custom case?",auraSpellInfo->Id,triggeredByAura->GetEffIndex());
- return false;
- }
-
- SpellEntry const* triggerEntry = sSpellStore.LookupEntry(triggered_spell_id);
-
- if(!triggerEntry)
- {
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u have not existed EffectTriggered[%d]=%u, not handled custom case?",auraSpellInfo->Id,triggeredByAura->GetEffIndex(),triggered_spell_id);
- return false;
- }
-
- // not allow proc extra attack spell at extra attack
- if( m_extraAttacks && IsSpellHaveEffect(triggerEntry,SPELL_EFFECT_ADD_EXTRA_ATTACKS) )
- return false;
-
- if( cooldown && GetTypeId()==TYPEID_PLAYER && ((Player*)this)->HasSpellCooldown(triggered_spell_id))
- return false;
-
- // default case
- if(!target || target!=this && !target->isAlive())
- return false;
-
- if(basepoints0)
- CastCustomSpell(target,triggered_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura);
- else
- CastSpell(target,triggered_spell_id,true,castItem,triggeredByAura);
-
- if( cooldown && GetTypeId()==TYPEID_PLAYER )
- ((Player*)this)->AddSpellCooldown(triggered_spell_id,0,time(NULL) + cooldown);
-
- return true;
-}
-*/
-
-bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const *procSpell, uint32 procFlags, uint32 procEx, uint32 cooldown)
-{
- // Get triggered aura spell info
- SpellEntry const* auraSpellInfo = triggeredByAura->GetSpellProto();
-
- // Basepoints of trigger aura
- int32 triggerAmount = triggeredByAura->GetModifier()->m_amount;
-
- // Set trigger spell id, target, custom basepoints
- uint32 trigger_spell_id = auraSpellInfo->EffectTriggerSpell[triggeredByAura->GetEffIndex()];
- Unit* target = NULL;
- int32 basepoints0 = 0;
-
- Item* castItem = triggeredByAura->GetCastItemGUID() && GetTypeId()==TYPEID_PLAYER
- ? ((Player*)this)->GetItemByGuid(triggeredByAura->GetCastItemGUID()) : NULL;
-
- // Try handle uncnown trigger spells
- if (sSpellStore.LookupEntry(trigger_spell_id)==NULL)
- switch (auraSpellInfo->SpellFamilyName)
- {
- //=====================================================================
- // Generic class
- // ====================================================================
- // .....
- //=====================================================================
- case SPELLFAMILY_GENERIC:
-// if (auraSpellInfo->Id==34082) // Advantaged State (DND)
-// trigger_spell_id = ???;
- if (auraSpellInfo->Id == 23780) // Aegis of Preservation (Aegis of Preservation trinket)
- trigger_spell_id = 23781;
-// else if (auraSpellInfo->Id==43504) // Alterac Valley OnKill Proc Aura
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==37030) // Chaotic Temperament
-// trigger_spell_id = ;
- else if (auraSpellInfo->Id==43820) // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
- {
- // Pct value stored in dummy
- basepoints0 = pVictim->GetCreateHealth() * auraSpellInfo->EffectBasePoints[1] / 100;
- target = pVictim;
- break;
- }
-// else if (auraSpellInfo->Id==41248) // Consuming Strikes
-// trigger_spell_id = 41249;
-// else if (auraSpellInfo->Id==41054) // Copy Weapon
-// trigger_spell_id = 41055;
-// else if (auraSpellInfo->Id==31255) // Deadly Swiftness (Rank 1)
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==5301) // Defensive State (DND)
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==13358) // Defensive State (DND)
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==16092) // Defensive State (DND)
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==24949) // Defensive State 2 (DND)
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==40329) // Demo Shout Sensor
-// trigger_spell_id = ;
- // Desperate Defense (Stonescythe Whelp, Stonescythe Alpha, Stonescythe Ambusher)
- else if (auraSpellInfo->Id == 33896)
- trigger_spell_id = 33898;
-// else if (auraSpellInfo->Id==18943) // Double Attack
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==19194) // Double Attack
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==19817) // Double Attack
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==19818) // Double Attack
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==22835) // Drunken Rage
-// trigger_spell_id = 14822;
- /*
- else if (auraSpellInfo->SpellIconID==191) // Elemental Response
- {
- switch (auraSpellInfo->Id && auraSpellInfo->AttributesEx==0)
- {
- case 34191:
- case 34329:
- case 34524:
- case 34582:
- case 36733:break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Elemental Response",auraSpellInfo->Id);
- return false;
- }
- //This generic aura self-triggers a different spell for each school of magic that lands on the wearer:
- switch (procSpell->School)
- {
- case SPELL_SCHOOL_FIRE: trigger_spell_id = 34192;break;//Fire: 34192
- case SPELL_SCHOOL_FROST: trigger_spell_id = 34193;break;//Frost: 34193
- case SPELL_SCHOOL_ARCANE: trigger_spell_id = 34194;break;//Arcane: 34194
- case SPELL_SCHOOL_NATURE: trigger_spell_id = 34195;break;//Nature: 34195
- case SPELL_SCHOOL_SHADOW: trigger_spell_id = 34196;break;//Shadow: 34196
- case SPELL_SCHOOL_HOLY: trigger_spell_id = 34197;break;//Holy: 34197
- case SPELL_SCHOOL_NORMAL: trigger_spell_id = 34198;break;//Physical: 34198
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u Elemental Response wrong school",auraSpellInfo->Id);
- return false;
- }
- }*/
-// else if (auraSpellInfo->Id==6542) // Enraged Defense
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==40364) // Entangling Roots Sensor
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==33207) // Gossip NPC Periodic - Fidget
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==35321) // Gushing Wound
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==38363) // Gushing Wound
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==39215) // Gushing Wound
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==40250) // Improved Duration
-// trigger_spell_id = ;
- else if (auraSpellInfo->Id==27522) // Mana Drain Trigger
- {
- // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
- if (this && this->isAlive())
- CastSpell(this, 29471, true, castItem, triggeredByAura);
- if (pVictim && pVictim->isAlive())
- CastSpell(pVictim, 27526, true, castItem, triggeredByAura);
- return true;
- }
- else if (auraSpellInfo->Id==24905) // Moonkin Form (Passive)
- {
- // Elune's Touch (instead non-existed triggered spell) 30% from AP
- trigger_spell_id = 33926;
- basepoints0 = GetTotalAttackPowerValue(BASE_ATTACK) * 30 / 100;
- target = this;
- }
-// else if (auraSpellInfo->Id==43453) // Rune Ward
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==7137) // Shadow Charge (Rank 1)
-// trigger_spell_id = ;
- // Shaleskin (Shaleskin Flayer, Shaleskin Ripper) 30023 trigger
-// else if (auraSpellInfo->Id==36576)
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==34783) // Spell Reflection
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==36096) // Spell Reflection
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==36207) // Steal Weapon
-// trigger_spell_id = ;
-// else if (auraSpellInfo->Id==35205) // Vanish
- break;
- //=====================================================================
- // Mage
- //=====================================================================
- // Blazing Speed (Rank 1,2) trigger = 18350
- //=====================================================================
- case SPELLFAMILY_MAGE:
- // Blazing Speed
- if (auraSpellInfo->SpellIconID == 2127)
- {
- switch (auraSpellInfo->Id)
- {
- case 31641: // Rank 1
- case 31642: // Rank 2
- trigger_spell_id = 31643;
- break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Blazing Speed",auraSpellInfo->Id);
- return false;
- }
- }
- break;
- //=====================================================================
- // Warrior
- //=====================================================================
- // Rampage (Rank 1-3) trigger = 18350
- //=====================================================================
- case SPELLFAMILY_WARRIOR:
- // Rampage
- if (auraSpellInfo->SpellIconID == 2006 && auraSpellInfo->SpellFamilyFlags==0x100000)
- {
- switch(auraSpellInfo->Id)
- {
- case 29801: trigger_spell_id = 30029; break; // Rank 1
- case 30030: trigger_spell_id = 30031; break; // Rank 2
- case 30033: trigger_spell_id = 30032; break; // Rank 3
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in Rampage",auraSpellInfo->Id);
- return false;
- }
- }
- break;
- //=====================================================================
- // Warlock
- //=====================================================================
- // Pyroclasm trigger = 18350
- // Drain Soul (Rank 1-5) trigger = 0
- //=====================================================================
- case SPELLFAMILY_WARLOCK:
- {
- // Pyroclasm
- if (auraSpellInfo->SpellIconID == 1137)
- {
- if(!pVictim || !pVictim->isAlive() || pVictim == this || procSpell == NULL)
- return false;
- // Calculate spell tick count for spells
- uint32 tick = 1; // Default tick = 1
-
- // Hellfire have 15 tick
- if (procSpell->SpellFamilyFlags&0x0000000000000040LL)
- tick = 15;
- // Rain of Fire have 4 tick
- else if (procSpell->SpellFamilyFlags&0x0000000000000020LL)
- tick = 4;
- else
- return false;
-
- // Calculate chance = baseChance / tick
- float chance = 0;
- switch (auraSpellInfo->Id)
- {
- case 18096: chance = 13.0f / tick; break;
- case 18073: chance = 26.0f / tick; break;
- }
- // Roll chance
- if (!roll_chance_f(chance))
- return false;
-
- trigger_spell_id = 18093;
- }
- // Drain Soul
- else if (auraSpellInfo->SpellFamilyFlags & 0x0000000000004000LL)
- {
- Unit::AuraList const& mAddFlatModifier = GetAurasByType(SPELL_AURA_ADD_FLAT_MODIFIER);
- for(Unit::AuraList::const_iterator i = mAddFlatModifier.begin(); i != mAddFlatModifier.end(); ++i)
- {
- if ((*i)->GetModifier()->m_miscvalue == SPELLMOD_CHANCE_OF_SUCCESS && (*i)->GetSpellProto()->SpellIconID == 113)
- {
- int32 value2 = CalculateSpellDamage((*i)->GetSpellProto(),2,(*i)->GetSpellProto()->EffectBasePoints[2],this);
- basepoints0 = value2 * GetMaxPower(POWER_MANA) / 100;
- }
- }
- if ( basepoints0 == 0 )
- return false;
- trigger_spell_id = 18371;
- }
- break;
- }
- //=====================================================================
- // Priest
- //=====================================================================
- // Greater Heal Refund trigger = 18350
- // Blessed Recovery (Rank 1-3) trigger = 18350
- // Shadowguard (1-7) trigger = 28376
- //=====================================================================
- case SPELLFAMILY_PRIEST:
- {
- // Greater Heal Refund
- if (auraSpellInfo->Id==37594)
- trigger_spell_id = 37595;
- // Shadowguard
- else if(auraSpellInfo->SpellFamilyFlags==0x100080000000LL && auraSpellInfo->SpellVisual==7958)
- {
- switch(auraSpellInfo->Id)
- {
- case 18137: trigger_spell_id = 28377; break; // Rank 1
- case 19308: trigger_spell_id = 28378; break; // Rank 2
- case 19309: trigger_spell_id = 28379; break; // Rank 3
- case 19310: trigger_spell_id = 28380; break; // Rank 4
- case 19311: trigger_spell_id = 28381; break; // Rank 5
- case 19312: trigger_spell_id = 28382; break; // Rank 6
- case 25477: trigger_spell_id = 28385; break; // Rank 7
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in SG", auraSpellInfo->Id);
- return false;
- }
- }
- // Blessed Recovery
- else if (auraSpellInfo->SpellIconID == 1875)
- {
- switch (auraSpellInfo->Id)
- {
- case 27811: trigger_spell_id = 27813; break;
- case 27815: trigger_spell_id = 27817; break;
- case 27816: trigger_spell_id = 27818; break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in BR", auraSpellInfo->Id);
- return false;
- }
- basepoints0 = damage * triggerAmount / 100 / 3;
- target = this;
- }
- break;
- }
- //=====================================================================
- // Druid
- // ====================================================================
- // Druid Forms Trinket trigger = 18350
- // Entangling Roots trigger = 30023
- // Leader of the Pack trigger = 18350
- //=====================================================================
- case SPELLFAMILY_DRUID:
- {
- // Druid Forms Trinket
- if (auraSpellInfo->Id==37336)
- {
- switch(m_form)
- {
- case 0: trigger_spell_id = 37344;break;
- case FORM_CAT: trigger_spell_id = 37341;break;
- case FORM_BEAR:
- case FORM_DIREBEAR: trigger_spell_id = 37340;break;
- case FORM_TREE: trigger_spell_id = 37342;break;
- case FORM_MOONKIN: trigger_spell_id = 37343;break;
- default:
- return false;
- }
- }
-// else if (auraSpellInfo->Id==40363)// Entangling Roots ()
-// trigger_spell_id = ????;
- // Leader of the Pack
- else if (auraSpellInfo->Id == 24932)
- {
- if (triggerAmount == 0)
- return false;
- basepoints0 = triggerAmount * GetMaxHealth() / 100;
- trigger_spell_id = 34299;
- }
- break;
- }
- //=====================================================================
- // Hunter
- // ====================================================================
- // ......
- //=====================================================================
- case SPELLFAMILY_HUNTER:
- break;
- //=====================================================================
- // Paladin
- // ====================================================================
- // Blessed Life trigger = 31934
- // Healing Discount trigger = 18350
- // Illumination (Rank 1-5) trigger = 18350
- // Judgement of Light (Rank 1-5) trigger = 5373
- // Judgement of Wisdom (Rank 1-4) trigger = 1826
- // Lightning Capacitor trigger = 18350
- //=====================================================================
- case SPELLFAMILY_PALADIN:
- {
- /* // Blessed Life
- if (auraSpellInfo->SpellIconID == 2137)
- {
- switch (auraSpellInfo->Id)
- {
- case 31828: // Rank 1
- case 31829: // Rank 2
- case 31830: // Rank 3
+ default:
break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Blessed Life", auraSpellInfo->Id);
- return false;
- }
- }*/
- // Healing Discount
- if (auraSpellInfo->Id==37705)
- {
- trigger_spell_id = 37706;
- target = this;
- }
- // Judgement of Light and Judgement of Wisdom
- else if (auraSpellInfo->SpellFamilyFlags & 0x0000000000080000LL)
- {
- switch (auraSpellInfo->Id)
- {
- // Judgement of Light
- case 20185: trigger_spell_id = 20267;break; // Rank 1
- case 20344: trigger_spell_id = 20341;break; // Rank 2
- case 20345: trigger_spell_id = 20342;break; // Rank 3
- case 20346: trigger_spell_id = 20343;break; // Rank 4
- case 27162: trigger_spell_id = 27163;break; // Rank 5
- // Judgement of Wisdom
- case 20186: trigger_spell_id = 20268;break; // Rank 1
- case 20354: trigger_spell_id = 20352;break; // Rank 2
- case 20355: trigger_spell_id = 20353;break; // Rank 3
- case 27164: trigger_spell_id = 27165;break; // Rank 4
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Judgement of Light/Wisdom", auraSpellInfo->Id);
- return false;
- }
- pVictim->CastSpell(pVictim, trigger_spell_id, true, castItem, triggeredByAura);
- return true; // no hidden cooldown
- }
- // Illumination
- else if (auraSpellInfo->SpellIconID==241)
- {
- if(!procSpell)
- return false;
- // procspell is triggered spell but we need mana cost of original casted spell
- uint32 originalSpellId = procSpell->Id;
- // Holy Shock
- if(procSpell->SpellFamilyFlags & 0x00200000)
- {
- switch(procSpell->Id)
- {
- case 25914: originalSpellId = 20473; break;
- case 25913: originalSpellId = 20929; break;
- case 25903: originalSpellId = 20930; break;
- case 27175: originalSpellId = 27174; break;
- case 33074: originalSpellId = 33072; break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in HShock",procSpell->Id);
- return false;
- }
- }
- SpellEntry const *originalSpell = sSpellStore.LookupEntry(originalSpellId);
- if(!originalSpell)
- {
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u unknown but selected as original in Illu",originalSpellId);
- return false;
- }
- // percent stored in effect 1 (class scripts) base points
- basepoints0 = originalSpell->manaCost*(auraSpellInfo->EffectBasePoints[1]+1)/100;
- trigger_spell_id = 20272;
- target = this;
- }
- // Lightning Capacitor
- else if (auraSpellInfo->Id==37657)
- {
- if(!pVictim || !pVictim->isAlive())
- return false;
- // stacking
- CastSpell(this, 37658, true, NULL, triggeredByAura);
- // counting
- Aura * dummy = GetDummyAura(37658);
- if (!dummy)
- return false;
- // release at 3 aura in stack (cont contain in basepoint of trigger aura)
- if(dummy->GetStackAmount() <= 2)
- return false;
-
- RemoveAurasDueToSpell(37658);
- trigger_spell_id = 37661;
- target = pVictim;
- }
- break;
- }
- //=====================================================================
- // Shaman
- //====================================================================
- // Lightning Shield trigger = 18350
- // Mana Surge trigger = 18350
- // Nature's Guardian (Rank 1-5) trigger = 18350
- //=====================================================================
- case SPELLFAMILY_SHAMAN:
- {
- //Lightning Shield (overwrite non existing triggered spell call in spell.dbc
- if(auraSpellInfo->SpellFamilyFlags==0x00000400 && auraSpellInfo->SpellVisual==37)
- {
- switch(auraSpellInfo->Id)
- {
- case 324: trigger_spell_id = 26364; break; // Rank 1
- case 325: trigger_spell_id = 26365; break; // Rank 2
- case 905: trigger_spell_id = 26366; break; // Rank 3
- case 945: trigger_spell_id = 26367; break; // Rank 4
- case 8134: trigger_spell_id = 26369; break; // Rank 5
- case 10431: trigger_spell_id = 26370; break; // Rank 6
- case 10432: trigger_spell_id = 26363; break; // Rank 7
- case 25469: trigger_spell_id = 26371; break; // Rank 8
- case 25472: trigger_spell_id = 26372; break; // Rank 9
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u not handled in LShield", auraSpellInfo->Id);
- return false;
- }
- }
- // Lightning Shield (The Ten Storms set)
- else if (auraSpellInfo->Id == 23551)
- {
- trigger_spell_id = 23552;
- target = pVictim;
- }
- // Damage from Lightning Shield (The Ten Storms set)
- else if (auraSpellInfo->Id == 23552)
- trigger_spell_id = 27635;
- // Mana Surge (The Earthfury set)
- else if (auraSpellInfo->Id == 23572)
- {
- if(!procSpell)
- return false;
- basepoints0 = procSpell->manaCost * 35 / 100;
- trigger_spell_id = 23571;
- target = this;
- }
- else if (auraSpellInfo->SpellIconID == 2013) //Nature's Guardian
- {
- // Check health condition - should drop to less 30% (damage deal after this!)
- if (!(10*(int32(GetHealth() - damage)) < 3 * GetMaxHealth()))
- return false;
-
- if(pVictim && pVictim->isAlive())
- pVictim->getThreatManager().modifyThreatPercent(this,-10);
-
- basepoints0 = triggerAmount * GetMaxHealth() / 100;
- trigger_spell_id = 31616;
- target = this;
- }
- break;
- }
- // default
- default:
- break;
+ }
}
// All ok. Check current trigger spell
@@ -7737,6 +6906,15 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
return false;
break;
}
+ // Rapid Recuperation
+ case 53228:
+ case 53232:
+ {
+ // This effect only from Rapid Fire (ability cast)
+ if (!(procSpell->SpellFamilyFlags[0] & 0x20))
+ return false;
+ break;
+ }
}
// Costum basepoints/target for exist spell
@@ -7766,11 +6944,16 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
// Need add combopoint AFTER finish movie (or they dropped in finish phase)
break;
}
+ // Bloodthirst (($m/100)% of max health)
+ case 23880:
+ {
+ basepoints0 = int32(GetMaxHealth() * triggerAmount / 100);
+ break;
+ }
// Shamanistic Rage triggered spell
case 30824:
{
basepoints0 = int32(GetTotalAttackPowerValue(BASE_ATTACK) * triggerAmount / 100);
- trigger_spell_id = 30824;
break;
}
// Enlightenment (trigger only from mana cost spells)
@@ -7780,6 +6963,59 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
return false;
break;
}
+ // Brain Freeze
+ case 57761:
+ {
+ if(!procSpell)
+ return false;
+ // For trigger from Blizzard need exist Improved Blizzard
+ if (procSpell->SpellFamilyName==SPELLFAMILY_MAGE && procSpell->SpellFamilyFlags[0] & 0x80)
+ {
+ bool found = false;
+ AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
+ for(AuraList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
+ {
+ int32 script = (*i)->GetModifier()->m_miscvalue;
+ if(script==836 || script==988 || script==989)
+ {
+ found=true;
+ break;
+ }
+ }
+ if(!found)
+ return false;
+ }
+ break;
+ }
+ // Astral Shift
+ case 52179:
+ {
+ if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == pVictim)
+ return false;
+
+ // Need stun, fear or silence mechanic
+ if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_SILENCE)|(1<<MECHANIC_STUN)|(1<<MECHANIC_FEAR))))
+ return false;
+ break;
+ }
+ // Burning Determination
+ case 54748:
+ {
+ if(!procSpell)
+ return false;
+ // Need Interrupt or Silenced mechanic
+ if (!(GetAllSpellMechanicMask(procSpell) & ((1<<MECHANIC_INTERRUPT)|(1<<MECHANIC_SILENCE))))
+ return false;
+ break;
+ }
+ // Lock and Load
+ case 56453:
+ {
+ // Proc only from trap activation (from periodic proc another aura of this spell)
+ if (!(procFlags & PROC_FLAG_ON_TRAP_ACTIVATION) || !roll_chance_i(triggerAmount))
+ return false;
+ break;
+ }
}
if( cooldown && GetTypeId()==TYPEID_PLAYER && ((Player*)this)->HasSpellCooldown(trigger_spell_id))
@@ -7806,7 +7042,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
return true;
}
-bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura *triggeredByAura, SpellEntry const *procSpell, uint32 cooldown)
+bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, uint32 damage, Aura *triggeredByAura, SpellEntry const *procSpell, uint32 cooldown)
{
int32 scriptId = triggeredByAura->GetModifier()->m_miscvalue;
@@ -7822,21 +7058,21 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura *triggeredByAur
{
case 836: // Improved Blizzard (Rank 1)
{
- if (!procSpell || procSpell->SpellVisual!=9487)
+ if (!procSpell || procSpell->SpellVisual[0]!=9487)
return false;
triggered_spell_id = 12484;
break;
}
case 988: // Improved Blizzard (Rank 2)
{
- if (!procSpell || procSpell->SpellVisual!=9487)
+ if (!procSpell || procSpell->SpellVisual[0]!=9487)
return false;
triggered_spell_id = 12485;
break;
}
case 989: // Improved Blizzard (Rank 3)
{
- if (!procSpell || procSpell->SpellVisual!=9487)
+ if (!procSpell || procSpell->SpellVisual[0]!=9487)
return false;
triggered_spell_id = 12486;
break;
@@ -7873,6 +7109,16 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura *triggeredByAur
case 5497: // Improved Mana Gems (Serpent-Coil Braid)
triggered_spell_id = 37445; // Mana Surge
break;
+ case 8152: // Serendipity
+ {
+ // if heal your target over maximum health
+ if (pVictim->GetHealth() + damage < pVictim->GetMaxHealth())
+ return false;
+ int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100;
+ int32 basepoints0 = cost * triggeredByAura->GetModifier()->m_amount/100;
+ CastCustomSpell(this, 47762, &basepoints0, 0, 0, true, 0, triggeredByAura);
+ return true;
+ }
}
// not processed
@@ -7964,6 +7210,8 @@ FactionTemplateEntry const* Unit::getFactionTemplateEntry() const
bool Unit::IsHostileTo(Unit const* unit) const
{
+ if(!unit)
+ return false;
// always non-hostile to self
if(unit==this)
return false;
@@ -8014,11 +7262,11 @@ bool Unit::IsHostileTo(Unit const* unit) const
return false;
// Sanctuary
- if(pTarget->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY) && pTester->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY))
+ if(pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY) && pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))
return false;
// PvP FFA state
- if(pTester->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP) && pTarget->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP))
+ if(pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) && pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))
return true;
//= PvP states
@@ -8123,11 +7371,11 @@ bool Unit::IsFriendlyTo(Unit const* unit) const
return true;
// Sanctuary
- if(pTarget->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY) && pTester->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_SANCTUARY))
+ if(pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY) && pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY))
return true;
// PvP FFA state
- if(pTester->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP) && pTarget->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP))
+ if(pTester->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP) && pTarget->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP))
return false;
//= PvP states
@@ -8256,6 +7504,11 @@ bool Unit::Attack(Unit *victim, bool meleeAttack)
if(meleeAttack)
addUnitState(UNIT_STAT_MELEE_ATTACKING);
+
+ // set position before any AI calls/assistance
+ //if(GetTypeId()==TYPEID_UNIT)
+ // ((Creature*)this)->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
+
m_attacking = victim;
m_attacking->_addAttacker(this);
@@ -8264,18 +7517,18 @@ bool Unit::Attack(Unit *victim, bool meleeAttack)
if(GetTypeId()==TYPEID_UNIT)
{
+ // should not let player enter combat by right clicking target
+ SetInCombatWith(victim);
+ if(victim->GetTypeId() == TYPEID_PLAYER)
+ victim->SetInCombatWith(this);
+ AddThreat(victim, 0.0f);
+
WorldPacket data(SMSG_AI_REACTION, 12);
data << uint64(GetGUID());
data << uint32(AI_REACTION_AGGRO); // Aggro sound
((WorldObject*)this)->SendMessageToSet(&data, true);
((Creature*)this)->CallAssistance();
-
- // should not let player enter combat by right clicking target
- SetInCombatWith(victim);
- if(victim->GetTypeId() == TYPEID_PLAYER)
- victim->SetInCombatWith(this);
- AddThreat(victim, 0.0f);
}
// delay offhand weapon attack to next attack time
@@ -8385,51 +7638,7 @@ void Unit::RemoveAllAttackers()
void Unit::ModifyAuraState(AuraState flag, bool apply)
{
- if (apply)
- {
- if (!HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1)))
- {
- SetFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1));
- if(GetTypeId() == TYPEID_PLAYER)
- {
- const PlayerSpellMap& sp_list = ((Player*)this)->GetSpellMap();
- for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
- {
- if(itr->second->state == PLAYERSPELL_REMOVED) continue;
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first);
- if (!spellInfo || !IsPassiveSpell(itr->first)) continue;
- if (spellInfo->CasterAuraState == flag)
- CastSpell(this, itr->first, true, NULL);
- }
- }
- }
- }
- else
- {
- if (HasFlag(UNIT_FIELD_AURASTATE,1<<(flag-1)))
- {
- RemoveFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1));
- Unit::AuraMap& tAuras = GetAuras();
- for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end();)
- {
- SpellEntry const* spellProto = (*itr).second->GetSpellProto();
- if (spellProto->CasterAuraState == flag)
- {
- // exceptions (applied at state but not removed at state change)
- // Rampage
- if(spellProto->SpellIconID==2006 && spellProto->SpellFamilyName==SPELLFAMILY_WARRIOR && spellProto->SpellFamilyFlags==0x100000)
- {
- ++itr;
- continue;
- }
-
- RemoveAura(itr);
- }
- else
- ++itr;
- }
- }
- }
+ ApplyModFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1), apply);
}
Unit *Unit::GetOwner() const
@@ -8479,6 +7688,7 @@ Unit* Unit::GetCharm() const
sLog.outError("Unit::GetCharm: Charmed creature %u not exist.",GUID_LOPART(charm_guid));
const_cast<Unit*>(this)->SetCharm(0);
+ //const_cast<Unit*>(this)->SetMover(0);
}
return NULL;
@@ -8500,6 +7710,59 @@ void Unit::SetCharm(Unit* pet)
SetUInt64Value(UNIT_FIELD_CHARM, pet ? pet->GetGUID() : 0);
}
+Unit* Unit::GetNextRandomRaidMemberOrPet(float radius)
+{
+ Player* player = NULL;
+ if(GetTypeId() == TYPEID_PLAYER)
+ player = (Player*)this;
+ // Should we enable this also for charmed units?
+ else if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->isPet())
+ player=(Player*)GetOwner();
+
+ if (!player)
+ return NULL;
+ Group *pGroup = player->GetGroup();
+ //When there is no group check pet presence
+ if (!pGroup)
+ {
+ // We are pet now, return owner
+ if(player!=this)
+ return IsWithinDistInMap(player, radius) ? player : NULL;
+ Unit * pet = GetPet();
+ //No pet, no group, nothing to return
+ if (!pet)
+ return NULL;
+ // We are owner now, return pet
+ return IsWithinDistInMap(pet, radius) ? pet : NULL;
+ }
+
+ std::vector<Unit*> nearMembers;
+ //reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
+ nearMembers.reserve(pGroup->GetMembersCount()*2);
+
+ for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* Target = itr->getSource();
+
+ // IsHostileTo check duel and controlled by enemy
+ if( Target && Target !=this && Target->isAlive() && IsWithinDistInMap(Target, radius) &&
+ !IsHostileTo(Target) )
+ nearMembers.push_back(Target);
+
+ // Push player's pet to vector
+ Unit * pet = Target->GetPet();
+ if (pet && pet !=this && pet->isAlive() && IsWithinDistInMap(pet, radius) &&
+ !IsHostileTo(pet) )
+ nearMembers.push_back(pet);
+ }
+
+ if (nearMembers.empty())
+ return NULL;
+
+ uint32 randTarget = urand(0,nearMembers.size()-1);
+ return nearMembers[randTarget];
+}
+
void Unit::AddPlayerToVision(Player* plr)
{
setActive(true);
@@ -8551,6 +7814,7 @@ void Unit::SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, bool c
data.append(GetPackGUID());
data << uint32(SpellID);
data << uint32(Damage);
+ data << uint32(0); // over healing?
data << uint8(critical ? 1 : 0);
data << uint8(0); // unused in client?
SendMessageToSet(&data, true);
@@ -8567,76 +7831,29 @@ void Unit::SendEnergizeSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, Po
SendMessageToSet(&data, true);
}
-uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 pdamage, DamageEffectType damagetype)
+uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack)
{
if(!spellProto || !pVictim || damagetype==DIRECT_DAMAGE )
return pdamage;
- //if(spellProto->SchoolMask == SPELL_SCHOOL_MASK_NORMAL)
- // return pdamage;
- //damage = CalcArmorReducedDamage(pVictim, damage);
-
- int32 BonusDamage = 0;
- if( GetTypeId()==TYPEID_UNIT )
- {
- // Pets just add their bonus damage to their spell damage
- // note that their spell damage is just gain of their own auras
- if (((Creature*)this)->isPet())
- {
- BonusDamage = ((Pet*)this)->GetBonusDamage();
- }
- // For totems get damage bonus from owner (statue isn't totem in fact)
- else if (((Creature*)this)->isTotem() && ((Totem*)this)->GetTotemType()!=TOTEM_STATUE)
- {
- if(Unit* owner = GetOwner())
- return owner->SpellDamageBonus(pVictim, spellProto, pdamage, damagetype);
- }
- }
-
- // Damage Done
- uint32 CastingTime = !IsChanneledSpell(spellProto) ? GetSpellCastTime(spellProto) : GetSpellDuration(spellProto);
-
- // Taken/Done fixed damage bonus auras
- int32 DoneAdvertisedBenefit = SpellBaseDamageBonus(GetSpellSchoolMask(spellProto))+BonusDamage;
- int32 TakenAdvertisedBenefit = SpellBaseDamageBonusForVictim(GetSpellSchoolMask(spellProto), pVictim);
-
- // Damage over Time spells bonus calculation
- float DotFactor = 1.0f;
- if(damagetype == DOT)
+ // For totems get damage bonus from owner (statue isn't totem in fact)
+ if( GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isTotem() && ((Totem*)this)->GetTotemType()!=TOTEM_STATUE)
{
- int32 DotDuration = GetSpellDuration(spellProto);
- // 200% limit
- if(DotDuration > 0)
- {
- if(DotDuration > 30000) DotDuration = 30000;
- if(!IsChanneledSpell(spellProto)) DotFactor = DotDuration / 15000.0f;
- int x = 0;
- for(int j = 0; j < 3; j++)
- {
- if( spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && (
- spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_DAMAGE ||
- spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH) )
- {
- x = j;
- break;
- }
- }
- int DotTicks = 6;
- if(spellProto->EffectAmplitude[x] != 0)
- DotTicks = DotDuration / spellProto->EffectAmplitude[x];
- if(DotTicks)
- {
- DoneAdvertisedBenefit /= DotTicks;
- TakenAdvertisedBenefit /= DotTicks;
- }
- }
+ if(Unit* owner = GetOwner())
+ return owner->SpellDamageBonus(pVictim, spellProto, pdamage, damagetype);
}
// Taken/Done total percent damage auras
float DoneTotalMod = 1.0f;
float TakenTotalMod = 1.0f;
+ int32 DoneTotal = 0;
+ int32 TakenTotal = 0;
// ..done
+ // Pet damage
+ if( GetTypeId() == TYPEID_UNIT && !((Creature*)this)->isPet() )
+ DoneTotalMod *= ((Creature*)this)->GetSpellDamageMod(((Creature*)this)->GetCreatureInfo()->rank);
+
AuraList const& mModDamagePercentDone = GetAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
for(AuraList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
{
@@ -8646,84 +7863,133 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
(*i)->GetSpellProto()->EquippedItemInventoryTypeMask == 0 )
// 0 == any inventory type (not wand then)
{
- DoneTotalMod *= ((*i)->GetModifierValue() +100.0f)/100.0f;
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
}
}
uint32 creatureTypeMask = pVictim->GetCreatureTypeMask();
+ // Add flat bonus from spell damage versus
+ DoneTotal += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, creatureTypeMask);
AuraList const& mDamageDoneVersus = GetAurasByType(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS);
for(AuraList::const_iterator i = mDamageDoneVersus.begin();i != mDamageDoneVersus.end(); ++i)
if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- DoneTotalMod *= ((*i)->GetModifierValue() +100.0f)/100.0f;
-
- // ..taken
- AuraList const& mModDamagePercentTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
- for(AuraList::const_iterator i = mModDamagePercentTaken.begin(); i != mModDamagePercentTaken.end(); ++i)
- if( (*i)->GetModifier()->m_miscvalue & GetSpellSchoolMask(spellProto) )
- TakenTotalMod *= ((*i)->GetModifierValue() +100.0f)/100.0f;
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
- // .. taken pct: scripted (increases damage of * against targets *)
- AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
+ // done scripted mod (take it from owner)
+ Unit *owner = GetOwner();
+ if (!owner) owner = this;
+ AuraList const& mOverrideClassScript= owner->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
for(AuraList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
{
+ if (!(*i)->isAffectedOnSpell(spellProto))
+ continue;
switch((*i)->GetModifier()->m_miscvalue)
{
- //Molten Fury
- case 4920: case 4919:
- if(pVictim->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))
- TakenTotalMod *= (100.0f+(*i)->GetModifier()->m_amount)/100.0f; break;
- }
- }
-
- // .. taken pct: dummy auras
- AuraList const& mDummyAuras = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
- for(AuraList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
- {
- switch((*i)->GetSpellProto()->SpellIconID)
- {
- //Cheat Death
- case 2109:
- if( ((*i)->GetModifier()->m_miscvalue & GetSpellSchoolMask(spellProto)) )
- {
- if(pVictim->GetTypeId() != TYPEID_PLAYER)
- continue;
- float mod = -((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_SPELL)*2*4;
- if (mod < (*i)->GetModifier()->m_amount)
- mod = (*i)->GetModifier()->m_amount;
- TakenTotalMod *= (mod+100.0f)/100.0f;
- }
+ case 4920: // Molten Fury
+ case 4919:
+ case 6917: // Death's Embrace
+ case 6926:
+ case 6928:
+ {
+ if(pVictim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))
+ DoneTotalMod *= (100.0f+(*i)->GetModifier()->m_amount)/100.0f;
break;
- //This is changed in WLK, using aura 255
- //Mangle
- case 2312:
- case 44955:
- for(int j=0;j<3;j++)
- {
- if(GetEffectMechanic(spellProto, j)==MECHANIC_BLEED)
+ }
+ // Soul Siphon
+ case 4992:
+ case 4993:
+ {
+ // effect 1 m_amount
+ int32 maxPercent = (*i)->GetModifier()->m_amount;
+ // effect 0 m_amount
+ int32 stepPercent = CalculateSpellDamage((*i)->GetSpellProto(), 0, (*i)->GetSpellProto()->EffectBasePoints[0], this);
+ // count affliction effects and calc additional damage in percentage
+ int32 modPercent = 0;
+ AuraMap const& victimAuras = pVictim->GetAuras();
+ for (AuraMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
+ {
+ SpellEntry const* m_spell = itr->second->GetSpellProto();
+ if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
+ continue;
+ modPercent += stepPercent * itr->second->GetStackAmount();
+ if (modPercent >= maxPercent)
{
- TakenTotalMod *= (100.0f+(*i)->GetModifier()->m_amount)/100.0f;
+ modPercent = maxPercent;
break;
}
}
+ DoneTotalMod *= (modPercent+100.0f)/100.0f;
break;
+ }
+ case 6916: // Death's Embrace
+ case 6925:
+ case 6927:
+ if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))
+ DoneTotalMod *= (100.0f+(*i)->GetModifier()->m_amount)/100.0f;
+ break;
+ case 5481: // Starfire Bonus
+ {
+ if (pVictim->GetAura(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ break;
+ }
+ case 4418: // Increased Shock Damage
+ case 4554: // Increased Lightning Damage
+ case 4555: // Improved Moonfire
+ case 5142: // Increased Lightning Damage
+ case 5147: // Improved Consecration / Libram of Resurgence
+ case 5148: // Idol of the Shooting Star
+ case 6008: // Increased Lightning Damage / Totem of Hex
+ {
+ DoneTotal+=(*i)->GetModifier()->m_amount;
+ break;
+ }
+ // Tundra Stalker
+ // Merciless Combat
+ case 7277:
+ {
+ // Merciless Combat
+ if ((*i)->GetSpellProto()->SpellIconID == 2656)
+ {
+ if(pVictim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))
+ DoneTotalMod *= (100.0f+(*i)->GetModifier()->m_amount)/100.0f;
+ }
+ else // Tundra Stalker
+ {
+ if (pVictim->GetAura(SPELL_AURA_DUMMY, SPELLFAMILY_DEATHKNIGHT,0, 0x04000000,0))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ break;
+ }
+ break;
+ }
+ case 7293: // Rage of Rivendare
+ {
+ if (pVictim->GetAura(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0,0x02000000,0))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ break;
+ }
+ // Twisted Faith
+ case 7377:
+ {
+ if (pVictim->GetAura(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x8000, 0,0, GetGUID()))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ break;
+ }
+ // Marked for Death
+ case 7598:
+ case 7599:
+ case 7600:
+ case 7601:
+ case 7602:
+ {
+ if (pVictim->GetAura(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ break;
+ }
}
}
- // Distribute Damage over multiple effects, reduce by AoE
- CastingTime = GetCastingTimeForBonus( spellProto, damagetype, CastingTime );
-
- // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
- for(int j = 0; j < 3; ++j)
- {
- if( spellProto->Effect[j] == SPELL_EFFECT_HEALTH_LEECH ||
- spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH )
- {
- CastingTime /= 2;
- break;
- }
- }
-
- switch(spellProto->SpellFamilyName)
+ /*switch(spellProto->SpellFamilyName)
{
case SPELLFAMILY_GENERIC:
// Siphon Essence - 0%
@@ -8737,7 +8003,7 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
CastingTime = 0;
}
// Darkmoon Card: Vengeance - 0.1%
- else if (spellProto->SpellVisual == 9850 && spellProto->SpellIconID == 2230)
+ else if (spellProto->SpellVisual[0] == 9850 && spellProto->SpellIconID == 2230)
{
CastingTime = 3.5;
}
@@ -8840,21 +8106,10 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
DotFactor = 0.95f;
CastingTime = 3500;
}
- // Seal of Righteousness - 10.2%/9.8% ( based on weapon type ) of Holy Damage, multiplied by weapon speed
- else if((spellProto->SpellFamilyFlags & 0x8000000LL) && spellProto->SpellIconID == 25)
- {
- Item *item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
- float wspeed = GetAttackTime(BASE_ATTACK)/1000.0f;
-
- if( item && item->GetProto()->InventoryType == INVTYPE_2HWEAPON)
- CastingTime = uint32(wspeed*3500*0.102f);
- else
- CastingTime = uint32(wspeed*3500*0.098f);
- }
- // Judgement of Righteousness - 73%
- else if ((spellProto->SpellFamilyFlags & 1024) && spellProto->SpellIconID == 25)
+ // Judgement of Righteousness - 32%
+ else if (spellProto->SpellFamilyFlags & 0x0000000000000400LL)
{
- CastingTime = 2555;
+ CastingTime = 1120;
}
// Seal of Vengeance - 17% per Fully Stacked Tick - 5 Applications
else if ((spellProto->SpellFamilyFlags & 0x80000000000LL) && spellProto->SpellIconID == 2292)
@@ -8872,11 +8127,6 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
{
CastingTime = 0;
}
- // Seal of Righteousness trigger - already computed for parent spell
- else if ( spellProto->SpellFamilyName==SPELLFAMILY_PALADIN && spellProto->SpellIconID==25 && spellProto->AttributesEx4 & 0x00800000LL )
- {
- return pdamage;
- }
break;
case SPELLFAMILY_SHAMAN:
// totem attack
@@ -8930,58 +8180,151 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
{
CastingTime = 500;
}
- break;
- case SPELLFAMILY_DRUID:
- // Hurricane triggered spell
- if((spellProto->SpellFamilyFlags & 0x400000LL) && spellProto->SpellIconID == 220)
- {
- CastingTime = 500;
- }
- break;
- case SPELLFAMILY_WARRIOR:
- case SPELLFAMILY_HUNTER:
- case SPELLFAMILY_ROGUE:
- CastingTime = 0;
- break;
- default:
- break;
- }
+ break;*/
- float LvlPenalty = CalculateLevelPenalty(spellProto);
+ // Custom scripted damage
+ // Ice Lance
+ if (spellProto->SpellFamilyName == SPELLFAMILY_MAGE && spellProto->SpellIconID == 186)
+ {
+ if (pVictim->isFrozen())
+ DoneTotalMod *= 3.0f;
+ }
- // Spellmod SpellDamage
- //float SpellModSpellDamage = 100.0f;
- float CoefficientPtc = DotFactor * 100.0f;
- if(spellProto->SchoolMask != SPELL_SCHOOL_MASK_NORMAL)
- CoefficientPtc *= ((float)CastingTime/3500.0f);
+ // ..taken
+ AuraList const& mModDamagePercentTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
+ for(AuraList::const_iterator i = mModDamagePercentTaken.begin(); i != mModDamagePercentTaken.end(); ++i)
+ if( (*i)->GetModifier()->m_miscvalue & GetSpellSchoolMask(spellProto) )
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
- if(Player* modOwner = GetSpellModOwner())
- //modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_SPELL_BONUS_DAMAGE,SpellModSpellDamage);
- modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_SPELL_BONUS_DAMAGE,CoefficientPtc);
+ // .. taken pct: dummy auras
+ if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ {
+ //Cheat Death
+ if (Aura *dummy = pVictim->GetDummyAura(45182))
+ {
+ float mod = -((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_SPELL)*2*4;
+ if (mod < dummy->GetModifier()->m_amount)
+ mod = dummy->GetModifier()->m_amount;
+ TakenTotalMod *= (mod+100.0f)/100.0f;
+ }
+ }
- //SpellModSpellDamage /= 100.0f;
- CoefficientPtc /= 100.0f;
+ // From caster spells
+ AuraList const& mOwnerTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER);
+ for(AuraList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
+ if( (*i)->GetCasterGUID() == GetGUID() && (*i)->isAffectedOnSpell(spellProto))
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
- //float DoneActualBenefit = DoneAdvertisedBenefit * (CastingTime / 3500.0f) * DotFactor * SpellModSpellDamage * LvlPenalty;
+ // Mod damage from spell mechanic
+ uint32 mechanicMask = GetAllSpellMechanicMask(spellProto);
+ if (mechanicMask)
+ {
+ AuraList const& mDamageDoneMechanic = pVictim->GetAurasByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT);
+ for(AuraList::const_iterator i = mDamageDoneMechanic.begin();i != mDamageDoneMechanic.end(); ++i)
+ if(mechanicMask & uint32(1<<((*i)->GetModifier()->m_miscvalue)))
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ }
- float DoneActualBenefit = DoneAdvertisedBenefit * CoefficientPtc * LvlPenalty;
- float TakenActualBenefit = TakenAdvertisedBenefit * DotFactor * LvlPenalty;
- if(spellProto->SpellFamilyName && spellProto->SchoolMask != SPELL_SCHOOL_MASK_NORMAL)
- TakenActualBenefit *= ((float)CastingTime / 3500.0f);
+ // Taken/Done fixed damage bonus auras
+ int32 DoneAdvertisedBenefit = SpellBaseDamageBonus(GetSpellSchoolMask(spellProto));
+ int32 TakenAdvertisedBenefit = SpellBaseDamageBonusForVictim(GetSpellSchoolMask(spellProto), pVictim);
+ // Pets just add their bonus damage to their spell damage
+ // note that their spell damage is just gain of their own auras
+ if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->isPet())
+ DoneAdvertisedBenefit += ((Pet*)this)->GetBonusDamage();
+
+ // Check for table values
+ float coeff;
+ SpellBonusEntry const* bonus = spellmgr.GetSpellBonusData(spellProto->Id);
+ if (bonus)
+ {
+ if (damagetype == DOT)
+ coeff = bonus->dot_damage;
+ else
+ coeff = bonus->direct_damage;
+ if (bonus->ap_bonus)
+ DoneTotal+=bonus->ap_bonus * GetTotalAttackPowerValue(BASE_ATTACK) * stack;
+ }
+ // Default calculation
+ if (DoneAdvertisedBenefit || TakenAdvertisedBenefit)
+ {
+ if(!bonus)
+ {
+ // Damage Done from spell damage bonus
+ int32 CastingTime = !IsChanneledSpell(spellProto) ? GetSpellCastTime(spellProto) : GetSpellDuration(spellProto);
+ if (IsChanneledSpell(spellProto))
+ ModSpellCastTime(spellProto, CastingTime);
+ // Damage over Time spells bonus calculation
+ float DotFactor = 1.0f;
+ if(damagetype == DOT)
+ {
+ int32 DotDuration = GetSpellDuration(spellProto);
+ //apply casting time mods for channeled spells
+ if (IsChanneledSpell(spellProto))
+ ModSpellCastTime(spellProto, DotDuration);
+ // 200% limit
+ if(DotDuration > 0)
+ {
+ if(DotDuration > 30000) DotDuration = 30000;
+ if(!IsChanneledSpell(spellProto)) DotFactor = DotDuration / 15000.0f;
+ int x = 0;
+ for(int j = 0; j < 3; j++)
+ {
+ if( spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && (
+ spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_DAMAGE ||
+ spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH) )
+ {
+ x = j;
+ break;
+ }
+ }
+ int32 DotTicks = 6;
+ if(spellProto->EffectAmplitude[x] != 0)
+ DotTicks = DotDuration / spellProto->EffectAmplitude[x];
+ if(DotTicks)
+ {
+ DoneAdvertisedBenefit /= DotTicks;
+ TakenAdvertisedBenefit /= DotTicks;
+ }
+ }
+ }
+ // Distribute Damage over multiple effects, reduce by AoE
+ CastingTime = GetCastingTimeForBonus( spellProto, damagetype, CastingTime );
- float tmpDamage = (float(pdamage)+DoneActualBenefit)*DoneTotalMod;
+ // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
+ for(int j = 0; j < 3; ++j)
+ {
+ if( spellProto->Effect[j] == SPELL_EFFECT_HEALTH_LEECH ||
+ spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH )
+ {
+ CastingTime /= 2;
+ break;
+ }
+ }
+ if(spellProto->SchoolMask != SPELL_SCHOOL_MASK_NORMAL)
+ coeff = (CastingTime / 3500.0f) * DotFactor;
+ else
+ coeff = DotFactor;
+ }
- // Add flat bonus from spell damage versus
- tmpDamage += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, creatureTypeMask);
+ float coeff2 = CalculateLevelPenalty(spellProto) * stack;
+ if(spellProto->SpellFamilyName) //TODO: fix this
+ TakenTotal+= TakenAdvertisedBenefit * coeff * coeff2;
+ if(Player* modOwner = GetSpellModOwner())
+ {
+ coeff *= 100.0f;
+ modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_SPELL_BONUS_DAMAGE, coeff);
+ coeff /= 100.0f;
+ }
+ DoneTotal += DoneAdvertisedBenefit * coeff * coeff2;
+ }
- // apply spellmod to Done damage
+ float tmpDamage = (pdamage + DoneTotal) * DoneTotalMod;
+ // apply spellmod to Done damage (flat and pct)
if(Player* modOwner = GetSpellModOwner())
modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
- tmpDamage = (tmpDamage+TakenActualBenefit)*TakenTotalMod;
-
- if( GetTypeId() == TYPEID_UNIT && !((Creature*)this)->isPet() )
- tmpDamage *= ((Creature*)this)->GetSpellDamageMod(((Creature*)this)->GetCreatureInfo()->rank);
+ tmpDamage = (tmpDamage + TakenTotal) * TakenTotalMod;
return tmpDamage > 0 ? uint32(tmpDamage) : 0;
}
@@ -8998,32 +8341,29 @@ int32 Unit::SpellBaseDamageBonus(SpellSchoolMask schoolMask)
// -1 == any item class (not wand then)
(*i)->GetSpellProto()->EquippedItemInventoryTypeMask == 0 )
// 0 == any inventory type (not wand then)
- DoneAdvertisedBenefit += (*i)->GetModifierValue();
+ DoneAdvertisedBenefit += (*i)->GetModifier()->m_amount;
if (GetTypeId() == TYPEID_PLAYER)
{
+ // Base value
+ DoneAdvertisedBenefit +=((Player*)this)->GetBaseSpellDamageBonus();
+
// Damage bonus from stats
AuraList const& mDamageDoneOfStatPercent = GetAurasByType(SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT);
for(AuraList::const_iterator i = mDamageDoneOfStatPercent.begin();i != mDamageDoneOfStatPercent.end(); ++i)
{
if((*i)->GetModifier()->m_miscvalue & schoolMask)
{
- SpellEntry const* iSpellProto = (*i)->GetSpellProto();
- uint8 eff = (*i)->GetEffIndex();
-
- // stat used dependent from next effect aura SPELL_AURA_MOD_SPELL_HEALING presence and misc value (stat index)
- Stats usedStat = STAT_INTELLECT;
- if(eff < 2 && iSpellProto->EffectApplyAuraName[eff+1]==SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT)
- usedStat = Stats(iSpellProto->EffectMiscValue[eff+1]);
-
- DoneAdvertisedBenefit += int32(GetStat(usedStat) * (*i)->GetModifierValue() / 100.0f);
+ // stat used stored in miscValueB for this aura
+ Stats usedStat = Stats((*i)->GetMiscBValue());
+ DoneAdvertisedBenefit += int32(GetStat(usedStat) * (*i)->GetModifier()->m_amount / 100.0f);
}
}
// ... and attack power
AuraList const& mDamageDonebyAP = GetAurasByType(SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER);
for(AuraList::const_iterator i =mDamageDonebyAP.begin();i != mDamageDonebyAP.end(); ++i)
if ((*i)->GetModifier()->m_miscvalue & schoolMask)
- DoneAdvertisedBenefit += int32(GetTotalAttackPowerValue(BASE_ATTACK) * (*i)->GetModifierValue() / 100.0f);
+ DoneAdvertisedBenefit += int32(GetTotalAttackPowerValue(BASE_ATTACK) * (*i)->GetModifier()->m_amount / 100.0f);
}
return DoneAdvertisedBenefit;
@@ -9038,13 +8378,13 @@ int32 Unit::SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit *pVic
AuraList const& mDamageDoneCreature = GetAurasByType(SPELL_AURA_MOD_DAMAGE_DONE_CREATURE);
for(AuraList::const_iterator i = mDamageDoneCreature.begin();i != mDamageDoneCreature.end(); ++i)
if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- TakenAdvertisedBenefit += (*i)->GetModifierValue();
+ TakenAdvertisedBenefit += (*i)->GetModifier()->m_amount;
// ..taken
AuraList const& mDamageTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_DAMAGE_TAKEN);
for(AuraList::const_iterator i = mDamageTaken.begin();i != mDamageTaken.end(); ++i)
if(((*i)->GetModifier()->m_miscvalue & schoolMask) != 0)
- TakenAdvertisedBenefit += (*i)->GetModifierValue();
+ TakenAdvertisedBenefit += (*i)->GetModifier()->m_amount;
return TakenAdvertisedBenefit;
}
@@ -9073,30 +8413,77 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
crit_chance += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, schoolMask);
}
// taken
- if (pVictim && !IsPositiveSpell(spellProto->Id))
- {
- // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
- crit_chance += pVictim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, schoolMask);
- // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
- crit_chance += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
- // Modify by player victim resilience
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- crit_chance -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_SPELL);
+ if (pVictim)
+ {
+ if (!IsPositiveSpell(spellProto->Id))
+ {
+ // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
+ crit_chance += pVictim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, schoolMask);
+ // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
+ crit_chance += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
+ // Modify by player victim resilience
+ if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ crit_chance -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_SPELL);
+ }
+
// scripted (increase crit chance ... against ... target by x%
- if(pVictim->isFrozen()) // Shatter
+ AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
+ for(AuraList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
{
- AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- for(AuraList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
+ if (!((*i)->isAffectedOnSpell(spellProto)))
+ continue;
+ switch((*i)->GetModifier()->m_miscvalue)
{
- switch((*i)->GetModifier()->m_miscvalue)
+ case 849: if (pVictim->isFrozen()) crit_chance+= 17.0f; break; //Shatter Rank 1
+ case 910: if (pVictim->isFrozen()) crit_chance+= 34.0f; break; //Shatter Rank 2
+ case 911: if (pVictim->isFrozen()) crit_chance+= 50.0f; break; //Shatter Rank 3
+ case 7917: // Glyph of Shadowburn
+ if (pVictim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))
+ crit_chance+=(*i)->GetModifier()->m_amount;
+ break;
+ case 7997: // Renewed Hope
+ case 7998:
+ if (pVictim->HasAura(6788))
+ crit_chance+=(*i)->GetModifier()->m_amount;
+ break;
+ case 21: // Test of Faith
+ case 6935:
+ case 6918:
+ if (pVictim->GetHealth() < pVictim->GetMaxHealth()/2)
+ crit_chance+=(*i)->GetModifier()->m_amount;
+ break;
+ default:
+ break;
+ }
+ }
+ // Custom crit by class
+ switch(spellProto->SpellFamilyName)
+ {
+ case SPELLFAMILY_PALADIN:
+ // Sacred Shield
+ if (spellProto->SpellFamilyFlags[0] & 0x40000000)
{
- case 849: crit_chance+= 10.0f; break; //Shatter Rank 1
- case 910: crit_chance+= 20.0f; break; //Shatter Rank 2
- case 911: crit_chance+= 30.0f; break; //Shatter Rank 3
- case 912: crit_chance+= 40.0f; break; //Shatter Rank 4
- case 913: crit_chance+= 50.0f; break; //Shatter Rank 5
+ Aura *aura = pVictim->GetDummyAura(58597);
+ if (aura && aura->GetCasterGUID() == GetGUID())
+ crit_chance+=aura->GetModifier()->m_amount;
+ break;
}
- }
+ break;
+ case SPELLFAMILY_SHAMAN:
+ // Lava Burst
+ if (spellProto->SpellFamilyFlags[1] & 0x00001000)
+ {
+ if (Aura *flameShock = pVictim->GetAura(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 10000000, 0,0, GetGUID()))
+ {
+ // Consume shock aura if not have Glyph of Flame Shock
+ if (!GetAura(55447, 0))
+ pVictim->RemoveAurasByCasterSpell(flameShock->GetId(), GetGUID());
+ return true;
+ }
+ break;
+ }
+ break;
+
}
}
break;
@@ -9107,7 +8494,6 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
if (pVictim)
{
crit_chance = GetUnitCriticalChance(attackType, pVictim);
- crit_chance+= (int32(GetMaxSkillValueForLevel(pVictim)) - int32(pVictim->GetDefenseSkillValue(this))) * 0.04f;
crit_chance+= GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, schoolMask);
}
break;
@@ -9126,7 +8512,7 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
return false;
}
-uint32 Unit::SpellCriticalBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim)
+uint32 Unit::SpellCriticalDamageBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim)
{
// Calculate critical bonus
int32 crit_bonus;
@@ -9158,15 +8544,49 @@ uint32 Unit::SpellCriticalBonus(SpellEntry const *spellProto, uint32 damage, Uni
return damage;
}
-uint32 Unit::SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, Unit *pVictim)
+uint32 Unit::SpellCriticalHealingBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim)
+{
+ // Calculate critical bonus
+ int32 crit_bonus;
+ switch(spellProto->DmgClass)
+ {
+ case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
+ case SPELL_DAMAGE_CLASS_RANGED:
+ // TODO: write here full calculation for melee/ranged spells
+ crit_bonus = damage;
+ break;
+ default:
+ crit_bonus = damage / 2; // for spells is 50%
+ break;
+ }
+
+
+ if(pVictim)
+ {
+ uint32 creatureTypeMask = pVictim->GetCreatureTypeMask();
+ crit_bonus = int32(crit_bonus * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
+ }
+
+ if(crit_bonus > 0)
+ damage += crit_bonus;
+
+ damage = int32(float(damage) * GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
+
+ return damage;
+}
+
+uint32 Unit::SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack)
{
+ // No heal amount for this class spells
+ if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
+ return healamount;
+
// For totems get healing bonus from owner (statue isn't totem in fact)
if( GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isTotem() && ((Totem*)this)->GetTotemType()!=TOTEM_STATUE)
if(Unit* owner = GetOwner())
- return owner->SpellHealingBonus(spellProto, healamount, damagetype, pVictim);
-
- // Healing Done
+ return owner->SpellHealingBonus(pVictim, spellProto, healamount, damagetype, stack);
+ // TODO: to be deleted
// These Spells are doing fixed amount of healing (TODO found less hack-like check)
if (spellProto->Id == 15290 || spellProto->Id == 39373 ||
spellProto->Id == 33778 || spellProto->Id == 379 ||
@@ -9175,86 +8595,91 @@ uint32 Unit::SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount,
spellProto->Id == 34299)
return healamount;
- int32 AdvertisedBenefit = SpellBaseHealingBonus(GetSpellSchoolMask(spellProto));
- uint32 CastingTime = GetSpellCastTime(spellProto);
+ // Healing Done
+ // Taken/Done total percent damage auras
+ float DoneTotalMod = 1.0f;
+ float TakenTotalMod = 1.0f;
+ int32 DoneTotal = 0;
+ int32 TakenTotal = 0;
- // Healing Taken
- AdvertisedBenefit += SpellBaseHealingBonusForVictim(GetSpellSchoolMask(spellProto), pVictim);
+ // Healing done percent
+ AuraList const& mHealingDonePct = GetAurasByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
+ for(AuraList::const_iterator i = mHealingDonePct.begin();i != mHealingDonePct.end(); ++i)
+ DoneTotalMod *= (100.0f + (*i)->GetModifier()->m_amount) / 100.0f;
- // Blessing of Light dummy effects healing taken from Holy Light and Flash of Light
- if (spellProto->SpellFamilyName == SPELLFAMILY_PALADIN && (spellProto->SpellFamilyFlags & 0x00000000C0000000LL))
+ // done scripted mod (take it from owner)
+ Unit *owner = GetOwner();
+ if (!owner) owner = this;
+ AuraList const& mOverrideClassScript= owner->GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
+ for(AuraList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
{
- AuraList const& mDummyAuras = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
- for(AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
+ if (!(*i)->isAffectedOnSpell(spellProto))
+ continue;
+ switch((*i)->GetModifier()->m_miscvalue)
{
- if((*i)->GetSpellProto()->SpellVisual == 9180)
+ case 4415: // Increased Rejuvenation Healing
+ case 4953:
+ case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
+ DoneTotal+=(*i)->GetModifier()->m_amount;
+ break;
+ case 7997: // Renewed Hope
+ case 7998:
+ if (pVictim->HasAura(6788))
+ DoneTotalMod *=((*i)->GetModifier()->m_amount + 100.0f)/100.0f;
+ break;
+ case 21: // Test of Faith
+ case 6935:
+ case 6918:
+ if (pVictim->GetHealth() < pVictim->GetMaxHealth()/2)
+ DoneTotalMod *=((*i)->GetModifier()->m_amount + 100.0f)/100.0f;
+ break;
+ case 7798: // Glyph of Regrowth
{
- // Flash of Light
- if ((spellProto->SpellFamilyFlags & 0x0000000040000000LL) && (*i)->GetEffIndex() == 1)
- AdvertisedBenefit += (*i)->GetModifier()->m_amount;
- // Holy Light
- else if ((spellProto->SpellFamilyFlags & 0x0000000080000000LL) && (*i)->GetEffIndex() == 0)
- AdvertisedBenefit += (*i)->GetModifier()->m_amount;
+ if (pVictim->GetAura(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, 0x40))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
+ break;
}
- }
- }
-
- float ActualBenefit = 0.0f;
-
- if (AdvertisedBenefit != 0)
- {
- // Healing over Time spells
- float DotFactor = 1.0f;
- if(damagetype == DOT)
- {
- int32 DotDuration = GetSpellDuration(spellProto);
- if(DotDuration > 0)
+ case 8477: // Nourish Heal Boost
{
- // 200% limit
- if(DotDuration > 30000) DotDuration = 30000;
- if(!IsChanneledSpell(spellProto)) DotFactor = DotDuration / 15000.0f;
- int x = 0;
- for(int j = 0; j < 3; j++)
+ int32 stepPercent = (*i)->GetModifier()->m_amount;
+ int32 modPercent = 0;
+ AuraMap const& victimAuras = pVictim->GetAuras();
+ for (AuraMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
{
- if( spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && (
- spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_HEAL ||
- spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH) )
- {
- x = j;
- break;
- }
+ if (itr->second->GetCasterGUID()!=GetGUID())
+ continue;
+ SpellEntry const* m_spell = itr->second->GetSpellProto();
+ if ( m_spell->SpellFamilyName != SPELLFAMILY_DRUID ||
+ !(m_spell->SpellFamilyFlags[1] & 0x00000010 || m_spell->SpellFamilyFlags[0] & 0x50))
+ continue;
+ modPercent += stepPercent * itr->second->GetStackAmount();
}
- int DotTicks = 6;
- if(spellProto->EffectAmplitude[x] != 0)
- DotTicks = DotDuration / spellProto->EffectAmplitude[x];
- if(DotTicks)
- AdvertisedBenefit /= DotTicks;
+ DoneTotalMod *= (modPercent+100.0f)/100.0f;
+ break;
}
- }
-
- // distribute healing to all effects, reduce AoE damage
- CastingTime = GetCastingTimeForBonus( spellProto, damagetype, CastingTime );
-
- // 0% bonus for damage and healing spells for leech spells from healing bonus
- for(int j = 0; j < 3; ++j)
- {
- if( spellProto->Effect[j] == SPELL_EFFECT_HEALTH_LEECH ||
- spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH )
+ case 7871: // Glyph of Lesser Healing Wave
{
- CastingTime = 0;
+ if (pVictim->GetAura(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0 , 0x00000400, 0, GetGUID()))
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
break;
}
+ default:
+ break;
}
+ }
- // Exception
+ /*// Exception
switch (spellProto->SpellFamilyName)
{
- case SPELLFAMILY_SHAMAN:
+ case SPELLFAMILY_GENERIC:
// Healing stream from totem (add 6% per tick from hill bonus owner)
- if (spellProto->SpellFamilyFlags & 0x000000002000LL)
+ // Possibly need do it on apply dummy aura
+ if (spellProto->Id == 52042)
CastingTime = 210;
+ break;
+ case SPELLFAMILY_SHAMAN:
// Earth Shield 30% per charge
- else if (spellProto->SpellFamilyFlags & 0x40000000000LL)
+ if (spellProto->SpellFamilyFlags & 0x40000000000LL)
CastingTime = 1050;
break;
case SPELLFAMILY_DRUID:
@@ -9298,64 +8723,139 @@ uint32 Unit::SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount,
case SPELLFAMILY_HUNTER:
CastingTime = 0;
break;
- }
+ }*/
- float LvlPenalty = CalculateLevelPenalty(spellProto);
+ // Taken/Done fixed damage bonus auras
+ int32 DoneAdvertisedBenefit = SpellBaseHealingBonus(GetSpellSchoolMask(spellProto));
+ int32 TakenAdvertisedBenefit = SpellBaseHealingBonusForVictim(GetSpellSchoolMask(spellProto), pVictim);
- // Spellmod SpellDamage
- //float SpellModSpellDamage = 100.0f;
- float CoefficientPtc = ((float)CastingTime/3500.0f)*DotFactor*100.0f;
+ // Check for table values
+ SpellBonusEntry const* bonus = spellmgr.GetSpellBonusData(spellProto->Id);
+ float coeff;
+ if (bonus)
+ {
+ if (damagetype == DOT)
+ coeff = bonus->dot_damage;
+ else
+ coeff = bonus->direct_damage;
+ if (bonus->ap_bonus)
+ DoneTotal+=bonus->ap_bonus * GetTotalAttackPowerValue(BASE_ATTACK) * stack;
+ }
+ // Default calculation
+ if (DoneAdvertisedBenefit || TakenAdvertisedBenefit)
+ {
+ if(!bonus)
+ {
+ // Damage Done from spell damage bonus
+ int32 CastingTime = !IsChanneledSpell(spellProto) ? GetSpellCastTime(spellProto) : GetSpellDuration(spellProto);
+ if (IsChanneledSpell(spellProto))
+ ModSpellCastTime(spellProto, CastingTime);
+ // Damage over Time spells bonus calculation
+ float DotFactor = 1.0f;
+ if(damagetype == DOT)
+ {
+ int32 DotDuration = GetSpellDuration(spellProto);
+ //apply casting time mods for channeled spells
+ if (IsChanneledSpell(spellProto))
+ ModSpellCastTime(spellProto, DotDuration);
+ // 200% limit
+ if(DotDuration > 0)
+ {
+ if(DotDuration > 30000) DotDuration = 30000;
+ if(!IsChanneledSpell(spellProto)) DotFactor = DotDuration / 15000.0f;
+ int x = 0;
+ for(int j = 0; j < 3; j++)
+ {
+ if( spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && (
+ spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_DAMAGE ||
+ spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH) )
+ {
+ x = j;
+ break;
+ }
+ }
+ int32 DotTicks = 6;
+ if(spellProto->EffectAmplitude[x] != 0)
+ DotTicks = DotDuration / spellProto->EffectAmplitude[x];
+ if(DotTicks)
+ {
+ DoneAdvertisedBenefit /= DotTicks*int32(stack);
+ TakenAdvertisedBenefit /= DotTicks*int32(stack);
+ }
+ }
+ }
+ // Distribute Damage over multiple effects, reduce by AoE
+ CastingTime = GetCastingTimeForBonus( spellProto, damagetype, CastingTime );
+ // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
+ for(int j = 0; j < 3; ++j)
+ {
+ if( spellProto->Effect[j] == SPELL_EFFECT_HEALTH_LEECH ||
+ spellProto->Effect[j] == SPELL_EFFECT_APPLY_AURA && spellProto->EffectApplyAuraName[j] == SPELL_AURA_PERIODIC_LEECH )
+ {
+ CastingTime /= 2;
+ break;
+ }
+ }
+ coeff = (CastingTime / 3500.0f) * DotFactor;
+ }
+ float coeff2 = CalculateLevelPenalty(spellProto) * 1.88f * stack;
+ TakenTotal += TakenAdvertisedBenefit * coeff * coeff2;
if(Player* modOwner = GetSpellModOwner())
- //modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_SPELL_BONUS_DAMAGE,SpellModSpellDamage);
- modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_SPELL_BONUS_DAMAGE,CoefficientPtc);
-
- //SpellModSpellDamage /= 100.0f;
- CoefficientPtc /= 100.0f;
-
- //ActualBenefit = (float)AdvertisedBenefit * ((float)CastingTime / 3500.0f) * DotFactor * SpellModSpellDamage * LvlPenalty;
- ActualBenefit = (float)AdvertisedBenefit * CoefficientPtc * LvlPenalty;
+ {
+ coeff *= 100.0f;
+ modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_SPELL_BONUS_DAMAGE, coeff);
+ coeff /= 100.0f;
+ }
+ DoneTotal += DoneAdvertisedBenefit * coeff * coeff2;
}
// use float as more appropriate for negative values and percent applying
- float heal = healamount + ActualBenefit;
-
- // TODO: check for ALL/SPELLS type
- // Healing done percent
- AuraList const& mHealingDonePct = GetAurasByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
- for(AuraList::const_iterator i = mHealingDonePct.begin();i != mHealingDonePct.end(); ++i)
- heal *= (100.0f + (*i)->GetModifierValue()) / 100.0f;
-
+ float heal = (healamount + DoneTotal)*DoneTotalMod;
// apply spellmod to Done amount
if(Player* modOwner = GetSpellModOwner())
modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
+ // Taken mods
// Healing Wave cast
- if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags & 0x0000000000000040LL)
+ if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[0] & 0x40)
{
- // Search for Healing Way on Victim (stack up to 3 time)
- int32 pctMod = 0;
+ // Search for Healing Way on Victim
Unit::AuraList const& auraDummy = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
for(Unit::AuraList::const_iterator itr = auraDummy.begin(); itr!=auraDummy.end(); ++itr)
if((*itr)->GetId() == 29203)
- pctMod += (*itr)->GetModifier()->m_amount;
- // Apply bonus
- if (pctMod)
- heal = heal * (100 + pctMod) / 100;
+ TakenTotalMod *= ((*itr)->GetModifier()->m_amount+100.0f) / 100.0f;
}
// Healing taken percent
float minval = pVictim->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT);
if(minval)
- heal *= (100.0f + minval) / 100.0f;
+ TakenTotalMod *= (100.0f + minval) / 100.0f;
float maxval = pVictim->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT);
if(maxval)
- heal *= (100.0f + maxval) / 100.0f;
+ TakenTotalMod *= (100.0f + maxval) / 100.0f;
+
+ if(damagetype==DOT)
+ {
+ // Healing over time taken percent
+ float minval_hot = GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT);
+ if(minval_hot)
+ TakenTotalMod *= (100.0f + minval_hot) / 100.0f;
+
+ float maxval_hot = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT);
+ if(maxval_hot)
+ TakenTotalMod *= (100.0f + maxval_hot) / 100.0f;
+ }
+
+ AuraList const& mHealingGet= pVictim->GetAurasByType(SPELL_AURA_MOD_HEALING_RECEIVED);
+ for(AuraList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
+ if (GetGUID()==(*i)->GetCasterGUID() && (*i)->isAffectedOnSpell(spellProto) )
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount + 100.0f) / 100.0f;
- if (heal < 0) heal = 0;
+ heal = (heal + TakenTotal) * TakenTotalMod;
- return uint32(heal);
+ return heal < 0 ? 0 : uint32(heal);
}
int32 Unit::SpellBaseHealingBonus(SpellSchoolMask schoolMask)
@@ -9365,25 +8865,28 @@ int32 Unit::SpellBaseHealingBonus(SpellSchoolMask schoolMask)
AuraList const& mHealingDone = GetAurasByType(SPELL_AURA_MOD_HEALING_DONE);
for(AuraList::const_iterator i = mHealingDone.begin();i != mHealingDone.end(); ++i)
if(((*i)->GetModifier()->m_miscvalue & schoolMask) != 0)
- AdvertisedBenefit += (*i)->GetModifierValue();
+ AdvertisedBenefit += (*i)->GetModifier()->m_amount;
// Healing bonus of spirit, intellect and strength
if (GetTypeId() == TYPEID_PLAYER)
{
+ // Base value
+ AdvertisedBenefit +=((Player*)this)->GetBaseSpellHealingBonus();
+
// Healing bonus from stats
AuraList const& mHealingDoneOfStatPercent = GetAurasByType(SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT);
for(AuraList::const_iterator i = mHealingDoneOfStatPercent.begin();i != mHealingDoneOfStatPercent.end(); ++i)
{
// stat used dependent from misc value (stat index)
Stats usedStat = Stats((*i)->GetSpellProto()->EffectMiscValue[(*i)->GetEffIndex()]);
- AdvertisedBenefit += int32(GetStat(usedStat) * (*i)->GetModifierValue() / 100.0f);
+ AdvertisedBenefit += int32(GetStat(usedStat) * (*i)->GetModifier()->m_amount / 100.0f);
}
// ... and attack power
AuraList const& mHealingDonebyAP = GetAurasByType(SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER);
for(AuraList::const_iterator i = mHealingDonebyAP.begin();i != mHealingDonebyAP.end(); ++i)
if ((*i)->GetModifier()->m_miscvalue & schoolMask)
- AdvertisedBenefit += int32(GetTotalAttackPowerValue(BASE_ATTACK) * (*i)->GetModifierValue() / 100.0f);
+ AdvertisedBenefit += int32(GetTotalAttackPowerValue(BASE_ATTACK) * (*i)->GetModifier()->m_amount / 100.0f);
}
return AdvertisedBenefit;
}
@@ -9394,11 +8897,11 @@ int32 Unit::SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit *pVi
AuraList const& mDamageTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_HEALING);
for(AuraList::const_iterator i = mDamageTaken.begin();i != mDamageTaken.end(); ++i)
if(((*i)->GetModifier()->m_miscvalue & schoolMask) != 0)
- AdvertisedBenefit += (*i)->GetModifierValue();
+ AdvertisedBenefit += (*i)->GetModifier()->m_amount;
return AdvertisedBenefit;
}
-bool Unit::IsImmunedToDamage(SpellSchoolMask shoolMask, bool useCharges)
+bool Unit::IsImmunedToDamage(SpellSchoolMask shoolMask)
{
//If m_immuneToSchool type contain this school type, IMMUNE damage.
SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
@@ -9415,7 +8918,7 @@ bool Unit::IsImmunedToDamage(SpellSchoolMask shoolMask, bool useCharges)
return false;
}
-bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
+bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo)
{
if (!spellInfo)
return false;
@@ -9439,7 +8942,7 @@ bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
for(SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
{
- if(itr->type == spellInfo->Mechanic)
+ if(itr->type & (1<<spellInfo->Mechanic))
{
return true;
}
@@ -9457,18 +8960,39 @@ bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges)
return false;
}
-bool Unit::IsImmunedToSpellEffect(uint32 effect, uint32 mechanic) const
+bool Unit::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const
{
+ if (!spellInfo)
+ return false;
//If m_immuneToEffect type contain this effect type, IMMUNE effect.
+ uint32 effect = spellInfo->Effect[index];
SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
if(itr->type == effect)
return true;
- SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
- for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
- if(itr->type == mechanic)
- return true;
+ if(uint32 mechanic = spellInfo->EffectMechanic[index])
+ {
+ SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
+ for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
+ if(itr->type & 1<<(spellInfo->EffectMechanic[index]))
+ return true;
+ }
+
+ if(uint32 aura = spellInfo->EffectApplyAuraName[index])
+ {
+ SpellImmuneList const& list = m_spellImmune[IMMUNITY_STATE];
+ for(SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
+ if(itr->type == aura)
+ return true;
+ // Check for immune to application of harmful magical effects
+ AuraList const& immuneAuraApply = GetAurasByType(SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL);
+ for(AuraList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
+ if (spellInfo->Dispel == DISPEL_MAGIC && // Magic debuff
+ ((*iter)->GetModifier()->m_miscvalue & GetSpellSchoolMask(spellInfo)) && // Check school
+ !IsPositiveEffect(spellInfo->Id, index)) // Harmful
+ return true;
+ }
return false;
}
@@ -9506,7 +9030,7 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
AuraList const& mDamageDoneCreature = GetAurasByType(SPELL_AURA_MOD_DAMAGE_DONE_CREATURE);
for(AuraList::const_iterator i = mDamageDoneCreature.begin();i != mDamageDoneCreature.end(); ++i)
if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- DoneFlatBenefit += (*i)->GetModifierValue();
+ DoneFlatBenefit += (*i)->GetModifier()->m_amount;
// ..done
// SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
@@ -9521,7 +9045,7 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
AuraList const& mCreatureAttackPower = GetAurasByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS);
for(AuraList::const_iterator i = mCreatureAttackPower.begin();i != mCreatureAttackPower.end(); ++i)
if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- APbonus += (*i)->GetModifierValue();
+ APbonus += (*i)->GetModifier()->m_amount;
}
else
{
@@ -9531,7 +9055,7 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
AuraList const& mCreatureAttackPower = GetAurasByType(SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS);
for(AuraList::const_iterator i = mCreatureAttackPower.begin();i != mCreatureAttackPower.end(); ++i)
if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- APbonus += (*i)->GetModifierValue();
+ APbonus += (*i)->GetModifier()->m_amount;
}
if (APbonus!=0) // Can be negative
@@ -9556,7 +9080,7 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
AuraList const& mDamageTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_DAMAGE_TAKEN);
for(AuraList::const_iterator i = mDamageTaken.begin();i != mDamageTaken.end(); ++i)
if((*i)->GetModifier()->m_miscvalue & GetMeleeDamageSchoolMask())
- TakenFlatBenefit += (*i)->GetModifierValue();
+ TakenFlatBenefit += (*i)->GetModifier()->m_amount;
if(attType!=RANGED_ATTACK)
TakenFlatBenefit += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN);
@@ -9564,8 +9088,8 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
TakenFlatBenefit += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN);
// Done/Taken total percent damage auras
- float DoneTotalMod = 1;
- float TakenTotalMod = 1;
+ float DoneTotalMod = 1.0f;
+ float TakenTotalMod = 1.0f;
// ..done
// SPELL_AURA_MOD_DAMAGE_PERCENT_DONE included in weapon damage
@@ -9574,13 +9098,13 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
AuraList const& mDamageDoneVersus = GetAurasByType(SPELL_AURA_MOD_DAMAGE_DONE_VERSUS);
for(AuraList::const_iterator i = mDamageDoneVersus.begin();i != mDamageDoneVersus.end(); ++i)
if(creatureTypeMask & uint32((*i)->GetModifier()->m_miscvalue))
- DoneTotalMod *= ((*i)->GetModifierValue()+100.0f)/100.0f;
+ DoneTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
// ..taken
AuraList const& mModDamagePercentTaken = pVictim->GetAurasByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
for(AuraList::const_iterator i = mModDamagePercentTaken.begin(); i != mModDamagePercentTaken.end(); ++i)
if((*i)->GetModifier()->m_miscvalue & GetMeleeDamageSchoolMask())
- TakenTotalMod *= ((*i)->GetModifierValue()+100.0f)/100.0f;
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
// .. taken pct: dummy auras
AuraList const& mDummyAuras = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
@@ -9605,7 +9129,7 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
if(spellProto==NULL)
break;
// Should increase Shred (initial Damage of Lacerate and Rake handled in Spell::EffectSchoolDMG)
- if(spellProto->SpellFamilyName==SPELLFAMILY_DRUID && (spellProto->SpellFamilyFlags==0x00008000LL))
+ if(spellProto->SpellFamilyName==SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags.IsEqual (0x00008000,0,0))
TakenTotalMod *= (100.0f+(*i)->GetModifier()->m_amount)/100.0f;
break;
}
@@ -9638,13 +9162,13 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage,WeaponAttackType attT
{
AuraList const& mModMeleeDamageTakenPercent = pVictim->GetAurasByType(SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT);
for(AuraList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
- TakenTotalMod *= ((*i)->GetModifierValue()+100.0f)/100.0f;
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
}
else
{
AuraList const& mModRangedDamageTakenPercent = pVictim->GetAurasByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
for(AuraList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
- TakenTotalMod *= ((*i)->GetModifierValue()+100.0f)/100.0f;
+ TakenTotalMod *= ((*i)->GetModifier()->m_amount+100.0f)/100.0f;
}
float tmpDamage = float(int32(*pdamage) + DoneFlatBenefit) * DoneTotalMod;
@@ -9767,7 +9291,7 @@ void Unit::Unmount()
if(GetTypeId() == TYPEID_PLAYER && IsInWorld() && ((Player*)this)->GetTemporaryUnsummonedPetNumber() && isAlive())
{
Pet* NewPet = new Pet;
- if(!NewPet->LoadPetFromDB(this, 0, ((Player*)this)->GetTemporaryUnsummonedPetNumber(), true))
+ if(!NewPet->LoadPetFromDB((Player*)this, 0, ((Player*)this)->GetTemporaryUnsummonedPetNumber(), true))
delete NewPet;
((Player*)this)->SetTemporaryUnsummonedPetNumber(0);
@@ -9799,7 +9323,7 @@ void Unit::SetInCombatWith(Unit* enemy)
void Unit::CombatStart(Unit* target)
{
if(!target->IsStandState()/* && !target->hasUnitState(UNIT_STAT_STUNNED)*/)
- target->SetStandState(PLAYER_STATE_NONE);
+ target->SetStandState(UNIT_STAND_STATE_STAND);
if(!target->isInCombat() && target->GetTypeId() != TYPEID_PLAYER
&& !((Creature*)target)->HasReactState(REACT_PASSIVE) && ((Creature*)target)->AI())
@@ -10083,7 +9607,7 @@ void Unit::DestroyForNearbyPlayers()
std::list<Unit*> targets;
Trinity::AnyUnitInObjectRangeCheck check(this, World::GetMaxVisibleDistance());
- Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(targets, check);
+ Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targets, check);
VisitNearbyWorldObject(World::GetMaxVisibleDistance(), searcher);
for(std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter)
if(*iter != this && (*iter)->GetTypeId() == TYPEID_PLAYER
@@ -10207,38 +9731,37 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
propagateSpeedChange();
- // Send speed change packet only for player
- if (GetTypeId()!=TYPEID_PLAYER)
- return;
-
WorldPacket data;
if(!forced)
{
switch(mtype)
{
case MOVE_WALK:
- data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_RUN:
- data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_RUN_BACK:
- data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_SWIM:
- data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_SWIM_BACK:
- data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_TURN_RATE:
- data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_FLIGHT:
- data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_FLIGHT_BACK:
- data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ break;
+ case MOVE_PITCH_RATE:
+ data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8+4+2+4+4+4+4+4+4+4);
break;
default:
sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype);
@@ -10246,22 +9769,26 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
}
data.append(GetPackGUID());
- data << uint32(0); //movement flags
- data << uint8(0); //unk
+ data << uint32(0); // movement flags
+ data << uint16(0); // unk flags
data << uint32(getMSTime());
data << float(GetPositionX());
data << float(GetPositionY());
data << float(GetPositionZ());
data << float(GetOrientation());
- data << uint32(0); //flag unk
+ data << uint32(0); // fall time
data << float(GetSpeed(mtype));
SendMessageToSet( &data, true );
}
else
{
- // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
- // and do it only for real sent packets and use run for run/mounted as client expected
- ++((Player*)this)->m_forced_speed_changes[mtype];
+ if(GetTypeId() == TYPEID_PLAYER)
+ {
+ // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
+ // and do it only for real sent packets and use run for run/mounted as client expected
+ ++((Player*)this)->m_forced_speed_changes[mtype];
+ }
+
switch(mtype)
{
case MOVE_WALK:
@@ -10288,6 +9815,9 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
case MOVE_FLIGHT_BACK:
data.Initialize(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, 16);
break;
+ case MOVE_PITCH_RATE:
+ data.Initialize(SMSG_FORCE_PITCH_RATE_CHANGE, 16);
+ break;
default:
sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype);
return;
@@ -10329,6 +9859,8 @@ void Unit::setDeathState(DeathState s)
{
RemoveAllAurasOnDeath();
UnsummonAllTotems();
+ //This is needed to clear visible auras after unit dies
+ UpdateAuras();
ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false);
@@ -10373,6 +9905,10 @@ bool Unit::CanHaveThreatList() const
if( ((Creature*)this)->isTotem() )
return false;
+ // vehicles can not have threat list
+ if( ((Creature*)this)->isVehicle() )
+ return false;
+
// pets can not have a threat list, unless they are controlled by a creature
if( ((Creature*)this)->isPet() && IS_PLAYER_GUID(((Pet*)this)->GetOwnerGUID()) )
return false;
@@ -10477,18 +10013,44 @@ Unit* Creature::SelectVictim()
//or who does not have threat (totem/pet/critter)
//otherwise enterevademode every update
- Unit* target = NULL;
- if(!m_ThreatManager.isThreatListEmpty())
+
+ Unit* target = NULL;
+ // First checking if we have some taunt on us
+ const AuraList& tauntAuras = GetAurasByType(SPELL_AURA_MOD_TAUNT);
+ if ( !tauntAuras.empty() )
{
- if(!HasAuraType(SPELL_AURA_MOD_TAUNT))
+ Unit* caster;
+
+ // The last taunt aura caster is alive an we are happy to attack him
+ if ( (caster = tauntAuras.back()->GetCaster()) && caster->isAlive() )
+ return getVictim();
+ else if (tauntAuras.size() > 1)
{
- target = m_ThreatManager.getHostilTarget();
+ // We do not have last taunt aura caster but we have more taunt auras,
+ // so find first available target
+
+ // Auras are pushed_back, last caster will be on the end
+ AuraList::const_iterator aura = --tauntAuras.end();
+ do
+ {
+ --aura;
+ if ( (caster = (*aura)->GetCaster()) &&
+ caster->IsInMap(this) && canAttack(caster) && caster->isInAccessiblePlaceFor((Creature*)this) )
+ {
+ target = caster;
+ break;
+ }
+ }while (aura != tauntAuras.begin());
}
else
target = getVictim();
}
+ if ( !target && !m_ThreatManager.isThreatListEmpty() )
+ // No taunt aura or taunt aura caster is dead standart target selection
+ target = m_ThreatManager.getHostilTarget();
+
if(target)
{
if(!hasUnitState(UNIT_STAT_STUNNED))
@@ -10560,8 +10122,11 @@ int32 Unit::CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_inde
int32 randomPoints = int32(spellProto->EffectDieSides[effect_index] + level * randomPointsPerLevel);
float comboDamage = spellProto->EffectPointsPerComboPoint[effect_index];
- // prevent random generator from getting confused by spells casted with Unit::CastCustomSpell
- int32 randvalue = spellProto->EffectBaseDice[effect_index] >= randomPoints ? spellProto->EffectBaseDice[effect_index]:irand(spellProto->EffectBaseDice[effect_index], randomPoints);
+ // range can have possitive and negative values, so order its for irand
+ int32 randvalue = int32(spellProto->EffectBaseDice[effect_index]) >= randomPoints
+ ? irand(randomPoints, int32(spellProto->EffectBaseDice[effect_index]))
+ : irand(int32(spellProto->EffectBaseDice[effect_index]), randomPoints);
+
int32 value = basePoints + randvalue;
//random damage
if(comboDamage != 0 && unitPlayer /*&& target && (target->GetGUID() == unitPlayer->GetComboTarget())*/)
@@ -10594,7 +10159,7 @@ int32 Unit::CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_inde
return value;
}
-int32 Unit::CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target)
+int32 Unit::CalcSpellDuration(SpellEntry const* spellProto)
{
Player* unitPlayer = (GetTypeId() == TYPEID_PLAYER) ? (Player*)this : NULL;
@@ -10610,14 +10175,24 @@ int32 Unit::CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_in
else
duration = minduration;
- if (duration > 0)
+ return duration;
+}
+
+int32 Unit::ModSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target, int32 duration)
+{
+ //don't mod permament auras duration
+ if (duration<0)
+ return duration;
+
+ //cut duration only of negative effects
+ if (!IsPositiveEffect(spellProto->Id, effect_index) )
{
int32 mechanic = GetEffectMechanic(spellProto, effect_index);
+
// Find total mod value (negative bonus)
int32 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, mechanic);
// Find max mod (negative bonus)
int32 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, mechanic);
-
int32 durationMod = 0;
// Select strongest negative mod
if (durationMod_always > durationMod_not_stack)
@@ -10626,12 +10201,41 @@ int32 Unit::CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_in
durationMod = durationMod_always;
if (durationMod != 0)
- duration = int32(int64(duration) * (100+durationMod) /100);
+ duration = int32( float (duration) * float(100.0f+durationMod) /100.0f);
+
+ // there are only negative mods currently
+ durationMod_always =target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
+ durationMod_not_stack=target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
+
+ durationMod=0;
+ if (durationMod_always > durationMod_not_stack)
+ durationMod += durationMod_not_stack;
+ else
+ durationMod += durationMod_always;
- if (duration < 0) duration = 0;
+ if (durationMod != 0)
+ duration = int32( float (duration) * float(100.0f+durationMod) /100.0f);
}
+ //else positive mods here, there are no currently
+ //when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
+ return duration>0 ? duration : 0;
+}
- return duration;
+void Unit::ModSpellCastTime(SpellEntry const* spellProto, int32 & castTime)
+{
+ if (!spellProto || castTime<0)
+ return;
+ //called from caster
+ if(Player* modOwner = GetSpellModOwner())
+ modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CASTING_TIME, castTime);
+
+ if( !(spellProto->Attributes & (SPELL_ATTR_UNK4|SPELL_ATTR_UNK5)) )
+ castTime = int32( float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
+ else
+ {
+ if (spellProto->Attributes & SPELL_ATTR_RANGED && !(spellProto->AttributesEx2 & SPELL_ATTR_EX2_AUTOREPEAT_FLAG))
+ castTime = int32 (float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
+ }
}
DiminishingLevels Unit::GetDiminishing(DiminishingGroup group)
@@ -10665,21 +10269,15 @@ DiminishingLevels Unit::GetDiminishing(DiminishingGroup group)
void Unit::IncrDiminishing(DiminishingGroup group)
{
// Checking for existing in the table
- bool IsExist = false;
for(Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
{
if(i->DRGroup != group)
continue;
-
- IsExist = true;
if(i->hitCount < DIMINISHING_LEVEL_IMMUNE)
i->hitCount += 1;
-
- break;
+ return;
}
-
- if(!IsExist)
- m_Diminishing.push_back(DiminishingReturn(group,getMSTime(),DIMINISHING_LEVEL_2));
+ m_Diminishing.push_back(DiminishingReturn(group,getMSTime(),DIMINISHING_LEVEL_2));
}
void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster,DiminishingLevels Level)
@@ -10728,17 +10326,50 @@ void Unit::ApplyDiminishingAura( DiminishingGroup group, bool apply )
if(i->DRGroup != group)
continue;
- i->hitTime = getMSTime();
-
if(apply)
i->stack += 1;
else if(i->stack)
+ {
i->stack -= 1;
-
+ // Remember time after last aura from group removed
+ if (i->stack == 0)
+ i->hitTime = getMSTime();
+ }
break;
}
}
+uint32 Unit::GetSpellMaxRangeForTarget(Unit* target,const SpellRangeEntry * rangeEntry)
+{
+ if (!rangeEntry)
+ return 0;
+ if (rangeEntry->maxRangeHostile == rangeEntry->maxRangeFriend)
+ return rangeEntry->maxRangeFriend;
+ if (IsHostileTo(target))
+ return rangeEntry->maxRangeHostile;
+ return rangeEntry->maxRangeFriend;
+};
+uint32 Unit::GetSpellMinRangeForTarget(Unit* target,const SpellRangeEntry * rangeEntry)
+{
+ if (!rangeEntry)
+ return 0;
+ if (rangeEntry->minRangeHostile == rangeEntry->minRangeFriend)
+ return rangeEntry->minRangeFriend;
+ if (IsHostileTo(target))
+ return rangeEntry->minRangeHostile;
+ return rangeEntry->minRangeFriend;
+};
+uint32 Unit::GetSpellRadiusForTarget(Unit* target,const SpellRadiusEntry * radiusEntry)
+{
+ if (!radiusEntry)
+ return 0;
+ if (radiusEntry->radiusHostile == radiusEntry->radiusFriend)
+ return radiusEntry->radiusFriend;
+ if (IsHostileTo(target))
+ return radiusEntry->radiusHostile;
+ return radiusEntry->radiusFriend;
+};
+
Unit* Unit::GetUnit(WorldObject& object, uint64 guid)
{
return ObjectAccessor::GetUnit(object,guid);
@@ -10816,7 +10447,9 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f
case UNIT_MOD_RAGE:
case UNIT_MOD_FOCUS:
case UNIT_MOD_ENERGY:
- case UNIT_MOD_HAPPINESS: UpdateMaxPower(GetPowerTypeByAuraGroup(unitMod)); break;
+ case UNIT_MOD_HAPPINESS:
+ case UNIT_MOD_RUNE:
+ case UNIT_MOD_RUNIC_POWER: UpdateMaxPower(GetPowerTypeByAuraGroup(unitMod)); break;
case UNIT_MOD_RESISTANCE_HOLY:
case UNIT_MOD_RESISTANCE_FIRE:
@@ -10929,32 +10562,36 @@ Stats Unit::GetStatByAuraGroup(UnitMods unitMod) const
Powers Unit::GetPowerTypeByAuraGroup(UnitMods unitMod) const
{
- Powers power = POWER_MANA;
-
switch(unitMod)
{
- case UNIT_MOD_MANA: power = POWER_MANA; break;
- case UNIT_MOD_RAGE: power = POWER_RAGE; break;
- case UNIT_MOD_FOCUS: power = POWER_FOCUS; break;
- case UNIT_MOD_ENERGY: power = POWER_ENERGY; break;
- case UNIT_MOD_HAPPINESS: power = POWER_HAPPINESS; break;
-
- default:
- break;
+ case UNIT_MOD_MANA: return POWER_MANA;
+ case UNIT_MOD_RAGE: return POWER_RAGE;
+ case UNIT_MOD_FOCUS: return POWER_FOCUS;
+ case UNIT_MOD_ENERGY: return POWER_ENERGY;
+ case UNIT_MOD_HAPPINESS: return POWER_HAPPINESS;
+ case UNIT_MOD_RUNE: return POWER_RUNE;
+ case UNIT_MOD_RUNIC_POWER:return POWER_RUNIC_POWER;
}
- return power;
+ return POWER_MANA;
}
float Unit::GetTotalAttackPowerValue(WeaponAttackType attType) const
{
- UnitMods unitMod = (attType == RANGED_ATTACK) ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER;
-
- float val = GetTotalAuraModValue(unitMod);
- if(val < 0.0f)
- val = 0.0f;
-
- return val;
+ if (attType == RANGED_ATTACK)
+ {
+ int32 ap = GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER) + GetInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER_MODS);
+ if (ap < 0)
+ return 0.0f;
+ return ap * (1.0f + GetFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER));
+ }
+ else
+ {
+ int32 ap = GetInt32Value(UNIT_FIELD_ATTACK_POWER) + GetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS);
+ if (ap < 0)
+ return 0.0f;
+ return ap * (1.0f + GetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER));
+ }
}
float Unit::GetWeaponDamageRange(WeaponAttackType attType ,WeaponDamageRange type) const
@@ -11042,6 +10679,12 @@ void Unit::SetPower(Powers power, uint32 val)
SetStatInt32Value(UNIT_FIELD_POWER1 + power, val);
+ WorldPacket data(SMSG_POWER_UPDATE);
+ data.append(GetPackGUID());
+ data << uint8(power);
+ data << uint32(val);
+ SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false);
+
// group update
if(GetTypeId() == TYPEID_PLAYER)
{
@@ -11155,6 +10798,7 @@ uint32 Unit::GetCreatePowers( Powers power ) const
case POWER_FOCUS: return (GetTypeId()==TYPEID_PLAYER || !((Creature const*)this)->isPet() || ((Pet const*)this)->getPetType()!=HUNTER_PET ? 0 : 100);
case POWER_ENERGY: return 100;
case POWER_HAPPINESS: return (GetTypeId()==TYPEID_PLAYER || !((Creature const*)this)->isPet() || ((Pet const*)this)->getPetType()!=HUNTER_PET ? 0 : 1050000);
+ case POWER_RUNIC_POWER: return 1000;
}
return 0;
@@ -11242,7 +10886,7 @@ void CharmInfo::InitEmptyActionBar(bool withAttack)
for(uint32 x = 0; x < 10; ++x)
{
- PetActionBar[x].Type = ACT_CAST;
+ PetActionBar[x].Type = ACT_PASSIVE;
PetActionBar[x].SpellOrAction = 0;
}
if (withAttack)
@@ -11258,13 +10902,20 @@ void CharmInfo::InitPossessCreateSpells()
InitEmptyActionBar();
if(m_unit->GetTypeId() == TYPEID_UNIT)
{
- for(uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i)
+ /*for(uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i)
{
uint32 spellid = ((Creature*)m_unit)->m_spells[i];
if(IsPassiveSpell(spellid))
m_unit->CastSpell(m_unit, spellid, true);
else
AddSpellToAB(0, spellid, ACT_CAST);
+ }*/
+ for(uint32 x = 0; x < CREATURE_MAX_SPELLS; ++x)
+ {
+ if (IsPassiveSpell(((Creature*)m_unit)->m_spells[x]))
+ m_unit->CastSpell(m_unit, ((Creature*)m_unit)->m_spells[x], true);
+ else
+ AddSpellToAB(0, ((Creature*)m_unit)->m_spells[x], ACT_PASSIVE);
}
}
}
@@ -11308,7 +10959,7 @@ void CharmInfo::InitCharmCreateSpells()
if(onlyselfcast || !IsPositiveSpell(spellId)) //only self cast and spells versus enemies are autocastable
newstate = ACT_DISABLED;
else
- newstate = ACT_CAST;
+ newstate = ACT_PASSIVE;
AddSpellToAB(0, spellId, newstate);
}
@@ -11319,7 +10970,7 @@ bool CharmInfo::AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate)
{
for(uint8 i = 0; i < 10; i++)
{
- if((PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_CAST) && PetActionBar[i].SpellOrAction == oldid)
+ if((PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_PASSIVE) && PetActionBar[i].SpellOrAction == oldid)
{
PetActionBar[i].SpellOrAction = newid;
if(!oldid)
@@ -11361,188 +11012,9 @@ void CharmInfo::SetPetNumber(uint32 petnumber, bool statwindow)
bool Unit::isFrozen() const
{
- AuraList const& mRoot = GetAurasByType(SPELL_AURA_MOD_ROOT);
- for(AuraList::const_iterator i = mRoot.begin(); i != mRoot.end(); ++i)
- if( GetSpellSchoolMask((*i)->GetSpellProto()) & SPELL_SCHOOL_MASK_FROST)
- return true;
- return false;
+ return HasAuraState(AURA_STATE_FROZEN);
}
-/*
-struct ProcTriggeredData
-{
- ProcTriggeredData(Aura* _triggeredByAura, uint32 _cooldown)
- : triggeredByAura(_triggeredByAura),
- triggeredByAura_SpellPair(Unit::spellEffectPair(triggeredByAura->GetId(),triggeredByAura->GetEffIndex())),
- cooldown(_cooldown)
- {}
-
- Aura* triggeredByAura; // triggred aura, can be invalidate at triggered aura proccessing
- Unit::spellEffectPair triggeredByAura_SpellPair; // spell pair, used for re-find aura (by pointer comparison in range)
- uint32 cooldown; // possible hidden cooldown
-};
-
-typedef std::list< ProcTriggeredData > ProcTriggeredList;
-
-void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, AuraTypeSet const& procAuraTypes, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage, SpellSchoolMask damageSchoolMask )
-{
- for(AuraTypeSet::const_iterator aur = procAuraTypes.begin(); aur != procAuraTypes.end(); ++aur)
- {
- // List of spells (effects) that proceed. Spell prototype and aura-specific value (damage for TRIGGER_DAMAGE)
- ProcTriggeredList procTriggered;
-
- AuraList const& auras = GetAurasByType(*aur);
- for(AuraList::const_iterator i = auras.begin(), next; i != auras.end(); i = next)
- {
- next = i; ++next;
-
- Aura* i_aura = *i;
-
- uint32 cooldown; // returned at next line
- if(!IsTriggeredAtSpellProcEvent(i_aura->GetSpellProto(), procSpell, procFlag,attType,isVictim,cooldown))
- continue;
-
- procTriggered.push_back( ProcTriggeredData(i_aura, cooldown) );
- }
-
- // Handle effects proceed this time
- for(ProcTriggeredList::iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
- {
- // Some auras can be deleted in function called in this loop (except first, ofc)
- // Until storing auras in std::multimap to hard check deleting by another way
- if(i != procTriggered.begin())
- {
- bool found = false;
- AuraMap::const_iterator lower = GetAuras().lower_bound(i->triggeredByAura_SpellPair);
- AuraMap::const_iterator upper = GetAuras().upper_bound(i->triggeredByAura_SpellPair);
- for(AuraMap::const_iterator itr = lower; itr!= upper; ++itr)
- {
- if(itr->second==i->triggeredByAura)
- {
- found = true;
- break;
- }
- }
-
- if(!found)
- {
- sLog.outError("Spell aura %u (id:%u effect:%u) has been deleted before call spell proc event handler",*aur,i->triggeredByAura_SpellPair.first,i->triggeredByAura_SpellPair.second);
- sLog.outError("It can be deleted one from early processed auras:");
- for(ProcTriggeredList::iterator i2 = procTriggered.begin(); i != i2; ++i2)
- sLog.outError(" Spell aura %u (id:%u effect:%u)",*aur,i2->triggeredByAura_SpellPair.first,i2->triggeredByAura_SpellPair.second);
- sLog.outError(" <end of list>");
- continue;
- }
- }
-
- /// this is aura triggering code call
- Aura* triggeredByAura = i->triggeredByAura;
-
- /// save charges existence before processing to prevent crash at access to deleted triggered aura after
- /// used in speedup code check before check aura existance.
- bool triggeredByAuraWithCharges = triggeredByAura->m_procCharges > 0;
-
- /// success in event proccesing
- /// used in speedup code check before check aura existance.
- bool casted = false;
-
- /// process triggered code
- switch(*aur)
- {
- case SPELL_AURA_PROC_TRIGGER_SPELL:
- {
- sLog.outDebug("ProcDamageAndSpell: casting spell (triggered by %s proc aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
- casted = HandleProcTriggerSpell(pTarget, damage, triggeredByAura, procSpell, procFlag, attType, i->cooldown);
- break;
- }
- case SPELL_AURA_PROC_TRIGGER_DAMAGE:
- {
- uint32 triggered_damage = triggeredByAura->GetModifier()->m_amount;
- sLog.outDebug("ProcDamageAndSpell: doing %u damage (triggered by %s aura of spell %u)",
- triggered_damage, (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
- SpellNonMeleeDamageLog(pTarget, triggeredByAura->GetId(), triggered_damage, true, true);
- casted = true;
- break;
- }
- case SPELL_AURA_DUMMY:
- {
- uint32 effect = triggeredByAura->GetEffIndex();
- sLog.outDebug("ProcDamageAndSpell: casting spell (triggered by %s dummy aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
- casted = HandleDummyAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag,i->cooldown);
- break;
- }
- case SPELL_AURA_PRAYER_OF_MENDING:
- {
- sLog.outDebug("ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
-
- casted = HandleMeandingAuraProc(triggeredByAura);
- break;
- }
- case SPELL_AURA_MOD_HASTE:
- {
- sLog.outDebug("ProcDamageAndSpell: casting spell (triggered by %s haste aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
- casted = HandleHasteAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag,i->cooldown);
- break;
- }
- case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN:
- {
- // nothing do, just charges counter
- // but count only in case appropriate school damage
- casted = triggeredByAura->GetModifier()->m_miscvalue & damageSchoolMask;
- break;
- }
- case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS:
- {
- sLog.outDebug("ProcDamageAndSpell: casting spell (triggered by %s class script aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
- casted = HandleOverrideClassScriptAuraProc(pTarget, triggeredByAura, procSpell,i->cooldown);
- break;
- }
- default:
- {
- // nothing do, just charges counter
- casted = true;
- break;
- }
- }
-
- /// Update charge (aura can be removed by triggers)
- if(casted && triggeredByAuraWithCharges)
- {
- /// need re-found aura (can be dropped by triggers)
- AuraMap::const_iterator lower = GetAuras().lower_bound(i->triggeredByAura_SpellPair);
- AuraMap::const_iterator upper = GetAuras().upper_bound(i->triggeredByAura_SpellPair);
- for(AuraMap::const_iterator itr = lower; itr!= upper; ++itr)
- {
- if(itr->second == triggeredByAura) // pointer still valid
- {
- if(triggeredByAura->m_procCharges > 0)
- triggeredByAura->m_procCharges -= 1;
-
- triggeredByAura->UpdateAuraCharges();
- break;
- }
- }
- }
- }
-
- /// Safely remove auras with zero charges
- for(AuraList::const_iterator i = auras.begin(), next; i != auras.end(); i = next)
- {
- next = i; ++next;
- if((*i)->m_procCharges == 0)
- {
- RemoveAurasDueToSpell((*i)->GetId());
- next = auras.begin();
- }
- }
- }
-}
-*/
struct ProcTriggeredData
{
ProcTriggeredData(SpellProcEventEntry const * _spellProcEvent, Aura* _triggeredByAura)
@@ -11561,9 +11033,7 @@ typedef std::list< uint32> RemoveSpellList;
// in most case need for drop charges
// in some types of aura need do additional check
// for example SPELL_AURA_MECHANIC_IMMUNITY - need check for mechanic
-static bool isTriggerAura[TOTAL_AURAS];
-static bool isNonTriggerAura[TOTAL_AURAS];
-void InitTriggerAuraData()
+bool InitTriggerAuraData()
{
for (int i=0;i<TOTAL_AURAS;i++)
{
@@ -11582,7 +11052,7 @@ void InitTriggerAuraData()
isTriggerAura[SPELL_AURA_DAMAGE_IMMUNITY] = true;
isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL] = true;
isTriggerAura[SPELL_AURA_PROC_TRIGGER_DAMAGE] = true;
- isTriggerAura[SPELL_AURA_MOD_CASTING_SPEED] = true;
+ isTriggerAura[SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK] = true;
isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT] = true;
isTriggerAura[SPELL_AURA_MOD_POWER_COST_SCHOOL] = true;
isTriggerAura[SPELL_AURA_REFLECT_SPELLS_SCHOOL] = true;
@@ -11596,10 +11066,15 @@ void InitTriggerAuraData()
isTriggerAura[SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS] = true;
isTriggerAura[SPELL_AURA_MOD_HASTE] = true;
isTriggerAura[SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE]=true;
- isTriggerAura[SPELL_AURA_PRAYER_OF_MENDING] = true;
+ isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE] = true;
+ isTriggerAura[SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE] = true;
+ isTriggerAura[SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE] = true;
+ isTriggerAura[SPELL_AURA_MOD_DAMAGE_FROM_CASTER] = true;
isNonTriggerAura[SPELL_AURA_MOD_POWER_REGEN]=true;
- isNonTriggerAura[SPELL_AURA_RESIST_PUSHBACK]=true;
+ isNonTriggerAura[SPELL_AURA_REDUCE_PUSHBACK]=true;
+
+ return true;
}
uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition)
@@ -11640,18 +11115,8 @@ uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missC
return procEx;
}
-static int deep = 0;
void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage )
{
- deep ++;
- if (deep > 5)
- {
- sLog.outError("Prevent possible stack owerflow in Unit::ProcDamageAndSpellFor");
- if (procSpell)
- sLog.outError(" Spell %u", procSpell->Id);
- deep--;
- return;
- }
// For melee/ranged based attack need update skills and set some Aura states
if (procFlag & MELEE_BASED_TRIGGER_MASK)
{
@@ -11662,7 +11127,7 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
if (procExtra&(PROC_EX_NORMAL_HIT|PROC_EX_MISS|PROC_EX_RESIST))
{
if (pTarget->GetTypeId() != TYPEID_PLAYER && pTarget->GetCreatureType() != CREATURE_TYPE_CRITTER)
- ((Player*)this)->UpdateCombatSkills(pTarget, attType, MELEE_HIT_MISS, isVictim);
+ ((Player*)this)->UpdateCombatSkills(pTarget, attType, isVictim);
}
// Update defence if player is victim and parry/dodge/block
if (isVictim && procExtra&(PROC_EX_DODGE|PROC_EX_PARRY|PROC_EX_BLOCK))
@@ -11714,17 +11179,6 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
((Player*)this)->AddComboPoints(pTarget, 1);
StartReactiveTimer( REACTIVE_OVERPOWER );
}
- // Enable AURA_STATE_CRIT on crit
- if (procExtra & PROC_EX_CRITICAL_HIT)
- {
- ModifyAuraState(AURA_STATE_CRIT, true);
- StartReactiveTimer( REACTIVE_CRIT );
- if(getClass()==CLASS_HUNTER)
- {
- ModifyAuraState(AURA_STATE_HUNTER_CRIT_STRIKE, true);
- StartReactiveTimer( REACTIVE_HUNTER_CRIT );
- }
- }
}
}
}
@@ -11735,11 +11189,16 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
for(AuraMap::const_iterator itr = GetAuras().begin(); itr!= GetAuras().end(); ++itr)
{
SpellProcEventEntry const* spellProcEvent = NULL;
- if(!IsTriggeredAtSpellProcEvent(itr->second, procSpell, procFlag, procExtra, attType, isVictim, (damage > 0), spellProcEvent))
+ if(!IsTriggeredAtSpellProcEvent(pTarget, itr->second, procSpell, procFlag, procExtra, attType, isVictim, (damage > 0), spellProcEvent))
continue;
procTriggered.push_back( ProcTriggeredData(spellProcEvent, itr->second) );
}
+
+ // Nothing found
+ if (procTriggered.empty())
+ return;
+
// Handle effects proceed this time
for(ProcTriggeredList::iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
{
@@ -11774,7 +11233,7 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
Modifier *auraModifier = triggeredByAura->GetModifier();
SpellEntry const *spellInfo = triggeredByAura->GetSpellProto();
uint32 effIndex = triggeredByAura->GetEffIndex();
- bool useCharges = triggeredByAura->m_procCharges > 0;
+ bool useCharges = triggeredByAura->GetAuraCharges() > 0;
// For players set spell cooldown if need
uint32 cooldown = 0;
if (GetTypeId() == TYPEID_PLAYER && spellProcEvent && spellProcEvent->cooldown)
@@ -11818,35 +11277,35 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS:
{
sLog.outDebug("ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (!HandleOverrideClassScriptAuraProc(pTarget, triggeredByAura, procSpell, cooldown))
+ if (!HandleOverrideClassScriptAuraProc(pTarget, damage, triggeredByAura, procSpell, cooldown))
continue;
break;
}
- case SPELL_AURA_PRAYER_OF_MENDING:
+ case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE:
{
sLog.outDebug("ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
(isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
- HandleMeandingAuraProc(triggeredByAura);
+ HandleAuraRaidProcFromChargeWithValue(triggeredByAura);
break;
}
- case SPELL_AURA_MOD_STUN:
- // Remove by default, but if charge exist drop it
- if (triggeredByAura->m_procCharges == 0)
- removedSpells.push_back(triggeredByAura->GetId());
+ case SPELL_AURA_RAID_PROC_FROM_CHARGE:
+ {
+ sLog.outDebug("ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
+ (isVictim?"a victim's":"an attacker's"),triggeredByAura->GetId());
+
+ HandleAuraRaidProcFromCharge(triggeredByAura);
break;
- case SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS:
- case SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS:
- // Hunter's Mark (1-4 Rangs)
- if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && (spellInfo->SpellFamilyFlags&0x0000000000000400LL))
- {
- uint32 basevalue = triggeredByAura->GetBasePoints();
- auraModifier->m_amount += basevalue/10;
- if (auraModifier->m_amount > basevalue*4)
- auraModifier->m_amount = basevalue*4;
- }
+ }
+ case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE:
+ {
+ sLog.outDebug("ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+
+ if (!HandleProcTriggerSpell(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ continue;
break;
- case SPELL_AURA_MOD_CASTING_SPEED:
+ }
+ case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK:
// Skip melee hits or instant cast spells
if (procSpell == NULL || GetSpellCastTime(procSpell) == 0)
continue;
@@ -11874,6 +11333,11 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
if (procSpell==NULL || procSpell->Mechanic != auraModifier->m_miscvalue)
continue;
break;
+ case SPELL_AURA_MOD_DAMAGE_FROM_CASTER:
+ // Compare casters
+ if (triggeredByAura->GetCasterGUID() != pTarget->GetGUID())
+ continue;
+ break;
default:
// nothing do, just charges counter
break;
@@ -11886,18 +11350,16 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
AuraMap::const_iterator upper = GetAuras().upper_bound(i->triggeredByAura_SpellPair);
for(AuraMap::const_iterator itr = lower; itr!= upper; ++itr)
{
- if(itr->second == i->triggeredByAura)
+ // If last charge dropped add spell to remove list
+ if(itr->second == i->triggeredByAura && triggeredByAura->DropAuraCharge())
{
- triggeredByAura->m_procCharges -=1;
- triggeredByAura->UpdateAuraCharges();
- if (triggeredByAura->m_procCharges <= 0)
- removedSpells.push_back(triggeredByAura->GetId());
+ removedSpells.push_back(triggeredByAura->GetId());
break;
}
}
}
}
- if (removedSpells.size())
+ if (!removedSpells.empty())
{
// Sort spells and remove dublicates
removedSpells.sort();
@@ -11906,7 +11368,6 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
for(RemoveSpellList::const_iterator i = removedSpells.begin(); i != removedSpells.end();i++)
RemoveAurasDueToSpell(*i);
}
- deep--;
}
SpellSchoolMask Unit::GetMeleeDamageSchoolMask() const
@@ -11935,8 +11396,11 @@ void Unit::SendPetCastFail(uint32 spellid, uint8 msg)
return;
WorldPacket data(SMSG_PET_CAST_FAILED, (4+1));
+ data << uint8(0); // cast count?
data << uint32(spellid);
data << uint8(msg);
+ // uint32 for some reason
+ // uint32 for some reason
((Player*)owner)->GetSession()->SendPacket(&data);
}
@@ -12096,15 +11560,16 @@ void Unit::SetConfused(bool apply, uint64 casterGUID, uint32 spellID)
bool Unit::IsSitState() const
{
uint8 s = getStandState();
- return s == PLAYER_STATE_SIT_CHAIR || s == PLAYER_STATE_SIT_LOW_CHAIR ||
- s == PLAYER_STATE_SIT_MEDIUM_CHAIR || s == PLAYER_STATE_SIT_HIGH_CHAIR ||
- s == PLAYER_STATE_SIT;
+ return
+ s == UNIT_STAND_STATE_SIT_CHAIR || s == UNIT_STAND_STATE_SIT_LOW_CHAIR ||
+ s == UNIT_STAND_STATE_SIT_MEDIUM_CHAIR || s == UNIT_STAND_STATE_SIT_HIGH_CHAIR ||
+ s == UNIT_STAND_STATE_SIT;
}
bool Unit::IsStandState() const
{
uint8 s = getStandState();
- return !IsSitState() && s != PLAYER_STATE_SLEEP && s != PLAYER_STATE_KNEEL;
+ return !IsSitState() && s != UNIT_STAND_STATE_SLEEP && s != UNIT_STAND_STATE_KNEEL;
}
void Unit::SetStandState(uint8 state)
@@ -12158,7 +11623,6 @@ void Unit::ClearComboPointHolders()
void Unit::ClearAllReactives()
{
-
for(int i=0; i < MAX_REACTIVE; ++i)
m_reactiveTimer[i] = 0;
@@ -12166,11 +11630,6 @@ void Unit::ClearAllReactives()
ModifyAuraState(AURA_STATE_DEFENSE, false);
if (getClass() == CLASS_HUNTER && HasAuraState( AURA_STATE_HUNTER_PARRY))
ModifyAuraState(AURA_STATE_HUNTER_PARRY, false);
- if (HasAuraState( AURA_STATE_CRIT))
- ModifyAuraState(AURA_STATE_CRIT, false);
- if (getClass() == CLASS_HUNTER && HasAuraState( AURA_STATE_HUNTER_CRIT_STRIKE) )
- ModifyAuraState(AURA_STATE_HUNTER_CRIT_STRIKE, false);
-
if(getClass() == CLASS_WARRIOR && GetTypeId() == TYPEID_PLAYER)
((Player*)this)->ClearComboPoints();
}
@@ -12198,14 +11657,6 @@ void Unit::UpdateReactives( uint32 p_time )
if ( getClass() == CLASS_HUNTER && HasAuraState(AURA_STATE_HUNTER_PARRY))
ModifyAuraState(AURA_STATE_HUNTER_PARRY, false);
break;
- case REACTIVE_CRIT:
- if (HasAuraState(AURA_STATE_CRIT))
- ModifyAuraState(AURA_STATE_CRIT, false);
- break;
- case REACTIVE_HUNTER_CRIT:
- if ( getClass() == CLASS_HUNTER && HasAuraState(AURA_STATE_HUNTER_CRIT_STRIKE) )
- ModifyAuraState(AURA_STATE_HUNTER_CRIT_STRIKE, false);
- break;
case REACTIVE_OVERPOWER:
if(getClass() == CLASS_WARRIOR && GetTypeId() == TYPEID_PLAYER)
((Player*)this)->ClearComboPoints();
@@ -12225,7 +11676,7 @@ Unit* Unit::SelectNearbyTarget(float dist) const
{
std::list<Unit *> targets;
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
- Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
+ Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(this, targets, u_check);
VisitNearbyObject(dist, searcher);
// remove current target
@@ -12258,6 +11709,16 @@ Unit* Unit::SelectNearbyTarget(float dist) const
return *tcIter;
}
+bool Unit::hasNegativeAuraWithInterruptFlag(uint32 flag)
+{
+ for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); ++iter)
+ {
+ if (!iter->second->IsPositive() && iter->second->GetSpellProto()->AuraInterruptFlags & flag)
+ return true;
+ }
+ return false;
+}
+
void Unit::ApplyAttackTimePercentMod( WeaponAttackType att,float val, bool apply )
{
float remainingTimePct = (float)m_attackTimer[att] / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
@@ -12319,6 +11780,8 @@ uint32 Unit::GetCastingTimeForBonus( SpellEntry const *spellProto, DamageEffectT
case SPELL_AURA_PERIODIC_LEECH:
if ( GetSpellDuration(spellProto) )
overTime = GetSpellDuration(spellProto);
+ if (IsChanneledSpell(spellProto))
+ ModSpellCastTime(spellProto, overTime);
break;
default:
// -5% per additional effect
@@ -12374,13 +11837,15 @@ uint32 Unit::GetCastingTimeForBonus( SpellEntry const *spellProto, DamageEffectT
void Unit::UpdateAuraForGroup(uint8 slot)
{
+ if(slot >= MAX_AURAS) // slot not found, return
+ return;
if(GetTypeId() == TYPEID_PLAYER)
{
Player* player = (Player*)this;
if(player->GetGroup())
{
player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
- player->SetAuraUpdateMask(slot);
+ player->SetAuraUpdateMaskForRaid(slot);
}
}
else if(GetTypeId() == TYPEID_UNIT && ((Creature*)this)->isPet())
@@ -12392,10 +11857,11 @@ void Unit::UpdateAuraForGroup(uint8 slot)
if(owner && (owner->GetTypeId() == TYPEID_PLAYER) && ((Player*)owner)->GetGroup())
{
((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_AURAS);
- pet->SetAuraUpdateMask(slot);
+ pet->SetAuraUpdateMaskForRaid(slot);
}
}
}
+ SetAuraUpdateMask(slot);
}
float Unit::GetAPMultiplier(WeaponAttackType attType, bool normalized)
@@ -12490,7 +11956,12 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, getFaction());
pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
- if(!pet->InitStatsForLevel(creatureTarget->getLevel()))
+ if(GetTypeId()==TYPEID_PLAYER)
+ pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
+
+ uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel();
+
+ if(!pet->InitStatsForLevel(level))
{
sLog.outError("ERROR: Pet::InitStatsForLevel() failed for creature (Entry: %u)!",creatureTarget->GetEntry());
delete pet;
@@ -12501,12 +11972,13 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
// this enables pet details window (Shift+P)
pet->AIM_Initialize();
pet->InitPetCreateSpells();
+ pet->InitTalentForLevel();
pet->SetHealth(pet->GetMaxHealth());
return pet;
}
-bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent )
+bool Unit::IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent )
{
SpellEntry const* spellProto = aura->GetSpellProto ();
@@ -12536,7 +12008,17 @@ bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell,
if(!SpellMgr::IsSpellProcEventCanTriggeredBy(spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
return false;
- // Aura added by spell can`t trogger from self (prevent drop cahres/do triggers)
+ // In most cases req get honor or XP from kill
+ if (EventProcFlag & PROC_FLAG_KILL && GetTypeId() == TYPEID_PLAYER)
+ {
+ bool allow = ((Player*)this)->isHonorOrXPTarget(pVictim);
+ // Shadow Word: Death - can trigger from every kill
+ if (aura->GetId() == 32409)
+ allow = true;
+ if (!allow)
+ return false;
+ }
+ // Aura added by spell can`t trogger from self (prevent drop charges/do triggers)
// But except periodic triggers (can triggered from self)
if(procSpell && procSpell->Id == spellProto->Id && !(spellProto->procFlags&PROC_FLAG_ON_TAKE_PERIODIC))
return false;
@@ -12548,13 +12030,13 @@ bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell,
{
Item *item = NULL;
if(attType == BASE_ATTACK)
- item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
+ item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
else if (attType == OFF_ATTACK)
- item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+ item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
else
- item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED);
+ item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED);
- if (!((Player*)this)->IsUseEquipedWeapon(attType==BASE_ATTACK))
+ if (((Player*)this)->IsInFeralForm())
return false;
if(!item || item->IsBroken() || item->GetProto()->Class != ITEM_CLASS_WEAPON || !((1<<item->GetProto()->SubClass) & spellProto->EquippedItemSubClassMask))
@@ -12563,7 +12045,7 @@ bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell,
else if(spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
{
// Check if player is wearing shield
- Item *item = ((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+ Item *item = ((Player*)this)->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
if(!item || item->IsBroken() || item->GetProto()->Class != ITEM_CLASS_ARMOR || !((1<<item->GetProto()->SubClass) & spellProto->EquippedItemSubClassMask))
return false;
}
@@ -12581,12 +12063,15 @@ bool Unit::IsTriggeredAtSpellProcEvent(Aura* aura, SpellEntry const* procSpell,
}
// Apply chance modifer aura
if(Player* modOwner = GetSpellModOwner())
+ {
modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_CHANCE_OF_SUCCESS,chance);
+ modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_PROC_CHANCE,chance);
+ }
return roll_chance_f(chance);
}
-bool Unit::HandleMeandingAuraProc( Aura* triggeredByAura )
+bool Unit::HandleAuraRaidProcFromChargeWithValue( Aura* triggeredByAura )
{
// aura can be deleted at casts
SpellEntry const* spellProto = triggeredByAura->GetSpellProto();
@@ -12594,43 +12079,52 @@ bool Unit::HandleMeandingAuraProc( Aura* triggeredByAura )
int32 heal = triggeredByAura->GetModifier()->m_amount;
uint64 caster_guid = triggeredByAura->GetCasterGUID();
+ //Currently only Prayer Of Mending
+ if (!(spellProto->SpellFamilyName==SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
+ {
+ sLog.outDebug("Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: %u", spellProto->Id);
+ return false;
+ }
// jumps
- int32 jumps = triggeredByAura->m_procCharges-1;
+ int32 jumps = triggeredByAura->GetAuraCharges()-1;
// current aura expire
- triggeredByAura->m_procCharges = 1; // will removed at next charges decrease
+ triggeredByAura->SetAuraCharges(1); // will removed at next charges decrease
// next target selection
- if(jumps > 0 && GetTypeId()==TYPEID_PLAYER && IS_PLAYER_GUID(caster_guid))
+ if(jumps > 0 && IS_PLAYER_GUID(caster_guid))
{
float radius;
if (spellProto->EffectRadiusIndex[effIdx])
- radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(spellProto->EffectRadiusIndex[effIdx]));
+ radius = GetSpellRadiusForTarget(triggeredByAura->GetCaster(), sSpellRadiusStore.LookupEntry(spellProto->EffectRadiusIndex[effIdx]));
else
- radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(spellProto->rangeIndex));
+ radius = GetSpellMaxRangeForTarget(triggeredByAura->GetCaster() ,sSpellRangeStore.LookupEntry(spellProto->rangeIndex));
+
+ //Get max possible jumps for aura to get proper charges amount for target
+ int32 maxJumps = spellProto->procCharges;
if(Player* caster = ((Player*)triggeredByAura->GetCaster()))
{
caster->ApplySpellMod(spellProto->Id, SPELLMOD_RADIUS, radius,NULL);
- if(Player* target = ((Player*)this)->GetNextRandomRaidMember(radius))
+ caster->ApplySpellMod(spellProto->Id, SPELLMOD_CHARGES, maxJumps, NULL);
+
+ if (Unit* target= GetNextRandomRaidMemberOrPet(radius))
{
// aura will applied from caster, but spell casted from current aura holder
SpellModifier *mod = new SpellModifier;
mod->op = SPELLMOD_CHARGES;
- mod->value = jumps-5; // negative
+ mod->value = jumps-maxJumps; // negative
mod->type = SPELLMOD_FLAT;
mod->spellId = spellProto->Id;
- mod->effectId = effIdx;
- mod->lastAffected = NULL;
- mod->mask = spellProto->SpellFamilyFlags;
- mod->charges = 0;
+ mod->mask = spellProto->SpellFamilyFlags;
caster->AddSpellMod(mod, true);
CastCustomSpell(target,spellProto->Id,&heal,NULL,NULL,true,NULL,triggeredByAura,caster->GetGUID());
caster->AddSpellMod(mod, false);
- heal = caster->SpellHealingBonus(spellProto, heal, HEAL, this);
+ //bonus must be applied after aura cast on target
+ heal = caster->SpellHealingBonus(this, spellProto, heal, HEAL);
}
}
}
@@ -12639,29 +12133,77 @@ bool Unit::HandleMeandingAuraProc( Aura* triggeredByAura )
CastCustomSpell(this,33110,&heal,NULL,NULL,true,NULL,NULL,caster_guid);
return true;
}
-
-void Unit::RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo, Unit * caster)
+bool Unit::HandleAuraRaidProcFromCharge( Aura* triggeredByAura )
{
-/* uint64 target_guid = GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT);
- if(target_guid == GetGUID())
- return;
+ // aura can be deleted at casts
+ SpellEntry const* spellProto = triggeredByAura->GetSpellProto();
- if(!IS_UNIT_GUID(target_guid))
- return;
+ uint32 damageSpellId;
+ switch(spellProto->Id)
+ {
+ case 57949: //shiver
+ damageSpellId=57952;
+// animationSpellId=57951; dummy effects for jump spell have unknown use (see also 41637)
+ break;
+ case 59978: //shiver
+ damageSpellId=59979;
+ break;
+ case 43593: //Cold Stare
+ damageSpellId=43594;
+ break;
+ default:
+ sLog.outDebug("Unit::HandleAuraRaidProcFromCharge, received not handled spell: %u", spellProto->Id);
+ return false;
+ }
- Unit* target = ObjectAccessor::GetUnit(*this, target_guid);*/
- if(!caster)
- return;
+ uint64 caster_guid = triggeredByAura->GetCasterGUID();
+ uint32 effIdx = triggeredByAura->GetEffIndex();
+
+ // jumps
+ int32 jumps = triggeredByAura->GetAuraCharges()-1;
+
+ // current aura expire
+ triggeredByAura->SetAuraCharges(1); // will removed at next charges decrease
- for (AuraMap::iterator iter = GetAuras().begin(); iter != GetAuras().end(); )
+ // next target selection
+ if(jumps > 0 && IS_PLAYER_GUID(caster_guid))
{
- if (iter->second->GetId() == spellInfo->Id && iter->second->GetCasterGUID() == caster->GetGUID())
- RemoveAura(iter);
+ float radius;
+ if (spellProto->EffectRadiusIndex[effIdx])
+ radius = GetSpellRadiusForTarget(triggeredByAura->GetCaster(), sSpellRadiusStore.LookupEntry(spellProto->EffectRadiusIndex[effIdx]));
else
- ++iter;
+ radius = GetSpellMaxRangeForTarget(triggeredByAura->GetCaster() ,sSpellRangeStore.LookupEntry(spellProto->rangeIndex));
+
+ //Get max possible jumps for aura to get proper charges amount for target
+ int32 maxJumps = spellProto->procCharges;
+
+ if(Player* caster = ((Player*)triggeredByAura->GetCaster()))
+ {
+ caster->ApplySpellMod(spellProto->Id, SPELLMOD_RADIUS, radius,NULL);
+
+ caster->ApplySpellMod(spellProto->Id, SPELLMOD_CHARGES, maxJumps, NULL);
+
+ if (Unit* target= GetNextRandomRaidMemberOrPet(radius))
+ {
+ // aura will applied from caster, but spell casted from current aura holder
+ SpellModifier *mod = new SpellModifier;
+ mod->op = SPELLMOD_CHARGES;
+ mod->value = jumps-maxJumps; // negative
+ mod->type = SPELLMOD_FLAT;
+ mod->spellId = spellProto->Id;
+ mod->mask = spellProto->SpellFamilyFlags;
+
+ caster->AddSpellMod(mod, true);
+ CastSpell(this, spellProto, true,NULL,triggeredByAura,caster_guid);
+ caster->AddSpellMod(mod, false);
+ }
+ }
}
-}
+ CastSpell(this, damageSpellId, true,NULL,triggeredByAura,caster_guid);
+
+ return true;
+}
/*-----------------------TRINITY-----------------------------*/
void Unit::SetToNotify()
@@ -12684,7 +12226,7 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
if(player && player!=pVictim)
{
if(player->RewardPlayerAndGroupAtKill(pVictim))
- player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL_AND_GET_XP, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
+ player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
else
player->ProcDamageAndSpell(pVictim, PROC_FLAG_NONE, PROC_FLAG_KILLED,PROC_EX_NONE, 0);
}
@@ -12816,6 +12358,15 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
bg->HandleKillUnit((Creature*)pVictim, player);
}
}
+
+ // achievement stuff
+ if ( pVictim->GetTypeId() == TYPEID_PLAYER)
+ {
+ if(GetTypeId() == TYPEID_UNIT)
+ ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
+ else if(GetTypeId() == TYPEID_PLAYER)
+ ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1);
+ }
}
void Unit::SetControlled(bool apply, UnitState state)
@@ -12885,7 +12436,7 @@ void Unit::SetStunned(bool apply)
if(apply)
{
SetUInt64Value(UNIT_FIELD_TARGET, 0);
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
CastStop();
// Creature specific
@@ -12903,7 +12454,7 @@ void Unit::SetStunned(bool apply)
{
if(isAlive() && getVictim())
SetUInt64Value(UNIT_FIELD_TARGET, getVictim()->GetGUID());
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
if(!hasUnitState(UNIT_STAT_ROOT)) // prevent allow move if have also root effect
{
@@ -13039,7 +12590,7 @@ void Unit::SetCharmedOrPossessedBy(Unit* charmer, bool possess)
{
if(((Player*)this)->isAFK())
((Player*)this)->ToggleAFK();
- ((Player*)this)->SetViewport(GetGUID(), false);
+ ((Player*)this)->SetClientControl(this, 0);
}
// Pets already have a properly initialized CharmInfo, don't overwrite it.
@@ -13057,9 +12608,10 @@ void Unit::SetCharmedOrPossessedBy(Unit* charmer, bool possess)
if(possess)
{
addUnitState(UNIT_STAT_POSSESSED);
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
AddPlayerToVision((Player*)charmer);
- ((Player*)charmer)->SetViewport(GetGUID(), true);
+ ((Player*)charmer)->SetClientControl(this, 1);
+ ((Player*)charmer)->SetMover(this);
charmer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
// Charm demon
@@ -13108,7 +12660,7 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
if(possess)
{
clearUnitState(UNIT_STAT_POSSESSED);
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
}
if(GetTypeId() == TYPEID_UNIT)
@@ -13129,7 +12681,7 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
}
}
else
- ((Player*)this)->SetViewport(GetGUID(), true);
+ ((Player*)this)->SetClientControl(this, 1);
// If charmer still exists
if(!charmer)
@@ -13141,7 +12693,8 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
if(possess)
{
RemovePlayerFromVision((Player*)charmer);
- ((Player*)charmer)->SetViewport(charmer->GetGUID(), true);
+ ((Player*)charmer)->SetClientControl(charmer, 1);
+ ((Player*)charmer)->SetMover(charmer);
charmer->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
// restore UNIT_FIELD_BYTES_0
@@ -13282,6 +12835,55 @@ void Unit::GetPartyMember(std::list<Unit*> &TagUnitMap, float radius)
}
}
+void Unit::SendAuraUpdate(uint8 slot)
+{
+ WorldPacket data(SMSG_AURA_UPDATE);
+
+ Aura * ptr=NULL;
+ VisibleAuraMap const *visibleAuras = GetVisibleAuras();
+ AuraSlotEntry * entry=GetVisibleAura(slot);
+ if (!entry)
+ return;
+
+ //Get pointer to first aura-it doesn't matter which one we use (at least it shouldn't)
+ for (uint8 i=0 ; i<3; i++)
+ {
+ if (entry->m_slotAuras[i])
+ {
+ ptr=entry->m_slotAuras[i];
+ break;
+ }
+ }
+
+ data.append(GetPackGUID());
+ data << uint8(slot);
+ data << uint32(ptr ? ptr->GetId() : 0);
+
+ if(!ptr)
+ {
+ RemoveVisibleAura(slot);
+ SendMessageToSet(&data, true);
+ return;
+ }
+
+ data << uint8(entry->m_Flags);
+ data << uint8(entry->m_Level);
+ data << uint8(ptr->GetAuraCharges()? ptr->GetAuraCharges() : ptr->GetStackAmount());
+
+ if(!(entry->m_Flags & AFLAG_NOT_CASTER))
+ {
+ data << uint8(0); // pguid
+ }
+
+ if(entry->m_Flags & AFLAG_DURATION)
+ {
+ data << uint32(ptr->GetAuraMaxDuration());
+ data << uint32(ptr->GetAuraDuration());
+ }
+
+ SendMessageToSet(&data, true);
+}
+
void Unit::AddAura(uint32 spellId, Unit* target)
{
if(!target || !target->isAlive())
@@ -13298,7 +12900,7 @@ void Unit::AddAura(uint32 spellId, Unit* target)
{
if(spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA)
{
- if(target->IsImmunedToSpellEffect(spellInfo->Effect[i], spellInfo->EffectMechanic[i]))
+ if(target->IsImmunedToSpellEffect(spellInfo, i))
continue;
/*if(spellInfo->EffectImplicitTargetA[i] == TARGET_UNIT_CASTER)
@@ -13315,3 +12917,68 @@ void Unit::AddAura(uint32 spellId, Unit* target)
}
}
+// Melee based spells can be miss, parry or dodge on this step
+// Crit or block - determined on damage calculation phase! (and can be both in some time)
+float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
+{
+ // Calculate hit chance (more correct for chance mod)
+ int32 HitChance;
+
+ // PvP - PvE melee chances
+ /*int32 lchance = pVictim->GetTypeId() == TYPEID_PLAYER ? 5 : 7;
+ int32 leveldif = pVictim->getLevelForTarget(this) - getLevelForTarget(pVictim);
+ if(leveldif < 3)
+ HitChance = 95 - leveldif;
+ else
+ HitChance = 93 - (leveldif - 2) * lchance;*/
+ if (spellId || attType == RANGED_ATTACK || !haveOffhandWeapon())
+ HitChance = 95.0f;
+ else
+ HitChance = 76.0f;
+
+ // Hit chance depends from victim auras
+ if(attType == RANGED_ATTACK)
+ HitChance += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE);
+ else
+ HitChance += pVictim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE);
+
+ // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
+ if(spellId)
+ {
+ if(Player *modOwner = GetSpellModOwner())
+ modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, HitChance);
+ }
+
+ // Miss = 100 - hit
+ float miss_chance= 100.0f - HitChance;
+
+ // Bonuses from attacker aura and ratings
+ if (attType == RANGED_ATTACK)
+ miss_chance -= m_modRangedHitChance;
+ else
+ miss_chance -= m_modMeleeHitChance;
+
+ // bonus from skills is 0.04%
+ //miss_chance -= skillDiff * 0.04f;
+ int32 diff = -skillDiff;
+ if(pVictim->GetTypeId()==TYPEID_PLAYER)
+ miss_chance += diff > 0 ? diff * 0.04 : diff * 0.02;
+ else
+ miss_chance += diff > 10 ? 2 + (diff - 10) * 0.4 : diff * 0.1;
+
+ // Limit miss chance from 0 to 60%
+ if (miss_chance < 0.0f)
+ return 0.0f;
+ if (miss_chance > 60.0f)
+ return 60.0f;
+ return miss_chance;
+}
+
+void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
+{
+ WorldObject::SetPhaseMask(newPhaseMask,update);
+
+ if(IsInWorld())
+ if(Pet* pet = GetPet())
+ pet->SetPhaseMask(newPhaseMask,true);
+}
diff --git a/src/game/Unit.h b/src/game/Unit.h
index c6648f00a30..7bc2f5b53b3 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -45,7 +45,8 @@ enum SpellInterruptFlags
SPELL_INTERRUPT_FLAG_PUSH_BACK = 0x02, // push back
SPELL_INTERRUPT_FLAG_INTERRUPT = 0x04, // interrupt
SPELL_INTERRUPT_FLAG_AUTOATTACK = 0x08, // no
- SPELL_INTERRUPT_FLAG_DAMAGE = 0x10 // _complete_ interrupt on direct damage?
+ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG = 0x10, // _complete_ interrupt on direct damage
+ //SPELL_INTERRUPT_UNK = 0x20 // unk, 564 of 727 spells having this spell start with "Glyph"
};
enum SpellChannelInterruptFlags
@@ -101,7 +102,7 @@ enum SpellModOp
SPELLMOD_CASTING_TIME = 10,
SPELLMOD_COOLDOWN = 11,
SPELLMOD_EFFECT2 = 12,
- // spellmod 13 unused
+ SPELLMOD_IGNORE_ARMOR = 13,
SPELLMOD_COST = 14,
SPELLMOD_CRIT_DAMAGE_BONUS = 15,
SPELLMOD_RESIST_MISS_CHANCE = 16,
@@ -109,13 +110,16 @@ enum SpellModOp
SPELLMOD_CHANCE_OF_SUCCESS = 18,
SPELLMOD_ACTIVATION_TIME = 19,
SPELLMOD_EFFECT_PAST_FIRST = 20,
- SPELLMOD_CASTING_TIME_OLD = 21,
+ SPELLMOD_GLOBAL_COOLDOWN = 21, //TODO: GCD is not checked by server currently
SPELLMOD_DOT = 22,
SPELLMOD_EFFECT3 = 23,
SPELLMOD_SPELL_BONUS_DAMAGE = 24,
- // spellmod 25, 26 unused
+ // spellmod 25
+ SPELLMOD_PROC_CHANCE = 26,
SPELLMOD_MULTIPLE_VALUE = 27,
- SPELLMOD_RESIST_DISPEL_CHANCE = 28
+ SPELLMOD_RESIST_DISPEL_CHANCE = 28,
+ SPELLMOD_CRIT_DAMAGE_BONUS_2 = 29, //one not used spell
+ SPELLMOD_SPELL_COST_REFUND_ON_FAIL = 30
};
#define MAX_SPELLMOD 32
@@ -129,6 +133,35 @@ enum SpellFacingFlags
#define BASE_MAXDAMAGE 2.0f
#define BASE_ATTACK_TIME 2000
+// byte value (UNIT_FIELD_BYTES_1,0)
+enum UnitStandStateType
+{
+ UNIT_STAND_STATE_STAND = 0,
+ UNIT_STAND_STATE_SIT = 1,
+ UNIT_STAND_STATE_SIT_CHAIR = 2,
+ UNIT_STAND_STATE_SLEEP = 3,
+ UNIT_STAND_STATE_SIT_LOW_CHAIR = 4,
+ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR = 5,
+ UNIT_STAND_STATE_SIT_HIGH_CHAIR = 6,
+ UNIT_STAND_STATE_DEAD = 7,
+ UNIT_STAND_STATE_KNEEL = 8
+};
+
+// byte flag value (UNIT_FIELD_BYTES_1,2)
+enum UnitStandFlags
+{
+ UNIT_STAND_FLAGS_CREEP = 0x02,
+ UNIT_STAND_FLAGS_ALL = 0xFF
+};
+
+// byte flags value (UNIT_FIELD_BYTES_1,3)
+enum UnitBytes1_Flags
+{
+ UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01,
+ UNIT_BYTE1_FLAG_UNTRACKABLE = 0x04,
+ UNIT_BYTE1_FLAG_ALL = 0xFF
+};
+
// high byte (3 from 0..3) of UNIT_FIELD_BYTES_2
enum ShapeshiftForm
{
@@ -149,6 +182,7 @@ enum ShapeshiftForm
FORM_BERSERKERSTANCE = 0x13,
FORM_TEST = 0x14,
FORM_ZOMBIE = 0x15,
+ FORM_METAMORPHOSIS = 0x16,
FORM_FLIGHT_EPIC = 0x1B,
FORM_SHADOW = 0x1C,
FORM_FLIGHT = 0x1D,
@@ -168,14 +202,14 @@ enum SheathState
// byte (1 from 0..3) of UNIT_FIELD_BYTES_2
enum UnitBytes2_Flags
{
- UNIT_BYTE2_FLAG_UNK0 = 0x01,
- UNIT_BYTE2_FLAG_UNK1 = 0x02,
- UNIT_BYTE2_FLAG_UNK2 = 0x04,
+ UNIT_BYTE2_FLAG_PVP = 0x01,
+ UNIT_BYTE2_FLAG_UNK1 = 0x02,
+ UNIT_BYTE2_FLAG_FFA_PVP = 0x04,
UNIT_BYTE2_FLAG_SANCTUARY = 0x08,
- UNIT_BYTE2_FLAG_AURAS = 0x10, // show possitive auras as positive, and allow its dispel
- UNIT_BYTE2_FLAG_UNK5 = 0x20,
- UNIT_BYTE2_FLAG_UNK6 = 0x40,
- UNIT_BYTE2_FLAG_UNK7 = 0x80
+ UNIT_BYTE2_FLAG_UNK4 = 0x10,
+ UNIT_BYTE2_FLAG_UNK5 = 0x20,
+ UNIT_BYTE2_FLAG_UNK6 = 0x40,
+ UNIT_BYTE2_FLAG_UNK7 = 0x80
};
// byte (2 from 0..3) of UNIT_FIELD_BYTES_2
@@ -185,7 +219,7 @@ enum UnitRename
UNIT_RENAME_ALLOWED = 0x03
};
-#define CREATURE_MAX_SPELLS 4
+#define CREATURE_MAX_SPELLS 8
enum Swing
{
@@ -213,16 +247,27 @@ enum HitInfo
HITINFO_UNK1 = 0x00000001, // req correct packet structure
HITINFO_NORMALSWING2 = 0x00000002,
HITINFO_LEFTSWING = 0x00000004,
+ HITINFO_UNK2 = 0x00000008,
HITINFO_MISS = 0x00000010,
- HITINFO_ABSORB = 0x00000020, // plays absorb sound
- HITINFO_RESIST = 0x00000040, // resisted at least some damage
- HITINFO_CRITICALHIT = 0x00000080,
- HITINFO_UNK2 = 0x00000100, // wotlk?
- HITINFO_UNK3 = 0x00002000, // wotlk?
- HITINFO_GLANCING = 0x00004000,
- HITINFO_CRUSHING = 0x00008000,
- HITINFO_NOACTION = 0x00010000,
- HITINFO_SWINGNOHITSOUND = 0x00080000
+ HITINFO_ABSORB = 0x00000020, // absorbed damage
+ HITINFO_ABSORB2 = 0x00000040, // absorbed damage
+ HITINFO_RESIST = 0x00000080, // resisted atleast some damage
+ HITINFO_RESIST2 = 0x00000100, // resisted atleast some damage
+ HITINFO_CRITICALHIT = 0x00000200, // critical hit
+ // 0x00000400
+ // 0x00000800
+ // 0x00001000
+ HITINFO_BLOCK = 0x00002000, // blocked damage
+ // 0x00004000
+ // 0x00008000
+ HITINFO_GLANCING = 0x00010000,
+ HITINFO_CRUSHING = 0x00020000,
+ HITINFO_NOACTION = 0x00040000, // guessed
+ // 0x00080000
+ // 0x00100000
+ HITINFO_SWINGNOHITSOUND = 0x00200000, // guessed
+ // 0x00400000
+ HITINFO_UNK3 = 0x00800000
};
//i would like to remove this: (it is defined in item.h
@@ -294,11 +339,13 @@ enum UnitMods
UNIT_MOD_STAT_INTELLECT,
UNIT_MOD_STAT_SPIRIT,
UNIT_MOD_HEALTH,
- UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_HAPPINESS must be in existed order, it's accessed by index values of Powers enum.
+ UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_RUNIC_POWER must be in existed order, it's accessed by index values of Powers enum.
UNIT_MOD_RAGE,
UNIT_MOD_FOCUS,
UNIT_MOD_ENERGY,
UNIT_MOD_HAPPINESS,
+ UNIT_MOD_RUNE,
+ UNIT_MOD_RUNIC_POWER,
UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum.
UNIT_MOD_RESISTANCE_HOLY,
UNIT_MOD_RESISTANCE_FIRE,
@@ -318,7 +365,7 @@ enum UnitMods
UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR,
UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1,
UNIT_MOD_POWER_START = UNIT_MOD_MANA,
- UNIT_MOD_POWER_END = UNIT_MOD_HAPPINESS + 1
+ UNIT_MOD_POWER_END = UNIT_MOD_RUNIC_POWER + 1
};
enum BaseModGroup
@@ -385,9 +432,10 @@ enum UnitMoveType
MOVE_TURN_RATE = 5,
MOVE_FLIGHT = 6,
MOVE_FLIGHT_BACK = 7,
+ MOVE_PITCH_RATE = 8
};
-#define MAX_MOVE_TYPE 8
+#define MAX_MOVE_TYPE 9
extern float baseMoveSpeed[MAX_MOVE_TYPE];
// assume it is 25 yard per 0.6 second
@@ -397,11 +445,10 @@ enum WeaponAttackType
{
BASE_ATTACK = 0,
OFF_ATTACK = 1,
- RANGED_ATTACK = 2
+ RANGED_ATTACK = 2,
+ MAX_ATTACK
};
-#define MAX_ATTACK 3
-
enum CombatRating
{
CR_WEAPON_SKILL = 0,
@@ -427,10 +474,11 @@ enum CombatRating
CR_WEAPON_SKILL_MAINHAND = 20,
CR_WEAPON_SKILL_OFFHAND = 21,
CR_WEAPON_SKILL_RANGED = 22,
- CR_EXPERTISE = 23
+ CR_EXPERTISE = 23,
+ CR_ARMOR_PENETRATION = 24
};
-#define MAX_COMBAT_RATING 24
+#define MAX_COMBAT_RATING 25
enum DamageEffectType
{
@@ -455,45 +503,50 @@ enum UnitVisibility
// Value masks for UNIT_FIELD_FLAGS
enum UnitFlags
{
- UNIT_FLAG_UNKNOWN7 = 0x00000001,
+ UNIT_FLAG_UNK_0 = 0x00000001,
UNIT_FLAG_NON_ATTACKABLE = 0x00000002, // not attackable
UNIT_FLAG_DISABLE_MOVE = 0x00000004,
UNIT_FLAG_PVP_ATTACKABLE = 0x00000008, // allow apply pvp rules to attackable state in addition to faction dependent state
UNIT_FLAG_RENAME = 0x00000010,
UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
- UNIT_FLAG_UNKNOWN9 = 0x00000040,
+ UNIT_FLAG_UNK_6 = 0x00000040,
UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
UNIT_FLAG_NOT_ATTACKABLE_2 = 0x00000100, // 2.0.8
- UNIT_FLAG_UNKNOWN11 = 0x00000200,
+ UNIT_FLAG_UNK_9 = 0x00000200, // 3.0.3 - makes you unable to attack everything
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
- UNIT_FLAG_PVP = 0x00001000,
+ UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
UNIT_FLAG_SILENCED = 0x00002000, // silenced, 2.1.1
- UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
- UNIT_FLAG_UNKNOWN13 = 0x00008000,
- UNIT_FLAG_UNKNOWN14 = 0x00010000,
- UNIT_FLAG_PACIFIED = 0x00020000,
- UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // stunned, 2.1.1
+ UNIT_FLAG_UNK_14 = 0x00004000, // 2.0.8
+ UNIT_FLAG_UNK_15 = 0x00008000,
+ UNIT_FLAG_UNK_16 = 0x00010000,
+ UNIT_FLAG_PACIFIED = 0x00020000, // 3.0.3 ok
+ UNIT_FLAG_STUNNED = 0x00040000, // 3.0.3 ok
UNIT_FLAG_IN_COMBAT = 0x00080000,
UNIT_FLAG_TAXI_FLIGHT = 0x00100000, // disable casting at client side spell not allowed by taxi flight (mounted?), probably used with 0x4 flag
- UNIT_FLAG_DISARMED = 0x00200000, // disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
+ UNIT_FLAG_DISARMED = 0x00200000, // 3.0.3, disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
UNIT_FLAG_CONFUSED = 0x00400000,
UNIT_FLAG_FLEEING = 0x00800000,
- UNIT_FLAG_UNKNOWN5 = 0x01000000, // used in spell Eyes of the Beast for pet...
+ UNIT_FLAG_UNK_24 = 0x01000000, // used in spell Eyes of the Beast for pet...
UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
UNIT_FLAG_SKINNABLE = 0x04000000,
UNIT_FLAG_MOUNT = 0x08000000,
- UNIT_FLAG_UNKNOWN17 = 0x10000000,
- UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
- UNIT_FLAG_SHEATHE = 0x40000000
+ UNIT_FLAG_UNK_28 = 0x10000000,
+ UNIT_FLAG_UNK_29 = 0x20000000, // used in Feing Death spell
+ UNIT_FLAG_SHEATHE = 0x40000000,
+ UNIT_FLAG_UNK_31 = 0x80000000
};
// Value masks for UNIT_FIELD_FLAGS_2
enum UnitFlags2
{
- UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
- UNIT_FLAG2_COMPREHEND_LANG= 0x00000008,
- UNIT_FLAG2_FORCE_MOVE = 0x00000040
+ UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
+ UNIT_FLAG2_UNK1 = 0x00000002, // Hide unit model (show only player equip)
+ UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
+ UNIT_FLAG2_FORCE_MOVE = 0x00000040,
+ UNIT_FLAG2_DISARM_OFFHAND = 0x00000080,
+ UNIT_FLAG2_DISARM_RANGED = 0x00000400, //this does not disable ranged weapon display (maybe additional flag needed?)
+ UNIT_FLAG2_REGENERATE_POWER = 0x00000800
};
/// Non Player Character flags
@@ -581,7 +634,9 @@ enum DiminishingLevels
struct DiminishingReturn
{
- DiminishingReturn(DiminishingGroup group, uint32 t, uint32 count) : DRGroup(group), hitTime(t), hitCount(count), stack(0) {}
+ DiminishingReturn(DiminishingGroup group, uint32 t, uint32 count)
+ : DRGroup(group), stack(0), hitTime(t), hitCount(count)
+ {}
DiminishingGroup DRGroup:16;
uint16 stack:16;
@@ -592,8 +647,9 @@ struct DiminishingReturn
enum MeleeHitOutcome
{
MELEE_HIT_EVADE, MELEE_HIT_MISS, MELEE_HIT_DODGE, MELEE_HIT_BLOCK, MELEE_HIT_PARRY,
- MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL, MELEE_HIT_BLOCK_CRIT
+ MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL
};
+
struct CleanDamage
{
CleanDamage(uint32 _damage, WeaponAttackType _attackType, MeleeHitOutcome _hitOutCome) :
@@ -628,9 +684,11 @@ struct CalcDamageInfo
// Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode
struct SpellNonMeleeDamage{
- SpellNonMeleeDamage(Unit *_attacker, Unit *_target, uint32 _SpellID, uint32 _schoolMask) :
- attacker(_attacker), target(_target), SpellID(_SpellID), damage(0), schoolMask(_schoolMask),
- absorb(0), resist(0), phusicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0) {}
+ SpellNonMeleeDamage(Unit *_attacker, Unit *_target, uint32 _SpellID, uint32 _schoolMask)
+ : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), schoolMask(_schoolMask),
+ absorb(0), resist(0), phusicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0)
+ {}
+
Unit *target;
Unit *attacker;
uint32 SpellID;
@@ -650,8 +708,20 @@ uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missC
struct UnitActionBarEntry
{
- uint32 Type;
- uint32 SpellOrAction;
+ UnitActionBarEntry() : Raw(0) {}
+
+ union
+ {
+ struct
+ {
+ uint16 SpellOrAction;
+ uint16 Type;
+ };
+ struct
+ {
+ uint32 Raw;
+ };
+ };
};
#define MAX_DECLINED_NAME_CASES 5
@@ -673,13 +743,12 @@ enum CurrentSpellTypes
enum ActiveStates
{
- ACT_ENABLED = 0xC100,
- ACT_DISABLED = 0x8100,
- ACT_COMMAND = 0x0700,
- ACT_REACTION = 0x0600,
- ACT_CAST = 0x0100,
- ACT_PASSIVE = 0x0000,
- ACT_DECIDE = 0x0001
+ ACT_PASSIVE = 0x0100, // 0x0100 - passive
+ ACT_DISABLED = 0x8100, // 0x8000 - castable
+ ACT_ENABLED = 0xC100, // 0x4000 | 0x8000 - auto cast + castable
+ ACT_COMMAND = 0x0700, // 0x0100 | 0x0200 | 0x0400
+ ACT_REACTION = 0x0600, // 0x0200 | 0x0400
+ ACT_DECIDE = 0x0001 // what is it?
};
enum ReactStates
@@ -744,16 +813,22 @@ struct TRINITY_DLL_SPEC CharmInfo
enum ReactiveType
{
- REACTIVE_DEFENSE = 1,
- REACTIVE_HUNTER_PARRY = 2,
- REACTIVE_CRIT = 3,
- REACTIVE_HUNTER_CRIT = 4,
- REACTIVE_OVERPOWER = 5
+ REACTIVE_DEFENSE = 0,
+ REACTIVE_HUNTER_PARRY = 1,
+ REACTIVE_OVERPOWER = 2
};
-#define MAX_REACTIVE 6
+#define MAX_REACTIVE 3
#define MAX_TOTEM 4
+struct AuraSlotEntry
+{
+ uint8 m_Flags;
+ uint8 m_Level;
+ uint32 m_spellId;
+ Aura * m_slotAuras[3];
+};
+
// delay time next attack to prevent client attack animation problems
#define ATTACK_DISPLAY_DELAY 200
@@ -767,9 +842,10 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
typedef std::multimap< spellEffectPair, Aura*> AuraMap;
typedef std::list<Aura *> AuraList;
typedef std::list<DiminishingReturn> Diminishing;
- typedef std::set<AuraType> AuraTypeSet;
typedef std::set<uint32> ComboPointHolderSet;
+ typedef std::map<uint8, AuraSlotEntry> VisibleAuraMap;
+
virtual ~Unit ( );
void AddToWorld();
@@ -783,7 +859,13 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void ApplyDiminishingAura(DiminishingGroup group, bool apply);
void ClearDiminishings() { m_Diminishing.clear(); }
+ //target dependent range checks
+ uint32 GetSpellMaxRangeForTarget(Unit* target,const SpellRangeEntry * rangeEntry);
+ uint32 GetSpellMinRangeForTarget(Unit* target,const SpellRangeEntry * rangeEntry);
+ uint32 GetSpellRadiusForTarget(Unit* target,const SpellRadiusEntry * radiusEntry);
+
virtual void Update( uint32 time );
+ void UpdateAuras();
void setAttackTimer(WeaponAttackType type, uint32 time) { m_attackTimer[type] = time; }
void resetAttackTimer(WeaponAttackType type = BASE_ATTACK);
@@ -808,9 +890,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
}
void _removeAttacker(Unit *pAttacker) // must be called only from Unit::AttackStop()
{
- AttackerSet::iterator itr = m_attackers.find(pAttacker);
- if(itr != m_attackers.end())
- m_attackers.erase(itr);
+ m_attackers.erase(pAttacker);
}
Unit * getAttackerForHelper() // If someone wants to help, who to give them
{
@@ -832,6 +912,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void CombatStop(bool cast = false);
void CombatStopWithPets(bool cast = false);
Unit* SelectNearbyTarget(float dist = NOMINAL_MELEE_RANGE) const;
+ bool hasNegativeAuraWithInterruptFlag(uint32 flag);
void addUnitState(uint32 f) { m_state |= f; }
bool hasUnitState(const uint32 f) const { return (m_state & f); }
@@ -899,8 +980,14 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
return false;
}
- bool IsPvP() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); }
- void SetPvP(bool state) { if(state) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); else RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); }
+ bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); }
+ void SetPvP(bool state)
+ {
+ if(state)
+ SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
+ else
+ RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
+ }
uint32 GetCreatureType() const;
uint32 GetCreatureTypeMask() const
{
@@ -913,6 +1000,9 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool IsStandState() const;
void SetStandState(uint8 state);
+ void SetStandFlags(uint8 flags) { SetByteFlag(UNIT_FIELD_BYTES_1, 2,flags); }
+ void RemoveStandFlags(uint8 flags) { RemoveByteFlag(UNIT_FIELD_BYTES_1, 2,flags); }
+
bool IsMounted() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT ); }
uint32 GetMountID() const { return GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID); }
void Mount(uint32 mount);
@@ -935,6 +1025,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss);
void CalculateSpellDamageTaken(SpellNonMeleeDamage *damageInfo, int32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType = BASE_ATTACK);
+ int32 GetIgnoredArmorMultiplier(SpellEntry const *spellInfo, WeaponAttackType attackType);
void DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss);
float MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const;
@@ -946,6 +1037,16 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
float GetUnitParryChance() const;
float GetUnitBlockChance() const;
float GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVictim) const;
+ bool CanUseAttackType( uint8 attacktype ) const
+ {
+ switch(attacktype)
+ {
+ case BASE_ATTACK: return !HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED);
+ case OFF_ATTACK: return !HasFlag(UNIT_FIELD_FLAGS_2,UNIT_FLAG2_DISARM_OFFHAND);
+ case RANGED_ATTACK: return !HasFlag(UNIT_FIELD_FLAGS_2,UNIT_FLAG2_DISARM_RANGED);
+ }
+ return true;
+ }
virtual uint32 GetShieldBlockValue() const =0;
uint32 GetUnitMeleeSkill(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
@@ -955,7 +1056,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const;
- MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance, bool SpellCasted ) const;
+ MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const;
bool isVendor() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VENDOR ); }
bool isTrainer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER ); }
@@ -995,7 +1096,10 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool HasAuraType(AuraType auraType) const;
bool HasAura(uint32 spellId, uint32 effIndex) const
- { return m_Auras.find(spellEffectPair(spellId, effIndex)) != m_Auras.end(); }
+ {
+ return m_Auras.find(spellEffectPair(spellId, effIndex)) != m_Auras.end();
+ }
+ bool HasAura(uint32 spellId) const;
bool virtual HasSpell(uint32 /*spellID*/) const { return false; }
@@ -1040,7 +1144,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 Time, Player* player = NULL);
//void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end);
- void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFlags, uint32 transitTime = 0, Player* player = NULL);
+ void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL);
void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL);
virtual void MoveOutOfRange(Player &) { };
@@ -1086,6 +1190,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SetPet(Pet* pet);
void SetCharm(Unit* pet);
+ Unit* GetNextRandomRaidMemberOrPet(float radius);
void SetCharmedOrPossessedBy(Unit* charmer, bool possess);
void RemoveCharmedOrPossessedBy(Unit* charmer);
void RestoreFaction();
@@ -1117,11 +1222,11 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
void RemoveAura(uint32 spellId, uint32 effindex, Aura* except = NULL);
- void RemoveSingleAuraFromStackByDispel(uint32 spellId);
+ void RemoveSingleSpellAurasFromStack(uint32 spellId);
void RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex);
void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
- void RemoveAurasDueToCasterSpell(uint32 spellId, uint64 guid);
+ void RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID);
void RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
void RemoveAurasDueToSpellByCancel(uint32 spellId);
@@ -1237,13 +1342,13 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
bool canDetectInvisibilityOf(Unit const* u) const;
bool canDetectStealthOf(Unit const* u, float distance) const;
+ void SetPhaseMask(uint32 newPhaseMask, bool update);// overwrite WorldObject::SetPhaseMask
// virtual functions for all world objects types
bool isVisibleForInState(Player const* u, bool inVisibleList) const;
// function for low level grid visibility checks in player/creature cases
virtual bool IsVisibleInGridForPlayer(Player const* pl) const = 0;
- bool waterbreath;
AuraList & GetSingleCastAuras() { return m_scAuras; }
AuraList const& GetSingleCastAuras() const { return m_scAuras; }
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY];
@@ -1260,12 +1365,31 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void removeHatedBy(HostilReference* /*pHostilReference*/ ) { /* nothing to do yet */ }
HostilRefManager& getHostilRefManager() { return m_HostilRefManager; }
+ VisibleAuraMap const *GetVisibleAuras() { return &m_visibleAuras; }
+ AuraSlotEntry * GetVisibleAura(uint8 slot)
+ {
+ VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
+ if(itr != m_visibleAuras.end())
+ return &itr->second;
+ return 0;
+ }
+ void SetVisibleAura(uint8 slot, AuraSlotEntry entry) { m_visibleAuras[slot] = entry; }
+ void RemoveVisibleAura(uint8 slot) { m_visibleAuras.erase(slot); }
+
+ const uint64& GetAuraUpdateMask() const { return m_auraUpdateMask; }
+ void SetAuraUpdateMask(uint8 slot) { m_auraUpdateMask |= (uint64(1) << slot); }
+ void ResetAuraUpdateMask() { m_auraUpdateMask = 0; }
+ void SendAuraUpdate(uint8 slot);
+
Aura* GetAura(uint32 spellId, uint32 effindex);
+ Aura* GetAura(AuraType type, uint32 family, uint32 familyFlag1 = 0, uint32 familyFlag2 = 0, uint32 familyFlag3 = 0, uint64 casterGUID = 0);
+
AuraMap & GetAuras() { return m_Auras; }
AuraMap const& GetAuras() const { return m_Auras; }
AuraList const& GetAurasByType(AuraType type) const { return m_modAuras[type]; }
void ApplyAuraProcTriggerDamage(Aura* aura, bool apply);
+ bool HasAuraTypeWithMiscvalue(AuraType auratype, uint32 miscvalue) const;
int32 GetTotalAuraModifier(AuraType auratype) const;
float GetTotalAuraMultiplier(AuraType auratype) const;
int32 GetMaxPositiveAuraModifier(AuraType auratype) const;
@@ -1311,11 +1435,13 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
int32 SpellBaseHealingBonus(SpellSchoolMask schoolMask);
int32 SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
int32 SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
- uint32 SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 damage, DamageEffectType damagetype);
- uint32 SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, Unit *pVictim);
+ uint32 SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 damage, DamageEffectType damagetype, uint32 stack = 1);
+ uint32 SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1);
bool isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAttackType attackType = BASE_ATTACK);
+ bool isBlockCritical();
bool isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType = BASE_ATTACK);
- uint32 SpellCriticalBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
+ uint32 SpellCriticalDamageBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
+ uint32 SpellCriticalHealingBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
void SetLastManaUse(uint32 spellCastTime) { m_lastManaUse = spellCastTime; }
bool IsUnderLastManaUseEffect() const;
@@ -1327,14 +1453,14 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply);
void ApplySpellDispelImmunity(const SpellEntry * spellProto, DispelType type, bool apply);
- virtual bool IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges = false);
+ virtual bool IsImmunedToSpell(SpellEntry const* spellInfo);
// redefined in Creature
- bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask, bool useCharges = false);
- virtual bool IsImmunedToSpellEffect(uint32 effect, uint32 mechanic) const;
+ bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask);
+ virtual bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
// redefined in Creature
- uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage);
- void CalcAbsorbResist(Unit *pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist);
+ uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType=MAX_ATTACK);
+ void CalcAbsorbResist(Unit *pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist, SpellEntry const *spellInfo = NULL);
void UpdateSpeed(UnitMoveType mtype, bool forced);
float GetSpeed( UnitMoveType mtype ) const;
@@ -1348,7 +1474,9 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void _ApplyAllAuraMods();
int32 CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index, int32 basePoints, Unit const* target);
- int32 CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target);
+ int32 CalcSpellDuration(SpellEntry const* spellProto);
+ int32 ModSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target, int32 duration);
+ void ModSpellCastTime(SpellEntry const* spellProto, int32 & castTime);
float CalculateLevelPenalty(SpellEntry const* spellProto) const;
void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); }
@@ -1371,10 +1499,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SetUnitMovementFlags(uint32 f) { m_unit_movement_flags = f; }
void SetControlled(bool apply, UnitState state);
- void SetFeared(bool apply/*, uint64 casterGUID = 0, uint32 spellID = 0*/);
- void SetConfused(bool apply/*, uint64 casterGUID = 0, uint32 spellID = 0*/);
- void SetStunned(bool apply);
- void SetRooted(bool apply);
void AddComboPointHolder(uint32 lowguid) { m_ComboPointHolders.insert(lowguid); }
void RemoveComboPointHolder(uint32 lowguid) { m_ComboPointHolders.erase(lowguid); }
@@ -1431,6 +1555,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
DeathState m_deathState;
+ uint64 m_auraUpdateMask;
AuraMap m_Auras;
typedef std::list<uint64> DynObjectGUIDs;
@@ -1451,6 +1576,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
float m_weaponDamage[MAX_ATTACK][2];
bool m_canModifyStats;
//std::list< spellEffectPair > AuraSpells[TOTAL_AURAS]; // TODO: use this if ok for mem
+ VisibleAuraMap m_visibleAuras;
float m_speed_rate[MAX_MOVE_TYPE];
@@ -1463,6 +1589,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
uint32 m_unit_movement_flags;
uint32 m_reactiveTimer[MAX_REACTIVE];
+ uint32 m_regenTimer;
ThreatManager m_ThreatManager;
@@ -1471,12 +1598,18 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
//void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*)
- bool IsTriggeredAtSpellProcEvent( Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
+ bool IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
- bool HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura* triggredByAura, SpellEntry const *procSpell, uint32 cooldown);
- bool HandleMeandingAuraProc(Aura* triggeredByAura);
+ bool HandleOverrideClassScriptAuraProc(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 cooldown);
+ bool HandleAuraRaidProcFromChargeWithValue(Aura* triggeredByAura);
+ bool HandleAuraRaidProcFromCharge(Aura* triggeredByAura);
+
+ void SetFeared(bool apply);
+ void SetConfused(bool apply);
+ void SetStunned(bool apply);
+ void SetRooted(bool apply);
uint32 m_state; // Even derived shouldn't modify
uint32 m_CombatTimer;
diff --git a/src/game/UnitEvents.h b/src/game/UnitEvents.h
index 4bc362893a3..67f8d01f0d6 100644
--- a/src/game/UnitEvents.h
+++ b/src/game/UnitEvents.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/UpdateData.cpp b/src/game/UpdateData.cpp
index 91ef84bb372..de615c9cc8e 100644
--- a/src/game/UpdateData.cpp
+++ b/src/game/UpdateData.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -108,7 +108,7 @@ bool UpdateData::BuildPacket(WorldPacket *packet, bool hasTransport)
ByteBuffer buf(m_data.size() + 10 + m_outOfRangeGUIDs.size()*8);
buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount);
- buf << (uint8) (hasTransport ? 1 : 0);
+ //buf << (uint8) (hasTransport ? 1 : 0);
if(!m_outOfRangeGUIDs.empty())
{
diff --git a/src/game/UpdateData.h b/src/game/UpdateData.h
index 256c572bb1d..71a9258b90b 100644
--- a/src/game/UpdateData.h
+++ b/src/game/UpdateData.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -38,11 +38,12 @@ enum OBJECT_UPDATE_FLAGS
UPDATEFLAG_NONE = 0x00,
UPDATEFLAG_SELF = 0x01,
UPDATEFLAG_TRANSPORT = 0x02,
- UPDATEFLAG_FULLGUID = 0x04,
+ UPDATEFLAG_HAS_TARGET = 0x04,
UPDATEFLAG_LOWGUID = 0x08,
UPDATEFLAG_HIGHGUID = 0x10,
UPDATEFLAG_LIVING = 0x20,
- UPDATEFLAG_HASPOSITION = 0x40
+ UPDATEFLAG_HAS_POSITION = 0x40,
+ UPDATEFLAG_VEHICLE = 0x80
};
class UpdateData
diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h
index c8e70fc2198..97fcbeb05d6 100644
--- a/src/game/UpdateFields.h
+++ b/src/game/UpdateFields.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -21,7 +21,7 @@
#ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H
-// Auto generated for version 2, 4, 3, 8606
+// Auto generated for version 3, 0, 3, 9183
enum EObjectFields
{
@@ -43,13 +43,37 @@ enum EItemFields
ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER_ONLY, UNK2
ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT = OBJECT_END + 0x0010, // Size: 33, Type: INT, Flags: PUBLIC
- ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0031, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0032, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0033, // Size: 1, Type: INT, Flags: OWNER_ONLY
- ITEM_FIELD_DURABILITY = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_END = OBJECT_END + 0x0036,
+ ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_2_1 = OBJECT_END + 0x0013, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_2_3 = OBJECT_END + 0x0015, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_3_1 = OBJECT_END + 0x0016, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_3_3 = OBJECT_END + 0x0018, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_4_1 = OBJECT_END + 0x0019, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_4_3 = OBJECT_END + 0x001B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_5_1 = OBJECT_END + 0x001C, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_5_3 = OBJECT_END + 0x001E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_6_1 = OBJECT_END + 0x001F, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_6_3 = OBJECT_END + 0x0021, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_7_1 = OBJECT_END + 0x0022, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_7_3 = OBJECT_END + 0x0024, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_8_1 = OBJECT_END + 0x0025, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_8_3 = OBJECT_END + 0x0027, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_9_1 = OBJECT_END + 0x0028, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_9_3 = OBJECT_END + 0x002A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_10_1 = OBJECT_END + 0x002B, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_10_3 = OBJECT_END + 0x002D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_11_1 = OBJECT_END + 0x002E, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_11_3 = OBJECT_END + 0x0030, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_12_1 = OBJECT_END + 0x0031, // Size: 2, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
+ ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
+ ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE
+ ITEM_END = OBJECT_END + 0x003A,
};
enum EContainerFields
@@ -64,93 +88,94 @@ enum EUnitFields
{
UNIT_FIELD_CHARM = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_SUMMON = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_CREATEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_TARGET = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_PERSUADED = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_CRITTER = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PRIVATE
+ UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_CREATEDBY = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_TARGET = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_HEALTH = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: DYNAMIC
- UNIT_FIELD_POWER1 = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER2 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER3 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER4 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER5 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: DYNAMIC
- UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_LEVEL = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_BYTES_0 = OBJECT_END + 0x001E, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_VIRTUAL_ITEM_SLOT_DISPLAY = OBJECT_END + 0x001F, // Size: 3, Type: INT, Flags: PUBLIC
- UNIT_VIRTUAL_ITEM_INFO = OBJECT_END + 0x0022, // Size: 6, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_FLAGS = OBJECT_END + 0x0028, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0029, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_AURA = OBJECT_END + 0x002A, // Size: 56, Type: INT, Flags: PUBLIC
- UNIT_FIELD_AURAFLAGS = OBJECT_END + 0x0062, // Size: 14, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_AURALEVELS = OBJECT_END + 0x0070, // Size: 14, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_AURAAPPLICATIONS = OBJECT_END + 0x007E, // Size: 14, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_AURASTATE = OBJECT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x008D, // Size: 2, Type: INT, Flags: PUBLIC
- UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x008F, // Size: 1, Type: INT, Flags: PRIVATE
- UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x0090, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_FIELD_COMBATREACH = OBJECT_END + 0x0091, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_FIELD_DISPLAYID = OBJECT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x0093, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x0095, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0096, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0097, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0098, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0099, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_PETNUMBER = OBJECT_END + 0x009A, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x009B, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x009C, // Size: 1, Type: INT, Flags: OWNER_ONLY
- UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x009D, // Size: 1, Type: INT, Flags: OWNER_ONLY
- UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x009E, // Size: 1, Type: INT, Flags: DYNAMIC
- UNIT_CHANNEL_SPELL = OBJECT_END + 0x009F, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_MOD_CAST_SPEED = OBJECT_END + 0x00A0, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_CREATED_BY_SPELL = OBJECT_END + 0x00A1, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_NPC_FLAGS = OBJECT_END + 0x00A2, // Size: 1, Type: INT, Flags: DYNAMIC
- UNIT_NPC_EMOTESTATE = OBJECT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_TRAINING_POINTS = OBJECT_END + 0x00A4, // Size: 1, Type: TWO_SHORT, Flags: OWNER_ONLY
- UNIT_FIELD_STAT0 = OBJECT_END + 0x00A5, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT1 = OBJECT_END + 0x00A6, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT2 = OBJECT_END + 0x00A7, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT3 = OBJECT_END + 0x00A8, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT4 = OBJECT_END + 0x00A9, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x00AA, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x00AB, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x00AC, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x00AD, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x00AE, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x00AF, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x00B0, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x00B1, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x00B2, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x00B3, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RESISTANCES = OBJECT_END + 0x00B4, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x00BB, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x00C2, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_BASE_MANA = OBJECT_END + 0x00C9, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x00CA, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_BYTES_2 = OBJECT_END + 0x00CB, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x00CC, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x00CD, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x00CE, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x00CF, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x00D0, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x00D1, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x00D2, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x00D3, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x00D4, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x00DB, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x00E2, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_PADDING = OBJECT_END + 0x00E3, // Size: 1, Type: INT, Flags: NONE
- UNIT_END = OBJECT_END + 0x00E4,
+ UNIT_FIELD_BYTES_0 = OBJECT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_HEALTH = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER1 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER2 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER3 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER4 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER5 = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER6 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER7 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_FLAGS = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_AURASTATE = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x0037, // Size: 2, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE
+ UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x003A, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_FIELD_COMBATREACH = OBJECT_END + 0x003B, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC
+ UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC
+ UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE
+ UNIT_END = OBJECT_END + 0x008E,
PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
@@ -262,160 +287,184 @@ enum EUnitFields
PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_1_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x007E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0080, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x008D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x008E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0090, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x009C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x009D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x009E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A0, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00AC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00AD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00AE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B0, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00BC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00BD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00BE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00C0, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00CC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00CD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00CE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00D0, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00DC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00DD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00DE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00E0, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00EC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00ED, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00EE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x00F0, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x00FC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0100, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x010C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x010D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x010E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0110, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x011C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x011D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x011E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0120, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x012C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x012D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x012E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0130, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x013C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x013D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x013E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x0140, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x014C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x014D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x014E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x0150, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x015C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x015D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x015E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x0160, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x016C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x016D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x016E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0170, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x017C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x017D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x017E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x0180, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x018C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x0190, // Size: 12, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x019C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x019D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_CHOSEN_TITLE = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_FIELD_PAD_0 = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: NONE
- PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01A0, // Size: 46, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01CE, // Size: 32, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x01EE, // Size: 56, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x0226, // Size: 14, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x0234, // Size: 24, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x024C, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x028C, // Size: 36, Type: LONG, Flags: PRIVATE
- PLAYER_FARSIGHT = UNIT_END + 0x02B0, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x02B2, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER_XP = UNIT_END + 0x02B4, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x02B5, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x02B6, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
- PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x0436, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x0437, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_TRACK_CREATURES = UNIT_END + 0x0438, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_TRACK_RESOURCES = UNIT_END + 0x0439, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x043A, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x043B, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x043C, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_EXPERTISE = UNIT_END + 0x043D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x043E, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x043F, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0440, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0441, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x0442, // Size: 7, Type: FLOAT, Flags: PRIVATE
- PLAYER_SHIELD_BLOCK = UNIT_END + 0x0449, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x044A, // Size: 128, Type: BYTES, Flags: PRIVATE
- PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x04CA, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_COINAGE = UNIT_END + 0x04CB, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x04CC, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x04D3, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x04DA, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BYTES = UNIT_END + 0x04E4, // Size: 1, Type: BYTES, Flags: PRIVATE
- PLAYER_AMMO_ID = UNIT_END + 0x04E5, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SELF_RES_SPELL = UNIT_END + 0x04E6, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x04E8, // Size: 12, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x04F4, // Size: 12, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_KILLS = UNIT_END + 0x0500, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
- PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x0501, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x0502, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x0503, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BYTES2 = UNIT_END + 0x0504, // Size: 1, Type: BYTES, Flags: PRIVATE
- PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x0505, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x0506, // Size: 24, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x051E, // Size: 18, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0530, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x0531, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_MANA_REGEN = UNIT_END + 0x0532, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT = UNIT_END + 0x0533, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x0534, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x0535, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_END = UNIT_END + 0x054E,
+ PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE
+ PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0272, // Size: 64, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x02B2, // Size: 36, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x02D6, // Size: 64, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_QUESTBAG_SLOT_1 = UNIT_END + 0x0316, // Size: 64, Type: LONG, Flags: PRIVATE
+ PLAYER_FARSIGHT = UNIT_END + 0x0356, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x0358, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x035A, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x035C, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER_XP = UNIT_END + 0x035E, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x035F, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x0360, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
+ PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x04E0, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_TRACK_CREATURES = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_TRACK_RESOURCES = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x04E4, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x04E5, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x04E6, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_EXPERTISE = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x04E8, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x04E9, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x04EA, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x04EB, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x04EC, // Size: 7, Type: FLOAT, Flags: PRIVATE
+ PLAYER_SHIELD_BLOCK = UNIT_END + 0x04F3, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x04F4, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x04F5, // Size: 128, Type: BYTES, Flags: PRIVATE
+ PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0575, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_COINAGE = UNIT_END + 0x0576, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0577, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x057E, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0585, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x058C, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x058D, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x058E, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BYTES = UNIT_END + 0x058F, // Size: 1, Type: BYTES, Flags: PRIVATE
+ PLAYER_AMMO_ID = UNIT_END + 0x0590, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SELF_RES_SPELL = UNIT_END + 0x0591, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0592, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0593, // Size: 12, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x059F, // Size: 12, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_KILLS = UNIT_END + 0x05AB, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
+ PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x05AC, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x05AD, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x05AE, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BYTES2 = UNIT_END + 0x05AF, // Size: 1, Type: BYTES, Flags: PRIVATE
+ PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x05B0, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x05B1, // Size: 25, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x05CA, // Size: 18, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x05DC, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x05DD, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x05DE, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x05DF, // Size: 25, Type: INT, Flags: PRIVATE
+ PLAYER_RUNE_REGEN_1 = UNIT_END + 0x05F8, // Size: 4, Type: FLOAT, Flags: PRIVATE
+ PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x05FC, // Size: 3, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x05FF, // Size: 8, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0607, // Size: 8, Type: INT, Flags: PRIVATE
+ PLAYER_GLYPHS_ENABLED = UNIT_END + 0x060F, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_END = UNIT_END + 0x0610,
};
enum EGameObjectFields
{
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_STATE = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_POS_X = OBJECT_END + 0x0009, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_Y = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_Z = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_FACING = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_DYN_FLAGS = OBJECT_END + 0x000D, // Size: 1, Type: INT, Flags: DYNAMIC
- GAMEOBJECT_FACTION = OBJECT_END + 0x000E, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_TYPE_ID = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
+ GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_POS_Y = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_DYNAMIC = OBJECT_END + 0x000E, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
+ GAMEOBJECT_FACTION = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_ARTKIT = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_ANIMPROGRESS = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: DYNAMIC
- GAMEOBJECT_PADDING = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: NONE
- GAMEOBJECT_END = OBJECT_END + 0x0014,
+ GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC
+ GAMEOBJECT_END = OBJECT_END + 0x0012,
};
enum EDynamicObjectFields
diff --git a/src/game/UpdateMask.h b/src/game/UpdateMask.h
index 436aa523440..3d510c00d60 100644
--- a/src/game/UpdateMask.h
+++ b/src/game/UpdateMask.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -36,27 +36,27 @@ class UpdateMask
delete [] mUpdateMask;
}
- inline void SetBit (uint32 index)
+ void SetBit (uint32 index)
{
( (uint8 *)mUpdateMask )[ index >> 3 ] |= 1 << ( index & 0x7 );
}
- inline void UnsetBit (uint32 index)
+ void UnsetBit (uint32 index)
{
( (uint8 *)mUpdateMask )[ index >> 3 ] &= (0xff ^ (1 << ( index & 0x7 ) ) );
}
- inline bool GetBit (uint32 index)
+ bool GetBit (uint32 index) const
{
return ( ( (uint8 *)mUpdateMask)[ index >> 3 ] & ( 1 << ( index & 0x7 ) )) != 0;
}
- inline uint32 GetBlockCount() { return mBlocks; }
- inline uint32 GetLength() { return mBlocks << 2; }
- inline uint32 GetCount() { return mCount; }
- inline uint8* GetMask() { return (uint8*)mUpdateMask; }
+ uint32 GetBlockCount() const { return mBlocks; }
+ uint32 GetLength() const { return mBlocks << 2; }
+ uint32 GetCount() const { return mCount; }
+ uint8* GetMask() { return (uint8*)mUpdateMask; }
- inline void SetCount (uint32 valuesCount)
+ void SetCount (uint32 valuesCount)
{
if(mUpdateMask)
delete [] mUpdateMask;
@@ -68,13 +68,13 @@ class UpdateMask
memset(mUpdateMask, 0, mBlocks << 2);
}
- inline void Clear()
+ void Clear()
{
if (mUpdateMask)
memset(mUpdateMask, 0, mBlocks << 2);
}
- inline UpdateMask& operator = ( const UpdateMask& mask )
+ UpdateMask& operator = ( const UpdateMask& mask )
{
SetCount(mask.mCount);
memcpy(mUpdateMask, mask.mUpdateMask, mBlocks << 2);
@@ -82,21 +82,21 @@ class UpdateMask
return *this;
}
- inline void operator &= ( const UpdateMask& mask )
+ void operator &= ( const UpdateMask& mask )
{
ASSERT(mask.mCount <= mCount);
for (uint32 i = 0; i < mBlocks; i++)
mUpdateMask[i] &= mask.mUpdateMask[i];
}
- inline void operator |= ( const UpdateMask& mask )
+ void operator |= ( const UpdateMask& mask )
{
ASSERT(mask.mCount <= mCount);
for (uint32 i = 0; i < mBlocks; i++)
mUpdateMask[i] |= mask.mUpdateMask[i];
}
- inline UpdateMask operator & ( const UpdateMask& mask ) const
+ UpdateMask operator & ( const UpdateMask& mask ) const
{
ASSERT(mask.mCount <= mCount);
@@ -107,7 +107,7 @@ class UpdateMask
return newmask;
}
- inline UpdateMask operator | ( const UpdateMask& mask ) const
+ UpdateMask operator | ( const UpdateMask& mask ) const
{
ASSERT(mask.mCount <= mCount);
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
new file mode 100644
index 00000000000..b533609d763
--- /dev/null
+++ b/src/game/Vehicle.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Common.h"
+#include "Log.h"
+#include "WorldSession.h"
+#include "WorldPacket.h"
+#include "ObjectMgr.h"
+#include "SpellMgr.h"
+#include "Vehicle.h"
+#include "MapManager.h"
+#include "SpellAuras.h"
+#include "Unit.h"
+#include "Util.h"
+
+Vehicle::Vehicle() : Creature(), m_vehicleId(0)
+{
+ m_isVehicle = true;
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
+}
+
+Vehicle::~Vehicle()
+{
+ if(m_uint32Values) // only for fully created Object
+ ObjectAccessor::Instance().RemoveObject(this);
+}
+
+void Vehicle::AddToWorld()
+{
+ ///- Register the vehicle for guid lookup
+ if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this);
+ Unit::AddToWorld();
+}
+
+void Vehicle::RemoveFromWorld()
+{
+ ///- Remove the vehicle from the accessor
+ if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this);
+ ///- Don't call the function for Creature, normal mobs + totems go in a different storage
+ Unit::RemoveFromWorld();
+}
+
+void Vehicle::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState
+{
+ Creature::setDeathState(s);
+}
+
+void Vehicle::Update(uint32 diff)
+{
+ Creature::Update(diff);
+}
+
+bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team)
+{
+ SetMapId(map->GetId());
+ SetInstanceId(map->GetInstanceId());
+
+ Object::_Create(guidlow, Entry, HIGHGUID_VEHICLE);
+
+ if(!InitEntry(Entry, team))
+ return false;
+
+ m_defaultMovementType = IDLE_MOTION_TYPE;
+
+ AIM_Initialize();
+
+ SetVehicleId(vehicleId);
+
+ SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
+ SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f);
+
+ CreatureInfo const *ci = GetCreatureInfo();
+ setFaction(team == ALLIANCE ? ci->faction_A : ci->faction_H);
+ SetMaxHealth(ci->maxhealth);
+ SelectLevel(ci);
+ SetHealth(GetMaxHealth());
+
+ return true;
+}
+
+void Vehicle::Dismiss()
+{
+ SendObjectDeSpawnAnim(GetGUID());
+ CombatStop();
+ CleanupsBeforeDelete();
+ AddObjectToRemoveList();
+}
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
new file mode 100644
index 00000000000..6d9c7cd7943
--- /dev/null
+++ b/src/game/Vehicle.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef MANGOSSERVER_VEHICLE_H
+#define MANGOSSERVER_VEHICLE_H
+
+#include "ObjectDefines.h"
+#include "Creature.h"
+#include "Unit.h"
+
+class Vehicle : public Creature
+{
+ public:
+ explicit Vehicle();
+ virtual ~Vehicle();
+
+ void AddToWorld();
+ void RemoveFromWorld();
+
+ bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team);
+
+ void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState
+ void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update
+
+ uint32 GetVehicleId() { return m_vehicleId; }
+ void SetVehicleId(uint32 vehicleid) { m_vehicleId = vehicleid; }
+
+ void Dismiss();
+
+ protected:
+ uint32 m_vehicleId;
+
+ private:
+ void SaveToDB(uint32, uint8) // overwrited of Creature::SaveToDB - don't must be called
+ {
+ assert(false);
+ }
+ void DeleteFromDB() // overwrited of Creature::DeleteFromDB - don't must be called
+ {
+ assert(false);
+ }
+};
+#endif
diff --git a/src/game/VoiceChatHandler.cpp b/src/game/VoiceChatHandler.cpp
index ba03ee1c543..4cf86493060 100644
--- a/src/game/VoiceChatHandler.cpp
+++ b/src/game/VoiceChatHandler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/WaypointManager.cpp b/src/game/WaypointManager.cpp
index 30947abe4c8..a677fd5b6d2 100644
--- a/src/game/WaypointManager.cpp
+++ b/src/game/WaypointManager.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/WaypointManager.h b/src/game/WaypointManager.h
index 1c41617fff7..85f8b765d45 100644
--- a/src/game/WaypointManager.h
+++ b/src/game/WaypointManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp
index 12b72829248..5aa7666db10 100644
--- a/src/game/WaypointMovementGenerator.cpp
+++ b/src/game/WaypointMovementGenerator.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/game/WaypointMovementGenerator.h b/src/game/WaypointMovementGenerator.h
index eec6ad70e5c..9804c150d63 100644
--- a/src/game/WaypointMovementGenerator.h
+++ b/src/game/WaypointMovementGenerator.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -48,7 +48,7 @@ class TRINITY_DLL_SPEC PathMovementBase
PathMovementBase() : i_currentNode(0) {}
virtual ~PathMovementBase() {};
- inline bool MovementInProgress(void) const { return i_currentNode < i_path.Size(); }
+ bool MovementInProgress(void) const { return i_currentNode < i_path.Size(); }
void LoadPath(T &);
void ReloadPath(T &);
@@ -109,7 +109,7 @@ public PathMovementBase<Player>
Path& GetPath() { return i_path; }
uint32 GetPathAtMapEnd() const;
- inline bool HasArrived() const { return (i_currentNode >= i_path.Size()); }
+ bool HasArrived() const { return (i_currentNode >= i_path.Size()); }
void SetCurrentNodeAfterTeleport();
void SkipCurrentNode() { ++i_currentNode; }
bool GetDestination(float& x, float& y, float& z) const { i_destinationHolder.GetDestination(x,y,z); return true; }
diff --git a/src/game/Weather.cpp b/src/game/Weather.cpp
index 498beab0412..2c41fa886be 100644
--- a/src/game/Weather.cpp
+++ b/src/game/Weather.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -42,7 +42,7 @@ Weather::Weather(uint32 zone, WeatherZoneChances const* weatherChances) : m_zone
}
/// Launch a weather update
-bool Weather::Update(time_t diff)
+bool Weather::Update(uint32 diff)
{
if (m_timer.GetCurrent()>=0)
m_timer.Update(diff);
diff --git a/src/game/Weather.h b/src/game/Weather.h
index cbd4daad1ad..e312f004060 100644
--- a/src/game/Weather.h
+++ b/src/game/Weather.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -62,7 +62,7 @@ class Weather
void SetWeather(WeatherType type, float grade);
/// For which zone is this weather?
uint32 GetZone() { return m_zone; };
- bool Update(time_t diff);
+ bool Update(uint32 diff);
private:
WeatherState GetWeatherState() const;
uint32 m_zone;
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 7adb9f4d24f..e073633fc26 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -37,6 +37,8 @@
#include "SkillDiscovery.h"
#include "World.h"
#include "AccountMgr.h"
+#include "AchievementMgr.h"
+#include "AuctionHouseMgr.h"
#include "ObjectMgr.h"
#include "SpellMgr.h"
#include "Chat.h"
@@ -55,6 +57,7 @@
#include "VMapFactory.h"
#include "GlobalEvents.h"
#include "GameEvent.h"
+#include "PoolHandler.h"
#include "Database/DatabaseImpl.h"
#include "GridNotifiersImpl.h"
#include "CellImpl.h"
@@ -237,7 +240,7 @@ World::AddSession_ (WorldSession* s)
uint32 Sessions = GetActiveAndQueuedSessionCount ();
uint32 pLimit = GetPlayerAmountLimit ();
- uint32 QueueSize = GetQueueSize (); //number of players in the queue
+ uint32 QueueSize = GetQueueSize (); //number of players in the queue
//so we don't count the user trying to
//login as a session and queue the socket that we are using
@@ -254,10 +257,10 @@ World::AddSession_ (WorldSession* s)
WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
packet << uint8 (AUTH_OK);
- packet << uint32 (0); // unknown random value...
- packet << uint8 (0);
- packet << uint32 (0);
- packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
+ packet << uint32 (0); // BillingTimeRemaining
+ packet << uint8 (0); // BillingPlanFlags
+ packet << uint32 (0); // BillingTimeRested
+ packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
s->SendPacket (&packet);
UpdateMaxSessionCounters ();
@@ -265,7 +268,7 @@ World::AddSession_ (WorldSession* s)
// Updates the population
if (pLimit > 0)
{
- float popu = GetActiveSessionCount (); //updated number of users on the server
+ float popu = GetActiveSessionCount (); //updated number of users on the server
popu /= pLimit;
popu *= 2;
LoginDatabase.PExecute ("UPDATE realmlist SET population = '%f' WHERE id = '%d'", popu, realmID);
@@ -312,10 +315,10 @@ void World::AddQueuedPlayer(WorldSession* sess)
// The 1st SMSG_AUTH_RESPONSE needs to contain other info too.
WorldPacket packet (SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
packet << uint8 (AUTH_WAIT_QUEUE);
- packet << uint32 (0); // unknown random value...
- packet << uint8 (0);
- packet << uint32 (0);
- packet << uint8 (sess->Expansion () ? 1 : 0); // 0 - normal, 1 - TBC, must be set in database manually for each account
+ packet << uint32 (0); // BillingTimeRemaining
+ packet << uint8 (0); // BillingPlanFlags
+ packet << uint32 (0); // BillingTimeRested
+ packet << uint8 (sess->Expansion () ? 1 : 0); // 0 - normal, 1 - TBC, must be set in database manually for each account
packet << uint32(GetQueuePos (sess));
sess->SendPacket (&packet);
@@ -439,24 +442,30 @@ void World::LoadConfigSettings(bool reload)
rate_values[RATE_HEALTH] = sConfig.GetFloatDefault("Rate.Health", 1);
if(rate_values[RATE_HEALTH] < 0)
{
- sLog.outError("Rate.Health (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_HEALTH]);
+ sLog.outError("Rate.Health (%f) must be > 0. Using 1 instead.",rate_values[RATE_HEALTH]);
rate_values[RATE_HEALTH] = 1;
}
rate_values[RATE_POWER_MANA] = sConfig.GetFloatDefault("Rate.Mana", 1);
if(rate_values[RATE_POWER_MANA] < 0)
{
- sLog.outError("Rate.Mana (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_POWER_MANA]);
+ sLog.outError("Rate.Mana (%f) must be > 0. Using 1 instead.",rate_values[RATE_POWER_MANA]);
rate_values[RATE_POWER_MANA] = 1;
}
rate_values[RATE_POWER_RAGE_INCOME] = sConfig.GetFloatDefault("Rate.Rage.Income", 1);
rate_values[RATE_POWER_RAGE_LOSS] = sConfig.GetFloatDefault("Rate.Rage.Loss", 1);
if(rate_values[RATE_POWER_RAGE_LOSS] < 0)
{
- sLog.outError("Rate.Rage.Loss (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_POWER_RAGE_LOSS]);
+ sLog.outError("Rate.Rage.Loss (%f) must be > 0. Using 1 instead.",rate_values[RATE_POWER_RAGE_LOSS]);
rate_values[RATE_POWER_RAGE_LOSS] = 1;
}
+ rate_values[RATE_POWER_RUNICPOWER_INCOME] = sConfig.GetFloatDefault("Rate.RunicPower.Income", 1);
+ rate_values[RATE_POWER_RUNICPOWER_LOSS] = sConfig.GetFloatDefault("Rate.RunicPower.Loss", 1);
+ if(rate_values[RATE_POWER_RUNICPOWER_LOSS] < 0)
+ {
+ sLog.outError("Rate.RunicPower.Loss (%f) must be > 0. Using 1 instead.",rate_values[RATE_POWER_RUNICPOWER_LOSS]);
+ rate_values[RATE_POWER_RUNICPOWER_LOSS] = 1;
+ }
rate_values[RATE_POWER_FOCUS] = sConfig.GetFloatDefault("Rate.Focus", 1.0f);
- rate_values[RATE_LOYALTY] = sConfig.GetFloatDefault("Rate.Loyalty", 1.0f);
rate_values[RATE_SKILL_DISCOVERY] = sConfig.GetFloatDefault("Rate.Skill.Discovery", 1.0f);
rate_values[RATE_DROP_ITEM_POOR] = sConfig.GetFloatDefault("Rate.Drop.Item.Poor", 1.0f);
rate_values[RATE_DROP_ITEM_NORMAL] = sConfig.GetFloatDefault("Rate.Drop.Item.Normal", 1.0f);
@@ -470,7 +479,6 @@ void World::LoadConfigSettings(bool reload)
rate_values[RATE_XP_KILL] = sConfig.GetFloatDefault("Rate.XP.Kill", 1.0f);
rate_values[RATE_XP_QUEST] = sConfig.GetFloatDefault("Rate.XP.Quest", 1.0f);
rate_values[RATE_XP_EXPLORE] = sConfig.GetFloatDefault("Rate.XP.Explore", 1.0f);
- rate_values[RATE_XP_PAST_70] = sConfig.GetFloatDefault("Rate.XP.PastLevel70", 1.0f);
rate_values[RATE_REPUTATION_GAIN] = sConfig.GetFloatDefault("Rate.Reputation.Gain", 1.0f);
rate_values[RATE_CREATURE_NORMAL_DAMAGE] = sConfig.GetFloatDefault("Rate.Creature.Normal.Damage", 1.0f);
rate_values[RATE_CREATURE_ELITE_ELITE_DAMAGE] = sConfig.GetFloatDefault("Rate.Creature.Elite.Elite.Damage", 1.0f);
@@ -591,7 +599,7 @@ void World::LoadConfigSettings(bool reload)
{
uint32 val = sConfig.GetIntDefault("SocketSelectTime", DEFAULT_SOCKET_SELECT_TIME);
if(val!=m_configs[CONFIG_SOCKET_SELECTTIME])
- sLog.outError("SocketSelectTime option can't be changed at Trinityd.conf reload, using current value (%u).",m_configs[DEFAULT_SOCKET_SELECT_TIME]);
+ sLog.outError("SocketSelectTime option can't be changed at Trinityd.conf reload, using current value (%u).",m_configs[CONFIG_SOCKET_SELECTTIME]);
}
else
m_configs[CONFIG_SOCKET_SELECTTIME] = sConfig.GetIntDefault("SocketSelectTime", DEFAULT_SOCKET_SELECT_TIME);
@@ -624,7 +632,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Channel",false);
m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Group",false);
m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Guild",false);
- m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Auction",false);
+ m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Auction",false);
m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Mail",false);
m_configs[CONFIG_ALLOW_TWO_SIDE_WHO_LIST] = sConfig.GetBoolDefault("AllowTwoSide.WhoList", false);
m_configs[CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND] = sConfig.GetBoolDefault("AllowTwoSide.AddFriend", false);
@@ -650,8 +658,17 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = m_configs[CONFIG_CHARACTERS_PER_REALM];
}
+ m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] = sConfig.GetIntDefault("HeroicCharactersPerRealm", 1);
+ if(int32(m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM]) < 0 || m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] > 10)
+ {
+ sLog.outError("HeroicCharactersPerRealm (%i) must be in range 0..10. Set to 1.",m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM]);
+ m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] = 1;
+ }
+
+ m_configs[CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING] = sConfig.GetIntDefault("MinLevelForHeroicCharacterCreating", 55);
+
m_configs[CONFIG_SKIP_CINEMATICS] = sConfig.GetIntDefault("SkipCinematics", 0);
- if(m_configs[CONFIG_SKIP_CINEMATICS] < 0 || m_configs[CONFIG_SKIP_CINEMATICS] > 2)
+ if(int32(m_configs[CONFIG_SKIP_CINEMATICS]) < 0 || m_configs[CONFIG_SKIP_CINEMATICS] > 2)
{
sLog.outError("SkipCinematics (%i) must be in range 0..2. Set to 0.",m_configs[CONFIG_SKIP_CINEMATICS]);
m_configs[CONFIG_SKIP_CINEMATICS] = 0;
@@ -684,8 +701,22 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_START_PLAYER_LEVEL] = m_configs[CONFIG_MAX_PLAYER_LEVEL];
}
+ m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = sConfig.GetIntDefault("StartHeroicPlayerLevel", 55);
+ if(m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] < 1)
+ {
+ sLog.outError("StartHeroicPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to 55.",
+ m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = 55;
+ }
+ else if(m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] > m_configs[CONFIG_MAX_PLAYER_LEVEL])
+ {
+ sLog.outError("StartHeroicPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to %u.",
+ m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = m_configs[CONFIG_MAX_PLAYER_LEVEL];
+ }
+
m_configs[CONFIG_START_PLAYER_MONEY] = sConfig.GetIntDefault("StartPlayerMoney", 0);
- if(m_configs[CONFIG_START_PLAYER_MONEY] < 0)
+ if(int32(m_configs[CONFIG_START_PLAYER_MONEY]) < 0)
{
sLog.outError("StartPlayerMoney (%i) must be in range 0..%u. Set to %u.",m_configs[CONFIG_START_PLAYER_MONEY],MAX_MONEY_AMOUNT,0);
m_configs[CONFIG_START_PLAYER_MONEY] = 0;
@@ -698,14 +729,14 @@ void World::LoadConfigSettings(bool reload)
}
m_configs[CONFIG_MAX_HONOR_POINTS] = sConfig.GetIntDefault("MaxHonorPoints", 75000);
- if(m_configs[CONFIG_MAX_HONOR_POINTS] < 0)
+ if(int32(m_configs[CONFIG_MAX_HONOR_POINTS]) < 0)
{
sLog.outError("MaxHonorPoints (%i) can't be negative. Set to 0.",m_configs[CONFIG_MAX_HONOR_POINTS]);
m_configs[CONFIG_MAX_HONOR_POINTS] = 0;
}
m_configs[CONFIG_START_HONOR_POINTS] = sConfig.GetIntDefault("StartHonorPoints", 0);
- if(m_configs[CONFIG_START_HONOR_POINTS] < 0)
+ if(int32(m_configs[CONFIG_START_HONOR_POINTS]) < 0)
{
sLog.outError("StartHonorPoints (%i) must be in range 0..MaxHonorPoints(%u). Set to %u.",
m_configs[CONFIG_START_HONOR_POINTS],m_configs[CONFIG_MAX_HONOR_POINTS],0);
@@ -719,14 +750,14 @@ void World::LoadConfigSettings(bool reload)
}
m_configs[CONFIG_MAX_ARENA_POINTS] = sConfig.GetIntDefault("MaxArenaPoints", 5000);
- if(m_configs[CONFIG_MAX_ARENA_POINTS] < 0)
+ if(int32(m_configs[CONFIG_MAX_ARENA_POINTS]) < 0)
{
sLog.outError("MaxArenaPoints (%i) can't be negative. Set to 0.",m_configs[CONFIG_MAX_ARENA_POINTS]);
m_configs[CONFIG_MAX_ARENA_POINTS] = 0;
}
m_configs[CONFIG_START_ARENA_POINTS] = sConfig.GetIntDefault("StartArenaPoints", 0);
- if(m_configs[CONFIG_START_ARENA_POINTS] < 0)
+ if(int32(m_configs[CONFIG_START_ARENA_POINTS]) < 0)
{
sLog.outError("StartArenaPoints (%i) must be in range 0..MaxArenaPoints(%u). Set to %u.",
m_configs[CONFIG_START_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS],0);
@@ -745,8 +776,11 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_INSTANCE_IGNORE_RAID] = sConfig.GetBoolDefault("Instance.IgnoreRaid", false);
m_configs[CONFIG_BATTLEGROUND_CAST_DESERTER] = sConfig.GetBoolDefault("Battleground.CastDeserter", true);
- m_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Battleground.QueueAnnouncer.Enable", true);
+ m_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Battleground.QueueAnnouncer.Enable", false);
m_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY] = sConfig.GetBoolDefault("Battleground.QueueAnnouncer.PlayerOnly", false);
+ m_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Arena.QueueAnnouncer.Enable", false);
+ m_configs[CONFIG_ARENA_SEASON_ID] = sConfig.GetIntDefault ("Arena.ArenaSeason.ID", 1);
+ m_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfig.GetBoolDefault("Arena.ArenaSeason.InProgress", true);
m_configs[CONFIG_CAST_UNSTUCK] = sConfig.GetBoolDefault("CastUnstuck", true);
m_configs[CONFIG_INSTANCE_RESET_TIME_HOUR] = sConfig.GetIntDefault("Instance.ResetTimeHour", 4);
@@ -756,15 +790,17 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_MIN_PETITION_SIGNS] = sConfig.GetIntDefault("MinPetitionSigns", 9);
if(m_configs[CONFIG_MIN_PETITION_SIGNS] > 9)
{
- sLog.outError("MinPetitionSigns (%i) must be in range 0..9. Set to 9.",m_configs[CONFIG_MIN_PETITION_SIGNS]);
+ sLog.outError("MinPetitionSigns (%i) must be in range 0..9. Set to 9.", m_configs[CONFIG_MIN_PETITION_SIGNS]);
m_configs[CONFIG_MIN_PETITION_SIGNS] = 9;
}
- m_configs[CONFIG_GM_LOGIN_STATE] = sConfig.GetIntDefault("GM.LoginState",2);
- m_configs[CONFIG_GM_CHAT] = sConfig.GetIntDefault("GM.Chat",2);
- m_configs[CONFIG_GM_WISPERING_TO] = sConfig.GetIntDefault("GM.WhisperingTo",2);
- m_configs[CONFIG_GM_IN_GM_LIST] = sConfig.GetBoolDefault("GM.InGMList",false);
- m_configs[CONFIG_GM_IN_WHO_LIST] = sConfig.GetBoolDefault("GM.InWhoList",false);
+ m_configs[CONFIG_GM_LOGIN_STATE] = sConfig.GetIntDefault("GM.LoginState", 2);
+ m_configs[CONFIG_GM_VISIBLE_STATE] = sConfig.GetIntDefault("GM.Visible", 2);
+ //m_configs[CONFIG_GM_ACCEPT_TICKETS] = sConfig.GetIntDefault("GM.AcceptTickets", 2);
+ m_configs[CONFIG_GM_CHAT] = sConfig.GetIntDefault("GM.Chat", 2);
+ m_configs[CONFIG_GM_WISPERING_TO] = sConfig.GetIntDefault("GM.WhisperingTo", 2);
+ m_configs[CONFIG_GM_IN_GM_LIST] = sConfig.GetBoolDefault("GM.InGMList", false);
+ m_configs[CONFIG_GM_IN_WHO_LIST] = sConfig.GetBoolDefault("GM.InWhoList", false);
m_configs[CONFIG_GM_LOG_TRADE] = sConfig.GetBoolDefault("GM.LogTrade", false);
m_configs[CONFIG_START_GM_LEVEL] = sConfig.GetIntDefault("GM.StartLevel", 1);
if(m_configs[CONFIG_START_GM_LEVEL] < m_configs[CONFIG_START_PLAYER_LEVEL])
@@ -778,13 +814,15 @@ void World::LoadConfigSettings(bool reload)
sLog.outError("GM.StartLevel (%i) must be in range 1..%u. Set to %u.", m_configs[CONFIG_START_GM_LEVEL], MAX_LEVEL, MAX_LEVEL);
m_configs[CONFIG_START_GM_LEVEL] = MAX_LEVEL;
}
+ m_configs[CONFIG_GM_LOWER_SECURITY] = sConfig.GetBoolDefault("GM.LowerSecurity", false);
+ m_configs[CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS] = sConfig.GetBoolDefault("GM.AllowAchievementGain", true);
m_configs[CONFIG_GROUP_VISIBILITY] = sConfig.GetIntDefault("Visibility.GroupMode",0);
m_configs[CONFIG_MAIL_DELIVERY_DELAY] = sConfig.GetIntDefault("MailDeliveryDelay",HOUR);
m_configs[CONFIG_UPTIME_UPDATE] = sConfig.GetIntDefault("UpdateUptimeInterval", 10);
- if(m_configs[CONFIG_UPTIME_UPDATE]<=0)
+ if(int32(m_configs[CONFIG_UPTIME_UPDATE])<=0)
{
sLog.outError("UpdateUptimeInterval (%i) must be > 0, set to default 10.",m_configs[CONFIG_UPTIME_UPDATE]);
m_configs[CONFIG_UPTIME_UPDATE] = 10;
@@ -804,6 +842,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfig.GetIntDefault("SkillChance.SkinningSteps",75);
m_configs[CONFIG_SKILL_PROSPECTING] = sConfig.GetBoolDefault("SkillChance.Prospecting",false);
+ m_configs[CONFIG_SKILL_MILLING] = sConfig.GetBoolDefault("SkillChance.Milling",false);
m_configs[CONFIG_SKILL_GAIN_CRAFTING] = sConfig.GetIntDefault("SkillGain.Crafting", 1);
if(m_configs[CONFIG_SKILL_GAIN_CRAFTING] < 0)
@@ -892,6 +931,8 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_DEATH_SICKNESS_LEVEL] = sConfig.GetIntDefault("Death.SicknessLevel", 11);
m_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP] = sConfig.GetBoolDefault("Death.CorpseReclaimDelay.PvP", true);
m_configs[CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE] = sConfig.GetBoolDefault("Death.CorpseReclaimDelay.PvE", true);
+ m_configs[CONFIG_DEATH_BONES_WORLD] = sConfig.GetBoolDefault("Death.Bones.World", true);
+ m_configs[CONFIG_DEATH_BONES_BG_OR_ARENA] = sConfig.GetBoolDefault("Death.Bones.BattlegroundOrArena", true);
m_configs[CONFIG_THREAT_RADIUS] = sConfig.GetIntDefault("ThreatRadius", 60);
@@ -1066,7 +1107,7 @@ void World::SetInitialWorldSettings()
}
///- Loading strings. Getting no records means core load has to be canceled because no error message can be output.
- sLog.outString( "" );
+ sLog.outString();
sLog.outString( "Loading Trinity strings..." );
if (!objmgr.LoadTrinityStrings())
exit(1); // Error message displayed in function already
@@ -1090,7 +1131,7 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Script Names...");
objmgr.LoadScriptNames();
- sLog.outString( "Loading InstanceTemplate" );
+ sLog.outString( "Loading InstanceTemplate..." );
objmgr.LoadInstanceTemplate();
sLog.outString( "Loading SkillLineAbilityMultiMap Data..." );
@@ -1098,11 +1139,12 @@ void World::SetInitialWorldSettings()
///- Clean up and pack instances
sLog.outString( "Cleaning up instances..." );
- sInstanceSaveManager.CleanupInstances(); // must be called before `creature_respawn`/`gameobject_respawn` tables
+ sInstanceSaveManager.CleanupInstances(); // must be called before `creature_respawn`/`gameobject_respawn` tables
sLog.outString( "Packing instances..." );
sInstanceSaveManager.PackInstances();
+ sLog.outString();
sLog.outString( "Loading Localization strings..." );
objmgr.LoadCreatureLocales();
objmgr.LoadGameObjectLocales();
@@ -1111,7 +1153,10 @@ void World::SetInitialWorldSettings()
objmgr.LoadNpcTextLocales();
objmgr.LoadPageTextLocales();
objmgr.LoadNpcOptionLocales();
+ objmgr.LoadPointOfInterestLocales();
objmgr.SetDBCLocaleIndex(GetDefaultDbcLocale()); // Get once for all the locale index of DBC language (console/broadcasts)
+ sLog.outString( ">>> Localization strings loaded" );
+ sLog.outString();
sLog.outString( "Loading Page Texts..." );
objmgr.LoadPageTexts();
@@ -1140,6 +1185,9 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Spell Proc Event conditions..." );
spellmgr.LoadSpellProcEvents();
+ sLog.outString( "Loading Spell Bonus Data..." );
+ spellmgr.LoadSpellBonusess();
+
sLog.outString( "Loading Aggro Spells Definitions...");
spellmgr.LoadSpellThreats();
@@ -1170,6 +1218,9 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Creature Reputation OnKill Data..." );
objmgr.LoadReputationOnKill();
+ sLog.outString( "Loading Points Of Interest Data..." );
+ objmgr.LoadPointsOfInterest();
+
sLog.outString( "Loading Pet Create Spells..." );
objmgr.LoadPetCreateSpells();
@@ -1177,7 +1228,10 @@ void World::SetInitialWorldSettings()
objmgr.LoadCreatures();
sLog.outString( "Loading Creature Addon Data..." );
+ sLog.outString();
objmgr.LoadCreatureAddons(); // must be after LoadCreatureTemplates() and LoadCreatures()
+ sLog.outString( ">>> Creature Addon Data loaded" );
+ sLog.outString();
sLog.outString( "Loading Creature Respawn Data..." ); // must be after PackInstances()
objmgr.LoadCreatureRespawnTimes();
@@ -1188,8 +1242,14 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Gameobject Respawn Data..." ); // must be after PackInstances()
objmgr.LoadGameobjectRespawnTimes();
+ sLog.outString( "Loading Objects Pooling Data...");
+ poolhandler.LoadFromDB();
+
sLog.outString( "Loading Game Event Data...");
+ sLog.outString();
gameeventmgr.LoadFromDB();
+ sLog.outString( ">>> Game Event Data loaded" );
+ sLog.outString();
sLog.outString( "Loading Weather Data..." );
objmgr.LoadWeatherZoneChances();
@@ -1198,7 +1258,10 @@ void World::SetInitialWorldSettings()
objmgr.LoadQuests(); // must be loaded after DBCs, creature_template, item_template, gameobject tables
sLog.outString( "Loading Quests Relations..." );
+ sLog.outString();
objmgr.LoadQuestRelations(); // must be after quest load
+ sLog.outString( ">>> Quests Relations loaded" );
+ sLog.outString();
sLog.outString( "Loading AreaTrigger definitions..." );
objmgr.LoadAreaTriggerTeleports(); // must be after item template load
@@ -1224,14 +1287,20 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading spell pet auras..." );
spellmgr.LoadSpellPetAuras();
+ sLog.outString( "Loading pet levelup spells..." );
+ spellmgr.LoadPetLevelupSpellMap();
+
sLog.outString( "Loading spell extra attributes...(TODO)" );
spellmgr.LoadSpellCustomAttr();
sLog.outString( "Loading linked spells..." );
spellmgr.LoadSpellLinked();
- sLog.outString( "Loading player Create Info & Level Stats..." );
+ sLog.outString( "Loading Player Create Info & Level Stats..." );
+ sLog.outString();
objmgr.LoadPlayerInfo();
+ sLog.outString( ">>> Player Create Info & Level Stats loaded" );
+ sLog.outString();
sLog.outString( "Loading Exploration BaseXP Data..." );
objmgr.LoadExplorationBaseXP();
@@ -1252,7 +1321,10 @@ void World::SetInitialWorldSettings()
objmgr.LoadSpellDisabledEntrys();
sLog.outString( "Loading Loot Tables..." );
+ sLog.outString();
LoadLootTables();
+ sLog.outString( ">>> Loot Tables loaded" );
+ sLog.outString();
sLog.outString( "Loading Skill Discovery Table..." );
LoadSkillDiscoveryTable();
@@ -1263,10 +1335,22 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Skill Fishing base level requirements..." );
objmgr.LoadFishingBaseSkillLevel();
+ sLog.outString( "Loading Achievements..." );
+ sLog.outString();
+ achievementmgr.LoadAchievementCriteriaList();
+ achievementmgr.LoadRewards();
+ achievementmgr.LoadRewardLocales();
+ achievementmgr.LoadCompletedAchievements();
+ sLog.outString( ">>> Achievements loaded" );
+ sLog.outString();
+
///- Load dynamic data tables from the database
sLog.outString( "Loading Auctions..." );
- objmgr.LoadAuctionItems();
- objmgr.LoadAuctions();
+ sLog.outString();
+ auctionmgr.LoadAuctionItems();
+ auctionmgr.LoadAuctions();
+ sLog.outString( ">>> Auctions loaded" );
+ sLog.outString();
sLog.outString( "Loading Guilds..." );
objmgr.LoadGuilds();
@@ -1280,11 +1364,11 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading ReservedNames..." );
objmgr.LoadReservedPlayersNames();
- sLog.outString( "Loading GameObject for quests..." );
+ sLog.outString( "Loading GameObjects for quests..." );
objmgr.LoadGameObjectForQuests();
sLog.outString( "Loading BattleMasters..." );
- objmgr.LoadBattleMastersEntry();
+ sBattleGroundMgr.LoadBattleMastersEntry();
sLog.outString( "Loading GameTeleports..." );
objmgr.LoadGameTele();
@@ -1295,13 +1379,14 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Npc Options..." );
objmgr.LoadNpcOptions();
- sLog.outString( "Loading vendors..." );
+ sLog.outString( "Loading Vendors..." );
objmgr.LoadVendors(); // must be after load CreatureTemplate and ItemTemplate
- sLog.outString( "Loading trainers..." );
+ sLog.outString( "Loading Trainers..." );
objmgr.LoadTrainerSpell(); // must be after load CreatureTemplate
sLog.outString( "Loading Waypoints..." );
+ sLog.outString();
WaypointMgr.Load();
sLog.outString( "Loading Creature Formations..." );
@@ -1316,12 +1401,15 @@ void World::SetInitialWorldSettings()
///- Load and initialize scripts
sLog.outString( "Loading Scripts..." );
+ sLog.outString();
objmgr.LoadQuestStartScripts(); // must be after load Creature/Gameobject(Template/Data) and QuestTemplate
objmgr.LoadQuestEndScripts(); // must be after load Creature/Gameobject(Template/Data) and QuestTemplate
objmgr.LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data)
objmgr.LoadGameObjectScripts(); // must be after load Creature/Gameobject(Template/Data)
objmgr.LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data)
objmgr.LoadWaypointScripts();
+ sLog.outString( ">>> Scripts loaded" );
+ sLog.outString();
sLog.outString( "Loading Scripts text locales..." ); // must be after Load*Scripts calls
objmgr.LoadDbScriptStrings();
@@ -1392,6 +1480,9 @@ void World::SetInitialWorldSettings()
sLog.outString("Calculate next daily quest reset time..." );
InitDailyQuestResetTime();
+ sLog.outString("Starting objects Pooling system..." );
+ poolhandler.Initialize();
+
sLog.outString("Starting Game Event system..." );
uint32 nextGameEvent = gameeventmgr.Initialize();
m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event
@@ -1443,6 +1534,7 @@ void World::DetectDBCLang()
m_defaultDbcLocale = LocaleConstant(default_locale);
sLog.outString("Using %s DBC Locale as default. All available DBC locales: %s",localeNames[m_defaultDbcLocale],availableLocalsStr.empty() ? "<none>" : availableLocalsStr.c_str());
+ sLog.outString();
}
void World::RecordTimeDiff(const char *text, ...)
@@ -1472,7 +1564,7 @@ void World::RecordTimeDiff(const char *text, ...)
}
/// Update the World !
-void World::Update(time_t diff)
+void World::Update(uint32 diff)
{
m_updateTime = uint32(diff);
if(m_configs[CONFIG_INTERVAL_LOG_UPDATE])
@@ -1520,54 +1612,8 @@ void World::Update(time_t diff)
objmgr.ReturnOrDeleteOldMails(true);
}
- AuctionHouseObject* AuctionMap;
- for (int i = 0; i < 3; i++)
- {
- switch (i)
- {
- case 0:
- AuctionMap = objmgr.GetAuctionsMap( 6 );//horde
- break;
- case 1:
- AuctionMap = objmgr.GetAuctionsMap( 2 );//alliance
- break;
- case 2:
- AuctionMap = objmgr.GetAuctionsMap( 7 );//neutral
- break;
- }
-
- ///- Handle expired auctions
- AuctionHouseObject::AuctionEntryMap::iterator itr,next;
- for (itr = AuctionMap->GetAuctionsBegin(); itr != AuctionMap->GetAuctionsEnd();itr = next)
- {
- next = itr;
- ++next;
- if (m_gameTime > (itr->second->time))
- {
- ///- Either cancel the auction if there was no bidder
- if (itr->second->bidder == 0)
- {
- objmgr.SendAuctionExpiredMail( itr->second );
- }
- ///- Or perform the transaction
- else
- {
- //we should send an "item sold" message if the seller is online
- //we send the item to the winner
- //we send the money to the seller
- objmgr.SendAuctionSuccessfulMail( itr->second );
- objmgr.SendAuctionWonMail( itr->second );
- }
-
- ///- In any case clear the auction
- //No SQL injection (Id is integer)
- CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE id = '%u'",itr->second->Id);
- objmgr.RemoveAItem(itr->second->item_guidlow);
- delete itr->second;
- AuctionMap->RemoveAuction(itr->first);
- }
- }
- }
+ ///- Handle expired auctions
+ auctionmgr.Update();
}
RecordTimeDiff(NULL);
@@ -1760,6 +1806,9 @@ void World::ScriptsProcess()
case HIGHGUID_PET:
source = HashMapHolder<Pet>::Find(step.sourceGUID);
break;
+ case HIGHGUID_VEHICLE:
+ source = HashMapHolder<Vehicle>::Find(step.sourceGUID);
+ break;
case HIGHGUID_PLAYER:
source = HashMapHolder<Player>::Find(step.sourceGUID);
break;
@@ -1799,6 +1848,9 @@ void World::ScriptsProcess()
case HIGHGUID_PET:
target = HashMapHolder<Pet>::Find(step.targetGUID);
break;
+ case HIGHGUID_VEHICLE:
+ target = HashMapHolder<Vehicle>::Find(step.targetGUID);
+ break;
case HIGHGUID_PLAYER: // empty GUID case also
target = HashMapHolder<Player>::Find(step.targetGUID);
break;
@@ -1907,7 +1959,7 @@ void World::ScriptsProcess()
sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId());
break;
}
- ((Unit *)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, ((Unit *)source)->GetUnitMovementFlags(), step.script->datalong2 );
+ ((Unit *)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 );
((Unit *)source)->GetMap()->CreatureRelocation(((Creature *)source), step.script->x, step.script->y, step.script->z, 0);
break;
case SCRIPT_COMMAND_FLAG_SET:
@@ -2029,8 +2081,8 @@ void World::ScriptsProcess()
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::GameObjectWithDbGUIDCheck go_check(*summoner,step.script->datalong);
- Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(go,go_check);
+ MaNGOS::GameObjectWithDbGUIDCheck go_check(*summoner,step.script->datalong);
+ MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(summoner, go,go_check);
TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -2090,8 +2142,8 @@ void World::ScriptsProcess()
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
- Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(door,go_check);
+ MaNGOS::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
+ MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(caster,door,go_check);
TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -2146,8 +2198,8 @@ void World::ScriptsProcess()
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
- Trinity::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
- Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(door,go_check);
+ MaNGOS::GameObjectWithDbGUIDCheck go_check(*caster,step.script->datalong);
+ MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(caster,door,go_check);
TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -2299,24 +2351,40 @@ void World::ScriptsProcess()
break;
}
- Object* cmdTarget = step.script->datalong2 ? source : target;
+ Object* cmdTarget = step.script->datalong2 & 0x01 ? source : target;
if(!cmdTarget)
{
- sLog.outError("SCRIPT_COMMAND_CAST_SPELL call for NULL %s.",step.script->datalong2 ? "source" : "target");
+ sLog.outError("SCRIPT_COMMAND_CAST_SPELL call for NULL %s.",step.script->datalong2 & 0x01 ? "source" : "target");
break;
}
if(!cmdTarget->isType(TYPEMASK_UNIT))
{
- sLog.outError("SCRIPT_COMMAND_CAST_SPELL %s isn't unit (TypeId: %u), skipping.",step.script->datalong2 ? "source" : "target",cmdTarget->GetTypeId());
+ sLog.outError("SCRIPT_COMMAND_CAST_SPELL %s isn't unit (TypeId: %u), skipping.",step.script->datalong2 & 0x01 ? "source" : "target",cmdTarget->GetTypeId());
break;
}
Unit* spellTarget = (Unit*)cmdTarget;
+ Object* cmdSource = step.script->datalong2 & 0x02 ? target : source;
+
+ if(!cmdSource)
+ {
+ sLog.outError("SCRIPT_COMMAND_CAST_SPELL call for NULL %s.",step.script->datalong2 & 0x02 ? "target" : "source");
+ break;
+ }
+
+ if(!cmdSource->isType(TYPEMASK_UNIT))
+ {
+ sLog.outError("SCRIPT_COMMAND_CAST_SPELL %s isn't unit (TypeId: %u), skipping.",step.script->datalong2 & 0x02 ? "target" : "source", cmdSource->GetTypeId());
+ break;
+ }
+
+ Unit* spellSource = (Unit*)cmdSource;
+
//TODO: when GO cast implemented, code below must be updated accordingly to also allow GO spell cast
- ((Unit*)source)->CastSpell(spellTarget,step.script->datalong,false);
+ spellSource->CastSpell(spellTarget,step.script->datalong,false);
break;
}
@@ -2363,7 +2431,7 @@ void World::ScriptsProcess()
//sLog.outDebug("Attempting to find Creature: Db GUID: %i", step.script->datalong);
Trinity::CreatureWithDbGUIDCheck target_check(((Unit*)source), step.script->datalong);
- Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(target,target_check);
+ Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(((Unit*)source), target, target_check);
TypeContainerVisitor<Trinity::CreatureSearcher <Trinity::CreatureWithDbGUIDCheck>, GridTypeMapContainer > unit_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
@@ -2580,7 +2648,7 @@ void World::SendGMText(int32 string_id, ...)
delete data_cache[i][j];
}
-/// Send a System Message to all players (except self if mentioned)
+/// DEPRICATED, 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;
@@ -2871,7 +2939,7 @@ void World::SendServerMessage(uint32 type, const char *text, Player* player)
SendGlobalMessage( &data );
}
-void World::UpdateSessions( time_t diff )
+void World::UpdateSessions( uint32 diff )
{
///- Add new sessions
while(!addSessQueue.empty())
diff --git a/src/game/World.h b/src/game/World.h
index 4848c87ca5f..8bbbf335625 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -104,9 +104,12 @@ enum WorldConfigs
CONFIG_CHARACTERS_CREATING_DISABLED,
CONFIG_CHARACTERS_PER_ACCOUNT,
CONFIG_CHARACTERS_PER_REALM,
+ CONFIG_HEROIC_CHARACTERS_PER_REALM,
+ CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING,
CONFIG_SKIP_CINEMATICS,
CONFIG_MAX_PLAYER_LEVEL,
CONFIG_START_PLAYER_LEVEL,
+ CONFIG_START_HEROIC_PLAYER_LEVEL,
CONFIG_START_PLAYER_MONEY,
CONFIG_MAX_HONOR_POINTS,
CONFIG_START_HONOR_POINTS,
@@ -123,12 +126,16 @@ enum WorldConfigs
CONFIG_MAX_PRIMARY_TRADE_SKILL,
CONFIG_MIN_PETITION_SIGNS,
CONFIG_GM_LOGIN_STATE,
+ CONFIG_GM_VISIBLE_STATE,
+ CONFIG_GM_ACCEPT_TICKETS,
CONFIG_GM_CHAT,
CONFIG_GM_WISPERING_TO,
CONFIG_GM_IN_GM_LIST,
CONFIG_GM_IN_WHO_LIST,
CONFIG_GM_LOG_TRADE,
CONFIG_START_GM_LEVEL,
+ CONFIG_GM_LOWER_SECURITY,
+ CONFIG_GM_ALLOW_ACHIEVEMENT_GAINS,
CONFIG_GROUP_VISIBILITY,
CONFIG_MAIL_DELIVERY_DELAY,
CONFIG_UPTIME_UPDATE,
@@ -171,6 +178,8 @@ enum WorldConfigs
CONFIG_DEATH_SICKNESS_LEVEL,
CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP,
CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE,
+ CONFIG_DEATH_BONES_WORLD,
+ CONFIG_DEATH_BONES_BG_OR_ARENA,
CONFIG_THREAT_RADIUS,
CONFIG_INSTANT_LOGOUT,
CONFIG_DISABLE_BREATHING,
@@ -183,8 +192,11 @@ enum WorldConfigs
CONFIG_ARENA_RATING_DISCARD_TIMER,
CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
+ CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE,
+ CONFIG_ARENA_SEASON_ID,
+ CONFIG_ARENA_SEASON_IN_PROGRESS,
CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
-
+ CONFIG_SKILL_MILLING,
CONFIG_MAX_WHO,
CONFIG_BG_START_MUSIC,
CONFIG_START_ALL_SPELLS,
@@ -212,6 +224,8 @@ enum Rates
RATE_POWER_MANA,
RATE_POWER_RAGE_INCOME,
RATE_POWER_RAGE_LOSS,
+ RATE_POWER_RUNICPOWER_INCOME,
+ RATE_POWER_RUNICPOWER_LOSS,
RATE_POWER_FOCUS,
RATE_SKILL_DISCOVERY,
RATE_DROP_ITEM_POOR,
@@ -226,7 +240,6 @@ enum Rates
RATE_XP_KILL,
RATE_XP_QUEST,
RATE_XP_EXPLORE,
- RATE_XP_PAST_70,
RATE_REPUTATION_GAIN,
RATE_CREATURE_NORMAL_HP,
RATE_CREATURE_ELITE_ELITE_HP,
@@ -255,7 +268,6 @@ enum Rates
RATE_MINING_AMOUNT,
RATE_MINING_NEXT,
RATE_TALENT,
- RATE_LOYALTY,
RATE_CORPSE_DECAY_LOOTED,
RATE_INSTANCE_RESET_TIME,
RATE_TARGET_POS_RECALCULATION_RANGE,
@@ -327,12 +339,11 @@ enum RealmZone
#define SCRIPT_COMMAND_CLOSE_DOOR 12 // source = unit, datalong=db_guid, datalong2=reset_delay
#define SCRIPT_COMMAND_ACTIVATE_OBJECT 13 // source = unit, target=GO
#define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
-#define SCRIPT_COMMAND_CAST_SPELL 15 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
+#define SCRIPT_COMMAND_CAST_SPELL 15 // source/target cast spell at target/source (script->datalong2: 0: s->t 1: s->s 2: t->t 3: t->s
#define SCRIPT_COMMAND_LOAD_PATH 16 // source = unit, path = datalong, repeatable datalong2
#define SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT 17 // datalong scriptid, lowguid datalong2, dataint table
#define SCRIPT_COMMAND_PLAYSOUND 18 // datalong soundid, datalong2 play only self
-
/// Storage class for commands issued for delayed execution
struct CliCommandHolder
{
@@ -452,9 +463,9 @@ class World
static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; }
static bool IsStopped() { return m_stopEvent; }
- void Update(time_t diff);
+ void Update(uint32 diff);
- void UpdateSessions( time_t diff );
+ void UpdateSessions( uint32 diff );
/// Set a server rate (see #Rates)
void setRate(Rates rate,float value) { rate_values[rate]=value; }
/// Get a server rate (see #Rates)
diff --git a/src/game/WorldLog.cpp b/src/game/WorldLog.cpp
index a1065dced5c..7a10986f749 100644
--- a/src/game/WorldLog.cpp
+++ b/src/game/WorldLog.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/WorldLog.h b/src/game/WorldLog.h
index 0a7c2a08067..97374ddc5f5 100644
--- a/src/game/WorldLog.h
+++ b/src/game/WorldLog.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -51,9 +51,9 @@ class TRINITY_DLL_DECL WorldLog : public Trinity::Singleton<WorldLog, Trinity::C
public:
void Initialize();
/// Is the world logger active?
- inline bool LogWorld(void) const { return (i_file != NULL); }
+ bool LogWorld(void) const { return (i_file != NULL); }
/// %Log to the file
- inline void Log(char const *fmt, ...)
+ void Log(char const *fmt, ...)
{
if( LogWorld() )
{
diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp
index 6065e491993..bfe9946e7d3 100644
--- a/src/game/WorldSession.cpp
+++ b/src/game/WorldSession.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -306,18 +306,18 @@ void WorldSession::LogoutPlayer(bool Save)
_player->RepopAtGraveyard();
}
- ///- Remove player from battleground (teleport to entrance)
- if(_player->InBattleGround())
- _player->LeaveBattleground();
+ ///- Teleport to home if the player is in an invalid instance
+ if(!_player->m_InstanceValid && !_player->isGameMaster())
+ _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->GetOrientation());
sOutdoorPvPMgr.HandlePlayerLeaveZone(_player,_player->GetZoneId());
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++)
{
- if(int32 bgTypeId = _player->GetBattleGroundQueueId(i))
+ if(BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i))
{
- _player->RemoveBattleGroundQueueId(bgTypeId);
- sBattleGroundMgr.m_BattleGroundQueues[ bgTypeId ].RemovePlayer(_player->GetGUID(), true);
+ _player->RemoveBattleGroundQueueId(bgQueueTypeId);
+ sBattleGroundMgr.m_BattleGroundQueues[ bgQueueTypeId ].RemovePlayer(_player->GetGUID(), true);
}
}
@@ -469,6 +469,13 @@ void WorldSession::SendNotification(int32 string_id,...)
}
}
+void WorldSession::SendSetPhaseShift(uint32 PhaseShift)
+{
+ WorldPacket data(SMSG_SET_PHASE_SHIFT, 4);
+ data << uint32(PhaseShift);
+ SendPacket(&data);
+}
+
const char * WorldSession::GetTrinityString( int32 entry ) const
{
return objmgr.GetTrinityString(entry,GetSessionDbLocaleIndex());
@@ -519,3 +526,92 @@ void WorldSession::SendAuthWaitQue(uint32 position)
}
}
+void WorldSession::LoadAccountData()
+{
+ for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i)
+ {
+ AccountData data;
+ m_accountData[i] = data;
+ }
+
+ QueryResult *result = CharacterDatabase.PQuery("SELECT type, time, data FROM account_data WHERE account='%u'", GetAccountId());
+
+ if(!result)
+ return;
+
+ do
+ {
+ Field *fields = result->Fetch();
+
+ uint32 type = fields[0].GetUInt32();
+ if(type < NUM_ACCOUNT_DATA_TYPES)
+ {
+ m_accountData[type].Time = fields[1].GetUInt32();
+ m_accountData[type].Data = fields[2].GetCppString();
+ }
+ } while (result->NextRow());
+
+ delete result;
+}
+
+void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data)
+{
+ m_accountData[type].Time = time_;
+ m_accountData[type].Data = data;
+
+ uint32 acc = GetAccountId();
+
+ CharacterDatabase.BeginTransaction ();
+ CharacterDatabase.PExecute("DELETE FROM account_data WHERE account='%u' AND type='%u'", acc, type);
+ CharacterDatabase.escape_string(data);
+ CharacterDatabase.PExecute("INSERT INTO account_data VALUES ('%u','%u','%u','%s')", acc, type, (uint32)time_, data.c_str());
+ CharacterDatabase.CommitTransaction ();
+}
+
+void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
+{
+ CHECK_PACKET_SIZE(data, data.rpos()+4+2+4+4+4+4+4);
+ data >> mi->flags;
+ data >> mi->unk1;
+ data >> mi->time;
+ data >> mi->x;
+ data >> mi->y;
+ data >> mi->z;
+ data >> mi->o;
+
+ if(mi->flags & MOVEMENTFLAG_ONTRANSPORT)
+ {
+ CHECK_PACKET_SIZE(data, data.rpos()+8+4+4+4+4+4+1);
+ data >> mi->t_guid;
+ data >> mi->t_x;
+ data >> mi->t_y;
+ data >> mi->t_z;
+ data >> mi->t_o;
+ data >> mi->t_time;
+ data >> mi->t_seat;
+ }
+
+ if((mi->flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (mi->unk1 & 0x20))
+ {
+ CHECK_PACKET_SIZE(data, data.rpos()+4);
+ data >> mi->s_pitch;
+ }
+
+ CHECK_PACKET_SIZE(data, data.rpos()+4);
+ data >> mi->fallTime;
+
+ if(mi->flags & MOVEMENTFLAG_JUMPING)
+ {
+ CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4);
+ data >> mi->j_unk;
+ data >> mi->j_sinAngle;
+ data >> mi->j_cosAngle;
+ data >> mi->j_xyspeed;
+ }
+
+ if(mi->flags & MOVEMENTFLAG_SPLINE)
+ {
+ CHECK_PACKET_SIZE(data, data.rpos()+4);
+ data >> mi->u_unk1;
+ }
+}
diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h
index d9fa35f3208..46fb0f43a1d 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -26,6 +26,7 @@
#define __WORLDSESSION_H
#include "Common.h"
+#include "SharedDefines.h"
class MailItemsInfo;
struct ItemPrototype;
@@ -47,6 +48,16 @@ class CharacterHandler;
#define CHECK_PACKET_SIZE(P,S) if((P).size() < (S)) return SizeError((P),(S));
+#define NUM_ACCOUNT_DATA_TYPES 8
+
+struct AccountData
+{
+ AccountData() : Time(0), Data("") {}
+
+ time_t Time;
+ std::string Data;
+};
+
enum PartyOperation
{
PARTY_OP_INVITE = 0,
@@ -81,6 +92,8 @@ class TRINITY_DLL_SPEC WorldSession
void SizeError(WorldPacket const& packet, uint32 size) const;
+ void ReadMovementInfo(WorldPacket &data, MovementInfo *mi);
+
void SendPacket(WorldPacket const* packet);
void SendNotification(const char *format,...) ATTR_PRINTF(2,3);
void SendNotification(int32 string_id,...);
@@ -88,6 +101,7 @@ class TRINITY_DLL_SPEC WorldSession
void SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type);
void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res);
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3);
+ void SendSetPhaseShift(uint32 phaseShift);
uint32 GetSecurity() const { return _security; }
uint32 GetAccountId() const { return _accountId; }
@@ -141,7 +155,7 @@ class TRINITY_DLL_SPEC WorldSession
void SendAttackStop(Unit const* enemy);
- void SendBattlegGroundList( uint64 guid, uint32 bgTypeId );
+ void SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId );
void SendTradeStatus(uint32 status);
void SendCancelTrade();
@@ -153,6 +167,11 @@ class TRINITY_DLL_SPEC WorldSession
//pet
void SendPetNameQuery(uint64 guid, uint32 petnumber);
+ // Account Data
+ AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; }
+ void SetAccountData(uint32 type, time_t time_, std::string data);
+ void LoadAccountData();
+
//mail
//used with item_page table
bool SendItemInfo( uint32 itemid, WorldPacket data );
@@ -164,7 +183,6 @@ class TRINITY_DLL_SPEC WorldSession
void SendAuctionCommandResult( uint32 auctionId, uint32 Action, uint32 ErrorCode, uint32 bidError = 0);
void SendAuctionBidderNotification( uint32 location, uint32 auctionId, uint64 bidder, uint32 bidSum, uint32 diff, uint32 item_template);
void SendAuctionOwnerNotification( AuctionEntry * auction );
- bool SendAuctionInfo(WorldPacket & data, AuctionEntry* auction);
void SendAuctionOutbiddedMail( AuctionEntry * auction, uint32 newPrice );
void SendAuctionCancelledToBidderMail( AuctionEntry* auction );
@@ -310,6 +328,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
void HandleMeetingStoneInfo(WorldPacket& recPacket);
+ void HandleGameobjectReportUse(WorldPacket& recvPacket);
void HandleNameQueryOpcode(WorldPacket& recvPacket);
@@ -323,9 +342,10 @@ class TRINITY_DLL_SPEC WorldSession
void HandleMoveWorldportAckOpcode(); // for server-side calls
void HandleMovementOpcodes(WorldPacket& recvPacket);
- void HandlePossessedMovement(WorldPacket& recv_data, MovementInfo& movementInfo, uint32& MovementFlags);
+ //void HandlePossessedMovement(WorldPacket& recv_data, MovementInfo& movementInfo, uint32& MovementFlags);
void HandleSetActiveMoverOpcode(WorldPacket &recv_data);
- void HandleNotActiveMoverOpcode(WorldPacket &recv_data);
+ void HandleMoveNotActiveMover(WorldPacket &recv_data);
+ void HandleDismissControlledVehicle(WorldPacket &recv_data);
void HandleMoveTimeSkippedOpcode(WorldPacket &recv_data);
void HandleRequestRaidInfoOpcode( WorldPacket & recv_data );
@@ -386,7 +406,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGuildSaveEmblemOpcode(WorldPacket& recvPacket);
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
- void HandleTaxiQueryAvailableNodesOpcode(WorldPacket& recvPacket);
+ void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket);
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
void HandleActivateTaxiFarOpcode(WorldPacket& recvPacket);
void HandleTaxiNextDestinationOpcode(WorldPacket& recvPacket);
@@ -430,6 +450,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleAuctionRemoveItem( WorldPacket & recv_data );
void HandleAuctionListOwnerItems( WorldPacket & recv_data );
void HandleAuctionPlaceBid( WorldPacket & recv_data );
+ void HandleAuctionListPendingSales( WorldPacket & recv_data );
void HandleGetMail( WorldPacket & recv_data );
void HandleSendMail( WorldPacket & recv_data );
@@ -545,6 +566,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandlePetUnlearnOpcode( WorldPacket& recvPacket );
void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket );
void HandlePetCastSpellOpcode( WorldPacket& recvPacket );
+ void HandlePetLearnTalent( WorldPacket& recvPacket );
void HandleSetActionBar(WorldPacket& recv_data);
@@ -581,10 +603,9 @@ class TRINITY_DLL_SPEC WorldSession
void HandleLfmSetNoneOpcode(WorldPacket& recv_data);
void HandleLfmSetOpcode(WorldPacket& recv_data);
void HandleLfgSetCommentOpcode(WorldPacket& recv_data);
- void HandleNewUnknownOpcode(WorldPacket& recv_data);
void HandleChooseTitleOpcode(WorldPacket& recv_data);
void HandleRealmStateRequestOpcode(WorldPacket& recv_data);
- void HandleAllowMoveAckOpcode(WorldPacket& recv_data);
+ void HandleTimeSyncResp(WorldPacket& recv_data);
void HandleWhoisOpcode(WorldPacket& recv_data);
void HandleResetInstancesOpcode(WorldPacket& recv_data);
@@ -630,6 +651,29 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGuildBankBuyTab(WorldPacket& recv_data);
void HandleGuildBankTabText(WorldPacket& recv_data);
void HandleGuildBankSetTabText(WorldPacket& recv_data);
+
+ // Calendar
+ void HandleCalendarGetCalendar(WorldPacket& recv_data);
+ void HandleCalendarGetEvent(WorldPacket& recv_data);
+ void HandleCalendarGuildFilter(WorldPacket& recv_data);
+ void HandleCalendarArenaTeam(WorldPacket& recv_data);
+ void HandleCalendarAddEvent(WorldPacket& recv_data);
+ void HandleCalendarUpdateEvent(WorldPacket& recv_data);
+ void HandleCalendarRemoveEvent(WorldPacket& recv_data);
+ void HandleCalendarCopyEvent(WorldPacket& recv_data);
+ void HandleCalendarEventInvite(WorldPacket& recv_data);
+ void HandleCalendarEventRsvp(WorldPacket& recv_data);
+ void HandleCalendarEventRemoveInvite(WorldPacket& recv_data);
+ void HandleCalendarEventStatus(WorldPacket& recv_data);
+ void HandleCalendarEventModeratorStatus(WorldPacket& recv_data);
+ void HandleCalendarComplain(WorldPacket& recv_data);
+ void HandleCalendarGetNumPending(WorldPacket& recv_data);
+
+ void HandleSpellClick(WorldPacket& recv_data);
+ void HandleAlterAppearance(WorldPacket& recv_data);
+ void HandleRemoveGlyph(WorldPacket& recv_data);
+ void HandleCharCustomize(WorldPacket& recv_data);
+ void HandleInspectAchievements(WorldPacket& recv_data);
private:
// private trade methods
void moveItems(Item* myItems[], Item* hisItems[]);
@@ -652,6 +696,7 @@ class TRINITY_DLL_SPEC WorldSession
LocaleConstant m_sessionDbcLocale;
int m_sessionDbLocaleIndex;
uint32 m_latency;
+ AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
ZThread::LockedQueue<WorldPacket*,ZThread::FastMutex> _recvQueue;
};
diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp
index 9ad3bff234f..6c94dbd8cb4 100644
--- a/src/game/WorldSocket.cpp
+++ b/src/game/WorldSocket.cpp
@@ -1,7 +1,7 @@
/*
-* Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
-* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+* Copyright (C) 2008-2009 Trinity <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
@@ -54,8 +54,37 @@
struct ServerPktHeader
{
- uint16 size;
- uint16 cmd;
+ /**
+ * size is the length of the payload _plus_ the length of the opcode
+ */
+ ServerPktHeader(uint32 size, uint16 cmd) : size(size)
+ {
+ uint8 headerIndex=0;
+ if(isLargePacket())
+ {
+ sLog.outDebug("initializing large server to client packet. Size: %u, cmd: %u", size, cmd);
+ header[headerIndex++] = 0x80|(0xFF &(size>>16));
+ }
+ header[headerIndex++] = 0xFF &(size>>8);
+ header[headerIndex++] = 0xFF &size;
+
+ header[headerIndex++] = 0xFF & cmd;
+ header[headerIndex++] = 0xFF & (cmd>>8);
+ }
+
+ uint8 getHeaderLength()
+ {
+ // cmd = 2 bytes, size= 2||3bytes
+ return 2+(isLargePacket()?3:2);
+ }
+
+ bool isLargePacket()
+ {
+ return size > 0x7FFF;
+ }
+
+ const uint32 size;
+ uint8 header[5];
};
struct ClientPktHeader
@@ -84,6 +113,9 @@ m_OverSpeedPings (0),
m_LastPingTime (ACE_Time_Value::zero)
{
reference_counting_policy ().value (ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
+
+ msg_queue()->high_water_mark(8*1024*1024);
+ msg_queue()->low_water_mark(8*1024*1024);
}
WorldSocket::~WorldSocket (void)
@@ -97,10 +129,6 @@ WorldSocket::~WorldSocket (void)
closing_ = true;
peer ().close ();
-
- WorldPacket* pct;
- while (m_PacketQueue.dequeue_head (pct) == 0)
- delete pct;
}
bool WorldSocket::IsClosed (void) const
@@ -160,18 +188,35 @@ int WorldSocket::SendPacket (const WorldPacket& pct)
sWorldLog.Log ("\n\n");
}
- if (iSendPacket (pct) == -1)
+ ServerPktHeader header(pct.size()+2, pct.GetOpcode());
+ m_Crypt.EncryptSend ( header.header, header.getHeaderLength());
+
+ if (m_OutBuffer->space () >= pct.size () + header.getHeaderLength() && msg_queue()->is_empty())
+ {
+ // Put the packet on the buffer.
+ if (m_OutBuffer->copy ((char*) header.header, header.getHeaderLength()) == -1)
+ ACE_ASSERT (false);
+
+ if (!pct.empty ())
+ if (m_OutBuffer->copy ((char*) pct.contents (), pct.size ()) == -1)
+ ACE_ASSERT (false);
+ }
+ else
{
- WorldPacket* npct;
+ // Enqueue the packet.
+ ACE_Message_Block* mb;
+
+ ACE_NEW_RETURN(mb, ACE_Message_Block(pct.size () + header.getHeaderLength()), -1);
+
+ mb->copy((char*) header.header, header.getHeaderLength());
- ACE_NEW_RETURN (npct, WorldPacket (pct), -1);
+ if (!pct.empty ())
+ mb->copy((const char*)pct.contents(), pct.size ());
- // NOTE maybe check of the size of the queue can be good ?
- // to make it bounded instead of unbounded
- if (m_PacketQueue.enqueue_tail (npct) == -1)
+ if(msg_queue()->enqueue_tail(mb,(ACE_Time_Value*)&ACE_Time_Value::zero) == -1)
{
- delete npct;
- sLog.outError ("WorldSocket::SendPacket: m_PacketQueue.enqueue_tail failed");
+ sLog.outError("WorldSocket::SendPacket enqueue_tail");
+ mb->release();
return -1;
}
}
@@ -296,7 +341,7 @@ int WorldSocket::handle_output (ACE_HANDLE)
const size_t send_len = m_OutBuffer->length ();
if (send_len == 0)
- return cancel_wakeup_output (Guard);
+ return handle_output_queue (Guard);
#ifdef MSG_NOSIGNAL
ssize_t n = peer ().send (m_OutBuffer->rd_ptr (), send_len, MSG_NOSIGNAL);
@@ -326,15 +371,73 @@ int WorldSocket::handle_output (ACE_HANDLE)
{
m_OutBuffer->reset ();
- if (!iFlushPacketQueue ())
- return cancel_wakeup_output (Guard);
- else
- return schedule_wakeup_output (Guard);
+ return handle_output_queue (Guard);
}
ACE_NOTREACHED (return 0);
}
+int WorldSocket::handle_output_queue (GuardType& g)
+{
+ if(msg_queue()->is_empty())
+ return cancel_wakeup_output(g);
+
+ ACE_Message_Block *mblk;
+
+ if(msg_queue()->dequeue_head(mblk, (ACE_Time_Value*)&ACE_Time_Value::zero) == -1)
+ {
+ sLog.outError("WorldSocket::handle_output_queue dequeue_head");
+ return -1;
+ }
+
+ const size_t send_len = mblk->length ();
+
+#ifdef MSG_NOSIGNAL
+ ssize_t n = peer ().send (mblk->rd_ptr (), send_len, MSG_NOSIGNAL);
+#else
+ ssize_t n = peer ().send (mblk->rd_ptr (), send_len);
+#endif // MSG_NOSIGNAL
+
+ if (n == 0)
+ {
+ mblk->release();
+
+ return -1;
+ }
+ else if (n == -1)
+ {
+ if (errno == EWOULDBLOCK || errno == EAGAIN)
+ {
+ msg_queue()->enqueue_head(mblk, (ACE_Time_Value*) &ACE_Time_Value::zero);
+ return schedule_wakeup_output (g);
+ }
+
+ mblk->release();
+ return -1;
+ }
+ else if (n < send_len) //now n > 0
+ {
+ mblk->rd_ptr (static_cast<size_t> (n));
+
+ if (msg_queue()->enqueue_head(mblk, (ACE_Time_Value*) &ACE_Time_Value::zero) == -1)
+ {
+ sLog.outError("WorldSocket::handle_output_queue enqueue_head");
+ mblk->release();
+ return -1;
+ }
+
+ return schedule_wakeup_output (g);
+ }
+ else //now n == send_len
+ {
+ mblk->release();
+
+ return msg_queue()->is_empty() ? cancel_wakeup_output(g) : ACE_Event_Handler::WRITE_MASK;
+ }
+
+ ACE_NOTREACHED(return -1);
+}
+
int WorldSocket::handle_close (ACE_HANDLE h, ACE_Reactor_Mask)
{
// Critical section
@@ -362,10 +465,15 @@ int WorldSocket::Update (void)
if (closing_)
return -1;
- if (m_OutActive || m_OutBuffer->length () == 0)
+ if (m_OutActive || (m_OutBuffer->length () == 0 && msg_queue()->is_empty()))
return 0;
- return handle_output (get_handle ());
+ int ret;
+ do
+ ret = handle_output (get_handle ());
+ while( ret > 0 );
+
+ return ret;
}
int WorldSocket::handle_input_header (void)
@@ -381,8 +489,7 @@ int WorldSocket::handle_input_header (void)
EndianConvertReverse(header.size);
EndianConvert(header.cmd);
- if ((header.size < 4) || (header.size > 10240) ||
- (header.cmd < 0) || (header.cmd > 10240) )
+ if ((header.size < 4) || (header.size > 10240) || (header.cmd > 10240))
{
sLog.outError ("WorldSocket::handle_input_header: client sent mailformed packet size = %d , cmd = %d",
header.size, header.cmd);
@@ -626,7 +733,7 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct)
}
else
{
- sLog.outError ("WorldSocket::ProcessIncoming: Client not authed opcode = ", opcode);
+ sLog.outError ("WorldSocket::ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
return -1;
}
}
@@ -639,7 +746,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// NOTE: ATM the socket is singlethread, have this in mind ...
uint8 digest[20];
uint32 clientSeed;
- uint32 unk2;
+ uint32 unk2, unk3;
uint32 BuiltNumberClient;
uint32 id, security;
//uint8 expansion = 0;
@@ -661,6 +768,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
recvPacket >> BuiltNumberClient; // for now no use
recvPacket >> unk2;
recvPacket >> account;
+ recvPacket >> unk3;
if (recvPacket.size () < (4 + 4 + (account.size () + 1) + 4 + 20))
{
@@ -684,17 +792,17 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
QueryResult *result =
LoginDatabase.PQuery ("SELECT "
- "id, " //0
- "gmlevel, " //1
- "sessionkey, " //2
- "last_ip, " //3
- "locked, " //4
- "sha_pass_hash, " //5
- "v, " //6
- "s, " //7
- "expansion, " //8
- "mutetime, " //9
- "locale " //10
+ "id, " //0
+ "gmlevel, " //1
+ "sessionkey, " //2
+ "last_ip, " //3
+ "locked, " //4
+ "sha_pass_hash, " //5
+ "v, " //6
+ "s, " //7
+ "expansion, " //8
+ "mutetime, " //9
+ "locale " //10
"FROM account "
"WHERE username = '%s'",
safe_account.c_str ());
@@ -788,6 +896,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
id = fields[0].GetUInt32 ();
security = fields[1].GetUInt16 ();
+ if(security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB
+ security = SEC_ADMINISTRATOR;
+
K.SetHexStr (fields[2].GetString ());
time_t mutetime = time_t (fields[9].GetUInt64 ());
@@ -880,6 +991,8 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
m_Crypt.SetKey (&K);
m_Crypt.Init ();
+ m_Session->LoadAccountData();
+
// In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec
ACE_OS::sleep (ACE_Time_Value (0, 10000));
@@ -961,25 +1074,19 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket)
return SendPacket (packet);
}
-int WorldSocket::iSendPacket (const WorldPacket& pct)
+/*int WorldSocket::iSendPacket (const WorldPacket& pct)
{
- if (m_OutBuffer->space () < pct.size () + sizeof (ServerPktHeader))
+ ServerPktHeader header(pct.size()+2, pct.GetOpcode());
+ if (m_OutBuffer->space () < pct.size () + header.getHeaderLength())
{
errno = ENOBUFS;
return -1;
}
- ServerPktHeader header;
- header.cmd = pct.GetOpcode ();
- EndianConvert(header.cmd);
+ m_Crypt.EncryptSend ( header.header, header.getHeaderLength());
- header.size = (uint16) pct.size () + 2;
- EndianConvertReverse(header.size);
-
- m_Crypt.EncryptSend ((uint8*) & header, sizeof (header));
-
- if (m_OutBuffer->copy ((char*) & header, sizeof (header)) == -1)
+ if (m_OutBuffer->copy ((char*) header.header, header.getHeaderLength()) == -1)
ACE_ASSERT (false);
if (!pct.empty ())
@@ -1015,5 +1122,5 @@ bool WorldSocket::iFlushPacketQueue ()
}
return haveone;
-}
+}*/
diff --git a/src/game/WorldSocket.h b/src/game/WorldSocket.h
index 7adf16373fe..67e15adf148 100644
--- a/src/game/WorldSocket.h
+++ b/src/game/WorldSocket.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -103,9 +103,6 @@ class WorldSocket : protected WorldHandler
typedef ACE_Thread_Mutex LockType;
typedef ACE_Guard<LockType> GuardType;
- /// Queue for storing packets for which there is no space.
- typedef ACE_Unbounded_Queue< WorldPacket* > PacketQueueT;
-
/// Check if socket is closed.
bool IsClosed (void) const;
@@ -161,6 +158,9 @@ class WorldSocket : protected WorldHandler
int cancel_wakeup_output (GuardType& g);
int schedule_wakeup_output (GuardType& g);
+ /// Drain the queue if its not empty.
+ int handle_output_queue (GuardType& g);
+
/// process one incoming packet.
/// @param new_pct received packet ,note that you need to delete it.
int ProcessIncoming (WorldPacket* new_pct);
@@ -171,16 +171,6 @@ class WorldSocket : protected WorldHandler
/// Called by ProcessIncoming() on CMSG_PING.
int HandlePing (WorldPacket& recvPacket);
- /// Try to write WorldPacket to m_OutBuffer ,return -1 if no space
- /// Need to be called with m_OutBufferLock lock held
- int iSendPacket (const WorldPacket& pct);
-
- /// Flush m_PacketQueue if there are packets in it
- /// Need to be called with m_OutBufferLock lock held
- /// @return true if it wrote to the buffer ( AKA you need
- /// to mark the socket for output ).
- bool iFlushPacketQueue ();
-
private:
/// Time in which the last ping was received
ACE_Time_Value m_LastPingTime;
@@ -220,10 +210,6 @@ class WorldSocket : protected WorldHandler
/// Size of the m_OutBuffer.
size_t m_OutBufferSize;
- /// Here are stored packets for which there was no space on m_OutBuffer,
- /// this allows not-to kick player if its buffer is overflowed.
- PacketQueueT m_PacketQueue;
-
/// True if the socket is registered with the reactor for output
bool m_OutActive;
diff --git a/src/game/WorldSocketMgr.cpp b/src/game/WorldSocketMgr.cpp
index e73b8993d0b..e8f8bad5894 100644
--- a/src/game/WorldSocketMgr.cpp
+++ b/src/game/WorldSocketMgr.cpp
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2005-2008,2007 MaNGOS <http://getmangos.com/>
*
-* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+* Copyright (C) 2008-2009 Trinity <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
diff --git a/src/game/WorldSocketMgr.h b/src/game/WorldSocketMgr.h
index f6e55614d46..94cfa78324c 100644
--- a/src/game/WorldSocketMgr.h
+++ b/src/game/WorldSocketMgr.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/mangosd/CMakeLists.txt b/src/mangosd/CMakeLists.txt
new file mode 100644
index 00000000000..dc5941ef4e2
--- /dev/null
+++ b/src/mangosd/CMakeLists.txt
@@ -0,0 +1,53 @@
+
+########### next target ###############
+
+SET(trinity-core_SRCS
+CliRunnable.cpp
+CliRunnable.h
+Main.cpp
+Master.cpp
+Master.h
+RASocket.cpp
+RASocket.h
+WorldRunnable.cpp
+WorldRunnable.h
+)
+
+add_executable(trinity-core ${trinity-core_SRCS})
+add_definitions(
+-D_TRINITY_CORE_CONFIG='"${CONF_DIR}/trinitycore.conf"'
+)
+IF (DO_MYSQL)
+ SET_TARGET_PROPERTIES(trinity-core PROPERTIES LINK_FLAGS "-pthread")
+ENDIF(DO_MYSQL)
+
+
+
+target_link_libraries(
+trinity-core
+game
+shared
+zlib
+trinityframework
+trinitysockets
+trinitydatabase
+trinityauth
+trinityconfig
+vmaps
+ZThread
+g3dlite
+${SCRIPT_LIB}
+${MYSQL_LIBRARIES}
+${POSTGRE_LIBS}
+${SSLLIB}
+${ACE_LIBRARY}
+${ZLIB}
+)
+
+install(TARGETS trinity-core DESTINATION bin)
+
+
+########### install files ###############
+
+install(FILES mangosd.conf.dist.in DESTINATION etc)
+
diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp
new file mode 100644
index 00000000000..f3bc640f9ff
--- /dev/null
+++ b/src/mangosd/CliRunnable.cpp
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup Trinityd
+/// @{
+/// \file
+
+#include "Common.h"
+#include "Language.h"
+#include "Log.h"
+#include "World.h"
+#include "ScriptCalls.h"
+#include "ObjectMgr.h"
+#include "WorldSession.h"
+#include "Config/ConfigEnv.h"
+#include "Util.h"
+#include "AccountMgr.h"
+#include "CliRunnable.h"
+#include "MapManager.h"
+#include "Player.h"
+#include "Chat.h"
+
+void utf8print(const char* str)
+{
+#if PLATFORM == PLATFORM_WINDOWS
+ wchar_t wtemp_buf[6000];
+ size_t wtemp_len = 6000-1;
+ if(!Utf8toWStr(str,strlen(str),wtemp_buf,wtemp_len))
+ return;
+
+ char temp_buf[6000];
+ CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1);
+ printf(temp_buf);
+#else
+ printf(str);
+#endif
+}
+
+/// Delete a user account and all associated characters in this realm
+/// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account
+bool ChatHandler::HandleAccountDeleteCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ ///- Get the account name from the command line
+ char *account_name_str=strtok ((char*)args," ");
+ if (!account_name_str)
+ return false;
+
+ std::string account_name = account_name_str;
+ if(!AccountMgr::normilizeString(account_name))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 account_id = accmgr.GetId(account_name);
+ if(!account_id)
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ /// Commands not recommended call from chat, but support anyway
+ /// can delete only for account with less security
+ /// This is also reject self apply in fact
+ if(HasLowerSecurityAccount (NULL,account_id,true))
+ return false;
+
+ AccountOpResult result = accmgr.DeleteAccount(account_id);
+ switch(result)
+ {
+ case AOR_OK:
+ PSendSysMessage(LANG_ACCOUNT_DELETED,account_name.c_str());
+ break;
+ case AOR_NAME_NOT_EXIST:
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ case AOR_DB_INTERNAL_ERROR:
+ PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ default:
+ PSendSysMessage(LANG_ACCOUNT_NOT_DELETED,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+}
+
+bool ChatHandler::HandleCharacterDeleteCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ char *character_name_str = strtok((char*)args," ");
+ if(!character_name_str)
+ return false;
+
+ std::string character_name = character_name_str;
+ if(!normalizePlayerName(character_name))
+ return false;
+
+ uint64 character_guid;
+ uint32 account_id;
+
+ Player *player = objmgr.GetPlayer(character_name.c_str());
+ if(player)
+ {
+ character_guid = player->GetGUID();
+ account_id = player->GetSession()->GetAccountId();
+ player->GetSession()->KickPlayer();
+ }
+ else
+ {
+ character_guid = objmgr.GetPlayerGUIDByName(character_name);
+ if(!character_guid)
+ {
+ PSendSysMessage(LANG_NO_PLAYER,character_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ account_id = objmgr.GetPlayerAccountIdByGUID(character_guid);
+ }
+
+ std::string account_name;
+ accmgr.GetName (account_id,account_name);
+
+ Player::DeleteFromDB(character_guid, account_id, true);
+ PSendSysMessage(LANG_CHARACTER_DELETED,character_name.c_str(),GUID_LOPART(character_guid),account_name.c_str(), account_id);
+ return true;
+}
+
+/// Exit the realm
+bool ChatHandler::HandleServerExitCommand(const char* args)
+{
+ SendSysMessage(LANG_COMMAND_EXIT);
+ World::StopNow(SHUTDOWN_EXIT_CODE);
+ return true;
+}
+
+/// Display info on users currently in the realm
+bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
+{
+ ///- Get the list of accounts ID logged to the realm
+ QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0");
+ if (!resultDB)
+ return true;
+
+ ///- Display the list of account/characters online
+ SendSysMessage("=====================================================================");
+ SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
+ SendSysMessage("=====================================================================");
+
+ ///- Circle through accounts
+ do
+ {
+ Field *fieldsDB = resultDB->Fetch();
+ std::string name = fieldsDB[0].GetCppString();
+ uint32 account = fieldsDB[1].GetUInt32();
+
+ ///- Get the username, last IP and GM level of each account
+ // No SQL injection. account is uint32.
+ // 0 1 2 3
+ QueryResult *resultLogin = LoginDatabase.PQuery("SELECT username, last_ip, gmlevel, expansion FROM account WHERE id = '%u'",account);
+
+ if(resultLogin)
+ {
+ Field *fieldsLogin = resultLogin->Fetch();
+ PSendSysMessage("|%15s| %20s | %15s |%4d|%5d|",
+ fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32());
+
+ delete resultLogin;
+ }
+ else
+ PSendSysMessage(LANG_ACCOUNT_LIST_ERROR,name.c_str());
+
+ }while(resultDB->NextRow());
+
+ delete resultDB;
+
+ SendSysMessage("=====================================================================");
+ return true;
+}
+
+/// Create an account
+bool ChatHandler::HandleAccountCreateCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ ///- %Parse the command line arguments
+ char *szAcc = strtok((char*)args, " ");
+ char *szPassword = strtok(NULL, " ");
+ if(!szAcc || !szPassword)
+ return false;
+
+ // normilized in accmgr.CreateAccount
+ std::string account_name = szAcc;
+ std::string password = szPassword;
+
+ AccountOpResult result = accmgr.CreateAccount(account_name, password);
+ switch(result)
+ {
+ case AOR_OK:
+ PSendSysMessage(LANG_ACCOUNT_CREATED,account_name.c_str());
+ break;
+ case AOR_NAME_TOO_LONG:
+ SendSysMessage(LANG_ACCOUNT_TOO_LONG);
+ SetSentErrorMessage(true);
+ return false;
+ case AOR_NAME_ALREDY_EXIST:
+ SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST);
+ SetSentErrorMessage(true);
+ return false;
+ case AOR_DB_INTERNAL_ERROR:
+ PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ default:
+ PSendSysMessage(LANG_ACCOUNT_NOT_CREATED,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+}
+
+/// Set the level of logging
+bool ChatHandler::HandleServerSetLogLevelCommand(const char *args)
+{
+ if(!*args)
+ return false;
+
+ char *NewLevel = strtok((char*)args, " ");
+ if (!NewLevel)
+ return false;
+
+ sLog.SetLogLevel(NewLevel);
+ return true;
+}
+
+/// set diff time record interval
+bool ChatHandler::HandleServerSetDiffTimeCommand(const char *args)
+{
+ if(!*args)
+ return false;
+
+ char *NewTimeStr = strtok((char*)args, " ");
+ if(!NewTimeStr)
+ return false;
+
+ int32 NewTime =atoi(NewTimeStr);
+ if(NewTime < 0)
+ return false;
+
+ sWorld.SetRecordDiffInterval(NewTime);
+ printf( "Record diff every %u ms\n", NewTime);
+ return true;
+}
+
+
+/// @}
+
+#ifdef linux
+// Non-blocking keypress detector, when return pressed, return 1, else always return 0
+int kb_hit_return()
+{
+ struct timeval tv;
+ fd_set fds;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ FD_ZERO(&fds);
+ FD_SET(STDIN_FILENO, &fds);
+ select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
+ return FD_ISSET(STDIN_FILENO, &fds);
+}
+#endif
+
+/// %Thread start
+void CliRunnable::run()
+{
+ ///- Init new SQL thread for the world database (one connection call enough)
+ WorldDatabase.ThreadStart(); // let thread do safe mySQL requests
+
+ char commandbuf[256];
+
+ ///- Display the list of available CLI functions then beep
+ sLog.outString();
+
+ if(sConfig.GetBoolDefault("BeepAtStart", true))
+ printf("\a"); // \a = Alert
+
+ // print this here the first time
+ // later it will be printed after command queue updates
+ printf("TC>");
+
+ ///- As long as the World is running (no World::m_stopEvent), get the command line and handle it
+ while (!World::IsStopped())
+ {
+ fflush(stdout);
+ #ifdef linux
+ while (!kb_hit_return() && !World::IsStopped())
+ // With this, we limit CLI to 10commands/second
+ usleep(100);
+ if (World::IsStopped())
+ break;
+ #endif
+ char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin);
+ if (command_str != NULL)
+ {
+ for(int x=0;command_str[x];x++)
+ if(command_str[x]=='\r'||command_str[x]=='\n')
+ {
+ command_str[x]=0;
+ break;
+ }
+
+
+ if(!*command_str)
+ {
+ printf("TC>");
+ continue;
+ }
+
+ std::string command;
+ if(!consoleToUtf8(command_str,command)) // convert from console encoding to utf8
+ {
+ printf("TC>");
+ continue;
+ }
+
+ sWorld.QueueCliCommand(&utf8print,command.c_str());
+ }
+ else if (feof(stdin))
+ {
+ World::StopNow(SHUTDOWN_EXIT_CODE);
+ }
+ }
+
+ ///- End the database thread
+ WorldDatabase.ThreadEnd(); // free mySQL thread resources
+}
diff --git a/src/mangosd/CliRunnable.h b/src/mangosd/CliRunnable.h
new file mode 100644
index 00000000000..e5f78bb5259
--- /dev/null
+++ b/src/mangosd/CliRunnable.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup Trinityd
+/// @{
+/// \file
+
+#ifndef __CLIRUNNABLE_H
+#define __CLIRUNNABLE_H
+
+/// Command Line Interface handling thread
+class CliRunnable : public ZThread::Runnable
+{
+ public:
+ void run();
+};
+#endif
+/// @}
diff --git a/src/mangosd/Main.cpp b/src/mangosd/Main.cpp
new file mode 100644
index 00000000000..68c467d6265
--- /dev/null
+++ b/src/mangosd/Main.cpp
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup Trinityd Trinity Daemon
+/// @{
+/// \file
+
+#include "Common.h"
+#include "Database/DatabaseEnv.h"
+#include "Config/ConfigEnv.h"
+#include "Log.h"
+#include "Master.h"
+
+#ifndef _TRINITY_CORE_CONFIG
+# define _TRINITY_CORE_CONFIG "TrinityCore.conf"
+#endif //_TRINITY_CORE_CONFIG
+
+// Format is YYYYMMDDRR where RR is the change in the conf file
+// for that day.
+#ifndef _TRINITY_CORE_CONFVER
+# define _TRINITY_CORE_CONFVER 2008022901
+#endif //_TRINITY_CORE_CONFVER
+
+#ifdef WIN32
+#include "ServiceWin32.h"
+char serviceName[] = "TrinityCore";
+char serviceLongName[] = "Trinity core service";
+char serviceDescription[] = "Massive Network Game Object Server";
+/*
+ * -1 - not in service mode
+ * 0 - stopped
+ * 1 - running
+ * 2 - paused
+ */
+int m_ServiceStatus = -1;
+#endif
+
+DatabaseType WorldDatabase; ///< Accessor to the world database
+DatabaseType CharacterDatabase; ///< Accessor to the character database
+DatabaseType LoginDatabase; ///< Accessor to the realm/login database
+
+uint32 realmID; ///< Id of the realm
+
+/// Print out the usage string for this program on the console.
+void usage(const char *prog)
+{
+ sLog.outString("Usage: \n %s [<options>]\n"
+ " -c config_file use config_file as configuration file\n\r"
+ #ifdef WIN32
+ " Running as service functions:\n\r"
+ " --service run as service\n\r"
+ " -s install install service\n\r"
+ " -s uninstall uninstall service\n\r"
+ #endif
+ ,prog);
+}
+
+/// Launch the Trinity server
+extern int main(int argc, char **argv)
+{
+ ///- Command line parsing to get the configuration file name
+ char const* cfg_file = _TRINITY_CORE_CONFIG;
+ int c=1;
+ while( c < argc )
+ {
+ if( strcmp(argv[c],"-c") == 0)
+ {
+ if( ++c >= argc )
+ {
+ sLog.outError("Runtime-Error: -c option requires an input argument");
+ usage(argv[0]);
+ return 1;
+ }
+ else
+ cfg_file = argv[c];
+ }
+
+ #ifdef WIN32
+ ////////////
+ //Services//
+ ////////////
+ if( strcmp(argv[c],"-s") == 0)
+ {
+ if( ++c >= argc )
+ {
+ sLog.outError("Runtime-Error: -s option requires an input argument");
+ usage(argv[0]);
+ return 1;
+ }
+ if( strcmp(argv[c],"install") == 0)
+ {
+ if (WinServiceInstall())
+ sLog.outString("Installing service");
+ return 1;
+ }
+ else if( strcmp(argv[c],"uninstall") == 0)
+ {
+ if(WinServiceUninstall())
+ sLog.outString("Uninstalling service");
+ return 1;
+ }
+ else
+ {
+ sLog.outError("Runtime-Error: unsupported option %s",argv[c]);
+ usage(argv[0]);
+ return 1;
+ }
+ }
+ if( strcmp(argv[c],"--service") == 0)
+ {
+ WinServiceRun();
+ }
+ ////
+ #endif
+ ++c;
+ }
+
+ if (!sConfig.SetSource(cfg_file))
+ {
+ sLog.outError("Could not find configuration file %s.", cfg_file);
+ return 1;
+ }
+ sLog.outString("Using configuration file %s.", cfg_file);
+
+ uint32 confVersion = sConfig.GetIntDefault("ConfVersion", 0);
+ if (confVersion < _TRINITY_CORE_CONFVER)
+ {
+ sLog.outError("*****************************************************************************");
+ sLog.outError(" WARNING: Your trinitycore.conf version indicates your conf file is out of date!");
+ sLog.outError(" Please check for updates, as your current default values may cause");
+ sLog.outError(" strange behavior.");
+ sLog.outError("*****************************************************************************");
+ clock_t pause = 3000 + clock();
+
+ while (pause > clock()) {}
+ }
+
+ ///- and run the 'Master'
+ /// \todo Why do we need this 'Master'? Can't all of this be in the Main as for Realmd?
+ return sMaster.Run();
+
+ // at sMaster return function exist with codes
+ // 0 - normal shutdown
+ // 1 - shutdown at error
+ // 2 - restart command used, this code can be used by restarter for restart Trinityd
+}
+
+/// @}
diff --git a/src/mangosd/Makefile.am b/src/mangosd/Makefile.am
new file mode 100644
index 00000000000..7e1cd086d3c
--- /dev/null
+++ b/src/mangosd/Makefile.am
@@ -0,0 +1,62 @@
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+#
+# Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+## Process this file with automake to produce Makefile.in
+
+## CPP flags for includes, defines, etc.
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/../game -I$(srcdir) -DSYSCONFDIR=\"$(sysconfdir)/\"
+
+## Build world list daemon as standalone program
+bin_PROGRAMS = trinity-worldd
+trinity_worldd_SOURCES = \
+ CliRunnable.cpp \
+ CliRunnable.h \
+ Main.cpp \
+ Master.cpp \
+ Master.h \
+ RASocket.cpp \
+ RASocket.h \
+ WorldRunnable.cpp \
+ WorldRunnable.h
+
+## Link world daemon against the shared library
+trinity_worldd_LDADD = ../bindings/scripts/libtrinityscript.la ../game/libmangosgame.a ../shared/Database/libmangosdatabase.a ../shared/Config/libmangosconfig.a ../shared/Auth/libmangosauth.a ../shared/libmangosshared.a ../shared/vmap/libmangosvmaps.a ../framework/libmangosframework.a ../../dep/src/sockets/libmangossockets.a ../../dep/src/zthread/libZThread.la ../../dep/src/g3dlite/libg3dlite.a
+trinity_worldd_LDFLAGS = -L../../dep/src/sockets -L../../dep/src/zthread -L../../dep/src/g3dlite -L../bindings/scripts/ -L$(libdir) $(TRINI_LIBS) -export-dynamic
+
+## Additional files to include when running 'make dist'
+# Include world daemon configuration
+EXTRA_DIST = \
+ mangosd.conf.dist
+
+## Additional files to install
+sysconf_DATA = \
+ mangosd.conf.dist
+
+install-data-hook:
+ @list='$(sysconf_DATA)'; for p in $$list; do \
+ dest=`echo $$p | sed -e s/.dist//`; \
+ if test -f $(DESTDIR)$(sysconfdir)/$$dest; then \
+ echo "$@ will not overwrite existing $(DESTDIR)$(sysconfdir)/$$dest"; \
+ else \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$dest"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$dest; \
+ fi; \
+ done
+
+clean-local:
+ rm -f $(sysconf_DATA)
diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp
new file mode 100644
index 00000000000..96e7c28b8fb
--- /dev/null
+++ b/src/mangosd/Master.cpp
@@ -0,0 +1,521 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \file
+ \ingroup Trinityd
+*/
+
+#include <ace/OS_NS_signal.h>
+
+#include "WorldSocketMgr.h"
+#include "Common.h"
+#include "Master.h"
+#include "WorldSocket.h"
+#include "WorldRunnable.h"
+#include "World.h"
+#include "Log.h"
+#include "Timer.h"
+#include "Policies/SingletonImp.h"
+#include "SystemConfig.h"
+#include "Config/ConfigEnv.h"
+#include "Database/DatabaseEnv.h"
+#include "CliRunnable.h"
+#include "RASocket.h"
+#include "ScriptCalls.h"
+#include "Util.h"
+
+#include "sockets/TcpSocket.h"
+#include "sockets/Utility.h"
+#include "sockets/Parse.h"
+#include "sockets/Socket.h"
+#include "sockets/SocketHandler.h"
+#include "sockets/ListenSocket.h"
+
+#ifdef WIN32
+#include "ServiceWin32.h"
+extern int m_ServiceStatus;
+#endif
+
+/// \todo Warning disabling not useful under VC++2005. Can somebody say on which compiler it is useful?
+#pragma warning(disable:4305)
+
+INSTANTIATE_SINGLETON_1( Master );
+
+volatile uint32 Master::m_masterLoopCounter = 0;
+
+class FreezeDetectorRunnable : public ZThread::Runnable
+{
+public:
+ FreezeDetectorRunnable() { _delaytime = 0; }
+ uint32 m_loops, m_lastchange;
+ uint32 w_loops, w_lastchange;
+ uint32 _delaytime;
+ void SetDelayTime(uint32 t) { _delaytime = t; }
+ void run(void)
+ {
+ if(!_delaytime)
+ return;
+ sLog.outString("Starting up anti-freeze thread (%u seconds max stuck time)...",_delaytime/1000);
+ m_loops = 0;
+ w_loops = 0;
+ m_lastchange = 0;
+ w_lastchange = 0;
+ while(!World::IsStopped())
+ {
+ ZThread::Thread::sleep(1000);
+ uint32 curtime = getMSTime();
+ //DEBUG_LOG("anti-freeze: time=%u, counters=[%u; %u]",curtime,Master::m_masterLoopCounter,World::m_worldLoopCounter);
+
+ // There is no Master anymore
+ // TODO: clear the rest of the code
+// // normal work
+// if(m_loops != Master::m_masterLoopCounter)
+// {
+// m_lastchange = curtime;
+// m_loops = Master::m_masterLoopCounter;
+// }
+// // possible freeze
+// else if(getMSTimeDiff(m_lastchange,curtime) > _delaytime)
+// {
+// sLog.outError("Main/Sockets Thread hangs, kicking out server!");
+// *((uint32 volatile*)NULL) = 0; // bang crash
+// }
+
+ // normal work
+ if(w_loops != World::m_worldLoopCounter)
+ {
+ w_lastchange = curtime;
+ w_loops = World::m_worldLoopCounter;
+ }
+ // possible freeze
+ else if(getMSTimeDiff(w_lastchange,curtime) > _delaytime)
+ {
+ sLog.outError("World Thread hangs, kicking out server!");
+ *((uint32 volatile*)NULL) = 0; // bang crash
+ }
+ }
+ sLog.outString("Anti-freeze thread exiting without problems.");
+ }
+};
+
+class RARunnable : public ZThread::Runnable
+{
+public:
+ uint32 numLoops, loopCounter;
+
+ RARunnable ()
+ {
+ uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME);
+ numLoops = (sConfig.GetIntDefault ("MaxPingTime", 30) * (MINUTE * 1000000 / socketSelecttime));
+ loopCounter = 0;
+ }
+
+ void checkping ()
+ {
+ // ping if need
+ if ((++loopCounter) == numLoops)
+ {
+ loopCounter = 0;
+ sLog.outDetail ("Ping MySQL to keep connection alive");
+ delete WorldDatabase.Query ("SELECT 1 FROM command LIMIT 1");
+ delete LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1");
+ delete CharacterDatabase.Query ("SELECT 1 FROM bugreport LIMIT 1");
+ }
+ }
+
+ void run ()
+ {
+ SocketHandler h;
+
+ // Launch the RA listener socket
+ ListenSocket<RASocket> RAListenSocket (h);
+ bool usera = sConfig.GetBoolDefault ("Ra.Enable", false);
+
+ if (usera)
+ {
+ port_t raport = sConfig.GetIntDefault ("Ra.Port", 3443);
+ std::string stringip = sConfig.GetStringDefault ("Ra.IP", "0.0.0.0");
+ ipaddr_t raip;
+ if (!Utility::u2ip (stringip, raip))
+ sLog.outError ("MaNGOS RA can not bind to ip %s", stringip.c_str ());
+ else if (RAListenSocket.Bind (raip, raport))
+ sLog.outError ("MaNGOS RA can not bind to port %d on %s", raport, stringip.c_str ());
+ else
+ {
+ h.Add (&RAListenSocket);
+
+ sLog.outString ("Starting Remote access listner on port %d on %s", raport, stringip.c_str ());
+ }
+ }
+
+ // Socket Selet time is in microseconds , not miliseconds!!
+ uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME);
+
+ // if use ra spend time waiting for io, if not use ra ,just sleep
+ if (usera)
+ {
+ while (!World::IsStopped())
+ {
+ h.Select (0, socketSelecttime);
+ checkping ();
+ }
+ }
+ else
+ {
+ while (!World::IsStopped())
+ {
+ ZThread::Thread::sleep (static_cast<unsigned long> (socketSelecttime / 1000));
+ checkping ();
+ }
+ }
+ }
+};
+
+Master::Master()
+{
+}
+
+Master::~Master()
+{
+}
+
+/// Main function
+int Master::Run()
+{
+ sLog.outString( "%s (core-daemon)", _FULLVERSION );
+ sLog.outString( "<Ctrl-C> to stop.\n" );
+
+ sLog.outTitle( " ______ __");
+ sLog.outTitle( "/\\__ _\\ __ __/\\ \\__");
+ sLog.outTitle( "\\/_/\\ \\/ _ __ /\\_\\ ___ /\\_\\ \\ ,_\\ __ __");
+ sLog.outTitle( " \\ \\ \\/\\`'__\\/\\ \\ /' _ `\\/\\ \\ \\ \\/ /\\ \\/\\ \\");
+ sLog.outTitle( " \\ \\ \\ \\ \\/ \\ \\ \\/\\ \\/\\ \\ \\ \\ \\ \\_\\ \\ \\_\\ \\");
+ sLog.outTitle( " \\ \\_\\ \\_\\ \\ \\_\\ \\_\\ \\_\\ \\_\\ \\__\\\\/`____ \\");
+ sLog.outTitle( " \\/_/\\/_/ \\/_/\\/_/\\/_/\\/_/\\/__/ `/___/> \\");
+ sLog.outTitle( " C O R E /\\___/");
+ sLog.outTitle( "http://TrinityCore.org \\/__/\n");
+
+ /// worldd PID file creation
+ std::string pidfile = sConfig.GetStringDefault("PidFile", "");
+ if(!pidfile.empty())
+ {
+ uint32 pid = CreatePIDFile(pidfile);
+ if( !pid )
+ {
+ sLog.outError( "Cannot create PID file %s.\n", pidfile.c_str() );
+ return 1;
+ }
+
+ sLog.outString( "Daemon PID: %u\n", pid );
+ }
+
+ ///- Start the databases
+ if (!_StartDB())
+ return 1;
+
+ ///- Initialize the World
+ sWorld.SetInitialWorldSettings();
+
+ ///- Catch termination signals
+ _HookSignals();
+
+ ///- Launch WorldRunnable thread
+ ZThread::Thread t(new WorldRunnable);
+ t.setPriority ((ZThread::Priority )2);
+
+ // set server online
+ LoginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0 WHERE id = '%d'",realmID);
+
+#ifdef WIN32
+ if (sConfig.GetBoolDefault("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/)
+#else
+ if (sConfig.GetBoolDefault("Console.Enable", true))
+#endif
+ {
+ ///- Launch CliRunnable thread
+ ZThread::Thread td1(new CliRunnable);
+ }
+
+ ZThread::Thread td2(new RARunnable);
+
+ ///- Handle affinity for multiple processors and process priority on Windows
+ #ifdef WIN32
+ {
+ HANDLE hProcess = GetCurrentProcess();
+
+ uint32 Aff = sConfig.GetIntDefault("UseProcessors", 0);
+ if(Aff > 0)
+ {
+ ULONG_PTR appAff;
+ ULONG_PTR sysAff;
+
+ if(GetProcessAffinityMask(hProcess,&appAff,&sysAff))
+ {
+ ULONG_PTR curAff = Aff & appAff; // remove non accessible processors
+
+ if(!curAff )
+ {
+ sLog.outError("Processors marked in UseProcessors bitmask (hex) %x not accessible for Trinityd. Accessible processors bitmask (hex): %x",Aff,appAff);
+ }
+ else
+ {
+ if(SetProcessAffinityMask(hProcess,curAff))
+ sLog.outString("Using processors (bitmask, hex): %x", curAff);
+ else
+ sLog.outError("Can't set used processors (hex): %x",curAff);
+ }
+ }
+ sLog.outString();
+ }
+
+ bool Prio = sConfig.GetBoolDefault("ProcessPriority", false);
+
+// if(Prio && (m_ServiceStatus == -1)/* need set to default process priority class in service mode*/)
+ if(Prio)
+ {
+ if(SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS))
+ sLog.outString("TrinityCore process priority class set to HIGH");
+ else
+ sLog.outError("ERROR: Can't set Trinityd process priority class.");
+ sLog.outString();
+ }
+ }
+ #endif
+
+ uint32 realCurrTime, realPrevTime;
+ realCurrTime = realPrevTime = getMSTime();
+
+ uint32 socketSelecttime = sWorld.getConfig(CONFIG_SOCKET_SELECTTIME);
+
+ // maximum counter for next ping
+ uint32 numLoops = (sConfig.GetIntDefault( "MaxPingTime", 30 ) * (MINUTE * 1000000 / socketSelecttime));
+ uint32 loopCounter = 0;
+
+ ///- Start up freeze catcher thread
+ uint32 freeze_delay = sConfig.GetIntDefault("MaxCoreStuckTime", 0);
+ if(freeze_delay)
+ {
+ FreezeDetectorRunnable *fdr = new FreezeDetectorRunnable();
+ fdr->SetDelayTime(freeze_delay*1000);
+ ZThread::Thread t(fdr);
+ t.setPriority(ZThread::High);
+ }
+
+ ///- Launch the world listener socket
+ port_t wsport = sWorld.getConfig (CONFIG_PORT_WORLD);
+ std::string bind_ip = sConfig.GetStringDefault ("BindIP", "0.0.0.0");
+
+ if (sWorldSocketMgr->StartNetwork (wsport, bind_ip.c_str ()) == -1)
+ {
+ sLog.outError ("Failed to start network");
+ World::StopNow(ERROR_EXIT_CODE);
+ // go down and shutdown the server
+ }
+
+ sWorldSocketMgr->Wait ();
+
+ // set server offline
+ LoginDatabase.PExecute("UPDATE realmlist SET color = 2 WHERE id = '%d'",realmID);
+
+ ///- Remove signal handling before leaving
+ _UnhookSignals();
+
+ // when the main thread closes the singletons get unloaded
+ // since worldrunnable uses them, it will crash if unloaded after master
+ t.wait();
+ td2.wait ();
+
+ ///- Clean database before leaving
+ clearOnlineAccounts();
+
+ ///- Wait for delay threads to end
+ CharacterDatabase.HaltDelayThread();
+ WorldDatabase.HaltDelayThread();
+ LoginDatabase.HaltDelayThread();
+
+ sLog.outString( "Halting process..." );
+
+ #ifdef WIN32
+ if (sConfig.GetBoolDefault("Console.Enable", true))
+ {
+ // this only way to terminate CLI thread exist at Win32 (alt. way exist only in Windows Vista API)
+ //_exit(1);
+ // send keyboard input to safely unblock the CLI thread
+ INPUT_RECORD b[5];
+ HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
+ b[0].EventType = KEY_EVENT;
+ b[0].Event.KeyEvent.bKeyDown = TRUE;
+ b[0].Event.KeyEvent.uChar.AsciiChar = 'X';
+ b[0].Event.KeyEvent.wVirtualKeyCode = 'X';
+ b[0].Event.KeyEvent.wRepeatCount = 1;
+
+ b[1].EventType = KEY_EVENT;
+ b[1].Event.KeyEvent.bKeyDown = FALSE;
+ b[1].Event.KeyEvent.uChar.AsciiChar = 'X';
+ b[1].Event.KeyEvent.wVirtualKeyCode = 'X';
+ b[1].Event.KeyEvent.wRepeatCount = 1;
+
+ b[2].EventType = KEY_EVENT;
+ b[2].Event.KeyEvent.bKeyDown = TRUE;
+ b[2].Event.KeyEvent.dwControlKeyState = 0;
+ b[2].Event.KeyEvent.uChar.AsciiChar = '\r';
+ b[2].Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
+ b[2].Event.KeyEvent.wRepeatCount = 1;
+ b[2].Event.KeyEvent.wVirtualScanCode = 0x1c;
+
+ b[3].EventType = KEY_EVENT;
+ b[3].Event.KeyEvent.bKeyDown = FALSE;
+ b[3].Event.KeyEvent.dwControlKeyState = 0;
+ b[3].Event.KeyEvent.uChar.AsciiChar = '\r';
+ b[3].Event.KeyEvent.wVirtualKeyCode = VK_RETURN;
+ b[3].Event.KeyEvent.wVirtualScanCode = 0x1c;
+ b[3].Event.KeyEvent.wRepeatCount = 1;
+ DWORD numb;
+ BOOL ret = WriteConsoleInput(hStdIn, b, 4, &numb);
+ }
+ #endif
+
+ // for some unknown reason, unloading scripts here and not in worldrunnable
+ // fixes a memory leak related to detaching threads from the module
+ UnloadScriptingModule();
+
+ // Exit the process with specified return value
+ return World::GetExitCode();
+}
+
+/// Initialize connection to the databases
+bool Master::_StartDB()
+{
+ ///- Get world database info from configuration file
+ std::string dbstring;
+ if(!sConfig.GetString("WorldDatabaseInfo", &dbstring))
+ {
+ sLog.outError("Database not specified in configuration file");
+ return false;
+ }
+ sLog.outString("World Database: %s", dbstring.c_str());
+
+ ///- Initialise the world database
+ if(!WorldDatabase.Initialize(dbstring.c_str()))
+ {
+ sLog.outError("Cannot connect to world database %s",dbstring.c_str());
+ return false;
+ }
+
+ if(!sConfig.GetString("CharacterDatabaseInfo", &dbstring))
+ {
+ sLog.outError("Character Database not specified in configuration file");
+ return false;
+ }
+ sLog.outString("Character Database: %s", dbstring.c_str());
+
+ ///- Initialise the Character database
+ if(!CharacterDatabase.Initialize(dbstring.c_str()))
+ {
+ sLog.outError("Cannot connect to Character database %s",dbstring.c_str());
+ return false;
+ }
+
+ ///- Get login database info from configuration file
+ if(!sConfig.GetString("LoginDatabaseInfo", &dbstring))
+ {
+ sLog.outError("Login database not specified in configuration file");
+ return false;
+ }
+
+ ///- Initialise the login database
+ sLog.outString("Login Database: %s", dbstring.c_str() );
+ if(!LoginDatabase.Initialize(dbstring.c_str()))
+ {
+ sLog.outError("Cannot connect to login database %s",dbstring.c_str());
+ return false;
+ }
+
+ ///- Get the realm Id from the configuration file
+ realmID = sConfig.GetIntDefault("RealmID", 0);
+ if(!realmID)
+ {
+ sLog.outError("Realm ID not defined in configuration file");
+ return false;
+ }
+ sLog.outString("Realm running as realm ID %d", realmID);
+
+ ///- Clean the database before starting
+ clearOnlineAccounts();
+
+ sWorld.LoadDBVersion();
+
+ sLog.outString("Using %s", sWorld.GetDBVersion());
+ return true;
+}
+
+/// Clear 'online' status for all accounts with characters in this realm
+void Master::clearOnlineAccounts()
+{
+ // Cleanup online status for characters hosted at current realm
+ /// \todo Only accounts with characters logged on *this* realm should have online status reset. Move the online column from 'account' to 'realmcharacters'?
+ LoginDatabase.PExecute(
+ "UPDATE account SET online = 0 WHERE online > 0 "
+ "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')",realmID);
+
+ CharacterDatabase.Execute("UPDATE characters SET online = 0 WHERE online<>0");
+
+ // Battleground instance ids reset at server restart
+ CharacterDatabase.Execute("UPDATE characters SET bgid = 0 WHERE bgid<>0");
+}
+
+/// Handle termination signals
+void Master::_OnSignal(int s)
+{
+ switch (s)
+ {
+ case SIGINT:
+ World::StopNow(RESTART_EXIT_CODE);
+ break;
+ case SIGTERM:
+ #ifdef _WIN32
+ case SIGBREAK:
+ #endif
+ World::StopNow(SHUTDOWN_EXIT_CODE);
+ break;
+ }
+
+ signal(s, _OnSignal);
+}
+
+/// Define hook '_OnSignal' for all termination signals
+void Master::_HookSignals()
+{
+ signal(SIGINT, _OnSignal);
+ signal(SIGTERM, _OnSignal);
+ #ifdef _WIN32
+ signal(SIGBREAK, _OnSignal);
+ #endif
+}
+
+/// Unhook the signals before leaving
+void Master::_UnhookSignals()
+{
+ signal(SIGINT, 0);
+ signal(SIGTERM, 0);
+ #ifdef _WIN32
+ signal(SIGBREAK, 0);
+ #endif
+}
diff --git a/src/mangosd/Master.h b/src/mangosd/Master.h
new file mode 100644
index 00000000000..3b2b38f32f4
--- /dev/null
+++ b/src/mangosd/Master.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup Trinityd
+/// @{
+/// \file
+
+#ifndef _MASTER_H
+#define _MASTER_H
+
+#include "Common.h"
+#include "Policies/Singleton.h"
+
+/// Start the server
+class Master
+{
+ public:
+ Master();
+ ~Master();
+ int Run();
+ static volatile uint32 m_masterLoopCounter;
+
+ private:
+ bool _StartDB();
+
+ void _HookSignals();
+ void _UnhookSignals();
+ static void _OnSignal(int s);
+
+ void clearOnlineAccounts();
+};
+
+#define sMaster Trinity::Singleton<Master>::Instance()
+#endif
+/// @}
diff --git a/src/mangosd/RASocket.cpp b/src/mangosd/RASocket.cpp
new file mode 100644
index 00000000000..a48928d5a23
--- /dev/null
+++ b/src/mangosd/RASocket.cpp
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \file
+ \ingroup Trinityd
+*/
+
+#include "Common.h"
+#include "Database/DatabaseEnv.h"
+#include "Log.h"
+#include "RASocket.h"
+#include "World.h"
+#include "Config/ConfigEnv.h"
+#include "Util.h"
+#include "AccountMgr.h"
+
+/// \todo Make this thread safe if in the future 2 admins should be able to log at the same time.
+SOCKET r;
+
+#define dropclient {Sendf("I'm busy right now, come back later."); \
+ SetCloseAndDelete(); \
+ return; \
+ }
+
+uint32 iSession=0; ///< Session number (incremented each time a new connection is made)
+unsigned int iUsers=0; ///< Number of active administrators
+
+typedef int(* pPrintf)(const char*,...);
+
+void ParseCommand(CliCommandHolder::Print*, char*command);
+
+/// RASocket constructor
+RASocket::RASocket(ISocketHandler &h): TcpSocket(h)
+{
+
+ ///- Increment the session number
+ iSess =iSession++ ;
+
+ ///- Get the config parameters
+ bSecure = sConfig.GetBoolDefault( "RA.Secure", true );
+ iMinLevel = sConfig.GetIntDefault( "RA.MinLevel", 3 );
+
+ ///- Initialize buffer and data
+ iInputLength=0;
+ buff=new char[RA_BUFF_SIZE];
+ stage=NONE;
+}
+
+/// RASocket destructor
+RASocket::~RASocket()
+{
+ ///- Delete buffer and decrease active admins count
+ delete [] buff;
+
+ sLog.outRALog("Connection was closed.\n");
+
+ if(stage==OK)
+ iUsers--;
+}
+
+/// Accept an incoming connection
+void RASocket::OnAccept()
+{
+ std::string ss=GetRemoteAddress();
+ sLog.outRALog("Incoming connection from %s.\n",ss.c_str());
+ ///- If there is already an active admin, drop the connection
+ if(iUsers)
+ dropclient
+
+ ///- Else print Motd
+ Sendf("%s\r\n",sWorld.GetMotd());
+}
+
+/// Read data from the network
+void RASocket::OnRead()
+{
+ ///- Read data and check input length
+ TcpSocket::OnRead();
+
+ unsigned int sz=ibuf.GetLength();
+ if(iInputLength+sz>=RA_BUFF_SIZE)
+ {
+ sLog.outRALog("Input buffer overflow, possible DOS attack.\n");
+ SetCloseAndDelete();
+ return;
+ }
+
+ ///- If there is already an active admin (other than you), drop the connection
+ if(stage!=OK && iUsers)
+ dropclient
+
+ char *inp = new char [sz+1];
+ ibuf.Read(inp,sz);
+
+ /// \todo Can somebody explain this 'Linux bugfix'?
+ if(stage==NONE)
+ if(sz>4) //linux remote telnet
+ if(memcmp(inp ,"USER ",5))
+ {
+ delete [] inp;return;
+ printf("lin bugfix");
+ } //linux bugfix
+
+ ///- Discard data after line break or line feed
+ bool gotenter=false;
+ unsigned int y=0;
+ for(;y<sz;y++)
+ if(inp[y]=='\r'||inp[y]=='\n')
+ {
+ gotenter=true;
+ break;
+ }
+
+ //No buffer overflow (checked above)
+ memcpy(&buff[iInputLength],inp,y);
+ iInputLength+=y;
+ delete [] inp;
+ if(gotenter)
+ {
+
+ buff[iInputLength]=0;
+ iInputLength=0;
+ switch(stage)
+ {
+ /// <ul> <li> If the input is 'USER <username>'
+ case NONE:
+ if(!memcmp(buff,"USER ",5)) //got "USER" cmd
+ {
+ szLogin=&buff[5];
+
+ ///- Get the gmlevel and password from the account table
+ std::string login = szLogin;
+
+ ///- Convert Account name to Upper Format
+ AccountMgr::normilizeString(login);
+
+ ///- Escape the Login to allow quotes in names
+ LoginDatabase.escape_string(login);
+
+ QueryResult* result = LoginDatabase.PQuery("SELECT gmlevel FROM account WHERE username = '%s'",login.c_str());
+
+ ///- If the user is not found, deny access
+ if(!result)
+ {
+ Sendf("-No such user.\r\n");
+ sLog.outRALog("User %s does not exist.\n",szLogin.c_str());
+ if(bSecure)SetCloseAndDelete();
+ }
+ else
+ {
+ Field *fields = result->Fetch();
+
+ //szPass=fields[0].GetString();
+
+ ///- if gmlevel is too low, deny access
+ if(fields[0].GetUInt32()<iMinLevel)
+ {
+ Sendf("-Not enough privileges.\r\n");
+ sLog.outRALog("User %s has no privilege.\n",szLogin.c_str());
+ if(bSecure)SetCloseAndDelete();
+ } else
+ {
+ stage=LG;
+ }
+ delete result;
+ }
+ }
+ break;
+ ///<li> If the input is 'PASS <password>' (and the user already gave his username)
+ case LG:
+ if(!memcmp(buff,"PASS ",5)) //got "PASS" cmd
+ { //login+pass ok
+ ///- If password is correct, increment the number of active administrators
+ std::string login = szLogin;
+ std::string pw = &buff[5];
+
+ AccountMgr::normilizeString(login);
+ AccountMgr::normilizeString(pw);
+ LoginDatabase.escape_string(login);
+ LoginDatabase.escape_string(pw);
+
+ QueryResult *check = LoginDatabase.PQuery(
+ "SELECT 1 FROM account WHERE username = '%s' AND sha_pass_hash=SHA1(CONCAT(username,':','%s'))",
+ login.c_str(), pw.c_str());
+
+ if(check)
+ {
+ delete check;
+ r=GetSocket();
+ stage=OK;
+ ++iUsers;
+
+ Sendf("+Logged in.\r\n");
+ sLog.outRALog("User %s has logged in.\n",szLogin.c_str());
+ Sendf("TC>");
+ }
+ else
+ {
+ ///- Else deny access
+ Sendf("-Wrong pass.\r\n");
+ sLog.outRALog("User %s has failed to log in.\n",szLogin.c_str());
+ if(bSecure)SetCloseAndDelete();
+ }
+ }
+ break;
+ ///<li> If user is logged, parse and execute the command
+ case OK:
+ if(strlen(buff))
+ {
+ sLog.outRALog("Got '%s' cmd.\n",buff);
+ sWorld.QueueCliCommand(&RASocket::zprint , buff);
+ }
+ else
+ Sendf("TC>");
+ break;
+ ///</ul>
+ };
+
+ }
+}
+
+/// Output function
+void RASocket::zprint( const char * szText )
+{
+ if( !szText )
+ return;
+
+ #ifdef RA_CRYPT
+
+ char *megabuffer=strdup(szText);
+ unsigned int sz=strlen(megabuffer);
+ Encrypt(megabuffer,sz);
+ send(r,megabuffer,sz,0);
+ delete [] megabuffer;
+
+ #else
+
+ unsigned int sz=strlen(szText);
+ send(r,szText,sz,0);
+
+ #endif
+}
diff --git a/src/mangosd/RASocket.h b/src/mangosd/RASocket.h
new file mode 100644
index 00000000000..8900e689b2c
--- /dev/null
+++ b/src/mangosd/RASocket.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup Trinityd
+/// @{
+/// \file
+
+#ifndef _RASOCKET_H
+#define _RASOCKET_H
+
+#include "Common.h"
+#include "sockets/TcpSocket.h"
+
+#define RA_BUFF_SIZE 1024
+
+class ISocketHandler;
+
+/// Remote Administration socket
+class RASocket: public TcpSocket
+{
+ public:
+
+ RASocket(ISocketHandler& h);
+ ~RASocket();
+
+ void OnAccept();
+ void OnRead();
+
+ private:
+
+ char * buff;
+ std::string szLogin;
+ uint32 iSess;
+ unsigned int iInputLength;
+ bool bLog;
+ bool bSecure; //kick on wrong pass, non exist. user, user with no priv
+ //will protect from DOS, bruteforce attacks
+ //some 'smart' protection must be added for more security
+ uint8 iMinLevel;
+ enum
+ {
+ NONE, //initial value
+ LG, //only login was entered
+ OK, //both login and pass were given, and they are correct and user have enough priv.
+ }stage;
+
+ static void zprint( const char * szText );
+};
+#endif
+/// @}
diff --git a/src/trinitycore/TrinityCore.ico b/src/mangosd/TrinityCore.ico
index 6f0a5721957..6f0a5721957 100644
--- a/src/trinitycore/TrinityCore.ico
+++ b/src/mangosd/TrinityCore.ico
Binary files differ
diff --git a/src/mangosd/WorldRunnable.cpp b/src/mangosd/WorldRunnable.cpp
new file mode 100644
index 00000000000..0fb24577e32
--- /dev/null
+++ b/src/mangosd/WorldRunnable.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \file
+ \ingroup Trinityd
+*/
+
+#include "WorldSocketMgr.h"
+#include "Common.h"
+#include "World.h"
+#include "WorldRunnable.h"
+#include "Timer.h"
+#include "ObjectAccessor.h"
+#include "MapManager.h"
+#include "BattleGroundMgr.h"
+
+#include "Database/DatabaseEnv.h"
+
+#ifdef WIN32
+#define WORLD_SLEEP_CONST 50
+#else
+#define WORLD_SLEEP_CONST 100 //Is this still needed?? [On linux some time ago not working 50ms]
+#endif
+
+#ifdef WIN32
+#include "ServiceWin32.h"
+extern int m_ServiceStatus;
+#endif
+
+/// Heartbeat for the World
+void WorldRunnable::run()
+{
+ ///- Init new SQL thread for the world database
+ WorldDatabase.ThreadStart(); // let thread do safe mySQL requests (one connection call enough)
+ sWorld.InitResultQueue();
+
+ uint32 realCurrTime = 0;
+ uint32 realPrevTime = getMSTime();
+
+ uint32 prevSleepTime = 0; // used for balanced full tick time length near WORLD_SLEEP_CONST
+
+ ///- While we have not World::m_stopEvent, update the world
+ while (!World::IsStopped())
+ {
+ ++World::m_worldLoopCounter;
+ realCurrTime = getMSTime();
+
+ uint32 diff = getMSTimeDiff(realPrevTime,realCurrTime);
+
+ sWorld.Update( diff );
+ realPrevTime = realCurrTime;
+
+ // diff (D0) include time of previous sleep (d0) + tick time (t0)
+ // we want that next d1 + t1 == WORLD_SLEEP_CONST
+ // we can't know next t1 and then can use (t0 + d1) == WORLD_SLEEP_CONST requirement
+ // d1 = WORLD_SLEEP_CONST - t0 = WORLD_SLEEP_CONST - (D0 - d0) = WORLD_SLEEP_CONST + d0 - D0
+ if (diff <= WORLD_SLEEP_CONST+prevSleepTime)
+ {
+ prevSleepTime = WORLD_SLEEP_CONST+prevSleepTime-diff;
+ ZThread::Thread::sleep(prevSleepTime);
+ }
+ else
+ prevSleepTime = 0;
+
+ #ifdef WIN32
+ if (m_ServiceStatus == 0) World::StopNow(SHUTDOWN_EXIT_CODE);
+ while (m_ServiceStatus == 2) Sleep(1000);
+ #endif
+ }
+
+ sWorld.KickAll(); // save and kick all players
+ sWorld.UpdateSessions( 1 ); // real players unload required UpdateSessions call
+
+ // unload battleground templates before different singletons destroyed
+ sBattleGroundMgr.DeleteAlllBattleGrounds();
+
+ sWorldSocketMgr->StopNetwork();
+
+ MapManager::Instance().UnloadAll(); // unload all grids (including locked in memory)
+
+ ///- End the database thread
+ WorldDatabase.ThreadEnd(); // free mySQL thread resources
+}
diff --git a/src/mangosd/WorldRunnable.h b/src/mangosd/WorldRunnable.h
new file mode 100644
index 00000000000..b967d0dac0b
--- /dev/null
+++ b/src/mangosd/WorldRunnable.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup Trinityd
+/// @{
+/// \file
+
+#ifndef __WORLDRUNNABLE_H
+#define __WORLDRUNNABLE_H
+
+/// Heartbeat thread for the World
+class WorldRunnable : public ZThread::Runnable
+{
+ public:
+ void run();
+};
+#endif
+/// @}
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
new file mode 100644
index 00000000000..516a6bc2a62
--- /dev/null
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -0,0 +1,1448 @@
+##########################################
+# Trinity Core worldd configuration file #
+##########################################
+ConfVersion=2008080101
+
+###################################################################################################################
+# CONNECTIONS AND DIRECTORIES
+#
+# RealmID
+# RealmID must match the realmlist inside the realmd database
+#
+# DataDir
+# Data directory setting.
+# Important: DataDir needs to be quoted, as it is a string which may contain space characters.
+# Example: "@prefix@/share/trinitycore"
+#
+# LogsDir
+# Logs directory setting.
+# Important: Logs dir must exists, or all logs need to be disabled
+# Default: "" - no log directory prefix, if used log names isn't absolute path
+# then logs will be stored in current directory for run program.
+#
+#
+# LoginDatabaseInfo
+# WorldDatabaseInfo
+# CharacterDatabaseInfo
+# Database connection settings for the world server.
+# Default: hostname;port;username;password;database
+# .;somenumber;username;password;database - use named pipes at Windows
+# Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini
+# .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux
+# Unix sockets: experimental, not tested
+#
+# MaxPingTime
+# Settings for maximum database-ping interval (minutes between pings)
+#
+# WorldServerPort
+# Default WorldServerPort
+#
+# BindIP
+# Bind World Server to IP/hostname
+#
+###################################################################################################################
+
+RealmID = 1
+DataDir = "."
+LogsDir = ""
+LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;realmd"
+WorldDatabaseInfo = "127.0.0.1;3306;trinity;trinity;world"
+CharacterDatabaseInfo = "127.0.0.1;3306;trinity;trinity;characters"
+MaxPingTime = 30
+WorldServerPort = 8085
+BindIP = "0.0.0.0"
+
+###################################################################################################################
+# SCRIPTING SETTINGS
+#
+# Locale
+# Setting for current (DBC) locale to use
+#
+# EventAI Error reporting
+# 0 - Only startup (Default)
+# 1 - Startup errors and Runtime event errors
+# 2 - Startup errors, Runtime event errors, and Creation errors
+###################################################################################################################
+
+Locale = 0
+EAIErrorLevel = 2
+
+###################################################################################################################
+# PERFORMANCE SETINGS
+#
+# UseProcessors
+# Used processors mask for multi-processors system (Used only at Windows)
+# Default: 0 (selected by OS)
+# number (bitmask value of selected processors)
+#
+# ProcessPriority
+# Process priority setting (Used only at Windows)
+# Default: 1 (HIGH)
+# 0 (Normal)
+#
+# Compression
+# Compression level for update packages sent to client (1..9)
+# Default: 1 (speed)
+# 9 (best compression)
+#
+# PlayerLimit
+# Maximum number of players in the world. Excluding Mods, GM's and Admins
+# Default: 100
+# 0 (for infinite players)
+# -1 (for Mods, GM's and Admins only)
+# -2 (for GM's and Admins only)
+# -3 (for Admins only)
+#
+# SaveRespawnTimeImmediately
+# Save respawn time for creatures at death and for gameobjects at use/open
+# Default: 1 (save creature/gameobject respawn time without waiting grid unload)
+# 0 (save creature/gameobject respawn time at grid unload)
+#
+# MaxOverspeedPings
+# Maximum overspeed ping count before player kick (minimum is 2, 0 used for disable check)
+# Default: 2
+#
+# GridUnload
+# Unload grids (if you have lot memory you can disable it to speed up player move to new grids second time)
+# Default: 1 (unload grids)
+# 0 (do not unload grids)
+#
+# SocketSelectTime
+# Socket select time (in milliseconds)
+# Default: 10000
+#
+# GridCleanUpDelay
+# Grid clean up delay (in milliseconds)
+# Default: 300000 (5 min)
+#
+# MapUpdateInterval
+# Map update interval (in milliseconds)
+# Default: 100
+#
+# ChangeWeatherInterval
+# Weather update interval (in milliseconds)
+# Default: 600000 (10 min)
+#
+# PlayerSaveInterval
+# Player save interval (in milliseconds)
+# Default: 900000 (15 min)
+#
+# vmap.enableLOS
+# vmap.enableHeight
+# Enable/Disable VMmap support for line of sight and height calculation
+# Default: 1 (true)
+# 0 (false)
+#
+# vmap.ignoreMapIds
+# Map id that will be ignored by VMaps
+# List of ids with delimiter ','
+# If more then one id is defined and spaces are included, the string has to be enclosed by "
+# Example: "369,0,1,530"
+#
+# vmap.ignoreSpellIds
+# These spells are ignored for LoS calculation
+# List of ids with delimiter ','
+#
+# DetectPosCollision
+# Check final move position, summon position, etc for visible collision with other objects or
+# wall (wall only if vmaps are enabled)
+# Default: 1 (enable, required more CPU power usage)
+# 0 (disable, less nice position selection but will less CPU power usage)
+#
+# TargetPosRecalculateRange
+# Max distance from movement target point (+moving unit size) and targeted object (+size)
+# after that new target movmeent point calculated. Max: melee attack range (5), min: contact range (0.5)
+# More distance let have better performence, less distance let have more sensitive reaction at target move.
+# Default: 1.5
+#
+# UpdateUptimeInterval
+# Update realm uptime period in minutes (for save data in 'uptime' table). Must be > 0
+# Default: 10 (minutes)
+#
+# MaxCoreStuckTime
+# Periodically check if the process got freezed, if this is the case force crash after the specified
+# amount of seconds. Must be > 0. Recommended > 10 secs if you use this.
+# Default: 0 (Disabled)
+#
+# AddonChannel
+# Permit/disable the use of the addon channel through the server
+# (some client side addons can stop work correctly with disabled addon channel)
+# Default: 1 (permit addon channel)
+# 0 (do not permit addon channel)
+#
+###################################################################################################################
+
+UseProcessors = 0
+ProcessPriority = 1
+Compression = 1
+PlayerLimit = 100
+SaveRespawnTimeImmediately = 1
+MaxOverspeedPings = 2
+GridUnload = 1
+SocketSelectTime = 10000
+GridCleanUpDelay = 300000
+MapUpdateInterval = 100
+ChangeWeatherInterval = 600000
+PlayerSaveInterval = 900000
+vmap.enableLOS = 0
+vmap.enableHeight = 0
+vmap.ignoreMapIds = "369"
+vmap.ignoreSpellIds = "7720"
+DetectPosCollision = 1
+TargetPosRecalculateRange = 1.5
+UpdateUptimeInterval = 10
+MaxCoreStuckTime = 0
+AddonChannel = 1
+
+###################################################################################################################
+# SERVER LOGGING
+#
+# LogSQL
+# Enable logging of GM commands - all SQL code will be written to a log file
+# All commands are written to a file: YYYY-MM-DD_logSQL.sql
+# If a new day starts (00:00:00) then a new file is created - the old file will not be deleted.
+# Default: 1 - Write SQL code to logfile
+# 0 - Do not log
+#
+# PidFile
+# World daemon PID file
+# Default: "" - do not create PID file
+# "./worldd.pid" - create PID file (recommended name)
+#
+# LogLevel
+# Server console level of logging
+# 0 = Minimum; 1 = Basic&Error; 2 = Detail; 3 = Full/Debug
+# Default: 3
+#
+# LogTime
+# Include time in server console output [hh:mm:ss]
+# Default: 0 (no time)
+# 1 (print time)
+#
+# LogFile
+# Logfile name
+# Default: "Server.log"
+# "" - Empty name disable creating log file
+#
+# LogTimestamp
+# Logfile with timestamp of server start in name
+# Default: 0 - no timestamp in name
+# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
+#
+# LogFileLevel
+# Server file level of logging
+# 0 = Minimum; 1 = Error; 2 = Detail; 3 = Full/Debug
+# Default: 0
+#
+# LogFilter_TransportMoves
+# LogFilter_CreatureMoves
+# LogFilter_VisibilityChanges
+# Log filters
+# Default: 1 - not include with any log level
+# 0 - include in log if log level permit
+#
+# WorldLogFile
+# Packet logging file for the worldserver
+# Default: "world.log"
+#
+# DBErrorLogFile
+# Log file of DB errors detected at server run
+# Default: "DBErrors.log"
+#
+# CharLogFile
+# Character operations logfile name
+# Default: "Char.log"
+# "" - Empty name disable creating log file
+#
+# CharLogTimestamp
+# Logfile with timestamp of server start in name
+# Default: 0 - no timestamp in name
+# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
+#
+# CharLogDump
+# Write character dump before deleting in Char.log
+# For restoration, cut character data from log starting from
+# line == START DUMP == to line == END DUMP == (without its) in file and load it using loadpdump command
+# Default: 0 - don't include dumping chars to log
+# 1 - include dumping chars to log
+#
+# GmLogFile
+# Log file of gm commands
+# Default: "gm_commands.log"
+# "" - Empty name for disable
+#
+# GmLogTimestamp
+# GM Logfile with timestamp of server start in name
+# Default: 0 - no timestamp in name
+# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
+#
+# GmLogPerAccount
+# GM Logfiles with GM account id (Note: logs not created if GmLogFile not set)
+# Default: 0 - add gm log data to single log file
+# 1 - add gm log data to account specific log files with name
+# in form Logname_#ID_YYYY-MM-DD_HH-MM-SS.Ext
+# or form Logname_#ID.Ext
+#
+# RaLogFile
+# Log file of RA commands
+# Default: "Ra.log"
+# "" - Empty name for disable
+#
+# LogColors
+# Color for messages (format "normal_color details_color debug_color error_color")
+# Colors: 0 - BLACK, 1 - RED, 2 - GREEN, 3 - BROWN, 4 - BLUE, 5 - MAGENTA, 6 - CYAN, 7 - GREY,
+# 8 - YELLOW, 9 - LRED, 10 - LGREEN, 11 - LBLUE, 12 - LMAGENTA, 13 - LCYAN, 14 - WHITE
+# Default: "" - none colors
+# Example: "13 7 11 9"
+#
+###################################################################################################################
+
+LogSQL = 1
+PidFile = ""
+LogLevel = 1
+LogTime = 0
+LogFile = "Server.log"
+LogTimestamp = 0
+LogFileLevel = 0
+LogFilter_TransportMoves = 1
+LogFilter_CreatureMoves = 1
+LogFilter_VisibilityChanges = 1
+WorldLogFile = ""
+DBErrorLogFile = "db_errors.log"
+CharLogFile = "characters.log"
+CharLogTimestamp = 0
+CharLogDump = 0
+GmLogFile = "gm_commands.log"
+GmLogTimestamp = 0
+GmLogPerAccount = 0
+RaLogFile = "ra_commands.log"
+LogColors = ""
+
+###################################################################################################################
+# SERVER SETTINGS
+#
+# GameType
+# Server realm style
+# 0 = NORMAL;1 = PVP; 4 = NORMAL; 6 = RP; 8 = RPPVP
+# also custom type: 16 FFA_PVP (free for all pvp mode like arena PvP in all zones except rest
+# activated places and sanctuaries)
+#
+# RealmZone
+# Server realm zone (set allowed alphabet in character names/etc). See also Strict*Names options.
+#
+# 1 Development - any language (Default)
+# 2 United States - extended-Latin
+# 3 Oceanic - extended-Latin
+# 4 Latin America - extended-Latin
+# 5 Tournament - basic-Latin at create, any at login
+# 6 Korea - East-Asian
+# 7 Tournament - basic-Latin at create, any at login
+# 8 English - extended-Latin
+# 9 German - extended-Latin
+# 10 French - extended-Latin
+# 11 Spanish - extended-Latin
+# 12 Russian - Cyrillic
+# 13 Tournament - basic-Latin at create, any at login
+# 14 Taiwan - East-Asian
+# 15 Tournament - basic-Latin at create, any at login
+# 16 China - East-Asian
+# 17 CN1 - basic-Latin at create, any at login
+# 18 CN2 - basic-Latin at create, any at login
+# 19 CN3 - basic-Latin at create, any at login
+# 20 CN4 - basic-Latin at create, any at login
+# 21 CN5 - basic-Latin at create, any at login
+# 22 CN6 - basic-Latin at create, any at login
+# 23 CN7 - basic-Latin at create, any at login
+# 24 CN8 - basic-Latin at create, any at login
+# 25 Tournament - basic-Latin at create, any at login
+# 26 Test Server - any language
+# 27 Tournament - basic-Latin at create, any at login
+# 28 QA Server - any language
+# 29 CN9 - basic-Latin at create, any at login
+#
+# Expansion
+# Allow server use content from expansion
+# Default: 2 - check expansion 2 maps existence, and if client support expansion 2 and account have
+# expansion 2 setting then allow visit expansion 2 maps, allow create new class character)
+# 1 - check expansion 1 maps existence, and if client support expansion 1 and account have
+# expansion 1 setting then allow visit expansion 1 maps, allow create new races character)
+# 0 - not check expansion maps existence, not allow wisit its, not allow create new race or new class
+# characters, ignore account expansion setting)
+#
+# DBC.Locale
+# DBC Language Settings
+# 0 = English; 1 = Korean; 2 = French; 3 = German; 4 = Chinese; 5 = Taiwanese; 6 = Spanish; 7 = Spanish Mexico
+# 8 = Russian; 255 = Auto Detect (Default)
+#
+# DeclinedNames
+# Allow russian clients to set and use declined names
+# Default: 0 - do not use declined names, except when the Russian RealmZone is set
+# 1 - use declined names
+#
+# StrictPlayerNames
+# Limit player name to language specific symbols set, not allow create characters, and set rename request and disconnect at not allowed symbols name
+# Default: 0 disable (but limited server timezone dependent client check)
+# 1 basic latin characters (strict)
+# 2 realm zone specific (strict). See RealmZone setting.
+# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
+# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
+# 3 basic latin characters + server timezone specific
+#
+# StrictCharterNames
+# Limit guild/arena team charter names to language specific symbols set, not allow create charters with allowed symbols in name
+# Default: 0 disable
+# 1 basic latin characters (strict)
+# 2 realm zone specific (strict). See RealmZone setting.
+# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
+# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
+# 3 basic latin characters + server timezone specific
+#
+# StrictPetNames
+# Limit pet names to language specific symbols set
+# Default: 0 disable
+# 1 basic latin characters (strict)
+# 2 realm zone specific (strict). See RealmZone setting.
+# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
+# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
+# 3 basic latin characters + server timezone specific
+#
+# CharactersCreatingDisabled
+# Disable characters creating for specific team or any (non-player accounts not affected)
+# Default: 0 - enabled
+# 1 - disabled only for Alliance
+# 2 - disabled only for Horde
+# 3 - disabled for both teams
+#
+# MaxWhoListReturns
+# Set the maximum number of players returned in the /who list and interface.
+# Default: 49 (stable)
+#
+# CharactersPerAccount
+# Limit numbers of characters per account (at all realms).
+# Note: this setting limit character creating at _current_ realm base at characters amount at all realms
+# Default: 50
+# The number must be >= CharactersPerRealm
+#
+# CharactersPerRealm
+# Limit numbers of characters for account at realm
+# Default: 10 (client limitation)
+# The number must be between 1 and 10
+#
+# HeroicCharactersPerRealm
+# Limit numbers of heroic class characters for account at realm
+# Default: 1
+# The number must be between 0 (not allowed) and 10
+#
+# MinLevelForHeroicCharacterCreating
+# Limit creating heroic characters only for account with another character of specific level (ignored for GM accounts)
+# 0 - not require any existed chaarcter
+# 1 - require at least any character existed
+# Default: 55 - default requirement
+#
+#
+# SkipCinematics
+# Disable in-game script movie at first character's login(allows to prevent buggy intro in case of custom start location coordinates)
+# Default: 0 - show intro for each new characrer
+# 1 - show intro only for first character of selected race
+# 2 - disable intro show in all cases
+#
+# MaxPlayerLevel
+# Max level that can be reached by player for experience (in range from 1 to 100).
+# Change not recommended
+# Default: 80
+#
+# StartPlayerLevel
+# Staring level that have character at creating (in range 1 to MaxPlayerLevel)
+# Default: 1
+#
+# StartHeroicPlayerLevel
+# Staring level that have character of heroic class at creating (in range 1 to MaxPlayerLevel)
+# Default: 55
+#
+# StartPlayerMoney
+# Amount of money that new players will start with.
+# If you want to start with silver, use for example 100 (100 copper = 1 silver)
+# Default: 0
+#
+# MaxHonorPoints
+# Max honor points that player can have.
+# Default: 75000
+#
+# StartHonorPoints
+# Amount of honor that new players will start with
+# Default: 0
+#
+# MaxArenaPoints
+# Max arena points that player can have.
+# Default: 5000
+#
+# StartArenaPoints
+# Amount of arena points that new players will start with
+# Default: 0
+#
+# InstantLogout
+# Enable or disable instant logout for security level (0..4) or high (NOT in combat/while dueling/while falling)
+# Default: 1 (Mods/GMs/Admins)
+#
+# DisableWaterBreath
+# Disable/enable waterbreathing for security level (0..4) or high
+# Default: 4 (None)
+#
+# AllFlightPaths
+# Players will start with all flight paths (Note: ALL flight paths, not only player's team)
+# Default: 0 (true)
+# 1 (false)
+#
+# AlwaysMaxSkillForLevel
+# Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc.
+# Default: 0 (false)
+# 1 (true)
+#
+# ActivateWeather
+# Activate weather system
+# Default: 1 (true)
+# 0 (false)
+#
+# Battleground.CastDeserter
+# Cast or not Deserter spell at player who leave battleground in progress
+# Default: 1 (true)
+# 0 (false)
+#
+# Battleground.QueueAnnouncer.Enable
+# Enable queue announcer posting to chat
+# Default: 0 (false)
+# 1 (true)
+#
+# Battleground.QueueAnnouncer.PlayerOnly
+# Enable queue announcer posting to chat
+# Default: 0 (false)
+# 1 (true)
+#
+# Arena.QueueAnnouncer.Enable: Enable queue announcer posting to chat
+# Default: 0 (false)
+# 1 (true)
+#
+# CastUnstuck
+# Allow cast or not Unstuck spell at .start or client Help option use
+# Default: 1 (true)
+# 0 (false)
+#
+# Instance.IgnoreLevel
+# Ignore level requirement to enter instance
+# Default: 0 (false)
+# 1 (true)
+#
+# Instance.IgnoreRaid
+# Ignore raid requirement to enter instance
+# Default: 0 (false)
+# 1 (true)
+#
+# Instance.ResetTimeHour
+# The hour of the day (0-23) when the global instance resets occur.
+# Default: 4
+#
+# Instance.UnloadDelay
+# Unload the instance map from memory after some time if no players are inside.
+# Default: 1800000 (miliseconds, i.e 30 minutes)
+# 0 (instance maps are kept in memory until they are reset)
+#
+# Quests.LowLevelHideDiff
+# Quest level difference to hide for player low level quests:
+# if player_level > quest_level + LowLevelQuestsHideDiff then quest "!" mark not show for quest giver
+# Default: 4
+# -1 (show all available quests marks)
+#
+# Quests.HighLevelHideDiff
+# Quest level difference to hide for player high level quests:
+# if player_level < quest_min_level - HighLevelQuestsHideDiff then quest "!" mark not show for quest giver
+# Default: 7
+# -1 (show all available quests marks)
+#
+# MaxPrimaryTradeSkill
+# Max count that player can learn the primary trade skill.
+# Default: 2
+# Max : 10
+#
+# MinPetitionSigns
+# Min signatures count to creating guild (0..9).
+# Default: 9
+#
+# MaxGroupXPDistance
+# Max distance to creature for group memeber to get XP at creature death.
+# Default: 74
+#
+# MailDeliveryDelay
+# Mail delivery delay time for item sending
+# Default: 3600 sec (1 hour)
+#
+# SkillChance.Prospecting
+# For prospecting skillup impossible by default, but can be allowed as custom setting
+# Default: 0 - no skilups
+# 1 - skilups possible
+#
+# SkillChance.Milling
+# For milling skillup impossible by default, but can be allowed as custom setting
+# Default: 0 - no skilups
+# 1 - skilups possible
+#
+# Event.Announce
+# Default: 0 (false)
+# 1 (true)
+#
+# BeepAtStart
+# Beep at core start finished (mostly work only at Unix/Linux systems)
+# Default: 1 (true)
+# 0 (false)
+#
+# Motd
+# Message of the Day. Displayed at worldlogin for every user ('@' for a newline).
+#
+# Server.LoginInfo
+# Enable/disable sending server info (core version) on login.
+# Default: 0 - disable
+# 1 - enable
+#
+###################################################################################################################
+
+GameType = 1
+RealmZone = 1
+Expansion = 2
+DBC.Locale = 255
+DeclinedNames = 0
+StrictPlayerNames = 0
+StrictCharterNames = 0
+StrictPetNames = 0
+MaxWhoListReturns = 49
+CharactersCreatingDisabled = 0
+CharactersPerAccount = 50
+CharactersPerRealm = 10
+HeroicCharactersPerRealm = 1
+MinLevelForHeroicCharacterCreating = 55
+SkipCinematics = 0
+MaxPlayerLevel = 80
+StartPlayerLevel = 1
+StartHeroicPlayerLevel = 55
+StartPlayerMoney = 0
+MaxHonorPoints = 75000
+StartHonorPoints = 0
+MaxArenaPoints = 5000
+StartArenaPoints = 0
+InstantLogout = 1
+DisableWaterBreath = 4
+AllFlightPaths = 0
+AlwaysMaxSkillForLevel = 0
+ActivateWeather = 1
+Battleground.CastDeserter = 1
+Battleground.QueueAnnouncer.Enable = 0
+Battleground.QueueAnnouncer.PlayerOnly = 0
+Arena.QueueAnnouncer.Enable = 0
+CastUnstuck = 1
+Instance.IgnoreLevel = 0
+Instance.IgnoreRaid = 0
+Instance.ResetTimeHour = 4
+Instance.UnloadDelay = 1800000
+Quests.LowLevelHideDiff = 4
+Quests.HighLevelHideDiff = 7
+MaxPrimaryTradeSkill = 2
+MinPetitionSigns = 9
+MaxGroupXPDistance = 74
+MailDeliveryDelay = 3600
+SkillChance.Prospecting = 0
+SkillChance.Milling = 0
+Event.Announce = 0
+BeepAtStart = 1
+Motd = "Welcome to a Trinity Core server."
+Server.LoginInfo = 0
+
+###################################################################################################################
+# PLAYER INTERACTION
+#
+# AllowTwoSide.Accounts
+# Allow or not accounts to create characters in the 2 teams in any game type.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.Interaction.Chat
+# AllowTwoSide.Interaction.Channel
+# AllowTwoSide.Interaction.Group
+# AllowTwoSide.Interaction.Guild
+# AllowTwoSide.Interaction.Auction
+# AllowTwoSide.Interaction.Mail
+# Allow or not common :chat(say,yell);channel(chat)group(join)guild(join);merge all auction houses for players from
+# different teams, send mail to different team.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.WhoList
+# Allow or not show player from both team in who list.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.AddFriend
+# Allow or not adding friends from other team in friend list.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.Trade
+# Allow or not trading with other team in party.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# TalentsInspecting
+# Allow other players see character talents in inspect dialog (Characters in Gamemaster mode can
+# inspect talents always)
+# Default: 1 (allow)
+# 0 (not allow)
+#
+###################################################################################################################
+
+AllowTwoSide.Accounts = 0
+AllowTwoSide.Interaction.Chat = 0
+AllowTwoSide.Interaction.Channel = 0
+AllowTwoSide.Interaction.Group = 0
+AllowTwoSide.Interaction.Guild = 0
+AllowTwoSide.Interaction.Auction = 0
+AllowTwoSide.Interaction.Mail = 0
+AllowTwoSide.WhoList = 0
+AllowTwoSide.AddFriend = 0
+AllowTwoSide.Trade = 0
+TalentsInspecting = 1
+
+###################################################################################################################
+# CREATURE SETTINGS
+#
+# ThreatRadius
+# Radius for creature to evade after being pulled away from combat start point
+# If ThreatRadius is less than creature aggro radius then aggro radius will be used
+# Default: 60 yards
+#
+# Rate.Creature.Aggro
+# Aggro radius percent or off.
+# Default: 1 - 100%
+# 1.5 - 150%
+# 0 - off (0%)
+#
+# CreatureFamilyAssistanceRadius
+# Creature family assistance radius
+# Default: 10
+# 0 - off
+#
+# CreatureFamilyAssistanceDelay
+# Reaction time for creature assistance call
+# Default: 1500 (1.5s)
+#
+# WorldBossLevelDiff
+# Difference for boss dynamic level with target
+# Default: 3
+#
+# Corpse.Decay.NORMAL
+# Corpse.Decay.RARE
+# Corpse.Decay.ELITE
+# Corpse.Decay.RAREELITE
+# Corpse.Decay.WORLDBOSS
+# Seconds until creature corpse will decay without being looted or skinned.
+# Default: 60, 300, 300, 300, 3600
+#
+# Rate.Corpse.Decay.Looted
+# Controls how long the creature corpse stays after it had been looted, as a multiplier of its Corpse.Decay.* config.
+# Default: 0.5
+#
+# Rate.Creature.Normal.Damage
+# Rate.Creature.Elite.Elite.Damage
+# Rate.Creature.Elite.RAREELITE.Damage
+# Rate.Creature.Elite.WORLDBOSS.Damage
+# Rate.Creature.Elite.RARE.Damage
+# Creature Damage Rates.
+# Examples: 2 - creatures will damage 2x, 1.7 - 1.7x.
+#
+# Rate.Creature.Normal.SpellDamage
+# Rate.Creature.Elite.Elite.SpellDamage
+# Rate.Creature.Elite.RAREELITE.SpellDamage
+# Rate.Creature.Elite.WORLDBOSS.SpellDamag
+# Rate.Creature.Elite.RARE.SpellDamage
+# Creature Spell Damage Rates.
+# Examples: 2 - creatures will damage with spells 2x, 1.7 - 1.7x.
+#
+# Rate.Creature.Normal.HP
+# Rate.Creature.Elite.Elite.HP
+# Rate.Creature.Elite.RAREELITE.HP
+# Rate.Creature.Elite.WORLDBOSS.HP
+# Rate.Creature.Elite.RARE.HP
+# Creature Health Ammount Modifier.
+# Examples: 2 - creatures have 2x health, 1.7 - 1.7x.
+#
+# ListenRange.Say
+# Distance from player to listen text that creature (or other world object) say
+# Default: 25
+#
+# ListenRange.TextEmote
+# Distance from player to listen textemote that creature (or other world object) say
+# Default: 25
+#
+# ListenRange.Yell
+# Distance from player to listen text that creature (or other world object) yell
+# Default: 300
+#
+###################################################################################################################
+
+ThreatRadius = 60
+Rate.Creature.Aggro = 1
+CreatureFamilyAssistanceRadius = 10
+CreatureFamilyAssistanceDelay = 1500
+WorldBossLevelDiff = 3
+Corpse.Decay.NORMAL = 60
+Corpse.Decay.RARE = 300
+Corpse.Decay.ELITE = 300
+Corpse.Decay.RAREELITE = 300
+Corpse.Decay.WORLDBOSS = 3600
+Rate.Corpse.Decay.Looted = 0.5
+Rate.Creature.Normal.Damage = 1
+Rate.Creature.Elite.Elite.Damage = 1
+Rate.Creature.Elite.RAREELITE.Damage = 1
+Rate.Creature.Elite.WORLDBOSS.Damage = 1
+Rate.Creature.Elite.RARE.Damage = 1
+Rate.Creature.Normal.SpellDamage = 1
+Rate.Creature.Elite.Elite.SpellDamage = 1
+Rate.Creature.Elite.RAREELITE.SpellDamage = 1
+Rate.Creature.Elite.WORLDBOSS.SpellDamage = 1
+Rate.Creature.Elite.RARE.SpellDamage = 1
+Rate.Creature.Normal.HP = 1
+Rate.Creature.Elite.Elite.HP = 1
+Rate.Creature.Elite.RAREELITE.HP = 1
+Rate.Creature.Elite.WORLDBOSS.HP = 1
+Rate.Creature.Elite.RARE.HP = 1
+ListenRange.Say = 40
+ListenRange.TextEmote = 40
+ListenRange.Yell = 300
+
+###################################################################################################################
+# CHAT SETTINGS
+#
+# ChatFakeMessagePreventing
+# Chat protection from creating fake messages using a lot spaces (other invisible symbols),
+# not applied to addon language messages, but can prevent working old addons
+# that use normal languages for sending data to another clients.
+# Default: 0 (disible fake messages preventing)
+# 1 (enabled fake messages preventing)
+#
+# ChatFlood.MessageCount
+# Chat anti-flood protection, haste message count to activate protection
+# Default: 10
+# 0 (disible anti-flood protection)
+#
+# ChatFlood.MessageDelay
+# Chat anti-flood protection, minimum message delay to count message
+# Default: 1 (in secs)
+#
+# ChatFlood.MuteTime
+# Chat anti-flood protection, mute time at activation flood protection (not saved)
+# Default: 10 (in secs)
+#
+# Channel.RestrictedLfg
+# Restrict use LookupForGroup channel only registered in LFG tool players
+# Default: 1 (allow join to channel only if active in LFG)
+# 0 (allow join to channel in any time)
+#
+# Channel.SilentlyGMJoin
+# Silently join GM characters (security level > 1) to channels
+# Default: 0 (join announcement in normal way)
+# 1 (GM join without announcement)
+#
+###################################################################################################################
+
+ChatFakeMessagePreventing = 0
+ChatFlood.MessageCount = 10
+ChatFlood.MessageDelay = 1
+ChatFlood.MuteTime = 10
+Channel.RestrictedLfg = 1
+Channel.SilentlyGMJoin = 0
+
+###################################################################################################################
+# GAME MASTER SETTINGS
+#
+# GM.LoginState
+# GM mode at login
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.Visible
+# GM visibility at login
+# Default: 2 (last save state)
+# 0 (invisible)
+# 1 (visible)
+#
+# GM.AcceptTickets
+# Is GM accepting tickets from player by default or not.
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.Chat
+# GM chat mode at login
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.WhisperingTo
+# Is GM accepting whispers from player by default or not.
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.InGMList
+# Is GM showed in GM list (if visible) in non-GM state (.gmoff)
+# Default: 0 (false)
+# 1 (true)
+#
+# GM.InWhoList
+# Is GM showed in who list (if visible).
+# Default: 0 (false)
+# 1 (true)
+#
+# GM.LogTrade
+# Include GM trade and trade slot enchanting operations in GM log if it enable
+# Default: 1 (include)
+# 0 (not include)
+#
+# GM.StartLevel
+# GM starting level (1-100)
+# Default: 1
+#
+# GM.LowerSecurity
+# Disallow a lower security member to interact with a higher one using commands
+# Default: 0 (disable)
+# 1 (enable)
+#
+# GM.AllowAchievementGain
+# If enabled it allows gaining achievements for GM characters
+# Default: 0 (disable)
+# 1 (enable) (default)
+#
+###################################################################################################################
+
+GM.LoginState = 2
+GM.Visible = 2
+GM.AcceptTickets = 2
+GM.Chat = 2
+GM.WhisperingTo = 2
+GM.InGMList = 0
+GM.InWhoList = 0
+GM.LogTrade = 1
+GM.StartLevel = 80
+GM.LowerSecurity = 0
+GM.AllowAchievementGain = 1
+
+###################################################################################################################
+# VISIBILITY AND RADIUSES
+#
+# Visibility.GroupMode
+# Group visibility modes
+# Default: 0 (standard setting: only members from same group can 100% auto detect invisible player)
+# 1 (raid members 100% auto detect invisible player from same raid)
+# 2 (players from same team can 100% auto detect invisible player)
+#
+# Visibility.Distance.Creature
+# Visibility.Distance.Player
+# Visibility distance for different in game object
+# Max limited by active player zone: ~ 166
+# Min limit dependent from objects
+# Default: 66 (cell size)
+# Min limit is max aggro radius (45) * Rate.Creature.Aggro
+#
+# Visibility.Distance.Object
+# Visible distance for gameobject, dynobject, bodies, corpses, bones
+# Min limit is iteraction distance (5)
+#
+# Visibility.Distance.InFlight
+# Visible distance for player in flight
+# Min limit is 0 (not show any objects)
+#
+# Visibility.Distance.Grey.Unit
+# Visibility grey distance for creatures/players (fast changing objects)
+# addition to appropriate object type Visibility.Distance.* use in case visibility removing to
+# object (except corpse around distences) If D is distance and G is grey distance then object
+# make visible if distance to it <= D but make non visible if distance > D+G
+# Default: 1 (yard)
+#
+# Visibility.Distance.Grey.Object
+# Visibility grey distance for dynobjects/gameobjects/corpses/creature bodies
+# Default: 10 (yards)
+#
+#
+###################################################################################################################
+
+Visibility.GroupMode = 0
+Visibility.Distance.Creature = 66
+Visibility.Distance.Player = 66
+Visibility.Distance.Object = 66
+Visibility.Distance.InFlight = 66
+Visibility.Distance.Grey.Unit = 1
+Visibility.Distance.Grey.Object = 10
+
+###################################################################################################################
+# SERVER RATES
+#
+# Rate.Health
+# Rate.Mana
+# Rate.Rage.Income
+# Rate.Rage.Loss
+# Rate.RunicPower.Income
+# Rate.RunicPower.Loss
+# Rate.Focus
+# Rate.Loyalty
+# Health and power regeneration and rage income from damage.
+# Default: 1
+#
+# Rate.Skill.Discovery
+# Skill Discovery Rates
+# Default: 1
+#
+# Rate.Drop.Item.Poor
+# Rate.Drop.Item.Normal
+# Rate.Drop.Item.Uncommon
+# Rate.Drop.Item.Rare
+# Rate.Drop.Item.Epic
+# Rate.Drop.Item.Legendary
+# Rate.Drop.Item.Artifact
+# Rate.Drop.Item.Referenced
+# Rate.Drop.Money
+# Drop rates (items by quality and money)
+# Default: 1
+#
+# Rate.Drop.Money
+# Drop rates
+# Default: 1
+#
+# Rate.XP.Kill
+# Rate.XP.Quest
+# Rate.XP.Explore
+# XP rates
+# Default: 1
+#
+# Rate.XP.PastLevel70
+# XP needed per level past 70 (Rates below 1 not recommended)
+# Default: 1
+#
+# Rate.Rest.InGame
+# Rate.Rest.Offline.InTavernOrCity
+# Rate.Rest.Offline.InWilderness
+# Resting points grow rates (1 - normal, 2 - double rate, 0.5 - half rate, etc) from standard values
+#
+# Rate.Damage.Fall
+# Damage after fall rate. (1 - standard, 2 - double damage, 0.5 - half damage, etc)
+#
+# Rate.Auction.Time
+# Rate.Auction.Deposit
+# Rate.Auction.Cut
+# Auction rates (auction time, deposit get at auction start, auction cut from price at auction end)
+#
+# Rate.Honor
+# Honor gain rate
+#
+# Rate.Mining.Amount
+# Rate.Mining.Next
+# Mining Rates (Mining.Amount changes minimum/maximum usetimes of a deposit,
+# Mining.Next changes chance to have next use of a deposit)
+#
+# Rate.Talent
+# Talent Point rates
+# Default: 1
+#
+# Rate.Reputation.Gain
+# Reputation Gain rate
+# Default: 1
+#
+# Rate.InstanceResetTime
+# Multiplier for the number of days in between global raid/heroic instance resets.
+# Default: 1
+#
+# SkillGain.Crafting
+# SkillGain.Defense
+# SkillGain.Gathering
+# SkillGain.Weapon
+# crafting/defense/gathering/weapon skills gain at skill grow (1,2,...)
+# Default: 1
+#
+# SkillChance.Orange
+# SkillChance.Yellow
+# SkillChance.Green
+# SkillChance.Grey
+# Skill chance values (0..100)
+# Default: 100-75-25-0
+#
+# SkillChance.MiningSteps
+# SkillChance.SkinningSteps
+# For skinning and Mining chance decrease with skill level.
+# Default: 0 - no decrease
+# 75 - in 2 times each 75 skill points
+#
+# DurabilityLossChance.Damage
+# Chance lost one from equiped items durability point at damage apply or receive.
+# Default: 0.5 (100/0.5 = 200) Each 200 damage apply one from 19 possible equipped items
+#
+# DurabilityLossChance.Absorb
+# Chance lost one from armor items durability point at damage absorb.
+# Default: 0.5 (100/0.5 = 200) Each 200 absorbs apply one from 15 possible armor equipped items
+#
+# DurabilityLossChance.Parry
+# Chance lost weapon durability point at parry.
+# Default: 0.05 (100/0.05 = 2000) Each 2000 parry attacks main weapon lost point
+#
+# DurabilityLossChance.Block
+# Chance lost sheild durability point at damage block.
+# Default: 0.05 (100/0.05 = 2000) Each 2000 partly or full blocked attacks shield lost point
+#
+# Death.SicknessLevel
+# Starting Character start gain sickness at spirit resurrection (1 min)
+# Default: 11
+# -10 - character will have full time (10min) sickness at 1 level
+# maxplayerlevel+1 - chaarcter will not have sickess at any level
+#
+# Death.CorpseReclaimDelay.PvP
+# Death.CorpseReclaimDelay.PvE
+# Enabled/disabled increase corpse reclaim delay at often PvP/PvE deaths
+# Default: 1 (enabled)
+# 0 (disabled)
+#
+# Death.Bones.World
+# Death.Bones.BattlegroundOrArena
+# Enabled/disabled creating bones instead corpse at resurrection (in normal zones/instacnes, or battleground/arenas)
+# Default: 1 (enabled)
+# 0 (disabled)
+#
+###################################################################################################################
+
+Rate.Health = 1
+Rate.Mana = 1
+Rate.Rage.Income = 1
+Rate.Rage.Loss = 1
+Rate.RunicPower.Income = 1
+Rate.RunicPower.Loss = 1
+Rate.Focus = 1
+Rate.Loyalty = 1
+Rate.Skill.Discovery = 1
+Rate.Drop.Item.Poor = 1
+Rate.Drop.Item.Normal = 1
+Rate.Drop.Item.Uncommon = 1
+Rate.Drop.Item.Rare = 1
+Rate.Drop.Item.Epic = 1
+Rate.Drop.Item.Legendary = 1
+Rate.Drop.Item.Artifact = 1
+Rate.Drop.Item.Referenced = 1
+Rate.Drop.Money = 1
+Rate.XP.Kill = 1
+Rate.XP.Quest = 1
+Rate.XP.Explore = 1
+Rate.XP.PastLevel70 = 1
+Rate.Rest.InGame = 1
+Rate.Rest.Offline.InTavernOrCity = 1
+Rate.Rest.Offline.InWilderness = 1
+Rate.Damage.Fall = 1
+Rate.Auction.Time = 1
+Rate.Auction.Deposit = 1
+Rate.Auction.Cut = 1
+Rate.Honor = 1
+Rate.Mining.Amount = 1
+Rate.Mining.Next = 1
+Rate.Talent = 1
+Rate.Reputation.Gain = 1
+Rate.InstanceResetTime = 1
+SkillGain.Crafting = 1
+SkillGain.Defense = 1
+SkillGain.Gathering = 1
+SkillGain.Weapon = 1
+SkillChance.Orange = 100
+SkillChance.Yellow = 75
+SkillChance.Green = 25
+SkillChance.Grey = 0
+SkillChance.MiningSteps = 0
+SkillChance.SkinningSteps = 0
+DurabilityLossChance.Damage = 0.5
+DurabilityLossChance.Absorb = 0.5
+DurabilityLossChance.Parry = 0.05
+DurabilityLossChance.Block = 0.05
+Death.SicknessLevel = 11
+Death.CorpseReclaimDelay.PvP = 1
+Death.CorpseReclaimDelay.PvE = 0
+Death.Bones.World = 1
+Death.Bones.BattlegroundOrArena = 1
+
+###################################################################################################################
+#
+# Rated arena matches config
+#
+# MaxRatingDifference: the maximum rating difference between two groups in rated matches
+# Default: 0 (disable, rating difference is discarded)
+#
+# RatingDiscardTimer: after the specified milliseconds has passed,
+# rating information will be discarded when selecting teams for matches
+# also initiates an update by this timer
+# Default: 60000
+#
+# AutoDistributePoints: set if arena points should be distributed automatically, or by GM command
+# Default: 0 (disable) (recommended): use gm command or sql query to distribute the points
+# 1 (enable): arena points are distributed automatically
+#
+# AutoDistributeInterval: how often should the distribution take place
+# if automatic distribution is enabled
+# in days
+# Default: 7 (weekly)
+#
+# ArenaSeason.ID: current area season id show in client
+# Default: 1
+#
+# ArenaSeason.InProgress: current area season state
+# Default: 1 (active)
+# 0 (finished)
+#
+###################################################################################################################
+
+Arena.MaxRatingDifference = 0
+Arena.RatingDiscardTimer = 60000
+Arena.AutoDistributePoints = 0
+Arena.AutoDistributeInterval = 7
+Arena.ArenaSeason.ID = 1
+Arena.ArenaSeason.InProgress = 1
+
+###################################################################################################################
+#
+# Battleground config
+#
+# PrematureFinishTimer: the time to end the bg if there are less than minplayersperteam on one side
+# in milliseconds
+# Default: 300000
+# 0 - disable
+#
+###################################################################################################################
+
+BattleGround.PrematureFinishTimer = 300000
+
+
+###################################################################################################################
+#
+# NETWORK CONFIG
+#
+# Network.Threads
+# Number of threads for network, recommend 1 thread per 1000 connections.
+# Default: 1
+#
+# Network.OutKBuff
+# The size of the output kernel buffer used ( SO_SNDBUF socket option, tcp manual ).
+# Default: -1 (Use system default setting)
+#
+# Network.OutUBuff
+# Userspace buffer for output. This is amount of memory reserved per each connection.
+# Default: 65536
+#
+# Network.TcpNoDelay:
+# TCP Nagle algorithm setting
+# Default: 0 (enable Nagle algorithm, less traffic, more latency)
+# 1 (TCP_NO_DELAY, disable Nagle algorithm, more traffic but less latency)
+#
+###################################################################################################################
+
+Network.Threads = 1
+Network.OutKBuff = -1
+Network.OutUBuff = 65536
+Network.TcpNodelay = 1
+
+###################################################################################################################
+# AUCTION HOUSE BOT SETTINGS
+#
+# AuctionHouseBot.EnableSeller
+# Enable/Disable the part of AHBot that puts items up for auction
+# Default 0 (disabled)
+#
+# AuctionHouseBot.EnableBuyer
+# Enable/Disable the part of AHBot that buys items from players
+# Default 0 (disabled)
+#
+# Auction House Bot character data
+# AuctionHouseBot.Account is the account number (in realmd->account table) of the player you want to run as the auction bot.
+# AuctionHouseBot.GUID is the GUID (in characters->characters table) of the player you want to run as the auction bot.
+# Default: 0 (Auction House Bot disabled)
+#
+# AuctionHouseBot.VendorItems
+# Include items that can be bought from vendors.
+# Default 0
+#
+# AuctionHouseBot.LootItems
+# Include items that can be looted or fished for.
+# Default 1
+#
+# AuctionHouseBot.OtherItems
+# Include misc. items.
+# Default 0
+#
+# AuctionHouseBot.Bonding_types
+# Indicates which bonding types to allow seller to put up for auction
+# No_Bind
+# Default 1
+# Bind_When_Picked_Up
+# Default 0
+# Bind_When_Equipped
+# Default 1
+# Bind_When_Use
+# Default 1
+# Bind_Quest_Item
+# Default 0
+#
+# AuctionHouseBot.ItemsPerCycle
+# Number of Items to Add/Remove from the AH during mass operations
+# Default 200
+#
+# AuctionHouseBot.UseBuyPriceForSeller
+# Should the Seller use BuyPrice or SellPrice to determine Bid Prices
+# Default 0 (use SellPrice)
+#
+# AuctionHouseBot.UseBuyPriceForBuyer
+# Should the Buyer use BuyPrice or SellPrice to determine Bid Prices
+# Default 0 (use SellPrice)
+#
+# All other settings have been moved to sql
+#
+###################################################################################################################
+
+AuctionHouseBot.EnableSeller = 0
+AuctionHouseBot.EnableBuyer = 0
+AuctionHouseBot.Account = 0
+AuctionHouseBot.GUID = 0
+AuctionHouseBot.VendorItems = 0
+AuctionHouseBot.LootItems = 1
+AuctionHouseBot.OtherItems = 0
+AuctionHouseBot.No_Bind = 1
+AuctionHouseBot.Bind_When_Picked_Up = 0
+AuctionHouseBot.Bind_When_Equipped = 1
+AuctionHouseBot.Bind_When_Use = 1
+AuctionHouseBot.Bind_Quest_Item = 0
+AuctionHouseBot.ItemsPerCycle = 200
+AuctionHouseBot.UseBuyPriceForSeller = 0
+AuctionHouseBot.UseBuyPriceForBuyer = 0
+
+###################################################################################################################
+# CONSOLE AND REMOTE ACCESS
+#
+# Console.Enable
+# Enable console
+# Default: 1 - on
+# 0 - off
+#
+# Ra.Enable
+# Enable remote console
+# Default: 0 - off
+# 1 - on
+#
+# Ra.IP
+# Default remote console ip address, use 0.0.0.0 for every address
+#
+# Ra.Port
+# Default remote console port
+#
+# Ra.MinLevel
+# Minimum level that's required to login,3 by default
+#
+# Ra.Secure
+# Kick client on wrong pass
+#
+###################################################################################################################
+
+Console.Enable = 1
+Ra.Enable = 0
+Ra.IP = 0.0.0.0
+Ra.Port = 3443
+Ra.MinLevel = 3
+Ra.Secure = 1
+
+###################################################################################################################
+# CUSTOM SERVER OPTIONS
+#
+# PlayerStart.AllReputation
+# Players will start with most of the high level reputations that are needed for items, mounts etc.
+# If there are any reputation faction you want to be added, just tell me.
+#
+# PlayerStart.AllSpells
+# If enabled, players will start with all their class spells (not talents). Useful for instant 70 servers.
+# You must import playercreateinfo_spell_custom.sql, it's included in the SQL folder.
+# Default: 0 - off
+# 1 - on
+#
+# PlayerStart.MapsExplored
+# Players will start with all maps explored if enabled
+#
+# MusicInBattleground
+# If enabled, "L70ETC - Power of the horde" will be played when BG starts ;)
+#
+# HonorPointsAfterDuel
+# The amount of honor points the duel winner will get after a duel.
+# Default: 0 - disable
+#
+# AlwaysMaxWeaponSkill
+# Players will automatically gain max weapon/defense skill when logging in, leveling up etc.
+#
+# PvPToken.Enable
+# Enable/disable PvP Token System. Players will get a token after slaying another player that gives honor.
+#
+# PvPToken.MapAllowType
+# Where players can receive the pvp token
+# 4 - In all maps
+# 3 - In battlegrounds only
+# 2 - In FFA areas only (gurubashi arena etc)
+# 1 - In battlegrounds AND FFA areas only
+#
+# PvPToken.ItemID
+# The item players will get after killing someone if PvP Token system is enabled.
+# Default: 29434 - Badge of justice
+#
+# PvPToken.ItemCount
+# Modify the item ID count - Default: 1
+#
+# NoResetTalentsCost
+# Enable or disable no cost when reseting talents
+#
+# ForbiddenMaps
+# map ids that users below SEC_GAMEMASTER cannot enter, with delimiter ','
+# Default: ""
+# example: "538,90"
+# Note that it's HIGHLY DISCOURAGED to forbid starting maps (0, 1, 530)!
+#
+# ShowKickInWorld
+# determines wether a message is broadcasted to the entire server when a player gets kicked
+# Default: 0
+# 1 = Enable
+# 0 = Disable
+#
+# RecordUpdateTimeDiffInterval
+# record update time diff to the log file
+# update diff can be used as a criterion of performance
+# diff < 300: good performance
+# diff > 600: bad performance, may be caused by high cpu usage
+# Default: 60000 (diff is written into log every 60000 ms or 1 minute.
+# >0 = Interval
+# 0 = Disable
+#
+# MinRecordUpdateTimeDiff
+# only record update time diff which is greater than this value
+#
+# PlayerStart.String
+# If set to anything else than "", this string will be displayed to players when they login
+# to a newly created character.
+# Default: "" - send no text
+#
+###################################################################################################################
+
+PlayerStart.AllReputation = 0
+PlayerStart.AllSpells = 0
+PlayerStart.MapsExplored = 0
+MusicInBattleground = 0
+HonorPointsAfterDuel = 0
+AlwaysMaxWeaponSkill = 0
+PvPToken.Enable = 0
+PvPToken.MapAllowType = 4
+PvPToken.ItemID = 29434
+PvPToken.ItemCount = 1
+NoResetTalentsCost = 0
+ShowKickInWorld = 0
+RecordUpdateTimeDiffInterval = 60000
+MinRecordUpdateTimeDiff = 10
+PlayerStart.String = ""
diff --git a/src/trinitycore/TrinityCore.rc b/src/mangosd/mangosd.rc
index 4e6510c0407..0acad1e4ba2 100644
--- a/src/trinitycore/TrinityCore.rc
+++ b/src/mangosd/mangosd.rc
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/trinitycore/monitor-mangosd b/src/mangosd/monitor-mangosd
index a740ae5e8fa..a740ae5e8fa 100644
--- a/src/trinitycore/monitor-mangosd
+++ b/src/mangosd/monitor-mangosd
diff --git a/src/mangosd/resource.h b/src/mangosd/resource.h
new file mode 100644
index 00000000000..7e7d8e4b76f
--- /dev/null
+++ b/src/mangosd/resource.h
@@ -0,0 +1,15 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by TrinityCore.rc
+//
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/src/trinitycore/run-mangosd b/src/mangosd/run-mangosd
index f307bd9e1ad..f307bd9e1ad 100644
--- a/src/trinitycore/run-mangosd
+++ b/src/mangosd/run-mangosd
diff --git a/src/realmd/AuthCodes.h b/src/realmd/AuthCodes.h
new file mode 100644
index 00000000000..9a38712af83
--- /dev/null
+++ b/src/realmd/AuthCodes.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \file
+ \ingroup realmd
+*/
+
+#ifndef _AUTHCODES_H
+#define _AUTHCODES_H
+
+enum eAuthResults
+{
+ REALM_AUTH_SUCCESS = 0x00,
+ REALM_AUTH_FAILURE = 0x01, ///< Unable to connect
+ REALM_AUTH_UNKNOWN1 = 0x02, ///< Unable to connect
+ REALM_AUTH_ACCOUNT_BANNED = 0x03, ///< This <game> account has been closed and is no longer available for use. Please go to <site>/banned.html for further information.
+ REALM_AUTH_NO_MATCH = 0x04, ///< The information you have entered is not valid. Please check the spelling of the account name and password. If you need help in retrieving a lost or stolen password, see <site> for more information
+ REALM_AUTH_UNKNOWN2 = 0x05, ///< The information you have entered is not valid. Please check the spelling of the account name and password. If you need help in retrieving a lost or stolen password, see <site> for more information
+ REALM_AUTH_ACCOUNT_IN_USE = 0x06, ///< This account is already logged into <game>. Please check the spelling and try again.
+ REALM_AUTH_PREPAID_TIME_LIMIT = 0x07, ///< You have used up your prepaid time for this account. Please purchase more to continue playing
+ REALM_AUTH_SERVER_FULL = 0x08, ///< Could not log in to <game> at this time. Please try again later.
+ REALM_AUTH_WRONG_BUILD_NUMBER = 0x09, ///< Unable to validate game version. This may be caused by file corruption or interference of another program. Please visit <site> for more information and possible solutions to this issue.
+ REALM_AUTH_UPDATE_CLIENT = 0x0a, ///< Downloading
+ REALM_AUTH_UNKNOWN3 = 0x0b, ///< Unable to connect
+ REALM_AUTH_ACCOUNT_FREEZED = 0x0c, ///< This <game> account has been temporarily suspended. Please go to <site>/banned.html for further information
+ REALM_AUTH_UNKNOWN4 = 0x0d, ///< Unable to connect
+ REALM_AUTH_UNKNOWN5 = 0x0e, ///< Connected.
+ REALM_AUTH_PARENTAL_CONTROL = 0x0f ///< Access to this account has been blocked by parental controls. Your settings may be changed in your account preferences at <site>
+};
+
+enum LoginResult
+{
+ LOGIN_OK = 0x00,
+ LOGIN_FAILED = 0x01,
+ LOGIN_FAILED2 = 0x02,
+ LOGIN_BANNED = 0x03,
+ LOGIN_UNKNOWN_ACCOUNT = 0x04,
+ LOGIN_UNKNOWN_ACCOUNT3 = 0x05,
+ LOGIN_ALREADYONLINE = 0x06,
+ LOGIN_NOTIME = 0x07,
+ LOGIN_DBBUSY = 0x08,
+ LOGIN_BADVERSION = 0x09,
+ LOGIN_DOWNLOAD_FILE = 0x0A,
+ LOGIN_FAILED3 = 0x0B,
+ LOGIN_SUSPENDED = 0x0C,
+ LOGIN_FAILED4 = 0x0D,
+ LOGIN_CONNECTED = 0x0E,
+ LOGIN_PARENTALCONTROL = 0x0F,
+ LOGIN_LOCKED_ENFORCED = 0x10,
+};
+
+// we need to stick to 1 version or half of the stuff will work for someone
+// others will not and opposite
+// will only support WoW, WoW:TBC and WoW:WotLK 3.0.9 client build 9551...
+
+#define EXPECTED_TRINITY_CLIENT_BUILD {9551, 0}
+
+#endif
diff --git a/src/realmd/AuthSocket.cpp b/src/realmd/AuthSocket.cpp
new file mode 100644
index 00000000000..c5c81593737
--- /dev/null
+++ b/src/realmd/AuthSocket.cpp
@@ -0,0 +1,1094 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \file
+ \ingroup realmd
+*/
+
+#include "Common.h"
+#include "Database/DatabaseEnv.h"
+#include "ByteBuffer.h"
+#include "Config/ConfigEnv.h"
+#include "Log.h"
+#include "RealmList.h"
+#include "AuthSocket.h"
+#include "AuthCodes.h"
+#include <openssl/md5.h>
+#include "Auth/Sha1.h"
+//#include "Util.h" -- for commented utf8ToUpperOnlyLatin
+
+extern RealmList m_realmList;
+
+extern DatabaseType LoginDatabase;
+
+#define ChunkSize 2048
+
+enum eAuthCmd
+{
+ //AUTH_NO_CMD = 0xFF,
+ AUTH_LOGON_CHALLENGE = 0x00,
+ AUTH_LOGON_PROOF = 0x01,
+ AUTH_RECONNECT_CHALLENGE = 0x02,
+ AUTH_RECONNECT_PROOF = 0x03,
+ //update srv =4
+ REALM_LIST = 0x10,
+ XFER_INITIATE = 0x30,
+ XFER_DATA = 0x31,
+ XFER_ACCEPT = 0x32,
+ XFER_RESUME = 0x33,
+ XFER_CANCEL = 0x34
+};
+
+enum eStatus
+{
+ STATUS_CONNECTED = 0,
+ STATUS_AUTHED
+};
+
+// GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push,N), also any gcc version not support it at some paltform
+#if defined( __GNUC__ )
+#pragma pack(1)
+#else
+#pragma pack(push,1)
+#endif
+
+typedef struct AUTH_LOGON_CHALLENGE_C
+{
+ uint8 cmd;
+ uint8 error;
+ uint16 size;
+ uint8 gamename[4];
+ uint8 version1;
+ uint8 version2;
+ uint8 version3;
+ uint16 build;
+ uint8 platform[4];
+ uint8 os[4];
+ uint8 country[4];
+ uint32 timezone_bias;
+ uint32 ip;
+ uint8 I_len;
+ uint8 I[1];
+} sAuthLogonChallenge_C;
+
+//typedef sAuthLogonChallenge_C sAuthReconnectChallenge_C;
+/*
+typedef struct
+{
+ uint8 cmd;
+ uint8 error;
+ uint8 unk2;
+ uint8 B[32];
+ uint8 g_len;
+ uint8 g[1];
+ uint8 N_len;
+ uint8 N[32];
+ uint8 s[32];
+ uint8 unk3[16];
+} sAuthLogonChallenge_S;
+*/
+
+typedef struct AUTH_LOGON_PROOF_C
+{
+ uint8 cmd;
+ uint8 A[32];
+ uint8 M1[20];
+ uint8 crc_hash[20];
+ uint8 number_of_keys;
+ uint8 unk; // Added in 1.12.x client branch
+} sAuthLogonProof_C;
+/*
+typedef struct
+{
+ uint16 unk1;
+ uint32 unk2;
+ uint8 unk3[4];
+ uint16 unk4[20];
+} sAuthLogonProofKey_C;
+*/
+typedef struct AUTH_LOGON_PROOF_S
+{
+ uint8 cmd;
+ uint8 error;
+ uint8 M2[20];
+ uint32 unk1;
+ uint32 unk2;
+ uint16 unk3;
+} sAuthLogonProof_S;
+
+typedef struct AUTH_RECONNECT_PROOF_C
+{
+ uint8 cmd;
+ uint8 R1[16];
+ uint8 R2[20];
+ uint8 R3[20];
+ uint8 number_of_keys;
+} sAuthReconnectProof_C;
+
+typedef struct XFER_INIT
+{
+ uint8 cmd; // XFER_INITIATE
+ uint8 fileNameLen; // strlen(fileName);
+ uint8 fileName[5]; // fileName[fileNameLen]
+ uint64 file_size; // file size (bytes)
+ uint8 md5[MD5_DIGEST_LENGTH]; // MD5
+}XFER_INIT;
+
+typedef struct XFER_DATA
+{
+ uint8 opcode;
+ uint16 data_size;
+ uint8 data[ChunkSize];
+}XFER_DATA_STRUCT;
+
+typedef struct AuthHandler
+{
+ eAuthCmd cmd;
+ uint32 status;
+ bool (AuthSocket::*handler)(void);
+}AuthHandler;
+
+// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some paltform
+#if defined( __GNUC__ )
+#pragma pack()
+#else
+#pragma pack(pop)
+#endif
+
+/// Launch a thread to transfer a patch to the client
+class PatcherRunnable: public ZThread::Runnable
+{
+ public:
+ PatcherRunnable(class AuthSocket *);
+ void run();
+
+ private:
+ AuthSocket * mySocket;
+};
+
+typedef struct PATCH_INFO
+{
+ uint8 md5[MD5_DIGEST_LENGTH];
+}PATCH_INFO;
+
+/// Caches MD5 hash of client patches present on the server
+class Patcher
+{
+ public:
+ typedef std::map<std::string, PATCH_INFO*> Patches;
+ ~Patcher();
+ Patcher();
+ Patches::const_iterator begin() const { return _patches.begin(); }
+ Patches::const_iterator end() const { return _patches.end(); }
+ void LoadPatchMD5(char*);
+ bool GetHash(char * pat,uint8 mymd5[16]);
+
+ private:
+ void LoadPatchesInfo();
+ Patches _patches;
+};
+
+const AuthHandler table[] =
+{
+ { AUTH_LOGON_CHALLENGE, STATUS_CONNECTED, &AuthSocket::_HandleLogonChallenge },
+ { AUTH_LOGON_PROOF, STATUS_CONNECTED, &AuthSocket::_HandleLogonProof },
+ { AUTH_RECONNECT_CHALLENGE, STATUS_CONNECTED, &AuthSocket::_HandleReconnectChallenge},
+ { AUTH_RECONNECT_PROOF, STATUS_CONNECTED, &AuthSocket::_HandleReconnectProof },
+ { REALM_LIST, STATUS_AUTHED, &AuthSocket::_HandleRealmList },
+ { XFER_ACCEPT, STATUS_CONNECTED, &AuthSocket::_HandleXferAccept },
+ { XFER_RESUME, STATUS_CONNECTED, &AuthSocket::_HandleXferResume },
+ { XFER_CANCEL, STATUS_CONNECTED, &AuthSocket::_HandleXferCancel }
+};
+
+#define AUTH_TOTAL_COMMANDS sizeof(table)/sizeof(AuthHandler)
+
+///Holds the MD5 hash of client patches present on the server
+Patcher PatchesCache;
+
+/// Constructor - set the N and g values for SRP6
+AuthSocket::AuthSocket(ISocketHandler &h) : TcpSocket(h)
+{
+ N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
+ g.SetDword(7);
+ _authed = false;
+ pPatch = NULL;
+
+ _accountSecurityLevel = SEC_PLAYER;
+}
+
+/// Close patch file descriptor before leaving
+AuthSocket::~AuthSocket()
+{
+ ZThread::Guard<ZThread::Mutex> g(patcherLock);
+ if(pPatch)
+ fclose(pPatch);
+}
+
+/// Accept the connection and set the s random value for SRP6
+void AuthSocket::OnAccept()
+{
+ sLog.outBasic("Accepting connection from '%s:%d'",
+ GetRemoteAddress().c_str(), GetRemotePort());
+
+ s.SetRand(s_BYTE_SIZE * 8);
+}
+
+/// Read the packet from the client
+void AuthSocket::OnRead()
+{
+ ///- Read the packet
+ TcpSocket::OnRead();
+ uint8 _cmd;
+ while (1)
+ {
+ if (!ibuf.GetLength())
+ return;
+
+ ///- Get the command out of it
+ ibuf.SoftRead((char *)&_cmd, 1); // UQ1: No longer exists in new net code ???
+ //ibuf.Read((char *)&_cmd, 1);
+ /*char *command = (char *)malloc(1);
+
+ ibuf.Read(command, 1);
+
+ _cmd = (uint8)command;*/
+ // assert(0);
+ size_t i;
+
+ ///- Circle through known commands and call the correct command handler
+ for (i=0;i<AUTH_TOTAL_COMMANDS; i++)
+ {
+ if ((uint8)table[i].cmd == _cmd &&
+ (table[i].status == STATUS_CONNECTED ||
+ (_authed && table[i].status == STATUS_AUTHED)))
+ {
+ DEBUG_LOG("[Auth] got data for cmd %u ibuf length %u", (uint32)_cmd, ibuf.GetLength());
+
+ if (!(*this.*table[i].handler)())
+ {
+ DEBUG_LOG("Command handler failed for cmd %u ibuf length %u", (uint32)_cmd, ibuf.GetLength());
+ return;
+ }
+ break;
+ }
+ }
+
+ ///- Report unknown commands in the debug log
+ if (i==AUTH_TOTAL_COMMANDS)
+ {
+ DEBUG_LOG("[Auth] got unknown packet %u", (uint32)_cmd);
+ return;
+ }
+ }
+}
+
+/// Make the SRP6 calculation from hash in dB
+void AuthSocket::_SetVSFields(const std::string& rI)
+{
+ BigNumber I;
+ I.SetHexStr(rI.c_str());
+
+ //In case of leading zeroes in the rI hash, restore them
+ uint8 mDigest[SHA_DIGEST_LENGTH];
+ memset(mDigest,0,SHA_DIGEST_LENGTH);
+ if (I.GetNumBytes() <= SHA_DIGEST_LENGTH)
+ memcpy(mDigest,I.AsByteArray(),I.GetNumBytes());
+
+ std::reverse(mDigest,mDigest+SHA_DIGEST_LENGTH);
+
+ Sha1Hash sha;
+ sha.UpdateData(s.AsByteArray(), s.GetNumBytes());
+ sha.UpdateData(mDigest, SHA_DIGEST_LENGTH);
+ sha.Finalize();
+ BigNumber x;
+ x.SetBinary(sha.GetDigest(), sha.GetLength());
+ v = g.ModExp(x, N);
+ // No SQL injection (username escaped)
+ const char *v_hex, *s_hex;
+ v_hex = v.AsHexStr();
+ s_hex = s.AsHexStr();
+ LoginDatabase.PExecute("UPDATE account SET v = '%s', s = '%s' WHERE username = '%s'",v_hex,s_hex, _safelogin.c_str() );
+ OPENSSL_free((void*)v_hex);
+ OPENSSL_free((void*)s_hex);
+}
+
+/// Logon Challenge command handler
+bool AuthSocket::_HandleLogonChallenge()
+{
+ DEBUG_LOG("Entering _HandleLogonChallenge");
+ if (ibuf.GetLength() < sizeof(sAuthLogonChallenge_C))
+ return false;
+
+ ///- Read the first 4 bytes (header) to get the length of the remaining of the packet
+ std::vector<uint8> buf;
+ buf.resize(4);
+
+ ibuf.Read((char *)&buf[0], 4);
+
+ EndianConvert(*((uint16*)(buf[0])));
+ uint16 remaining = ((sAuthLogonChallenge_C *)&buf[0])->size;
+ DEBUG_LOG("[AuthChallenge] got header, body is %#04x bytes", remaining);
+
+ if ((remaining < sizeof(sAuthLogonChallenge_C) - buf.size()) || (ibuf.GetLength() < remaining))
+ return false;
+
+ //No big fear of memory outage (size is int16, i.e. < 65536)
+ buf.resize(remaining + buf.size() + 1);
+ buf[buf.size() - 1] = 0;
+ sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0];
+
+ // BigEndian code, nop in little endian case
+ // size already converted
+ EndianConvert(*((uint32*)(&ch->gamename[0])));
+ EndianConvert(ch->build);
+ EndianConvert(*((uint32*)(&ch->platform[0])));
+ EndianConvert(*((uint32*)(&ch->os[0])));
+ EndianConvert(*((uint32*)(&ch->country[0])));
+ EndianConvert(ch->timezone_bias);
+ EndianConvert(ch->ip);
+
+ ///- Read the remaining of the packet
+ ibuf.Read((char *)&buf[4], remaining);
+ DEBUG_LOG("[AuthChallenge] got full packet, %#04x bytes", ch->size);
+ DEBUG_LOG("[AuthChallenge] name(%d): '%s'", ch->I_len, ch->I);
+
+ ByteBuffer pkt;
+
+ _login = (const char*)ch->I;
+ _build = ch->build;
+
+ ///- Normalize account name
+ //utf8ToUpperOnlyLatin(_login); -- client already send account in expected form
+
+ //Escape the user login to avoid further SQL injection
+ //Memory will be freed on AuthSocket object destruction
+ _safelogin=_login;
+ LoginDatabase.escape_string(_safelogin);
+
+ pkt << (uint8) AUTH_LOGON_CHALLENGE;
+ pkt << (uint8) 0x00;
+
+ ///- Verify that this IP is not in the ip_banned table
+ // No SQL injection possible (paste the IP address as passed by the socket)
+ LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+ std::string address = GetRemoteAddress();
+ LoginDatabase.escape_string(address);
+ QueryResult *result = LoginDatabase.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str());
+ if(result)
+ {
+ pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED;
+ sLog.outBasic("[AuthChallenge] Banned ip %s tries to login!",GetRemoteAddress().c_str ());
+ delete result;
+ }
+ else
+ {
+ ///- Get the account details from the account table
+ // No SQL injection (escaped user name)
+
+ result = LoginDatabase.PQuery("SELECT sha_pass_hash,id,locked,last_ip,gmlevel FROM account WHERE username = '%s'",_safelogin.c_str ());
+ if( result )
+ {
+ ///- If the IP is 'locked', check that the player comes indeed from the correct IP address
+ bool locked = false;
+ if((*result)[2].GetUInt8() == 1) // if ip is locked
+ {
+ DEBUG_LOG("[AuthChallenge] Account '%s' is locked to IP - '%s'", _login.c_str(), (*result)[3].GetString());
+ DEBUG_LOG("[AuthChallenge] Player address is '%s'", GetRemoteAddress().c_str());
+ if ( strcmp((*result)[3].GetString(),GetRemoteAddress().c_str()) )
+ {
+ DEBUG_LOG("[AuthChallenge] Account IP differs");
+ pkt << (uint8) REALM_AUTH_ACCOUNT_FREEZED;
+ locked=true;
+ }
+ else
+ {
+ DEBUG_LOG("[AuthChallenge] Account IP matches");
+ }
+ }
+ else
+ {
+ DEBUG_LOG("[AuthChallenge] Account '%s' is not locked to ip", _login.c_str());
+ }
+
+ if (!locked)
+ {
+ //set expired bans to inactive
+ LoginDatabase.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+ ///- If the account is banned, reject the logon attempt
+ QueryResult *banresult = LoginDatabase.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32());
+ if(banresult)
+ {
+ if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64())
+ {
+ pkt << (uint8) REALM_AUTH_ACCOUNT_BANNED;
+ sLog.outBasic("[AuthChallenge] Banned account %s tries to login!",_login.c_str ());
+ }
+ else
+ {
+ pkt << (uint8) REALM_AUTH_ACCOUNT_FREEZED;
+ sLog.outBasic("[AuthChallenge] Temporarily banned account %s tries to login!",_login.c_str ());
+ }
+
+ delete banresult;
+ }
+ else
+ {
+ ///- Get the password from the account table, upper it, and make the SRP6 calculation
+ std::string rI = (*result)[0].GetCppString();
+ _SetVSFields(rI);
+
+ b.SetRand(19 * 8);
+ BigNumber gmod=g.ModExp(b, N);
+ B = ((v * 3) + gmod) % N;
+
+ ASSERT(gmod.GetNumBytes() <= 32);
+
+ BigNumber unk3;
+ unk3.SetRand(16*8);
+
+ ///- Fill the response packet with the result
+ pkt << (uint8)REALM_AUTH_SUCCESS;
+
+ // B may be calculated < 32B so we force minnimal length to 32B
+ pkt.append(B.AsByteArray(32), 32); // 32 bytes
+ pkt << (uint8)1;
+ pkt.append(g.AsByteArray(), 1);
+ pkt << (uint8)32;
+ pkt.append(N.AsByteArray(), 32);
+ pkt.append(s.AsByteArray(), s.GetNumBytes()); // 32 bytes
+ pkt.append(unk3.AsByteArray(), 16);
+ pkt << (uint8)0; // Added in 1.12.x client branch
+
+ uint8 secLevel = (*result)[4].GetUInt8();
+ _accountSecurityLevel = secLevel <= SEC_ADMINISTRATOR ? AccountTypes(secLevel) : SEC_ADMINISTRATOR;
+
+ _localizationName.resize(4);
+ for(int i = 0; i <4; ++i)
+ _localizationName[i] = ch->country[4-i-1];
+
+ sLog.outBasic("[AuthChallenge] account %s is using '%c%c%c%c' locale (%u)", _login.c_str (), ch->country[3],ch->country[2],ch->country[1],ch->country[0], GetLocaleByName(_localizationName));
+ }
+ }
+ delete result;
+ }
+ else //no account
+ {
+ pkt<< (uint8) REALM_AUTH_NO_MATCH;
+ }
+ }
+ SendBuf((char const*)pkt.contents(), pkt.size());
+ return true;
+}
+
+/// Logon Proof command handler
+bool AuthSocket::_HandleLogonProof()
+{
+ DEBUG_LOG("Entering _HandleLogonProof");
+ ///- Read the packet
+ if (ibuf.GetLength() < sizeof(sAuthLogonProof_C))
+ return false;
+ sAuthLogonProof_C lp;
+ ibuf.Read((char *)&lp, sizeof(sAuthLogonProof_C));
+
+ ///- Check if the client has one of the expected version numbers
+ bool valid_version=false;
+ int accepted_versions[]=EXPECTED_TRINITY_CLIENT_BUILD;
+ for(int i=0;accepted_versions[i];i++)
+ {
+ if(_build==accepted_versions[i])
+ {
+ valid_version=true;
+ break;
+ }
+ }
+
+ /// <ul><li> If the client has no valid version
+ if(!valid_version)
+ {
+ ///- Check if we have the apropriate patch on the disk
+
+ // 24 = len("./patches/65535enGB.mpq")+1
+ char tmp[24];
+ // No buffer overflow (fixed length of arguments)
+ sprintf(tmp,"./patches/%d%s.mpq",_build, _localizationName.c_str());
+ // This will be closed at the destruction of the AuthSocket (client deconnection)
+ FILE *pFile=fopen(tmp,"rb");
+
+ if(!pFile)
+ {
+ ByteBuffer pkt;
+ pkt << (uint8) AUTH_LOGON_CHALLENGE;
+ pkt << (uint8) 0x00;
+ pkt << (uint8) REALM_AUTH_WRONG_BUILD_NUMBER;
+ DEBUG_LOG("[AuthChallenge] %u is not a valid client version!", _build);
+ DEBUG_LOG("[AuthChallenge] Patch %s not found",tmp);
+ SendBuf((char const*)pkt.contents(), pkt.size());
+ return true;
+ }
+ else // have patch
+ {
+ pPatch=pFile;
+ XFER_INIT xferh;
+
+ ///- Get the MD5 hash of the patch file (get it from preloaded Patcher cache or calculate it)
+ if(PatchesCache.GetHash(tmp,(uint8*)&xferh.md5))
+ {
+ DEBUG_LOG("\n[AuthChallenge] Found precached patch info for patch %s",tmp);
+ }
+ else
+ { //calculate patch md5
+ printf("\n[AuthChallenge] Patch info for %s was not cached.",tmp);
+ PatchesCache.LoadPatchMD5(tmp);
+ PatchesCache.GetHash(tmp,(uint8*)&xferh.md5);
+ }
+
+ ///- Send a packet to the client with the file length and MD5 hash
+ uint8 data[2]={AUTH_LOGON_PROOF,REALM_AUTH_UPDATE_CLIENT};
+ SendBuf((const char*)data,sizeof(data));
+
+ memcpy(&xferh,"0\x05Patch",7);
+ xferh.cmd=XFER_INITIATE;
+ fseek(pPatch,0,SEEK_END);
+ xferh.file_size=ftell(pPatch);
+
+ SendBuf((const char*)&xferh,sizeof(xferh));
+ return true;
+ }
+ }
+ /// </ul>
+
+ ///- Continue the SRP6 calculation based on data received from the client
+ BigNumber A;
+ A.SetBinary(lp.A, 32);
+
+ Sha1Hash sha;
+ sha.UpdateBigNumbers(&A, &B, NULL);
+ sha.Finalize();
+ BigNumber u;
+ u.SetBinary(sha.GetDigest(), 20);
+ BigNumber S = (A * (v.ModExp(u, N))).ModExp(b, N);
+
+ uint8 t[32];
+ uint8 t1[16];
+ uint8 vK[40];
+ memcpy(t, S.AsByteArray(), 32);
+ for (int i = 0; i < 16; i++)
+ {
+ t1[i] = t[i*2];
+ }
+ sha.Initialize();
+ sha.UpdateData(t1, 16);
+ sha.Finalize();
+ for (int i = 0; i < 20; i++)
+ {
+ vK[i*2] = sha.GetDigest()[i];
+ }
+ for (int i = 0; i < 16; i++)
+ {
+ t1[i] = t[i*2+1];
+ }
+ sha.Initialize();
+ sha.UpdateData(t1, 16);
+ sha.Finalize();
+ for (int i = 0; i < 20; i++)
+ {
+ vK[i*2+1] = sha.GetDigest()[i];
+ }
+ K.SetBinary(vK, 40);
+
+ uint8 hash[20];
+
+ sha.Initialize();
+ sha.UpdateBigNumbers(&N, NULL);
+ sha.Finalize();
+ memcpy(hash, sha.GetDigest(), 20);
+ sha.Initialize();
+ sha.UpdateBigNumbers(&g, NULL);
+ sha.Finalize();
+ for (int i = 0; i < 20; i++)
+ {
+ hash[i] ^= sha.GetDigest()[i];
+ }
+ BigNumber t3;
+ t3.SetBinary(hash, 20);
+
+ sha.Initialize();
+ sha.UpdateData(_login);
+ sha.Finalize();
+ uint8 t4[SHA_DIGEST_LENGTH];
+ memcpy(t4, sha.GetDigest(), SHA_DIGEST_LENGTH);
+
+ sha.Initialize();
+ sha.UpdateBigNumbers(&t3, NULL);
+ sha.UpdateData(t4, SHA_DIGEST_LENGTH);
+ sha.UpdateBigNumbers(&s, &A, &B, &K, NULL);
+ sha.Finalize();
+ BigNumber M;
+ M.SetBinary(sha.GetDigest(), 20);
+
+ ///- Check if SRP6 results match (password is correct), else send an error
+ if (!memcmp(M.AsByteArray(), lp.M1, 20))
+ {
+ sLog.outBasic("User '%s' successfully authenticated", _login.c_str());
+
+ ///- Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account
+ // No SQL injection (escaped user name) and IP address as received by socket
+ const char* K_hex = K.AsHexStr();
+ LoginDatabase.PExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = '%u', failed_logins = 0 WHERE username = '%s'", K_hex, GetRemoteAddress().c_str(), GetLocaleByName(_localizationName), _safelogin.c_str() );
+ OPENSSL_free((void*)K_hex);
+
+ ///- Finish SRP6 and send the final result to the client
+ sha.Initialize();
+ sha.UpdateBigNumbers(&A, &M, &K, NULL);
+ sha.Finalize();
+
+ sAuthLogonProof_S proof;
+ memcpy(proof.M2, sha.GetDigest(), 20);
+ proof.cmd = AUTH_LOGON_PROOF;
+ proof.error = 0;
+ proof.unk1 = 0x00800000;
+ proof.unk2 = 0x00;
+ proof.unk3 = 0x00;
+
+ SendBuf((char *)&proof, sizeof(proof));
+
+ ///- Set _authed to true!
+ _authed = true;
+ }
+ else
+ {
+ char data[4]={AUTH_LOGON_PROOF,REALM_AUTH_NO_MATCH,3,0};
+ SendBuf(data,sizeof(data));
+ sLog.outBasic("[AuthChallenge] account %s tried to login with wrong password!",_login.c_str ());
+
+ uint32 MaxWrongPassCount = sConfig.GetIntDefault("WrongPass.MaxCount", 0);
+ if(MaxWrongPassCount > 0)
+ {
+ //Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP
+ LoginDatabase.PExecute("UPDATE account SET failed_logins = failed_logins + 1 WHERE username = '%s'",_safelogin.c_str());
+
+ if(QueryResult *loginfail = LoginDatabase.PQuery("SELECT id, failed_logins FROM account WHERE username = '%s'", _safelogin.c_str()))
+ {
+ Field* fields = loginfail->Fetch();
+ uint32 failed_logins = fields[1].GetUInt32();
+
+ if( failed_logins >= MaxWrongPassCount )
+ {
+ uint32 WrongPassBanTime = sConfig.GetIntDefault("WrongPass.BanTime", 600);
+ bool WrongPassBanType = sConfig.GetBoolDefault("WrongPass.BanType", false);
+
+ if(WrongPassBanType)
+ {
+ uint32 acc_id = fields[0].GetUInt32();
+ LoginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','Trinity realmd','Failed login autoban',1)",
+ acc_id, WrongPassBanTime);
+ sLog.outBasic("[AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times",
+ _login.c_str(), WrongPassBanTime, failed_logins);
+ }
+ else
+ {
+ std::string current_ip = GetRemoteAddress();
+ LoginDatabase.escape_string(current_ip);
+ LoginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','Trinity realmd','Failed login autoban')",
+ current_ip.c_str(), WrongPassBanTime);
+ sLog.outBasic("[AuthChallenge] IP %s got banned for '%u' seconds because account %s failed to authenticate '%u' times",
+ current_ip.c_str(), WrongPassBanTime, _login.c_str(), failed_logins);
+ }
+ }
+ delete loginfail;
+ }
+ }
+ }
+ return true;
+}
+
+/// Reconnect Challenge command handler
+bool AuthSocket::_HandleReconnectChallenge()
+{
+ DEBUG_LOG("Entering _HandleReconnectChallenge");
+ if (ibuf.GetLength() < sizeof(sAuthLogonChallenge_C))
+ return false;
+
+ ///- Read the first 4 bytes (header) to get the length of the remaining of the packet
+ std::vector<uint8> buf;
+ buf.resize(4);
+
+ ibuf.Read((char *)&buf[0], 4);
+
+ EndianConvert(*((uint16*)(buf[0])));
+ uint16 remaining = ((sAuthLogonChallenge_C *)&buf[0])->size;
+ DEBUG_LOG("[ReconnectChallenge] got header, body is %#04x bytes", remaining);
+
+ if ((remaining < sizeof(sAuthLogonChallenge_C) - buf.size()) || (ibuf.GetLength() < remaining))
+ return false;
+
+ //No big fear of memory outage (size is int16, i.e. < 65536)
+ buf.resize(remaining + buf.size() + 1);
+ buf[buf.size() - 1] = 0;
+ sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0];
+
+ ///- Read the remaining of the packet
+ ibuf.Read((char *)&buf[4], remaining);
+ DEBUG_LOG("[ReconnectChallenge] got full packet, %#04x bytes", ch->size);
+ DEBUG_LOG("[ReconnectChallenge] name(%d): '%s'", ch->I_len, ch->I);
+
+ _login = (const char*)ch->I;
+ _safelogin = _login;
+
+ QueryResult *result = LoginDatabase.PQuery ("SELECT sessionkey FROM account WHERE username = '%s'", _safelogin.c_str ());
+
+ // Stop if the account is not found
+ if (!result)
+ {
+ sLog.outError("[ERROR] user %s tried to login and we cannot find his session key in the database.", _login.c_str());
+ SetCloseAndDelete();
+ return false;
+ }
+
+ Field* fields = result->Fetch ();
+ K.SetHexStr (fields[0].GetString ());
+ delete result;
+
+ ///- Sending response
+ ByteBuffer pkt;
+ pkt << (uint8) AUTH_RECONNECT_CHALLENGE;
+ pkt << (uint8) 0x00;
+ _reconnectProof.SetRand(16*8);
+ pkt.append(_reconnectProof.AsByteBuffer()); // 16 bytes random
+ pkt << (uint64) 0x00 << (uint64) 0x00; // 16 bytes zeros
+ SendBuf((char const*)pkt.contents(), pkt.size());
+ return true;
+}
+
+/// Reconnect Proof command handler
+bool AuthSocket::_HandleReconnectProof()
+{
+ DEBUG_LOG("Entering _HandleReconnectProof");
+ ///- Read the packet
+ if (ibuf.GetLength() < sizeof(sAuthReconnectProof_C))
+ return false;
+ if (_login.empty() || !_reconnectProof.GetNumBytes() || !K.GetNumBytes())
+ return false;
+ sAuthReconnectProof_C lp;
+ ibuf.Read((char *)&lp, sizeof(sAuthReconnectProof_C));
+
+ BigNumber t1;
+ t1.SetBinary(lp.R1, 16);
+
+ Sha1Hash sha;
+ sha.Initialize();
+ sha.UpdateData(_login);
+ sha.UpdateBigNumbers(&t1, &_reconnectProof, &K, NULL);
+ sha.Finalize();
+
+ if (!memcmp(sha.GetDigest(), lp.R2, SHA_DIGEST_LENGTH))
+ {
+ ///- Sending response
+ ByteBuffer pkt;
+ pkt << (uint8) AUTH_RECONNECT_PROOF;
+ pkt << (uint8) 0x00;
+ pkt << (uint16) 0x00; // 2 bytes zeros
+ SendBuf((char const*)pkt.contents(), pkt.size());
+
+ ///- Set _authed to true!
+ _authed = true;
+
+ return true;
+ }
+ else
+ {
+ sLog.outError("[ERROR] user %s tried to login, but session invalid.", _login.c_str());
+ SetCloseAndDelete();
+ return false;
+ }
+}
+
+/// %Realm List command handler
+bool AuthSocket::_HandleRealmList()
+{
+ DEBUG_LOG("Entering _HandleRealmList");
+ if (ibuf.GetLength() < 5)
+ return false;
+
+ ibuf.Remove(5);
+
+ ///- Get the user id (else close the connection)
+ // No SQL injection (escaped user name)
+
+ QueryResult *result = LoginDatabase.PQuery("SELECT id,sha_pass_hash FROM account WHERE username = '%s'",_safelogin.c_str());
+ if(!result)
+ {
+ sLog.outError("[ERROR] user %s tried to login and we cannot find him in the database.",_login.c_str());
+ SetCloseAndDelete();
+ return false;
+ }
+
+ uint32 id = (*result)[0].GetUInt32();
+ std::string rI = (*result)[1].GetCppString();
+ delete result;
+
+ ///- Update realm list if need
+ m_realmList.UpdateIfNeed();
+
+ ///- Circle through realms in the RealmList and construct the return packet (including # of user characters in each realm)
+ ByteBuffer pkt;
+ pkt << (uint32) 0;
+ pkt << (uint16) m_realmList.size();
+ RealmList::RealmMap::const_iterator i;
+ for( i = m_realmList.begin(); i != m_realmList.end(); i++ )
+ {
+ uint8 AmountOfCharacters;
+
+ // No SQL injection. id of realm is controlled by the database.
+ result = LoginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id);
+ if( result )
+ {
+ Field *fields = result->Fetch();
+ AmountOfCharacters = fields[0].GetUInt8();
+ delete result;
+ }
+ else
+ AmountOfCharacters = 0;
+
+ uint8 lock = (i->second.allowedSecurityLevel > _accountSecurityLevel) ? 1 : 0;
+
+ pkt << i->second.icon; // realm type
+ pkt << lock; // if 1, then realm locked
+ pkt << i->second.color; // if 2, then realm is offline
+ pkt << i->first;
+ pkt << i->second.address;
+ pkt << i->second.populationLevel;
+ pkt << AmountOfCharacters;
+ pkt << i->second.timezone; // realm category
+ pkt << (uint8) 0x2C; // unk, may be realm number/id?
+ }
+ pkt << (uint8) 0x10;
+ pkt << (uint8) 0x00;
+
+ ByteBuffer hdr;
+ hdr << (uint8) REALM_LIST;
+ hdr << (uint16)pkt.size();
+ hdr.append(pkt);
+
+ SendBuf((char const*)hdr.contents(), hdr.size());
+
+ // Set check field before possible relogin to realm
+ _SetVSFields(rI);
+ return true;
+}
+
+/// Resume patch transfer
+bool AuthSocket::_HandleXferResume()
+{
+ DEBUG_LOG("Entering _HandleXferResume");
+ ///- Check packet length and patch existence
+ if (ibuf.GetLength()<9 || !pPatch)
+ {
+ sLog.outError("Error while resuming patch transfer (wrong packet)");
+ return false;
+ }
+
+ ///- Launch a PatcherRunnable thread starting at given patch file offset
+ uint64 start;
+ ibuf.Remove(1);
+ ibuf.Read((char*)&start,sizeof(start));
+ fseek(pPatch,start,0);
+
+ ZThread::Thread u(new PatcherRunnable(this));
+ return true;
+}
+
+/// Cancel patch transfer
+bool AuthSocket::_HandleXferCancel()
+{
+ DEBUG_LOG("Entering _HandleXferCancel");
+
+ ///- Close and delete the socket
+ ibuf.Remove(1); //clear input buffer
+
+ //ZThread::Thread::sleep(15);
+ SetCloseAndDelete();
+
+ return true;
+}
+
+/// Accept patch transfer
+bool AuthSocket::_HandleXferAccept()
+{
+ DEBUG_LOG("Entering _HandleXferAccept");
+
+ ///- Check packet length and patch existence
+ if (!pPatch)
+ {
+ sLog.outError("Error while accepting patch transfer (wrong packet)");
+ return false;
+ }
+
+ ///- Launch a PatcherRunnable thread, starting at the begining of the patch file
+ ibuf.Remove(1); //clear input buffer
+ fseek(pPatch,0,0);
+
+ ZThread::Thread u(new PatcherRunnable(this));
+
+ return true;
+}
+
+/// Check if there is lag on the connection to the client
+bool AuthSocket::IsLag()
+{
+ return (TCP_BUFSIZE_READ-GetOutputLength()< 2*ChunkSize);
+}
+
+PatcherRunnable::PatcherRunnable(class AuthSocket * as)
+{
+ mySocket=as;
+}
+
+/// Send content of patch file to the client
+void PatcherRunnable::run()
+{
+ ZThread::Guard<ZThread::Mutex> g(mySocket->patcherLock);
+ XFER_DATA_STRUCT xfdata;
+ xfdata.opcode = XFER_DATA;
+
+ while(!feof(mySocket->pPatch) && mySocket->Ready())
+ {
+ ///- Wait until output buffer is reasonably empty
+ while(mySocket->Ready() && mySocket->IsLag())
+ {
+ ZThread::Thread::sleep(1);
+ }
+ ///- And send content of the patch file to the client
+ xfdata.data_size=fread(&xfdata.data,1,ChunkSize,mySocket->pPatch);
+ mySocket->SendBuf((const char*)&xfdata,xfdata.data_size +(sizeof(XFER_DATA_STRUCT)-ChunkSize));
+ }
+}
+
+/// Preload MD5 hashes of existing patch files on server
+#ifndef _WIN32
+#include <dirent.h>
+#include <errno.h>
+void Patcher::LoadPatchesInfo()
+{
+ DIR * dirp;
+ //int errno;
+ struct dirent * dp;
+ dirp = opendir("./patches/");
+ if(!dirp)
+ return;
+ while (dirp)
+ {
+ errno = 0;
+ if ((dp = readdir(dirp)) != NULL)
+ {
+ int l=strlen(dp->d_name);
+ if(l<8)continue;
+ if(!memcmp(&dp->d_name[l-4],".mpq",4))
+ LoadPatchMD5(dp->d_name);
+ }
+ else
+ {
+ if(errno != 0)
+ {
+ closedir(dirp);
+ return;
+ }
+ break;
+ }
+ }
+
+ if(dirp)
+ closedir(dirp);
+}
+
+#else
+void Patcher::LoadPatchesInfo()
+{
+ WIN32_FIND_DATA fil;
+ HANDLE hFil=FindFirstFile("./patches/*.mpq",&fil);
+ if(hFil==INVALID_HANDLE_VALUE)
+ return; //no patches were found
+
+ do
+ {
+ LoadPatchMD5(fil.cFileName);
+ }
+ while(FindNextFile(hFil,&fil));
+}
+#endif
+
+/// Calculate and store MD5 hash for a given patch file
+void Patcher::LoadPatchMD5(char * szFileName)
+{
+ ///- Try to open the patch file
+ std::string path = "./patches/";
+ path += szFileName;
+ FILE * pPatch=fopen(path.c_str(),"rb");
+ sLog.outDebug("Loading patch info from %s\n",path.c_str());
+ if(!pPatch)
+ {
+ sLog.outError("Error loading patch %s\n",path.c_str());
+ return;
+ }
+
+ ///- Calculate the MD5 hash
+ MD5_CTX ctx;
+ MD5_Init(&ctx);
+ uint8* buf = new uint8[512*1024];
+
+ while (!feof(pPatch))
+ {
+ size_t read = fread(buf, 1, 512*1024, pPatch);
+ MD5_Update(&ctx, buf, read);
+ }
+ delete [] buf;
+ fclose(pPatch);
+
+ ///- Store the result in the internal patch hash map
+ _patches[path] = new PATCH_INFO;
+ MD5_Final((uint8 *)&_patches[path]->md5 , &ctx);
+}
+
+/// Get cached MD5 hash for a given patch file
+bool Patcher::GetHash(char * pat,uint8 mymd5[16])
+{
+ for( Patches::iterator i = _patches.begin(); i != _patches.end(); i++ )
+ if(!stricmp(pat,i->first.c_str () ))
+ {
+ memcpy(mymd5,i->second->md5,16);
+ return true;
+ }
+
+ return false;
+}
+
+/// Launch the patch hashing mechanism on object creation
+Patcher::Patcher()
+{
+ LoadPatchesInfo();
+}
+
+/// Empty and delete the patch map on termination
+Patcher::~Patcher()
+{
+ for(Patches::iterator i = _patches.begin(); i != _patches.end(); i++ )
+ delete i->second;
+}
diff --git a/src/realmd/AuthSocket.h b/src/realmd/AuthSocket.h
new file mode 100644
index 00000000000..3cae54c7789
--- /dev/null
+++ b/src/realmd/AuthSocket.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup realmd
+/// @{
+/// \file
+
+#ifndef _AUTHSOCKET_H
+#define _AUTHSOCKET_H
+
+#include "Common.h"
+#include "Auth/BigNumber.h"
+#include "sockets/TcpSocket.h"
+#include "sockets/SocketHandler.h"
+#include "sockets/ListenSocket.h"
+#include "sockets/Utility.h"
+#include "sockets/Parse.h"
+#include "sockets/Socket.h"
+#include "zthread/Mutex.h"
+
+/// Handle login commands
+class AuthSocket: public TcpSocket
+{
+ public:
+ const static int s_BYTE_SIZE = 32;
+
+ AuthSocket(ISocketHandler& h);
+ ~AuthSocket();
+
+ void OnAccept();
+ void OnRead();
+
+ bool _HandleLogonChallenge();
+ bool _HandleLogonProof();
+ bool _HandleReconnectChallenge();
+ bool _HandleReconnectProof();
+ bool _HandleRealmList();
+ //data transfer handle for patch
+
+ bool _HandleXferResume();
+ bool _HandleXferCancel();
+ bool _HandleXferAccept();
+
+ void _SetVSFields(const std::string& rI);
+
+ FILE *pPatch;
+ ZThread::Mutex patcherLock;
+ bool IsLag();
+
+ private:
+
+ BigNumber N, s, g, v;
+ BigNumber b, B;
+ BigNumber K;
+ BigNumber _reconnectProof;
+
+ bool _authed;
+
+ std::string _login;
+ std::string _safelogin;
+
+ // Since GetLocaleByName() is _NOT_ bijective, we have to store the locale as a string. Otherwise we can't differ
+ // between enUS and enGB, which is important for the patch system
+ std::string _localizationName;
+ uint16 _build;
+ AccountTypes _accountSecurityLevel;
+};
+#endif
+/// @}
diff --git a/src/realmd/CMakeLists.txt b/src/realmd/CMakeLists.txt
new file mode 100644
index 00000000000..ab03c3143a5
--- /dev/null
+++ b/src/realmd/CMakeLists.txt
@@ -0,0 +1,45 @@
+########### next target ###############
+
+SET(trinity-realm_SRCS
+AuthCodes.h
+AuthSocket.cpp
+AuthSocket.h
+Main.cpp
+RealmList.cpp
+RealmList.h
+)
+
+add_executable(trinity-realm ${trinity-realm_SRCS})
+add_definitions(
+-D_TRINITY_REALM_CONFIG='"${CONF_DIR}/trinityrealm.conf"'
+)
+IF (DO_MYSQL)
+ #SET_TARGET_PROPERTIES(mangos-realmd PROPERTIES LINK_FLAGS ${MYSQL_LIBS})
+ SET_TARGET_PROPERTIES(trinity-realm PROPERTIES LINK_FLAGS "-pthread")
+ENDIF(DO_MYSQL)
+IF (DO_POSTGRE)
+ SET_TARGET_PROPERTIES(trinity-realmd PROPERTIES LINK_FLAGS ${POSTGRE_LIBS})
+ENDIF(DO_POSTGRE)
+
+
+target_link_libraries(
+trinity-realm
+shared
+trinityframework
+trinitysockets
+trinitydatabase
+trinityauth
+trinityconfig
+ZThread
+zlib
+${SSLLIB}
+${MYSQL_LIBRARIES}
+)
+
+install(TARGETS trinity-realm DESTINATION bin)
+
+
+########### install files ###############
+
+install(FILES realmd.conf.dist.in DESTINATION etc)
+
diff --git a/src/realmd/Main.cpp b/src/realmd/Main.cpp
new file mode 100644
index 00000000000..f36558e6fba
--- /dev/null
+++ b/src/realmd/Main.cpp
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup realmd Realm Daemon
+/// @{
+/// \file
+
+#include "Common.h"
+#include "Database/DatabaseEnv.h"
+#include "RealmList.h"
+
+#include "Config/ConfigEnv.h"
+#include "Log.h"
+#include "sockets/ListenSocket.h"
+#include "AuthSocket.h"
+#include "SystemConfig.h"
+#include "Util.h"
+
+// Format is YYYYMMDDRR where RR is the change in the conf file
+// for that day.
+#ifndef _REALMDCONFVERSION
+# define _REALMDCONFVERSION 2007062001
+#endif
+
+#ifndef _TRINITY_REALM_CONFIG
+# define _TRINITY_REALM_CONFIG "TrinityRealm.conf"
+#endif //_TRINITY_REALM_CONFIG
+
+#ifdef WIN32
+#include "ServiceWin32.h"
+char serviceName[] = "TrinityRealm";
+char serviceLongName[] = "Trinity realm service";
+char serviceDescription[] = "Massive Network Game Object Server";
+/*
+ * -1 - not in service mode
+ * 0 - stopped
+ * 1 - running
+ * 2 - paused
+ */
+int m_ServiceStatus = -1;
+#endif
+
+bool StartDB(std::string &dbstring);
+void UnhookSignals();
+void HookSignals();
+
+bool stopEvent = false; ///< Setting it to true stops the server
+RealmList m_realmList; ///< Holds the list of realms for this server
+
+DatabaseType LoginDatabase; ///< Accessor to the realm server database
+
+/// Print out the usage string for this program on the console.
+void usage(const char *prog)
+{
+ sLog.outString("Usage: \n %s [<options>]\n"
+ " -c config_file use config_file as configuration file\n\r"
+ #ifdef WIN32
+ " Running as service functions:\n\r"
+ " --service run as service\n\r"
+ " -s install install service\n\r"
+ " -s uninstall uninstall service\n\r"
+ #endif
+ ,prog);
+}
+
+/// Launch the realm server
+extern int main(int argc, char **argv)
+{
+ ///- Command line parsing to get the configuration file name
+ char const* cfg_file = _TRINITY_REALM_CONFIG;
+ int c=1;
+ while( c < argc )
+ {
+ if( strcmp(argv[c],"-c") == 0)
+ {
+ if( ++c >= argc )
+ {
+ sLog.outError("Runtime-Error: -c option requires an input argument");
+ usage(argv[0]);
+ return 1;
+ }
+ else
+ cfg_file = argv[c];
+ }
+
+ #ifdef WIN32
+ ////////////
+ //Services//
+ ////////////
+ if( strcmp(argv[c],"-s") == 0)
+ {
+ if( ++c >= argc )
+ {
+ sLog.outError("Runtime-Error: -s option requires an input argument");
+ usage(argv[0]);
+ return 1;
+ }
+ if( strcmp(argv[c],"install") == 0)
+ {
+ if (WinServiceInstall())
+ sLog.outString("Installing service");
+ return 1;
+ }
+ else if( strcmp(argv[c],"uninstall") == 0)
+ {
+ if(WinServiceUninstall())
+ sLog.outString("Uninstalling service");
+ return 1;
+ }
+ else
+ {
+ sLog.outError("Runtime-Error: unsupported option %s",argv[c]);
+ usage(argv[0]);
+ return 1;
+ }
+ }
+ if( strcmp(argv[c],"--service") == 0)
+ {
+ WinServiceRun();
+ }
+ ////
+ #endif
+ ++c;
+ }
+
+ if (!sConfig.SetSource(cfg_file))
+ {
+ sLog.outError("Could not find configuration file %s.", cfg_file);
+ return 1;
+ }
+ sLog.outString("Using configuration file %s.", cfg_file);
+
+ ///- Check the version of the configuration file
+ uint32 confVersion = sConfig.GetIntDefault("ConfVersion", 0);
+ if (confVersion < _REALMDCONFVERSION)
+ {
+ sLog.outError("*****************************************************************************");
+ sLog.outError(" WARNING: Your trinityrealm.conf version indicates your conf file is out of date!");
+ sLog.outError(" Please check for updates, as your current default values may cause");
+ sLog.outError(" strange behavior.");
+ sLog.outError("*****************************************************************************");
+ clock_t pause = 3000 + clock();
+
+ while (pause > clock()) {}
+ }
+
+ sLog.outString( "%s (realm-daemon)", _FULLVERSION );
+ sLog.outString( "<Ctrl-C> to stop.\n" );
+
+ /// realmd PID file creation
+ std::string pidfile = sConfig.GetStringDefault("PidFile", "");
+ if(!pidfile.empty())
+ {
+ uint32 pid = CreatePIDFile(pidfile);
+ if( !pid )
+ {
+ sLog.outError( "Cannot create PID file %s.\n", pidfile.c_str() );
+ return 1;
+ }
+
+ sLog.outString( "Daemon PID: %u\n", pid );
+ }
+
+ ///- Initialize the database connection
+ std::string dbstring;
+ if(!StartDB(dbstring))
+ return 1;
+
+ ///- Get the list of realms for the server
+ m_realmList.Initialize(sConfig.GetIntDefault("RealmsStateUpdateDelay", 20));
+ if (m_realmList.size() == 0)
+ {
+ sLog.outError("No valid realms specified.");
+ return 1;
+ }
+
+ ///- Launch the listening network socket
+ port_t rmport = sConfig.GetIntDefault( "RealmServerPort", DEFAULT_REALMSERVER_PORT );
+ std::string bind_ip = sConfig.GetStringDefault("BindIP", "0.0.0.0");
+
+ SocketHandler h;
+ ListenSocket<AuthSocket> authListenSocket(h);
+ if ( authListenSocket.Bind(bind_ip.c_str(),rmport))
+ {
+ sLog.outError( "Trinity realm can not bind to %s:%d",bind_ip.c_str(), rmport );
+ return 1;
+ }
+
+ h.Add(&authListenSocket);
+
+ ///- Catch termination signals
+ HookSignals();
+
+ ///- Handle affinity for multiple processors and process priority on Windows
+ #ifdef WIN32
+ {
+ HANDLE hProcess = GetCurrentProcess();
+
+ uint32 Aff = sConfig.GetIntDefault("UseProcessors", 0);
+ if(Aff > 0)
+ {
+ ULONG_PTR appAff;
+ ULONG_PTR sysAff;
+
+ if(GetProcessAffinityMask(hProcess,&appAff,&sysAff))
+ {
+ ULONG_PTR curAff = Aff & appAff; // remove non accessible processors
+
+ if(!curAff )
+ {
+ sLog.outError("Processors marked in UseProcessors bitmask (hex) %x not accessible for realmd. Accessible processors bitmask (hex): %x",Aff,appAff);
+ }
+ else
+ {
+ if(SetProcessAffinityMask(hProcess,curAff))
+ sLog.outString("Using processors (bitmask, hex): %x", curAff);
+ else
+ sLog.outError("Can't set used processors (hex): %x", curAff);
+ }
+ }
+ sLog.outString();
+ }
+
+ bool Prio = sConfig.GetBoolDefault("ProcessPriority", false);
+
+ if(Prio)
+ {
+ if(SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS))
+ sLog.outString("TrinityRealm process priority class set to HIGH");
+ else
+ sLog.outError("ERROR: Can't set realmd process priority class.");
+ sLog.outString();
+ }
+ }
+ #endif
+
+ // maximum counter for next ping
+ uint32 numLoops = (sConfig.GetIntDefault( "MaxPingTime", 30 ) * (MINUTE * 1000000 / 100000));
+ uint32 loopCounter = 0;
+
+ ///- Wait for termination signal
+ while (!stopEvent)
+ {
+
+ h.Select(0, 100000);
+
+ if( (++loopCounter) == numLoops )
+ {
+ loopCounter = 0;
+ sLog.outDetail("Ping MySQL to keep connection alive");
+ delete LoginDatabase.Query("SELECT 1 FROM realmlist LIMIT 1");
+ }
+#ifdef WIN32
+ if (m_ServiceStatus == 0) stopEvent = true;
+ while (m_ServiceStatus == 2) Sleep(1000);
+#endif
+ }
+
+ ///- Wait for the delay thread to exit
+ LoginDatabase.HaltDelayThread();
+
+ ///- Remove signal handling before leaving
+ UnhookSignals();
+
+ sLog.outString( "Halting process..." );
+ return 0;
+}
+
+/// Handle termination signals
+/** Put the global variable stopEvent to 'true' if a termination signal is caught **/
+void OnSignal(int s)
+{
+ switch (s)
+ {
+ case SIGINT:
+ case SIGTERM:
+ stopEvent = true;
+ break;
+ #ifdef _WIN32
+ case SIGBREAK:
+ stopEvent = true;
+ break;
+ #endif
+ }
+
+ signal(s, OnSignal);
+}
+
+/// Initialize connection to the database
+bool StartDB(std::string &dbstring)
+{
+ if(!sConfig.GetString("LoginDatabaseInfo", &dbstring))
+ {
+ sLog.outError("Database not specified");
+ return false;
+ }
+
+ sLog.outString("Database: %s", dbstring.c_str() );
+ if(!LoginDatabase.Initialize(dbstring.c_str()))
+ {
+ sLog.outError("Cannot connect to database");
+ return false;
+ }
+
+ return true;
+}
+
+/// Define hook 'OnSignal' for all termination signals
+void HookSignals()
+{
+ signal(SIGINT, OnSignal);
+ signal(SIGTERM, OnSignal);
+ #ifdef _WIN32
+ signal(SIGBREAK, OnSignal);
+ #endif
+}
+
+/// Unhook the signals before leaving
+void UnhookSignals()
+{
+ signal(SIGINT, 0);
+ signal(SIGTERM, 0);
+ #ifdef _WIN32
+ signal(SIGBREAK, 0);
+ #endif
+}
+
+/// @}
diff --git a/src/realmd/Makefile.am b/src/realmd/Makefile.am
new file mode 100644
index 00000000000..a14b50c847a
--- /dev/null
+++ b/src/realmd/Makefile.am
@@ -0,0 +1,59 @@
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+#
+# Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+## Process this file with automake to produce Makefile.in
+
+## CPP flags for includes, defines, etc.
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir) -DSYSCONFDIR=\"$(sysconfdir)/\"
+
+## Build realm list daemon as standalone program
+bin_PROGRAMS = trinity-realmd
+trinity_realmd_SOURCES = \
+ AuthCodes.h \
+ AuthSocket.cpp \
+ AuthSocket.h \
+ Main.cpp \
+ RealmList.cpp \
+ RealmList.h
+
+## Link realm list daemon against the shared library
+trinity_realmd_LDADD = ../shared/Database/libmangosdatabase.a ../shared/Config/libmangosconfig.a ../shared/Auth/libmangosauth.a ../shared/libmangosshared.a ../framework/libmangosframework.a ../../dep/src/sockets/libmangossockets.a ../../dep/src/zthread/libZThread.la
+trinity_realmd_LDFLAGS = -L../../dep/src/sockets -L../../dep/src/zthread -L$(libdir) $(TRINI_LIBS)
+
+## Additional files to include when running 'make dist'
+# Include realm list daemon configuration
+EXTRA_DIST = \
+ realmd.conf.dist
+
+## Additional files to install
+sysconf_DATA = \
+ realmd.conf.dist
+
+install-data-hook:
+ @list='$(sysconf_DATA)'; for p in $$list; do \
+ dest=`echo $$p | sed -e s/.dist//`; \
+ if test -f $(DESTDIR)$(sysconfdir)/$$dest; then \
+ echo "$@ will not overwrite existing $(DESTDIR)$(sysconfdir)/$$dest"; \
+ else \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$dest"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$dest; \
+ fi; \
+ done
+
+clean-local:
+ rm -f $(sysconf_DATA)
diff --git a/src/realmd/RealmList.cpp b/src/realmd/RealmList.cpp
new file mode 100644
index 00000000000..936f7bcd703
--- /dev/null
+++ b/src/realmd/RealmList.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \file
+ \ingroup realmd
+*/
+
+#include "Common.h"
+#include "RealmList.h"
+#include "Policies/SingletonImp.h"
+#include "Database/DatabaseEnv.h"
+
+INSTANTIATE_SINGLETON_1( RealmList );
+
+extern DatabaseType LoginDatabase;
+
+RealmList::RealmList( ) : m_UpdateInterval(0), m_NextUpdateTime(time(NULL))
+{
+}
+
+/// Load the realm list from the database
+void RealmList::Initialize(uint32 updateInterval)
+{
+ m_UpdateInterval = updateInterval;
+
+ ///- Get the content of the realmlist table in the database
+ UpdateRealms(true);
+}
+
+void RealmList::UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu)
+{
+ ///- Create new if not exist or update existed
+ Realm& realm = m_realms[name];
+
+ realm.m_ID = ID;
+ realm.icon = icon;
+ realm.color = color;
+ realm.timezone = timezone;
+ realm.allowedSecurityLevel = allowedSecurityLevel;
+ realm.populationLevel = popu;
+
+ ///- Append port to IP address.
+ std::ostringstream ss;
+ ss << address << ":" << port;
+ realm.address = ss.str();
+}
+
+void RealmList::UpdateIfNeed()
+{
+ // maybe disabled or updated recently
+ if(!m_UpdateInterval || m_NextUpdateTime > time(NULL))
+ return;
+
+ m_NextUpdateTime = time(NULL) + m_UpdateInterval;
+
+ // Clears Realm list
+ m_realms.clear();
+
+ // Get the content of the realmlist table in the database
+ UpdateRealms(false);
+}
+
+void RealmList::UpdateRealms(bool init)
+{
+ sLog.outDetail("Updating Realm List...");
+
+ QueryResult *result = LoginDatabase.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" );
+
+ ///- Circle through results and add them to the realm map
+ if(result)
+ {
+ do
+ {
+ Field *fields = result->Fetch();
+
+ uint8 allowedSecurityLevel = fields[7].GetUInt8();
+
+ UpdateRealm(fields[0].GetUInt32(), fields[1].GetCppString(),fields[2].GetCppString(),fields[3].GetUInt32(),fields[4].GetUInt8(), fields[5].GetUInt8(), fields[6].GetUInt8(), (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), fields[8].GetFloat() );
+ if(init)
+ sLog.outString("Added realm \"%s\".", fields[1].GetString());
+ } while( result->NextRow() );
+ delete result;
+ }
+}
diff --git a/src/realmd/RealmList.h b/src/realmd/RealmList.h
new file mode 100644
index 00000000000..b830a0827a7
--- /dev/null
+++ b/src/realmd/RealmList.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/// \addtogroup realmd
+/// @{
+/// \file
+
+#ifndef _REALMLIST_H
+#define _REALMLIST_H
+
+#include "Common.h"
+
+/// Storage object for a realm
+struct Realm
+{
+ std::string address;
+ uint8 icon;
+ uint8 color;
+ uint8 timezone;
+ uint32 m_ID;
+ AccountTypes allowedSecurityLevel;
+ float populationLevel;
+};
+
+/// Storage object for the list of realms on the server
+class RealmList
+{
+ public:
+ typedef std::map<std::string, Realm> RealmMap;
+
+ RealmList();
+ ~RealmList() {}
+
+ void Initialize(uint32 updateInterval);
+
+ void UpdateIfNeed();
+
+ RealmMap::const_iterator begin() const { return m_realms.begin(); }
+ RealmMap::const_iterator end() const { return m_realms.end(); }
+ uint32 size() const { return m_realms.size(); }
+ private:
+ void UpdateRealms(bool init);
+ void UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu);
+ private:
+ RealmMap m_realms; ///< Internal map of realms
+ uint32 m_UpdateInterval;
+ time_t m_NextUpdateTime;
+};
+#endif
+/// @}
diff --git a/src/trinityrealm/TrinityRealm.ico b/src/realmd/TrinityRealm.ico
index da318f48a8c..da318f48a8c 100644
--- a/src/trinityrealm/TrinityRealm.ico
+++ b/src/realmd/TrinityRealm.ico
Binary files differ
diff --git a/src/trinityrealm/trinityrealm.conf.dist b/src/realmd/realmd.conf.dist.in
index 72ef1c9012e..72ef1c9012e 100644
--- a/src/trinityrealm/trinityrealm.conf.dist
+++ b/src/realmd/realmd.conf.dist.in
diff --git a/src/trinityrealm/TrinityRealm.rc b/src/realmd/realmd.rc
index 33c7eef719a..bcd37f240c5 100644
--- a/src/trinityrealm/TrinityRealm.rc
+++ b/src/realmd/realmd.rc
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/realmd/resource.h b/src/realmd/resource.h
new file mode 100644
index 00000000000..7e7d8e4b76f
--- /dev/null
+++ b/src/realmd/resource.h
@@ -0,0 +1,15 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by TrinityCore.rc
+//
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp
index 7cbb7f13648..0b2a3f64338 100644
--- a/src/shared/Auth/AuthCrypt.cpp
+++ b/src/shared/Auth/AuthCrypt.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -50,9 +50,8 @@ void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
void AuthCrypt::EncryptSend(uint8 *data, size_t len)
{
if (!_initialized) return;
- if (len < CRYPTED_SEND_LEN) return;
- for (size_t t = 0; t < CRYPTED_SEND_LEN; t++)
+ for (size_t t = 0; t < len; t++)
{
_send_i %= _key.size();
uint8 x = (data[t] ^ _key[_send_i]) + _send_j;
@@ -67,7 +66,7 @@ void AuthCrypt::SetKey(BigNumber *bn)
GenerateKey(key, bn);
_key.resize(SHA_DIGEST_LENGTH);
std::copy(key, key + SHA_DIGEST_LENGTH, _key.begin());
- delete key;
+ delete[] key;
}
AuthCrypt::~AuthCrypt()
diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h
index 020f8bcdc96..5c35511ad9f 100644
--- a/src/shared/Auth/AuthCrypt.h
+++ b/src/shared/Auth/AuthCrypt.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -32,7 +32,6 @@ class AuthCrypt
AuthCrypt();
~AuthCrypt();
- const static size_t CRYPTED_SEND_LEN = 4;
const static size_t CRYPTED_RECV_LEN = 6;
void Init();
diff --git a/src/shared/Auth/BigNumber.cpp b/src/shared/Auth/BigNumber.cpp
index da31da3a522..7872b141f3d 100644
--- a/src/shared/Auth/BigNumber.cpp
+++ b/src/shared/Auth/BigNumber.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Auth/BigNumber.h b/src/shared/Auth/BigNumber.h
index df25e4f934d..b9038e86b13 100644
--- a/src/shared/Auth/BigNumber.h
+++ b/src/shared/Auth/BigNumber.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Auth/Hmac.cpp b/src/shared/Auth/Hmac.cpp
index 615edd26ca5..a8572f0e9f8 100644
--- a/src/shared/Auth/Hmac.cpp
+++ b/src/shared/Auth/Hmac.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Auth/Hmac.h b/src/shared/Auth/Hmac.h
index 5b7c4040f13..fc80bdca4c4 100644
--- a/src/shared/Auth/Hmac.h
+++ b/src/shared/Auth/Hmac.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Auth/Makefile.am b/src/shared/Auth/Makefile.am
index 9c71613a0de..2d4cc03902d 100644
--- a/src/shared/Auth/Makefile.am
+++ b/src/shared/Auth/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,19 +9,19 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
## CPP flags for includes, defines, etc.
-AM_CPPFLAGS = $(MYSQL_INCLUDES) $(POSTGRE_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
## Build MaNGOS shared library and its parts as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
@@ -29,13 +29,13 @@ AM_CPPFLAGS = $(MYSQL_INCLUDES) $(POSTGRE_INCLUDES) -I$(top_builddir)/src/shared
noinst_LIBRARIES = libmangosauth.a
libmangosauth_a_SOURCES = \
- AuthCrypt.cpp \
- AuthCrypt.h \
- BigNumber.cpp \
- BigNumber.h \
- Hmac.cpp \
- Hmac.h \
- Sha1.cpp \
- Sha1.h \
- md5.c \
- md5.h
+ AuthCrypt.cpp \
+ AuthCrypt.h \
+ BigNumber.cpp \
+ BigNumber.h \
+ Hmac.cpp \
+ Hmac.h \
+ Sha1.cpp \
+ Sha1.h \
+ md5.c \
+ md5.h
diff --git a/src/shared/Auth/Sha1.cpp b/src/shared/Auth/Sha1.cpp
index 90334543b82..8743a14b838 100644
--- a/src/shared/Auth/Sha1.cpp
+++ b/src/shared/Auth/Sha1.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Auth/Sha1.h b/src/shared/Auth/Sha1.h
index 6794d3bd103..68c61eb7a8e 100644
--- a/src/shared/Auth/Sha1.h
+++ b/src/shared/Auth/Sha1.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h
index fb2d7cfc7b9..97b6c1cbd17 100644
--- a/src/shared/ByteBuffer.h
+++ b/src/shared/ByteBuffer.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -243,6 +243,32 @@ class ByteBuffer
_rpos += len;
}
+ bool readPackGUID(uint64& guid)
+ {
+ if(rpos()+1 > size())
+ return false;
+
+ guid = 0;
+
+ uint8 guidmark=0;
+ (*this) >> guidmark;
+
+ for(int i=0;i<8;i++)
+ {
+ if(guidmark & (uint8(1) << i))
+ {
+ if(rpos()+1 > size())
+ return false;
+
+ uint8 bit;
+ (*this) >> bit;
+ guid |= (uint64(bit) << (i*8));
+ }
+ }
+
+ return true;
+ }
+
const uint8 *contents() const { return &_storage[0]; }
size_t size() const { return _storage.size(); }
diff --git a/src/shared/Common.cpp b/src/shared/Common.cpp
index a31c88fdba5..27ae9184d69 100644
--- a/src/shared/Common.cpp
+++ b/src/shared/Common.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Common.h b/src/shared/Common.h
index 5e6a2cca520..9f5b9473bd9 100644
--- a/src/shared/Common.h
+++ b/src/shared/Common.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -80,6 +80,8 @@
#pragma warning(disable:4305)
#pragma warning(disable:4005)
+
+#pragma warning(disable:4522)//warning when class has 2 constructosr
#endif // __SHOW_STUPID_WARNINGS__
#endif // __GNUC__
diff --git a/src/shared/Config/Config.cpp b/src/shared/Config/Config.cpp
index 4f9402b5f01..52fca953f64 100644
--- a/src/shared/Config/Config.cpp
+++ b/src/shared/Config/Config.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Config/Config.h b/src/shared/Config/Config.h
index 4dbff1b1153..2c709f02ae5 100644
--- a/src/shared/Config/Config.h
+++ b/src/shared/Config/Config.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Config/ConfigEnv.h b/src/shared/Config/ConfigEnv.h
index eaa86c882df..75209a7fc6b 100644
--- a/src/shared/Config/ConfigEnv.h
+++ b/src/shared/Config/ConfigEnv.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Config/Makefile.am b/src/shared/Config/Makefile.am
index 23188ba3447..4854095b98c 100644
--- a/src/shared/Config/Makefile.am
+++ b/src/shared/Config/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,19 +9,19 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
## CPP flags for includes, defines, etc.
-AM_CPPFLAGS = $(MYSQL_INCLUDES) $(POSTGRE_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
## Build MaNGOS shared library and its parts as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
diff --git a/src/shared/Config/dotconfpp/dotconfpp.cpp b/src/shared/Config/dotconfpp/dotconfpp.cpp
index 3e2aa8683fe..bd575d95ece 100644
--- a/src/shared/Config/dotconfpp/dotconfpp.cpp
+++ b/src/shared/Config/dotconfpp/dotconfpp.cpp
@@ -138,7 +138,7 @@ int DOTCONFDocument::cleanupLine(char * line)
quoted = !quoted;
++line; continue;
}
- if(isspace(*line) && !quoted){
+ if(isspace((unsigned char)*line) && !quoted){
*bg++ = 0;
if(strlen(start)){
@@ -154,7 +154,7 @@ int DOTCONFDocument::cleanupLine(char * line)
words.push_back(word);
}
start = bg;
- while(isspace(*++line)) {}
+ while(isspace((unsigned char)*++line)) {}
continue;
}
diff --git a/src/shared/Database/DBCEnums.h b/src/shared/Database/DBCEnums.h
index d8699b2c240..ee4f165f898 100644
--- a/src/shared/Database/DBCEnums.h
+++ b/src/shared/Database/DBCEnums.h
@@ -1,5 +1,5 @@
/*
-* Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
@@ -34,28 +34,190 @@ enum AreaTeams
AREATEAM_HORDE = 4
};
+enum AchievementFactionFlags
+{
+ ACHIEVEMENT_FACTION_FLAG_HORDE = 0x00000000,
+ ACHIEVEMENT_FACTION_FLAG_ALLIANCE = 0x00000001,
+};
+
+enum AchievementFlags
+{
+ ACHIEVEMENT_FLAG_COUNTER = 0x00000001,
+ ACHIEVEMENT_FLAG_REACH_LEVEL = 0x00000004,
+ ACHIEVEMENT_FLAG_RERERED_MAX = 0x00000010, // displays the maximum criteria of a refered achievement
+ ACHIEVEMENT_FLAG_AVERAGE = 0x00000040,
+ ACHIEVEMENT_FLAG_REALM_FIRST_REACH= 0x00000100,
+ ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200,
+};
+
+enum AchievementCriteriaCondition
+{
+ ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
+ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1,
+ ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days"
+ ACHIEVEMENT_CRITERIA_CONDITION_MAP = 3, // requires you to be on specific map
+ ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE = 4, // only used in "Win 10 arenas without losing"
+ ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 9, // unk
+ ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13, // unk
+};
+
+enum AchievementCriteriaCompletionFlags
+{
+ // some Achievements (like 698) have several criteria but only one has to be fulfilled. These are identified by this flag.
+ ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL = 2,
+};
+
+enum AchievementCriteriaGroupFlags
+{
+ // you mustn't be in a group while fulfilling this achievement
+ ACHIEVEMENT_CRITERIA_GROUP_NOT_IN_GROUP = 2,
+};
+
+enum AchievementCriteriaTypes
+{
+ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0,
+ ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1,
+ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5,
+ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
+ // you have to complete a daily quest x times in a row
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11,
+ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15,
+ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16,
+ // TODO: this can be both arena and total deaths. Where is this difference in the dbc?
+ ACHIEVEMENT_CRITERIA_TYPE_DEATH= 17,
+ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,
+ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20,
+ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER = 23,
+ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24,
+ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26,
+ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27,
+ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28,
+ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL= 29,
+ ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30,
+ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31,
+ ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32,
+ ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33,
+ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34,
+ // TODO: this criteria has additional conditions which can not be found in the dbcs
+ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL = 35,
+ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36,
+ // TODO: the archievements 1162 and 1163 requires a special rating which can't be found in the dbc
+ ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
+ ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39,
+ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40,
+ ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
+ ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM= 42,
+ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43,
+ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK= 44,
+ ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT= 45,
+ ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION= 46,
+ ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47,
+ // noted: rewarded as soon as the player payed, not at taking place at the seat
+ ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP= 48,
+ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49,
+ // TODO: itemlevel is mentioned in text but not present in dbc
+ ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50,
+ ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT= 51,
+ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52,
+ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53,
+ ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54,
+ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55,
+ // TODO: in some cases map not present, and in some cases need do without die
+ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56,
+ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57,
+ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS = 59,
+ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60,
+ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61,
+ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62,
+ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63,
+ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65,
+ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66,
+ ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67,
+ ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68,
+ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2= 69,
+ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70,
+ ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72,
+ // TODO: title id is not mentioned in dbc
+ ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE = 74,
+ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75,
+ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76,
+ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77,
+ // TODO: creature type (demon, undead etc.) is not stored in dbc
+ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE = 78,
+ ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS= 80,
+ ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION= 82,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID= 83,
+ ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS= 84,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86,
+ ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87,
+ ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88,
+ ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS = 89,
+ ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90,
+ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91,
+ ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED = 93,
+ ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED = 94,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH = 95,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR = 99,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102,
+ ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED = 104,
+ ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105,
+ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106,
+ ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107,
+ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108,
+ ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109,
+ // TODO: target entry is missing
+ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110,
+ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112,
+ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113,
+ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114,
+ // 0..114 => 115 criteria types total
+ ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 115,
+};
+
enum AreaFlags
{
AREA_FLAG_SNOW = 0x00000001, // snow (only Dun Morogh, Naxxramas, Razorfen Downs and Winterspring)
- AREA_FLAG_UNK1 = 0x00000002, // unknown, (only Naxxramas and Razorfen Downs)
- AREA_FLAG_UNK2 = 0x00000004, // Only used on development map
- AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // slave capital city flag?
- AREA_FLAG_UNK3 = 0x00000010, // unknown
+ AREA_FLAG_UNK1 = 0x00000002, // may be necropolis?
+ AREA_FLAG_UNK2 = 0x00000004, // Only used for areas on map 571 (development before)
+ AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // city and city subsones
+ AREA_FLAG_UNK3 = 0x00000010, // can't find common meaning
AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag?
AREA_FLAG_UNK4 = 0x00000040, // many zones have this flag
AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas
AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag
AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?)
- AREA_FLAG_OUTLAND = 0x00000400, // outland zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
+ AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled)
AREA_FLAG_NEED_FLY = 0x00001000, // only Netherwing Ledge, Socrethar's Seat, Tempest Keep, The Arcatraz, The Botanica, The Mechanar, Sorrow Wing Point, Dragonspine Ridge, Netherwing Mines, Dragonmaw Base Camp, Dragonmaw Skyway
- AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 2.4.2)
- AREA_FLAG_OUTLAND2 = 0x00004000, // outland zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
+ AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 3.0.3)
+ AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
AREA_FLAG_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area)
AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas only
- AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 2.4.2)
- AREA_FLAG_UNK5 = 0x00040000, // just used for Amani Pass, Hatchet Hills
- AREA_FLAG_LOWLEVEL = 0x00100000 // used for some starting areas with area_level <=15
+ AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 3.0.3)
+ AREA_FLAG_UNK5 = 0x00040000, // only used for Amani Pass, Hatchet Hills
+ AREA_FLAG_UNK6 = 0x00080000, // Valgarde and Acherus: The Ebon Hold
+ AREA_FLAG_LOWLEVEL = 0x00100000, // used for some starting areas with area_level <=15
+ AREA_FLAG_TOWN = 0x00200000, // small towns with Inn
+ AREA_FLAG_UNK7 = 0x00400000, // Warsong Hold, Acherus: The Ebon Hold, New Agamand Inn, Vengeance Landing Inn
+ AREA_FLAG_UNK8 = 0x00800000, // Westguard Inn, Acherus: The Ebon Hold, Valgarde
+ AREA_FLAG_OUTDOOR_PVP = 0x01000000, // Wintergrasp and it's subzones
+ AREA_FLAG_UNK9 = 0x02000000, // unknown
+ AREA_FLAG_UNK10 = 0x04000000, // unknown
+ AREA_FLAG_OUTDOOR_PVP2 = 0x08000000 // Wintergrasp and it's subzones
};
enum FactionTemplateFlags
@@ -89,13 +251,15 @@ enum AbilytyLearnType
enum ItemEnchantmentType
{
- ITEM_ENCHANTMENT_TYPE_NONE = 0,
- ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL = 1,
- ITEM_ENCHANTMENT_TYPE_DAMAGE = 2,
- ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL = 3,
- ITEM_ENCHANTMENT_TYPE_RESISTANCE = 4,
- ITEM_ENCHANTMENT_TYPE_STAT = 5,
- ITEM_ENCHANTMENT_TYPE_TOTEM = 6
+ ITEM_ENCHANTMENT_TYPE_NONE = 0,
+ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL = 1,
+ ITEM_ENCHANTMENT_TYPE_DAMAGE = 2,
+ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL = 3,
+ ITEM_ENCHANTMENT_TYPE_RESISTANCE = 4,
+ ITEM_ENCHANTMENT_TYPE_STAT = 5,
+ ITEM_ENCHANTMENT_TYPE_TOTEM = 6,
+ ITEM_ENCHANTMENT_TYPE_USE_SPELL = 7,
+ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET = 8
};
enum TotemCategoryType
@@ -109,5 +273,52 @@ enum TotemCategoryType
TOTEM_CATEGORY_TYPE_SPANNER = 24
};
+// SummonProperties.dbc, col 1
+/*enum SummonGroup
+{
+ SUMMON_GROUP_UNKNOWN1 = 0, // 1160 spells in 3.0.3
+ SUMMON_GROUP_UNKNOWN2 = 1, // 861 spells in 3.0.3
+ SUMMON_GROUP_PETS = 2, // 52 spells in 3.0.3, pets mostly
+ SUMMON_GROUP_CONTROLLABLE = 3, // 13 spells in 3.0.3, mostly controllable
+ SUMMON_GROUP_UNKNOWN3 = 4 // 86 spells in 3.0.3, taxi/mounts
+};
+
+// SummonProperties.dbc, col 3
+enum SummonType
+{
+ SUMMON_TYPE_UNKNOWN = 0, // different summons, 1330 spells in 3.0.3
+ SUMMON_TYPE_SUMMON = 1, // generic summons, 49 spells in 3.0.3
+ SUMMON_TYPE_GUARDIAN = 2, // summon guardian, 393 spells in 3.0.3
+ SUMMON_TYPE_ARMY = 3, // summon army, 5 spells in 3.0.3
+ SUMMON_TYPE_TOTEM = 4, // summon totem, 169 spells in 3.0.3
+ SUMMON_TYPE_CRITTER = 5, // critter/minipet, 195 spells in 3.0.3
+ SUMMON_TYPE_DK = 6, // summon DRW/Ghoul, 2 spells in 3.0.3
+ SUMMON_TYPE_BOMB = 7, // summon bot/bomb, 4 spells in 3.0.3
+ SUMMON_TYPE_PHASING = 8, // something todo with DK prequest line, 2 spells in 3.0.3
+ SUMMON_TYPE_SIEGE_VEH = 9, // summon different vehicles, 14 spells in 3.0.3
+ SUMMON_TYPE_DRAKE_VEH = 10, // summon drake (vehicle), 3 spells
+ SUMMON_TYPE_LIGHTWELL = 11 // summon lightwell, 6 spells in 3.0.3
+};
+
+// SummonProperties.dbc, col 5
+enum SummonFlags
+{
+ SUMMON_FLAG_NONE = 0x0000, // 1342 spells in 3.0.3
+ SUMMON_FLAG_UNK1 = 0x0001, // 75 spells in 3.0.3, something unfriendly
+ SUMMON_FLAG_UNK2 = 0x0002, // 616 spells in 3.0.3, something friendly
+ SUMMON_FLAG_UNK3 = 0x0004, // 22 spells in 3.0.3, no idea...
+ SUMMON_FLAG_UNK4 = 0x0008, // 49 spells in 3.0.3, some mounts
+ SUMMON_FLAG_UNK5 = 0x0010, // 25 spells in 3.0.3, quest related?
+ SUMMON_FLAG_UNK6 = 0x0020, // 0 spells in 3.0.3, unused
+ SUMMON_FLAG_UNK7 = 0x0040, // 12 spells in 3.0.3, no idea
+ SUMMON_FLAG_UNK8 = 0x0080, // 4 spells in 3.0.3, no idea
+ SUMMON_FLAG_UNK9 = 0x0100, // 51 spells in 3.0.3, no idea, many quest related
+ SUMMON_FLAG_UNK10 = 0x0200, // 51 spells in 3.0.3, something defensive
+ SUMMON_FLAG_UNK11 = 0x0400, // 3 spells, requires something near?
+ SUMMON_FLAG_UNK12 = 0x0800, // 30 spells in 3.0.3, no idea
+ SUMMON_FLAG_UNK13 = 0x1000, // 8 spells in 3.0.3, siege vehicle
+ SUMMON_FLAG_UNK14 = 0x2000, // 2 spells in 3.0.3, escort?
+};
+*/
#endif
diff --git a/src/shared/Database/DBCStores.cpp b/src/shared/Database/DBCStores.cpp
index 67b806cd632..515b17b495b 100644
--- a/src/shared/Database/DBCStores.cpp
+++ b/src/shared/Database/DBCStores.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -32,12 +32,17 @@ typedef std::map<uint16,uint32> AreaFlagByAreaID;
typedef std::map<uint32,uint32> AreaFlagByMapID;
DBCStorage <AreaTableEntry> sAreaStore(AreaTableEntryfmt);
+DBCStorage <AreaGroupEntry> sAreaGroupStore(AreaGroupEntryfmt);
static AreaFlagByAreaID sAreaFlagByAreaID;
static AreaFlagByMapID sAreaFlagByMapID; // for instances without generated *.map files
+DBCStorage <AchievementEntry> sAchievementStore(Achievementfmt);
+DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore(AchievementCriteriafmt);
DBCStorage <AreaTriggerEntry> sAreaTriggerStore(AreaTriggerEntryfmt);
+DBCStorage <AuctionHouseEntry> sAuctionHouseStore(AuctionHouseEntryfmt);
DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore(BankBagSlotPricesEntryfmt);
DBCStorage <BattlemasterListEntry> sBattlemasterListStore(BattlemasterListEntryfmt);
+DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore(BarberShopStyleEntryfmt);
DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore(CharStartOutfitEntryfmt);
DBCStorage <CharTitlesEntry> sCharTitlesStore(CharTitlesEntryfmt);
DBCStorage <ChatChannelsEntry> sChatChannelsStore(ChatChannelsEntryfmt);
@@ -46,6 +51,7 @@ DBCStorage <ChrRacesEntry> sChrRacesStore(ChrRacesEntryfmt);
DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore(CreatureDisplayInfofmt);
DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt);
DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore(CreatureSpellDatafmt);
+DBCStorage <CreatureTypeEntry> sCreatureTypeStore(CreatureTypefmt);
DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore(DurabilityQualityfmt);
DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt);
@@ -58,7 +64,10 @@ DBCStorage <FactionEntry> sFactionStore(FactionEntryfmt);
DBCStorage <FactionTemplateEntry> sFactionTemplateStore(FactionTemplateEntryfmt);
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);
@@ -72,6 +81,7 @@ DBCStorage <ItemEntry> sItemStore(Itemfmt);
//DBCStorage <ItemCondExtCostsEntry> sItemCondExtCostsStore(ItemCondExtCostsEntryfmt);
//DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore(ItemDisplayTemplateEntryfmt); -- not used currently
DBCStorage <ItemExtendedCostEntry> sItemExtendedCostStore(ItemExtendedCostEntryfmt);
+DBCStorage <ItemLimitCategoryEntry> sItemLimitCategoryStore(ItemLimitCategoryEntryfmt);
DBCStorage <ItemRandomPropertiesEntry> sItemRandomPropertiesStore(ItemRandomPropertiesfmt);
DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore(ItemRandomSuffixfmt);
DBCStorage <ItemSetEntry> sItemSetStore(ItemSetEntryfmt);
@@ -84,6 +94,8 @@ DBCStorage <MapEntry> sMapStore(MapEntryfmt);
DBCStorage <QuestSortEntry> sQuestSortStore(QuestSortEntryfmt);
DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandomPropertiesPointsfmt);
+DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore(ScalingStatDistributionfmt);
+DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore(ScalingStatValuesfmt);
DBCStorage <SkillLineEntry> sSkillLineStore(SkillLinefmt);
DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore(SkillLineAbilityfmt);
@@ -101,8 +113,10 @@ DBCStorage <SpellDurationEntry> sSpellDurationStore(SpellDurationfmt);
DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt);
DBCStorage <SpellRadiusEntry> sSpellRadiusStore(SpellRadiusfmt);
DBCStorage <SpellRangeEntry> sSpellRangeStore(SpellRangefmt);
+DBCStorage <SpellRuneCostEntry> sSpellRuneCostStore(SpellRuneCostfmt);
DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore(SpellShapeshiftfmt);
DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore(StableSlotPricesfmt);
+//DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt);
DBCStorage <TalentEntry> sTalentStore(TalentEntryfmt);
TalentSpellPosMap sTalentSpellPosMap;
DBCStorage <TalentTabEntry> sTalentTabStore(TalentTabEntryfmt);
@@ -125,8 +139,11 @@ TaxiPathNodesByPath sTaxiPathNodesByPath;
static DBCStorage <TaxiPathNodeEntry> sTaxiPathNodeStore(TaxiPathNodeEntryfmt);
DBCStorage <TotemCategoryEntry> sTotemCategoryStore(TotemCategoryEntryfmt);
+DBCStorage <VehicleEntry> sVehicleStore(VehicleEntryfmt);
+DBCStorage <VehicleSeatEntry> sVehicleSeatStore(VehicleSeatEntryfmt);
DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreaEntryfmt);
DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsEntryfmt);
+DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore(WorldMapOverlayEntryfmt);
typedef std::list<std::string> StoreProblemList;
@@ -178,7 +195,7 @@ void LoadDBCStores(const std::string& dataPath)
{
std::string dbcPath = dataPath+"dbc/";
- const uint32 DBCFilesCount = 56;
+ const uint32 DBCFilesCount = 72;
barGoLink bar( DBCFilesCount );
@@ -196,14 +213,19 @@ void LoadDBCStores(const std::string& dataPath)
sAreaFlagByAreaID.insert(AreaFlagByAreaID::value_type(uint16(area->ID),area->exploreFlag));
// fill MapId->DBC records ( skip sub zones and continents )
- if(area->zone==0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530 )
+ if(area->zone==0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530 && area->mapid != 571 )
sAreaFlagByMapID.insert(AreaFlagByMapID::value_type(area->mapid,area->exploreFlag));
}
}
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAchievementStore, dbcPath,"Achievement.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAchievementCriteriaStore, dbcPath,"Achievement_Criteria.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaTriggerStore, dbcPath,"AreaTrigger.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaGroupStore, dbcPath,"AreaGroup.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAuctionHouseStore, dbcPath,"AuctionHouse.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBankBagSlotPricesStore, dbcPath,"BankBagSlotPrices.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBattlemasterListStore, dbcPath,"BattlemasterList.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBarberShopStyleStore, dbcPath,"BarberShopStyle.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharStartOutfitStore, dbcPath,"CharStartOutfit.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharTitlesStore, dbcPath,"CharTitles.dbc");
@@ -213,6 +235,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureDisplayInfoStore, dbcPath,"CreatureDisplayInfo.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureFamilyStore, dbcPath,"CreatureFamily.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureSpellDataStore, dbcPath,"CreatureSpellData.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCreatureTypeStore, dbcPath,"CreatureType.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sDurabilityCostsStore, dbcPath,"DurabilityCosts.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sDurabilityQualityStore, dbcPath,"DurabilityQuality.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sEmotesTextStore, dbcPath,"EmotesText.dbc");
@@ -229,7 +252,10 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sFactionTemplateStore, dbcPath,"FactionTemplate.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGemPropertiesStore, dbcPath,"GemProperties.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGlyphPropertiesStore, dbcPath,"GlyphProperties.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGlyphSlotStore, dbcPath,"GlyphSlot.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGtBarberShopCostBaseStore,dbcPath,"gtBarberShopCostBase.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGtCombatRatingsStore, dbcPath,"gtCombatRatings.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGtChanceToMeleeCritBaseStore, dbcPath,"gtChanceToMeleeCritBase.dbc");
@@ -246,6 +272,7 @@ void LoadDBCStores(const std::string& dataPath)
//LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemDisplayInfoStore, dbcPath,"ItemDisplayInfo.dbc"); -- not used currently
//LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemCondExtCostsStore, dbcPath,"ItemCondExtCosts.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemExtendedCostStore, dbcPath,"ItemExtendedCost.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemLimitCategoryStore, dbcPath,"ItemLimitCategory.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemRandomPropertiesStore,dbcPath,"ItemRandomProperties.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemRandomSuffixStore, dbcPath,"ItemRandomSuffix.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sItemSetStore, dbcPath,"ItemSet.dbc");
@@ -254,6 +281,8 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sMapStore, dbcPath,"Map.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sQuestSortStore, dbcPath,"QuestSort.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sRandomPropertiesPointsStore, dbcPath,"RandPropPoints.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sScalingStatDistributionStore, dbcPath,"ScalingStatDistribution.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sScalingStatValuesStore, dbcPath,"ScalingStatValues.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSkillLineStore, dbcPath,"SkillLine.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSkillLineAbilityStore, dbcPath,"SkillLineAbility.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSoundEntriesStore, dbcPath,"SoundEntries.dbc");
@@ -264,11 +293,11 @@ void LoadDBCStores(const std::string& dataPath)
if(spell && spell->Category)
sSpellCategoryStore[spell->Category].insert(i);
- // DBC not support uint64 fields but SpellEntry have SpellFamilyFlags mapped at 2 uint32 fields
+ /*// DBC not support uint64 fields but SpellEntry have SpellFamilyFlags mapped at 2 uint32 fields
// uint32 field already converted to bigendian if need, but must be swapped for correct uint64 bigendian view
#if TRINITY_ENDIAN == TRINITY_BIGENDIAN
std::swap(*((uint32*)(&spell->SpellFamilyFlags)),*(((uint32*)(&spell->SpellFamilyFlags))+1));
- #endif
+ #endif*/
}
for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
@@ -303,8 +332,10 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellItemEnchantmentConditionStore,dbcPath,"SpellItemEnchantmentCondition.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellRadiusStore, dbcPath,"SpellRadius.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellRangeStore, dbcPath,"SpellRange.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellRuneCostStore, dbcPath,"SpellRuneCost.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellShapeshiftStore, dbcPath,"SpellShapeshiftForm.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sStableSlotPricesStore, dbcPath,"StableSlotPrices.dbc");
+ //LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSummonPropertiesStore, dbcPath,"SummonProperties.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTalentStore, dbcPath,"Talent.dbc");
// create talent spells set
@@ -382,18 +413,6 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTaxiNodesStore, dbcPath,"TaxiNodes.dbc");
- // Initialize global taxinodes mask
- memset(sTaxiNodesMask,0,sizeof(sTaxiNodesMask));
- for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
- {
- if(sTaxiNodesStore.LookupEntry(i))
- {
- uint8 field = (uint8)((i - 1) / 32);
- uint32 submask = 1<<((i-1)%32);
- sTaxiNodesMask[field] |= submask;
- }
- }
-
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTaxiPathStore, dbcPath,"TaxiPath.dbc");
for(uint32 i = 1; i < sTaxiPathStore.GetNumRows(); ++i)
if(TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(i))
@@ -407,7 +426,10 @@ void LoadDBCStores(const std::string& dataPath)
pathLength.resize(pathCount); // 0 and some other indexes not used
for(uint32 i = 1; i < sTaxiPathNodeStore.GetNumRows(); ++i)
if(TaxiPathNodeEntry const* entry = sTaxiPathNodeStore.LookupEntry(i))
- ++pathLength[entry->path];
+ {
+ if (pathLength[entry->path] < entry->index + 1)
+ pathLength[entry->path] = entry->index + 1;
+ }
// Set path length
sTaxiPathNodesByPath.resize(pathCount); // 0 and some other indexes not used
for(uint32 i = 1; i < sTaxiPathNodesByPath.size(); ++i)
@@ -418,9 +440,53 @@ void LoadDBCStores(const std::string& dataPath)
sTaxiPathNodesByPath[entry->path][entry->index] = TaxiPathNode(entry->mapid,entry->x,entry->y,entry->z,entry->actionFlag,entry->delay);
sTaxiPathNodeStore.Clear();
+ // Initialize global taxinodes mask
+ // include existed nodes that have at least single not spell base (scripted) path
+ {
+ std::set<uint32> spellPaths;
+ for(uint32 i = 1; i < sSpellStore.GetNumRows (); ++i)
+ if(SpellEntry const* sInfo = sSpellStore.LookupEntry (i))
+ for(int j=0; j < 3; ++j)
+ if(sInfo->Effect[j]==123 /*SPELL_EFFECT_SEND_TAXI*/)
+ spellPaths.insert(sInfo->EffectMiscValue[j]);
+
+ memset(sTaxiNodesMask,0,sizeof(sTaxiNodesMask));
+ for(uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
+ {
+ if(!sTaxiNodesStore.LookupEntry(i))
+ continue;
+
+ TaxiPathSetBySource::const_iterator src_i = sTaxiPathSetBySource.find(i);
+ if(src_i!=sTaxiPathSetBySource.end() && !src_i->second.empty())
+ {
+ bool ok = false;
+ for(TaxiPathSetForSource::const_iterator dest_i = src_i->second.begin();dest_i != src_i->second.end(); ++dest_i)
+ {
+ // not spell path
+ if(spellPaths.find(dest_i->second.ID)==spellPaths.end())
+ {
+ ok = true;
+ break;
+ }
+ }
+
+ if(!ok)
+ continue;
+ }
+
+ // valid taxi netowrk node
+ uint8 field = (uint8)((i - 1) / 32);
+ uint32 submask = 1<<((i-1)%32);
+ sTaxiNodesMask[field] |= submask;
+ }
+ }
+
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTotemCategoryStore, dbcPath,"TotemCategory.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sVehicleStore, dbcPath,"Vehicle.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sVehicleSeatStore, dbcPath,"VehicleSeat.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sWorldMapAreaStore, dbcPath,"WorldMapArea.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sWorldSafeLocsStore, dbcPath,"WorldSafeLocs.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sWorldMapOverlayStore, dbcPath,"WorldMapOverlay.dbc");
// error checks
if(bad_dbc_files.size() >= DBCFilesCount )
@@ -438,28 +504,21 @@ void LoadDBCStores(const std::string& dataPath)
exit(1);
}
- // check at up-to-date DBC files (53085 is last added spell in 2.4.3)
- // check at up-to-date DBC files (17514 is last ID in SkillLineAbilities in 2.4.3)
- // check at up-to-date DBC files (598 is last map added in 2.4.3)
- // check at up-to-date DBC files (1127 is last gem property added in 2.4.3)
- // check at up-to-date DBC files (2425 is last item extended cost added in 2.4.3)
- // check at up-to-date DBC files (71 is last char title added in 2.4.3)
- // check at up-to-date DBC files (1768 is last area added in 2.4.3)
- if( !sSpellStore.LookupEntry(53085) ||
- !sSkillLineAbilityStore.LookupEntry(17514) ||
- !sMapStore.LookupEntry(598) ||
- !sGemPropertiesStore.LookupEntry(1127) ||
- !sItemExtendedCostStore.LookupEntry(2425) ||
- !sCharTitlesStore.LookupEntry(71) ||
- !sAreaStore.LookupEntry(1768) )
+ // Check loaded DBC files proper version
+ if( !sSpellStore.LookupEntry(62735) || // last added spell in 3.0.9
+ !sMapStore.LookupEntry(624) || // last map added in 3.0.8a/3.0.9
+ !sGemPropertiesStore.LookupEntry(1557) || // last gem property added in 3.0.8a/3.0.9
+ !sItemExtendedCostStore.LookupEntry(2589) || // last item extended cost added in 3.0.8a/3.0.9
+ !sCharTitlesStore.LookupEntry(144) || // last char title added in 3.0.8a/3.0.9
+ !sAreaStore.LookupEntry(2769) || // last area (areaflag) added in 3.0.8a/3.0.9
+ !sItemStore.LookupEntry(45037) ) // last client known item added in 3.0.9
{
sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client.");
exit(1);
}
sLog.outString();
- sLog.outString( ">> Loaded %d data stores", DBCFilesCount );
- sLog.outString();
+ sLog.outString( ">> Initialized %d data stores", DBCFilesCount );
}
SimpleFactionsList const* GetFactionTeamList(uint32 faction)
@@ -537,7 +596,7 @@ uint32 GetAreaFlagByMapId(uint32 mapid)
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
{
- if(mapid != 530) // speed for most cases
+ if(mapid != 530 && mapid != 571) // speed for most cases
return mapid;
if(WorldMapAreaEntry const* wma = sWorldMapAreaStore.LookupEntry(zoneId))
@@ -649,4 +708,6 @@ uint32 const* GetTalentTabPages(uint32 cls)
TRINITY_DLL_SPEC DBCStorage <SoundEntriesEntry> const* GetSoundEntriesStore() { return &sSoundEntriesStore; }
TRINITY_DLL_SPEC DBCStorage <SpellEntry> const* GetSpellStore() { return &sSpellStore; }
TRINITY_DLL_SPEC DBCStorage <SpellRangeEntry> const* GetSpellRangeStore() { return &sSpellRangeStore; }
-
+TRINITY_DLL_SPEC DBCStorage <FactionEntry> const* GetFactionStore() { return &sFactionStore; }
+TRINITY_DLL_SPEC DBCStorage <ItemEntry> const* GetItemDisplayStore() { return &sItemStore; }
+TRINITY_DLL_SPEC DBCStorage <CreatureDisplayInfoEntry> const* GetCreatureDisplayStore() { return &sCreatureDisplayInfoStore; }
diff --git a/src/shared/Database/DBCStores.h b/src/shared/Database/DBCStores.h
index dd255894ded..6b5f5990eea 100644
--- a/src/shared/Database/DBCStores.h
+++ b/src/shared/Database/DBCStores.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -132,9 +132,14 @@ class DBCStorage
StringPoolList m_stringPoolList;
};
+extern DBCStorage <AchievementEntry> sAchievementStore;
+extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore;
extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions
+extern DBCStorage <AreaGroupEntry> sAreaGroupStore;
extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore;
+extern DBCStorage <AuctionHouseEntry> sAuctionHouseStore;
extern DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore;
+extern DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore;
extern DBCStorage <BattlemasterListEntry> sBattlemasterListStore;
//extern DBCStorage <ChatChannelsEntry> sChatChannelsStore; -- accessed using function, no usable index
extern DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore;
@@ -144,13 +149,17 @@ extern DBCStorage <ChrRacesEntry> sChrRacesStore;
extern DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore;
extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore;
+extern DBCStorage <CreatureTypeEntry> sCreatureTypeStore;
extern DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore;
extern DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore;
extern DBCStorage <EmotesTextEntry> sEmotesTextStore;
extern DBCStorage <FactionEntry> sFactionStore;
extern DBCStorage <FactionTemplateEntry> sFactionTemplateStore;
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;
@@ -163,6 +172,7 @@ extern DBCStorage <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore;
extern DBCStorage <ItemEntry> sItemStore;
//extern DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore; -- not used currently
extern DBCStorage <ItemExtendedCostEntry> sItemExtendedCostStore;
+extern DBCStorage <ItemLimitCategoryEntry> sItemLimitCategoryStore;
extern DBCStorage <ItemRandomPropertiesEntry> sItemRandomPropertiesStore;
extern DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore;
extern DBCStorage <ItemSetEntry> sItemSetStore;
@@ -171,6 +181,8 @@ extern DBCStorage <MailTemplateEntry> sMailTemplateStore;
extern DBCStorage <MapEntry> sMapStore;
extern DBCStorage <QuestSortEntry> sQuestSortStore;
extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore;
+extern DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore;
+extern DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore;
extern DBCStorage <SkillLineEntry> sSkillLineStore;
extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore;
extern DBCStorage <SoundEntriesEntry> sSoundEntriesStore;
@@ -183,9 +195,11 @@ extern SpellCategoryStore sSpellCategoryStore;
extern PetFamilySpellsStore sPetFamilySpellsStore;
extern DBCStorage <SpellRadiusEntry> sSpellRadiusStore;
extern DBCStorage <SpellRangeEntry> sSpellRangeStore;
+extern DBCStorage <SpellRuneCostEntry> sSpellRuneCostStore;
extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore;
extern DBCStorage <SpellEntry> sSpellStore;
extern DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore;
+//extern DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore;
extern DBCStorage <TalentEntry> sTalentStore;
extern DBCStorage <TalentTabEntry> sTalentTabStore;
extern DBCStorage <TaxiNodesEntry> sTaxiNodesStore;
@@ -194,8 +208,11 @@ extern TaxiMask sTaxiNodesMask;
extern TaxiPathSetBySource sTaxiPathSetBySource;
extern TaxiPathNodesByPath sTaxiPathNodesByPath;
extern DBCStorage <TotemCategoryEntry> sTotemCategoryStore;
+extern DBCStorage <VehicleEntry> sVehicleStore;
+extern DBCStorage <VehicleSeatEntry> sVehicleSeatStore;
//extern DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore; -- use Zone2MapCoordinates and Map2ZoneCoordinates
extern DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore;
+extern DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore;
void LoadDBCStores(const std::string& dataPath);
@@ -203,5 +220,8 @@ void LoadDBCStores(const std::string& dataPath);
TRINITY_DLL_SPEC DBCStorage <SoundEntriesEntry> const* GetSoundEntriesStore();
TRINITY_DLL_SPEC DBCStorage <SpellEntry> const* GetSpellStore();
TRINITY_DLL_SPEC DBCStorage <SpellRangeEntry> const* GetSpellRangeStore();
+TRINITY_DLL_SPEC DBCStorage <FactionEntry> const* GetFactionStore();
+TRINITY_DLL_SPEC DBCStorage <ItemEntry> const* GetItemDisplayStore();
+TRINITY_DLL_SPEC DBCStorage <CreatureDisplayInfoEntry> const* GetCreatureDisplayStore();
#endif
diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h
index 2f51f1d6579..975dbf300f1 100644
--- a/src/shared/Database/DBCStructure.h
+++ b/src/shared/Database/DBCStructure.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -23,6 +23,7 @@
#include "DBCEnums.h"
#include "Platform/Define.h"
+#include "Util.h"
#include <map>
#include <set>
@@ -37,57 +38,529 @@
#pragma pack(push,1)
#endif
-struct AreaTableEntry
+struct AchievementEntry
+{
+ uint32 ID; // 0
+ uint32 factionFlag; // 1 -1=all, 0=horde, 1=alliance
+ uint32 mapID; // 2 -1=none
+ //uint32 parentAchievement; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin)
+ //char *name[16]; // 4-19
+ //uint32 name_flags; // 20
+ //char *description[16]; // 21-36
+ //uint32 desc_flags; // 37
+ uint32 categoryId; // 38
+ uint32 points; // 39 reward points
+ //uint32 OrderInCategory; // 40
+ uint32 flags; // 41
+ //uint32 icon; // 42 icon (from SpellIcon.dbc)
+ //char *titleReward[16]; // 43-58
+ //uint32 titleReward_flags; // 59
+ //uint32 count; // 60 - need this count Criteria for complete
+ uint32 refAchievement; // 61 - related achievement?
+};
+
+struct AchievementCategoryEntry
{
uint32 ID; // 0
- uint32 mapid; // 1
- uint32 zone; // 2 if 0 then it's zone, else it's zone id of this area
- uint32 exploreFlag; // 3, main index
- uint32 flags; // 4, unknown value but 312 for all cities
+ uint32 parentCategory; // 1 -1 for main category
+ //char *name[16]; // 2-17
+ //uint32 name_flags; // 18
+ //uint32 sortOrder; // 19
+};
+
+struct AchievementCriteriaEntry
+{
+ uint32 ID; // 0
+ uint32 referredAchievement; // 1
+ uint32 requiredType; // 2
+ union
+ {
+ // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
+ // TODO: also used for player deaths..
+ struct
+ {
+ uint32 creatureID; // 3
+ uint32 creatureCount; // 4
+ } kill_creature;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
+ // TODO: there are further criterias instead just winning
+ struct
+ {
+ uint32 bgMapID; // 3
+ uint32 winCount; // 4
+ } win_bg;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
+ struct
+ {
+ uint32 unused; // 3
+ uint32 level; // 4
+ } reach_level;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
+ struct
+ {
+ uint32 skillID; // 3
+ uint32 skillLevel; // 4
+ } reach_skill_level;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
+ struct
+ {
+ uint32 linkedAchievement; // 3
+ } complete_achievement;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9
+ struct
+ {
+ uint32 unused; // 3
+ uint32 totalQuestCount; // 4
+ } complete_quest_count;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10
+ struct
+ {
+ uint32 unused; // 3
+ uint32 numberOfDays; // 4
+ } complete_daily_quest_daily;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
+ struct
+ {
+ uint32 zoneID; // 3
+ uint32 questCount; // 4
+ } complete_quests_in_zone;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14
+ struct
+ {
+ uint32 unused; // 3
+ uint32 questCount; // 4
+ } complete_daily_quest;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15
+ struct
+ {
+ uint32 mapID; // 3
+ } complete_battleground;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16
+ struct
+ {
+ uint32 mapID; // 3
+ } death_at_map;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
+ struct
+ {
+ uint32 groupSize; // 3 can be 5, 10 or 25
+ } complete_raid;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
+ struct
+ {
+ uint32 creatureEntry; // 3
+ } killed_by_creature;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24
+ struct
+ {
+ uint32 unused; // 3
+ uint32 fallHeight; // 4
+ } fall_without_dying;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
+ struct
+ {
+ uint32 type; // 0 - fatigue, 1 - drowning, 2 - falling, 3 - ??, 5 - fire and lava
+ } deaths;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27
+ struct
+ {
+ uint32 questID; // 3
+ uint32 questCount; // 4
+ } complete_quest;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
+ // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2= 69
+ struct
+ {
+ uint32 spellID; // 3
+ uint32 spellCount; // 4
+ } be_spell_target;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL= 29
+ // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110
+ struct
+ {
+ uint32 spellID; // 3
+ uint32 castCount; // 4
+ } cast_spell;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
+ struct
+ {
+ uint32 areaID; // 3 Reference to AreaTable.dbc
+ uint32 killCount; // 4
+ } honorable_kill_at_area;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
+ struct
+ {
+ uint32 mapID; // 3 Reference to Map.dbc
+ } win_arena;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
+ struct
+ {
+ uint32 mapID; // 3 Reference to Map.dbc
+ } play_arena;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
+ struct
+ {
+ uint32 spellID; // 3 Reference to Map.dbc
+ } learn_spell;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36
+ struct
+ {
+ uint32 itemID; // 3
+ uint32 itemCount; // 4
+ } own_item;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37
+ struct
+ {
+ uint32 unused; // 3
+ uint32 count; // 4
+ uint32 flag; // 5 4=in a row
+ } win_rated_arena;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
+ struct
+ {
+ uint32 teamtype; // 3 {2,3,5}
+ } highest_team_rating;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
+ struct
+ {
+ uint32 teamtype; // 3 {2,3,5}
+ uint32 teamrating; // 4
+ } reach_team_rating;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
+ struct
+ {
+ uint32 skillID; // 3
+ uint32 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6
+ } learn_skill_level;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
+ struct
+ {
+ uint32 itemID; // 3
+ uint32 itemCount; // 4
+ } use_item;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
+ struct
+ {
+ uint32 itemID; // 3
+ uint32 itemCount; // 4
+ } loot_item;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
+ struct
+ {
+ // TODO: This rank is _NOT_ the index from AreaTable.dbc
+ uint32 areaReference; // 3
+ } explore_area;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK= 44
+ struct
+ {
+ // TODO: This rank is _NOT_ the index from CharTitles.dbc
+ uint32 rank; // 3
+ } own_rank;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT= 45
+ struct
+ {
+ uint32 unused; // 3
+ uint32 numberOfSlots; // 4
+ } buy_bank_slot;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION= 46
+ struct
+ {
+ uint32 factionID; // 3
+ uint32 reputationAmount; // 4 Total reputation amount, so 42000 = exalted
+ } gain_reputation;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47
+ struct
+ {
+ uint32 unused; // 3
+ uint32 numberOfExaltedFactions; // 4
+ } gain_exalted_reputation;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48
+ struct
+ {
+ uint32 unused; // 3
+ uint32 numberOfVisits; // 4
+ } visit_barber;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
+ // TODO: where is the required itemlevel stored?
+ struct
+ {
+ uint32 itemSlot; // 3
+ } equip_epic_item;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT= 50
+ struct
+ {
+ uint32 rollValue; // 3
+ uint32 count; // 4
+ } roll_need_on_loot;
+ // ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT= 51
+ struct
+ {
+ uint32 rollValue; // 3
+ uint32 count; // 4
+ } roll_greed_on_loot;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
+ struct
+ {
+ uint32 classID; // 3
+ uint32 count; // 4
+ } hk_class;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
+ struct
+ {
+ uint32 raceID; // 3
+ uint32 count; // 4
+ } hk_race;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
+ // TODO: where is the information about the target stored?
+ struct
+ {
+ uint32 emoteID; // 3
+ } do_emote;
+ // ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13
+ // ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55
+ // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
+ struct
+ {
+ uint32 unused; // 3
+ uint32 count; // 4
+ uint32 flag; // 5 =3 for battleground healing
+ uint32 mapid; // 6
+ } healing_done;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
+ struct
+ {
+ uint32 itemID; // 3
+ } equip_item;
+
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67
+ struct
+ {
+ uint32 unused; // 3
+ uint32 goldInCopper; // 4
+ } loot_money;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
+ struct
+ {
+ uint32 goEntry; // 3
+ uint32 useCount; // 4
+ } use_gameobject;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70
+ // TODO: are those special criteria stored in the dbc or do we have to add another sql table?
+ struct
+ {
+ uint32 unused; // 3
+ uint32 killCount; // 4
+ } special_pvp_kill;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
+ struct
+ {
+ uint32 goEntry; // 3
+ uint32 lootCount; // 4
+ } fish_in_gameobject;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75
+ struct
+ {
+ uint32 skillLine; // 3
+ uint32 spellCount; // 4
+ } learn_skilline_spell;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
+ struct
+ {
+ uint32 unused; // 3
+ uint32 duelCount; // 4
+ } win_duel;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
+ struct
+ {
+ uint32 powerType; // 3 mana=0, 1=rage, 3=energy, 6=runic power
+ } highest_power;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
+ struct
+ {
+ uint32 statType; // 3 4=spirit, 3=int, 2=stamina, 1=agi, 0=strength
+ } highest_stat;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
+ struct
+ {
+ uint32 spellSchool; // 3
+ } highest_spellpower;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100
+ struct
+ {
+ uint32 ratingType; // 3
+ } highest_rating;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
+ struct
+ {
+ uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant
+ uint32 lootTypeCount; // 4
+ } loot_type;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112
+ struct
+ {
+ uint32 skillLine; // 3
+ uint32 spellCount; // 4
+ } learn_skill_line;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113
+ struct
+ {
+ uint32 unused; // 3
+ uint32 killCount; // 4
+ } honorable_kill;
+
+ struct
+ {
+ uint32 field3; // 3 main requirement
+ uint32 field4; // 4 main requirement count
+ uint32 additionalRequirement1_type; // 5 additional requirement 1 type
+ uint32 additionalRequirement1_value; // 6 additional requirement 1 value
+ uint32 additionalRequirement2_type; // 7 additional requirement 2 type
+ uint32 additionalRequirement2_value; // 8 additional requirement 1 value
+ } raw;
+ };
+ //char* name[16]; // 9-24
+ //uint32 name_flags; // 25
+ uint32 completionFlag; // 26
+ uint32 groupFlag; // 27
+ //uint32 unk1; // 28
+ uint32 timeLimit; // 29 time limit in seconds
+ //uint32 showOrder; // 30 show order
+};
+
+struct AreaTableEntry
+{
+ uint32 ID; // 0
+ uint32 mapid; // 1
+ uint32 zone; // 2 if 0 then it's zone, else it's zone id of this area
+ uint32 exploreFlag; // 3, main index
+ uint32 flags; // 4, unknown value but 312 for all cities
// 5-9 unused
- int32 area_level; // 10
- char* area_name[16]; // 11-26
+ int32 area_level; // 10
+ char* area_name[16]; // 11-26
// 27, string flags, unused
- uint32 team; // 28
+ uint32 team; // 28
+};
+
+struct AreaGroupEntry
+{
+ uint32 AreaGroupId; // 0
+ uint32 AreaId[7]; // 1-7
};
struct AreaTriggerEntry
{
- uint32 id; // 0
- uint32 mapid; // 1
- float x; // 2
- float y; // 3
- float z; // 4
- float radius; // 5
- float box_x; // 6 extent x edge
- float box_y; // 7 extent y edge
- float box_z; // 8 extent z edge
- float box_orientation; // 9 extent rotation by about z axis
+ uint32 id; // 0 m_ID
+ uint32 mapid; // 1 m_ContinentID
+ float x; // 2 m_x
+ float y; // 3 m_y
+ float z; // 4 m_z
+ float radius; // 5 m_radius
+ float box_x; // 6 m_box_length
+ float box_y; // 7 m_box_width
+ float box_z; // 8 m_box_heigh
+ float box_orientation; // 9 m_box_yaw
+};
+
+struct AuctionHouseEntry
+{
+ uint32 houseId; // 0 index
+ uint32 faction; // 1 id of faction.dbc for player factions associated with city
+ uint32 depositPercent; // 2 1/3 from real
+ uint32 cutPercent; // 3
+ //char* name[16]; // 4-19
+ // 20 string flag, unused
};
struct BankBagSlotPricesEntry
{
- uint32 ID;
- uint32 price;
+ uint32 ID;
+ uint32 price;
+};
+
+struct BarberShopStyleEntry
+{
+ uint32 Id; // 0
+ uint32 type; // 1 value 0 -> hair, value 2 -> facialhair
+ //char* name[16]; // 2-17 name of hair style
+ //uint32 name_flags; // 18
+ //uint32 unk_name[16]; // 19-34, all empty
+ //uint32 unk_flags; // 35
+ //float CostMultiplier; // 36 values 1 and 0.75
+ uint32 race; // 37 race
+ uint32 gender; // 38 0 -> male, 1 -> female
+ uint32 hair_id; // 39 real ID to hair/facial hair
};
struct BattlemasterListEntry
{
- uint32 id; // 0
- uint32 mapid[3]; // 1-3 mapid
- // 4-8 unused
- uint32 type; // 9 (3 - BG, 4 - arena)
- uint32 minlvl; // 10
- uint32 maxlvl; // 11
- uint32 maxplayersperteam; // 12
- // 13-14 unused
- char* name[16]; // 15-30
- // 31 string flag, unused
- // 32 unused
+ uint32 id; // 0
+ int32 mapid[8]; // 1-8 mapid
+ uint32 type; // 9 (3 - BG, 4 - arena)
+ uint32 minlvl; // 10
+ uint32 maxlvl; // 11
+ uint32 maxplayersperteam; // 12
+ // 13 minplayers
+ // 14 0 or 9
+ // 15
+ char* name[16]; // 16-31
+ // 32 string flag, unused
+ // 33 unused
};
-#define MAX_OUTFIT_ITEMS 12
-// #define MAX_OUTFIT_ITEMS 24 // 12->24 in 3.0.x
+#define MAX_OUTFIT_ITEMS 24
struct CharStartOutfitEntry
{
@@ -103,20 +576,20 @@ struct CharStartOutfitEntry
struct CharTitlesEntry
{
- uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId()
+ uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId()
//uint32 unk1; // 1 flags?
//char* name[16]; // 2-17, unused
// 18 string flag, unused
//char* name2[16]; // 19-34, unused
// 35 string flag, unused
- uint32 bit_index; // 36 used in PLAYER_CHOSEN_TITLE and 1<<index in PLAYER__FIELD_KNOWN_TITLES
+ uint32 bit_index; // 36 used in PLAYER_CHOSEN_TITLE and 1<<index in PLAYER__FIELD_KNOWN_TITLES
};
struct ChatChannelsEntry
{
- uint32 ChannelID; // 0
- uint32 flags; // 1
- char* pattern[16]; // 3-18
+ uint32 ChannelID; // 0
+ uint32 flags; // 1
+ char* pattern[16]; // 3-18
// 19 string flags, unused
//char* name[16]; // 20-35 unused
// 36 string flag, unused
@@ -124,20 +597,21 @@ struct ChatChannelsEntry
struct ChrClassesEntry
{
- uint32 ClassID; // 0
- // 1-2, unused
- uint32 powerType; // 3
- // 4, unused
+ uint32 ClassID; // 0
+ // 1, unused
+ uint32 powerType; // 2
+ // 3-4, unused
//char* name[16]; // 5-20 unused
- char* name[16]; // 5-20 unused
// 21 string flag, unused
//char* nameFemale[16]; // 21-36 unused, if different from base (male) case
// 37 string flag, unused
//char* nameNeutralGender[16]; // 38-53 unused, if different from base (male) case
// 54 string flag, unused
// 55, unused
- uint32 spellfamily; // 56
+ uint32 spellfamily; // 56
// 57, unused
+ uint32 CinematicSequence; // 58 id from CinematicSequences.dbc
+ uint32 addon; // 59 (0 - original race, 1 - tbc addon, ...)
};
struct ChrRacesEntry
@@ -151,7 +625,7 @@ struct ChrRacesEntry
// 6-7 unused
uint32 TeamID; // 8 (7-Alliance 1-Horde)
// 9-12 unused
- uint32 startmovie; // 13 id from CinematicCamera.dbc
+ uint32 CinematicSequence; // 13 id from CinematicSequences.dbc
char* name[16]; // 14-29 used for DBC language detection/selection
// 30 string flags, unused
//char* nameFemale[16]; // 31-46, if different from base (male) case
@@ -164,30 +638,51 @@ struct ChrRacesEntry
struct CreatureDisplayInfoEntry
{
- uint32 Displayid; // 0
- // 1-3,unused
- float scale; // 4
- // 5-13,unused
+ uint32 Displayid; // 0 m_ID
+ // 1 m_modelID
+ // 2 m_soundID
+ // 3 m_extendedDisplayInfoID
+ float scale; // 4 m_creatureModelScale
+ // 5 m_creatureModelAlpha
+ // 6-8 m_textureVariation[3]
+ // 9 m_portraitTextureName
+ // 10 m_sizeClass
+ // 11 m_bloodID
+ // 12 m_NPCSoundID
+ // 13 m_particleColorID
+ // 14 m_creatureGeosetData
+ // 15 m_objectEffectPackageID
};
struct CreatureFamilyEntry
{
- uint32 ID; // 0
- float minScale; // 1
- uint32 minScaleLevel; // 2 0/1
- float maxScale; // 3
- uint32 maxScaleLevel; // 4 0/60
- uint32 skillLine[2]; // 5-6
- uint32 petFoodMask; // 7
- char* Name[16]; // 8-23
- // 24 string flags, unused
- // 25 icon, unused
+ uint32 ID; // 0 m_ID
+ float minScale; // 1 m_minScale
+ uint32 minScaleLevel; // 2 m_minScaleLevel
+ float maxScale; // 3 m_maxScale
+ uint32 maxScaleLevel; // 4 m_maxScaleLevel
+ uint32 skillLine[2]; // 5-6 m_skillLine
+ uint32 petFoodMask; // 7 m_petFoodMask
+ int32 petTalentType; // 8 m_petTalentType
+ // 9 m_categoryEnumID
+ char* Name[16]; // 10-25 m_name_lang
+ // 26 string flags
+ // 27 m_iconFile
};
struct CreatureSpellDataEntry
{
- uint32 ID; // 0
- //uint32 spellId[4]; // 1-4 hunter pet learned spell (for later use)
+ uint32 ID; // 0 m_ID
+ //uint32 spellId[4]; // 1-4 m_spells[4]
+ //uint32 availability[4]; // 4-7 m_availability[4]
+};
+
+struct CreatureTypeEntry
+{
+ uint32 ID; // 0 m_ID
+ //char* Name[16]; // 1-16 name
+ // 17 string flags
+ //uint32 no_expirience; // 18 no exp? critters, non-combat pets, gas cloud.
};
struct DurabilityCostsEntry
@@ -204,41 +699,35 @@ struct DurabilityQualityEntry
struct EmotesTextEntry
{
- uint32 Id;
- uint32 textid;
+ uint32 Id;
+ uint32 textid;
};
struct FactionEntry
{
- uint32 ID; // 0
- int32 reputationListID; // 1
- uint32 BaseRepRaceMask[4]; // 2-5 Base reputation race masks (see enum Races)
- uint32 BaseRepClassMask[4]; // 6-9 Base reputation class masks (see enum Classes)
- int32 BaseRepValue[4]; // 10-13 Base reputation values
- uint32 ReputationFlags[4]; // 14-17 Default flags to apply
- uint32 team; // 18 enum Team
- char* name[16]; // 19-34
- // 35 string flags, unused
- //char* description[16]; // 36-51 unused
- // 52 string flags, unused
+ uint32 ID; // 0 m_ID
+ int32 reputationListID; // 1 m_reputationIndex
+ uint32 BaseRepRaceMask[4]; // 2-5 m_reputationRaceMask
+ uint32 BaseRepClassMask[4]; // 6-9 m_reputationClassMask
+ int32 BaseRepValue[4]; // 10-13 m_reputationBase
+ uint32 ReputationFlags[4]; // 14-17 m_reputationFlags
+ uint32 team; // 18 m_parentFactionID
+ char* name[16]; // 19-34 m_name_lang
+ // 35 string flags
+ //char* description[16]; // 36-51 m_description_lang
+ // 52 string flags
};
struct FactionTemplateEntry
{
- uint32 ID; // 0
- uint32 faction; // 1
- uint32 factionFlags; // 2 specific flags for that faction
- uint32 ourMask; // 3 if mask set (see FactionMasks) then faction included in masked team
- uint32 friendlyMask; // 4 if mask set (see FactionMasks) then faction friendly to masked team
- uint32 hostileMask; // 5 if mask set (see FactionMasks) then faction hostile to masked team
- uint32 enemyFaction1; // 6
- uint32 enemyFaction2; // 7
- uint32 enemyFaction3; // 8
- uint32 enemyFaction4; // 9
- uint32 friendFaction1; // 10
- uint32 friendFaction2; // 11
- uint32 friendFaction3; // 12
- uint32 friendFaction4; // 13
+ uint32 ID; // 0 m_ID
+ uint32 faction; // 1 m_faction
+ uint32 factionFlags; // 2 m_flags
+ uint32 ourMask; // 3 m_factionGroup
+ uint32 friendlyMask; // 4 m_friendGroup
+ uint32 hostileMask; // 5 m_enemyGroup
+ uint32 enemyFaction[4]; // 6 m_enemies[4]
+ uint32 friendFaction[4]; // 10 m_friend[4]
//------------------------------------------------------- end structure
// helpers
@@ -246,9 +735,9 @@ struct FactionTemplateEntry
{
if(ID == entry.ID)
return true;
- if(enemyFaction1 == entry.faction || enemyFaction2 == entry.faction || enemyFaction3 == entry.faction || enemyFaction4 == entry.faction )
+ if(enemyFaction[0] == entry.faction || enemyFaction[1] == entry.faction || enemyFaction[2] == entry.faction || enemyFaction[3] == entry.faction )
return false;
- if(friendFaction1 == entry.faction || friendFaction2 == entry.faction || friendFaction3 == entry.faction || friendFaction4 == entry.faction )
+ if(friendFaction[0] == entry.faction || friendFaction[1] == entry.faction || friendFaction[2] == entry.faction || friendFaction[3] == entry.faction )
return true;
return (friendlyMask & entry.ourMask) || (ourMask & entry.friendlyMask);
}
@@ -256,14 +745,14 @@ struct FactionTemplateEntry
{
if(ID == entry.ID)
return false;
- if(enemyFaction1 == entry.faction || enemyFaction2 == entry.faction || enemyFaction3 == entry.faction || enemyFaction4 == entry.faction )
+ if(enemyFaction[0] == entry.faction || enemyFaction[1] == entry.faction || enemyFaction[2] == entry.faction || enemyFaction[3] == entry.faction )
return true;
- if(friendFaction1 == entry.faction || friendFaction2 == entry.faction || friendFaction3 == entry.faction || friendFaction4 == entry.faction )
+ if(friendFaction[0] == entry.faction || friendFaction[1] == entry.faction || friendFaction[2] == entry.faction || friendFaction[3] == entry.faction )
return false;
return (hostileMask & entry.ourMask) != 0;
}
bool IsHostileToPlayers() const { return (hostileMask & FACTION_MASK_PLAYER) !=0; }
- bool IsNeutralToAll() const { return hostileMask == 0 && friendlyMask == 0 && enemyFaction1==0 && enemyFaction2==0 && enemyFaction3==0 && enemyFaction4==0; }
+ bool IsNeutralToAll() const { return hostileMask == 0 && friendlyMask == 0 && enemyFaction[0]==0 && enemyFaction[1]==0 && enemyFaction[2]==0 && enemyFaction[3]==0; }
bool IsContestedGuardFaction() const { return (factionFlags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD)!=0; }
};
@@ -274,9 +763,29 @@ struct GemPropertiesEntry
uint32 color;
};
+struct GlyphPropertiesEntry
+{
+ uint32 Id;
+ uint32 SpellId;
+ uint32 TypeFlags;
+ uint32 Unk1; // GlyphIconId (SpellIcon.dbc)
+};
+
+struct GlyphSlotEntry
+{
+ uint32 Id;
+ uint32 TypeFlags;
+ uint32 Order;
+};
+
// All Gt* DBC store data for 100 levels, some by 100 per class/race
#define GT_MAX_LEVEL 100
+struct GtBarberShopCostBaseEntry
+{
+ float cost;
+};
+
struct GtCombatRatingsEntry
{
float ratio;
@@ -324,24 +833,38 @@ struct GtRegenMPPerSptEntry
struct ItemEntry
{
- uint32 ID;
- uint32 DisplayId;
- uint32 InventoryType;
- uint32 Sheath;
+ uint32 ID; // 0
+ uint32 Class; // 1
+ //uint32 SubClass; // 2 some items have strnage subclasses
+ int32 Unk0; // 3
+ int32 Material; // 4
+ uint32 DisplayId; // 5
+ uint32 InventoryType; // 6
+ uint32 Sheath; // 7
};
struct ItemDisplayInfoEntry
{
- uint32 ID;
- uint32 randomPropertyChance;
+ uint32 ID; // 0 m_ID
+ // 1 m_modelName[2]
+ // 2 m_modelTexture[2]
+ // 3 m_inventoryIcon
+ // 4 m_geosetGroup[3]
+ // 5 m_flags
+ // 6 m_spellVisualID
+ // 7 m_groupSoundIndex
+ // 8 m_helmetGeosetVis[2]
+ // 9 m_texture[2]
+ // 10 m_itemVisual[8]
+ // 11 m_particleColorID
};
//struct ItemCondExtCostsEntry
//{
// uint32 ID;
-// uint32 condExtendedCost; // ItemPrototype::CondExtendedCost
-// uint32 itemextendedcostentry; // ItemPrototype::ExtendedCost
-// uint32 arenaseason; // arena season number(1-4)
+// uint32 condExtendedCost; // ItemPrototype::CondExtendedCost
+// uint32 itemextendedcostentry; // ItemPrototype::ExtendedCost
+// uint32 arenaseason; // arena season number(1-4)
//};
struct ItemExtendedCostEntry
@@ -354,49 +877,53 @@ struct ItemExtendedCostEntry
uint32 reqpersonalarenarating; // 13 required personal arena rating
};
+struct ItemLimitCategoryEntry
+{
+ uint32 ID; // 0 Id
+ //char* name[16] // 1-16 m_name_lang
+ // 17 name flags
+ uint32 maxCount; // max allowed equipped as item or in gem slot
+ //uint32 unk; // 1 for prismatic gems only...
+};
+
struct ItemRandomPropertiesEntry
{
- uint32 ID; // 0
- //char* internalName // 1 unused
- uint32 enchant_id[3]; // 2-4
- // 5-6 unused, 0 only values, reserved for additional enchantments?
- //char* nameSuffix[16] // 7-22, unused
- // 23 nameSufix flags, unused
+ uint32 ID; // 0 m_ID
+ //char* internalName // 1 m_Name
+ uint32 enchant_id[5]; // 2-6 m_Enchantment
+ //char* nameSuffix[16] // 7-22 m_name_lang
+ // 23 name flags
};
struct ItemRandomSuffixEntry
{
- uint32 ID; // 0
- //char* name[16] // 1-16 unused
- // 17, name flags, unused
- // 18 unused
- uint32 enchant_id[3]; // 19-21
- uint32 prefix[3]; // 22-24
+ uint32 ID; // 0 m_ID
+ //char* name[16] // 1-16 m_name_lang
+ // 17, name flags
+ // 18 m_internalName
+ uint32 enchant_id[5]; // 19-21 m_enchantment
+ uint32 prefix[5]; // 22-24 m_allocationPct
};
struct ItemSetEntry
{
- //uint32 id // 0 item set ID
- char* name[16]; // 1-16
+ //uint32 id // 0 m_ID
+ char* name[16]; // 1-16 m_name_lang
// 17 string flags, unused
- // 18-28 items from set, but not have all items listed, use ItemPrototype::ItemSet instead
- // 29-34 unused
- uint32 spells[8]; // 35-42
- uint32 items_to_triggerspell[8]; // 43-50
- uint32 required_skill_id; // 51
- uint32 required_skill_value; // 52
+ //uint32 itemId[17]; // 18-34 m_itemID
+ uint32 spells[8]; // 35-42 m_setSpellID
+ uint32 items_to_triggerspell[8]; // 43-50 m_setThreshold
+ uint32 required_skill_id; // 51 m_requiredSkill
+ uint32 required_skill_value; // 52 m_requiredSkillRank
};
struct LockEntry
{
- uint32 ID; // 0
- uint32 keytype[5]; // 1-5
- // 6-8, not used
- uint32 key[5]; // 9-13
- // 14-16, not used
- uint32 requiredminingskill; // 17
- uint32 requiredlockskill; // 18
- // 19-32, not used
+ uint32 ID; // 0 m_ID
+ uint32 Type[8]; // 1-8 m_Type
+ uint32 Index[8]; // 9-16 m_Index
+ uint32 Skill[8]; // 17-24 m_Skill
+ //uint32 Action[8]; // 25-32 m_Action
};
struct MailTemplateEntry
@@ -409,35 +936,34 @@ struct MailTemplateEntry
struct MapEntry
{
- uint32 MapID; // 0
+ uint32 MapID; // 0
//char* internalname; // 1 unused
- uint32 map_type; // 2
- // 3 unused
- char* name[16]; // 4-19
+ uint32 map_type; // 2
+ // 3 0 or 1 for battlegrounds (not arenas)
+ char* name[16]; // 4-19
// 20 name flags, unused
- // 21-23 unused (something PvPZone related - levels?)
- // 24-26
- uint32 linked_zone; // 27 common zone for instance and continent map
- //char* hordeIntro // 28-43 text for PvP Zones
- // 44 intro text flags
- //char* allianceIntro // 45-60 text for PvP Zones
- // 46 intro text flags
- // 47-61 not used
- uint32 multimap_id; // 62
- // 63-65 not used
- //chat* unknownText1 // 66-81 unknown empty text fields, possible normal Intro text.
- // 82 text flags
- //chat* heroicIntroText // 83-98 heroic mode requirement text
- // 99 text flags
- //chat* unknownText2 // 100-115 unknown empty text fields
- // 116 text flags
- int32 entrance_map; // 117 map_id of entrance map
- float entrance_x; // 118 entrance x coordinate (if exist single entry)
- float entrance_y; // 119 entrance y coordinate (if exist single entry)
- uint32 resetTimeRaid; // 120
- uint32 resetTimeHeroic; // 121
- // 122-123
- uint32 addon; // 124 (0-original maps,1-tbc addon)
+ uint32 linked_zone; // 21 common zone for instance and continent map
+ //char* hordeIntro[16]; // 23-37 text for PvP Zones
+ // 38 intro text flags
+ //char* allianceIntro[16]; // 39-54 text for PvP Zones
+ // 55 intro text flags
+ uint32 multimap_id; // 56
+ // 57
+ //chat* unknownText1[16]; // 58-73 unknown empty text fields, possible normal Intro text.
+ // 74 text flags
+ //chat* heroicIntroText[16]; // 75-90 heroic mode requirement text
+ // 91 text flags
+ //chat* unknownText2[16]; // 92-107 unknown empty text fields
+ // 108 text flags
+ int32 entrance_map; // 109 map_id of entrance map
+ float entrance_x; // 110 entrance x coordinate (if exist single entry)
+ float entrance_y; // 111 entrance y coordinate (if exist single entry)
+ uint32 resetTimeRaid; // 112
+ uint32 resetTimeHeroic; // 113
+ // 114 all 0
+ // 115 -1, 0 and 720
+ uint32 addon; // 116 (0-original maps,1-tbc addon)
+ // 117 some kind of time?
// Helpers
uint32 Expansion() const { return addon; }
@@ -449,22 +975,29 @@ struct MapEntry
bool IsBattleGround() const { return map_type == MAP_BATTLEGROUND; }
bool IsBattleArena() const { return map_type == MAP_ARENA; }
bool IsBattleGroundOrArena() const { return map_type == MAP_BATTLEGROUND || map_type == MAP_ARENA; }
- bool SupportsHeroicMode() const { return resetTimeHeroic && !resetTimeRaid; }
+ bool SupportsHeroicMode() const { return resetTimeHeroic != 0; }
bool HasResetTime() const { return resetTimeHeroic || resetTimeRaid; }
bool IsMountAllowed() const
{
return !IsDungeon() ||
- MapID==568 || MapID==309 || MapID==209 || MapID==534 ||
- MapID==560 || MapID==509 || MapID==269;
+ MapID==209 || MapID==269 || MapID==309 || // TanarisInstance, CavernsOfTime, Zul'gurub
+ MapID==509 || MapID==534 || MapID==560 || // AhnQiraj, HyjalPast, HillsbradPast
+ MapID==568 || MapID==580 || MapID==615 || // ZulAman, Sunwell Plateau, Obsidian Sanctrum
+ MapID==616; // Eye Of Eternity
+ }
+
+ bool IsContinent() const
+ {
+ return MapID == 0 || MapID == 1 || MapID == 530 || MapID == 571;
}
};
struct QuestSortEntry
{
- uint32 id; // 0, sort id
- //char* name[16]; // 1-16, unused
- // 17 name flags, unused
+ uint32 id; // 0 m_ID
+ //char* name[16]; // 1-16 m_SortName_lang
+ // 17 name flags
};
struct RandomPropertiesPointsEntry
@@ -476,172 +1009,198 @@ struct RandomPropertiesPointsEntry
uint32 UncommonPropertiesPoints[5]; // 12-16
};
+struct ScalingStatDistributionEntry
+{
+ uint32 Id;
+ uint32 StatMod[10];
+ uint32 Modifier[10];
+ uint32 MaxLevel;
+};
+
+struct ScalingStatValuesEntry
+{
+ uint32 Id;
+ uint32 Level;
+ uint32 Multiplier[17];
+};
+
//struct SkillLineCategoryEntry{
-// uint32 id; // 0 hidden key
-// char* name[16]; // 1 - 17 Category name
-// // 18 string flag
-// uint32 displayOrder; // Display order in character tab
+// uint32 id; // 0 m_ID
+// char* name[16]; // 1-17 m_name_lang
+// // 18 string flag
+// uint32 displayOrder; // 19 m_sortIndex
//};
//struct SkillRaceClassInfoEntry{
-// uint32 id; // 0
-// uint32 skillId; // 1 present some refrences to unknown skill
-// uint32 raceMask; // 2
-// uint32 classMask; // 3
-// uint32 flags; // 4 mask for some thing
-// uint32 reqLevel; // 5
-// uint32 skillTierId; // 6
-// uint32 skillCostID; // 7
+// uint32 id; // 0 m_ID
+// uint32 skillId; // 1 m_skillID
+// uint32 raceMask; // 2 m_raceMask
+// uint32 classMask; // 3 m_classMask
+// uint32 flags; // 4 m_flags
+// uint32 reqLevel; // 5 m_minLevel
+// uint32 skillTierId; // 6 m_skillTierID
+// uint32 skillCostID; // 7 m_skillCostIndex
//};
//struct SkillTiersEntry{
-// uint32 id; // 0
-// uint32 skillValue[16]; // 1-17 unknown possibly add value on learn?
-// uint32 maxSkillValue[16]; // Max value for rank
+// uint32 id; // 0 m_ID
+// uint32 skillValue[16]; // 1-17 m_cost
+// uint32 maxSkillValue[16]; // 18-32 m_valueMax
//};
struct SkillLineEntry
{
- uint32 id; // 0
- uint32 categoryId; // 1 (index from SkillLineCategory.dbc)
- //uint32 skillCostID; // 2 not used
- char* name[16]; // 3-18
- // 19 string flags, not used
- //char* description[16]; // 20-35, not used
- // 36 string flags, not used
- uint32 spellIcon; // 37
+ uint32 id; // 0 m_ID
+ int32 categoryId; // 1 m_categoryID
+ //uint32 skillCostID; // 2 m_skillCostsID
+ char* name[16]; // 3-18 m_displayName_lang
+ // 19 string flags
+ //char* description[16]; // 20-35 m_description_lang
+ // 36 string flags
+ uint32 spellIcon; // 37 m_spellIconID
+ //char* alternateVerb[16]; // 38-53 m_alternateVerb_lang
+ // 54 string flags
+ // 55 m_canLink
};
struct SkillLineAbilityEntry
{
- uint32 id; // 0, INDEX
- uint32 skillId; // 1
- uint32 spellId; // 2
- uint32 racemask; // 3
- uint32 classmask; // 4
- //uint32 racemaskNot; // 5 always 0 in 2.4.2
- //uint32 classmaskNot; // 6 always 0 in 2.4.2
- uint32 req_skill_value; // 7 for trade skill.not for training.
- uint32 forward_spellid; // 8
- uint32 learnOnGetSkill; // 9 can be 1 or 2 for spells learned on get skill
- uint32 max_value; // 10
- uint32 min_value; // 11
- // 12-13, unknown, always 0
- uint32 reqtrainpoints; // 14
+ uint32 id; // 0 m_ID
+ uint32 skillId; // 1 m_skillLine
+ uint32 spellId; // 2 m_spell
+ uint32 racemask; // 3 m_raceMask
+ uint32 classmask; // 4 m_classMask
+ //uint32 racemaskNot; // 5 m_excludeRace
+ //uint32 classmaskNot; // 6 m_excludeClass
+ uint32 req_skill_value; // 7 m_minSkillLineRank
+ uint32 forward_spellid; // 8 m_supercededBySpell
+ uint32 learnOnGetSkill; // 9 m_acquireMethod
+ uint32 max_value; // 10 m_trivialSkillLineRankHigh
+ uint32 min_value; // 11 m_trivialSkillLineRankLow
+ //uint32 characterPoints[2]; // 12-13 m_characterPoints[2]
};
struct SoundEntriesEntry
{
- uint32 Id; // 0, sound id
- //uint32 Type; // 1, sound type (10 generally for creature, etc)
- //char* InternalName; // 2, internal name, for use in lookup command for example
- //char* FileName[10]; // 3-12, file names
- //uint32 Unk13[10]; // 13-22, linked with file names?
- //char* Path; // 23
- // 24-28, unknown
+ uint32 Id; // 0 m_ID
+ //uint32 Type; // 1 m_soundType
+ //char* InternalName; // 2 m_name
+ //char* FileName[10]; // 3-12 m_File[10]
+ //uint32 Unk13[10]; // 13-22 m_Freq[10]
+ //char* Path; // 23 m_DirectoryBase
+ // 24 m_volumeFloat
+ // 25 m_flags
+ // 26 m_minDistance
+ // 27 m_distanceCutoff
+ // 28 m_EAXDef
};
struct SpellEntry
{
- uint32 Id; // 0 normally counted from 0 field (but some tools start counting from 1, check this before tool use for data view!)
- uint32 Category; // 1
- //uint32 castUI // 2 not used
- uint32 Dispel; // 3
- uint32 Mechanic; // 4
- uint32 Attributes; // 5
- uint32 AttributesEx; // 6
- uint32 AttributesEx2; // 7
- uint32 AttributesEx3; // 8
- uint32 AttributesEx4; // 9
- uint32 AttributesEx5; // 10
- //uint32 AttributesEx6; // 11 not used
- uint32 Stances; // 12
- uint32 StancesNot; // 13
- uint32 Targets; // 14
- uint32 TargetCreatureType; // 15
- uint32 RequiresSpellFocus; // 16
- uint32 FacingCasterFlags; // 17
- uint32 CasterAuraState; // 18
- uint32 TargetAuraState; // 19
- uint32 CasterAuraStateNot; // 20
- uint32 TargetAuraStateNot; // 21
- uint32 CastingTimeIndex; // 22
- uint32 RecoveryTime; // 23
- uint32 CategoryRecoveryTime; // 24
- uint32 InterruptFlags; // 25
- uint32 AuraInterruptFlags; // 26
- uint32 ChannelInterruptFlags; // 27
- uint32 procFlags; // 28
- uint32 procChance; // 29
- uint32 procCharges; // 30
- uint32 maxLevel; // 31
- uint32 baseLevel; // 32
- uint32 spellLevel; // 33
- uint32 DurationIndex; // 34
- uint32 powerType; // 35
- uint32 manaCost; // 36
- uint32 manaCostPerlevel; // 37
- uint32 manaPerSecond; // 38
- uint32 manaPerSecondPerLevel; // 39
- uint32 rangeIndex; // 40
- float speed; // 41
- //uint32 modalNextSpell; // 42
- uint32 StackAmount; // 43
- uint32 Totem[2]; // 44-45
- int32 Reagent[8]; // 46-53
- uint32 ReagentCount[8]; // 54-61
- int32 EquippedItemClass; // 62 (value)
- int32 EquippedItemSubClassMask; // 63 (mask)
- int32 EquippedItemInventoryTypeMask; // 64 (mask)
- uint32 Effect[3]; // 65-67
- int32 EffectDieSides[3]; // 68-70
- uint32 EffectBaseDice[3]; // 71-73
- float EffectDicePerLevel[3]; // 74-76
- float EffectRealPointsPerLevel[3]; // 77-79
- int32 EffectBasePoints[3]; // 80-82 (don't must be used in spell/auras explicitly, must be used cached Spell::m_currentBasePoints)
- uint32 EffectMechanic[3]; // 83-85
- uint32 EffectImplicitTargetA[3]; // 86-88
- uint32 EffectImplicitTargetB[3]; // 89-91
- uint32 EffectRadiusIndex[3]; // 92-94 - spellradius.dbc
- uint32 EffectApplyAuraName[3]; // 95-97
- uint32 EffectAmplitude[3]; // 98-100
- float EffectMultipleValue[3]; // 101-103
- uint32 EffectChainTarget[3]; // 104-106
- uint32 EffectItemType[3]; // 107-109
- int32 EffectMiscValue[3]; // 110-112
- int32 EffectMiscValueB[3]; // 113-115
- uint32 EffectTriggerSpell[3]; // 116-118
- float EffectPointsPerComboPoint[3]; // 119-121
- uint32 SpellVisual; // 122
- // 123 not used
- uint32 SpellIconID; // 124
- uint32 activeIconID; // 125
- //uint32 spellPriority; // 126
- char* SpellName[16]; // 127-142
- //uint32 SpellNameFlag; // 143
- char* Rank[16]; // 144-159
- //uint32 RankFlags; // 160
- //char* Description[16]; // 161-176 not used
- //uint32 DescriptionFlags; // 177 not used
- //char* ToolTip[16]; // 178-193 not used
- //uint32 ToolTipFlags; // 194 not used
- uint32 ManaCostPercentage; // 195
- uint32 StartRecoveryCategory; // 196
- uint32 StartRecoveryTime; // 197
- uint32 MaxTargetLevel; // 198
- uint32 SpellFamilyName; // 199
- uint64 SpellFamilyFlags; // 200+201
- uint32 MaxAffectedTargets; // 202
- uint32 DmgClass; // 203 defenseType
- uint32 PreventionType; // 204
- //uint32 StanceBarOrder; // 205 not used
- float DmgMultiplier[3]; // 206-208
- //uint32 MinFactionId; // 209 not used, and 0 in 2.4.2
- //uint32 MinReputation; // 210 not used, and 0 in 2.4.2
- //uint32 RequiredAuraVision; // 211 not used
- uint32 TotemCategory[2]; // 212-213
- uint32 AreaId; // 214
- uint32 SchoolMask; // 215 school mask
+ uint32 Id; // 0 m_ID
+ uint32 Category; // 1 m_category
+ uint32 Dispel; // 2 m_dispelType
+ uint32 Mechanic; // 3 m_mechanic
+ uint32 Attributes; // 4 m_attribute
+ uint32 AttributesEx; // 5 m_attributesEx
+ uint32 AttributesEx2; // 6 m_attributesExB
+ uint32 AttributesEx3; // 7 m_attributesExC
+ uint32 AttributesEx4; // 8 m_attributesExD
+ uint32 AttributesEx5; // 9 m_attributesExE
+ //uint32 AttributesEx6; // 10 m_attributesExF not used
+ uint32 Stances; // 11 m_shapeshiftMask
+ uint32 StancesNot; // 12 m_shapeshiftExclude
+ uint32 Targets; // 13 m_targets
+ uint32 TargetCreatureType; // 14 m_targetCreatureType
+ uint32 RequiresSpellFocus; // 15 m_requiresSpellFocus
+ uint32 FacingCasterFlags; // 16 m_facingCasterFlags
+ uint32 CasterAuraState; // 17 m_casterAuraState
+ uint32 TargetAuraState; // 18 m_targetAuraState
+ uint32 CasterAuraStateNot; // 19 m_excludeCasterAuraState
+ uint32 TargetAuraStateNot; // 20 m_excludeTargetAuraState
+ uint32 casterAuraSpell; // 21 m_casterAuraSpell
+ uint32 targetAuraSpell; // 22 m_targetAuraSpell
+ uint32 excludeCasterAuraSpell; // 23 m_excludeCasterAuraSpell
+ uint32 excludeTargetAuraSpell; // 24 m_excludeTargetAuraSpell
+ uint32 CastingTimeIndex; // 25 m_castingTimeIndex
+ uint32 RecoveryTime; // 26 m_recoveryTime
+ uint32 CategoryRecoveryTime; // 27 m_categoryRecoveryTime
+ uint32 InterruptFlags; // 28 m_interruptFlags
+ uint32 AuraInterruptFlags; // 29 m_auraInterruptFlags
+ uint32 ChannelInterruptFlags; // 30 m_channelInterruptFlags
+ uint32 procFlags; // 31 m_procTypeMask
+ uint32 procChance; // 32 m_procChance
+ uint32 procCharges; // 33 m_procCharges
+ uint32 maxLevel; // 34 m_maxLevel
+ uint32 baseLevel; // 35 m_baseLevel
+ uint32 spellLevel; // 36 m_spellLevel
+ uint32 DurationIndex; // 37 m_durationIndex
+ uint32 powerType; // 38 m_powerType
+ uint32 manaCost; // 39 m_manaCost
+ uint32 manaCostPerlevel; // 40 m_manaCostPerLevel
+ uint32 manaPerSecond; // 41 m_manaPerSecond
+ uint32 manaPerSecondPerLevel; // 42 m_manaPerSecondPerLeve
+ uint32 rangeIndex; // 43 m_rangeIndex
+ float speed; // 44 m_speed
+ //uint32 modalNextSpell; // 45 m_modalNextSpell not used
+ uint32 StackAmount; // 46 m_cumulativeAura
+ uint32 Totem[2]; // 47-48 m_totem
+ int32 Reagent[8]; // 49-56 m_reagent
+ uint32 ReagentCount[8]; // 57-64 m_reagentCount
+ int32 EquippedItemClass; // 65 m_equippedItemClass (value)
+ int32 EquippedItemSubClassMask; // 66 m_equippedItemSubclass (mask)
+ int32 EquippedItemInventoryTypeMask; // 67 m_equippedItemInvTypes (mask)
+ uint32 Effect[3]; // 68-70 m_effect
+ int32 EffectDieSides[3]; // 71-73 m_effectDieSides
+ uint32 EffectBaseDice[3]; // 74-76 m_effectBaseDice
+ float EffectDicePerLevel[3]; // 77-79 m_effectDicePerLevel
+ float EffectRealPointsPerLevel[3]; // 80-82 m_effectRealPointsPerLevel
+ int32 EffectBasePoints[3]; // 83-85 m_effectBasePoints (don't must be used in spell/auras explicitly, must be used cached Spell::m_currentBasePoints)
+ uint32 EffectMechanic[3]; // 86-88 m_effectMechanic
+ uint32 EffectImplicitTargetA[3]; // 89-91 m_implicitTargetA
+ uint32 EffectImplicitTargetB[3]; // 92-94 m_implicitTargetB
+ uint32 EffectRadiusIndex[3]; // 95-97 m_effectRadiusIndex - spellradius.dbc
+ uint32 EffectApplyAuraName[3]; // 98-100 m_effectAura
+ uint32 EffectAmplitude[3]; // 101-103 m_effectAuraPeriod
+ float EffectMultipleValue[3]; // 104-106 m_effectAmplitude
+ uint32 EffectChainTarget[3]; // 107-109 m_effectChainTargets
+ uint32 EffectItemType[3]; // 110-112 m_effectItemType
+ int32 EffectMiscValue[3]; // 113-115 m_effectMiscValue
+ int32 EffectMiscValueB[3]; // 116-118 m_effectMiscValueB
+ uint32 EffectTriggerSpell[3]; // 119-121 m_effectTriggerSpell
+ float EffectPointsPerComboPoint[3]; // 122-124 m_effectPointsPerCombo
+ flag96 EffectSpellClassMask[3]; //
+ uint32 SpellVisual[2]; // 134-135 m_spellVisualID
+ uint32 SpellIconID; // 136 m_spellIconID
+ uint32 activeIconID; // 137 m_activeIconID
+ //uint32 spellPriority; // 138 not used
+ char* SpellName[16]; // 139-154 m_name_lang
+ //uint32 SpellNameFlag; // 155 not used
+ char* Rank[16]; // 156-171 m_nameSubtext_lang
+ //uint32 RankFlags; // 172 not used
+ //char* Description[16]; // 173-188 m_description_lang not used
+ //uint32 DescriptionFlags; // 189 not used
+ //char* ToolTip[16]; // 190-205 m_auraDescription_lang not used
+ //uint32 ToolTipFlags; // 206 not used
+ uint32 ManaCostPercentage; // 207 m_manaCostPct
+ uint32 StartRecoveryCategory; // 208 m_startRecoveryCategory
+ uint32 StartRecoveryTime; // 209 m_startRecoveryTime
+ uint32 MaxTargetLevel; // 210 m_maxTargetLevel
+ uint32 SpellFamilyName; // 211 m_spellClassSet
+ flag96 SpellFamilyFlags; // 212-214
+ uint32 MaxAffectedTargets; // 215 m_maxTargets
+ uint32 DmgClass; // 216 m_defenseType
+ uint32 PreventionType; // 217 m_preventionType
+ //uint32 StanceBarOrder; // 218 m_stanceBarOrder not used
+ float DmgMultiplier[3]; // 219-221 m_effectChainAmplitude
+ //uint32 MinFactionId; // 222 m_minFactionID not used
+ //uint32 MinReputation; // 223 m_minReputation not used
+ //uint32 RequiredAuraVision; // 224 m_requiredAuraVision not used
+ uint32 TotemCategory[2]; // 225-226 m_requiredTotemCategoryID
+ int32 AreaGroupId; // 227 m_requiredAreaGroupId
+ uint32 SchoolMask; // 228 m_schoolMask
+ uint32 runeCostID; // 229 m_runeCostID
+ //uint32 spellMissileID; // 230 m_spellMissileID not used
private:
// prevent creating custom entries (copy data from original in fact)
@@ -678,16 +1237,33 @@ struct SpellThreatEntry
struct SpellRadiusEntry
{
uint32 ID;
- float Radius;
- float Radius2;
+ float radiusHostile;
+ //uint32 Unk //always 0
+ float radiusFriend;
};
struct SpellRangeEntry
{
uint32 ID;
- float minRange;
- float maxRange;
+ float minRangeHostile;
+ float minRangeFriend;
+ float maxRangeHostile;
+ float maxRangeFriend; //friend means unattackable unit here
uint32 type;
+ //char* Name[16]; // 7-23 unused
+ // 24 string flags, unused
+ //char* Name2[16]; // 25-40 unused
+ // 41 string flags, unused
+};
+
+struct SpellRuneCostEntry
+{
+ uint32 ID; // 0
+ uint32 RuneCost[3]; // 1-3 (0=blood, 1=frost, 2=unholy)
+ uint32 runePowerGain; // 4
+
+ bool NoRuneCost() const { return RuneCost[0] == 0 && RuneCost[1] == 0 && RuneCost[2] == 0; }
+ bool NoRunicPowerGain() const { return runePowerGain == 0; }
};
struct SpellShapeshiftEntry
@@ -722,26 +1298,31 @@ struct SpellDurationEntry
struct SpellItemEnchantmentEntry
{
- uint32 ID; // 0
- uint32 type[3]; // 1-3
- uint32 amount[3]; // 4-6
- //uint32 amount2[3] // 7-9 always same as similar `amount` value
- uint32 spellid[3]; // 10-12
- char* description[16]; // 13-29
- // 30 description flags
- uint32 aura_id; // 31
- uint32 slot; // 32
- uint32 GemID; // 33
- uint32 EnchantmentCondition; // 34
+ uint32 ID; // 0 m_ID
+ //uint32 charges; // 1 m_charges
+ uint32 type[3]; // 2-4 m_effect[3]
+ uint32 amount[3]; // 5-7 m_effectPointsMin[3]
+ //uint32 amount2[3] // 8-10 m_effectPointsMax[3]
+ uint32 spellid[3]; // 11-13 m_effectArg[3]
+ char* description[16]; // 14-29 m_name_lang[16]
+ //uint32 descriptionFlags; // 30 name flags
+ uint32 aura_id; // 31 m_itemVisual
+ uint32 slot; // 32 m_flags
+ uint32 GemID; // 33 m_src_itemID
+ uint32 EnchantmentCondition; // 34 m_condition_id
+ //uint32 requiredSkill; // 35 m_requiredSkillID
+ //uint32 requiredSkillValue; // 36 m_requiredSkillRank
};
struct SpellItemEnchantmentConditionEntry
{
- uint32 ID;
- uint8 Color[5];
- uint8 Comparator[5];
- uint8 CompareColor[5];
- uint32 Value[5];
+ uint32 ID; // 0 m_ID
+ uint8 Color[5]; // 1-5 m_lt_operandType[5]
+ //uint32 LT_Operand[5]; // 6-10 m_lt_operand[5]
+ uint8 Comparator[5]; // 11-15 m_operator[5]
+ uint8 CompareColor[5]; // 15-20 m_rt_operandType[5]
+ uint32 Value[5]; // 21-25 m_rt_operand[5]
+ //uint8 Logic[5] // 25-30 m_logic[5]
};
struct StableSlotPricesEntry
@@ -750,6 +1331,16 @@ struct StableSlotPricesEntry
uint32 Price;
};
+/*struct SummonPropertiesEntry
+{
+ uint32 Id; // 0
+ uint32 Group; // 1, 0 - can't be controlled?, 1 - something guardian?, 2 - pet?, 3 - something controllable?, 4 - taxi/mount?
+ uint32 Unk2; // 2, 14 rows > 0
+ uint32 Type; // 3, see enum
+ uint32 Slot; // 4, 0-6
+ uint32 Flags; // 5
+};*/
+
struct TalentEntry
{
uint32 TalentID; // 0
@@ -761,53 +1352,59 @@ struct TalentEntry
uint32 DependsOn; // 13 index in Talent.dbc (TalentEntry)
// 14-15 not used
uint32 DependsOnRank; // 16
- // 17-19 not used
- uint32 DependsOnSpell; // 20 req.spell
+ // 17-18 not used
+ //uint32 unk1; // 19, 0 or 1
+ //uint32 unk2; // 20, all 0
+ //uint32 unkFlags1; // 21, related to hunter pet talents
+ //uint32 unkFlags2; // 22, related to hunter pet talents
};
struct TalentTabEntry
{
- uint32 TalentTabID; // 0
- //char* name[16]; // 1-16, unused
+ uint32 TalentTabID; // 0
+ //char* name[16]; // 1-16, unused
//uint32 nameFlags; // 17, unused
//unit32 spellicon; // 18
// 19 not used
- uint32 ClassMask; // 20
- uint32 tabpage; // 21
- //char* internalname; // 22
+ uint32 ClassMask; // 20
+ uint32 petTalentMask; // 21
+ uint32 tabpage; // 22
+ //char* internalname; // 23
};
struct TaxiNodesEntry
{
- uint32 ID; // 0
- uint32 map_id; // 1
- float x; // 2
- float y; // 3
- float z; // 4
- //char* name[16]; // 5-21
- // 22 string flags, unused
- uint32 horde_mount_type; // 23
- uint32 alliance_mount_type; // 24
+ uint32 ID; // 0 m_ID
+ uint32 map_id; // 1 m_ContinentID
+ float x; // 2 m_x
+ float y; // 3 m_y
+ float z; // 4 m_z
+ //char* name[16]; // 5-21 m_Name_lang
+ // 22 string flags
+ uint32 MountCreatureID[2]; // 23-24 m_MountCreatureID[2]
};
struct TaxiPathEntry
{
- uint32 ID;
- uint32 from;
- uint32 to;
- uint32 price;
+ uint32 ID; // 0 m_ID
+ uint32 from; // 1 m_FromTaxiNode
+ uint32 to; // 2 m_ToTaxiNode
+ uint32 price; // 3 m_Cost
};
struct TaxiPathNodeEntry
{
- uint32 path;
- uint32 index;
- uint32 mapid;
- float x;
- float y;
- float z;
- uint32 actionFlag;
- uint32 delay;
+ // 0 m_ID
+ uint32 path; // 1 m_PathID
+ uint32 index; // 2 m_NodeIndex
+ uint32 mapid; // 3 m_ContinentID
+ float x; // 4 m_LocX
+ float y; // 5 m_LocY
+ float z; // 6 m_LocZ
+ uint32 actionFlag; // 7 m_flags
+ uint32 delay; // 8 m_delay
+ // 9 m_arrivalEventID
+ // 10 m_departureEventID
};
struct TotemCategoryEntry
@@ -819,16 +1416,100 @@ struct TotemCategoryEntry
uint32 categoryMask; // 19 (compatibility mask for same type: different for totems, compatible from high to low for rods)
};
+struct VehicleEntry
+{
+ uint32 m_ID; // 0
+ uint32 m_flags; // 1
+ float m_turnSpeed; // 2
+ float m_pitchSpeed; // 3
+ float m_pitchMin; // 4
+ float m_pitchMax; // 5
+ uint32 m_seatID[8]; // 6-13
+ float m_mouseLookOffsetPitch; // 14
+ float m_cameraFadeDistScalarMin; // 15
+ float m_cameraFadeDistScalarMax; // 16
+ float m_cameraPitchOffset; // 17
+ int m_powerType[3]; // 18-20
+ int m_powerToken[3]; // 21-23
+ float m_facingLimitRight; // 24
+ float m_facingLimitLeft; // 25
+ float m_msslTrgtTurnLingering; // 26
+ float m_msslTrgtPitchLingering; // 27
+ float m_msslTrgtMouseLingering; // 28
+ float m_msslTrgtEndOpacity; // 29
+ float m_msslTrgtArcSpeed; // 30
+ float m_msslTrgtArcRepeat; // 31
+ float m_msslTrgtArcWidth; // 32
+ float m_msslTrgtImpactRadius[2]; // 33-34
+ char* m_msslTrgtArcTexture; // 35
+ char* m_msslTrgtImpactTexture; // 36
+ char* m_msslTrgtImpactModel[2]; // 37-38
+ float m_cameraYawOffset; // 39
+ uint32 m_uiLocomotionType; // 40
+ float m_msslTrgtImpactTexRadius; // 41
+ uint32 m_uiSeatIndicatorType; // 42
+};
+
+struct VehicleSeatEntry
+{
+ uint32 m_ID; // 0
+ uint32 m_flags; // 1
+ int32 m_attachmentID; // 2
+ float m_attachmentOffsetX; // 3
+ float m_attachmentOffsetY; // 4
+ float m_attachmentOffsetZ; // 5
+ float m_enterPreDelay; // 6
+ float m_enterSpeed; // 7
+ float m_enterGravity; // 8
+ float m_enterMinDuration; // 9
+ float m_enterMaxDuration; // 10
+ float m_enterMinArcHeight; // 11
+ float m_enterMaxArcHeight; // 12
+ int32 m_enterAnimStart; // 13
+ int32 m_enterAnimLoop; // 14
+ int32 m_rideAnimStart; // 15
+ int32 m_rideAnimLoop; // 16
+ int32 m_rideUpperAnimStart; // 17
+ int32 m_rideUpperAnimLoop; // 18
+ float m_exitPreDelay; // 19
+ float m_exitSpeed; // 20
+ float m_exitGravity; // 21
+ float m_exitMinDuration; // 22
+ float m_exitMaxDuration; // 23
+ float m_exitMinArcHeight; // 24
+ float m_exitMaxArcHeight; // 25
+ int32 m_exitAnimStart; // 26
+ int32 m_exitAnimLoop; // 27
+ int32 m_exitAnimEnd; // 28
+ float m_passengerYaw; // 29
+ float m_passengerPitch; // 30
+ float m_passengerRoll; // 31
+ int32 m_passengerAttachmentID; // 32
+ int32 m_vehicleEnterAnim; // 33
+ int32 m_vehicleExitAnim; // 34
+ int32 m_vehicleRideAnimLoop; // 35
+ int32 m_vehicleEnterAnimBone; // 36
+ int32 m_vehicleExitAnimBone; // 37
+ int32 m_vehicleRideAnimLoopBone; // 38
+ float m_vehicleEnterAnimDelay; // 39
+ float m_vehicleExitAnimDelay; // 40
+ uint32 m_vehicleAbilityDisplay; // 41
+ uint32 m_enterUISoundID; // 42
+ uint32 m_exitUISoundID; // 43
+ int32 m_uiSkin; // 44
+ uint32 m_flagsB; // 45
+};
+
struct WorldMapAreaEntry
{
- //uint32 ID; // 0
- uint32 map_id; // 1
- uint32 area_id; // 2 index (continent 0 areas ignored)
- //char* internal_name // 3
- float y1; // 4
- float y2; // 5
- float x1; // 6
- float x2; // 7
+ //uint32 ID; // 0
+ uint32 map_id; // 1
+ uint32 area_id; // 2 index (continent 0 areas ignored)
+ //char* internal_name // 3
+ float y1; // 4
+ float y2; // 5
+ float x1; // 6
+ float x2; // 7
int32 virtual_map_id; // 8 -1 (map_id have correct map) other: virtual map where zone show (map_id - where zone in fact internally)
};
@@ -843,6 +1524,12 @@ struct WorldSafeLocsEntry
// 21 name flags, unused
};
+struct WorldMapOverlayEntry
+{
+ uint32 ID; // 0
+ uint32 areatableID; // 2
+};
+
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
#if defined( __GNUC__ )
#pragma pack()
@@ -888,7 +1575,7 @@ struct TaxiPathNode
typedef std::vector<TaxiPathNode> TaxiPathNodeList;
typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
-#define TaxiMaskSize 16
+#define TaxiMaskSize 12
typedef uint32 TaxiMask[TaxiMaskSize];
#endif
diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp
index cab781692f0..0420c2b9a85 100644
--- a/src/shared/Database/DBCfmt.cpp
+++ b/src/shared/Database/DBCfmt.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -10,36 +10,42 @@
*
* 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
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxx";
+const char Achievementfmt[]="niixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxxxxxxxxxi";
+const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix";
+const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
+const char AreaGroupEntryfmt[]="niiiiiii";
const char AreaTriggerEntryfmt[]="niffffffff";
+const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx";
const char BankBagSlotPricesEntryfmt[]="ni";
-const char BattlemasterListEntryfmt[]="niiixxxxxiiiixxssssssssssssssssxx";
-const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxx";
-// 3*12 new item fields in 3.0.x
-//const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii";
+const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx";
+const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx";
// ChatChannelsEntryfmt, index not used (more compact store)
-//const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
-const char ChrClassesEntryfmt[]="nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
+const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixii";
const char ChrRacesEntryfmt[]="nxixiixxixxxxissssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
-const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxx";
-const char CreatureFamilyfmt[]="nfifiiiissssssssssssssssxx";
+const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxxxx";
+const char CreatureFamilyfmt[]="nfifiiiiixssssssssssssssssxx";
const char CreatureSpellDatafmt[]="nxxxxxxxx";
+const char CreatureTypefmt[]="nxxxxxxxxxxxxxxxxxx";
const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char DurabilityQualityfmt[]="nf";
const char EmoteEntryfmt[]="nxixxxxxxxxxxxxxxxx";
const char FactionEntryfmt[]="niiiiiiiiiiiiiiiiiissssssssssssssssxxxxxxxxxxxxxxxxxx";
const char FactionTemplateEntryfmt[]="niiiiiiiiiiiii";
const char GemPropertiesEntryfmt[]="nixxi";
+const char GlyphPropertiesfmt[]="niii";
+const char GlyphSlotfmt[]="nii";
+const char GtBarberShopCostBasefmt[]="f";
const char GtCombatRatingsfmt[]="f";
const char GtChanceToMeleeCritBasefmt[]="f";
const char GtChanceToMeleeCritfmt[]="f";
@@ -49,37 +55,45 @@ const char GtOCTRegenHPfmt[]="f";
//const char GtOCTRegenMPfmt[]="f";
const char GtRegenHPPerSptfmt[]="f";
const char GtRegenMPPerSptfmt[]="f";
-const char Itemfmt[]="niii";
+const char Itemfmt[]="nixiiiii";
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
//const char ItemCondExtCostsEntryfmt[]="xiii";
-const char ItemExtendedCostEntryfmt[]="niiiiiiiiiiiii";
-const char ItemRandomPropertiesfmt[]="nxiiixxxxxxxxxxxxxxxxxxx";
-const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiii";
+const char ItemExtendedCostEntryfmt[]="niiiiiiiiiiiiix";
+const char ItemLimitCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxix";
+const char ItemRandomPropertiesfmt[]="nxiiiiixxxxxxxxxxxxxxxxx";
+const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiiiiiii";
const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii";
-const char LockEntryfmt[]="niiiiixxxiiiiixxxiixxxxxxxxxxxxxx";
+const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx";
const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-const char MapEntryfmt[]="nxixssssssssssssssssxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxi";
+const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxix";
const char QuestSortEntryfmt[]="nxxxxxxxxxxxxxxxxx";
const char RandomPropertiesPointsfmt[]="niiiiiiiiiiiiiii";
-const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxi";
-const char SkillLineAbilityfmt[]="niiiixxiiiiixxi";
+const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";
+const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii";
+const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxx";
+const char SkillLineAbilityfmt[]="niiiixxiiiiixx";
const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellCastTimefmt[]="nixx";
const char SpellDurationfmt[]="niii";
-const char SpellEntryfmt[]="nixiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffixiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiixfffxxxiiii";
+const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix";
const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx";
-const char SpellItemEnchantmentfmt[]="niiiiiixxxiiissssssssssssssssxiiii";
+const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx";
const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
const char SpellRadiusfmt[]="nfxf";
-const char SpellRangefmt[]="nffixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char SpellRangefmt[]="nffffixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char SpellRuneCostfmt[]="niiii";
const char SpellShapeshiftfmt[]="nxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxx";
const char StableSlotPricesfmt[] = "ni";
-const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxi";
-const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiix";
+//const char SummonPropertiesfmt[] = "niiiii";
+const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxxxx";
+const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiiix";
const char TaxiNodesEntryfmt[]="nifffxxxxxxxxxxxxxxxxxii";
const char TaxiPathEntryfmt[]="niii";
const char TaxiPathNodeEntryfmt[]="diiifffiixx";
const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii";
-const char WorldMapAreaEntryfmt[]="xinxffffi";
+const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi";
+const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii";
+const char WorldMapAreaEntryfmt[]="xinxffffix";
const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx";
+const char WorldMapOverlayEntryfmt[]="nxixxxxxxxxxxxxxx";
diff --git a/src/shared/Database/Database.cpp b/src/shared/Database/Database.cpp
index 7110fe44c54..07ece3b0cd9 100644
--- a/src/shared/Database/Database.cpp
+++ b/src/shared/Database/Database.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/Database.h b/src/shared/Database/Database.h
index c2ee9349979..92a1c991dcc 100644
--- a/src/shared/Database/Database.h
+++ b/src/shared/Database/Database.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -33,7 +33,7 @@ class SqlQueryHolder;
typedef UNORDERED_MAP<ZThread::ThreadImpl*, SqlTransaction*> TransactionQueues;
typedef UNORDERED_MAP<ZThread::ThreadImpl*, SqlResultQueue*> QueryQueues;
-#define MAX_QUERY_LEN 1024
+#define MAX_QUERY_LEN 32*1024
class TRINITY_DLL_SPEC Database
{
diff --git a/src/shared/Database/DatabaseEnv.h b/src/shared/Database/DatabaseEnv.h
index 664459473af..9366d1e0070 100644
--- a/src/shared/Database/DatabaseEnv.h
+++ b/src/shared/Database/DatabaseEnv.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabaseImpl.h b/src/shared/Database/DatabaseImpl.h
index 5ab4ec04a65..3d3c53f0873 100644
--- a/src/shared/Database/DatabaseImpl.h
+++ b/src/shared/Database/DatabaseImpl.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabaseMysql.cpp b/src/shared/Database/DatabaseMysql.cpp
index 72da1090a85..e7babedddfe 100644
--- a/src/shared/Database/DatabaseMysql.cpp
+++ b/src/shared/Database/DatabaseMysql.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabaseMysql.h b/src/shared/Database/DatabaseMysql.h
index 1826a08f2aa..2fa157e75a5 100644
--- a/src/shared/Database/DatabaseMysql.h
+++ b/src/shared/Database/DatabaseMysql.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabasePostgre.cpp b/src/shared/Database/DatabasePostgre.cpp
index 25b5a58b863..502808b7933 100644
--- a/src/shared/Database/DatabasePostgre.cpp
+++ b/src/shared/Database/DatabasePostgre.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabasePostgre.h b/src/shared/Database/DatabasePostgre.h
index 6dc0c509869..c7242add572 100644
--- a/src/shared/Database/DatabasePostgre.h
+++ b/src/shared/Database/DatabasePostgre.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabaseSqlite.cpp b/src/shared/Database/DatabaseSqlite.cpp
index a7a4a2a9847..b5def933723 100644
--- a/src/shared/Database/DatabaseSqlite.cpp
+++ b/src/shared/Database/DatabaseSqlite.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/DatabaseSqlite.h b/src/shared/Database/DatabaseSqlite.h
index 32d49d0124b..c84b59eea80 100644
--- a/src/shared/Database/DatabaseSqlite.h
+++ b/src/shared/Database/DatabaseSqlite.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/Field.cpp b/src/shared/Database/Field.cpp
index a7817d9a630..9a1fbfa5178 100644
--- a/src/shared/Database/Field.cpp
+++ b/src/shared/Database/Field.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/Field.h b/src/shared/Database/Field.h
index 3e5f26376bb..da6a865c6f2 100644
--- a/src/shared/Database/Field.h
+++ b/src/shared/Database/Field.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/Makefile.am b/src/shared/Database/Makefile.am
index 20cb2c87875..e5dce08653b 100644
--- a/src/shared/Database/Makefile.am
+++ b/src/shared/Database/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,19 +9,19 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
## CPP flags for includes, defines, etc.
-AM_CPPFLAGS = $(MYSQL_INCLUDES) $(POSTGRE_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
## Build MaNGOS shared library and its parts as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
@@ -29,36 +29,38 @@ AM_CPPFLAGS = $(MYSQL_INCLUDES) $(POSTGRE_INCLUDES) -I$(top_builddir)/src/shared
noinst_LIBRARIES = libmangosdatabase.a
libmangosdatabase_a_SOURCES = \
- DBCStores.cpp \
- DBCStores.h \
- DBCStructure.h \
- DBCfmt.cpp \
- Database.cpp \
- Database.h \
- DatabaseEnv.h \
- DatabaseImpl.h \
- DatabaseMysql.cpp \
- DatabasePostgre.cpp \
- DatabaseMysql.h \
- DatabasePostgre.h \
- DatabaseSqlite.cpp \
- DatabaseSqlite.h \
- Field.cpp \
- Field.h \
- MySQLDelayThread.h \
- PGSQLDelayThread.h \
- QueryResult.h \
- QueryResultMysql.cpp \
- QueryResultMysql.h \
- QueryResultPostgre.cpp \
- QueryResultPostgre.h \
- QueryResultSqlite.cpp \
- QueryResultSqlite.h \
- SQLStorage.cpp \
- SQLStorage.h \
- SqlDelayThread.cpp \
- SqlDelayThread.h \
- SqlOperations.cpp \
- SqlOperations.h \
- dbcfile.cpp \
- dbcfile.h
+ DBCStores.cpp \
+ DBCStores.h \
+ DBCStructure.h \
+ DBCfmt.cpp \
+ Database.cpp \
+ Database.h \
+ DatabaseEnv.h \
+ DatabaseImpl.h \
+ DatabaseMysql.cpp \
+ DatabasePostgre.cpp \
+ DatabaseMysql.h \
+ DatabasePostgre.h \
+ DatabaseSqlite.cpp \
+ DatabaseSqlite.h \
+ DBCEnums.h \
+ Field.cpp \
+ Field.h \
+ MySQLDelayThread.h \
+ PGSQLDelayThread.h \
+ QueryResult.h \
+ QueryResultMysql.cpp \
+ QueryResultMysql.h \
+ QueryResultPostgre.cpp \
+ QueryResultPostgre.h \
+ QueryResultSqlite.cpp \
+ QueryResultSqlite.h \
+ SQLStorage.cpp \
+ SQLStorage.h \
+ SQLStorageImpl.h \
+ SqlDelayThread.cpp \
+ SqlDelayThread.h \
+ SqlOperations.cpp \
+ SqlOperations.h \
+ dbcfile.cpp \
+ dbcfile.h
diff --git a/src/shared/Database/MySQLDelayThread.h b/src/shared/Database/MySQLDelayThread.h
index 14cf1a64617..fcebe3fbd35 100644
--- a/src/shared/Database/MySQLDelayThread.h
+++ b/src/shared/Database/MySQLDelayThread.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/PGSQLDelayThread.h b/src/shared/Database/PGSQLDelayThread.h
index 19941464cca..8d219bd9c1e 100644
--- a/src/shared/Database/PGSQLDelayThread.h
+++ b/src/shared/Database/PGSQLDelayThread.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResult.h b/src/shared/Database/QueryResult.h
index 32e47c0959f..01da45ed281 100644
--- a/src/shared/Database/QueryResult.h
+++ b/src/shared/Database/QueryResult.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResultMysql.cpp b/src/shared/Database/QueryResultMysql.cpp
index d995b9f2473..5bc11ae308f 100644
--- a/src/shared/Database/QueryResultMysql.cpp
+++ b/src/shared/Database/QueryResultMysql.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResultMysql.h b/src/shared/Database/QueryResultMysql.h
index 3131bd4bbe4..06b1353c12e 100644
--- a/src/shared/Database/QueryResultMysql.h
+++ b/src/shared/Database/QueryResultMysql.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResultPostgre.cpp b/src/shared/Database/QueryResultPostgre.cpp
index def1b0061e5..500ca053885 100644
--- a/src/shared/Database/QueryResultPostgre.cpp
+++ b/src/shared/Database/QueryResultPostgre.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResultPostgre.h b/src/shared/Database/QueryResultPostgre.h
index 61311728f2d..30d69114dc6 100644
--- a/src/shared/Database/QueryResultPostgre.h
+++ b/src/shared/Database/QueryResultPostgre.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResultSqlite.cpp b/src/shared/Database/QueryResultSqlite.cpp
index a041232f600..06a02d1db59 100644
--- a/src/shared/Database/QueryResultSqlite.cpp
+++ b/src/shared/Database/QueryResultSqlite.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/QueryResultSqlite.h b/src/shared/Database/QueryResultSqlite.h
index b2622f96707..5dc3287b385 100644
--- a/src/shared/Database/QueryResultSqlite.h
+++ b/src/shared/Database/QueryResultSqlite.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp
index 1419d6a2ac6..2401f715074 100644
--- a/src/shared/Database/SQLStorage.cpp
+++ b/src/shared/Database/SQLStorage.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -27,20 +27,20 @@ extern DatabasePostgre WorldDatabase;
extern DatabaseMysql WorldDatabase;
#endif
-const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiilliiis";
-const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiilliiii";
+const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiisiilliiis";
+const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiisiilliiii";
const char CreatureDataAddonInfofmt[]="iiiiiiiis";
const char CreatureModelfmt[]="iffbi";
const char CreatureInfoAddonInfofmt[]="iiiiiiiis";
-const char EquipmentInfofmt[]="iiiiiiiiii";
+const char EquipmentInfofmt[]="iiii";
const char GameObjectInfosrcfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiis";
const char GameObjectInfodstfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiii";
-const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifsiiiii";
-const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiii";
+const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii";
+const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii";
const char PageTextfmt[]="isi";
const char SpellThreatfmt[]="ii";
-const char InstanceTemplatesrcfmt[]="iiiiiiffffs";
-const char InstanceTemplatedstfmt[]="iiiiiiffffi";
+const char InstanceTemplatesrcfmt[]="iiiiiiiffffs";
+const char InstanceTemplatedstfmt[]="iiiiiiiffffi";
SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template");
SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt,"guid","creature_addon");
diff --git a/src/shared/Database/SQLStorage.h b/src/shared/Database/SQLStorage.h
index 43e34532607..1b5b9d5dcf1 100644
--- a/src/shared/Database/SQLStorage.h
+++ b/src/shared/Database/SQLStorage.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/SQLStorageImpl.h b/src/shared/Database/SQLStorageImpl.h
index 82ff0beb60e..b7927851fef 100644
--- a/src/shared/Database/SQLStorageImpl.h
+++ b/src/shared/Database/SQLStorageImpl.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
@@ -22,13 +22,13 @@
template<class T>
template<class S, class D>
-void SQLStorageLoaderBase<T>::convert(uint32 field_pos, S src, D &dst)
+void SQLStorageLoaderBase<T>::convert(uint32 /*field_pos*/, S src, D &dst)
{
dst = D(src);
}
template<class T>
-void SQLStorageLoaderBase<T>::convert_str_to_str(uint32 field_pos, char *src, char *&dst)
+void SQLStorageLoaderBase<T>::convert_str_to_str(uint32 /*field_pos*/, char *src, char *&dst)
{
if(!src)
{
@@ -45,7 +45,7 @@ void SQLStorageLoaderBase<T>::convert_str_to_str(uint32 field_pos, char *src, ch
template<class T>
template<class S>
-void SQLStorageLoaderBase<T>::convert_to_str(uint32 field_pos, S src, char * & dst)
+void SQLStorageLoaderBase<T>::convert_to_str(uint32 /*field_pos*/, S /*src*/, char * & dst)
{
dst = new char[1];
*dst = 0;
@@ -53,7 +53,7 @@ void SQLStorageLoaderBase<T>::convert_to_str(uint32 field_pos, S src, char * & d
template<class T>
template<class D>
-void SQLStorageLoaderBase<T>::convert_from_str(uint32 field_pos, char * src, D& dst)
+void SQLStorageLoaderBase<T>::convert_from_str(uint32 /*field_pos*/, char * /*src*/, D& dst)
{
dst = 0;
}
diff --git a/src/shared/Database/SqlDelayThread.cpp b/src/shared/Database/SqlDelayThread.cpp
index 16d5146fc53..27f58510a0a 100644
--- a/src/shared/Database/SqlDelayThread.cpp
+++ b/src/shared/Database/SqlDelayThread.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/SqlDelayThread.h b/src/shared/Database/SqlDelayThread.h
index 4c77c122f1e..cbae0c1e5eb 100644
--- a/src/shared/Database/SqlDelayThread.h
+++ b/src/shared/Database/SqlDelayThread.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -42,7 +42,7 @@ class SqlDelayThread : public ZThread::Runnable
SqlDelayThread(Database* db);
///< Put sql statement to delay queue
- inline bool Delay(SqlOperation* sql) { m_sqlQueue.add(sql); return true; }
+ bool Delay(SqlOperation* sql) { m_sqlQueue.add(sql); return true; }
virtual void Stop(); ///< Stop event
virtual void run(); ///< Main Thread loop
diff --git a/src/shared/Database/SqlOperations.cpp b/src/shared/Database/SqlOperations.cpp
index c11c5b9269d..68f5759a85e 100644
--- a/src/shared/Database/SqlOperations.cpp
+++ b/src/shared/Database/SqlOperations.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/SqlOperations.h b/src/shared/Database/SqlOperations.h
index 1a0d3c78d1b..61eef4bb7c4 100644
--- a/src/shared/Database/SqlOperations.h
+++ b/src/shared/Database/SqlOperations.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/dbcfile.cpp b/src/shared/Database/dbcfile.cpp
index 9b363dbff8d..c40c8b223e1 100644
--- a/src/shared/Database/dbcfile.cpp
+++ b/src/shared/Database/dbcfile.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Database/dbcfile.h b/src/shared/Database/dbcfile.h
index aa36f6003dc..e94417b4371 100644
--- a/src/shared/Database/dbcfile.h
+++ b/src/shared/Database/dbcfile.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Errors.h b/src/shared/Errors.h
index 7203f1c5420..b7bd19a1d94 100644
--- a/src/shared/Errors.h
+++ b/src/shared/Errors.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Log.cpp b/src/shared/Log.cpp
index d042be82b77..c0f70f4790b 100644
--- a/src/shared/Log.cpp
+++ b/src/shared/Log.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Log.h b/src/shared/Log.h
index ab8c24571fb..b4344eac262 100644
--- a/src/shared/Log.h
+++ b/src/shared/Log.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Makefile.am b/src/shared/Makefile.am
index 3a86f148521..a5465f86c11 100644
--- a/src/shared/Makefile.am
+++ b/src/shared/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -18,96 +18,40 @@
## Process this file with automake to produce Makefile.in
-## TODO move vmaps in src dir instead of src/shared
-
## Sub-directories to parse
-SUBDIRS = vmap
+SUBDIRS = Auth Config Database vmap
+
+## CPP flags for includes, defines, etc.
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/../../dep/include/g3dlite -DSYSCONFDIR=\"$(sysconfdir)/\"
+## AM_CPPFLAGS += -I$(srcdir)/../game -I$(srcdir)/../realmd
## Build MaNGOS shared library and its parts as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
# later.
-noinst_LIBRARIES = libshared.a
-
-libshared_a_CPPFLAGS = \
-$(MYSQL_INCLUDES) \
-$(POSTGRE_INCLUDES) \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/src/framework
+noinst_LIBRARIES = libmangosshared.a
# libmangosshared library will later be reused by ...
-libshared_a_SOURCES = \
-$(srcdir)/Base.cpp \
-$(srcdir)/Base.h \
-$(srcdir)/ByteBuffer.h \
-$(srcdir)/Common.cpp \
-$(srcdir)/Common.h \
-$(srcdir)/Errors.h \
-$(srcdir)/Log.cpp \
-$(srcdir)/Log.h \
-$(srcdir)/Mthread.cpp \
-$(srcdir)/Mthread.h \
-$(srcdir)/ProgressBar.cpp \
-$(srcdir)/ProgressBar.h \
-$(srcdir)/Timer.h \
-$(srcdir)/Util.cpp \
-$(srcdir)/Util.h \
-$(srcdir)/WorldPacket.h \
-$(srcdir)/SystemConfig.h \
-$(srcdir)../game/IRCConf.h \
-$(srcdir)/Auth/AuthCrypt.cpp \
-$(srcdir)/Auth/AuthCrypt.h \
-$(srcdir)/Auth/BigNumber.cpp \
-$(srcdir)/Auth/BigNumber.h \
-$(srcdir)/Auth/Hmac.cpp \
-$(srcdir)/Auth/Hmac.h \
-$(srcdir)/Auth/Sha1.cpp \
-$(srcdir)/Auth/Sha1.h \
-$(srcdir)/Auth/md5.c \
-$(srcdir)/Auth/md5.h \
-$(srcdir)/Config/dotconfpp/dotconfpp.cpp \
-$(srcdir)/Config/dotconfpp/dotconfpp.h \
-$(srcdir)/Config/dotconfpp/mempool.cpp \
-$(srcdir)/Config/dotconfpp/mempool.h \
-$(srcdir)/Config/Config.cpp \
-$(srcdir)/Config/Config.h \
-$(srcdir)/Config/ConfigEnv.h \
-$(srcdir)/Database/DBCStores.cpp \
-$(srcdir)/Database/DBCStores.h \
-$(srcdir)/Database/DBCStructure.h \
-$(srcdir)/Database/DBCfmt.cpp \
-$(srcdir)/Database/Database.cpp \
-$(srcdir)/Database/Database.h \
-$(srcdir)/Database/DatabaseEnv.h \
-$(srcdir)/Database/DatabaseImpl.h \
-$(srcdir)/Database/DatabaseMysql.cpp \
-$(srcdir)/Database/DatabasePostgre.cpp \
-$(srcdir)/Database/DatabaseMysql.h \
-$(srcdir)/Database/DatabasePostgre.h \
-$(srcdir)/Database/DatabaseSqlite.cpp \
-$(srcdir)/Database/DatabaseSqlite.h \
-$(srcdir)/Database/Field.cpp \
-$(srcdir)/Database/Field.h \
-$(srcdir)/Database/MySQLDelayThread.h \
-$(srcdir)/Database/PGSQLDelayThread.h \
-$(srcdir)/Database/QueryResult.h \
-$(srcdir)/Database/QueryResultMysql.cpp \
-$(srcdir)/Database/QueryResultMysql.h \
-$(srcdir)/Database/QueryResultPostgre.cpp \
-$(srcdir)/Database/QueryResultPostgre.h \
-$(srcdir)/Database/QueryResultSqlite.cpp \
-$(srcdir)/Database/QueryResultSqlite.h \
-$(srcdir)/Database/SQLStorage.cpp \
-$(srcdir)/Database/SQLStorage.h \
-$(srcdir)/Database/SqlDelayThread.cpp \
-$(srcdir)/Database/SqlDelayThread.h \
-$(srcdir)/Database/SqlOperations.cpp \
-$(srcdir)/Database/SqlOperations.h \
-$(srcdir)/Database/dbcfile.cpp \
-$(srcdir)/Database/dbcfile.h \
-$(srcdir)/revision.h
-
+libmangosshared_a_SOURCES = \
+ Base.cpp \
+ Base.h \
+ ByteBuffer.h \
+ Common.cpp \
+ Common.h \
+ Errors.h \
+ Log.cpp \
+ Log.h \
+ MemoryLeaks.cpp \
+ MemoryLeaks.h \
+ ProgressBar.cpp \
+ ProgressBar.h \
+ Timer.h \
+ Util.cpp \
+ Util.h \
+ WorldPacket.h \
+ revision_nr.h \
+ revision.h
+# Get revision (git or svn)
# Get HG revision
REVISION_FILE = revision.h
diff --git a/src/shared/MemoryLeaks.cpp b/src/shared/MemoryLeaks.cpp
new file mode 100644
index 00000000000..ef7e36c3b57
--- /dev/null
+++ b/src/shared/MemoryLeaks.cpp
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "MemoryLeaks.h"
+#include "Policies/SingletonImp.h"
+
+INSTANTIATE_SINGLETON_1( MemoryManager ) ;
+
+MemoryManager::MemoryManager( )
+{
+ #if COMPILER == MICROSOFT
+ // standard leak check initialization
+ //_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+ // uncomment to disable Visual Leak Detector from code
+ //VLDDisable();
+ #endif
+}
diff --git a/src/shared/MemoryLeaks.h b/src/shared/MemoryLeaks.h
new file mode 100644
index 00000000000..fcea1f557b1
--- /dev/null
+++ b/src/shared/MemoryLeaks.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITYSERVER_MEMORY_H
+#define TRINITYSERVER_MEMORY_H
+
+#include "Platform/CompilerDefs.h"
+
+#if COMPILER == COMPILER_MICROSOFT
+
+#ifndef _WIN64
+// Visual Leak Detector support enabled
+//#include <vld/vld.h>
+// standard Visual Studio leak check disabled,
+//# define _CRTDBG_MAP_ALLOC
+//# include <stdlib.h>
+//# include <crtdbg.h>
+#else
+# define _CRTDBG_MAP_ALLOC
+# include <stdlib.h>
+# include <crtdbg.h>
+#endif
+
+#endif
+
+
+#include "Policies/Singleton.h"
+
+struct MemoryManager : public Trinity::Singleton < MemoryManager >
+{
+ MemoryManager();
+};
+#endif
diff --git a/src/shared/PacketLog.cpp b/src/shared/PacketLog.cpp
index aa9fd2dc348..96c9727e7fa 100644
--- a/src/shared/PacketLog.cpp
+++ b/src/shared/PacketLog.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/PacketLog.h b/src/shared/PacketLog.h
index 30fb7da15b9..49ac72ebc4b 100644
--- a/src/shared/PacketLog.h
+++ b/src/shared/PacketLog.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/ProgressBar.cpp b/src/shared/ProgressBar.cpp
index f5a45b9d862..b72118ad804 100644
--- a/src/shared/ProgressBar.cpp
+++ b/src/shared/ProgressBar.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/ProgressBar.h b/src/shared/ProgressBar.h
index 3f217f228fe..50c5c7d11e5 100644
--- a/src/shared/ProgressBar.h
+++ b/src/shared/ProgressBar.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/ServiceWin32.cpp b/src/shared/ServiceWin32.cpp
index d384884529a..bdc2a371297 100644
--- a/src/shared/ServiceWin32.cpp
+++ b/src/shared/ServiceWin32.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/ServiceWin32.h b/src/shared/ServiceWin32.h
index d046acdcef4..18a52c396ea 100644
--- a/src/shared/ServiceWin32.h
+++ b/src/shared/ServiceWin32.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/SystemConfig.h b/src/shared/SystemConfig.h
index 6b4471e792d..679eee407e6 100644
--- a/src/shared/SystemConfig.h
+++ b/src/shared/SystemConfig.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>
*
*
* This program is free software; you can redistribute it and/or modify
@@ -28,7 +28,7 @@
#include "revision.h"
-#define _PACKAGENAME "TrinityCore "
+#define _PACKAGENAME "TC&MaNGOS "
#define _CODENAME "YUME"
#if TRINITY_ENDIAN == TRINITY_BIGENDIAN
diff --git a/src/shared/SystemConfig.h.in b/src/shared/SystemConfig.h.in
new file mode 100644
index 00000000000..6eff490b144
--- /dev/null
+++ b/src/shared/SystemConfig.h.in
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2009 Trinity <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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_SYSTEMCONFIG_H
+#define TRINITY_SYSTEMCONFIG_H
+
+#ifndef _PACKAGENAME
+#define _PACKAGENAME "TC&Mangos "
+#endif
+
+#include "Platform/Define.h"
+#include "revision.h" //-----here u are ------ _REVISION is the magic key
+
+#ifndef _VERSION
+#if PLATFORM == PLATFORM_WINDOWS
+# define _VERSION(REVD,REVT,REVN,REVH) "0.13.0-DEV" " (" REVD " " REVT " Revision " REVN " - " REVH ")"
+#else
+# define _VERSION(REVD,REVT,REVN,REVH) "@VERSION@" " (" REVD " " REVT " Revision " REVN " - " REVH ")"
+#endif
+#endif
+
+// Format is YYYYMMDDRR where RR is the change in the conf file
+// for that day.
+#ifndef _MANGOSDCONFVERSION
+# define _MANGOSDCONFVERSION 2008022901
+#endif
+#ifndef _REALMDCONFVERSION
+# define _REALMDCONFVERSION 2007062001
+#endif
+
+#if MANGOS_ENDIAN == MANGOS_BIGENDIAN
+# define _ENDIAN_STRING "big-endian"
+#else
+# define _ENDIAN_STRING "little-endian"
+#endif
+
+// The path to config files
+#ifndef SYSCONFDIR
+# define SYSCONFDIR ""
+#endif
+
+#if PLATFORM == PLATFORM_WINDOWS
+# ifdef _WIN64
+# define _ENDIAN_PLATFORM "Win64 (" _ENDIAN_STRING ")"
+# else
+# define _ENDIAN_PLATFORM "Win32 (" _ENDIAN_STRING ")"
+# endif
+# define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf"
+# define _REALMD_CONFIG SYSCONFDIR"realmd.conf"
+#else
+# define _ENDIAN_PLATFORM "Unix (" _ENDIAN_STRING ")"
+# define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf"
+# define _REALMD_CONFIG SYSCONFDIR"realmd.conf"
+#endif
+
+
+#define DEFAULT_PLAYER_LIMIT 100
+#define DEFAULT_WORLDSERVER_PORT 8085 //8129
+#define DEFAULT_REALMSERVER_PORT 3724
+#define DEFAULT_SOCKET_SELECT_TIME 10000
+#endif
diff --git a/src/shared/Timer.h b/src/shared/Timer.h
index 81b6bb58465..82f5be161d9 100644
--- a/src/shared/Timer.h
+++ b/src/shared/Timer.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/Util.cpp b/src/shared/Util.cpp
index 26d2275ec2a..767b65e441c 100644
--- a/src/shared/Util.cpp
+++ b/src/shared/Util.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -36,27 +36,27 @@ static MTRandTSS mtRand;
int32 irand (int32 min, int32 max)
{
- return int32 (mtRand.get ().randInt (max - min)) + min;
+ return int32 (mtRand.get ().randInt (max - min)) + min;
}
uint32 urand (uint32 min, uint32 max)
{
- return mtRand.get ().randInt (max - min) + min;
+ return mtRand.get ().randInt (max - min) + min;
}
int32 rand32 ()
{
- return mtRand.get ().randInt ();
+ return mtRand.get ().randInt ();
}
double rand_norm(void)
{
- return mtRand.get ().randExc ();
+ return mtRand.get ().randExc ();
}
double rand_chance (void)
{
- return mtRand.get ().randExc (100.0);
+ return mtRand.get ().randExc (100.0);
}
Tokens StrSplit(const std::string &src, const std::string &sep)
@@ -254,8 +254,9 @@ bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize)
size_t len = utf8::distance(utf8str,utf8str+csize);
if(len > wsize)
{
+ if(wsize > 0)
+ wstr[0] = L'\0';
wsize = 0;
- wstr = L"";
return false;
}
@@ -265,8 +266,9 @@ bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize)
}
catch(std::exception)
{
+ if(wsize > 0)
+ wstr[0] = L'\0';
wsize = 0;
- wstr = L"";
return false;
}
diff --git a/src/shared/Util.h b/src/shared/Util.h
index 98e60f83319..adfbdad620a 100644
--- a/src/shared/Util.h
+++ b/src/shared/Util.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -287,20 +287,20 @@ bool consoleToUtf8(const std::string& conStr,std::string& utf8str);
bool Utf8FitTo(const std::string& str, std::wstring search);
#if PLATFORM == PLATFORM_WINDOWS
-#define UTF8PRINTF(OUT,FRM,RESERR) \
-{ \
- char temp_buf[6000]; \
- va_list ap; \
- va_start(ap, FRM); \
- size_t temp_len = vsnprintf(temp_buf,6000,FRM,ap); \
- va_end(ap); \
- \
- wchar_t wtemp_buf[6000]; \
- size_t wtemp_len = 6000-1; \
+#define UTF8PRINTF(OUT,FRM,RESERR) \
+{ \
+ char temp_buf[32*1024]; \
+ va_list ap; \
+ va_start(ap, FRM); \
+ size_t temp_len = vsnprintf(temp_buf,32*1024,FRM,ap); \
+ va_end(ap); \
+ \
+ wchar_t wtemp_buf[32*1024]; \
+ size_t wtemp_len = 32*1024-1; \
if(!Utf8toWStr(temp_buf,temp_len,wtemp_buf,wtemp_len)) \
- return RESERR; \
+ return RESERR; \
CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1);\
- fprintf(OUT,temp_buf); \
+ fprintf(OUT,temp_buf); \
}
#else
#define UTF8PRINTF(OUT,FRM,RESERR) \
@@ -317,3 +317,231 @@ uint32 CreatePIDFile(const std::string& filename);
#endif
+//handler for operations on large flags
+#ifndef _FLAG96
+#define _FLAG96
+
+class flag96
+{
+private:
+ uint32 part[3];
+public:
+ flag96(uint32 p1=0,uint32 p2=0,uint32 p3=0)
+ {
+ part[0]=p1;
+ part[1]=p2;
+ part[2]=p3;
+ }
+
+ inline bool IsEqual(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
+ {
+ return (
+ part[0]==p1 &&
+ part[1]==p2 &&
+ part[2]==p3);
+ };
+
+ inline bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
+ {
+ return (
+ part[0]&p1 ||
+ part[1]&p2 ||
+ part[2]&p3);
+ };
+
+ inline void Set(uint32 p1=0, uint32 p2=0, uint32 p3=0)
+ {
+ part[0]=p1;
+ part[1]=p2;
+ part[2]=p3;
+ };
+
+ template<class type>
+ inline bool operator < (type & right)
+ {
+ for (uint8 i=3;i>0;i--)
+ {
+ if (part[i-1]<right.part[i-1])
+ return 1;
+ else if (part[i-1]>right.part[i-1])
+ return 0;
+ }
+ return 0;
+ };
+
+ template<class type>
+ inline bool operator < (type & right) const
+ {
+ for (uint8 i=3;i>0;i--)
+ {
+ if (part[i-1]<right.part[i-1])
+ return 1;
+ else if (part[i-1]>right.part[i-1])
+ return 0;
+ }
+ return 0;
+ };
+
+ template<class type>
+ inline bool operator != (type & right)
+ {
+ if (part[0]!=right.part[0]
+ || part[1]!=right.part[1]
+ || part[2]!=right.part[2])
+ return true;
+ return false;
+ }
+
+ template<class type>
+ inline bool operator != (type & right) const
+ {
+ if (part[0]!=right.part[0]
+ || part[1]!=right.part[1]
+ || part[2]!=right.part[2])
+ return true;
+ return false;
+ };
+
+ template<class type>
+ inline bool operator == (type & right)
+ {
+ if (part[0]!=right.part[0]
+ || part[1]!=right.part[1]
+ || part[2]!=right.part[2])
+ return false;
+ return true;
+ };
+
+ template<class type>
+ inline bool operator == (type & right) const
+ {
+ if (part[0]!=right.part[0]
+ || part[1]!=right.part[1]
+ || part[2]!=right.part[2])
+ return false;
+ return true;
+ };
+
+ template<class type>
+ inline void operator = (type & right)
+ {
+ part[0]=right.part[0];
+ part[1]=right.part[1];
+ part[2]=right.part[2];
+ };
+
+ template<class type>
+ inline flag96 operator & (type & right)
+ {
+ flag96 ret(part[0] & right.part[0],part[1] & right.part[1],part[2] & right.part[2]);
+ return
+ ret;
+ };
+ template<class type>
+ inline flag96 operator & (type & right) const
+ {
+ flag96 ret(part[0] & right.part[0],part[1] & right.part[1],part[2] & right.part[2]);
+ return
+ ret;
+ };
+
+ template<class type>
+ inline void operator &= (type & right)
+ {
+ *this=*this & right;
+ };
+
+ template<class type>
+ inline flag96 operator | (type & right)
+ {
+ flag96 ret(part[0] | right.part[0],part[1] | right.part[1],part[2] | right.part[2]);
+ return
+ ret;
+ };
+
+ template<class type>
+ inline flag96 operator | (type & right) const
+ {
+ flag96 ret(part[0] | right.part[0],part[1] | right.part[1],part[2] | right.part[2]);
+ return
+ ret;
+ };
+
+ template<class type>
+ inline void operator |= (type & right)
+ {
+ *this=*this | right;
+ };
+
+ inline void operator ~ ()
+ {
+ part[2]=~part[2];
+ part[1]=~part[1];
+ part[0]=~part[0];
+ };
+
+ template<class type>
+ inline flag96 operator ^ (type & right)
+ {
+ flag96 ret(part[0] ^ right.part[0],part[1] ^ right.part[1],part[2] ^ right.part[2]);
+ return
+ ret;
+ };
+
+ template<class type>
+ inline flag96 operator ^ (type & right) const
+ {
+ flag96 ret(part[0] ^ right.part[0],part[1] ^ right.part[1],part[2] ^ right.part[2]);
+ return
+ ret;
+ };
+
+ template<class type>
+ inline void operator ^= (type & right)
+ {
+ *this=*this^right;
+ };
+
+ inline operator bool() const
+ {
+ return(
+ part[0] != 0 ||
+ part[1] != 0 ||
+ part[2] != 0);
+ };
+
+ inline operator bool()
+ {
+ return(
+ part[0] != 0 ||
+ part[1] != 0 ||
+ part[2] != 0);
+ };
+
+ inline bool operator ! () const
+ {
+ return(
+ part[0] == 0 &&
+ part[1] == 0 &&
+ part[2] == 0);
+ };
+
+ inline bool operator ! ()
+ {
+ return(
+ part[0] == 0 &&
+ part[1] == 0 &&
+ part[2] == 0);
+ };
+
+ inline uint32 & operator[](uint8 el)
+ {
+ return (part[el]);
+ };
+
+ inline const uint32 & operator[](uint8 el) const
+ {
+ return (part[el]);
+ };
+};
+#endif
diff --git a/src/shared/WorldPacket.h b/src/shared/WorldPacket.h
index 8849b790f01..1eb3f12dd86 100644
--- a/src/shared/WorldPacket.h
+++ b/src/shared/WorldPacket.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h
new file mode 100644
index 00000000000..90e21aa91e5
--- /dev/null
+++ b/src/shared/revision_nr.h
@@ -0,0 +1,4 @@
+#ifndef __REVISION_NR_H__
+#define __REVISION_NR_H__
+ #define REVISION_NR "7334"
+#endif // __REVISION_NR_H__
diff --git a/src/shared/vmap/BaseModel.cpp b/src/shared/vmap/BaseModel.cpp
index f4bf13bc558..2ffd5672218 100644
--- a/src/shared/vmap/BaseModel.cpp
+++ b/src/shared/vmap/BaseModel.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/BaseModel.h b/src/shared/vmap/BaseModel.h
index 6c17f704692..098e1d9381b 100644
--- a/src/shared/vmap/BaseModel.h
+++ b/src/shared/vmap/BaseModel.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/CoordModelMapping.cpp b/src/shared/vmap/CoordModelMapping.cpp
index 319e7bb8c31..c362101ffb4 100644
--- a/src/shared/vmap/CoordModelMapping.cpp
+++ b/src/shared/vmap/CoordModelMapping.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/CoordModelMapping.h b/src/shared/vmap/CoordModelMapping.h
index cfaa600ee81..7c89f0e8a0f 100644
--- a/src/shared/vmap/CoordModelMapping.h
+++ b/src/shared/vmap/CoordModelMapping.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/DebugCmdLogger.cpp b/src/shared/vmap/DebugCmdLogger.cpp
index 2552a16acc2..de656f4cfc5 100644
--- a/src/shared/vmap/DebugCmdLogger.cpp
+++ b/src/shared/vmap/DebugCmdLogger.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/DebugCmdLogger.h b/src/shared/vmap/DebugCmdLogger.h
index a194d335381..5493ab6f332 100644
--- a/src/shared/vmap/DebugCmdLogger.h
+++ b/src/shared/vmap/DebugCmdLogger.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/IVMapManager.h b/src/shared/vmap/IVMapManager.h
index 01aef4b9d4c..243a15aef73 100644
--- a/src/shared/vmap/IVMapManager.h
+++ b/src/shared/vmap/IVMapManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/Makefile.am b/src/shared/vmap/Makefile.am
index 80b297f8def..3829117f2a9 100644
--- a/src/shared/vmap/Makefile.am
+++ b/src/shared/vmap/Makefile.am
@@ -1,6 +1,6 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# Copyright (C) 2008-2009 Trinity <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
@@ -9,50 +9,50 @@
#
# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
-noinst_LIBRARIES = libvmaps.a
+## Sub-directories to parse
-## Preprocessor flags
-libvmaps_a_CPPFLAGS = \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/dep/include/g3dlite
-
-libvmaps_a_SOURCES = \
-$(srcdir)/AABSPTree.h \
-$(srcdir)/BaseModel.cpp \
-$(srcdir)/BaseModel.h \
-$(srcdir)/CoordModelMapping.cpp \
-$(srcdir)/CoordModelMapping.h \
-$(srcdir)/DebugCmdLogger.cpp \
-$(srcdir)/DebugCmdLogger.h \
-$(srcdir)/IVMapManager.h \
-$(srcdir)/ManagedModelContainer.cpp \
-$(srcdir)/ManagedModelContainer.h \
-$(srcdir)/ModelContainer.cpp \
-$(srcdir)/ModelContainer.h \
-$(srcdir)/NodeValueAccess.h \
-$(srcdir)/ShortBox.h \
-$(srcdir)/ShortVector.h \
-$(srcdir)/SubModel.cpp \
-$(srcdir)/SubModel.h \
-$(srcdir)/TileAssembler.cpp \
-$(srcdir)/TileAssembler.h \
-$(srcdir)/TreeNode.cpp \
-$(srcdir)/TreeNode.h \
-$(srcdir)/VMapDefinitions.h \
-$(srcdir)/VMapFactory.cpp \
-$(srcdir)/VMapFactory.h \
-$(srcdir)/VMapManager.cpp \
-$(srcdir)/VMapManager.h \
-$(srcdir)/VMapTools.h
+## CPP flags for includes, defines, etc.
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../../dep/include/g3dlite
+## Build MaNGOS shared library and its parts as convenience library.
+# All libraries will be convenience libraries. Might be changed to shared
+# later.
+noinst_LIBRARIES = libmangosvmaps.a
+libmangosvmaps_a_SOURCES = \
+ AABSPTree.h \
+ BaseModel.cpp \
+ BaseModel.h \
+ CoordModelMapping.cpp \
+ CoordModelMapping.h \
+ DebugCmdLogger.cpp \
+ DebugCmdLogger.h \
+ IVMapManager.h \
+ ManagedModelContainer.cpp \
+ ManagedModelContainer.h \
+ ModelContainer.cpp \
+ ModelContainer.h \
+ NodeValueAccess.h \
+ ShortBox.h \
+ ShortVector.h \
+ SubModel.cpp \
+ SubModel.h \
+ TileAssembler.cpp \
+ TileAssembler.h \
+ TreeNode.cpp \
+ TreeNode.h \
+ VMapDefinitions.h \
+ VMapFactory.cpp \
+ VMapFactory.h \
+ VMapManager.cpp \
+ VMapManager.h \
+ VMapTools.h
diff --git a/src/shared/vmap/ManagedModelContainer.cpp b/src/shared/vmap/ManagedModelContainer.cpp
index 1362002bafd..c7bfefe7179 100644
--- a/src/shared/vmap/ManagedModelContainer.cpp
+++ b/src/shared/vmap/ManagedModelContainer.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/ManagedModelContainer.h b/src/shared/vmap/ManagedModelContainer.h
index 33c675d0806..e6862f915c7 100644
--- a/src/shared/vmap/ManagedModelContainer.h
+++ b/src/shared/vmap/ManagedModelContainer.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/ModelContainer.cpp b/src/shared/vmap/ModelContainer.cpp
index 9eb100161d8..4a722d2585b 100644
--- a/src/shared/vmap/ModelContainer.cpp
+++ b/src/shared/vmap/ModelContainer.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/ModelContainer.h b/src/shared/vmap/ModelContainer.h
index 9613bf53d96..abc96261050 100644
--- a/src/shared/vmap/ModelContainer.h
+++ b/src/shared/vmap/ModelContainer.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/NodeValueAccess.h b/src/shared/vmap/NodeValueAccess.h
index e14a6dba676..54fc5ee99b6 100644
--- a/src/shared/vmap/NodeValueAccess.h
+++ b/src/shared/vmap/NodeValueAccess.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/ShortBox.h b/src/shared/vmap/ShortBox.h
index bffca0d806d..0e98677aa9e 100644
--- a/src/shared/vmap/ShortBox.h
+++ b/src/shared/vmap/ShortBox.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/ShortVector.h b/src/shared/vmap/ShortVector.h
index f7dd0f74859..5f0fb7d9fd8 100644
--- a/src/shared/vmap/ShortVector.h
+++ b/src/shared/vmap/ShortVector.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/SubModel.cpp b/src/shared/vmap/SubModel.cpp
index c6022d2ed69..370c80062d6 100644
--- a/src/shared/vmap/SubModel.cpp
+++ b/src/shared/vmap/SubModel.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/SubModel.h b/src/shared/vmap/SubModel.h
index c52dc7f5c51..89ea9b91d7b 100644
--- a/src/shared/vmap/SubModel.h
+++ b/src/shared/vmap/SubModel.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/TileAssembler.cpp b/src/shared/vmap/TileAssembler.cpp
index e6a1a6f448b..64d67205f68 100644
--- a/src/shared/vmap/TileAssembler.cpp
+++ b/src/shared/vmap/TileAssembler.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
@@ -75,12 +75,12 @@ namespace VMAP
addWorldAreaMapId(0); //Azeroth
addWorldAreaMapId(1); //Kalimdor
addWorldAreaMapId(530); //Expansion01
+ addWorldAreaMapId(571); //Expansion02
}
//=================================================================
std::string getModNameFromModPosName(const std::string& pModPosName)
{
-
size_t spos = pModPosName.find_first_of('#');
std::string modelFileName = pModPosName.substr(0,spos);
return(modelFileName);
@@ -142,7 +142,6 @@ namespace VMAP
//=================================================================
bool TileAssembler::convertWorld()
{
-
#ifdef _ASSEMBLER_DEBUG
# ifdef _DEBUG
::g_df = fopen("../TileAssembler_debug.txt", "wb");
diff --git a/src/shared/vmap/TileAssembler.h b/src/shared/vmap/TileAssembler.h
index a2fe8055fcf..d2183794a9e 100644
--- a/src/shared/vmap/TileAssembler.h
+++ b/src/shared/vmap/TileAssembler.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/TreeNode.cpp b/src/shared/vmap/TreeNode.cpp
index 113199235bf..c884f9b3b1d 100644
--- a/src/shared/vmap/TreeNode.cpp
+++ b/src/shared/vmap/TreeNode.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/TreeNode.h b/src/shared/vmap/TreeNode.h
index d71396487b9..1b9532001e5 100644
--- a/src/shared/vmap/TreeNode.h
+++ b/src/shared/vmap/TreeNode.h
@@ -1,7 +1,7 @@
/*
-* Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
-* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+* Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/VMapDefinitions.h b/src/shared/vmap/VMapDefinitions.h
index 0800bfbda88..fd28a91d515 100644
--- a/src/shared/vmap/VMapDefinitions.h
+++ b/src/shared/vmap/VMapDefinitions.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/VMapFactory.cpp b/src/shared/vmap/VMapFactory.cpp
index 2dad2047189..5189f79daba 100644
--- a/src/shared/vmap/VMapFactory.cpp
+++ b/src/shared/vmap/VMapFactory.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/VMapFactory.h b/src/shared/vmap/VMapFactory.h
index 9a4493d8817..f3375d723c1 100644
--- a/src/shared/vmap/VMapFactory.h
+++ b/src/shared/vmap/VMapFactory.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/VMapManager.cpp b/src/shared/vmap/VMapManager.cpp
index 3b93b63086b..f5c2640be70 100644
--- a/src/shared/vmap/VMapManager.cpp
+++ b/src/shared/vmap/VMapManager.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/VMapManager.h b/src/shared/vmap/VMapManager.h
index 8ece6de4652..bfeba3cfe67 100644
--- a/src/shared/vmap/VMapManager.h
+++ b/src/shared/vmap/VMapManager.h
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/shared/vmap/VMapTools.h b/src/shared/vmap/VMapTools.h
index 4961064d188..3af3a29310d 100644
--- a/src/shared/vmap/VMapTools.h
+++ b/src/shared/vmap/VMapTools.h
@@ -1,7 +1,7 @@
/*
-* Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
-* Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+* Copyright (C) 2008-2009 Trinity <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
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
index 333cba05861..81040a49592 100644
--- a/src/tools/Makefile.am
+++ b/src/tools/Makefile.am
@@ -1,2 +1,23 @@
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+#
+# 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+## Process this file with automake to produce Makefile.in
+
## Sub-directories to parse
SUBDIRS = genrevision
+
+## Additional files to include when running 'make dist'
+# Nothing yet.
diff --git a/src/tools/genrevision/Makefile.am b/src/tools/genrevision/Makefile.am
index faf5451f652..3f60ac14ab2 100644
--- a/src/tools/genrevision/Makefile.am
+++ b/src/tools/genrevision/Makefile.am
@@ -1,17 +1,35 @@
+# Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+#
+# 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+## Process this file with automake to produce Makefile.in
+
## CPP flags for includes, defines, etc.
AM_CPPFLAGS = -I$(srcdir)
## Build world list daemon as standalone program
bin_PROGRAMS = genrevision
genrevision_SOURCES = \
- genrevision.cpp
+ genrevision.cpp
## Link world daemon against the shared library
-genrevision_LDADD =
+genrevision_LDADD =
genrevision_LDFLAGS = -L$(libdir)
## Additional files to include when running 'make dist'
# Include world daemon configuration
-#EXTRA_DIST =
+#EXTRA_DIST =
## Additional files to install
diff --git a/src/tools/genrevision/genrevision.cpp b/src/tools/genrevision/genrevision.cpp
index 16f8aa77efa..1fefe3677fe 100644
--- a/src/tools/genrevision/genrevision.cpp
+++ b/src/tools/genrevision/genrevision.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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
diff --git a/src/trinitycore/CliRunnable.cpp b/src/trinitycore/CliRunnable.cpp
index 839358e7034..e256128ed90 100644
--- a/src/trinitycore/CliRunnable.cpp
+++ b/src/trinitycore/CliRunnable.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinitycore/Main.cpp b/src/trinitycore/Main.cpp
index 4be314d75f3..43783dc24ee 100644
--- a/src/trinitycore/Main.cpp
+++ b/src/trinitycore/Main.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinitycore/Makefile.am b/src/trinitycore/Makefile.am
deleted file mode 100644
index ad1b78d9033..00000000000
--- a/src/trinitycore/Makefile.am
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
-#
-# Copyright (C) 2008 Trinity <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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-## Process this file with automake to produce Makefile.in
-
-## Build world list daemon as standalone program
-bin_PROGRAMS = trinity-core
-
-## Preprocessor flags
-trinity_core_CPPFLAGS = \
-$(MYSQL_INCLUDES) \
-$(POSTGRE_INCLUDES) \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/src/shared \
--I$(top_srcdir)/src/framework \
--I$(top_srcdir)/src/game \
--D_TRINITY_CORE_CONFIG='"$(sysconfdir)/trinitycore.conf"'
-
-## Sources
-trinity_core_SOURCES = \
-$(srcdir)/CliRunnable.cpp \
-$(srcdir)/CliRunnable.h \
-$(srcdir)/Main.cpp \
-$(srcdir)/Master.cpp \
-$(srcdir)/Master.h \
-$(srcdir)/RASocket.cpp \
-$(srcdir)/RASocket.h \
-$(srcdir)/WorldRunnable.cpp \
-$(srcdir)/WorldRunnable.h
-
-## Convenience libs to add
-trinity_core_LDADD = \
-$(top_builddir)/src/game/libgame.a \
-$(top_builddir)/src/shared/libshared.a \
-$(top_builddir)/src/shared/vmap/libvmaps.a \
-$(top_builddir)/src/framework/libmangosframework.a \
-$(top_builddir)/dep/src/sockets/libmangossockets.a \
-$(top_builddir)/dep/src/zthread/libZThread.la \
-$(top_builddir)/dep/src/g3dlite/libg3dlite.a
-
-if USE_TSCRIPTS
-trinity_core_LDADD += $(top_builddir)/src/bindings/scripts/libtrinityscript.la
-else
-trinity_core_LDADD += $(top_builddir)/src/bindings/interface/libtrinityscript.la
-endif
-
-## Linker flags
-trinity_core_LDFLAGS = $(MYSQL_LIBS) $(POSTGRE_LIBS) $(ZLIB) $(COMPATLIB) $(SSLLIB) $(TRINI_LIBS) -export-dynamic
-
-## Additional files to install
-sysconf_DATA = \
- trinitycore.conf.dist
-
-EXTRA_DIST = \
- trinitycore.conf.dist
-
-## Prevend overwrite of the config file, if its already installed
-install-data-hook:
- @list='$(sysconf_DATA)'; for p in $$list; do \
- dest=`echo $$p | sed -e s/.dist//`; \
- if test -f $(DESTDIR)$(sysconfdir)/$$dest; then \
- echo "$@ will not overwrite existing $(DESTDIR)$(sysconfdir)/$$dest"; \
- else \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(sysconfdir)/$$dest"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(sysconfdir)/$$dest; \
- fi; \
- done
-
-
diff --git a/src/trinitycore/Master.cpp b/src/trinitycore/Master.cpp
index 8fd5af08800..557124ca5e0 100644
--- a/src/trinitycore/Master.cpp
+++ b/src/trinitycore/Master.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinitycore/RASocket.cpp b/src/trinitycore/RASocket.cpp
index 62a5dbc39c9..48749b09ceb 100644
--- a/src/trinitycore/RASocket.cpp
+++ b/src/trinitycore/RASocket.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinitycore/WorldRunnable.cpp b/src/trinitycore/WorldRunnable.cpp
index 73d99e66061..b29e1434a64 100644
--- a/src/trinitycore/WorldRunnable.cpp
+++ b/src/trinitycore/WorldRunnable.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinityrealm/AuthSocket.cpp b/src/trinityrealm/AuthSocket.cpp
index 3dc6b3a5c28..dd7bc31e45b 100644
--- a/src/trinityrealm/AuthSocket.cpp
+++ b/src/trinityrealm/AuthSocket.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinityrealm/Main.cpp b/src/trinityrealm/Main.cpp
index 05fd704c10b..8c2c199b2f4 100644
--- a/src/trinityrealm/Main.cpp
+++ b/src/trinityrealm/Main.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/src/trinityrealm/Makefile.am b/src/trinityrealm/Makefile.am
deleted file mode 100644
index 9baeed6c2b1..00000000000
--- a/src/trinityrealm/Makefile.am
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
-#
-# Copyright (C) 2008 Trinity <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, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-## Process this file with automake to produce Makefile.in
-
-## Build realm list daemon as standalone program
-bin_PROGRAMS = trinity-realm
-
-## Preprocessor flags
-trinity_realm_CPPFLAGS = \
-$(MYSQL_INCLUDES) \
-$(POSTGRE_INCLUDES) \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/src/framework \
--I$(top_srcdir)/src/shared \
--D_TRINITY_REALM_CONFIG='"$(sysconfdir)/trinityrealm.conf"'
-
-## Sources
-trinity_realm_SOURCES = \
-$(srcdir)/AuthCodes.h \
-$(srcdir)/AuthSocket.cpp \
-$(srcdir)/AuthSocket.h \
-$(srcdir)/Main.cpp \
-$(srcdir)/RealmList.cpp \
-$(srcdir)/RealmList.h
-
-## Convenience libs to add
-trinity_realm_LDADD = \
-$(top_builddir)/src/shared/libshared.a \
-$(top_builddir)/src/framework/libmangosframework.a \
-$(top_builddir)/dep/src/sockets/libmangossockets.a \
-$(top_builddir)/dep/src/zthread/libZThread.la
-
-## Linker flags
-trinity_realm_LDFLAGS = $(MYSQL_LIBS) $(POSTGRE_LIBS) $(ZLIB) $(COMPATLIB) $(SSLLIB) $(TRINI_LIBS)
-
-## Additional files to install
-sysconf_DATA = \
- trinityrealm.conf.dist
-
-## Prevend overwrite of the config file, if its already installed
-install-data-hook:
- @list='$(sysconf_DATA)'; for p in $$list; do \
- dest=`echo $$p | sed -e s/.dist//`; \
- if test -f $(DESTDIR)$(sysconfdir)/$$dest; then \
- echo "$@ will not overwrite existing $(DESTDIR)$(sysconfdir)/$$dest"; \
- else \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(sysconfdir)/$$dest"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(sysconfdir)/$$dest; \
- fi; \
- done
-
-## Additional files to include when running 'make dist'
-EXTRA_DIST = trinityrealm.conf.dist
-
-
diff --git a/src/trinityrealm/RealmList.cpp b/src/trinityrealm/RealmList.cpp
index ca4dc9271b7..692f457b1a8 100644
--- a/src/trinityrealm/RealmList.cpp
+++ b/src/trinityrealm/RealmList.cpp
@@ -1,7 +1,7 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008-2009 Trinity <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
diff --git a/win/TrinityCore&Script VC80.sln b/win/TrinityCore&Script VC80.sln
index 8a8b94fcc24..7727cc9db42 100644
--- a/win/TrinityCore&Script VC80.sln
+++ b/win/TrinityCore&Script VC80.sln
@@ -25,7 +25,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3dlite", "VC80\g3dlite.vcp
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC80\sockets.vcproj", "{04BAF755-0D67-46F8-B1C6-77AE5368F3CB}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\mangosd.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
ProjectSection(ProjectDependencies) = postProject
{563E9905-3657-460C-AE63-0AC39D162E23} = {563E9905-3657-460C-AE63-0AC39D162E23}
{90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED}
@@ -33,7 +33,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\Trinity
{1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC80\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC80\realmd.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
ProjectSection(ProjectDependencies) = postProject
{90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED}
{04BAF755-0D67-46F8-B1C6-77AE5368F3CB} = {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}
diff --git a/win/TrinityCore&Script VC90.sln b/win/TrinityCore&Script VC90.sln
index ec569322d97..0353ef3c8f6 100644
--- a/win/TrinityCore&Script VC90.sln
+++ b/win/TrinityCore&Script VC90.sln
@@ -25,7 +25,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3dlite", "VC90\g3dlite.vcp
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC90\sockets.vcproj", "{04BAF755-0D67-46F8-B1C6-77AE5368F3CB}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\mangosd.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
ProjectSection(ProjectDependencies) = postProject
{563E9905-3657-460C-AE63-0AC39D162E23} = {563E9905-3657-460C-AE63-0AC39D162E23}
{90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED}
@@ -33,7 +33,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\Trinity
{1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\realmd.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
ProjectSection(ProjectDependencies) = postProject
{90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED}
{04BAF755-0D67-46F8-B1C6-77AE5368F3CB} = {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}
@@ -72,6 +72,14 @@ Global
{90297C34-F231-4DF4-848E-A74BCC0E40ED}.Release|Win32.Build.0 = Release|Win32
{90297C34-F231-4DF4-848E-A74BCC0E40ED}.Release|x64.ActiveCfg = Release|x64
{90297C34-F231-4DF4-848E-A74BCC0E40ED}.Release|x64.Build.0 = Release|x64
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|Win32.Build.0 = Debug|Win32
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|x64.ActiveCfg = Debug|x64
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|x64.Build.0 = Debug|x64
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|Win32.ActiveCfg = Release|Win32
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|Win32.Build.0 = Release|Win32
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|x64.ActiveCfg = Release|x64
+ {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|x64.Build.0 = Release|x64
{262199E8-EEDF-4700-A1D1-E9CC901CF480}.Debug|Win32.ActiveCfg = Debug|Win32
{262199E8-EEDF-4700-A1D1-E9CC901CF480}.Debug|Win32.Build.0 = Debug|Win32
{262199E8-EEDF-4700-A1D1-E9CC901CF480}.Debug|x64.ActiveCfg = Debug|x64
@@ -96,30 +104,6 @@ Global
{BF6F5D0E-33A5-4E23-9E7D-DD481B7B5B9E}.Release|Win32.Build.0 = Release|Win32
{BF6F5D0E-33A5-4E23-9E7D-DD481B7B5B9E}.Release|x64.ActiveCfg = Release|x64
{BF6F5D0E-33A5-4E23-9E7D-DD481B7B5B9E}.Release|x64.Build.0 = Release|x64
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|Win32.ActiveCfg = Debug|Win32
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|Win32.Build.0 = Debug|Win32
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|x64.ActiveCfg = Debug|x64
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|x64.Build.0 = Debug|x64
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|Win32.ActiveCfg = Release|Win32
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|Win32.Build.0 = Release|Win32
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|x64.ActiveCfg = Release|x64
- {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|x64.Build.0 = Release|x64
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|Win32.ActiveCfg = Debug|Win32
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|Win32.Build.0 = Debug|Win32
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|x64.ActiveCfg = Debug|x64
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|x64.Build.0 = Debug|x64
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|Win32.ActiveCfg = Release|Win32
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|Win32.Build.0 = Release|Win32
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|x64.ActiveCfg = Release|x64
- {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|x64.Build.0 = Release|x64
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|Win32.ActiveCfg = Debug|Win32
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|Win32.Build.0 = Debug|Win32
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|x64.ActiveCfg = Debug|x64
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Debug|x64.Build.0 = Debug|x64
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|Win32.ActiveCfg = Release|Win32
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|Win32.Build.0 = Release|Win32
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|x64.ActiveCfg = Release|x64
- {A3A04E47-43A2-4C08-90B3-029CEF558594}.Release|x64.Build.0 = Release|x64
{563E9905-3657-460C-AE63-0AC39D162E23}.Debug|Win32.ActiveCfg = Debug|Win32
{563E9905-3657-460C-AE63-0AC39D162E23}.Debug|Win32.Build.0 = Debug|Win32
{563E9905-3657-460C-AE63-0AC39D162E23}.Debug|x64.ActiveCfg = Debug|x64
@@ -136,6 +120,22 @@ Global
{4295C8A9-79B7-4354-8064-F05FB9CA0C96}.Release|Win32.Build.0 = Release|Win32
{4295C8A9-79B7-4354-8064-F05FB9CA0C96}.Release|x64.ActiveCfg = Release|x64
{4295C8A9-79B7-4354-8064-F05FB9CA0C96}.Release|x64.Build.0 = Release|x64
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|Win32.Build.0 = Debug|Win32
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|x64.ActiveCfg = Debug|x64
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Debug|x64.Build.0 = Debug|x64
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|Win32.ActiveCfg = Release|Win32
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|Win32.Build.0 = Release|Win32
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|x64.ActiveCfg = Release|x64
+ {8072769E-CF10-48BF-B9E1-12752A5DAC6E}.Release|x64.Build.0 = Release|x64
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|Win32.Build.0 = Debug|Win32
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|x64.ActiveCfg = Debug|x64
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Debug|x64.Build.0 = Debug|x64
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|Win32.ActiveCfg = Release|Win32
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|Win32.Build.0 = Release|Win32
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|x64.ActiveCfg = Release|x64
+ {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}.Release|x64.Build.0 = Release|x64
{BD537C9A-FECA-1BAD-6757-8A6348EA12C8}.Debug|Win32.ActiveCfg = Debug|Win32
{BD537C9A-FECA-1BAD-6757-8A6348EA12C8}.Debug|Win32.Build.0 = Debug|Win32
{BD537C9A-FECA-1BAD-6757-8A6348EA12C8}.Debug|x64.ActiveCfg = Debug|x64
diff --git a/win/VC71/game.vcproj b/win/VC71/game.vcproj
index 4aa5fa649cc..f57d1dfcf3d 100644
--- a/win/VC71/game.vcproj
+++ b/win/VC71/game.vcproj
@@ -128,78 +128,60 @@
</References>
<Files>
<Filter
- Name="World/Others"
- >
+ Name="World/Handlers">
<File
- RelativePath="..\..\src\game\AuctionHouse.cpp"
- >
+ RelativePath="..\..\src\game\AccountMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\Channel.cpp"
- >
+ RelativePath="..\..\src\game\AccountMgr.h">
</File>
<File
- RelativePath="..\..\src\game\Channel.h"
- >
+ RelativePath="..\..\src\game\AchievementMgr.cpp">
+
</File>
<File
- RelativePath="..\..\src\game\Chat.cpp"
- >
+ RelativePath="..\..\src\game\AchievementMgr.h">
+
</File>
<File
- RelativePath="..\..\src\game\Chat.h"
- >
+ RelativePath="..\..\src\game\AddonHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\GameEvent.cpp"
- >
+ RelativePath="..\..\src\game\AddonHandler.h">
</File>
<File
- RelativePath="..\..\src\game\GameEvent.h"
- >
+ RelativePath="..\..\src\game\ArenaTeamHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\GossipDef.cpp"
- >
+ RelativePath="..\..\src\game\AuctionHouseHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\GossipDef.h"
- >
+ RelativePath="..\..\src\game\BattleGround.cpp">
</File>
<File
- RelativePath="..\..\src\game\Mail.cpp"
- >
+ RelativePath="..\..\src\game\BattleGround.h">
</File>
<File
- RelativePath="..\..\src\game\Mail.h"
- >
+ RelativePath="..\..\src\game\BattleGroundAA.cpp">
</File>
<File
- RelativePath="..\..\src\game\QuestDef.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundAA.h">
</File>
<File
- RelativePath="..\..\src\game\QuestDef.h"
- >
+ RelativePath="..\..\src\game\BattleGroundAB.cpp">
</File>
<File
- RelativePath="..\..\src\game\UpdateData.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundAB.h">
</File>
<File
- RelativePath="..\..\src\game\UpdateData.h"
- >
+ RelativePath="..\..\src\game\BattleGroundAV.cpp">
</File>
<File
- RelativePath="..\..\src\game\World.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundAV.h">
</File>
<File
- RelativePath="..\..\src\game\World.h"
- >
+ RelativePath="..\..\src\game\BattleGroundBE.cpp">
</File>
- </Filter>
- <Filter
Name="AuctionHouseBot"
>
<File
@@ -210,19 +192,14 @@
</File>
</Filter>
<Filter
- Name="Objects"
- >
<File
- RelativePath="..\..\src\game\ArenaTeam.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundBE.h">
</File>
<File
- RelativePath="..\..\src\game\ArenaTeam.h"
- >
+ RelativePath="..\..\src\game\BattleGroundDS.cpp">
</File>
<File
- RelativePath="..\..\src\game\AuctionHouseObject.h"
- >
+ RelativePath="..\..\src\game\BattleGroundDS.h">
</File>
<File
RelativePath="..\..\src\game\AuctionHouseBot.cpp">
@@ -231,1012 +208,805 @@
RelativePath="..\..\src\game\AuctionHouseBot.h">
</File>
<File
- RelativePath="..\..\src\game\Bag.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundEY.cpp">
</File>
<File
- RelativePath="..\..\src\game\Bag.h"
- >
+ RelativePath="..\..\src\game\BattleGroundEY.h">
</File>
<File
- RelativePath="..\..\src\game\Corpse.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Corpse.h"
- >
+ RelativePath="..\..\src\game\BattleGroundMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\Creature.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundMgr.h">
</File>
<File
- RelativePath="..\..\src\game\Creature.h"
- >
+ RelativePath="..\..\src\game\BattleGroundNA.cpp">
</File>
<File
- RelativePath="..\..\src\game\CreatureGroups.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundNA.h">
</File>
<File
- RelativePath="..\..\src\game\CreatureGroups.h"
- >
+ RelativePath="..\..\src\game\BattleGroundRL.cpp">
</File>
<File
- RelativePath="..\..\src\game\DestinationHolder.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundRL.h">
</File>
<File
- RelativePath="..\..\src\game\DestinationHolder.h"
- >
+ RelativePath="..\..\src\game\BattleGroundRV.cpp">
</File>
<File
- RelativePath="..\..\src\game\DestinationHolderImp.h"
- >
+ RelativePath="..\..\src\game\BattleGroundRV.h">
</File>
<File
- RelativePath="..\..\src\game\DynamicObject.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundSA.cpp">
</File>
<File
- RelativePath="..\..\src\game\DynamicObject.h"
- >
+ RelativePath="..\..\src\game\BattleGroundSA.h">
</File>
<File
- RelativePath="..\..\src\game\Formulas.h"
- >
+ RelativePath="..\..\src\game\BattleGroundWS.cpp">
</File>
<File
- RelativePath="..\..\src\game\GameObject.cpp"
- >
+ RelativePath="..\..\src\game\BattleGroundWS.h">
</File>
<File
- RelativePath="..\..\src\game\GameObject.h"
- >
+ RelativePath="..\..\src\game\CalendarHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Group.cpp"
- >
+ RelativePath="..\..\src\game\Cell.h">
</File>
<File
- RelativePath="..\..\src\game\Group.h"
- >
+ RelativePath="..\..\src\game\CellImpl.h">
</File>
<File
- RelativePath="..\..\src\game\Guild.cpp"
- >
+ RelativePath="..\..\src\game\Channel.cpp">
</File>
<File
- RelativePath="..\..\src\game\Guild.h"
- >
+ RelativePath="..\..\src\game\Channel.h">
</File>
<File
- RelativePath="..\..\src\game\Item.cpp"
- >
+ RelativePath="..\..\src\game\ChannelHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Item.h"
- >
+ RelativePath="..\..\src\game\ChannelMgr.h">
</File>
<File
- RelativePath="..\..\src\game\ItemPrototype.h"
- >
+ RelativePath="..\..\src\game\CharacterHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\MotionMaster.cpp"
- >
+ RelativePath="..\..\src\game\Chat.cpp">
</File>
<File
- RelativePath="..\..\src\game\MotionMaster.h"
- >
+ RelativePath="..\..\src\game\Chat.h">
</File>
<File
- RelativePath="..\..\src\game\Object.cpp"
- >
+ RelativePath="..\..\src\game\ChatHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Object.h"
- >
+ RelativePath="..\..\src\game\CombatHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\ObjectAccessor.cpp"
- >
+ RelativePath="..\..\src\game\DuelHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\ObjectAccessor.h"
- >
+ RelativePath="..\..\src\game\GameEvent.cpp">
</File>
<File
- RelativePath="..\..\src\game\ObjectDefines.h"
- >
+ RelativePath="..\..\src\game\GameEvent.h">
</File>
<File
- RelativePath="..\..\src\game\Pet.cpp"
- >
+ RelativePath="..\..\src\game\GossipDef.cpp">
</File>
<File
- RelativePath="..\..\src\game\Pet.h"
- >
+ RelativePath="..\..\src\game\GossipDef.h">
</File>
<File
- RelativePath="..\..\src\game\Player.cpp"
- >
+ RelativePath="..\..\src\game\GridDefines.h">
</File>
<File
- RelativePath="..\..\src\game\Player.h"
- >
+ RelativePath="..\..\src\game\GridNotifiers.cpp">
</File>
<File
- RelativePath="..\..\src\game\TemporarySummon.cpp"
- >
+ RelativePath="..\..\src\game\GridNotifiers.h">
</File>
<File
- RelativePath="..\..\src\game\TemporarySummon.h"
- >
+ RelativePath="..\..\src\game\GridNotifiersImpl.h">
</File>
<File
- RelativePath="..\..\src\game\Totem.cpp"
- >
+ RelativePath="..\..\src\game\GridStates.cpp">
</File>
<File
- RelativePath="..\..\src\game\Totem.h"
- >
+ RelativePath="..\..\src\game\GridStates.h">
</File>
<File
- RelativePath="..\..\src\game\Traveller.h"
- >
+ RelativePath="..\..\src\game\Group.cpp">
</File>
<File
- RelativePath="..\..\src\game\Unit.cpp"
- >
+ RelativePath="..\..\src\game\Group.h">
</File>
<File
- RelativePath="..\..\src\game\Unit.h"
- >
+ RelativePath="..\..\src\game\GroupHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\UnitEvents.h"
- >
+ RelativePath="..\..\src\game\GuildHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\UpdateFields.h"
- >
+ RelativePath="..\..\src\game\InstanceData.cpp">
</File>
<File
- RelativePath="..\..\src\game\UpdateMask.h"
- >
+ RelativePath="..\..\src\game\InstanceData.h">
</File>
- </Filter>
- <Filter
- Name="Server"
- >
<File
- RelativePath="..\..\src\game\GlobalEvents.cpp"
- >
+ RelativePath="..\..\src\game\InstanceSaveMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\GlobalEvents.h"
- >
+ RelativePath="..\..\src\game\InstanceSaveMgr.h">
</File>
<File
- RelativePath="..\..\src\game\Opcodes.cpp"
- >
+ RelativePath="..\..\src\game\ItemHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Opcodes.h"
- >
+ RelativePath="..\..\src\game\LFGHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\SharedDefines.h"
- >
+ RelativePath="..\..\src\game\LootHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\WorldLog.cpp"
- >
+ RelativePath="..\..\src\game\Mail.cpp">
</File>
<File
- RelativePath="..\..\src\game\WorldLog.h"
- >
+ RelativePath="..\..\src\game\Mail.h">
</File>
<File
- RelativePath="..\..\src\game\WorldSession.cpp"
- >
+ RelativePath="..\..\src\game\Map.cpp">
</File>
<File
- RelativePath="..\..\src\game\WorldSession.h"
- >
+ RelativePath="..\..\src\game\Map.h">
</File>
<File
- RelativePath="..\..\src\game\WorldSocket.cpp"
- >
+ RelativePath="..\..\src\game\MapInstanced.cpp">
</File>
<File
- RelativePath="..\..\src\game\WorldSocket.h"
- >
+ RelativePath="..\..\src\game\MapInstanced.h">
</File>
<File
- RelativePath="..\..\src\game\WorldSocketMgr.cpp"
- >
+ RelativePath="..\..\src\game\MapManager.cpp">
</File>
<File
- RelativePath="..\..\src\game\WorldSocketMgr.h"
- >
+ RelativePath="..\..\src\game\MapManager.h">
</File>
- </Filter>
- <Filter
- Name="Chat Commands"
- >
<File
- RelativePath="..\..\src\game\Debugcmds.cpp"
- >
+ RelativePath="..\..\src\game\MapReference.h">
</File>
<File
- RelativePath="..\..\src\game\Level0.cpp"
- >
- </File>
+ RelativePath="..\..\src\game\MapRefManager.h">
+ </File>
<File
- RelativePath="..\..\src\game\Level1.cpp"
- >
+ RelativePath="..\..\src\game\MiscHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Level2.cpp"
- >
+ RelativePath="..\..\src\game\MovementHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\Level3.cpp"
- >
+ RelativePath="..\..\src\game\NPCHandler.cpp">
</File>
- </Filter>
- <Filter
- Name="Tools"
- >
<File
- RelativePath="..\..\src\game\Language.h"
- >
+ RelativePath="..\..\src\game\NPCHandler.h">
</File>
<File
- RelativePath="..\..\src\game\PlayerDump.cpp"
- >
+ RelativePath="..\..\src\game\ObjectGridLoader.cpp">
</File>
<File
- RelativePath="..\..\src\game\PlayerDump.h"
- >
+ RelativePath="..\..\src\game\ObjectGridLoader.h">
</File>
<File
- RelativePath="..\..\src\game\ScriptCalls.cpp"
+ RelativePath="..\..\src\game\OutdoorPvP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ScriptCalls.h"
+ RelativePath="..\..\src\game\OutdoorPvP.h"
>
</File>
<File
- RelativePath="..\..\src\game\Tools.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPEP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Tools.h"
+ RelativePath="..\..\src\game\OutdoorPvPEP.h"
>
</File>
- </Filter>
- <Filter
- Name="References"
- >
<File
- RelativePath="..\..\src\game\FollowerReference.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPHP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\FollowerReference.h"
+ RelativePath="..\..\src\game\OutdoorPvPHP.h"
>
</File>
<File
- RelativePath="..\..\src\game\FollowerRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupReference.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\GroupReference.h"
+ RelativePath="..\..\src\game\OutdoorPvPNA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPNA.h"
>
</File>
<File
- RelativePath="..\..\src\game\HostilRefManager.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPSI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\HostilRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPSI.h"
>
</File>
<File
- RelativePath="..\..\src\game\ThreatManager.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPTF.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ThreatManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPTF.h"
>
</File>
- </Filter>
- <Filter
- Name="Battlegrounds"
- >
<File
- RelativePath="..\..\src\game\BattleGround.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPZM.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGround.h"
+ RelativePath="..\..\src\game\OutdoorPvPZM.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAA.cpp"
- >
+ RelativePath="..\..\src\game\Path.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAA.h"
- >
+ RelativePath="..\..\src\game\PetHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAB.cpp"
- >
+ RelativePath="..\..\src\game\PetitionsHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAB.h"
- >
+ RelativePath="..\..\src\game\PoolHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAV.cpp"
- >
+ RelativePath="..\..\src\game\PoolHandler.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAV.h"
- >
+ RelativePath="..\..\src\game\QueryHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundBE.cpp"
- >
+ RelativePath="..\..\src\game\QuestDef.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundBE.h"
- >
+ RelativePath="..\..\src\game\QuestDef.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundEY.cpp"
- >
+ RelativePath="..\..\src\game\QuestHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundEY.h"
- >
+ RelativePath="..\..\src\game\ScriptCalls.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundHandler.cpp"
- >
+ RelativePath="..\..\src\game\ScriptCalls.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundMgr.cpp"
- >
+ RelativePath="..\..\src\game\SkillDiscovery.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundMgr.h"
- >
+ RelativePath="..\..\src\game\SkillDiscovery.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundNA.cpp"
- >
+ RelativePath="..\..\src\game\SkillExtraItems.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundNA.h"
- >
+ RelativePath="..\..\src\game\SkillExtraItems.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundRL.cpp"
- >
+ RelativePath="..\..\src\game\SkillHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundRL.h"
- >
+ RelativePath="..\..\src\game\Spell.cpp">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundWS.cpp"
- >
+ RelativePath="..\..\src\game\Spell.h">
</File>
<File
- RelativePath="..\..\src\game\BattleGroundWS.h"
- >
+ RelativePath="..\..\src\game\SpellAuraDefines.h">
</File>
- </Filter>
- <Filter
- Name="Outdoor PvP"
- >
<File
- RelativePath="..\..\src\game\OutdoorPvP.cpp"
- >
+ RelativePath="..\..\src\game\SpellAuras.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvP.h"
- >
+ RelativePath="..\..\src\game\SpellAuras.h">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPEP.cpp"
- >
+ RelativePath="..\..\src\game\SpellEffects.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPEP.h"
- >
+ RelativePath="..\..\src\game\SpellHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPHP.cpp"
- >
+ RelativePath="..\..\src\game\TaxiHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPHP.h"
- >
+ RelativePath="..\..\src\game\TicketHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"
- >
+ RelativePath="..\..\src\game\TradeHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPMgr.h"
- >
+ RelativePath="..\..\src\game\Transports.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPNA.cpp"
- >
+ RelativePath="..\..\src\game\Transports.h">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPNA.h"
- >
+ RelativePath="..\..\src\game\UpdateData.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp"
- >
+ RelativePath="..\..\src\game\UpdateData.h">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h"
- >
+ RelativePath="..\..\src\game\VoiceChatHandler.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPSI.cpp"
- >
+ RelativePath="..\..\src\game\WaypointManager.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPSI.h"
- >
+ RelativePath="..\..\src\game\WaypointManager.h">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPTF.cpp"
- >
+ RelativePath="..\..\src\game\Weather.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPTF.h"
- >
+ RelativePath="..\..\src\game\Weather.h">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPZM.cpp"
- >
+ RelativePath="..\..\src\game\World.cpp">
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPZM.h"
- >
+ RelativePath="..\..\src\game\World.h">
</File>
</Filter>
<Filter
- Name="Artificial Intelligence"
- >
+ Name="Object">
<File
- RelativePath="..\..\src\game\AggressorAI.cpp"
- >
+ RelativePath="..\..\src\game\AggressorAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\AggressorAI.h"
- >
+ RelativePath="..\..\src\game\AggressorAI.h">
</File>
<File
- RelativePath="..\..\src\game\CreatureAI.cpp"
- >
+ RelativePath="..\..\src\game\AnimalRandomMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\CreatureAI.h"
- >
+ RelativePath="..\..\src\game\ArenaTeam.cpp">
</File>
<File
- RelativePath="..\..\src\game\CreatureAIImpl.h"
- >
+ RelativePath="..\..\src\game\ArenaTeam.h">
</File>
<File
- RelativePath="..\..\src\game\CreatureAIRegistry.cpp"
- >
+ RelativePath="..\..\src\game\AuctionHouseMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\CreatureAIRegistry.h"
- >
+ RelativePath="..\..\src\game\AuctionHouseMgr.h">
</File>
<File
- RelativePath="..\..\src\game\CreatureAISelector.cpp"
- >
+ RelativePath="..\..\src\game\Bag.cpp">
</File>
<File
- RelativePath="..\..\src\game\CreatureAISelector.h"
- >
+ RelativePath="..\..\src\game\Bag.h">
</File>
<File
- RelativePath="..\..\src\game\GuardAI.cpp"
- >
+ RelativePath="..\..\src\game\Calendar.cpp">
</File>
<File
- RelativePath="..\..\src\game\GuardAI.h"
- >
+ RelativePath="..\..\src\game\Calendar.h">
</File>
<File
- RelativePath="..\..\src\game\NullCreatureAI.cpp"
- >
+ RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\NullCreatureAI.h"
- >
+ RelativePath="..\..\src\game\ConfusedMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\PetAI.cpp"
- >
+ RelativePath="..\..\src\game\Corpse.cpp">
</File>
<File
- RelativePath="..\..\src\game\PetAI.h"
- >
+ RelativePath="..\..\src\game\Corpse.h">
</File>
<File
- RelativePath="..\..\src\game\PossessedAI.cpp"
- >
+ RelativePath="..\..\src\game\Creature.cpp">
</File>
<File
- RelativePath="..\..\src\game\PossessedAI.h"
- >
+ RelativePath="..\..\src\game\Creature.h">
</File>
<File
- RelativePath="..\..\src\game\ReactorAI.cpp"
- >
+ RelativePath="..\..\src\game\CreatureAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\ReactorAI.h"
- >
+ RelativePath="..\..\src\game\CreatureAI.h">
</File>
<File
- RelativePath="..\..\src\game\TotemAI.cpp"
- >
+ RelativePath="..\..\src\game\CreatureAIImpl.h">
</File>
<File
- RelativePath="..\..\src\game\TotemAI.h"
- >
+ RelativePath="..\..\src\game\CreatureAIRegistry.cpp">
</File>
- </Filter>
- <Filter
- Name="Movement Generators"
- >
<File
- RelativePath="..\..\src\game\AnimalRandomMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\CreatureAIRegistry.h">
</File>
<File
- RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\CreatureAISelector.cpp">
</File>
<File
- RelativePath="..\..\src\game\ConfusedMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\CreatureAISelector.h">
</File>
<File
- RelativePath="..\..\src\game\FleeingMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\CreatureGroups.cpp">
</File>
<File
- RelativePath="..\..\src\game\FleeingMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\CreatureGroups.h">
</File>
<File
- RelativePath="..\..\src\game\HomeMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\DestinationHolder.cpp">
</File>
<File
- RelativePath="..\..\src\game\HomeMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\DestinationHolder.h">
</File>
<File
- RelativePath="..\..\src\game\IdleMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\DestinationHolderImp.h">
</File>
<File
- RelativePath="..\..\src\game\IdleMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\DynamicObject.cpp">
</File>
<File
- RelativePath="..\..\src\game\MovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\DynamicObject.h">
</File>
<File
- RelativePath="..\..\src\game\MovementGenerator.h"
- >
+ RelativePath="..\..\src\game\FleeingMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\PointMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\FleeingMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\PointMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\Formulas.h">
</File>
<File
- RelativePath="..\..\src\game\RandomMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\GameObject.cpp">
</File>
<File
- RelativePath="..\..\src\game\RandomMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\GameObject.h">
</File>
+
<File
- RelativePath="..\..\src\game\TargetedMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\GuardAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\TargetedMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\GuardAI.h">
</File>
<File
- RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
- >
+ RelativePath="..\..\src\game\Guild.cpp">
</File>
<File
- RelativePath="..\..\src\game\WaypointMovementGenerator.h"
- >
+ RelativePath="..\..\src\game\Guild.h">
</File>
- </Filter>
- <Filter
- Name="Spells/Skills"
- >
<File
- RelativePath="..\..\src\game\SkillDiscovery.cpp"
- >
+ RelativePath="..\..\src\game\HomeMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\SkillDiscovery.h"
- >
+ RelativePath="..\..\src\game\HomeMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\SkillExtraItems.cpp"
- >
+ RelativePath="..\..\src\game\IdleMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\SkillExtraItems.h"
- >
+ RelativePath="..\..\src\game\IdleMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\SkillHandler.cpp"
- >
+ RelativePath="..\..\src\game\Item.cpp">
</File>
<File
- RelativePath="..\..\src\game\Spell.cpp"
- >
+ RelativePath="..\..\src\game\Item.h">
</File>
<File
- RelativePath="..\..\src\game\Spell.h"
- >
+ RelativePath="..\..\src\game\ItemEnchantmentMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\SpellAuraDefines.h"
- >
+ RelativePath="..\..\src\game\ItemEnchantmentMgr.h">
</File>
<File
- RelativePath="..\..\src\game\SpellAuras.cpp"
- >
+ RelativePath="..\..\src\game\ItemPrototype.h">
</File>
<File
- RelativePath="..\..\src\game\SpellAuras.h"
- >
+ RelativePath="..\..\src\game\LootMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\SpellEffects.cpp"
- >
+ RelativePath="..\..\src\game\LootMgr.h">
</File>
<File
- RelativePath="..\..\src\game\SpellHandler.cpp"
- >
+ RelativePath="..\..\src\game\MotionMaster.cpp">
</File>
<File
- RelativePath="..\..\src\game\SpellMgr.cpp"
- >
+ RelativePath="..\..\src\game\MotionMaster.h">
</File>
<File
- RelativePath="..\..\src\game\SpellMgr.h"
- >
+ RelativePath="..\..\src\game\MovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\StatSystem.cpp"
- >
+ RelativePath="..\..\src\game\MovementGenerator.h">
</File>
- </Filter>
- <Filter
- Name="Maps/Grids"
- >
<File
- RelativePath="..\..\src\game\Cell.h"
- >
+ RelativePath="..\..\src\game\NullCreatureAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\CellImpl.h"
- >
+ RelativePath="..\..\src\game\NullCreatureAI.h">
</File>
<File
- RelativePath="..\..\src\game\GridDefines.h"
- >
+ RelativePath="..\..\src\game\Object.cpp">
</File>
<File
- RelativePath="..\..\src\game\GridNotifiers.cpp"
- >
+ RelativePath="..\..\src\game\Object.h">
</File>
<File
- RelativePath="..\..\src\game\GridNotifiers.h"
- >
+ RelativePath="..\..\src\game\ObjectAccessor.cpp">
</File>
<File
- RelativePath="..\..\src\game\GridNotifiersImpl.h"
- >
+ RelativePath="..\..\src\game\ObjectAccessor.h">
</File>
<File
- RelativePath="..\..\src\game\GridStates.cpp"
- >
+ RelativePath="..\..\src\game\ObjectDefines.h">
</File>
<File
- RelativePath="..\..\src\game\GridStates.h"
- >
+ RelativePath="..\..\src\game\ObjectMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\InstanceData.cpp"
- >
+ RelativePath="..\..\src\game\ObjectMgr.h">
</File>
<File
- RelativePath="..\..\src\game\InstanceData.h"
+ RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceSaveMgr.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceSaveMgr.h"
- >
+ RelativePath="..\..\src\game\Pet.cpp">
</File>
<File
- RelativePath="..\..\src\game\Map.cpp"
- >
+ RelativePath="..\..\src\game\Pet.h">
</File>
<File
- RelativePath="..\..\src\game\Map.h"
- >
+ RelativePath="..\..\src\game\PetAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\MapInstanced.cpp"
- >
+ RelativePath="..\..\src\game\PetAI.h">
</File>
<File
- RelativePath="..\..\src\game\MapInstanced.h"
- >
+ RelativePath="..\..\src\game\Player.cpp">
</File>
<File
- RelativePath="..\..\src\game\MapManager.cpp"
- >
+ RelativePath="..\..\src\game\Player.h">
</File>
<File
- RelativePath="..\..\src\game\MapManager.h"
- >
+ RelativePath="..\..\src\game\PointMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\MapReference.h"
- >
+ RelativePath="..\..\src\game\PointMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\MapRefManager.h"
+ RelativePath="..\..\src\game\PossessedAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectGridLoader.cpp"
+ RelativePath="..\..\src\game\PossessedAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectGridLoader.h"
- >
+ RelativePath="..\..\src\game\RandomMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\Path.h"
- >
+ RelativePath="..\..\src\game\RandomMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\Transports.cpp"
- >
+ RelativePath="..\..\src\game\ReactorAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\Transports.h"
- >
+ RelativePath="..\..\src\game\ReactorAI.h">
</File>
<File
- RelativePath="..\..\src\game\Weather.cpp"
- >
+ RelativePath="..\..\src\game\SocialMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\Weather.h"
- >
+ RelativePath="..\..\src\game\SocialMgr.h">
</File>
- </Filter>
- <Filter
- Name="Handlers"
- >
<File
- RelativePath="..\..\src\game\AddonHandler.cpp"
- >
+ RelativePath="..\..\src\game\SpellMgr.cpp">
</File>
<File
- RelativePath="..\..\src\game\AddonHandler.h"
- >
+ RelativePath="..\..\src\game\SpellMgr.h">
</File>
<File
- RelativePath="..\..\src\game\ArenaTeamHandler.cpp"
- >
+ RelativePath="..\..\src\game\StatSystem.cpp">
</File>
<File
- RelativePath="..\..\src\game\ChannelHandler.cpp"
- >
+ RelativePath="..\..\src\game\TargetedMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\CharacterHandler.cpp"
- >
+ RelativePath="..\..\src\game\TargetedMovementGenerator.h">
</File>
<File
- RelativePath="..\..\src\game\ChatHandler.cpp"
- >
+ RelativePath="..\..\src\game\TemporarySummon.cpp">
</File>
<File
- RelativePath="..\..\src\game\CombatHandler.cpp"
- >
+ RelativePath="..\..\src\game\TemporarySummon.h">
</File>
<File
- RelativePath="..\..\src\game\DuelHandler.cpp"
+ RelativePath="..\..\src\game\TicketMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupHandler.cpp"
+ RelativePath="..\..\src\game\TicketMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\GuildHandler.cpp"
- >
+ RelativePath="..\..\src\game\Totem.cpp">
</File>
<File
- RelativePath="..\..\src\game\ItemHandler.cpp"
- >
+ RelativePath="..\..\src\game\Totem.h">
</File>
<File
- RelativePath="..\..\src\game\LFGHandler.cpp"
- >
+ RelativePath="..\..\src\game\TotemAI.cpp">
</File>
<File
- RelativePath="..\..\src\game\LootHandler.cpp"
- >
+ RelativePath="..\..\src\game\TotemAI.h">
</File>
<File
- RelativePath="..\..\src\game\MiscHandler.cpp"
- >
+ RelativePath="..\..\src\game\Traveller.h">
</File>
<File
- RelativePath="..\..\src\game\MovementHandler.cpp"
- >
+ RelativePath="..\..\src\game\Unit.cpp">
</File>
<File
- RelativePath="..\..\src\game\NPCHandler.cpp"
- >
+ RelativePath="..\..\src\game\Unit.h">
</File>
<File
- RelativePath="..\..\src\game\NPCHandler.h"
- >
+ RelativePath="..\..\src\game\UnitEvents.h">
</File>
<File
- RelativePath="..\..\src\game\PetHandler.cpp"
- >
+ RelativePath="..\..\src\game\UpdateFields.h">
</File>
<File
- RelativePath="..\..\src\game\PetitionsHandler.cpp"
- >
+ RelativePath="..\..\src\game\UpdateMask.h">
</File>
<File
- RelativePath="..\..\src\game\QueryHandler.cpp"
- >
+ RelativePath="..\..\src\game\Vehicle.cpp">
</File>
<File
- RelativePath="..\..\src\game\QuestHandler.cpp"
- >
+ RelativePath="..\..\src\game\Vehicle.h">
</File>
<File
- RelativePath="..\..\src\game\TaxiHandler.cpp"
- >
+ RelativePath="..\..\src\game\WaypointMovementGenerator.cpp">
</File>
<File
- RelativePath="..\..\src\game\TicketHandler.cpp"
- >
+ RelativePath="..\..\src\game\WaypointMovementGenerator.h">
</File>
+ </Filter>
+ <Filter
+ Name="Server">
<File
- RelativePath="..\..\src\game\TradeHandler.cpp"
- >
+ RelativePath="..\..\src\game\GlobalEvents.cpp">
</File>
<File
- RelativePath="..\..\src\game\VoiceChatHandler.cpp"
- >
+ RelativePath="..\..\src\game\GlobalEvents.h">
</File>
<File
- RelativePath="..\..\src\game\WaypointManager.cpp"
- >
+ RelativePath="..\..\src\game\Opcodes.cpp">
</File>
<File
- RelativePath="..\..\src\game\WaypointManager.h"
- >
+ RelativePath="..\..\src\game\Opcodes.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\SharedDefines.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldLog.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldLog.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldSession.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldSession.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldSocket.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldSocket.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldSocketMgr.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\WorldSocketMgr.h">
</File>
</Filter>
<Filter
- Name="Managers"
- >
+ Name="Chat Commands">
<File
- RelativePath="..\..\src\game\AccountMgr.cpp"
- >
+ RelativePath="..\..\src\game\debugcmds.cpp">
</File>
<File
- RelativePath="..\..\src\game\AccountMgr.h"
- >
+ RelativePath="..\..\src\game\Level0.cpp">
</File>
<File
- RelativePath="..\..\src\game\ChannelMgr.h"
- >
+ RelativePath="..\..\src\game\Level1.cpp">
</File>
<File
- RelativePath="..\..\src\game\ItemEnchantmentMgr.cpp"
- >
+ RelativePath="..\..\src\game\Level2.cpp">
</File>
<File
- RelativePath="..\..\src\game\ItemEnchantmentMgr.h"
- >
+ RelativePath="..\..\src\game\Level3.cpp">
</File>
+ </Filter>
+ <Filter
+ Name="Tool">
<File
- RelativePath="..\..\src\game\LootMgr.cpp"
- >
+ RelativePath="..\..\src\game\Language.h">
</File>
<File
- RelativePath="..\..\src\game\LootMgr.h"
- >
+ RelativePath="..\..\src\game\PlayerDump.cpp">
</File>
<File
- RelativePath="..\..\src\game\ObjectMgr.cpp"
- >
+ RelativePath="..\..\src\game\PlayerDump.h">
</File>
+ </Filter>
+ <Filter
+ Name="References"
+ Filter="">
<File
- RelativePath="..\..\src\game\ObjectMgr.h"
- >
+ RelativePath="..\..\src\game\FollowerReference.cpp">
</File>
<File
- RelativePath="..\..\src\game\SocialMgr.cpp"
- >
+ RelativePath="..\..\src\game\FollowerReference.h">
</File>
<File
- RelativePath="..\..\src\game\SocialMgr.h"
- >
+ RelativePath="..\..\src\game\FollowerRefManager.h">
</File>
<File
- RelativePath="..\..\src\game\TicketMgr.cpp"
- >
+ RelativePath="..\..\src\game\GroupReference.cpp">
</File>
<File
- RelativePath="..\..\src\game\TicketMgr.h"
- >
+ RelativePath="..\..\src\game\GroupReference.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\GroupRefManager.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\HostilRefManager.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\HostilRefManager.h">
+ </File>
+ <File
+ RelativePath="..\..\src\game\ThreatManager.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\ThreatManager.h">
</File>
</Filter>
</Files>
diff --git a/win/VC71/mangosd.vcproj b/win/VC71/mangosd.vcproj
new file mode 100644
index 00000000000..a008f365030
--- /dev/null
+++ b/win/VC71/mangosd.vcproj
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="TrinityCore"
+ ProjectGUID="{D1EA3EE9-4DCF-4CB9-BA6E-B9321E0D552A}"
+ RootNamespace="mangosd"
+ SccProjectName=""
+ SccLocalPath="">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+<<<<<<< HEAD:win/VC71/mangosd.vcproj
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+=======
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+>>>>>>> upstream/master:win/VC71/mangosd.vcproj
+ StringPooling="TRUE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="TRUE"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="TRUE"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ ImportLibrary="$(OutDir)\trinitycore.lib"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)
+copy ..\..\src\trinitycore\trinitycore.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf.dist
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+<<<<<<< HEAD:win/VC71/mangosd.vcproj
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+=======
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+>>>>>>> upstream/master:win/VC71/mangosd.vcproj
+ IgnoreStandardIncludePath="FALSE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="TRUE"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="TRUE"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ LinkTimeCodeGeneration="FALSE"
+ ImportLibrary="$(OutDir)\trinitycore.lib"
+ FixedBaseAddress="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)
+copy ..\..\src\trinitycore\trinitycore.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf.dist
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="doc">
+ <File
+ RelativePath="..\..\Authors">
+ </File>
+ <File
+ RelativePath="..\..\ChangeLog">
+ </File>
+ <File
+ RelativePath="..\..\Copying">
+ </File>
+ <File
+ RelativePath="..\..\Install">
+ </File>
+ <File
+ RelativePath="..\..\News">
+ </File>
+ <File
+ RelativePath="..\..\Readme">
+ </File>
+ <File
+ RelativePath="..\..\Thanks">
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\..\src\trinitycore\CliRunnable.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\CliRunnable.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\Main.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\Master.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\Master.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\RASocket.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\RASocket.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\resource.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\TrinityCore.rc">
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\WorldRunnable.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\WorldRunnable.h">
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win/VC71/realmd.vcproj b/win/VC71/realmd.vcproj
new file mode 100644
index 00000000000..f8ae9d10542
--- /dev/null
+++ b/win/VC71/realmd.vcproj
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="TrinityRealm"
+ ProjectGUID="{563E9905-3657-460C-AE63-0AC39D162E23}"
+ RootNamespace="realmd"
+ SccProjectName=""
+ SccLocalPath="">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+<<<<<<< HEAD:win/VC71/realmd.vcproj
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
+=======
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+>>>>>>> upstream/master:win/VC71/realmd.vcproj
+ StringPooling="TRUE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="TRUE"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="TRUE"
+ PrecompiledHeaderFile=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="TRUE"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ LargeAddressAware="2"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\realmd__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="FALSE"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+<<<<<<< HEAD:win/VC71/realmd.vcproj
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
+=======
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
+>>>>>>> upstream/master:win/VC71/realmd.vcproj
+ IgnoreStandardIncludePath="FALSE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="TRUE"
+ PrecompiledHeaderFile=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\realmd__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="TRUE"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="TRUE"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="TRUE"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ FixedBaseAddress="1"/>
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\src\trinityrealm\AuthCodes.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\AuthSocket.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\AuthSocket.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\Main.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\RealmList.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\RealmList.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\resource.h">
+ </File>
+ <File
+ RelativePath="..\..\src\trinityrealm\TrinityRealm.rc">
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win/VC80/game.vcproj b/win/VC80/game.vcproj
index 90befcd7ae4..671235902f4 100644
--- a/win/VC80/game.vcproj
+++ b/win/VC80/game.vcproj
@@ -52,7 +52,6 @@
MinimalRebuild="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -126,7 +125,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;TRINITY_DEBUG;_LIB;"
@@ -134,7 +133,6 @@
MinimalRebuild="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -215,7 +213,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="1"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -289,7 +286,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"
@@ -297,7 +294,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="0"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -348,76 +344,79 @@
</References>
<Files>
<Filter
- Name="World/Others"
+ Name="World/Handlers"
>
<File
- RelativePath="..\..\src\game\AuctionHouse.cpp"
+ RelativePath="..\..\src\game\AccountMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Channel.cpp"
+ RelativePath="..\..\src\game\AccountMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Channel.h"
+ RelativePath="..\..\src\game\AchievementMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Chat.cpp"
+ RelativePath="..\..\src\game\AchievementMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Chat.h"
+ RelativePath="..\..\src\game\AddonHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GameEvent.cpp"
+ RelativePath="..\..\src\game\AddonHandler.h"
>
</File>
<File
- RelativePath="..\..\src\game\GameEvent.h"
+ RelativePath="..\..\src\game\ArenaTeamHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GossipDef.cpp"
+ RelativePath="..\..\src\game\AuctionHouseHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GossipDef.h"
+ RelativePath="..\..\src\game\BattleGround.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Mail.cpp"
+ RelativePath="..\..\src\game\BattleGround.h"
>
</File>
<File
- RelativePath="..\..\src\game\Mail.h"
+ RelativePath="..\..\src\game\BattleGroundAA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\QuestDef.cpp"
+ RelativePath="..\..\src\game\BattleGroundAA.h"
>
</File>
<File
- RelativePath="..\..\src\game\QuestDef.h"
+ RelativePath="..\..\src\game\BattleGroundAB.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateData.cpp"
+ RelativePath="..\..\src\game\BattleGroundAB.h"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateData.h"
+ RelativePath="..\..\src\game\BattleGroundAV.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\World.cpp"
+ RelativePath="..\..\src\game\BattleGroundAV.h"
>
</File>
<File
- RelativePath="..\..\src\game\World.h"
+ RelativePath="..\..\src\game\BattleGroundBE.cpp"
>
</File>
+ <File
+ RelativePath="..\..\src\game\BattleGroundBE.h">
+ </File>
</Filter>
<Filter
Name="AuctionHouseBot"
@@ -433,11 +432,11 @@
Name="Objects"
>
<File
- RelativePath="..\..\src\game\ArenaTeam.cpp"
+ RelativePath="..\..\src\game\BattleGroundDS.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ArenaTeam.h"
+ RelativePath="..\..\src\game\BattleGroundDS.h"
>
</File>
<File
@@ -447,515 +446,539 @@
RelativePath="..\..\src\game\AuctionHouseBot.h">
</File>
<File
- RelativePath="..\..\src\game\AuctionHouseObject.h"
+ RelativePath="..\..\src\game\BattleGroundEY.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Bag.cpp"
+ RelativePath="..\..\src\game\BattleGroundEY.h"
>
</File>
<File
- RelativePath="..\..\src\game\Bag.h"
+ RelativePath="..\..\src\game\BattleGroundHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Corpse.cpp"
+ RelativePath="..\..\src\game\BattleGroundMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Corpse.h"
+ RelativePath="..\..\src\game\BattleGroundMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Creature.cpp"
+ RelativePath="..\..\src\game\BattleGroundNA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Creature.h"
+ RelativePath="..\..\src\game\BattleGroundNA.h"
>
</File>
<File
- RelativePath="..\..\src\game\CreatureGroups.cpp"
+ RelativePath="..\..\src\game\BattleGroundRL.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\CreatureGroups.h"
+ RelativePath="..\..\src\game\BattleGroundRL.h"
>
</File>
<File
- RelativePath="..\..\src\game\DestinationHolder.cpp"
+ RelativePath="..\..\src\game\BattleGroundRV.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\DestinationHolder.h"
+ RelativePath="..\..\src\game\BattleGroundRV.h"
>
</File>
<File
- RelativePath="..\..\src\game\DestinationHolderImp.h"
+ RelativePath="..\..\src\game\BattleGroundSA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\DynamicObject.cpp"
+ RelativePath="..\..\src\game\BattleGroundSA.h"
>
</File>
<File
- RelativePath="..\..\src\game\DynamicObject.h"
+ RelativePath="..\..\src\game\BattleGroundWS.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Formulas.h"
+ RelativePath="..\..\src\game\BattleGroundWS.h"
>
</File>
<File
- RelativePath="..\..\src\game\GameObject.cpp"
+ RelativePath="..\..\src\game\CalendarHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GameObject.h"
+ RelativePath="..\..\src\game\Cell.h"
>
</File>
<File
- RelativePath="..\..\src\game\Group.cpp"
+ RelativePath="..\..\src\game\CellImpl.h"
>
</File>
<File
- RelativePath="..\..\src\game\Group.h"
+ RelativePath="..\..\src\game\Channel.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Guild.cpp"
+ RelativePath="..\..\src\game\Channel.h"
>
</File>
<File
- RelativePath="..\..\src\game\Guild.h"
+ RelativePath="..\..\src\game\ChannelHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Item.cpp"
+ RelativePath="..\..\src\game\ChannelMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Item.h"
+ RelativePath="..\..\src\game\CharacterHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ItemPrototype.h"
+ RelativePath="..\..\src\game\Chat.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MotionMaster.cpp"
+ RelativePath="..\..\src\game\Chat.h"
>
</File>
<File
- RelativePath="..\..\src\game\MotionMaster.h"
+ RelativePath="..\..\src\game\ChatHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Object.cpp"
+ RelativePath="..\..\src\game\CombatHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Object.h"
+ RelativePath="..\..\src\game\DuelHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectAccessor.cpp"
+ RelativePath="..\..\src\game\GameEvent.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectAccessor.h"
+ RelativePath="..\..\src\game\GameEvent.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectDefines.h"
+ RelativePath="..\..\src\game\GossipDef.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Pet.cpp"
+ RelativePath="..\..\src\game\GossipDef.h"
>
</File>
<File
- RelativePath="..\..\src\game\Pet.h"
+ RelativePath="..\..\src\game\GridDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\Player.cpp"
+ RelativePath="..\..\src\game\GridNotifiers.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Player.h"
+ RelativePath="..\..\src\game\GridNotifiers.h"
>
</File>
<File
- RelativePath="..\..\src\game\TemporarySummon.cpp"
+ RelativePath="..\..\src\game\GridNotifiersImpl.h"
>
</File>
<File
- RelativePath="..\..\src\game\TemporarySummon.h"
+ RelativePath="..\..\src\game\GridStates.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Totem.cpp"
+ RelativePath="..\..\src\game\GridStates.h"
>
</File>
<File
- RelativePath="..\..\src\game\Totem.h"
+ RelativePath="..\..\src\game\Group.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Traveller.h"
+ RelativePath="..\..\src\game\Group.h"
>
</File>
<File
- RelativePath="..\..\src\game\Unit.cpp"
+ RelativePath="..\..\src\game\GroupHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Unit.h"
+ RelativePath="..\..\src\game\GuildHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\UnitEvents.h"
+ RelativePath="..\..\src\game\InstanceData.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateFields.h"
+ RelativePath="..\..\src\game\InstanceData.h"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateMask.h"
+ RelativePath="..\..\src\game\InstanceSaveMgr.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Server"
- >
<File
- RelativePath="..\..\src\game\GlobalEvents.cpp"
+ RelativePath="..\..\src\game\InstanceSaveMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\GlobalEvents.h"
+ RelativePath="..\..\src\game\ItemHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Opcodes.cpp"
+ RelativePath="..\..\src\game\LFGHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Opcodes.h"
+ RelativePath="..\..\src\game\LootHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SharedDefines.h"
+ RelativePath="..\..\src\game\Mail.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldLog.cpp"
+ RelativePath="..\..\src\game\Mail.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldLog.h"
+ RelativePath="..\..\src\game\Map.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSession.cpp"
+ RelativePath="..\..\src\game\Map.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSession.h"
+ RelativePath="..\..\src\game\MapInstanced.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocket.cpp"
+ RelativePath="..\..\src\game\MapInstanced.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocket.h"
+ RelativePath="..\..\src\game\MapManager.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocketMgr.cpp"
+ RelativePath="..\..\src\game\MapManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocketMgr.h"
+ RelativePath="..\..\src\game\MiscHandler.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Chat Commands"
- >
<File
- RelativePath="..\..\src\game\Debugcmds.cpp"
+ RelativePath="..\..\src\game\MovementHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Level0.cpp"
+ RelativePath="..\..\src\game\NPCHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Level1.cpp"
+ RelativePath="..\..\src\game\NPCHandler.h"
>
</File>
<File
- RelativePath="..\..\src\game\Level2.cpp"
+ RelativePath="..\..\src\game\ObjectGridLoader.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Level3.cpp"
+ RelativePath="..\..\src\game\ObjectGridLoader.h"
>
</File>
- </Filter>
- <Filter
- Name="Tools"
- >
<File
- RelativePath="..\..\src\game\Language.h"
+ RelativePath="..\..\src\game\OutdoorPvP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PlayerDump.cpp"
+ RelativePath="..\..\src\game\OutdoorPvP.h"
>
</File>
<File
- RelativePath="..\..\src\game\PlayerDump.h"
+ RelativePath="..\..\src\game\OutdoorPvPEP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ScriptCalls.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPEP.h"
>
</File>
<File
- RelativePath="..\..\src\game\ScriptCalls.h"
+ RelativePath="..\..\src\game\OutdoorPvPHP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Tools.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPHP.h"
>
</File>
<File
- RelativePath="..\..\src\game\Tools.h"
+ RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"
>
</File>
- </Filter>
- <Filter
- Name="References"
- >
<File
- RelativePath="..\..\src\game\FollowerReference.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\FollowerReference.h"
+ RelativePath="..\..\src\game\OutdoorPvPNA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\FollowerRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPNA.h"
>
</File>
<File
- RelativePath="..\..\src\game\GroupReference.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPSI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupReference.h"
+ RelativePath="..\..\src\game\OutdoorPvPSI.h"
>
</File>
<File
- RelativePath="..\..\src\game\GroupRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPTF.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\HostilRefManager.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPTF.h"
>
</File>
<File
- RelativePath="..\..\src\game\HostilRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPZM.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ThreatManager.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPZM.h"
>
</File>
<File
- RelativePath="..\..\src\game\ThreatManager.h"
+ RelativePath="..\..\src\game\Path.h"
>
</File>
- </Filter>
- <Filter
- Name="Battlegrounds"
- >
<File
- RelativePath="..\..\src\game\BattleGround.cpp"
+ RelativePath="..\..\src\game\PetHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGround.h"
+ RelativePath="..\..\src\game\PetitionsHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAA.cpp"
+ RelativePath="..\..\src\game\PoolHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAA.h"
+ RelativePath="..\..\src\game\PoolHandler.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAB.cpp"
+ RelativePath="..\..\src\game\QueryHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAB.h"
+ RelativePath="..\..\src\game\QuestDef.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAV.cpp"
+ RelativePath="..\..\src\game\QuestDef.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAV.h"
+ RelativePath="..\..\src\game\QuestHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundBE.cpp"
+ RelativePath="..\..\src\game\ScriptCalls.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundBE.h"
+ RelativePath="..\..\src\game\ScriptCalls.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundEY.cpp"
+ RelativePath="..\..\src\game\SkillDiscovery.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundEY.h"
+ RelativePath="..\..\src\game\SkillDiscovery.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundHandler.cpp"
+ RelativePath="..\..\src\game\SkillExtraItems.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundMgr.cpp"
+ RelativePath="..\..\src\game\SkillExtraItems.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundMgr.h"
+ RelativePath="..\..\src\game\SkillHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundNA.cpp"
+ RelativePath="..\..\src\game\Spell.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundNA.h"
+ RelativePath="..\..\src\game\Spell.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundRL.cpp"
+ RelativePath="..\..\src\game\SpellAuraDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundRL.h"
+ RelativePath="..\..\src\game\SpellAuras.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundWS.cpp"
+ RelativePath="..\..\src\game\SpellAuras.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundWS.h"
+ RelativePath="..\..\src\game\SpellEffects.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Outdoor PvP"
- >
<File
- RelativePath="..\..\src\game\OutdoorPvP.cpp"
+ RelativePath="..\..\src\game\SpellHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvP.h"
+ RelativePath="..\..\src\game\TaxiHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPEP.cpp"
+ RelativePath="..\..\src\game\TicketHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPEP.h"
+ RelativePath="..\..\src\game\TradeHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPHP.cpp"
+ RelativePath="..\..\src\game\Transports.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPHP.h"
+ RelativePath="..\..\src\game\Transports.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"
+ RelativePath="..\..\src\game\UpdateData.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPMgr.h"
+ RelativePath="..\..\src\game\UpdateData.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPNA.cpp"
+ RelativePath="..\..\src\game\VoiceChatHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPNA.h"
+ RelativePath="..\..\src\game\WaypointManager.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp"
+ RelativePath="..\..\src\game\WaypointManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h"
+ RelativePath="..\..\src\game\Weather.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPSI.cpp"
+ RelativePath="..\..\src\game\Weather.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPSI.h"
+ RelativePath="..\..\src\game\World.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPTF.cpp"
+ RelativePath="..\..\src\game\World.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="Object"
+ >
<File
- RelativePath="..\..\src\game\OutdoorPvPTF.h"
+ RelativePath="..\..\src\game\AggressorAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPZM.cpp"
+ RelativePath="..\..\src\game\AggressorAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPZM.h"
+ RelativePath="..\..\src\game\AnimalRandomMovementGenerator.h"
>
</File>
- </Filter>
- <Filter
- Name="Artificial Intelligence"
- >
<File
- RelativePath="..\..\src\game\AggressorAI.cpp"
+ RelativePath="..\..\src\game\ArenaTeam.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\AggressorAI.h"
+ RelativePath="..\..\src\game\ArenaTeam.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AuctionHouseMgr.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AuctionHouseMgr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Bag.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Bag.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Calendar.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Calendar.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ConfusedMovementGenerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Corpse.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Corpse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Creature.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Creature.h"
>
</File>
<File
@@ -987,75 +1010,67 @@
>
</File>
<File
- RelativePath="..\..\src\game\GuardAI.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\GuardAI.h"
+ RelativePath="..\..\src\game\CreatureGroups.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\NullCreatureAI.cpp"
+ RelativePath="..\..\src\game\CreatureGroups.h"
>
</File>
<File
- RelativePath="..\..\src\game\NullCreatureAI.h"
+ RelativePath="..\..\src\game\DestinationHolder.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PetAI.cpp"
+ RelativePath="..\..\src\game\DestinationHolder.h"
>
</File>
<File
- RelativePath="..\..\src\game\PetAI.h"
+ RelativePath="..\..\src\game\DestinationHolderImp.h"
>
</File>
<File
- RelativePath="..\..\src\game\PossessedAI.cpp"
+ RelativePath="..\..\src\game\DynamicObject.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PossessedAI.h"
+ RelativePath="..\..\src\game\DynamicObject.h"
>
</File>
<File
- RelativePath="..\..\src\game\ReactorAI.cpp"
+ RelativePath="..\..\src\game\FleeingMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ReactorAI.h"
+ RelativePath="..\..\src\game\FleeingMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\TotemAI.cpp"
+ RelativePath="..\..\src\game\Formulas.h"
>
</File>
<File
- RelativePath="..\..\src\game\TotemAI.h"
+ RelativePath="..\..\src\game\GameObject.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Movement Generators"
- >
<File
- RelativePath="..\..\src\game\AnimalRandomMovementGenerator.h"
+ RelativePath="..\..\src\game\GameObject.h"
>
</File>
<File
- RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
+ RelativePath="..\..\src\game\GuardAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ConfusedMovementGenerator.h"
+ RelativePath="..\..\src\game\GuardAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\FleeingMovementGenerator.cpp"
+ RelativePath="..\..\src\game\Guild.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\FleeingMovementGenerator.h"
+ RelativePath="..\..\src\game\Guild.h"
>
</File>
<File
@@ -1075,387 +1090,395 @@
>
</File>
<File
- RelativePath="..\..\src\game\MovementGenerator.cpp"
+ RelativePath="..\..\src\game\Item.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MovementGenerator.h"
+ RelativePath="..\..\src\game\Item.h"
>
</File>
<File
- RelativePath="..\..\src\game\PointMovementGenerator.cpp"
+ RelativePath="..\..\src\game\ItemEnchantmentMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PointMovementGenerator.h"
+ RelativePath="..\..\src\game\ItemEnchantmentMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\RandomMovementGenerator.cpp"
+ RelativePath="..\..\src\game\ItemPrototype.h"
>
</File>
<File
- RelativePath="..\..\src\game\RandomMovementGenerator.h"
+ RelativePath="..\..\src\game\LootMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TargetedMovementGenerator.cpp"
+ RelativePath="..\..\src\game\LootMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\TargetedMovementGenerator.h"
+ RelativePath="..\..\src\game\MotionMaster.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
+ RelativePath="..\..\src\game\MotionMaster.h"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointMovementGenerator.h"
+ RelativePath="..\..\src\game\MovementGenerator.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Spells/Skills"
- >
<File
- RelativePath="..\..\src\game\SkillDiscovery.cpp"
+ RelativePath="..\..\src\game\MovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\SkillDiscovery.h"
+ RelativePath="..\..\src\game\NullCreatureAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SkillExtraItems.cpp"
+ RelativePath="..\..\src\game\NullCreatureAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\SkillExtraItems.h"
+ RelativePath="..\..\src\game\Object.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SkillHandler.cpp"
+ RelativePath="..\..\src\game\Object.h"
>
</File>
<File
- RelativePath="..\..\src\game\Spell.cpp"
+ RelativePath="..\..\src\game\ObjectAccessor.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Spell.h"
+ RelativePath="..\..\src\game\ObjectAccessor.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellAuraDefines.h"
+ RelativePath="..\..\src\game\ObjectDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellAuras.cpp"
+ RelativePath="..\..\src\game\ObjectMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SpellAuras.h"
+ RelativePath="..\..\src\game\ObjectMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellEffects.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SpellHandler.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellMgr.cpp"
+ RelativePath="..\..\src\game\Pet.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SpellMgr.h"
+ RelativePath="..\..\src\game\Pet.h"
>
</File>
<File
- RelativePath="..\..\src\game\StatSystem.cpp"
+ RelativePath="..\..\src\game\PetAI.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Maps/Grids"
- >
<File
- RelativePath="..\..\src\game\Cell.h"
+ RelativePath="..\..\src\game\PetAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\CellImpl.h"
+ RelativePath="..\..\src\game\Player.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GridDefines.h"
+ RelativePath="..\..\src\game\Player.h"
>
</File>
<File
- RelativePath="..\..\src\game\GridNotifiers.cpp"
+ RelativePath="..\..\src\game\PointMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GridNotifiers.h"
+ RelativePath="..\..\src\game\PossessedAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GridNotifiersImpl.h"
+ RelativePath="..\..\src\game\PossessedAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\GridStates.cpp"
+ RelativePath="..\..\src\game\PointMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\GridStates.h"
+ RelativePath="..\..\src\game\RandomMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceData.cpp"
+ RelativePath="..\..\src\game\RandomMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceData.h"
+ RelativePath="..\..\src\game\ReactorAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceSaveMgr.cpp"
+ RelativePath="..\..\src\game\ReactorAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceSaveMgr.h"
+ RelativePath="..\..\src\game\SocialMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Map.cpp"
+ RelativePath="..\..\src\game\SocialMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Map.h"
+ RelativePath="..\..\src\game\SpellMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapInstanced.cpp"
+ RelativePath="..\..\src\game\SpellMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\MapInstanced.h"
+ RelativePath="..\..\src\game\StatSystem.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapManager.cpp"
+ RelativePath="..\..\src\game\TargetedMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapManager.h"
+ RelativePath="..\..\src\game\TargetedMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\MapReference.h"
+ RelativePath="..\..\src\game\TemporarySummon.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapRefManager.h"
+ RelativePath="..\..\src\game\TemporarySummon.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectGridLoader.cpp"
+ RelativePath="..\..\src\game\TicketMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectGridLoader.h"
+ RelativePath="..\..\src\game\TicketMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Path.h"
+ RelativePath="..\..\src\game\Totem.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Transports.cpp"
+ RelativePath="..\..\src\game\Totem.h"
>
</File>
<File
- RelativePath="..\..\src\game\Transports.h"
+ RelativePath="..\..\src\game\TotemAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Weather.cpp"
+ RelativePath="..\..\src\game\TotemAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\Weather.h"
+ RelativePath="..\..\src\game\Traveller.h"
>
</File>
- </Filter>
- <Filter
- Name="Handlers"
- >
<File
- RelativePath="..\..\src\game\AddonHandler.cpp"
+ RelativePath="..\..\src\game\Unit.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\AddonHandler.h"
+ RelativePath="..\..\src\game\Unit.h"
>
</File>
<File
- RelativePath="..\..\src\game\ArenaTeamHandler.cpp"
+ RelativePath="..\..\src\game\UnitEvents.h"
>
</File>
<File
- RelativePath="..\..\src\game\ChannelHandler.cpp"
+ RelativePath="..\..\src\game\UpdateFields.h"
>
</File>
<File
- RelativePath="..\..\src\game\CharacterHandler.cpp"
+ RelativePath="..\..\src\game\UpdateMask.h"
>
</File>
<File
- RelativePath="..\..\src\game\ChatHandler.cpp"
+ RelativePath="..\..\src\game\Vehicle.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\CombatHandler.cpp"
+ RelativePath="..\..\src\game\Vehicle.h"
>
</File>
<File
- RelativePath="..\..\src\game\DuelHandler.cpp"
+ RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupHandler.cpp"
+ RelativePath="..\..\src\game\WaypointMovementGenerator.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="Server"
+ >
<File
- RelativePath="..\..\src\game\GuildHandler.cpp"
+ RelativePath="..\..\src\game\GlobalEvents.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ItemHandler.cpp"
+ RelativePath="..\..\src\game\GlobalEvents.h"
>
</File>
<File
- RelativePath="..\..\src\game\LFGHandler.cpp"
+ RelativePath="..\..\src\game\Opcodes.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\LootHandler.cpp"
+ RelativePath="..\..\src\game\Opcodes.h"
>
</File>
<File
- RelativePath="..\..\src\game\MiscHandler.cpp"
+ RelativePath="..\..\src\game\SharedDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\MovementHandler.cpp"
+ RelativePath="..\..\src\game\WorldLog.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\NPCHandler.cpp"
+ RelativePath="..\..\src\game\WorldLog.h"
>
</File>
<File
- RelativePath="..\..\src\game\NPCHandler.h"
+ RelativePath="..\..\src\game\WorldSession.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PetHandler.cpp"
+ RelativePath="..\..\src\game\WorldSession.h"
>
</File>
<File
- RelativePath="..\..\src\game\PetitionsHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\QueryHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocket.h"
>
</File>
<File
- RelativePath="..\..\src\game\QuestHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocketMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TaxiHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocketMgr.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="Chat Commands"
+ >
<File
- RelativePath="..\..\src\game\TicketHandler.cpp"
+ RelativePath="..\..\src\game\debugcmds.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TradeHandler.cpp"
+ RelativePath="..\..\src\game\Level0.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\VoiceChatHandler.cpp"
+ RelativePath="..\..\src\game\Level1.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointManager.cpp"
+ RelativePath="..\..\src\game\Level2.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointManager.h"
+ RelativePath="..\..\src\game\Level3.cpp"
>
</File>
</Filter>
<Filter
- Name="Managers"
+ Name="Tool"
>
<File
- RelativePath="..\..\src\game\AccountMgr.cpp"
+ RelativePath="..\..\src\game\Language.h"
>
</File>
<File
- RelativePath="..\..\src\game\AccountMgr.h"
+ RelativePath="..\..\src\game\PlayerDump.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ChannelMgr.h"
+ RelativePath="..\..\src\game\PlayerDump.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="References"
+ >
<File
- RelativePath="..\..\src\game\ItemEnchantmentMgr.cpp"
+ RelativePath="..\..\src\game\FollowerReference.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ItemEnchantmentMgr.h"
+ RelativePath="..\..\src\game\FollowerReference.h"
>
</File>
<File
- RelativePath="..\..\src\game\LootMgr.cpp"
+ RelativePath="..\..\src\game\FollowerRefManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\LootMgr.h"
+ RelativePath="..\..\src\game\GroupReference.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectMgr.cpp"
+ RelativePath="..\..\src\game\GroupReference.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectMgr.h"
+ RelativePath="..\..\src\game\GroupRefManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\SocialMgr.cpp"
+ RelativePath="..\..\src\game\HostilRefManager.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SocialMgr.h"
+ RelativePath="..\..\src\game\HostilRefManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\TicketMgr.cpp"
+ RelativePath="..\..\src\game\MapReference.h"
>
</File>
<File
- RelativePath="..\..\src\game\TicketMgr.h"
+ RelativePath="..\..\src\game\MapRefManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ThreatManager.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ThreatManager.h"
>
</File>
</Filter>
diff --git a/win/VC80/mangosd.vcproj b/win/VC80/mangosd.vcproj
new file mode 100644
index 00000000000..ad44e1fbcc7
--- /dev/null
+++ b/win/VC80/mangosd.vcproj
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="TrinityCore"
+ ProjectGUID="{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+ RootNamespace="mangosd"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\..\..\bin\Release\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ LinkTimeCodeGeneration="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\..\..\bin\Release\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="0"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LinkTimeCodeGeneration="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="doc"
+ >
+ <File
+ RelativePath="..\..\Authors"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ChangeLog"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Copying"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Install"
+ >
+ </File>
+ <File
+ RelativePath="..\..\News"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Readme"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Thanks"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\..\src\mangosd\CliRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\CliRunnable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\mangosd.rc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Master.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Master.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\RASocket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\RASocket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\WorldRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\WorldRunnable.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win/VC80/realmd.vcproj b/win/VC80/realmd.vcproj
new file mode 100644
index 00000000000..9e156713485
--- /dev/null
+++ b/win/VC80/realmd.vcproj
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="TrinityRealm"
+ ProjectGUID="{563E9905-3657-460C-AE63-0AC39D162E23}"
+ RootNamespace="realmd"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="0"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ TargetMachine="17"
+ FixedBaseAddress="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\src\realmd\AuthCodes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\AuthSocket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\AuthSocket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\Main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\realmd.rc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\RealmList.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\RealmList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj
index c99e7f66fd0..4358b0ddd84 100644
--- a/win/VC90/game.vcproj
+++ b/win/VC90/game.vcproj
@@ -5,7 +5,8 @@
Name="game"
ProjectGUID="{1DC6C4DA-A028-41F3-877D-D5400C594F88}"
RootNamespace="game"
- TargetFrameworkVersion="131072"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="0"
>
<Platforms>
<Platform
@@ -23,7 +24,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -80,7 +80,6 @@
/>
<Tool
Name="VCLibrarianTool"
- AdditionalDependencies=".\shared__$(PlatformName)_$(ConfigurationName)\shared.lib"
OutputFile=".\game__$(PlatformName)_$(ConfigurationName)\game.lib"
SuppressStartupBanner="true"
/>
@@ -105,7 +104,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -128,7 +126,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;TRINITY_DEBUG;_LIB;"
@@ -188,7 +186,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -218,7 +215,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="1"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -245,7 +241,6 @@
/>
<Tool
Name="VCLibrarianTool"
- AdditionalDependencies=".\shared__$(PlatformName)_$(ConfigurationName)\shared.lib"
OutputFile=".\game__$(PlatformName)_$(ConfigurationName)\game.lib"
SuppressStartupBanner="true"
/>
@@ -270,7 +265,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -293,7 +287,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"
@@ -301,7 +295,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="0"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -353,608 +346,632 @@
</References>
<Files>
<Filter
- Name="World/Others"
+ Name="World/Handlers"
>
<File
- RelativePath="..\..\src\game\AuctionHouse.cpp"
+ RelativePath="..\..\src\game\AccountMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Channel.cpp"
+ RelativePath="..\..\src\game\AccountMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Channel.h"
+ RelativePath="..\..\src\game\AchievementMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Chat.cpp"
+ RelativePath="..\..\src\game\AchievementMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Chat.h"
+ RelativePath="..\..\src\game\AddonHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GameEvent.cpp"
+ RelativePath="..\..\src\game\AddonHandler.h"
>
</File>
<File
- RelativePath="..\..\src\game\GameEvent.h"
+ RelativePath="..\..\src\game\ArenaTeamHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GossipDef.cpp"
+ RelativePath="..\..\src\game\AuctionHouseHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GossipDef.h"
+ RelativePath="..\..\src\game\BattleGround.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Mail.cpp"
+ RelativePath="..\..\src\game\BattleGround.h"
>
</File>
<File
- RelativePath="..\..\src\game\Mail.h"
+ RelativePath="..\..\src\game\BattleGroundAA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\QuestDef.cpp"
+ RelativePath="..\..\src\game\BattleGroundAA.h"
>
</File>
<File
- RelativePath="..\..\src\game\QuestDef.h"
+ RelativePath="..\..\src\game\BattleGroundAB.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateData.cpp"
+ RelativePath="..\..\src\game\BattleGroundAB.h"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateData.h"
+ RelativePath="..\..\src\game\BattleGroundAV.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\World.cpp"
+ RelativePath="..\..\src\game\BattleGroundAV.h"
>
</File>
<File
- RelativePath="..\..\src\game\World.h"
+ RelativePath="..\..\src\game\BattleGroundBE.cpp"
>
</File>
- </Filter>
- <Filter
- Name="AuctionHouseBot"
- >
<File
- RelativePath="..\..\src\game\AuctionHouseBot.cpp">
+ RelativePath="..\..\src\game\BattleGroundBE.h"
+ >
</File>
<File
- RelativePath="..\..\src\game\AuctionHouseBot.h">
+ RelativePath="..\..\src\game\BattleGroundDS.cpp"
+ >
</File>
- </Filter>
- <Filter
- Name="Objects"
- >
<File
- RelativePath="..\..\src\game\ArenaTeam.cpp"
+ RelativePath="..\..\src\game\BattleGroundDS.h"
>
</File>
<File
- RelativePath="..\..\src\game\ArenaTeam.h"
+ RelativePath="..\..\src\game\BattleGroundEY.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\AuctionHouseObject.h"
+ RelativePath="..\..\src\game\BattleGroundEY.h"
>
</File>
<File
- RelativePath="..\..\src\game\Bag.cpp"
+ RelativePath="..\..\src\game\BattleGroundHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Bag.h"
+ RelativePath="..\..\src\game\BattleGroundMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Corpse.cpp"
+ RelativePath="..\..\src\game\BattleGroundMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Corpse.h"
+ RelativePath="..\..\src\game\BattleGroundNA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Creature.cpp"
+ RelativePath="..\..\src\game\BattleGroundNA.h"
>
</File>
<File
- RelativePath="..\..\src\game\Creature.h"
+ RelativePath="..\..\src\game\BattleGroundRL.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\CreatureGroups.cpp"
+ RelativePath="..\..\src\game\BattleGroundRL.h"
>
</File>
<File
- RelativePath="..\..\src\game\CreatureGroups.h"
+ RelativePath="..\..\src\game\BattleGroundRV.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\DestinationHolder.cpp"
+ RelativePath="..\..\src\game\BattleGroundRV.h"
>
</File>
<File
- RelativePath="..\..\src\game\DestinationHolder.h"
+ RelativePath="..\..\src\game\BattleGroundSA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\DestinationHolderImp.h"
+ RelativePath="..\..\src\game\BattleGroundSA.h"
>
</File>
<File
- RelativePath="..\..\src\game\DynamicObject.cpp"
+ RelativePath="..\..\src\game\BattleGroundWS.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\DynamicObject.h"
+ RelativePath="..\..\src\game\BattleGroundWS.h"
>
</File>
<File
- RelativePath="..\..\src\game\Formulas.h"
+ RelativePath="..\..\src\game\CalendarHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GameObject.cpp"
+ RelativePath="..\..\src\game\Cell.h"
>
</File>
<File
- RelativePath="..\..\src\game\GameObject.h"
+ RelativePath="..\..\src\game\CellImpl.h"
>
</File>
<File
- RelativePath="..\..\src\game\Group.cpp"
+ RelativePath="..\..\src\game\Channel.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Group.h"
+ RelativePath="..\..\src\game\Channel.h"
>
</File>
<File
- RelativePath="..\..\src\game\Guild.cpp"
+ RelativePath="..\..\src\game\ChannelHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Guild.h"
+ RelativePath="..\..\src\game\ChannelMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Item.cpp"
+ RelativePath="..\..\src\game\CharacterHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Item.h"
+ RelativePath="..\..\src\game\Chat.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ItemPrototype.h"
+ RelativePath="..\..\src\game\Chat.h"
>
</File>
<File
- RelativePath="..\..\src\game\MotionMaster.cpp"
+ RelativePath="..\..\src\game\ChatHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MotionMaster.h"
+ RelativePath="..\..\src\game\CombatHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Object.cpp"
+ RelativePath="..\..\src\game\DuelHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Object.h"
+ RelativePath="..\..\src\game\GameEvent.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectAccessor.cpp"
+ RelativePath="..\..\src\game\GameEvent.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectAccessor.h"
+ RelativePath="..\..\src\game\GossipDef.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectDefines.h"
+ RelativePath="..\..\src\game\GossipDef.h"
>
</File>
<File
- RelativePath="..\..\src\game\Pet.cpp"
+ RelativePath="..\..\src\game\GridDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\Pet.h"
+ RelativePath="..\..\src\game\GridNotifiers.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Player.cpp"
+ RelativePath="..\..\src\game\GridNotifiers.h"
>
</File>
<File
- RelativePath="..\..\src\game\Player.h"
+ RelativePath="..\..\src\game\GridNotifiersImpl.h"
>
</File>
<File
- RelativePath="..\..\src\game\TemporarySummon.cpp"
+ RelativePath="..\..\src\game\GridStates.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TemporarySummon.h"
+ RelativePath="..\..\src\game\GridStates.h"
>
</File>
<File
- RelativePath="..\..\src\game\Totem.cpp"
+ RelativePath="..\..\src\game\Group.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Totem.h"
+ RelativePath="..\..\src\game\Group.h"
>
</File>
<File
- RelativePath="..\..\src\game\Traveller.h"
+ RelativePath="..\..\src\game\GroupHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Unit.cpp"
+ RelativePath="..\..\src\game\GuildHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Unit.h"
+ RelativePath="..\..\src\game\InstanceData.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\UnitEvents.h"
+ RelativePath="..\..\src\game\InstanceData.h"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateFields.h"
+ RelativePath="..\..\src\game\InstanceSaveMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\UpdateMask.h"
+ RelativePath="..\..\src\game\InstanceSaveMgr.h"
>
</File>
- </Filter>
- <Filter
- Name="Server"
- >
<File
- RelativePath="..\..\src\game\GlobalEvents.cpp"
+ RelativePath="..\..\src\game\ItemHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GlobalEvents.h"
+ RelativePath="..\..\src\game\LFGHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Opcodes.cpp"
+ RelativePath="..\..\src\game\LootHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Opcodes.h"
+ RelativePath="..\..\src\game\Mail.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SharedDefines.h"
+ RelativePath="..\..\src\game\Mail.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldLog.cpp"
+ RelativePath="..\..\src\game\Map.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldLog.h"
+ RelativePath="..\..\src\game\Map.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSession.cpp"
+ RelativePath="..\..\src\game\MapInstanced.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSession.h"
+ RelativePath="..\..\src\game\MapInstanced.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocket.cpp"
+ RelativePath="..\..\src\game\MapManager.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocket.h"
+ RelativePath="..\..\src\game\MapManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocketMgr.cpp"
+ RelativePath="..\..\src\game\MiscHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WorldSocketMgr.h"
+ RelativePath="..\..\src\game\MovementHandler.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Chat Commands"
- >
<File
- RelativePath="..\..\src\game\Debugcmds.cpp"
+ RelativePath="..\..\src\game\NPCHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Level0.cpp"
+ RelativePath="..\..\src\game\NPCHandler.h"
>
</File>
<File
- RelativePath="..\..\src\game\Level1.cpp"
+ RelativePath="..\..\src\game\ObjectGridLoader.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Level2.cpp"
+ RelativePath="..\..\src\game\ObjectGridLoader.h"
>
</File>
<File
- RelativePath="..\..\src\game\Level3.cpp"
+ RelativePath="..\..\src\game\OutdoorPvP.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Tools"
- >
<File
- RelativePath="..\..\src\game\Language.h"
+ RelativePath="..\..\src\game\OutdoorPvP.h"
>
</File>
<File
- RelativePath="..\..\src\game\PlayerDump.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPEP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PlayerDump.h"
+ RelativePath="..\..\src\game\OutdoorPvPEP.h"
>
</File>
<File
- RelativePath="..\..\src\game\ScriptCalls.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPHP.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ScriptCalls.h"
+ RelativePath="..\..\src\game\OutdoorPvPHP.h"
>
</File>
<File
- RelativePath="..\..\src\game\Tools.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Tools.h"
+ RelativePath="..\..\src\game\OutdoorPvPMgr.h"
>
</File>
- </Filter>
- <Filter
- Name="References"
- >
<File
- RelativePath="..\..\src\game\FollowerReference.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPNA.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\FollowerReference.h"
+ RelativePath="..\..\src\game\OutdoorPvPNA.h"
>
</File>
<File
- RelativePath="..\..\src\game\FollowerRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPSI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupReference.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPSI.h"
>
</File>
<File
- RelativePath="..\..\src\game\GroupReference.h"
+ RelativePath="..\..\src\game\OutdoorPvPTF.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPTF.h"
>
</File>
<File
- RelativePath="..\..\src\game\HostilRefManager.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPZM.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\HostilRefManager.h"
+ RelativePath="..\..\src\game\OutdoorPvPZM.h"
>
</File>
<File
- RelativePath="..\..\src\game\ThreatManager.cpp"
+ RelativePath="..\..\src\game\Path.h"
>
</File>
<File
- RelativePath="..\..\src\game\ThreatManager.h"
+ RelativePath="..\..\src\game\PetHandler.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Battlegrounds"
- >
<File
- RelativePath="..\..\src\game\BattleGround.cpp"
+ RelativePath="..\..\src\game\PetitionsHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGround.h"
+ RelativePath="..\..\src\game\PoolHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAA.cpp"
+ RelativePath="..\..\src\game\PoolHandler.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAA.h"
+ RelativePath="..\..\src\game\QueryHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAB.cpp"
+ RelativePath="..\..\src\game\QuestDef.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAB.h"
+ RelativePath="..\..\src\game\QuestDef.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAV.cpp"
+ RelativePath="..\..\src\game\QuestHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundAV.h"
+ RelativePath="..\..\src\game\ScriptCalls.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundBE.cpp"
+ RelativePath="..\..\src\game\ScriptCalls.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundBE.h"
+ RelativePath="..\..\src\game\SkillDiscovery.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundEY.cpp"
+ RelativePath="..\..\src\game\SkillDiscovery.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundEY.h"
+ RelativePath="..\..\src\game\SkillExtraItems.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundHandler.cpp"
+ RelativePath="..\..\src\game\SkillExtraItems.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundMgr.cpp"
+ RelativePath="..\..\src\game\SkillHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundMgr.h"
+ RelativePath="..\..\src\game\Spell.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundNA.cpp"
+ RelativePath="..\..\src\game\Spell.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundNA.h"
+ RelativePath="..\..\src\game\SpellAuraDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundRL.cpp"
+ RelativePath="..\..\src\game\SpellAuras.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundRL.h"
+ RelativePath="..\..\src\game\SpellAuras.h"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundWS.cpp"
+ RelativePath="..\..\src\game\SpellEffects.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\BattleGroundWS.h"
+ RelativePath="..\..\src\game\SpellHandler.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Outdoor PvP"
- >
<File
- RelativePath="..\..\src\game\OutdoorPvP.cpp"
+ RelativePath="..\..\src\game\TaxiHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvP.h"
+ RelativePath="..\..\src\game\TicketHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPEP.cpp"
+ RelativePath="..\..\src\game\TradeHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPEP.h"
+ RelativePath="..\..\src\game\Transports.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPHP.cpp"
+ RelativePath="..\..\src\game\Transports.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPHP.h"
+ RelativePath="..\..\src\game\UpdateData.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"
+ RelativePath="..\..\src\game\UpdateData.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPMgr.h"
+ RelativePath="..\..\src\game\VoiceChatHandler.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPNA.cpp"
+ RelativePath="..\..\src\game\WaypointManager.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPNA.h"
+ RelativePath="..\..\src\game\WaypointManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp"
+ RelativePath="..\..\src\game\Weather.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h"
+ RelativePath="..\..\src\game\Weather.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPSI.cpp"
+ RelativePath="..\..\src\game\World.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPSI.h"
+ RelativePath="..\..\src\game\World.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="AuctionHouseBot"
+ >
<File
- RelativePath="..\..\src\game\OutdoorPvPTF.cpp"
+ RelativePath="..\..\src\game\AuctionHouseBot.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\game\AuctionHouseBot.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Object"
+ >
+ <File
+ RelativePath="..\..\src\game\AggressorAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPTF.h"
+ RelativePath="..\..\src\game\AggressorAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPZM.cpp"
+ RelativePath="..\..\src\game\AnimalRandomMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\OutdoorPvPZM.h"
+ RelativePath="..\..\src\game\ArenaTeam.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Artificial Intelligence"
- >
<File
- RelativePath="..\..\src\game\AggressorAI.cpp"
+ RelativePath="..\..\src\game\ArenaTeam.h"
>
</File>
<File
- RelativePath="..\..\src\game\AggressorAI.h"
+ RelativePath="..\..\src\game\AuctionHouseMgr.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AuctionHouseMgr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Bag.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Bag.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Calendar.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Calendar.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ConfusedMovementGenerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Corpse.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Corpse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Creature.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Creature.h"
>
</File>
<File
@@ -986,75 +1003,67 @@
>
</File>
<File
- RelativePath="..\..\src\game\GuardAI.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\GuardAI.h"
+ RelativePath="..\..\src\game\CreatureGroups.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\NullCreatureAI.cpp"
+ RelativePath="..\..\src\game\CreatureGroups.h"
>
</File>
<File
- RelativePath="..\..\src\game\NullCreatureAI.h"
+ RelativePath="..\..\src\game\DestinationHolder.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PetAI.cpp"
+ RelativePath="..\..\src\game\DestinationHolder.h"
>
</File>
<File
- RelativePath="..\..\src\game\PetAI.h"
+ RelativePath="..\..\src\game\DestinationHolderImp.h"
>
</File>
<File
- RelativePath="..\..\src\game\PossessedAI.cpp"
+ RelativePath="..\..\src\game\DynamicObject.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PossessedAI.h"
+ RelativePath="..\..\src\game\DynamicObject.h"
>
</File>
<File
- RelativePath="..\..\src\game\ReactorAI.cpp"
+ RelativePath="..\..\src\game\FleeingMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ReactorAI.h"
+ RelativePath="..\..\src\game\FleeingMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\TotemAI.cpp"
+ RelativePath="..\..\src\game\Formulas.h"
>
</File>
<File
- RelativePath="..\..\src\game\TotemAI.h"
+ RelativePath="..\..\src\game\GameObject.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Movement Generators"
- >
<File
- RelativePath="..\..\src\game\AnimalRandomMovementGenerator.h"
+ RelativePath="..\..\src\game\GameObject.h"
>
</File>
<File
- RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
+ RelativePath="..\..\src\game\GuardAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ConfusedMovementGenerator.h"
+ RelativePath="..\..\src\game\GuardAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\FleeingMovementGenerator.cpp"
+ RelativePath="..\..\src\game\Guild.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\FleeingMovementGenerator.h"
+ RelativePath="..\..\src\game\Guild.h"
>
</File>
<File
@@ -1074,387 +1083,395 @@
>
</File>
<File
- RelativePath="..\..\src\game\MovementGenerator.cpp"
+ RelativePath="..\..\src\game\Item.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MovementGenerator.h"
+ RelativePath="..\..\src\game\Item.h"
>
</File>
<File
- RelativePath="..\..\src\game\PointMovementGenerator.cpp"
+ RelativePath="..\..\src\game\ItemEnchantmentMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PointMovementGenerator.h"
+ RelativePath="..\..\src\game\ItemEnchantmentMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\RandomMovementGenerator.cpp"
+ RelativePath="..\..\src\game\ItemPrototype.h"
>
</File>
<File
- RelativePath="..\..\src\game\RandomMovementGenerator.h"
+ RelativePath="..\..\src\game\LootMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TargetedMovementGenerator.cpp"
+ RelativePath="..\..\src\game\LootMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\TargetedMovementGenerator.h"
+ RelativePath="..\..\src\game\MotionMaster.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
+ RelativePath="..\..\src\game\MotionMaster.h"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointMovementGenerator.h"
+ RelativePath="..\..\src\game\MovementGenerator.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Spells/Skills"
- >
<File
- RelativePath="..\..\src\game\SkillDiscovery.cpp"
+ RelativePath="..\..\src\game\MovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\SkillDiscovery.h"
+ RelativePath="..\..\src\game\NullCreatureAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SkillExtraItems.cpp"
+ RelativePath="..\..\src\game\NullCreatureAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\SkillExtraItems.h"
+ RelativePath="..\..\src\game\Object.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SkillHandler.cpp"
+ RelativePath="..\..\src\game\Object.h"
>
</File>
<File
- RelativePath="..\..\src\game\Spell.cpp"
+ RelativePath="..\..\src\game\ObjectAccessor.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Spell.h"
+ RelativePath="..\..\src\game\ObjectAccessor.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellAuraDefines.h"
+ RelativePath="..\..\src\game\ObjectDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellAuras.cpp"
+ RelativePath="..\..\src\game\ObjectMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SpellAuras.h"
+ RelativePath="..\..\src\game\ObjectMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellEffects.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SpellHandler.cpp"
+ RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\SpellMgr.cpp"
+ RelativePath="..\..\src\game\Pet.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SpellMgr.h"
+ RelativePath="..\..\src\game\Pet.h"
>
</File>
<File
- RelativePath="..\..\src\game\StatSystem.cpp"
+ RelativePath="..\..\src\game\PetAI.cpp"
>
</File>
- </Filter>
- <Filter
- Name="Maps/Grids"
- >
<File
- RelativePath="..\..\src\game\Cell.h"
+ RelativePath="..\..\src\game\PetAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\CellImpl.h"
+ RelativePath="..\..\src\game\Player.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GridDefines.h"
+ RelativePath="..\..\src\game\Player.h"
>
</File>
<File
- RelativePath="..\..\src\game\GridNotifiers.cpp"
+ RelativePath="..\..\src\game\PointMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GridNotifiers.h"
+ RelativePath="..\..\src\game\PointMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\GridNotifiersImpl.h"
+ RelativePath="..\..\src\game\PossessedAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GridStates.cpp"
+ RelativePath="..\..\src\game\PossessedAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\GridStates.h"
+ RelativePath="..\..\src\game\RandomMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceData.cpp"
+ RelativePath="..\..\src\game\RandomMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceData.h"
+ RelativePath="..\..\src\game\ReactorAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceSaveMgr.cpp"
+ RelativePath="..\..\src\game\ReactorAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\InstanceSaveMgr.h"
+ RelativePath="..\..\src\game\SocialMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Map.cpp"
+ RelativePath="..\..\src\game\SocialMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Map.h"
+ RelativePath="..\..\src\game\SpellMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapInstanced.cpp"
+ RelativePath="..\..\src\game\SpellMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\MapInstanced.h"
+ RelativePath="..\..\src\game\StatSystem.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapManager.cpp"
+ RelativePath="..\..\src\game\TargetedMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapManager.h"
+ RelativePath="..\..\src\game\TargetedMovementGenerator.h"
>
</File>
<File
- RelativePath="..\..\src\game\MapReference.h"
+ RelativePath="..\..\src\game\TemporarySummon.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\MapRefManager.h"
+ RelativePath="..\..\src\game\TemporarySummon.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectGridLoader.cpp"
+ RelativePath="..\..\src\game\TicketMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectGridLoader.h"
+ RelativePath="..\..\src\game\TicketMgr.h"
>
</File>
<File
- RelativePath="..\..\src\game\Path.h"
+ RelativePath="..\..\src\game\Totem.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Transports.cpp"
+ RelativePath="..\..\src\game\Totem.h"
>
</File>
<File
- RelativePath="..\..\src\game\Transports.h"
+ RelativePath="..\..\src\game\TotemAI.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\Weather.cpp"
+ RelativePath="..\..\src\game\TotemAI.h"
>
</File>
<File
- RelativePath="..\..\src\game\Weather.h"
+ RelativePath="..\..\src\game\Traveller.h"
>
</File>
- </Filter>
- <Filter
- Name="Handlers"
- >
<File
- RelativePath="..\..\src\game\AddonHandler.cpp"
+ RelativePath="..\..\src\game\Unit.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\AddonHandler.h"
+ RelativePath="..\..\src\game\Unit.h"
>
</File>
<File
- RelativePath="..\..\src\game\ArenaTeamHandler.cpp"
+ RelativePath="..\..\src\game\UnitEvents.h"
>
</File>
<File
- RelativePath="..\..\src\game\ChannelHandler.cpp"
+ RelativePath="..\..\src\game\UpdateFields.h"
>
</File>
<File
- RelativePath="..\..\src\game\CharacterHandler.cpp"
+ RelativePath="..\..\src\game\UpdateMask.h"
>
</File>
<File
- RelativePath="..\..\src\game\ChatHandler.cpp"
+ RelativePath="..\..\src\game\Vehicle.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\CombatHandler.cpp"
+ RelativePath="..\..\src\game\Vehicle.h"
>
</File>
<File
- RelativePath="..\..\src\game\DuelHandler.cpp"
+ RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\GroupHandler.cpp"
+ RelativePath="..\..\src\game\WaypointMovementGenerator.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="Server"
+ >
<File
- RelativePath="..\..\src\game\GuildHandler.cpp"
+ RelativePath="..\..\src\game\GlobalEvents.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ItemHandler.cpp"
+ RelativePath="..\..\src\game\GlobalEvents.h"
>
</File>
<File
- RelativePath="..\..\src\game\LFGHandler.cpp"
+ RelativePath="..\..\src\game\Opcodes.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\LootHandler.cpp"
+ RelativePath="..\..\src\game\Opcodes.h"
>
</File>
<File
- RelativePath="..\..\src\game\MiscHandler.cpp"
+ RelativePath="..\..\src\game\SharedDefines.h"
>
</File>
<File
- RelativePath="..\..\src\game\MovementHandler.cpp"
+ RelativePath="..\..\src\game\WorldLog.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\NPCHandler.cpp"
+ RelativePath="..\..\src\game\WorldLog.h"
>
</File>
<File
- RelativePath="..\..\src\game\NPCHandler.h"
+ RelativePath="..\..\src\game\WorldSession.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\PetHandler.cpp"
+ RelativePath="..\..\src\game\WorldSession.h"
>
</File>
<File
- RelativePath="..\..\src\game\PetitionsHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\QueryHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocket.h"
>
</File>
<File
- RelativePath="..\..\src\game\QuestHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocketMgr.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TaxiHandler.cpp"
+ RelativePath="..\..\src\game\WorldSocketMgr.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="Chat Commands"
+ >
<File
- RelativePath="..\..\src\game\TicketHandler.cpp"
+ RelativePath="..\..\src\game\debugcmds.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\TradeHandler.cpp"
+ RelativePath="..\..\src\game\Level0.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\VoiceChatHandler.cpp"
+ RelativePath="..\..\src\game\Level1.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointManager.cpp"
+ RelativePath="..\..\src\game\Level2.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\WaypointManager.h"
+ RelativePath="..\..\src\game\Level3.cpp"
>
</File>
</Filter>
<Filter
- Name="Managers"
+ Name="Tool"
>
<File
- RelativePath="..\..\src\game\AccountMgr.cpp"
+ RelativePath="..\..\src\game\Language.h"
>
</File>
<File
- RelativePath="..\..\src\game\AccountMgr.h"
+ RelativePath="..\..\src\game\PlayerDump.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ChannelMgr.h"
+ RelativePath="..\..\src\game\PlayerDump.h"
>
</File>
+ </Filter>
+ <Filter
+ Name="References"
+ >
<File
- RelativePath="..\..\src\game\ItemEnchantmentMgr.cpp"
+ RelativePath="..\..\src\game\FollowerReference.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ItemEnchantmentMgr.h"
+ RelativePath="..\..\src\game\FollowerReference.h"
>
</File>
<File
- RelativePath="..\..\src\game\LootMgr.cpp"
+ RelativePath="..\..\src\game\FollowerRefManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\LootMgr.h"
+ RelativePath="..\..\src\game\GroupReference.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectMgr.cpp"
+ RelativePath="..\..\src\game\GroupReference.h"
>
</File>
<File
- RelativePath="..\..\src\game\ObjectMgr.h"
+ RelativePath="..\..\src\game\GroupRefManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\SocialMgr.cpp"
+ RelativePath="..\..\src\game\HostilRefManager.cpp"
>
</File>
<File
- RelativePath="..\..\src\game\SocialMgr.h"
+ RelativePath="..\..\src\game\HostilRefManager.h"
>
</File>
<File
- RelativePath="..\..\src\game\TicketMgr.cpp"
+ RelativePath="..\..\src\game\MapReference.h"
>
</File>
<File
- RelativePath="..\..\src\game\TicketMgr.h"
+ RelativePath="..\..\src\game\MapRefManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ThreatManager.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\ThreatManager.h"
>
</File>
</Filter>
diff --git a/win/VC90/mangosd.vcproj b/win/VC90/mangosd.vcproj
new file mode 100644
index 00000000000..bb8971612cb
--- /dev/null
+++ b/win/VC90/mangosd.vcproj
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="TrinityCore"
+ ProjectGUID="{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+ RootNamespace="mangosd"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="0"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\..\..\bin\Release\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ LinkTimeCodeGeneration="0"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\..\..\bin\Release\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="0"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LinkTimeCodeGeneration="0"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ FixedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ FixedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="doc"
+ >
+ <File
+ RelativePath="..\..\Authors"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ChangeLog"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Copying"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Install"
+ >
+ </File>
+ <File
+ RelativePath="..\..\News"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Readme"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Thanks"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\..\src\mangosd\CliRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\CliRunnable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\mangosd.rc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Master.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Master.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\RASocket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\RASocket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\WorldRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\WorldRunnable.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win/VC90/realmd.vcproj b/win/VC90/realmd.vcproj
new file mode 100644
index 00000000000..69dbb97ea94
--- /dev/null
+++ b/win/VC90/realmd.vcproj
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="TrinityRealm"
+ ProjectGUID="{563E9905-3657-460C-AE63-0AC39D162E23}"
+ RootNamespace="realmd"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="0"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="0"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ FixedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\realmd__$(PlatformName)_$(ConfigurationName)\realmd.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/MP"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
+ AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="zthread.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="&quot;..\..\dep\lib\$(PlatformName)_$(ConfigurationName)&quot;;&quot;.\zthread__$(PlatformName)_$(ConfigurationName)&quot;"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ FixedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\src\realmd\AuthCodes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\AuthSocket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\AuthSocket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\Main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\realmd.rc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\RealmList.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\realmd\RealmList.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>