diff --git a/.gitignore b/.gitignore index 34f87cabac2..8e1bacb6355 100644 --- a/.gitignore +++ b/.gitignore @@ -88,6 +88,8 @@ cmake_install.cmake # Special exceptions # +src/modules + # recastnavigation directory needs exception !dep/recastnavigation/RecastDemo/Build/ /_build/ diff --git a/contrib/extractor/meson.build b/contrib/extractor/meson.build new file mode 100644 index 00000000000..ad7a78c5047 --- /dev/null +++ b/contrib/extractor/meson.build @@ -0,0 +1,18 @@ +ad_sources = [ + 'loadlib/loadlib.cpp', + 'loadlib/adt.cpp', + 'loadlib/wdt.cpp', + 'dbcfile.cpp', + 'mpq_libmpq.cpp', + 'System.cpp', +] + +executable('ad', + ad_sources, + link_with: [lib_libmpq], + include_directories: global_includes, + dependencies: [boost_dep, zlib_dep], + link_args: _linker_args, + install_dir: 'bin/tools', + install: true +) diff --git a/contrib/git_id/meson.build b/contrib/git_id/meson.build new file mode 100644 index 00000000000..4d46efc4d0a --- /dev/null +++ b/contrib/git_id/meson.build @@ -0,0 +1,3 @@ +executable('git_id', + 'git_id.cpp', +) \ No newline at end of file diff --git a/contrib/mmap/meson.build b/contrib/mmap/meson.build new file mode 100644 index 00000000000..3d8fcdb630d --- /dev/null +++ b/contrib/mmap/meson.build @@ -0,0 +1,51 @@ +movemapgen_args = '' +movemapgen_args = [movemapgen_args, '-DMMAP_GENERATOR', '-DNO_CORE_FUNCS', '-DNO_vsnprintf', '-DDT_POLYREF64'] +movemapgen_sources = [ + 'src/generator.cpp', + 'src/IntermediateValues.cpp', + 'src/MapBuilder.cpp', + 'src/TerrainBuilder.cpp', + 'src/VMapExtensions.cpp' +] + +if build_machine.system() == 'linux' + movemapgen_args = [movemapgen_args, '-ggdb'] +endif + +vmaplib = static_library('vmaplib', + ['../../src/game/Vmap/BIH.cpp', '../../src/game/Vmap/VMapManager2.cpp', '../../src/game/Vmap/MapTree.cpp', '../../src/game/Vmap/TileAssembler.cpp', '../../src/game/Vmap/WorldModel.cpp', '../../src/game/Vmap/ModelInstance.cpp', '../../src/game/Vmap/GameObjectModelVmaps.cpp'], + include_directories: global_includes, + dependencies: [zlib_dep, boost_dep], + cpp_args: movemapgen_args, + link_with: [g3dlib, detourlib, recastlib, frameworklib, sharedlib], + install : false +) + +mmaplib = static_library('mmaplib', + ['src/generator.cpp', 'src/IntermediateValues.cpp', 'src/MapBuilder.cpp', 'src/TerrainBuilder.cpp', 'src/VMapExtensions.cpp', '../../src/game/MotionGenerators/MoveMapSharedDefines.cpp'], + include_directories: global_includes, + dependencies: [zlib_dep, boost_dep], + cpp_args: movemapgen_args, + link_with: [vmaplib, detourlib, recastlib, g3dlib, frameworklib], + install: false +) + +if get_option('BUILD_EXTRACTORS') + if build_machine.system() == 'linux' + local_linker = [_linker_args, '-rdynamic'] + endif + executable('MoveMapGen', + movemapgen_sources, + link_with: [vmaplib, detourlib, recastlib, mmaplib], + include_directories: global_includes, + dependencies: [boost_dep, zlib_dep], + cpp_args: movemapgen_args, + link_args: _linker_args, + install_dir: 'bin/tools', + install: true + ) + install_data(movemapgen_script_file, install_dir: 'bin/tools') + install_data(offmesh_file, install_dir: 'bin/tools') + install_data(config_json_file, install_dir: 'bin/tools') +endif + diff --git a/contrib/vmap_assembler/meson.build b/contrib/vmap_assembler/meson.build new file mode 100644 index 00000000000..39742f3b437 --- /dev/null +++ b/contrib/vmap_assembler/meson.build @@ -0,0 +1,31 @@ +assembler_args = '' +if get_option('DEBUG') + assembler_args = [assembler_args, '-DIOMAP_DEBUG'] +endif + +assembler_args = [assembler_args, '-DNO_CORE_FUNCS'] + +if build_machine.system() == 'linux' + assembler_args = [assembler_args, '-ggdb'] +endif + +vmap_assembler_sources = [ + '../../src/game/Vmap/BIH.cpp', + '../../src/game/Vmap/VMapManager2.cpp', + '../../src/game/Vmap/MapTree.cpp', + '../../src/game/Vmap/TileAssembler.cpp', + '../../src/game/Vmap/WorldModel.cpp', + '../../src/game/Vmap/ModelInstance.cpp', + 'vmap_assembler.cpp' +] + +executable('vmap_assembler', + vmap_assembler_sources, + link_with: [sharedlib, g3dlib, frameworklib], + include_directories: global_includes, + dependencies: [boost_dep, zlib_dep], + cpp_args: assembler_args, + link_args: _linker_args, + install_dir: 'bin/tools', + install: true +) \ No newline at end of file diff --git a/contrib/vmap_extractor/meson.build b/contrib/vmap_extractor/meson.build new file mode 100644 index 00000000000..3188f07f848 --- /dev/null +++ b/contrib/vmap_extractor/meson.build @@ -0,0 +1,7 @@ +vmap_extractor_args = ['-DIOMAP_DEBUG', '-DUSE_LIBMPQ04'] + +if build_machine.system() == 'linux' + vmap_extractor_args = [vmap_extractor_args, '-ggdb'] +endif + +subdir('vmapextract') \ No newline at end of file diff --git a/contrib/vmap_extractor/vmapextract/meson.build b/contrib/vmap_extractor/vmapextract/meson.build new file mode 100644 index 00000000000..08174f1bb3f --- /dev/null +++ b/contrib/vmap_extractor/vmapextract/meson.build @@ -0,0 +1,20 @@ +vmap_extractor_sources = [ + 'adtfile.cpp', + 'dbcfile.cpp', + 'gameobject_extract.cpp', + 'model.cpp', + 'mpq_libmpq.cpp', + 'vmapexport.cpp', + 'wdtfile.cpp', + 'wmo.cpp' +] + +executable('vmap_extractor', + vmap_extractor_sources, + include_directories: global_includes, + link_with: [g3dlib, lib_libmpq, detourlib, recastlib], + link_args: _linker_args, + install_dir: 'bin/tools', + install: true +) +install_data(extractor_script_file, install_dir: 'bin/tools') \ No newline at end of file diff --git a/dep/g3dlite/meson.build b/dep/g3dlite/meson.build new file mode 100644 index 00000000000..d67873f1ab0 --- /dev/null +++ b/dep/g3dlite/meson.build @@ -0,0 +1,52 @@ +g3d_sources = [ + 'AABox.cpp', + 'Any.cpp', + 'BinaryFormat.cpp', + 'BinaryInput.cpp', + 'BinaryOutput.cpp', + 'Box.cpp', + 'Capsule.cpp', + 'CollisionDetection.cpp', + 'CoordinateFrame.cpp', + 'Crypto.cpp', + 'Cylinder.cpp', + 'FileSystem.cpp', + 'Line.cpp', + 'LineSegment.cpp', + 'Log.cpp', + 'Matrix3.cpp', + 'Matrix4.cpp', + 'MemoryManager.cpp', + 'PhysicsFrame.cpp', + 'Plane.cpp', + 'Quat.cpp', + 'Random.cpp', + 'Ray.cpp', + 'ReferenceCount.cpp', + 'RegistryUtil.cpp', + 'Sphere.cpp', + 'System.cpp', + 'TextInput.cpp', + 'TextOutput.cpp', + 'Triangle.cpp', + 'UprightFrame.cpp', + 'Vector2.cpp', + 'Vector3.cpp', + 'Vector4.cpp', + 'debugAssert.cpp', + 'fileutils.cpp', + 'format.cpp', + 'g3dfnmatch.cpp', + 'g3dmath.cpp', + 'prompt.cpp', + 'stringutils.cpp', + 'uint128.cpp' +] + +g3d_inc = include_directories('G3D', '../include') + +g3dlib = static_library('g3dlite', + g3d_sources, + include_directories: g3d_inc, + dependencies: zlib_dep, + install : false) \ No newline at end of file diff --git a/dep/libmpq/meson.build b/dep/libmpq/meson.build new file mode 100644 index 00000000000..9cb6aeb0dfb --- /dev/null +++ b/dep/libmpq/meson.build @@ -0,0 +1,34 @@ +libmpq_sources = [ + 'config.h', + 'libmpq/common.c', + 'libmpq/common.h', + 'libmpq/crypt_buf.h', + 'libmpq/explode.c', + 'libmpq/explode.h', + 'libmpq/extract.c', + 'libmpq/huffman.c', + 'libmpq/huffman.h', + 'libmpq/mpq-internal.h', + 'libmpq/mpq.c', + 'libmpq/mpq.h', + 'libmpq/pack_begin.h', + 'libmpq/pack_end.h', + 'libmpq/platform.h', + 'libmpq/wave.c', + 'libmpq/wave.h' +] + +libmpq_inc_dir = ['.'] + +if meson.get_compiler('cpp').get_id() == 'msvc' + libmpq_inc_dir = [libmpq_inc_dir, 'win'] +endif + +libmpq_inc = include_directories(libmpq_inc_dir) + +lib_libmpq = static_library('libmpq', + libmpq_sources, + include_directories: libmpq_inc, + dependencies: [zlib_dep, bzip2_dep], + install : false +) \ No newline at end of file diff --git a/dep/meson.build b/dep/meson.build new file mode 100644 index 00000000000..7ea6c11152b --- /dev/null +++ b/dep/meson.build @@ -0,0 +1,8 @@ +if get_option('BUILD_GAME_SERVER') or get_option('BUILD_LOGIN_SERVER') or get_option('BUILD_EXTRACTORS') + subdir('recastnavigation') + subdir('src') + subdir('g3dlite') + if get_option('BUILD_EXTRACTORS') + subdir('libmpq') + endif +endif \ No newline at end of file diff --git a/dep/recastnavigation/Detour/meson.build b/dep/recastnavigation/Detour/meson.build new file mode 100644 index 00000000000..a8b4604a843 --- /dev/null +++ b/dep/recastnavigation/Detour/meson.build @@ -0,0 +1,26 @@ +detour_sources = [ + 'Source/DetourAlloc.cpp', + 'Source/DetourAssert.cpp', + 'Source/DetourCommon.cpp', + 'Source/DetourNavMesh.cpp', + 'Source/DetourNavMeshBuilder.cpp', + 'Source/DetourNavMeshQuery.cpp', + 'Source/DetourNode.cpp', + 'Include/DetourAlloc.h', + 'Include/DetourAssert.h', + 'Include/DetourCommon.h', + 'Include/DetourMath.h', + 'Include/DetourNavMesh.h', + 'Include/DetourNavMeshBuilder.h', + 'Include/DetourNavMeshQuery.h', + 'Include/DetourNode.h', + 'Include/DetourStatus.h' +] + +detour_inc = include_directories('Include') + +detourlib = static_library('Detour', + detour_sources, + include_directories: detour_inc, + cpp_args: recastnav_args, + install : false) \ No newline at end of file diff --git a/dep/recastnavigation/Recast/meson.build b/dep/recastnavigation/Recast/meson.build new file mode 100644 index 00000000000..ead65597fd2 --- /dev/null +++ b/dep/recastnavigation/Recast/meson.build @@ -0,0 +1,23 @@ +recast_sources = [ + 'Source/Recast.cpp', + 'Source/RecastAlloc.cpp', + 'Source/RecastArea.cpp', + 'Source/RecastAssert.cpp', + 'Source/RecastContour.cpp', + 'Source/RecastFilter.cpp', + 'Source/RecastLayers.cpp', + 'Source/RecastMesh.cpp', + 'Source/RecastMeshDetail.cpp', + 'Source/RecastRasterization.cpp', + 'Source/RecastRegion.cpp', + 'Include/Recast.h', + 'Include/RecastAlloc.h', + 'Include/RecastAssert.h' +] + +recastlib = static_library('recast', + recast_sources, + include_directories: include_directories('Include'), + cpp_args: recastnav_args, + install : false +) \ No newline at end of file diff --git a/dep/recastnavigation/meson.build b/dep/recastnavigation/meson.build new file mode 100644 index 00000000000..6cc57ac9b1c --- /dev/null +++ b/dep/recastnavigation/meson.build @@ -0,0 +1,14 @@ +if get_option('BUILD_GAME_SERVER') or get_option('BUILD_EXTRACTORS') or get_option('BUILD_RECASTDEMOMOD') + recastnav_args = '-DDT_POLYREF64' + subdir('Detour') +endif + +if get_option('BUILD_EXTRACTORS') or get_option('BUILD_RECASTDEMOMOD') + subdir('Recast') +endif + +if get_option('BUILD_RECASTDEMOMOD') + subdir('DetourCrowd') + subdir('DetourTileCache') + subdir('DebugUtils') +endif \ No newline at end of file diff --git a/dep/src/bzip2/meson.build b/dep/src/bzip2/meson.build new file mode 100644 index 00000000000..d6d94c17cc5 --- /dev/null +++ b/dep/src/bzip2/meson.build @@ -0,0 +1,21 @@ +bzip2_sources = [ + 'compress.c', + 'crctable.c', + 'decompress.c', + 'huffman.c', + 'randtable.c', + 'blocksort.c', + 'bzlib.c' +] + +bz2_inc = include_directories('.') + +bz2lib = static_library('bzip2', + bzip2_sources, + include_directories: [global_includes, bz2_inc], + install : false) + +bzip2_dep = declare_dependency( + include_directories: bz2_inc, + link_with: bz2lib +) \ No newline at end of file diff --git a/dep/src/gsoap/meson.build b/dep/src/gsoap/meson.build new file mode 100644 index 00000000000..13611254ab1 --- /dev/null +++ b/dep/src/gsoap/meson.build @@ -0,0 +1,6 @@ +gsoap_sources = ['stdsoap2.cpp'] + +gsoaplib = static_library('gsoap', + gsoap_sources, + include_directories: global_includes, + install : false) \ No newline at end of file diff --git a/dep/src/meson.build b/dep/src/meson.build new file mode 100644 index 00000000000..cf0c7baa5b3 --- /dev/null +++ b/dep/src/meson.build @@ -0,0 +1,7 @@ +subdir('gsoap') +if get_option('BUILD_EXTRACTORS') + bzip2_dep = dependency('bzip2', required: false) + if not bzip2_dep.found() + subdir('bzip2') + endif +endif \ No newline at end of file diff --git a/doc/meson.build b/doc/meson.build new file mode 100644 index 00000000000..45d4466d891 --- /dev/null +++ b/doc/meson.build @@ -0,0 +1,12 @@ +doxygen = find_program('doxygen', required : false) +if doxygen.found() + doxy_file = configure_file( + configuration: {'PACKAGE': meson.project_name(), 'VERSION': meson.project_version(), 'TOPSRCDIR': meson.source_root(), 'DESTDIR': meson.build_root() + '/doc/docs'}, + input: 'Doxyfile.dist', + output: 'Doxyfile' + ) + run_command([doxygen, meson.build_root() + '/doc/Doxyfile'], check: false) + install_subdir(meson.build_root() + '/doc/docs/html', install_dir: 'docs') +else + warning('Documentation disabled without doxygen') +endif diff --git a/meson.build b/meson.build new file mode 100644 index 00000000000..db7ad36dd0c --- /dev/null +++ b/meson.build @@ -0,0 +1,145 @@ +project('CMaNGOS WotLK', 'cpp', 'c', + license: 'GPL-2.0-only', + meson_version: '>=1.3.1', + default_options : ['cpp_std=vc++17,c++17', 'buildtype=release', 'warning_level=0', 'default_library=static']) + +if build_machine.system() == 'windows' + add_project_arguments('/Zc:strictStrings-', language : 'cpp') +endif + +_linker_args = '' + +boost_dep = dependency('boost', version: '>=1.66.0', static: true, modules: ['thread', 'program_options', 'system', 'filesystem'], required: false) +if not boost_dep.found() + message('Static Boost libraries could not be found. Trying dynamic libraries') + boost_dep = dependency('boost', version: '>=1.66.0', static:false, modules: ['thread', 'program_options', 'system', 'filesystem'], required: true) +endif +dblib_dep = dependency('mariadb', 'libmariadb', 'mysql', 'libmysql', 'postgresql', required: false) +zlib_dep = dependency('zlib', version: '>=1.2.13', static: true, fallback: ['zlib', 'zlib_dep'], required: true) +openssl_dep = dependency('openssl', version: '>=3.0.14', static: true, fallback: ['openssl'], required: true) +utfcpp_dep = dependency('utf8cpp', 'utfcpp', static: true, required: false) +sqlite_dep = dependency('sqlite3', static: true, fallback: ['sqlite3'], required: get_option('SQLITE')) + +global_includes = include_directories('src/game', 'dep/libmpq', 'src', 'src/framework', 'src/game/Vmap', + 'dep/json', 'dep/g3dlite', 'src/shared', 'dep/recastnavigation', + 'dep/recastnavigation/Recast/Include', 'dep/recastnavigation/Detour/Include', + 'src/game/MotionGenerators', 'dep/include/bzip2', 'dep/include/gsoap', + 'dep/include') + +if not get_option('SQLITE') + if not dblib_dep.found() + if build_machine.system() == 'windows' + mysql_dirs = [ + 'C:\Program Files\MySQL\MySQL Server 8.0\lib', + 'C:\Program Files\MySQL\MySQL Server 5.7\lib', + 'C:\Program Files\MariaDB 11.0\lib', + 'C:\Program Files\MariaDB 11.1\lib', + 'C:\Program Files\MariaDB 11.2\lib', + get_option('LIBMYSQL_PATH'), + ] + + fs = import('fs') + if fs.is_dir('C:\Program Files\MySQL\MySQL Server 8.0\lib') + mysql_dll = 'C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.dll' + elif fs.is_dir('C:\Program Files\MySQL\MySQL Server 5.7\lib') + mysql_dll = 'C:\Program Files\MySQL\MySQL Server 5.7\lib\libmysql.dll' + elif fs.is_dir('C:\Program Files\MariaDB 11.2\lib') + mysql_dll = 'C:\Program Files\MariaDB 11.2\lib\libmariadb.dll' + elif fs.is_dir('C:\Program Files\MariaDB 11.1\lib') + mysql_dll = 'C:\Program Files\MariaDB 11.1\liblibmariadb.dll' + elif fs.is_dir('C:\Program Files\MariaDB 11.0\lib') + mysql_dll = 'C:\Program Files\MariaDB 11.0\lib\libmariadb.dll' + elif fs.is_dir(get_option('LIBMYSQL_PATH')) + mysql_dll = get_option('LIBMYSQL_PATH') + '\libmysql.dll' + else + error('No local MySQL Server installation found') + endif + + dblib_dep = meson.get_compiler('cpp').find_library('mysql', dirs: mysql_dirs, static: true, required: false) + if not dblib_dep.found() + dblib_dep = meson.get_compiler('cpp').find_library('mariadb', dirs: mysql_dirs, static: true, required: false) + endif + install_data(mysql_dll, install_dir: get_option('bindir')) + else + error('No local MySQL Server installation found') + endif + endif +else + dblib_dep = sqlite_dep +endif + +if not dblib_dep.found() + error('No local SQL Server installation found') +endif + +if get_option('POSTGRESQL') + add_project_arguments('-DDO_POSTGRESQL', language: 'cpp') +endif + +if get_option('SQLITE') + add_project_arguments('-DDO_SQLITE=1', language: 'cpp') +endif + +if get_option('DEBUG') + add_project_arguments('-g3', language: 'cpp') +endif + +if not get_option('WARNINGS') + add_project_arguments('-w', language: 'cpp') +endif + +if build_machine.system() == 'linux' + add_project_arguments('-DSYSCONFDIR="../etc/"', language: 'cpp') +endif + +add_project_arguments('-DBOOST_ALL_NO_LIB', language: 'cpp') + +if get_option('BUILD_SCRIPTDEV') + add_project_arguments('-DBUILD_SCRIPTDEV', language: 'cpp') +endif +if get_option('BUILD_PLAYERBOT') + add_project_arguments('-DBUILD_PLAYERBOT', language: 'cpp') +endif +if get_option('BUILD_AHBOT') + add_project_arguments('-DBUILD_AHBOT', language: 'cpp') +endif +if get_option('BUILD_METRICS') + add_project_arguments('-DBUILD_METRICS', language: 'cpp') +endif + +if get_option('BUILD_DOCS') + subdir('doc') +endif + +if get_option('BUILD_RECASTDEMOMOD') + error('RECASTDEMOMOD currently unavailable') + if build_machine.system() == 'windows' + if not get_option('BUILD_EXTRACTORS') + subdir('contrib/mmap') + endif + subdir('contrib/recastdemomod') + else + message('BUILD_RECASTDEMOMOD forced to OFF. Not supported on non windows system.') + endif +endif + +if get_option('BUILD_GIT_ID') + subdir('contrib/git_id') +endif + +subdir('dep') +if get_option('BUILD_GAME_SERVER') or get_option('BUILD_LOGIN_SERVER') or get_option('BUILD_EXTRACTORS') + subdir('src') +endif + +if get_option('BUILD_EXTRACTORS') + extractor_script_file = files('contrib/extractor_scripts/ExtractResources.sh') + movemapgen_script_file = files('contrib/extractor_scripts/MoveMapGen.sh') + config_json_file = files('contrib/extractor_scripts/config.json') + offmesh_file = files('contrib/extractor_scripts/offmesh.txt') + subdir('contrib/extractor') + subdir('contrib/vmap_extractor') + subdir('contrib/vmap_assembler') + subdir('contrib/mmap') +endif + diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 00000000000..24a7d118053 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,17 @@ +option('DEBUG', type : 'boolean', value: false, description: 'Include additional debug-code in core') +option('WARNINGS', type : 'boolean', value: false, description: 'Show all warnings during compile') +option('POSTGRESQL', type : 'boolean', value: false, description: 'Use PostgreSQL') +option('SQLITE', type : 'boolean', value: false, description: 'Use SQLite') +option('PCH', type : 'boolean', value: true, description: 'Use precompiled headers') +option('BUILD_GAME_SERVER', type : 'boolean', value: true, description: 'Build game server') +option('BUILD_LOGIN_SERVER', type : 'boolean', value: true, description: 'Build login server') +option('BUILD_EXTRACTORS', type : 'boolean', value: false, description: 'Build map/dbc/vmap/mmap extractors') +option('BUILD_SCRIPTDEV', type : 'boolean', value: true, description: 'Build ScriptDev. (Off speeds up build)') +option('BUILD_PLAYERBOT', type : 'boolean', value: false, description: 'Build Playerbot mod') +option('BUILD_AHBOT', type : 'boolean', value: false, description: 'Build Acution House Bot mod') +option('BUILD_METRICS', type : 'boolean', value: false, description: 'Build Metrics, generate data for Grafana') +option('BUILD_RECASTDEMOMOD', type : 'boolean', value: false, description: 'Build map/vmap/mmap viewer') +option('BUILD_GIT_ID', type : 'boolean', value: false, description: 'Build git_id') +option('BUILD_DOCS', type : 'boolean', value: false, description: 'Build documentation with doxygen') +option('USE_ANTICHEAT', type : 'boolean', value: true, description: 'Use anticheat system') +option('LIBMYSQL_PATH', type : 'string', value: '', description: 'Path to the MySQL Library') diff --git a/sql/scriptdev2/spell.sql b/sql/scriptdev2/spell.sql index 7edb46c5489..fd18536b0d5 100644 --- a/sql/scriptdev2/spell.sql +++ b/sql/scriptdev2/spell.sql @@ -947,7 +947,13 @@ INSERT INTO spell_scripts(Id, ScriptName) VALUES (61475,'spell_gundrak_snake_wrap'), (61546,'spell_shatter'), (61830,'spell_drink'), +(61883,'spell_lightning_tendrils_visual'), +(61887,'spell_lightning_tendrils'), +(61888,'spell_overwhelming_power'), +(61900,'spell_electrical_charge_council'), +(61915,'spell_lightning_whirl_trigger'), (61916,'spell_lightning_whirl'), +(61920,'spell_supercharge_iron_council'), (62108,'spell_tails_up_summon_female_frost_leopard'), (62116,'spell_tails_up_summon_female_icepaw_bear'), (62138,'spell_teleport_inside_violet_hold'), @@ -979,6 +985,17 @@ INSERT INTO spell_scripts(Id, ScriptName) VALUES (64568,'spell_blood_reserve_enchant'), (65121,'spell_searing_light'), (65667,'spell_ignis_heat'), +(62269,'spell_rune_of_death_iron_council'), +(62273,'spell_rune_of_summoning_iron_council'), +(62535,'spell_berserk_iron_council'), +(63482,'spell_lightning_whirl_heroic'), +(63483,'spell_lightning_whirl_trigger'), +(63486,'spell_lightning_tendrils'), +(63513,'spell_rune_of_power_council'), +(63490,'spell_rune_of_death_iron_council'), +(64568,'spell_blood_reserve_enchant'), +(64637,'spell_overwhelming_power'), +(64641,'spell_static_disruption'), (65869,'spell_disengage'), (65932,'spell_retaliation_dummy_creature'), (66118,'spell_leeching_swarm_aura'), diff --git a/src/framework/meson.build b/src/framework/meson.build new file mode 100644 index 00000000000..477e80daee0 --- /dev/null +++ b/src/framework/meson.build @@ -0,0 +1,13 @@ +framework_sources = [ + 'Policies/ObjectLifeTime.cpp', + 'Utilities/EventProcessor.cpp' +] + +if get_option('BUILD_GAME_SERVER') or get_option('BUILD_LOGIN_SERVER') or get_option('BUILD_EXTRACTORS') +frameworklib = static_library('framework', + framework_sources, + include_directories: global_includes, + dependencies: [boost_dep, dblib_dep, zlib_dep, openssl_dep, utfcpp_dep], + install : false +) +endif \ No newline at end of file diff --git a/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/assembly_of_iron.cpp b/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/assembly_of_iron.cpp index 9da47e6a910..a4e882c7a10 100644 --- a/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/assembly_of_iron.cpp +++ b/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/assembly_of_iron.cpp @@ -23,34 +23,35 @@ EndScriptData */ #include "AI/ScriptDevAI/include/sc_common.h" #include "ulduar.h" +#include "AI/ScriptDevAI/base/BossAI.h" enum { - SAY_BRUNDIR_AGGRO = -1603056, - SAY_BRUNDIR_WHIRL = -1603057, - SAY_BRUNDIR_DEATH_1 = -1603058, - SAY_BRUNDIR_DEATH_2 = -1603059, - SAY_BRUNDIR_SLAY_1 = -1603060, - SAY_BRUNDIR_SLAY_2 = -1603061, - SAY_BRUNDIR_BERSERK = -1603062, - SAY_BRUNDIR_FLY = -1603063, - - SAY_MOLGEIM_AGGRO = -1603064, - SAY_MOLGEIM_DEATH_1 = -1603065, - SAY_MOLGEIM_DEATH_2 = -1603066, - SAY_MOLGEIM_DEATH_RUNE = -1603067, - SAY_MOLGEIM_SURGE = -1603068, - SAY_MOLGEIM_SLAY_1 = -1603069, - SAY_MOLGEIM_SLAY_2 = -1603070, - SAY_MOLGEIM_BERSERK = -1603071, - - SAY_STEEL_AGGRO = -1603072, - SAY_STEEL_DEATH_1 = -1603073, - SAY_STEEL_DEATH_2 = -1603074, - SAY_STEEL_SLAY_1 = -1603075, - SAY_STEEL_SLAY_2 = -1603076, - SAY_STEEL_OVERWHELM = -1603077, - SAY_STEEL_BERSERK = -1603078, + SAY_BRUNDIR_AGGRO = 34314, + SAY_BRUNDIR_WHIRL = 33962, + SAY_BRUNDIR_DEATH_1 = 34318, + SAY_BRUNDIR_DEATH_2 = 34319, + SAY_BRUNDIR_SLAY_1 = 34315, + SAY_BRUNDIR_SLAY_2 = 34316, + SAY_BRUNDIR_BERSERK = 34320, + SAY_BRUNDIR_FLY = 34317, + + SAY_MOLGEIM_AGGRO = 34328, + SAY_MOLGEIM_DEATH_1 = 34333, + SAY_MOLGEIM_DEATH_2 = 34334, + SAY_MOLGEIM_DEATH_RUNE = 34331, + SAY_MOLGEIM_SURGE = 34332, + SAY_MOLGEIM_SLAY_1 = 34329, + SAY_MOLGEIM_SLAY_2 = 34330, + SAY_MOLGEIM_BERSERK = 34320, + + SAY_STEEL_AGGRO = 34321, + SAY_STEEL_DEATH_1 = 34325, + SAY_STEEL_DEATH_2 = 34326, + SAY_STEEL_SLAY_1 = 34322, + SAY_STEEL_SLAY_2 = 34323, + SAY_STEEL_OVERWHELM = 34324, + SAY_STEEL_BERSERK = 34320, // Common spells SPELL_BERSERK = 62535, // triggers 47008 after 15 min @@ -110,667 +111,557 @@ enum POINT_ID_LIFT_OFF = 1, POINT_ID_LAND = 2, + POINT_ID_PRECHANNEL = 3, }; -struct boss_brundirAI : public ScriptedAI +enum BrundirActions { - boss_brundirAI(Creature* pCreature) : ScriptedAI(pCreature) + BRUNDIR_PREFIGHT_CHANNEL, + BRUNDIR_CLOSE_DOOR, + BRUNDIR_ACTIONS_MAX, +}; + +struct boss_brundirAI : public BossAI +{ + boss_brundirAI(Creature* creature) : BossAI(creature, BRUNDIR_ACTIONS_MAX), + m_instance(dynamic_cast(creature->GetInstanceData())), + m_isRegularMode(creature->GetMap()->IsRegularDifficulty()) { - m_pInstance = (instance_ulduar*)pCreature->GetInstanceData(); - m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - Reset(); + AddOnKillText(SAY_BRUNDIR_SLAY_1, SAY_BRUNDIR_SLAY_2); + AddOnDeathText(SAY_BRUNDIR_DEATH_1, SAY_BRUNDIR_DEATH_2); + AddCastOnDeath({ObjectGuid(), SPELL_SUPERCHARGE, TRIGGERED_OLD_TRIGGERED}); + AddCombatAction(BRUNDIR_CLOSE_DOOR, 3s); + AddCustomAction(BRUNDIR_PREFIGHT_CHANNEL, 5s, [&]() + { + if (m_creature->IsInCombat()) + return; + float o = urand(0, 5) * M_PI_F / 3.0f; + Creature* steel = m_instance->GetSingleCreatureFromStorage(NPC_STEELBREAKER); + if (!steel) + return; + m_creature->InterruptNonMeleeSpells(true); + Position dest; + steel->GetFirstCollisionPosition(dest, 10.f, o); + m_creature->GetMotionMaster()->MovePoint(POINT_ID_PRECHANNEL, dest, FORCED_MOVEMENT_RUN); + }, TIMER_COMBAT_OOC); + m_creature->SetNoLoot(true); + m_creature->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 13.f); // Should be 10.f but that results him rising only 10 units, when he should rise by 13 (probably some collision height calculations) } - instance_ulduar* m_pInstance; - bool m_bIsRegularMode; - - uint8 m_uiPhase; - uint32 m_uiVisualTimer; - uint32 m_uiChainLightningTimer; - uint32 m_uiOverloadTimer; - uint32 m_uiWhirlTimer; - uint32 m_uiTendrilsTimer; - uint32 m_uiTendrilsTargetTimer; - uint32 m_uiTendrilsEndTimer; - uint32 m_uiTendrilsFollowTimer; + instance_ulduar* m_instance; + bool m_isRegularMode; ObjectGuid m_followTargetGuid; void Reset() override { - m_uiPhase = PHASE_NO_CHARGE; - m_uiVisualTimer = 5000; - m_uiChainLightningTimer = 0; - m_uiOverloadTimer = 35000; - m_uiWhirlTimer = 10000; - m_uiTendrilsTimer = 60000; - m_uiTendrilsEndTimer = 0; - m_uiTendrilsTargetTimer = 0; - m_uiTendrilsFollowTimer = 500; - - m_creature->SetLevitate(false); - } - - void JustDied(Unit* /*pKiller*/) override - { - if (!m_pInstance) - return; - - // If we are not on the last phase then cast Supercharge and set as unlootable - if (m_uiPhase != PHASE_CHARGE_TWO) - { - m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - DoCastSpellIfCan(m_creature, SPELL_SUPERCHARGE, CAST_TRIGGERED); - m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_BRUNDIR, false); - } - else - { - m_pInstance->SetData(TYPE_ASSEMBLY, DONE); - m_creature->CastSpell(m_creature, SPELL_COUNCIL_KILL_CREDIT, TRIGGERED_OLD_TRIGGERED); - } - - DoScriptText(urand(0, 1) ? SAY_BRUNDIR_DEATH_1 : SAY_BRUNDIR_DEATH_2, m_creature); + BossAI::Reset(); + m_creature->SetHover(false); + m_creature->SetStunned(false); } - void Aggro(Unit* /*pWho*/) override + void Aggro(Unit* /*who*/) override { - DoScriptText(SAY_BRUNDIR_AGGRO, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); + BossAI::Aggro(); + if (m_instance) + m_instance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); m_creature->InterruptNonMeleeSpells(false); DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_TRIGGERED); } - void KilledUnit(Unit* /*pVictim*/) override + void JustReachedHome() override { - DoScriptText(urand(0, 1) ? SAY_BRUNDIR_SLAY_1 : SAY_BRUNDIR_SLAY_2, m_creature); + ResetTimer(BRUNDIR_PREFIGHT_CHANNEL, 5s); + if (m_instance) + m_instance->SetData(TYPE_ASSEMBLY, FAIL); } - void JustReachedHome() override + void JustDied(Unit* who) override { - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, FAIL); + BossAI::JustDied(who); + if (m_creature->GetHoverOffset() > 0) + m_creature->GetMotionMaster()->MoveFall(); } - void JustSummoned(Creature* pSummoned) override + void MovementInform(uint32 movementType, uint32 data) override { - if (pSummoned->GetEntry() == NPC_OVERLOAD_VISUAL) - { - pSummoned->CastSpell(pSummoned, SPELL_OVERLOAD_AURA, TRIGGERED_OLD_TRIGGERED); - // Visual npc- shouldn't move and should despawn in 6 sec - pSummoned->GetMotionMaster()->MoveIdle(); - pSummoned->ForcedDespawn(6000); - } + if (movementType != POINT_MOTION_TYPE || data != POINT_ID_PRECHANNEL) + return; + m_creature->CastSpell(nullptr, SPELL_LIGHTNING_CHANNEL_PREFIGHT, TRIGGERED_OLD_TRIGGERED); + if (!m_creature->IsInCombat()) + ResetTimer(BRUNDIR_PREFIGHT_CHANNEL, 10s); } - void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell) override + void JustSummoned(Creature* summoned) override { - // Increase the phase when hit with the supercharge spell by his brothers - if (pSpell->Id == SPELL_SUPERCHARGE) - { - // Not sure if there is a spell for this, so we are doing it here - m_creature->SetHealth(m_creature->GetMaxHealth()); - ++m_uiPhase; - } - - if (m_uiPhase == PHASE_CHARGE_TWO) + if (summoned->AI()) + summoned->AI()->SetAIImmobilizedState(true); + m_creature->AddSummonForOnDeathDespawn(summoned->GetObjectGuid()); + summoned->SetInCombatWithZone(false); + if (summoned->GetEntry() == NPC_OVERLOAD_VISUAL) { - // Cast stormshield in the last phase - DoCastSpellIfCan(m_creature, SPELL_STORMSHIELD, CAST_TRIGGERED); - - // set the instace data to special in order to mark the last phase - this is used to check the achiev criteria - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, SPECIAL); + if (summoned->AI()) + summoned->AI()->SetReactState(REACT_PASSIVE); + summoned->CastSpell(summoned, SPELL_OVERLOAD_AURA, TRIGGERED_OLD_TRIGGERED); + // Visual npc- shouldn't move and should despawn in 6 sec + summoned->GetMotionMaster()->MoveIdle(); + summoned->ForcedDespawn(6000); } } - void SpellHitTarget(Unit* pTarget, const SpellEntry* pSpell) override + void SpellHitTarget(Unit* target, const SpellEntry* spell) override { - if (pTarget->GetTypeId() != TYPEID_PLAYER) + if (target->GetTypeId() != TYPEID_PLAYER) return; - if (!m_pInstance) + if (!m_instance) return; // Check achiev criterias - switch (pSpell->Id) + switch (spell->Id) { case SPELL_CHAIN_LIGHTNING: case SPELL_CHAIN_LIGHTNING_H: case SPELL_LIGHTNING_WHIRL_DAMAGE: case SPELL_LIGHTNING_WHIRL_DAMAGE_H: - m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_STUNNED, false); + m_instance->SetSpecialAchievementCriteria(TYPE_ACHIEV_STUNNED, false); break; } } - void MovementInform(uint32 uiMoveType, uint32 uiPointId) override + void ExecuteAction(uint32 action) override { - if (uiMoveType != POINT_MOTION_TYPE || !uiPointId) - return; - - switch (uiPointId) + if (action == BRUNDIR_CLOSE_DOOR) { - // After lift up follow a target and set the target change timer - case POINT_ID_LIFT_OFF: - // TODO: the boss should follow without changing his Z position - missing core feature - // Current implementation with move point is wrong - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, uint32(0), SELECT_FLAG_PLAYER | SELECT_FLAG_NOT_IN_MELEE_RANGE)) - { - DoMoveToTarget(pTarget); - m_followTargetGuid = pTarget->GetObjectGuid(); - } - m_uiTendrilsTargetTimer = 5000; - m_uiTendrilsFollowTimer = 500; - break; - // After reached the land remove all the auras and resume basic combat - case POINT_ID_LAND: - m_creature->SetLevitate(false); - SetCombatMovement(true); - if (m_creature->GetVictim()) - m_creature->GetMotionMaster()->MoveChase(m_creature->GetVictim()); - - m_creature->RemoveAurasDueToSpell(SPELL_TENDRILS_VISUAL); - m_creature->RemoveAurasDueToSpell(m_bIsRegularMode ? SPELL_LIGHTNING_TENDRILS : SPELL_LIGHTNING_TENDRILS_H); - break; + if (m_creature->IsAlive() && m_creature->IsInCombat()) + if (GameObject* door = m_instance->GetSingleGameObjectFromStorage(GO_IRON_ENTRANCE_DOOR)) + door->SetGoState(GO_STATE_READY); + DisableCombatAction(action); } } +}; - // Wrapper for target movement - void DoMoveToTarget(Unit* pTarget) - { - if (pTarget) - { - m_creature->GetMotionMaster()->Clear(); - m_creature->GetMotionMaster()->MovePoint(0, pTarget->GetPositionX(), pTarget->GetPositionY(), m_creature->GetPositionZ()); - } - } +enum MolgeimActions +{ + MOLGEIM_PRE_FIGHT_VISUAL, + MOLGEIM_ACTIONS_MAX, +}; - void UpdateAI(const uint32 uiDiff) override +struct boss_molgeimAI : public BossAI +{ + boss_molgeimAI(Creature* creature) : BossAI(creature, MOLGEIM_ACTIONS_MAX), + m_instance(dynamic_cast(creature->GetInstanceData())), + m_isRegularMode(creature->GetMap()->IsRegularDifficulty()) { - // Pre fight visual spell - if (m_uiVisualTimer) + AddOnKillText(SAY_MOLGEIM_SLAY_1, SAY_MOLGEIM_SLAY_2); + AddOnDeathText(SAY_MOLGEIM_DEATH_1, SAY_MOLGEIM_DEATH_2); + AddCastOnDeath({ObjectGuid(), SPELL_SUPERCHARGE, TRIGGERED_OLD_TRIGGERED}); + AddCustomAction(MOLGEIM_PRE_FIGHT_VISUAL, 5s, [&]() { - if (m_uiVisualTimer <= uiDiff) - { - if (DoCastSpellIfCan(m_creature, SPELL_LIGHTNING_CHANNEL_PREFIGHT) == CAST_OK) - m_uiVisualTimer = 0; - } - else - m_uiVisualTimer -= uiDiff; - } - - if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim()) - return; - - switch (m_uiPhase) - { - case PHASE_CHARGE_TWO: - - if (m_uiTendrilsTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_LIGHTNING_TENDRILS : SPELL_LIGHTNING_TENDRILS_H) == CAST_OK) - { - DoCastSpellIfCan(m_creature, SPELL_TENDRILS_VISUAL, CAST_TRIGGERED); - DoScriptText(SAY_BRUNDIR_FLY, m_creature); - SetCombatMovement(false); - m_creature->SetLevitate(true); - m_creature->GetMotionMaster()->MovePoint(POINT_ID_LIFT_OFF, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ() + 15.0f); - m_uiTendrilsTimer = 90000; - m_uiTendrilsEndTimer = 25000; - } - } - else - m_uiTendrilsTimer -= uiDiff; - - if (m_uiTendrilsEndTimer) - { - if (m_uiTendrilsEndTimer <= uiDiff) - { - // Get proper Z position and land - float groundZ = m_creature->GetMap()->GetHeight(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), false); - float fZ = m_creature->GetTerrain()->GetWaterOrGroundLevel(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), groundZ); - m_creature->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_creature->GetPositionX(), m_creature->GetPositionY(), fZ); - m_uiOverloadTimer = 40000; - m_uiWhirlTimer = 15000; - m_uiChainLightningTimer = 3000; - m_uiTendrilsEndTimer = 0; - m_uiTendrilsTargetTimer = 0; - } - else - m_uiTendrilsEndTimer -= uiDiff; - - // Change follow target every 5 seconds - if (m_uiTendrilsTargetTimer) - { - if (m_uiTendrilsTargetTimer <= uiDiff) - { - // TODO: the boss should follow without changing his Z position - missing core feature - // Current implementation with move point is wrong - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, uint32(0), SELECT_FLAG_PLAYER | SELECT_FLAG_NOT_IN_MELEE_RANGE)) - { - DoMoveToTarget(pTarget); - m_followTargetGuid = pTarget->GetObjectGuid(); - } - m_uiTendrilsTargetTimer = 5000; - m_uiTendrilsFollowTimer = 500; - } - else - m_uiTendrilsTargetTimer -= uiDiff; - - // Workaround to follow the target - if (m_uiTendrilsFollowTimer < uiDiff) - { - if (Unit* pTarget = m_creature->GetMap()->GetUnit(m_followTargetGuid)) - DoMoveToTarget(pTarget); - m_uiTendrilsFollowTimer = 500; - } - else - m_uiTendrilsFollowTimer -= uiDiff; - } - - // no other spells during tendrils - return; - } + Creature* steel = m_instance->GetSingleCreatureFromStorage(NPC_STEELBREAKER); + if (!steel || m_creature->IsInCombat()) + return; + m_creature->CastSpell(steel, SPELL_RUNE_OF_POWER_PREFIGHT, TRIGGERED_OLD_TRIGGERED); + }); + m_creature->SetNoLoot(true); + } - // no break here; he uses the other spells as well - case PHASE_CHARGE_ONE: + instance_ulduar* m_instance; + bool m_isRegularMode; - if (m_uiWhirlTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_LIGHTNING_WHIRL : SPELL_LIGHTNING_WHIRL_H) == CAST_OK) - { - DoScriptText(SAY_BRUNDIR_WHIRL, m_creature); - m_uiWhirlTimer = 30000; - } - } - else - m_uiWhirlTimer -= uiDiff; - - // no break here; he uses the other spells as well - case PHASE_NO_CHARGE: + void Aggro(Unit* /*who*/) override + { + BossAI::Aggro(); + if (m_instance) + m_instance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); - if (m_uiChainLightningTimer < uiDiff) - { - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - { - if (DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_CHAIN_LIGHTNING : SPELL_CHAIN_LIGHTNING_H) == CAST_OK) - m_uiChainLightningTimer = 2000; - } - } - else - m_uiChainLightningTimer -= uiDiff; + m_creature->InterruptNonMeleeSpells(false); + DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_TRIGGERED); + } - if (m_uiOverloadTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature, SPELL_OVERLOAD) == CAST_OK) - m_uiOverloadTimer = 80000; - } - else - m_uiOverloadTimer -= uiDiff; + void JustReachedHome() override + { + ResetTimer(MOLGEIM_PRE_FIGHT_VISUAL, 5s); + if (m_instance) + m_instance->SetData(TYPE_ASSEMBLY, FAIL); + } - break; + void JustSummoned(Creature* summoned) override + { + if (summoned->AI()) + { + summoned->AI()->SetReactState(REACT_PASSIVE); + summoned->AI()->SetAIImmobilizedState(true); } + m_creature->AddSummonForOnDeathDespawn(summoned->GetObjectGuid()); + if (summoned->GetEntry() == NPC_RUNE_OF_SUMMONING) + { + summoned->CastSpell(summoned, SPELL_RUNE_OF_SUMMONING_AURA, true, nullptr, nullptr, m_creature->GetObjectGuid()); + summoned->ForcedDespawn(20000); + } + else if (summoned->GetEntry() == NPC_LIGHTNING_ELEMENTAL) + { + summoned->CastSpell(summoned, m_isRegularMode ? SPELL_LIGHTNING_ELEMENTAL_PASSIVE : SPELL_LIGHTNING_ELEMENTAL_PASSIVE_H, TRIGGERED_OLD_TRIGGERED); - DoMeleeAttackIfReady(); + if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) + { + summoned->AI()->SetReactState(REACT_AGGRESSIVE); + summoned->AI()->AttackStart(target); + } + } } }; -UnitAI* GetAI_boss_brundir(Creature* pCreature) +enum STEELBREAKER_ACTIONS { - return new boss_brundirAI(pCreature); -} + STEELBREAKER_ACTION_MAX, +}; -struct boss_molgeimAI : public ScriptedAI +struct boss_steelbreakerAI : public BossAI { - boss_molgeimAI(Creature* pCreature) : ScriptedAI(pCreature) + boss_steelbreakerAI(Creature* creature) : BossAI(creature, STEELBREAKER_ACTION_MAX), + m_instance(dynamic_cast(creature->GetInstanceData())), + m_isRegularMode(creature->GetMap()->IsRegularDifficulty()) { - m_pInstance = (instance_ulduar*)pCreature->GetInstanceData(); - m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - Reset(); + AddOnKillText(SAY_STEEL_SLAY_1, SAY_STEEL_SLAY_2); + AddOnDeathText(SAY_STEEL_DEATH_1, SAY_STEEL_DEATH_2); + AddCastOnDeath({ObjectGuid(), SPELL_SUPERCHARGE, TRIGGERED_OLD_TRIGGERED}); + m_creature->SetNoLoot(true); } - instance_ulduar* m_pInstance; - bool m_bIsRegularMode; - - uint8 m_uiPhase; - uint32 m_uiVisualTimer; - uint32 m_uiShieldTimer; - uint32 m_uiRunePowerTimer; - uint32 m_uiRuneDeathTimer; - uint32 m_uiRuneSummonTimer; + instance_ulduar* m_instance; + bool m_isRegularMode; - void Reset() override + void Aggro(Unit* /*who*/) override { - m_uiPhase = PHASE_NO_CHARGE; - m_uiVisualTimer = 5000; - m_uiShieldTimer = 25000; - m_uiRunePowerTimer = 15000; - m_uiRuneSummonTimer = 10000; - m_uiRuneDeathTimer = 30000; - } - - void JustDied(Unit* /*pKiller*/) override - { - if (!m_pInstance) - return; + BossAI::Aggro(); + if (m_instance) + m_instance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); - // If we are not on the last phase then cast Supercharge and set as unlootable - if (m_uiPhase != PHASE_CHARGE_TWO) - { - m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - DoCastSpellIfCan(m_creature, SPELL_SUPERCHARGE, CAST_TRIGGERED); - m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_MOLGEIM, false); - } - else - { - m_pInstance->SetData(TYPE_ASSEMBLY, DONE); - m_creature->CastSpell(m_creature, SPELL_COUNCIL_KILL_CREDIT, TRIGGERED_OLD_TRIGGERED); - } - - DoScriptText(urand(0, 1) ? SAY_MOLGEIM_DEATH_1 : SAY_MOLGEIM_DEATH_2, m_creature); + DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_TRIGGERED); + DoCastSpellIfCan(m_creature, m_isRegularMode ? SPELL_HIGH_VOLTAGE : SPELL_HIGH_VOLTAGE_H, CAST_TRIGGERED); } - void Aggro(Unit* /*pWho*/) override + void JustReachedHome() override { - DoScriptText(SAY_MOLGEIM_AGGRO, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); - - m_creature->InterruptNonMeleeSpells(false); - DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_TRIGGERED); + if (m_instance) + m_instance->SetData(TYPE_ASSEMBLY, FAIL); } +}; - void KilledUnit(Unit* /*pVictim*/) override +struct LightningWhirl : public SpellScript +{ + void OnInit(Spell* spell) const override { - DoScriptText(urand(0, 1) ? SAY_MOLGEIM_SLAY_1 : SAY_MOLGEIM_SLAY_2, m_creature); + spell->SetMaxAffectedTargets(urand(2, 3)); } +}; - void JustReachedHome() override +struct LightningWhirlHeroic : public SpellScript +{ + void OnInit(Spell* spell) const override { - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, FAIL); + spell->SetMaxAffectedTargets(urand(3, 6)); } +}; - void JustSummoned(Creature* pSummoned) override +struct SuperChargeIronCouncil : public SpellScript +{ + void OnInit(Spell* spell) const override { - if (pSummoned->GetEntry() == NPC_RUNE_OF_SUMMONING) - pSummoned->CastSpell(pSummoned, SPELL_RUNE_OF_SUMMONING_AURA, true, nullptr, nullptr, m_creature->GetObjectGuid()); - else if (pSummoned->GetEntry() == NPC_RUNE_OF_POWER) - pSummoned->CastSpell(pSummoned, SPELL_RUNE_OF_POWER_AURA, TRIGGERED_OLD_TRIGGERED); - else if (pSummoned->GetEntry() == NPC_LIGHTNING_ELEMENTAL) + Unit* caster = spell->GetCaster(); + if (!caster) + return; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) >= 2) { - pSummoned->CastSpell(pSummoned, m_bIsRegularMode ? SPELL_LIGHTNING_ELEMENTAL_PASSIVE : SPELL_LIGHTNING_ELEMENTAL_PASSIVE_H, TRIGGERED_OLD_TRIGGERED); - - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - pSummoned->AI()->AttackStart(pTarget); + if (instance_ulduar* instance = dynamic_cast(caster->GetInstanceData())) + { + switch (caster->GetEntry()) + { + case NPC_BRUNDIR: instance->SetSpecialAchievementCriteria(TYPE_ACHIEV_BRUNDIR, true); break; + case NPC_MOLGEIM: instance->SetSpecialAchievementCriteria(TYPE_ACHIEV_MOLGEIM, true); break; + case NPC_STEELBREAKER: instance->SetSpecialAchievementCriteria(TYPE_ACHIEV_STEELBREAKER, true); break; + } + caster->CastSpell(nullptr, SPELL_COUNCIL_KILL_CREDIT, TRIGGERED_OLD_TRIGGERED); + instance->SetData(TYPE_ASSEMBLY, DONE); + static_cast(caster)->SetNoLoot(false); + } + return; } } - void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell) override + bool OnCheckTarget(const Spell* spell, Unit* target, SpellEffectIndex eff) const override { - // Increase the phase when hit with the supercharge spell by his brothers - if (pSpell->Id == SPELL_SUPERCHARGE) + if (eff != EFFECT_INDEX_2) + return true; + if (!target || !target->IsAlive()) + return false; + if (target->GetEntry() == NPC_BRUNDIR && target->GetAuraCount(SPELL_SUPERCHARGE) == 1) + target->CastSpell(nullptr, SPELL_STORMSHIELD, TRIGGERED_OLD_TRIGGERED); + if (target->GetEntry() == NPC_STEELBREAKER && target->GetAuraCount(SPELL_SUPERCHARGE) == 1) { - // Not sure if there is a spell for this, so we are doing it here - m_creature->SetHealth(m_creature->GetMaxHealth()); - ++m_uiPhase; + target->CastSpell(nullptr, SPELL_ELECTRICAL_CHARGE, TRIGGERED_OLD_TRIGGERED); } + target->SetHealthPercent(100.f); + if (target->AI()) + target->AI()->SpellListChanged(); + return true; + } +}; - if (m_uiPhase == PHASE_CHARGE_TWO) - { - // set the instace data to special in order to mark the last phase - this is used to check the achiev criteria - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, SPECIAL); - } +struct LightningTendrils : public SpellScript, public AuraScript +{ + SpellCastResult OnCheckCast(Spell* spell, bool strict) const override + { + Unit* caster = spell->GetCaster(); + if (!caster) + return SPELL_FAILED_CASTER_DEAD; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) < 2) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; } - void UpdateAI(const uint32 uiDiff) override + void OnApply(Aura* aura, bool apply) const override { - // Pre fight visual spell - if (m_uiVisualTimer) + if (aura->GetEffIndex() != EFFECT_INDEX_0) + return; + Unit* caster = aura->GetCaster(); + if (!caster) + return; + if (apply) { - if (m_uiVisualTimer <= uiDiff) + caster->CastSpell(nullptr, SPELL_TENDRILS_VISUAL, TRIGGERED_OLD_TRIGGERED); + DoBroadcastText(SAY_BRUNDIR_FLY, caster); + caster->SetHover(true); + caster->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); + if (caster->AI()) { - if (DoCastSpellIfCan(m_creature, SPELL_RUNE_OF_POWER_PREFIGHT) == CAST_OK) - m_uiVisualTimer = 0; + caster->AI()->SetReactState(REACT_PASSIVE); + caster->AI()->SetCombatScriptStatus(true); + caster->AttackStop(); + caster->SetTarget(nullptr); + caster->GetMotionMaster()->Clear(); + caster->GetMotionMaster()->MovePoint(POINT_ID_LIFT_OFF, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ() + caster->GetHoverOffset()); } - else - m_uiVisualTimer -= uiDiff; } + else + { + caster->RemoveAurasDueToSpell(SPELL_TENDRILS_VISUAL); + caster->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); + if (caster->AI()) + { + caster->AI()->SetReactState(REACT_AGGRESSIVE); + caster->AI()->SetCombatMovement(true); + caster->AI()->SetCombatScriptStatus(false); + } + if (caster->GetVictim()) + caster->GetMotionMaster()->MoveChase(caster->GetVictim());//caster->SetStunned(false); + } + } - if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim()) + void OnPeriodicTrigger(Aura* aura, PeriodicTriggerData& data) const override + { + if (aura->GetEffIndex() != EFFECT_INDEX_0) return; - - switch (m_uiPhase) + Unit* caster = aura->GetCaster(); + if (!caster) + return; + if (aura->GetAuraTicks() <= 29) { - case PHASE_CHARGE_TWO: - - if (m_uiRuneSummonTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature, SPELL_RUNE_OF_SUMMONING) == CAST_OK) - { - DoScriptText(SAY_MOLGEIM_SURGE, m_creature); - m_uiRuneSummonTimer = 30000; - } - } - else - m_uiRuneSummonTimer -= uiDiff; - - // no break here; he uses the other spells as well - case PHASE_CHARGE_ONE: - - if (m_uiRuneDeathTimer < uiDiff) - { - if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) - { - if (DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_RUNE_OF_DEATH : SPELL_RUNE_OF_DEATH_H) == CAST_OK) - { - DoScriptText(SAY_MOLGEIM_DEATH_RUNE, m_creature); - m_uiRuneDeathTimer = 30000; - } - } - } - else - m_uiRuneDeathTimer -= uiDiff; - - // no break here; he uses the other spells as well - case PHASE_NO_CHARGE: - - if (m_uiShieldTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_SHIELD : SPELL_SHIELD_H) == CAST_OK) - m_uiShieldTimer = 40000; - } - else - m_uiShieldTimer -= uiDiff; - - if (m_uiRunePowerTimer < uiDiff) + if (!(aura->GetAuraTicks() % 5)) + { + if (Unit* target = caster->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, uint32(0), SELECT_FLAG_PLAYER | SELECT_FLAG_NOT_IN_MELEE_RANGE)) { - if (DoCastSpellIfCan(m_creature, SPELL_RUNE_OF_POWER) == CAST_OK) - m_uiRunePowerTimer = 45000; + caster->GetMotionMaster()->Clear(); + caster->GetMotionMaster()->MoveChase(target); } - else - m_uiRunePowerTimer -= uiDiff; - - break; + } + if (aura->GetAuraTicks() == 25) + { + float gZ = caster->GetMap()->GetHeight(caster->GetPhaseMask(), caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); + caster->GetMotionMaster()->Clear(); + caster->GetMotionMaster()->MovePointTOL(POINT_ID_LAND, caster->GetPositionX(), caster->GetPositionY(), gZ, false); + caster->SetHover(false); + } + return; } - - DoMeleeAttackIfReady(); + caster->RemoveAurasDueToSpell(aura->GetId()); } }; -UnitAI* GetAI_boss_molgeim(Creature* pCreature) -{ - return new boss_molgeimAI(pCreature); -} - -struct boss_steelbreakerAI : public ScriptedAI +struct RuneOfDeathCouncil : public SpellScript { - boss_steelbreakerAI(Creature* pCreature) : ScriptedAI(pCreature) + SpellCastResult OnCheckCast(Spell* spell, bool strict) const override { - m_pInstance = (instance_ulduar*)pCreature->GetInstanceData(); - m_bIsRegularMode = pCreature->GetMap()->IsRegularDifficulty(); - Reset(); + Unit* caster = spell->GetCaster(); + if (!caster) + return SPELL_FAILED_CASTER_DEAD; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) < 1) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; } - instance_ulduar* m_pInstance; - bool m_bIsRegularMode; - - uint8 m_uiPhase; - uint32 m_uiFusionPunchTimer; - uint32 m_uiDisruptionTimer; - uint32 m_uiPowerTimer; - - void Reset() override + void OnEffectExecute(Spell* spell, SpellEffectIndex effIdx) const override { - m_uiPhase = PHASE_NO_CHARGE; - m_uiFusionPunchTimer = 15000; - m_uiDisruptionTimer = 15000; - m_uiPowerTimer = 10000; + Unit* caster = spell->GetCaster(); + if (!caster) + return; + DoBroadcastText(SAY_MOLGEIM_DEATH_RUNE, caster); } +}; - void JustDied(Unit* /*pKiller*/) override +struct RuneOfSummoningCouncil : public SpellScript +{ + SpellCastResult OnCheckCast(Spell* spell, bool strict) const override { - if (!m_pInstance) - return; - - // If we are not on the last phase then cast Supercharge and set as unlootable - if (m_uiPhase != PHASE_CHARGE_TWO) - { - m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - DoCastSpellIfCan(m_creature, SPELL_SUPERCHARGE, CAST_TRIGGERED); - m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_STEELBREAKER, false); - } - else - { - m_pInstance->SetData(TYPE_ASSEMBLY, DONE); - m_creature->CastSpell(m_creature, SPELL_COUNCIL_KILL_CREDIT, TRIGGERED_OLD_TRIGGERED); - } - - DoScriptText(urand(0, 1) ? SAY_STEEL_DEATH_1 : SAY_STEEL_DEATH_2, m_creature); + Unit* caster = spell->GetCaster(); + if (!caster) + return SPELL_FAILED_CASTER_DEAD; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) < 2) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; } - void Aggro(Unit* /*pWho*/) override + void OnEffectExecute(Spell* spell, SpellEffectIndex effIdx) const override { - DoScriptText(SAY_STEEL_AGGRO, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, IN_PROGRESS); - - DoCastSpellIfCan(m_creature, SPELL_BERSERK, CAST_TRIGGERED); - DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_HIGH_VOLTAGE : SPELL_HIGH_VOLTAGE_H, CAST_TRIGGERED); + Unit* caster = spell->GetCaster(); + if (!caster) + return; + DoBroadcastText(SAY_MOLGEIM_SURGE, caster); } +}; - void KilledUnit(Unit* /*pVictim*/) override +struct OverwhelmingPower : public SpellScript +{ + SpellCastResult OnCheckCast(Spell* spell, bool strict) const override { - DoScriptText(urand(0, 1) ? SAY_STEEL_SLAY_1 : SAY_STEEL_SLAY_2, m_creature); + Unit* caster = spell->GetCaster(); + if (!caster) + return SPELL_FAILED_CASTER_DEAD; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) < 2) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; } - void JustReachedHome() override + void OnEffectExecute(Spell* spell, SpellEffectIndex effIdx) const override { - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, FAIL); + Unit* caster = spell->GetCaster(); + if (!caster) + return; + DoBroadcastText(SAY_STEEL_OVERWHELM, caster); } +}; - void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell) override +struct StaticDisruption : public SpellScript +{ + void OnEffectExecute(Spell* spell, SpellEffectIndex effIdx) const override { - // Increase the phase when hit with the supercharge spell by his brothers - if (pSpell->Id == SPELL_SUPERCHARGE) + if (effIdx != EFFECT_INDEX_0) + return; + Unit* caster = spell->GetCaster(); + if (!caster) + return; + auto targets = spell->GetTargetList(); + if (targets.empty()) + return; + bool isRegularDifficulty = caster->GetMap()->IsRegularDifficulty(); + UnitList unitList; + for (auto& target : targets) { - // Not sure if there is a spell for this, so we are doing it here - m_creature->SetHealth(m_creature->GetMaxHealth()); - ++m_uiPhase; + if (Unit* utarget = caster->GetMap()->GetUnit(target.targetGUID)) + unitList.push_back(utarget); } - - if (m_uiPhase == PHASE_CHARGE_TWO) + unitList.sort(TargetDistanceOrderFarAway(caster)); + unitList.resize(std::min(uint32(unitList.size()), uint32(isRegularDifficulty ? 2 : 3))); + std::vector targetVector(unitList.begin(), unitList.end()); + std::shuffle(targetVector.begin(), targetVector.end(), *GetRandomGenerator()); + if (Unit* target = targetVector.front()) { - // Cast electrical charge aura on all players - this will proc when player dies - DoCastSpellIfCan(m_creature, SPELL_ELECTRICAL_CHARGE, CAST_TRIGGERED); - - // set the instace data to special in order to mark the last phase - this is used to check the achiev criteria - if (m_pInstance) - m_pInstance->SetData(TYPE_ASSEMBLY, SPECIAL); + caster->CastSpell(target, isRegularDifficulty ? SPELL_STATIC_DISRUPTION : SPELL_STATIC_DISRUPTION_H, TRIGGERED_IGNORE_CURRENT_CASTED_SPELL | TRIGGERED_IGNORE_GCD | TRIGGERED_HIDE_CAST_IN_COMBAT_LOG | TRIGGERED_IGNORE_CASTER_AURA_STATE); } } - void UpdateAI(const uint32 uiDiff) override + SpellCastResult OnCheckCast(Spell* spell, bool strict) const override { - if (!m_creature->SelectHostileTarget() || !m_creature->GetVictim()) - return; + Unit* caster = spell->GetCaster(); + if (!caster) + return SPELL_FAILED_CASTER_DEAD; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) < 1) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; + } +}; - switch (m_uiPhase) +struct BerserkCouncil : public AuraScript +{ + void OnPeriodicTrigger(Aura* aura, PeriodicTriggerData& data) const override + { + if (aura->GetEffIndex() != EFFECT_INDEX_0) + return; + Unit* caster = aura->GetCaster(); + if (!caster) + return; + switch (caster->GetEntry()) { - case PHASE_CHARGE_TWO: - - if (m_uiPowerTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature->GetVictim(), m_bIsRegularMode ? SPELL_OVERWHELMING_POWER : SPELL_OVERWHELMING_POWER_H) == CAST_OK) - { - DoScriptText(SAY_STEEL_OVERWHELM, m_creature); - m_uiPowerTimer = m_bIsRegularMode ? 60000 : 35000; - } - } - else - m_uiPowerTimer -= uiDiff; - - // no break here; he uses the other spells as well - case PHASE_CHARGE_ONE: - - if (m_uiDisruptionTimer < uiDiff) - { - // NOTE: This spell is not cast right: Normally it should be triggered by 64641 in core - // Because of the poor target selection in core we'll implement it here with select flag targeting - Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1, uint32(0), SELECT_FLAG_NOT_IN_MELEE_RANGE); - - if (!pTarget) - pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); - - if (DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_STATIC_DISRUPTION : SPELL_STATIC_DISRUPTION_H) == CAST_OK) - m_uiDisruptionTimer = urand(10000, 15000); - } - else - m_uiDisruptionTimer -= uiDiff; - - // no break here; he uses the other spells as well - case PHASE_NO_CHARGE: - - if (m_uiFusionPunchTimer < uiDiff) - { - if (DoCastSpellIfCan(m_creature->GetVictim(), m_bIsRegularMode ? SPELL_FUSION_PUNCH : SPELL_FUSION_PUNCH_H) == CAST_OK) - m_uiFusionPunchTimer = 15000; - } - else - m_uiFusionPunchTimer -= uiDiff; - - break; + case NPC_BRUNDIR: DoBroadcastText(SAY_BRUNDIR_BERSERK, caster); break; + case NPC_MOLGEIM: DoBroadcastText(SAY_MOLGEIM_BERSERK, caster); break; + case NPC_STEELBREAKER: DoBroadcastText(SAY_STEEL_BERSERK, caster); break; } - - DoMeleeAttackIfReady(); } }; -UnitAI* GetAI_boss_steelbreaker(Creature* pCreature) +struct LightningWhirlTrigger : public SpellScript { - return new boss_steelbreakerAI(pCreature); -} + SpellCastResult OnCheckCast(Spell* spell, bool strict) const override + { + Unit* caster = spell->GetCaster(); + if (!caster) + return SPELL_FAILED_CASTER_DEAD; + if (caster->GetAuraCount(SPELL_SUPERCHARGE) < 1) + return SPELL_FAILED_CASTER_AURASTATE; + return SPELL_CAST_OK; + } -struct LightningWhirl : public SpellScript + void OnEffectExecute(Spell* spell, SpellEffectIndex effIdx) + { + Unit* caster = spell->GetCaster(); + if (!caster || effIdx != EFFECT_INDEX_0) + return; + DoBroadcastText(SAY_BRUNDIR_WHIRL, caster); + } +}; + +struct RuneOfPowerCouncil : public SpellScript { - void OnInit(Spell* spell) const override + void OnSummon(Spell* /*spell*/, Creature* summon) const override { - spell->SetMaxAffectedTargets(urand(2, 3)); + if (summon->AI()) + { + summon->AI()->SetReactState(REACT_PASSIVE); + summon->AI()->SetAIImmobilizedState(true); + } + summon->SetInCombatWithZone(false); + summon->CastSpell(summon, SPELL_RUNE_OF_POWER_AURA, TRIGGERED_OLD_TRIGGERED); + summon->ForcedDespawn(60000); } }; -struct LightningWhirlHeroic : public SpellScript +struct ElectricalChargeCouncil : public AuraScript { - void OnInit(Spell* spell) const override + void OnApply(Aura* aura, bool apply) const override { - spell->SetMaxAffectedTargets(urand(3, 6)); + if (apply) + return; + if (aura->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + return; + Unit* target = aura->GetTarget(); + if (!target) + return; + Unit* caster = aura->GetCaster(); + if (!caster) + return; + target->CastSpell(aura->GetCaster(), aura->GetBasePoints(), TRIGGERED_OLD_TRIGGERED); } }; @@ -778,19 +669,29 @@ void AddSC_boss_assembly_of_iron() { Script* pNewScript = new Script; pNewScript->Name = "boss_brundir"; - pNewScript->GetAI = GetAI_boss_brundir; + pNewScript->GetAI = &GetNewAIInstance; pNewScript->RegisterSelf(); pNewScript = new Script; pNewScript->Name = "boss_molgeim"; - pNewScript->GetAI = GetAI_boss_molgeim; + pNewScript->GetAI = &GetNewAIInstance; pNewScript->RegisterSelf(); pNewScript = new Script; pNewScript->Name = "boss_steelbreaker"; - pNewScript->GetAI = GetAI_boss_steelbreaker; + pNewScript->GetAI = &GetNewAIInstance; pNewScript->RegisterSelf(); RegisterSpellScript("spell_lightning_whirl"); RegisterSpellScript("spell_lightning_whirl_heroic"); + RegisterSpellScript("spell_supercharge_iron_council"); + RegisterSpellScript("spell_berserk_iron_council"); + RegisterSpellScript("spell_static_disruption"); + RegisterSpellScript("spell_overwhelming_power"); + RegisterSpellScript("spell_rune_of_summoning_iron_council"); + RegisterSpellScript("spell_rune_of_death_iron_council"); + RegisterSpellScript("spell_lightning_tendrils"); + RegisterSpellScript("spell_lightning_whirl_trigger"); + RegisterSpellScript("spell_rune_of_power_council"); + RegisterSpellScript("spell_electrical_charge_council"); } diff --git a/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/ulduar.cpp b/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/ulduar.cpp index 9d609047461..d656abcd408 100644 --- a/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/ulduar.cpp +++ b/src/game/AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/ulduar.cpp @@ -365,8 +365,10 @@ void instance_ulduar::OnObjectCreate(GameObject* pGo) case GO_IRON_ENTRANCE_DOOR: break; case GO_ARCHIVUM_DOOR: - if (m_auiEncounter[TYPE_ASSEMBLY]) + if (m_auiEncounter[TYPE_ASSEMBLY] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); + else + pGo->SetGoState(GO_STATE_READY); break; // Celestial Planetarium case GO_CELESTIAL_ACCES: @@ -629,7 +631,10 @@ void instance_ulduar::SetData(uint32 uiType, uint32 uiData) DoUseDoorOrButton(GO_IRON_ENTRANCE_DOOR); if (uiData == DONE) { - DoUseDoorOrButton(GO_ARCHIVUM_DOOR); + if (GameObject* door = GetSingleGameObjectFromStorage(GO_ARCHIVUM_DOOR)) + door->SetGoState(GO_STATE_ACTIVE); + if (GameObject* door = GetSingleGameObjectFromStorage(GO_IRON_ENTRANCE_DOOR)) + door->SetGoState(GO_STATE_ACTIVE); if (Player* pPlayer = GetPlayerInMap()) { @@ -639,11 +644,21 @@ void instance_ulduar::SetData(uint32 uiType, uint32 uiData) } else if (uiData == IN_PROGRESS) { - SetSpecialAchievementCriteria(TYPE_ACHIEV_BRUNDIR, true); - SetSpecialAchievementCriteria(TYPE_ACHIEV_MOLGEIM, true); - SetSpecialAchievementCriteria(TYPE_ACHIEV_STEELBREAKER, true); + switch (urand(0,2)) + { + case 0: if(Unit* brundir = GetSingleCreatureFromStorage(NPC_BRUNDIR)) DoBroadcastText(34314, brundir); break; + case 1: if(Unit* molgeim = GetSingleCreatureFromStorage(NPC_MOLGEIM)) DoBroadcastText(34328, molgeim); break; + case 2: if(Unit* steel = GetSingleCreatureFromStorage(NPC_STEELBREAKER)) DoBroadcastText(34321, steel); break; + } + + SetSpecialAchievementCriteria(TYPE_ACHIEV_BRUNDIR, false); + SetSpecialAchievementCriteria(TYPE_ACHIEV_MOLGEIM, false); + SetSpecialAchievementCriteria(TYPE_ACHIEV_STEELBREAKER, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_STUNNED, true); } + else if (uiData == FAIL) + if (GameObject* door = GetSingleGameObjectFromStorage(GO_IRON_ENTRANCE_DOOR)) + door->SetGoState(GO_STATE_ACTIVE); break; case TYPE_KOLOGARN: m_auiEncounter[uiType] = uiData; @@ -1395,15 +1410,15 @@ bool instance_ulduar::CheckAchievementCriteriaMeet(uint32 uiCriteriaId, Player c return m_abAchievCriteria[TYPE_ACHIEV_NINE_LIVES]; case ACHIEV_CRIT_BRUNDIR_N: case ACHIEV_CRIT_BRUNDIR_H: - if (GetData(TYPE_ASSEMBLY) == SPECIAL) + //if (GetData(TYPE_ASSEMBLY) == SPECIAL) return m_abAchievCriteria[TYPE_ACHIEV_BRUNDIR]; case ACHIEV_CRIT_MOLGEIM_N: case ACHIEV_CRIT_MOLGEIM_H: - if (GetData(TYPE_ASSEMBLY) == SPECIAL) + //if (GetData(TYPE_ASSEMBLY) == SPECIAL) return m_abAchievCriteria[TYPE_ACHIEV_MOLGEIM]; case ACHIEV_CRIT_STEELBREAKER_N: case ACHIEV_CRIT_STEELBREAKER_H: - if (GetData(TYPE_ASSEMBLY) == SPECIAL) + //if (GetData(TYPE_ASSEMBLY) == SPECIAL) return m_abAchievCriteria[TYPE_ACHIEV_STEELBREAKER]; case ACHIEV_CRIT_STUNNED_BRUND_N: case ACHIEV_CRIT_STUNNED_STEEL_N: diff --git a/src/game/MotionGenerators/TargetedMovementGenerator.cpp b/src/game/MotionGenerators/TargetedMovementGenerator.cpp index 18241ee24e8..14dc2756907 100644 --- a/src/game/MotionGenerators/TargetedMovementGenerator.cpp +++ b/src/game/MotionGenerators/TargetedMovementGenerator.cpp @@ -494,6 +494,7 @@ bool ChaseMovementGenerator::DispatchSplineToPosition(Unit& owner, float x, floa this->i_path = new PathFinder(&owner); bool gen = false; + z += owner.GetHoverOffset(); if (owner.IsWithinDist3d(x, y, z, 200.f) && std::abs(owner.GetPositionZ() - z) < 5.f && owner.IsWithinLOS(x, y, z + i_target->GetCollisionHeight()) && !owner.IsInWater() && !i_target->IsInWater()) { this->i_path->calculate(x, y, z, false, true); diff --git a/src/game/Spells/Spell.cpp b/src/game/Spells/Spell.cpp index 1b5f4cf0dac..e442c01f11a 100644 --- a/src/game/Spells/Spell.cpp +++ b/src/game/Spells/Spell.cpp @@ -1953,6 +1953,8 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, bool targ // Get a random point AT the circumference float angle = 2.0f * M_PI_F * rand_norm_f(); Position pos = target->GetFirstRandomAngleCollisionPosition(radius, angle); + if (m_caster->m_movementInfo.HasMovementFlag(MOVEFLAG_HOVER)) + pos.z = m_caster->GetMap()->GetHeight(m_caster->GetPhaseMask(), pos.x, pos.y, pos.z); m_targets.setDestination(pos.x, pos.y, pos.z); break; } diff --git a/src/game/meson.build b/src/game/meson.build new file mode 100644 index 00000000000..073e0d90026 --- /dev/null +++ b/src/game/meson.build @@ -0,0 +1,805 @@ +game_sources = [ + 'Weather/Weather.cpp', + 'OutdoorPvP/OutdoorPvPEP.cpp', + 'OutdoorPvP/OutdoorPvPTF.cpp', + 'OutdoorPvP/OutdoorPvPSI.cpp', + 'OutdoorPvP/OutdoorPvPHP.cpp', + 'OutdoorPvP/OutdoorPvPGH.cpp', + 'OutdoorPvP/OutdoorPvP.cpp', + 'OutdoorPvP/OutdoorPvPZM.cpp', + 'OutdoorPvP/OutdoorPvPNA.cpp', + 'OutdoorPvP/OutdoorPvPMgr.cpp', + 'GMTickets/GMTicketMgr.cpp', + 'GMTickets/GMTicketHandler.cpp', + 'World/WorldStateVariableManager.cpp', + 'World/World.cpp', + 'World/WorldStateExpression.cpp', + 'World/WorldState.cpp', + 'Trade/TradeHandler.cpp', + 'Anticheat/module/Antispam/antispam.cpp', + 'Anticheat/module/Antispam/antispammgr.cpp', + 'Anticheat/module/config.cpp', + 'Anticheat/module/Warden/wardenmodule.cpp', + 'Anticheat/module/Warden/wardenmac.cpp', + 'Anticheat/module/Warden/wardenmodulemgr.cpp', + 'Anticheat/module/Warden/wardenscan.cpp', + 'Anticheat/module/Warden/wardenwin.cpp', + 'Anticheat/module/Warden/warden.cpp', + 'Anticheat/module/Warden/wardenscanmgr.cpp', + 'Anticheat/module/AddonHandler.cpp', + 'Anticheat/module/libanticheat.cpp', + 'Anticheat/module/anticheatchatcommandsfunctions.cpp', + 'Anticheat/module/Movement/movement.cpp', + 'BattleGround/BattleGroundMgr.cpp', + 'BattleGround/BattleGroundHandler.cpp', + 'BattleGround/BattleGroundRL.cpp', + 'BattleGround/BattleGroundIC.cpp', + 'BattleGround/BattleGround.cpp', + 'BattleGround/BattleGroundAV.cpp', + 'BattleGround/BattleGroundWS.cpp', + 'BattleGround/BattleGroundSA.cpp', + 'BattleGround/BattleGroundEY.cpp', + 'BattleGround/BattleGroundAB.cpp', + 'BattleGround/BattleGroundDS.cpp', + 'BattleGround/BattleGroundRV.cpp', + 'BattleGround/BattleGroundNA.cpp', + 'BattleGround/BattleGroundBE.cpp', + 'Entities/SkillHandler.cpp', + 'Entities/MiscHandler.cpp', + 'Entities/QueryHandler.cpp', + 'Entities/Corpse.cpp', + 'Entities/ObjectGuid.cpp', + 'Entities/StatSystem.cpp', + 'Entities/Bag.cpp', + 'Entities/CharacterHandler.cpp', + 'Entities/Pet.cpp', + 'Entities/ItemHandler.cpp', + 'Entities/Relations.cpp', + 'Entities/NPCHandler.cpp', + 'Entities/RafHandler.cpp', + 'Entities/Vehicle.cpp', + 'Entities/CreatureLinkingMgr.cpp', + 'Entities/Taxi.cpp', + 'Entities/DynamicObject.cpp', + 'Entities/Totem.cpp', + 'Entities/PetHandler.cpp', + 'Entities/Object.cpp', + 'Entities/Transports.cpp', + 'Entities/GossipDef.cpp', + 'Entities/ItemEnchantmentMgr.cpp', + 'Entities/UpdateData.cpp', + 'Entities/EntitiesMgr.cpp', + 'Entities/GameObject.cpp', + 'Entities/Camera.cpp', + 'Entities/TemporarySpawn.cpp', + 'Entities/PetitionsHandler.cpp', + 'Entities/ItemPrototype.cpp', + 'Entities/Creature.cpp', + 'Entities/CreatureSettings.cpp', + 'Entities/VehicleHandler.cpp', + 'Entities/ObjectVisibility.cpp', + 'Entities/Item.cpp', + 'Entities/Unit.cpp', + 'Entities/Player.cpp', + 'Entities/UpdateFields.cpp', + 'GameEvents/GameEventMgr.cpp', + 'GameEvents/moon.cpp', + 'AI/ScriptDevAI/base/pet_ai.cpp', + 'AI/ScriptDevAI/base/guard_ai.cpp', + 'AI/ScriptDevAI/base/CombatAI.cpp', + 'AI/ScriptDevAI/base/BossAI.cpp', + 'AI/ScriptDevAI/base/follower_ai.cpp', + 'AI/ScriptDevAI/base/TimerAI.cpp', + 'AI/ScriptDevAI/base/escort_ai.cpp', + 'AI/ScriptDevAI/include/sc_grid_searchers.cpp', + 'AI/ScriptDevAI/include/sc_instance.cpp', + 'AI/ScriptDevAI/include/sc_creature.cpp', + 'AI/ScriptDevAI/system/ScriptLoader.cpp', + 'AI/ScriptDevAI/system/system.cpp', + 'AI/ScriptDevAI/ScriptDevAIMgr.cpp', + 'AI/BaseAI/GuardAI.cpp', + 'AI/BaseAI/CreatureAI.cpp', + 'AI/BaseAI/PetAI.cpp', + 'AI/BaseAI/GuardianAI.cpp', + 'AI/BaseAI/PossessedAI.cpp', + 'AI/BaseAI/TotemAI.cpp', + 'AI/BaseAI/UnitAI.cpp', + 'AI/BaseAI/GameObjectAI.cpp', + 'AI/BaseAI/NullCreatureAI.cpp', + 'AI/EventAI/CreatureEventAI.cpp', + 'AI/EventAI/CreatureEventAIMgr.cpp', + 'AI/CreatureAISelector.cpp', + 'AI/CreatureAIRegistry.cpp', + 'AI/PlayerAI/PlayerAI.cpp', + 'AI/PlayerAI/CharmAI.cpp', + 'Calendar/Calendar.cpp', + 'Calendar/CalendarHandler.cpp', + 'Models/M2Stores.cpp', + 'Cinematics/CinematicMgr.cpp', + 'Arena/ArenaTeam.cpp', + 'Arena/ArenaTeamHandler.cpp', + 'VoiceChat/VoiceChatHandler.cpp', + 'DBScripts/ScriptMgr.cpp', + 'Maps/SpawnGroup.cpp', + 'Maps/GridMap.cpp', + 'Maps/Map.cpp', + 'Maps/SpawnManager.cpp', + 'Maps/MapDataContainer.cpp', + 'Maps/TaxiHandler.cpp', + 'Maps/InstanceData.cpp', + 'Maps/TransportMgr.cpp', + 'Maps/ObjectPosSelector.cpp', + 'Maps/TransportSystem.cpp', + 'Maps/MapManager.cpp', + 'Maps/MapPersistentStateMgr.cpp', + 'Maps/MapUpdater.cpp', + 'Quests/QuestDef.cpp', + 'Quests/QuestHandler.cpp', + 'MotionGenerators/IdleMovementGenerator.cpp', + 'MotionGenerators/PathFinder.cpp', + 'MotionGenerators/TargetedMovementGenerator.cpp', + 'MotionGenerators/HomeMovementGenerator.cpp', + 'MotionGenerators/PointMovementGenerator.cpp', + 'MotionGenerators/MovementHandler.cpp', + 'MotionGenerators/WrapperMovementGenerator.cpp', + 'MotionGenerators/MotionMaster.cpp', + 'MotionGenerators/MoveMap.cpp', + 'MotionGenerators/WaypointManager.cpp', + 'MotionGenerators/FollowerReference.cpp', + 'MotionGenerators/WaypointMovementGenerator.cpp', + 'MotionGenerators/MoveMapSharedDefines.cpp', + 'MotionGenerators/MovementGenerator.cpp', + 'MotionGenerators/RandomMovementGenerator.cpp', + 'MotionGenerators/PathMovementGenerator.cpp', + 'Tools/CharacterDatabaseCleaner.cpp', + 'Tools/PlayerDump.cpp', + 'Pools/PoolManager.cpp', + 'Guilds/Guild.cpp', + 'Guilds/GuildMgr.cpp', + 'Guilds/GuildHandler.cpp', + 'Battlefield/Battlefield.cpp', + 'Battlefield/BattlefieldWG.cpp', + 'Battlefield/BattlefieldHandler.cpp', + 'Chat/Level2.cpp', + 'Chat/Level1.cpp', + 'Chat/ChannelMgr.cpp', + 'Chat/Level0.cpp', + 'Chat/debugcmds.cpp', + 'Chat/Channel.cpp', + 'Chat/ChatHandler.cpp', + 'Chat/Level3.cpp', + 'Chat/TicketCommands.cpp', + 'Chat/NpcCommands.cpp', + 'Chat/ChannelHandler.cpp', + 'Chat/Chat.cpp', + 'Globals/Locales.cpp', + 'Globals/CombatCondition.cpp', + 'Globals/Conditions.cpp', + 'Globals/GraveyardManager.cpp', + 'Globals/ObjectAccessor.cpp', + 'Globals/ObjectMgr.cpp', + 'Globals/UnitCondition.cpp', + 'AuctionHouse/AuctionHouseHandler.cpp', + 'AuctionHouse/AuctionHouseMgr.cpp', + 'AuctionHouseBot/AuctionHouseBot.cpp', + 'Combat/CombatHandler.cpp', + 'Combat/HostileRefManager.cpp', + 'Combat/DuelHandler.cpp', + 'Combat/CombatManager.cpp', + 'Combat/ThreatManager.cpp', + 'Loot/LootMgr.cpp', + 'Loot/LootHandler.cpp', + 'Spells/Scripts/SpellScript.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Paladin.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Priest.cpp', + 'Spells/Scripts/Scripting/ClassScripts/DeathKnight.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Hunter.cpp', + 'Spells/Scripts/Scripting/ClassScripts/ScalingAuras.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Druid.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Rogue.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Warrior.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Warlock.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Shaman.cpp', + 'Spells/Scripts/Scripting/ClassScripts/Mage.cpp', + 'Spells/SpellHandler.cpp', + 'Spells/Spell.cpp', + 'Spells/SpellAuras.cpp', + 'Spells/UnitAuraProcHandler.cpp', + 'Spells/SpellMgr.cpp', + 'Spells/SpellTargets.cpp', + 'Spells/SpellDefines.cpp', + 'Spells/SpellEffects.cpp', + 'Groups/GroupHandler.cpp', + 'Groups/GroupReference.cpp', + 'Groups/Group.cpp', + 'Social/SocialMgr.cpp', + 'Skills/SkillExtraItems.cpp', + 'Skills/SkillDiscovery.cpp', + 'Vmap/VMapManager2.cpp', + 'Vmap/VMapFactory.cpp', + 'Vmap/BIH.cpp', + 'Vmap/DynamicTree.cpp', + 'Vmap/ModelInstance.cpp', + 'Vmap/WorldModel.cpp', + 'Vmap/TileAssembler.cpp', + 'Vmap/GameObjectModelVmaps.cpp', + 'Vmap/GameObjectModel.cpp', + 'Vmap/MapTree.cpp', + 'Achievements/AchievementMgr.cpp', + 'LFG/LFGQueue.cpp', + 'LFG/LFG.cpp', + 'LFG/LFGMgr.cpp', + 'LFG/LFGHandler.cpp', + 'Server/SQLStorages.cpp', + 'Server/DBCStores.cpp', + 'Server/PacketLog.cpp', + 'Server/Opcodes.cpp', + 'Server/WorldSession.cpp', + 'Server/WorldSocket.cpp', + 'Server/AuthCrypt.cpp', + 'Grids/GridNotifiers.cpp', + 'Grids/ObjectGridLoader.cpp', + 'Grids/GridStates.cpp', + 'Movement/util.cpp', + 'Movement/packet_builder.cpp', + 'Movement/spline.cpp', + 'Movement/MoveSpline.cpp', + 'Movement/MoveSplineInit.cpp', + 'Accounts/AccountMgr.cpp', + 'Reputation/ReputationMgr.cpp', + 'Mails/MassMailMgr.cpp', + 'Mails/MailHandler.cpp', + 'Mails/Mail.cpp' +] + +scriptdev_sources = [ + 'AI/ScriptDevAI/scripts/battlegrounds/battlegrounds.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/uldaman/instance_uldaman.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/uldaman/uldaman.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/uldaman/boss_archaedas.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stranglethorn_vale.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/arathi_highlands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/westfall.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_moroes.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/karazhanScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/bosses_opera.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_curator.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_maiden_of_virtue.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_midnight.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_nightbane.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/chess_event.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/karazhan.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_netherspite.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_shade_of_aran.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/karazhan/boss_terestian_illhoof.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/loch_modan.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/boss_dathrohan_balnazzar.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/boss_baroness_anastari.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/boss_maleki_the_pallid.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/stratholmeScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/boss_cannon_master_willey.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/stratholme.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stratholme/boss_order_of_silver_hand.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/isle_of_queldanas.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/undercity.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/dun_morogh.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/burning_steppes.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/silverpine_forest.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/eversong_woods.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scholomance/boss_jandice_barov.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scholomance/instance_scholomance.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scholomance/scholomance.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scholomance/boss_darkmaster_gandling.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/silvermoon_city.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/world_eastern_kingdoms.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/hinterlands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/ironforge.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateauScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/boss_eredar_twins.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/boss_kiljaeden.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/boss_brutallus.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/tirisfal_glades.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/deadmines/boss_mr_smite.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/deadmines/deadmines.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/magisters_terrace/magisters_terraceScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/magisters_terrace/boss_selin_fireheart.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/magisters_terrace/boss_vexallus.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/magisters_terrace/boss_priestess_delrissa.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/magisters_terrace/boss_felblood_kaelthas.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/swamp_of_sorrows.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_spire/instance_blackrock_spire.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_spire/boss_pyroguard_emberseer.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/boss_nalorakk.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/boss_akilzon.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/zulaman.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/boss_halazzi.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/zulamanScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/boss_malacrass.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/boss_janalai.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulaman/boss_zuljin.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunken_temple/sunken_templeScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/sunken_temple/sunken_temple.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/shadowfang_keep/boss_hummel.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/boss_kazzak.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/searing_gorge.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_ebonroc.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_flamegor.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_nefarian.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_chromaggus.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_broodlord_lashlayer.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_victor_nefarius.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_razorgore.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_firemaw.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/blackwing_lair.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_monastery/instance_scarlet_monastery.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_monastery/boss_arcanist_doan.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_monastery/boss_herod.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_monastery/boss_headless_horseman.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/western_plaguelands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/alterac_mountains.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_sulfuron_harbinger.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_magmadar.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_garr.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/molten_core.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/molten_coreScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_shazzrah.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_gehennas.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_lucifron.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_majordomo_executus.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_baron_geddon.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_golemagg.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/molten_core/boss_ragnaros.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_enclave/world_map_ebon_hold.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/scarlet_enclave/ebon_hold.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/boss_ambassador_flamelash.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/boss_high_interrogator_gerstahn.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/boss_coren_direbrew.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/instance_blackrock_depths.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/boss_general_angerforge.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/blasted_lands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/wetlands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/ghostlands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/zulgurubScripts.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_jeklik.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_mandokir.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_renataki.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/zulgurub.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_hakkar.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/stormwind_city.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/eastern_plaguelands.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/redridge_mountains.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/elwynn_forest.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/gnomeregan/boss_thermaplugg.cpp', + 'AI/ScriptDevAI/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp', + 'AI/ScriptDevAI/scripts/world/bosses_emerald_dragons.cpp', + 'AI/ScriptDevAI/scripts/world/guards.cpp', + 'AI/ScriptDevAI/scripts/world/spell_scripts_wotlk.cpp', + 'AI/ScriptDevAI/scripts/world/npc_professions.cpp', + 'AI/ScriptDevAI/scripts/world/areatrigger_scripts.cpp', + 'AI/ScriptDevAI/scripts/world/npcs_special.cpp', + 'AI/ScriptDevAI/scripts/world/lunar_festival.cpp', + 'AI/ScriptDevAI/scripts/world/hallows_end.cpp', + 'AI/ScriptDevAI/scripts/world/midsummer_festival.cpp', + 'AI/ScriptDevAI/scripts/world/brewfest.cpp', + 'AI/ScriptDevAI/scripts/world/shade_of_the_horseman.cpp', + 'AI/ScriptDevAI/scripts/world/scourge_invasion.cpp', + 'AI/ScriptDevAI/scripts/world/world_map_scripts.cpp', + 'AI/ScriptDevAI/scripts/world/suns_reach_reclamation.cpp', + 'AI/ScriptDevAI/scripts/world/mob_generic_creature.cpp', + 'AI/ScriptDevAI/scripts/world/item_scripts_wotlk.cpp', + 'AI/ScriptDevAI/scripts/world/item_scripts.cpp', + 'AI/ScriptDevAI/scripts/world/boss_highlord_kruul.cpp', + 'AI/ScriptDevAI/scripts/world/spell_scripts.cpp', + 'AI/ScriptDevAI/scripts/world/war_effort.cpp', + 'AI/ScriptDevAI/scripts/world/childrens_week_tbc.cpp', + 'AI/ScriptDevAI/scripts/world/quest_scripts.cpp', + 'AI/ScriptDevAI/scripts/world/go_scripts.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ashenvale.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/world_kalimdor.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/felwood.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/maraudon/boss_noxxion.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/maraudon/instance_maraudon.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/azshara.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/azuremyst_isle.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/darkshore.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/feralas.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/stonetalon_mountains.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/blackfathom_deeps/instance_blackfathom_deeps.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/wailing_caverns/wailing_cavernsScripts.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/wailing_caverns/wailing_caverns.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/boss_azuregos.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/silithus.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_cthun.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_huhuran.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_fankriss.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_ouro.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/boss_sartura.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/razorfen_kraul/razorfen_kraul.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/tanaris.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/culling_of_stratholme/instance_culling_of_stratholme.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/culling_of_stratholme/culling_of_stratholme.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/boss_anetheron.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/hyjal.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/boss_kazrogal.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/boss_rage_winterchill.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/hyjalScripts.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/boss_azgalor.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbradScripts.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/dark_portal/boss_aeonus.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/dark_portal/dark_portalScripts.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/caverns_of_time/dark_portal/boss_temporus.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqirajScripts.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/boss_moam.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/boss_ossirian.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/boss_rajaxx.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/boss_kurinnaxx.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ruins_of_ahnqiraj/boss_buru.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/dustwallow_marsh.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/zulfarrak/instance_zulfarrak.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/zulfarrak/zulfarrak.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/zulfarrak/boss_zumrah.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/teldrassil.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/winterspring.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/onyxias_lair/instance_onyxias_lair.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/orgrimmar.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/durotar.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/razorfen_downs/instance_razorfen_downs.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/razorfen_downs/razorfen_downs.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/desolace.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/thousand_needles.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/ungoro_crater.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/mulgore.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/the_barrens.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/moonglade.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/thunder_bluff.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/bloodmyst_isle.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/dire_maul/instance_dire_maul.cpp', + 'AI/ScriptDevAI/scripts/kalimdor/dire_maul/dire_maul.cpp', + 'AI/ScriptDevAI/scripts/outland/nagrand.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_peninsula.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_mechanar/boss_mechano_lord_capacitus.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_mechanar/mechanar.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/botanica/boss_laj.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/botanica/boss_warp_splinter.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/botanica/boss_thorngrin_the_tender.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/botanica/botanica.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/arcatraz/arcatrazScripts.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/arcatraz/boss_soccothrates.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/arcatraz/arcatraz.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/arcatraz/boss_dalliah.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_eye/boss_void_reaver.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_eye/boss_kaelthas.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_eye/boss_alar.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_eye/boss_astromancer.cpp', + 'AI/ScriptDevAI/scripts/outland/tempest_keep/the_eye/the_eye.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/blood_furnace/blood_furnace.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/blood_furnace/boss_broggok.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/shattered_halls/shattered_halls.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/shattered_halls/shattered_hallsScripts.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_nazan_and_vazruden.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.cpp', + 'AI/ScriptDevAI/scripts/outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp', + 'AI/ScriptDevAI/scripts/outland/zangarmarsh.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_mother_shahraz.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/illidari_council.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_illidan.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/black_temple.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_supremus.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_shade_of_akama.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_reliquary_of_souls.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/black_templeScripts.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_bloodboil.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_teron_gorefiend.cpp', + 'AI/ScriptDevAI/scripts/outland/black_temple/boss_warlord_najentus.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/auchenai_crypts/boss_shirrak.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/shadow_labyrinth/boss_murmur.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/shadow_labyrinth/shadow_labyrinth.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/mana_tombs/boss_yor.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/mana_tombs/mana_tombsScripts.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/mana_tombs/boss_nexusprince_shaffar.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/mana_tombs/boss_pandemonius.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/sethekk_halls/boss_anzu.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/sethekk_halls/sethekk_halls.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/sethekk_halls/boss_darkweaver_syth.cpp', + 'AI/ScriptDevAI/scripts/outland/auchindoun/sethekk_halls/boss_talon_king_ikiss.cpp', + 'AI/ScriptDevAI/scripts/outland/blades_edge_mountains.cpp', + 'AI/ScriptDevAI/scripts/outland/boss_terokk.cpp', + 'AI/ScriptDevAI/scripts/outland/boss_doomlord_kazzak.cpp', + 'AI/ScriptDevAI/scripts/outland/netherstorm.cpp', + 'AI/ScriptDevAI/scripts/outland/shattrath_city.cpp', + 'AI/ScriptDevAI/scripts/outland/boss_doomwalker.cpp', + 'AI/ScriptDevAI/scripts/outland/world_outland.cpp', + 'AI/ScriptDevAI/scripts/outland/gruuls_lair/boss_high_king_maulgar.cpp', + 'AI/ScriptDevAI/scripts/outland/gruuls_lair/boss_gruul.cpp', + 'AI/ScriptDevAI/scripts/outland/gruuls_lair/gruuls_lair.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/slave_pens/boss_ahune.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/slave_pens/slave_pens.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/boss_hydross_the_unstable.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/boss_fathomlord_karathress.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/boss_leotheras_the_blind.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/boss_lady_vashj.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/serpent_shrine.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/boss_morogrim_tidewalker.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/serpent_shrine/boss_the_lurker_below.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/underbog/boss_swamplord_muselek.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/underbog/boss_black_stalker.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/underbog/underbog.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/underbog/boss_hungarfen.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/steam_vault.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_warlord_kalithresh.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_hydromancer_thespia.cpp', + 'AI/ScriptDevAI/scripts/outland/coilfang_reservoir/steam_vault/boss_mekgineer_steamrigger.cpp', + 'AI/ScriptDevAI/scripts/outland/shadowmoon_valley.cpp', + 'AI/ScriptDevAI/scripts/outland/bashir_landing.cpp', + 'AI/ScriptDevAI/scripts/outland/shartuul_transporter.cpp', + 'AI/ScriptDevAI/scripts/outland/terokkar_forest.cpp', + 'AI/ScriptDevAI/scripts/northrend/wintergrasp.cpp', + 'AI/ScriptDevAI/scripts/northrend/world_northrend.cpp', + 'AI/ScriptDevAI/scripts/northrend/grizzly_hills.cpp', + 'AI/ScriptDevAI/scripts/northrend/dalaran.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/nexus/boss_telestra.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/nexus/boss_anomalus.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/nexus/nexus.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/nexus/boss_keristrasza.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/nexus/boss_ormorok.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/oculus/oculus.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/oculus/oculusScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/oculus/boss_varos.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/oculus/boss_urom.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/oculus/boss_eregos.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp', + 'AI/ScriptDevAI/scripts/northrend/nexus/eye_of_eternity/eye_of_eternity.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/forge_of_souls.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_bronjahm.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/forge_of_souls/boss_devourer_of_souls.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/boss_lich_king.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/halls_of_reflection.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/halls_of_reflection/halls_of_reflectionScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/pit_of_saronScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_krick_and_ick.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/boss_forgemaster_garfrost.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/frozen_halls/pit_of_saron/pit_of_saron.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_blood_queen_lanathel.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_citadel.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_sindragosa.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_festergut.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_lady_deathwhisper.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/gunship_battle.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/icecrown_citadelScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/blood_prince_council.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_deathbringer_saurfang.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_lord_marrowgar.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_valithria_dreamwalker.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_the_lich_king.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_professor_putricide.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown_citadel/icecrown_citadel/boss_rotface.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_patchwerk.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_heigan.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_anubrekhan.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_thaddius.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_noth.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/naxxramas.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/naxxramasScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_four_horsemen.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_gothik.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_sapphiron.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_gluth.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_maexxna.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_kelthuzad.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_faerlina.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_razuvious.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_loatheb.cpp', + 'AI/ScriptDevAI/scripts/northrend/naxxramas/boss_grobbulus.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_stone/halls_of_stoneScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_stone/boss_sjonnir.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_lightning/boss_bjarngrim.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_lightning/boss_ionar.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/halls_of_lightning/boss_volkhan.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_xt_002.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/assembly_of_iron.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_algalon.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_freya.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_razorscale.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_ignis.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_thorim.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_yogg_saron.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/ulduar.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/ulduarScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_hodir.cpp', + 'AI/ScriptDevAI/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusaderScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/trial_of_the_crusader.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_twin_valkyr.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_jaraxxus.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_anubarak_trial.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_faction_champions.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_crusader/boss_northrend_beasts.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_black_knight.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_champion/instance_trial_of_the_champion.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_champion/trial_of_the_champion.cpp', + 'AI/ScriptDevAI/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp', + 'AI/ScriptDevAI/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp', + 'AI/ScriptDevAI/scripts/northrend/obsidian_sanctum/obsidian_sanctum.cpp', + 'AI/ScriptDevAI/scripts/northrend/sholazar_basin.cpp', + 'AI/ScriptDevAI/scripts/northrend/dragonblight.cpp', + 'AI/ScriptDevAI/scripts/northrend/ruby_sanctum/boss_baltharus.cpp', + 'AI/ScriptDevAI/scripts/northrend/ruby_sanctum/boss_halion.cpp', + 'AI/ScriptDevAI/scripts/northrend/ruby_sanctum/boss_zarithrian.cpp', + 'AI/ScriptDevAI/scripts/northrend/ruby_sanctum/ruby_sanctumScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/ruby_sanctum/boss_saviana.cpp', + 'AI/ScriptDevAI/scripts/northrend/ruby_sanctum/ruby_sanctum.cpp', + 'AI/ScriptDevAI/scripts/northrend/howling_fjord.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_gortok.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_ymiron.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keepScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/utgarde_keep/utgarde_keep/boss_ingvar.cpp', + 'AI/ScriptDevAI/scripts/northrend/storm_peaks.cpp', + 'AI/ScriptDevAI/scripts/northrend/gundrak/boss_eck.cpp', + 'AI/ScriptDevAI/scripts/northrend/gundrak/boss_galdarah.cpp', + 'AI/ScriptDevAI/scripts/northrend/gundrak/boss_colossus.cpp', + 'AI/ScriptDevAI/scripts/northrend/gundrak/boss_moorabi.cpp', + 'AI/ScriptDevAI/scripts/northrend/gundrak/gundrak.cpp', + 'AI/ScriptDevAI/scripts/northrend/gundrak/boss_sladran.cpp', + 'AI/ScriptDevAI/scripts/northrend/icecrown.cpp', + 'AI/ScriptDevAI/scripts/northrend/draktharon_keep/boss_trollgore.cpp', + 'AI/ScriptDevAI/scripts/northrend/draktharon_keep/boss_tharonja.cpp', + 'AI/ScriptDevAI/scripts/northrend/draktharon_keep/instance_draktharon_keep.cpp', + 'AI/ScriptDevAI/scripts/northrend/draktharon_keep/boss_novos.cpp', + 'AI/ScriptDevAI/scripts/northrend/vault_of_archavon/boss_archavon.cpp', + 'AI/ScriptDevAI/scripts/northrend/vault_of_archavon/boss_toravon.cpp', + 'AI/ScriptDevAI/scripts/northrend/vault_of_archavon/boss_koralon.cpp', + 'AI/ScriptDevAI/scripts/northrend/vault_of_archavon/boss_emalon.cpp', + 'AI/ScriptDevAI/scripts/northrend/vault_of_archavon/instance_vault_of_archavon.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/azjol-nerub/boss_hadronox.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/azjol-nerub/boss_krikthir.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/azjol-nerub/azjol-nerub.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/azjol-nerub/boss_anubarak.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/ahnkahet/boss_nadox.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/ahnkahet/boss_amanitar.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/ahnkahet/ahnkahet.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/ahnkahet/boss_volazj.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/ahnkahet/boss_jedoga.cpp', + 'AI/ScriptDevAI/scripts/northrend/azjol-nerub/ahnkahet/boss_taldaram.cpp', + 'AI/ScriptDevAI/scripts/northrend/borean_tundra.cpp', + 'AI/ScriptDevAI/scripts/northrend/violet_hold/boss_ichoron.cpp', + 'AI/ScriptDevAI/scripts/northrend/violet_hold/violet_holdScripts.cpp', + 'AI/ScriptDevAI/scripts/northrend/violet_hold/boss_xevozz.cpp', + 'AI/ScriptDevAI/scripts/northrend/violet_hold/violet_hold.cpp', + 'AI/ScriptDevAI/scripts/northrend/zuldrak.cpp', + 'AI/ScriptDevAI/scripts/examples/example_escort.cpp', + 'AI/ScriptDevAI/scripts/examples/example_creature.cpp', + 'AI/ScriptDevAI/scripts/examples/example_misc.cpp', + 'AI/ScriptDevAI/scripts/examples/example_gossip_codebox.cpp', +] + +playerbot_sources = [ + 'PlayerBot/Base/PlayerbotClassAI.cpp', + 'PlayerBot/Base/PlayerbotMgr.cpp', + 'PlayerBot/Base/PlayerbotAI.cpp', + 'PlayerBot/AI/PlayerbotDruidAI.cpp', + 'PlayerBot/AI/PlayerbotWarlockAI.cpp', + 'PlayerBot/AI/PlayerbotDeathKnightAI.cpp', + 'PlayerBot/AI/PlayerbotMageAI.cpp', + 'PlayerBot/AI/PlayerbotPriestAI.cpp', + 'PlayerBot/AI/PlayerbotWarriorAI.cpp', + 'PlayerBot/AI/PlayerbotHunterAI.cpp', + 'PlayerBot/AI/PlayerbotRogueAI.cpp', + 'PlayerBot/AI/PlayerbotShamanAI.cpp', + 'PlayerBot/AI/PlayerbotPaladinAI.cpp', +] + +game_inc_dirs = ['.', 'Vmap', 'AuctionHouseBot', 'BattleGround', 'OutdoorPvP', 'PlayerBot'] + +if utfcpp_dep.found() == false + game_inc_dirs = [game_inc_dirs, '../../dep/include/utf8cpp'] +endif + +if build_machine.system() == 'windows' + game_inc_dirs = game_inc_dirs + ['../../dep/lib/include', '../../dep/lib/include/mysql'] +endif + +game_inc = include_directories(game_inc_dirs) + +if get_option('BUILD_SCRIPTDEV') + game_sources = [game_sources, scriptdev_sources] +endif + +if get_option('BUILD_PLAYERBOT') + game_sources = [game_sources, playerbot_sources] + install_data('PlayerBot/playerbot.conf.dist.in', rename: 'playerbot.conf.dist', install_dir: 'etc') +endif + +if not get_option('USE_ANTICHEAT') + game_sources = [game_sources, './Anticheat/Anticheat.cpp'] +else + install_data('Anticheat/module/anticheat.conf.dist.in', rename: 'anticheat.conf.dist', install_dir: 'etc') + install_subdir('Anticheat/module/warden_modules', install_dir : 'bin') # mydir subtree -> include/mydir +endif + +if get_option('BUILD_AHBOT') + install_data('AuctionHouseBot/ahbot.conf.dist.in', rename: 'ahbot.conf.dist', install_dir: 'etc') +endif + +if not get_option('PCH') + pch_files = [] +else + pch_files = ['../game/pchdef.h'] +endif + +game_args = ['-DDT_POLYREF64', '-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0'] + +if get_option('BUILD_GAME_SERVER') +gamelib = static_library('game', + game_sources, + include_directories: [game_inc, global_includes], + dependencies: [zlib_dep, boost_dep, dblib_dep, utfcpp_dep], + link_with: [frameworklib, sharedlib, g3dlib, detourlib], + cpp_args: game_args, + cpp_pch: pch_files, + install : false +) +endif diff --git a/src/mangosd/meson.build b/src/mangosd/meson.build new file mode 100644 index 00000000000..a7011253338 --- /dev/null +++ b/src/mangosd/meson.build @@ -0,0 +1,34 @@ +mangosd_sources = [ + 'Master.cpp', + 'MaNGOSsoap.cpp', + 'soapC.cpp', + 'WorldRunnable.cpp', + 'Main.cpp', + 'CliRunnable.cpp', + 'RASocket.cpp', + 'soapServer.cpp' +] + +mangosd_inc_dirs = [] + +if utfcpp_dep.found() == false + mangosd_inc_dirs = [mangosd_inc_dirs, '../../dep/include/utf8cpp'] +endif + +if build_machine.system() == 'windows' + mangosd_inc_dirs = [mangosd_inc_dirs, '../../dep/lib/include', '../../dep/lib/include/mysql'] +endif + +mangosd_inc = include_directories(mangosd_inc_dirs) + +if get_option('BUILD_GAME_SERVER') + executable('mangosd', + mangosd_sources, + link_with: [sharedlib, gamelib, gsoaplib], + include_directories: [mangosd_inc, global_includes], + dependencies: [boost_dep, dblib_dep, zlib_dep, openssl_dep, utfcpp_dep], + link_args: _linker_args, + install: true + ) + install_data('mangosd.conf.dist.in', rename: 'mangosd.conf.dist', install_dir: 'etc') +endif \ No newline at end of file diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 00000000000..1ca4f20955f --- /dev/null +++ b/src/meson.build @@ -0,0 +1,5 @@ +subdir('framework') +subdir('shared') +subdir('game') +subdir('mangosd') +subdir('realmd') \ No newline at end of file diff --git a/src/realmd/meson.build b/src/realmd/meson.build new file mode 100644 index 00000000000..6e776c30697 --- /dev/null +++ b/src/realmd/meson.build @@ -0,0 +1,29 @@ +realmd_sources = [ + 'AuthSocket.cpp', + 'Main.cpp', + 'RealmList.cpp' +] + +realmd_inc_dirs = [] + +if utfcpp_dep.found() == false + realmd_inc_dirs = [realmd_inc_dirs, '../../dep/include/utf8cpp'] +endif + +if build_machine.system() == 'windows' + realmd_inc_dirs = realmd_inc_dirs + ['../../dep/lib/include', '../../dep/lib/include/mysql'] +endif + +realmd_inc = include_directories(realmd_inc_dirs) + +if get_option('BUILD_LOGIN_SERVER') +executable('realmd', + realmd_sources, + link_with: [sharedlib], + include_directories: [realmd_inc, global_includes], + dependencies: [boost_dep, dblib_dep, zlib_dep, openssl_dep, utfcpp_dep], + link_args: _linker_args, + install: true +) +install_data('realmd.conf.dist.in', rename: 'realmd.conf.dist', install_dir: 'etc') +endif \ No newline at end of file diff --git a/src/shared/meson.build b/src/shared/meson.build new file mode 100644 index 00000000000..3d4b13f23ef --- /dev/null +++ b/src/shared/meson.build @@ -0,0 +1,88 @@ +shared_sources = [ + 'Metric/Measurement.cpp', + 'Metric/Metric.cpp', + 'Util/Util.cpp', + 'Multithreading/Messager.cpp', + 'Log/Log.cpp', + 'Util/ProgressBar.cpp', + 'Multithreading/Threading.cpp', + 'Util/ByteBuffer.cpp', + 'Database/SqlPreparedStatement.cpp', + 'Database/SqlDelayThread.cpp', + 'Database/Field.cpp', + 'Database/Database.cpp', + 'Database/SqlOperations.cpp', + 'Database/QueryResultPostgre.cpp', + 'Database/QueryResultSqlite.cpp', + 'Database/DBCFileLoader.cpp', + 'Database/DatabasePostgre.cpp', + 'Database/DatabaseSqlite.cpp', + 'Database/SQLStorage.cpp', + 'Database/QueryResultMysql.cpp', + 'Database/DatabaseMysql.cpp', + 'Auth/SRP6.cpp', + 'Auth/SARC4.cpp', + 'Auth/base32.cpp', + 'Auth/HMACSHA1.cpp', + 'Auth/BigNumber.cpp', + 'Common.cpp', + 'Config/Config.cpp' +] + +shared_linux = [ + 'Platform/PosixDaemon.cpp' +] + +shared_windows = [ + 'Platform/WheatyExceptionReport.cpp', + 'Platform/ServiceWin32.cpp' +] + +shared_inc_dirs = ['Database'] + +if utfcpp_dep.found() == false + shared_inc_dirs = [shared_inc_dirs, '../../dep/include/utf8cpp'] +endif + +if build_machine.system() == 'windows' + shared_sources = shared_sources + shared_windows + shared_inc_dirs = shared_inc_dirs + ['../../dep/lib/include', '../../dep/lib/include/mysql'] +else + shared_sources = shared_sources + shared_linux +endif + +shared_inc = include_directories(shared_inc_dirs) + +revision_target = vcs_tag( + command : ['git', 'rev-parse', 'HEAD'], + fallback : 'Devel', + input : 'meson_revision.h.in', + output : 'meson_revision.h.temp', + replace_string : '@REVISION_ID@' +) + +actual_rev = vcs_tag( + command: ['git', 'show', '--quiet', '--date=iso-strict', '--format="%ad"', 'HEAD'], + fallback: '"0000-00-00T00:00:00+00:00"', + input: revision_target, + output: 'revision.h', + replace_string: '@REVISION_DATE@' +) + +if not get_option('PCH') + pch_files = [] +else + pch_files = ['../shared/pchdef.h'] +endif + +if get_option('BUILD_GAME_SERVER') or get_option('BUILD_LOGIN_SERVER') or get_option('BUILD_EXTRACTORS') +sharedlib = static_library('shared', + [actual_rev, shared_sources], + include_directories: [global_includes, shared_inc], + implicit_include_directories: true, + dependencies: [zlib_dep, boost_dep, dblib_dep, openssl_dep, utfcpp_dep], + cpp_pch: pch_files, + link_with: [frameworklib], + install : false +) +endif diff --git a/src/shared/meson_revision.h.in b/src/shared/meson_revision.h.in new file mode 100644 index 00000000000..3ed189ee9d3 --- /dev/null +++ b/src/shared/meson_revision.h.in @@ -0,0 +1,6 @@ +#ifndef __REVISION_H__ +#define __REVISION_H__ + #define REVISION_ID "@REVISION_ID@" + #define REVISION_DATE @REVISION_DATE@ + #define VERSION "0.18" +#endif // __REVISION_H__ diff --git a/subprojects/openssl.wrap b/subprojects/openssl.wrap new file mode 100644 index 00000000000..873d55106e9 --- /dev/null +++ b/subprojects/openssl.wrap @@ -0,0 +1,15 @@ +[wrap-file] +directory = openssl-3.0.8 +source_url = https://www.openssl.org/source/openssl-3.0.8.tar.gz +source_filename = openssl-3.0.8.tar.gz +source_hash = 6c13d2bf38fdf31eac3ce2a347073673f5d63263398f1f69d0df4a41253e4b3e +patch_filename = openssl_3.0.8-3_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/openssl_3.0.8-3/get_patch +patch_hash = 300da189e106942347d61a4a4295aa2edbcf06184f8d13b4cee0bed9fb936963 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/openssl_3.0.8-3/openssl-3.0.8.tar.gz +wrapdb_version = 3.0.8-3 + +[provide] +libcrypto = libcrypto_dep +libssl = libssl_dep +openssl = openssl_dep diff --git a/subprojects/sqlite3.wrap b/subprojects/sqlite3.wrap new file mode 100644 index 00000000000..5d2eb5c5122 --- /dev/null +++ b/subprojects/sqlite3.wrap @@ -0,0 +1,13 @@ +[wrap-file] +directory = sqlite-amalgamation-3460000 +source_url = https://www.sqlite.org/2024/sqlite-amalgamation-3460000.zip +source_filename = sqlite-amalgamation-3460000.zip +source_hash = 712a7d09d2a22652fb06a49af516e051979a3984adb067da86760e60ed51a7f5 +patch_filename = sqlite3_3.46.0-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.46.0-1/get_patch +patch_hash = c6dda193e59e4bd11dbc6f399cae1904d231e0cb119224480bec6c94c5d0e04e +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sqlite3_3.46.0-1/sqlite-amalgamation-3460000.zip +wrapdb_version = 3.46.0-1 + +[provide] +sqlite3 = sqlite3_dep diff --git a/subprojects/utfcpp.wrap b/subprojects/utfcpp.wrap new file mode 100644 index 00000000000..1416c2c132d --- /dev/null +++ b/subprojects/utfcpp.wrap @@ -0,0 +1,13 @@ +[wrap-file] +directory = utfcpp-4.0.5 +source_url = https://github.com/nemtrif/utfcpp/archive/refs/tags/v4.0.5.tar.gz +source_filename = utfcpp-4.0.5.tar.gz +source_hash = ffc668a310e77607d393f3c18b32715f223da1eac4c4d6e0579a11df8e6b59cf +patch_filename = utfcpp_4.0.5-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/utfcpp_4.0.5-1/get_patch +patch_hash = bedf83d77b07a2fb84582722aaf748498cab0267b023ff8460dae3730a2d0819 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/utfcpp_4.0.5-1/utfcpp-4.0.5.tar.gz +wrapdb_version = 4.0.5-1 + +[provide] +utf8cpp = utfcpp_dep diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap new file mode 100644 index 00000000000..aa14de17740 --- /dev/null +++ b/subprojects/zlib.wrap @@ -0,0 +1,13 @@ +[wrap-file] +directory = zlib-1.3.1 +source_url = http://zlib.net/fossils/zlib-1.3.1.tar.gz +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/zlib_1.3.1-1/zlib-1.3.1.tar.gz +source_filename = zlib-1.3.1.tar.gz +source_hash = 9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23 +patch_filename = zlib_1.3.1-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.3.1-1/get_patch +patch_hash = e79b98eb24a75392009cec6f99ca5cdca9881ff20bfa174e8b8926d5c7a47095 +wrapdb_version = 1.3.1-1 + +[provide] +zlib = zlib_dep