diff --git a/.gitignore b/.gitignore index 2692f20cc0..9ef72e70bf 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ nbproject/* .browse.VC* .vscode cmake-build-*/ +.vs diff --git a/README.md b/README.md index b87196aca0..6f0b978cdd 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ website at [TrinityCore.org](https://www.trinitycore.org). ## Install -Detailed installation guides are available in the [wiki](https://collab.kpsn.org/display/tc/Installation+Guide) for +Detailed installation guides are available in the [wiki](https://www.trinitycore.info/display/tc/Installation+Guide) for Windows, Linux and Mac OSX. You can get database from https://github.com/TrinityCoreLegacy/TrinityCore/releases diff --git a/cmake/macros/FindPCHSupport.cmake b/cmake/macros/FindPCHSupport.cmake index b97b0f02f0..9c7a233ac5 100644 --- a/cmake/macros/FindPCHSupport.cmake +++ b/cmake/macros/FindPCHSupport.cmake @@ -128,9 +128,17 @@ FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS("${TARGET_NAME_LIST}" ${PCH_HEADER} "pch" "/I") FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET(PCH_COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}") + IF (NOT ${CMAKE_MAKE_PROGRAM} MATCHES "MSBuild") + SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /Fp${PCH_HEADER_OUT}") + SET(TARGET_SOURCES_LIST "") + GET_PROPERTY(TARGET_SOURCES_LIST TARGET ${TARGET_NAME} PROPERTY SOURCES) + LIST(REMOVE_ITEM TARGET_SOURCES_LIST ${PCH_SOURCE}) + SET_SOURCE_FILES_PROPERTIES(${TARGET_SOURCES_LIST} PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${TARGET_NAME}.dir/${PCH_SOURCE}.obj") + ENDIF() SET_TARGET_PROPERTIES( ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}" + COMPILE_FLAGS "${PCH_COMPILE_FLAGS}" ) ENDFOREACH() diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt index 8ecd506032..8b37fd406e 100644 --- a/dep/CMakeLists.txt +++ b/dep/CMakeLists.txt @@ -9,8 +9,11 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # Search twice, once for space after /W argument, once for end of line as CMake regex has no \b string(REGEX REPLACE "/W[0-4] " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "/W[0-4]$" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REGEX REPLACE "/W[0-4] " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + string(REGEX REPLACE "/W[0-4]$" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") add_definitions(/W0) else() add_definitions(-w) diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index 365d5e1ae2..e3119121cd 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -7,7 +7,7 @@ #define _SOURCE_DIRECTORY R"(@CMAKE_SOURCE_DIR@)" #define _BUILD_DIRECTORY R"(@BUILDDIR@)" #define _MYSQL_EXECUTABLE R"(@MYSQL_EXECUTABLE@)" - #define _FULL_DATABASE "TDB_full_world_434.24_2017_11_15.sql" + #define _FULL_DATABASE "TDB_full_world_434.25_2017_12_17.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-2017 TrinityCore" #define VER_FILEVERSION 0,0,0 diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 8cf98f329b..82df61f2dc 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -536,7 +536,654 @@ CREATE TABLE `rbac_linked_permissions` ( LOCK TABLES `rbac_linked_permissions` WRITE; /*!40000 ALTER TABLE `rbac_linked_permissions` DISABLE KEYS */; -INSERT INTO `rbac_linked_permissions` VALUES (192,21),(192,42),(192,43),(192,193),(192,196),(192,778),(192,775),(192,779),(192,780),(192,781),(192,782),(192,783),(192,784),(192,785),(192,786),(192,787),(192,788),(192,789),(192,790),(192,791),(192,792),(192,793),(192,794),(192,835),(193,48),(193,194),(193,197),(194,1),(194,2),(194,11),(194,13),(194,14),(194,15),(194,16),(194,17),(194,18),(194,19),(194,20),(194,22),(194,23),(194,25),(194,26),(194,27),(194,28),(194,29),(194,30),(194,31),(194,32),(194,33),(194,34),(194,35),(194,36),(194,37),(194,38),(194,39),(194,40),(194,41),(194,44),(194,46),(194,47),(194,195),(194,198),(195,3),(195,4),(195,5),(195,6),(195,24),(195,49),(195,199),(196,7),(196,200),(196,201),(196,208),(196,212),(196,213),(196,226),(196,227),(196,230),(196,231),(196,233),(196,234),(196,235),(196,238),(196,239),(196,240),(196,241),(196,242),(196,243),(196,244),(196,245),(196,246),(196,247),(196,248),(196,249),(196,250),(196,251),(196,252),(196,253),(196,254),(196,255),(196,256),(196,257),(196,258),(196,259),(196,260),(196,261),(196,262),(196,264),(196,265),(196,266),(196,267),(196,268),(196,269),(196,270),(196,271),(196,272),(196,279),(196,280),(196,283),(196,287),(196,288),(196,289),(196,290),(196,291),(196,292),(196,293),(196,294),(196,295),(196,296),(196,297),(196,298),(196,299),(196,302),(196,303),(196,304),(196,305),(196,306),(196,307),(196,308),(196,309),(196,310),(196,313),(196,314),(196,319),(196,320),(196,321),(196,322),(196,323),(196,324),(196,325),(196,326),(196,327),(196,328),(196,329),(196,330),(196,331),(196,332),(196,333),(196,334),(196,335),(196,336),(196,337),(196,338),(196,339),(196,340),(196,341),(196,342),(196,343),(196,344),(196,345),(196,346),(196,347),(196,348),(196,349),(196,350),(196,351),(196,352),(196,353),(196,354),(196,355),(196,356),(196,357),(196,358),(196,359),(196,360),(196,361),(196,362),(196,363),(196,364),(196,365),(196,366),(196,373),(196,375),(196,400),(196,401),(196,402),(196,403),(196,404),(196,405),(196,406),(196,407),(196,417),(196,418),(196,419),(196,420),(196,421),(196,422),(196,423),(196,424),(196,425),(196,426),(196,427),(196,428),(196,429),(196,434),(196,435),(196,436),(196,437),(196,438),(196,439),(196,440),(196,441),(196,442),(196,443),(196,444),(196,445),(196,446),(196,447),(196,448),(196,449),(196,450),(196,451),(196,452),(196,453),(196,454),(196,455),(196,456),(196,457),(196,458),(196,459),(196,461),(196,463),(196,464),(196,465),(196,472),(196,473),(196,474),(196,475),(196,476),(196,477),(196,478),(196,488),(196,489),(196,491),(196,492),(196,493),(196,495),(196,497),(196,498),(196,499),(196,500),(196,502),(196,503),(196,505),(196,508),(196,511),(196,513),(196,514),(196,516),(196,519),(196,522),(196,523),(196,526),(196,527),(196,529),(196,530),(196,533),(196,535),(196,536),(196,537),(196,538),(196,539),(196,540),(196,541),(196,556),(196,581),(196,582),(196,592),(196,593),(196,596),(196,602),(196,603),(196,604),(196,605),(196,606),(196,607),(196,608),(196,609),(196,610),(196,611),(196,612),(196,613),(196,614),(196,615),(196,616),(196,617),(196,618),(196,619),(196,620),(196,621),(196,622),(196,623),(196,624),(196,625),(196,626),(196,627),(196,628),(196,629),(196,630),(196,631),(194,632),(196,633),(196,634),(196,635),(196,636),(196,637),(196,638),(196,639),(196,640),(196,641),(196,642),(196,643),(196,644),(196,645),(196,646),(196,647),(196,648),(196,649),(196,650),(196,651),(196,652),(196,653),(196,654),(196,655),(196,656),(196,657),(196,658),(196,659),(196,660),(196,661),(196,662),(196,663),(196,664),(196,665),(196,666),(196,667),(196,668),(196,669),(196,670),(196,671),(196,672),(196,673),(196,674),(196,675),(196,676),(196,677),(196,678),(196,679),(196,680),(196,681),(196,682),(196,683),(196,684),(196,685),(196,686),(196,687),(196,688),(196,689),(196,690),(196,691),(196,692),(196,693),(196,694),(196,695),(196,696),(196,697),(196,698),(196,699),(196,700),(196,701),(196,702),(196,703),(196,704),(196,705),(196,706),(196,707),(196,708),(196,709),(196,710),(196,711),(196,712),(196,713),(196,714),(196,715),(196,716),(196,717),(196,718),(196,719),(196,721),(196,722),(196,723),(196,724),(196,725),(196,726),(196,727),(196,728),(196,729),(196,730),(196,733),(196,734),(196,735),(196,736),(196,738),(196,739),(196,748),(196,753),(196,757),(196,773),(196,777),(196,836),(196,837),(196,838),(196,839),(196,840),(196,841),(196,843),(196,866),(196,867),(197,232),(197,236),(197,237),(197,273),(197,274),(197,275),(197,276),(197,277),(197,284),(197,285),(197,286),(197,301),(197,311),(197,387),(197,388),(197,389),(197,390),(197,391),(197,392),(197,393),(197,394),(197,395),(197,396),(197,397),(197,398),(197,399),(197,479),(197,480),(197,481),(197,482),(197,485),(197,486),(197,487),(197,494),(197,506),(197,509),(197,510),(197,517),(197,518),(197,521),(197,542),(197,543),(197,550),(197,558),(197,568),(197,571),(197,572),(197,573),(197,574),(197,575),(197,576),(197,577),(197,578),(197,579),(197,580),(197,583),(197,584),(197,585),(197,586),(197,587),(197,588),(197,589),(197,590),(197,591),(197,594),(197,595),(197,601),(197,743),(197,750),(197,758),(197,761),(197,762),(197,763),(197,764),(197,765),(197,766),(197,767),(197,768),(197,769),(197,770),(197,771),(197,772),(197,774),(197,856),(197,857),(197,858),(197,859),(197,860),(197,861),(197,862),(197,863),(197,864),(197,865),(198,218),(198,300),(198,312),(198,315),(198,316),(198,317),(198,318),(198,855),(198,367),(198,368),(198,369),(198,370),(198,371),(198,372),(198,374),(198,376),(198,377),(198,378),(198,379),(198,380),(198,381),(198,382),(198,383),(198,384),(198,385),(198,386),(198,408),(198,409),(198,410),(198,411),(198,412),(198,413),(198,414),(198,415),(198,416),(198,430),(198,431),(198,432),(198,433),(198,462),(198,466),(198,467),(198,468),(198,469),(198,470),(198,471),(198,483),(198,484),(198,490),(198,504),(198,512),(198,515),(198,520),(198,524),(198,528),(198,531),(198,532),(198,544),(198,545),(198,546),(198,547),(198,548),(198,549),(198,551),(198,552),(198,553),(198,554),(198,555),(198,557),(198,559),(198,560),(198,561),(198,562),(198,563),(198,564),(198,565),(198,566),(198,567),(198,569),(198,570),(198,597),(198,598),(198,599),(198,600),(198,737),(198,740),(198,741),(198,742),(198,744),(198,745),(198,746),(198,747),(198,749),(198,751),(198,752),(198,754),(198,755),(198,756),(198,759),(198,760),(198,845),(199,207),(199,209),(199,210),(199,211),(199,217),(199,221),(199,222),(199,223),(199,225),(199,263),(199,496),(199,501),(199,507),(199,525),(199,534); +INSERT INTO `rbac_linked_permissions` VALUES +(192,21), +(192,42), +(192,43), +(192,193), +(192,196), +(192,778), +(192,775), +(192,779), +(192,780), +(192,781), +(192,782), +(192,783), +(192,784), +(192,785), +(192,786), +(192,787), +(192,788), +(192,789), +(192,790), +(192,791), +(192,792), +(192,793), +(192,794), +(192,835), +(193,48), +(193,194), +(193,197), +(194,1), +(194,2), +(194,11), +(194,13), +(194,14), +(194,15), +(194,16), +(194,17), +(194,18), +(194,19), +(194,20), +(194,22), +(194,23), +(194,25), +(194,26), +(194,27), +(194,28), +(194,29), +(194,30), +(194,31), +(194,32), +(194,33), +(194,34), +(194,35), +(194,36), +(194,37), +(194,38), +(194,39), +(194,40), +(194,41), +(194,44), +(194,46), +(194,47), +(194,195), +(194,198), +(195,3), +(195,4), +(195,5), +(195,6), +(195,24), +(195,49), +(195,199), +(196,7), +(196,200), +(196,201), +(196,208), +(196,212), +(196,213), +(196,226), +(196,227), +(196,230), +(196,231), +(196,233), +(196,234), +(196,235), +(196,238), +(196,239), +(196,240), +(196,241), +(196,242), +(196,243), +(196,244), +(196,245), +(196,246), +(196,247), +(196,248), +(196,249), +(196,250), +(196,251), +(196,252), +(196,253), +(196,254), +(196,255), +(196,256), +(196,257), +(196,258), +(196,259), +(196,260), +(196,261), +(196,262), +(196,264), +(196,265), +(196,266), +(196,267), +(196,268), +(196,269), +(196,270), +(196,271), +(196,272), +(196,279), +(196,280), +(196,283), +(196,287), +(196,288), +(196,289), +(196,290), +(196,291), +(196,292), +(196,293), +(196,294), +(196,295), +(196,296), +(196,297), +(196,298), +(196,299), +(196,302), +(196,303), +(196,304), +(196,305), +(196,306), +(196,307), +(196,308), +(196,309), +(196,310), +(196,313), +(196,314), +(196,319), +(196,320), +(196,321), +(196,322), +(196,323), +(196,324), +(196,325), +(196,326), +(196,327), +(196,328), +(196,329), +(196,330), +(196,331), +(196,332), +(196,333), +(196,334), +(196,335), +(196,336), +(196,337), +(196,338), +(196,339), +(196,340), +(196,341), +(196,342), +(196,343), +(196,344), +(196,345), +(196,346), +(196,347), +(196,348), +(196,349), +(196,350), +(196,351), +(196,352), +(196,353), +(196,354), +(196,355), +(196,356), +(196,357), +(196,358), +(196,359), +(196,360), +(196,361), +(196,362), +(196,363), +(196,364), +(196,365), +(196,366), +(196,373), +(196,375), +(196,400), +(196,401), +(196,402), +(196,403), +(196,404), +(196,405), +(196,406), +(196,407), +(196,417), +(196,418), +(196,419), +(196,420), +(196,421), +(196,422), +(196,423), +(196,424), +(196,425), +(196,426), +(196,427), +(196,428), +(196,429), +(196,434), +(196,435), +(196,436), +(196,437), +(196,438), +(196,439), +(196,440), +(196,441), +(196,442), +(196,443), +(196,444), +(196,445), +(196,446), +(196,447), +(196,448), +(196,449), +(196,450), +(196,451), +(196,452), +(196,453), +(196,454), +(196,455), +(196,456), +(196,457), +(196,458), +(196,459), +(196,461), +(196,463), +(196,464), +(196,465), +(196,472), +(196,473), +(196,474), +(196,475), +(196,476), +(196,477), +(196,478), +(196,488), +(196,489), +(196,491), +(196,492), +(196,493), +(196,495), +(196,497), +(196,498), +(196,499), +(196,500), +(196,502), +(196,503), +(196,505), +(196,508), +(196,511), +(196,513), +(196,514), +(196,516), +(196,519), +(196,522), +(196,523), +(196,526), +(196,527), +(196,529), +(196,530), +(196,533), +(196,535), +(196,536), +(196,537), +(196,538), +(196,539), +(196,540), +(196,541), +(196,556), +(196,581), +(196,582), +(196,592), +(196,593), +(196,596), +(196,602), +(196,603), +(196,604), +(196,605), +(196,606), +(196,607), +(196,608), +(196,609), +(196,610), +(196,611), +(196,612), +(196,613), +(196,614), +(196,615), +(196,616), +(196,617), +(196,618), +(196,619), +(196,620), +(196,621), +(196,622), +(196,623), +(196,624), +(196,625), +(196,626), +(196,627), +(196,628), +(196,629), +(196,630), +(196,631), +(194,632), +(196,633), +(196,634), +(196,635), +(196,636), +(196,637), +(196,638), +(196,639), +(196,640), +(196,641), +(196,642), +(196,643), +(196,644), +(196,645), +(196,646), +(196,647), +(196,648), +(196,649), +(196,650), +(196,651), +(196,652), +(196,653), +(196,654), +(196,655), +(196,656), +(196,657), +(196,658), +(196,659), +(196,660), +(196,661), +(196,662), +(196,663), +(196,664), +(196,665), +(196,666), +(196,667), +(196,668), +(196,669), +(196,670), +(196,671), +(196,672), +(196,673), +(196,674), +(196,675), +(196,676), +(196,677), +(196,678), +(196,679), +(196,680), +(196,681), +(196,682), +(196,683), +(196,684), +(196,685), +(196,686), +(196,687), +(196,688), +(196,689), +(196,690), +(196,691), +(196,692), +(196,693), +(196,694), +(196,695), +(196,696), +(196,697), +(196,698), +(196,699), +(196,700), +(196,701), +(196,702), +(196,703), +(196,704), +(196,705), +(196,706), +(196,707), +(196,708), +(196,709), +(196,710), +(196,711), +(196,712), +(196,713), +(196,714), +(196,715), +(196,716), +(196,717), +(196,718), +(196,719), +(196,721), +(196,722), +(196,723), +(196,724), +(196,725), +(196,726), +(196,727), +(196,728), +(196,729), +(196,730), +(196,733), +(196,734), +(196,735), +(196,736), +(196,738), +(196,739), +(196,748), +(196,753), +(196,757), +(196,773), +(196,777), +(196,836), +(196,837), +(196,838), +(196,839), +(196,840), +(196,841), +(196,843), +(196,866), +(196,867), +(197,232), +(197,236), +(197,237), +(197,273), +(197,274), +(197,275), +(197,276), +(197,277), +(197,284), +(197,285), +(197,286), +(197,301), +(197,311), +(197,387), +(197,388), +(197,389), +(197,390), +(197,391), +(197,392), +(197,393), +(197,394), +(197,395), +(197,396), +(197,397), +(197,398), +(197,399), +(197,479), +(197,480), +(197,481), +(197,482), +(197,485), +(197,486), +(197,487), +(197,494), +(197,506), +(197,509), +(197,510), +(197,517), +(197,518), +(197,521), +(197,542), +(197,543), +(197,550), +(197,558), +(197,568), +(197,571), +(197,572), +(197,573), +(197,574), +(197,575), +(197,576), +(197,577), +(197,578), +(197,579), +(197,580), +(197,583), +(197,584), +(197,585), +(197,586), +(197,587), +(197,588), +(197,589), +(197,590), +(197,591), +(197,594), +(197,595), +(197,601), +(197,743), +(197,750), +(197,758), +(197,761), +(197,762), +(197,763), +(197,764), +(197,765), +(197,766), +(197,767), +(197,768), +(197,769), +(197,770), +(197,771), +(197,772), +(197,774), +(197,856), +(197,857), +(197,858), +(197,859), +(197,860), +(197,861), +(197,862), +(197,863), +(197,864), +(197,865), +(198,218), +(198,300), +(198,312), +(198,315), +(198,316), +(198,317), +(198,318), +(198,855), +(198,367), +(198,368), +(198,369), +(198,370), +(198,371), +(198,372), +(198,374), +(198,376), +(198,377), +(198,378), +(198,379), +(198,380), +(198,381), +(198,382), +(198,383), +(198,384), +(198,385), +(198,386), +(198,408), +(198,409), +(198,410), +(198,411), +(198,412), +(198,413), +(198,414), +(198,415), +(198,416), +(198,430), +(198,431), +(198,432), +(198,433), +(198,462), +(198,466), +(198,467), +(198,468), +(198,469), +(198,470), +(198,471), +(198,483), +(198,484), +(198,490), +(198,504), +(198,512), +(198,515), +(198,520), +(198,524), +(198,528), +(198,531), +(198,532), +(198,544), +(198,545), +(198,546), +(198,547), +(198,548), +(198,549), +(198,551), +(198,552), +(198,553), +(198,554), +(198,555), +(198,557), +(198,559), +(198,560), +(198,561), +(198,562), +(198,563), +(198,564), +(198,565), +(198,566), +(198,567), +(198,569), +(198,570), +(198,597), +(198,598), +(198,599), +(198,600), +(198,737), +(198,740), +(198,741), +(198,742), +(198,744), +(198,745), +(198,746), +(198,747), +(198,749), +(198,751), +(198,752), +(198,754), +(198,755), +(198,756), +(198,759), +(198,760), +(198,845), +(199,207), +(199,209), +(199,210), +(199,211), +(199,217), +(199,221), +(199,222), +(199,223), +(199,225), +(199,263), +(199,496), +(197,501), +(199,507), +(199,525), +(199,534); /*!40000 ALTER TABLE `rbac_linked_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -560,7 +1207,668 @@ CREATE TABLE `rbac_permissions` ( LOCK TABLES `rbac_permissions` WRITE; /*!40000 ALTER TABLE `rbac_permissions` DISABLE KEYS */; -INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(7, 'Skip idle connection check'),(11,'Log GM trades'),(13,'Skip Instance required bosses check'),(14,'Skip character creation team mask check'),(15,'Skip character creation class mask check'),(16,'Skip character creation race mask check'),(17,'Skip character creation reserved name check'),(18,'Skip character creation heroic min level check'),(19,'Skip needed requirements to use channel check'),(20,'Skip disable map check'),(21,'Skip reset talents when used more than allowed check'),(22,'Skip spam chat check'),(23,'Skip over-speed ping check'),(24,'Two side faction characters on the same account'),(25,'Allow say chat between factions'),(26,'Allow channel chat between factions'),(27,'Two side mail interaction'),(28,'See two side who list'),(29,'Add friends of other faction'),(30,'Save character without delay with .save command'),(31,'Use params with .unstuck command'),(32,'Can be assigned tickets with .assign ticket command'),(33,'Notify if a command was not found'),(34,'Check if should appear in list using .gm ingame command'),(35,'See all security levels with who command'),(36,'Filter whispers'),(37,'Use staff badge in chat'),(38,'Resurrect with full Health Points'),(39,'Restore saved gm setting states'),(40,'Allows to add a gm to friend list'),(41,'Use Config option START_GM_LEVEL to assign new character level'),(42,'Allows to use CMSG_WORLD_TELEPORT opcode'),(43,'Allows to use CMSG_WHOIS opcode'),(44,'Receive global GM messages/texts'),(45,'Join channels without announce'),(46,'Change channel settings without being channel moderator'),(47,'Enables lower security than target check'),(48,'Enable IP, Last Login and EMail output in pinfo'),(49,'Forces to enter the email for confirmation on password change'),(50,'Allow user to check his own email with .account'),(192,'Role: Sec Level Administrator'),(193,'Role: Sec Level Gamemaster'),(194,'Role: Sec Level Moderator'),(195,'Role: Sec Level Player'),(196,'Role: Administrator Commands'),(197,'Role: Gamemaster Commands'),(198,'Role: Moderator Commands'),(199,'Role: Player Commands'),(200,'Command: rbac'),(201,'Command: rbac account'),(202,'Command: rbac account list'),(203,'Command: rbac account grant'),(204,'Command: rbac account deny'),(205,'Command: rbac account revoke'),(206,'Command: rbac list'),(207,'Command: battlenetaccount'),(208,'Command: battlenetaccount create'),(209,'Command: battlenetaccount lock country'),(210,'Command: battlenetaccount lock ip'),(211,'Command: battlenetaccount password'),(212,'Command: battlenetaccount set'),(213,'Command: battlenetaccount set password'),(217,'Command: account'),(218,'Command: account addon'),(219,'Command: account create'),(220,'Command: account delete'),(221,'Command: account lock'),(222,'Command: account lock country'),(223,'Command: account lock ip'),(224,'Command: account onlinelist'),(225,'Command: account password'),(226,'Command: account set'),(227,'Command: account set addon'),(228,'Command: account set gmlevel'),(229,'Command: account set password'),(230,'Command: achievement'),(231,'Command: achievement add'),(232,'Command: arena'),(233,'Command: arena captain'),(234,'Command: arena create'),(235,'Command: arena disband'),(236,'Command: arena info'),(237,'Command: arena lookup'),(238,'Command: arena rename'),(239,'Command: ban'),(240,'Command: ban account'),(241,'Command: ban character'),(242,'Command: ban ip'),(243,'Command: ban playeraccount'),(244,'Command: baninfo'),(245,'Command: baninfo account'),(246,'Command: baninfo character'),(247,'Command: baninfo ip'),(248,'Command: banlist'),(249,'Command: banlist account'),(250,'Command: banlist character'),(251,'Command: banlist ip'),(252,'Command: unban'),(253,'Command: unban account'),(254,'Command: unban character'),(255,'Command: unban ip'),(256,'Command: unban playeraccount'),(257,'Command: bf'),(258,'Command: bf start'),(259,'Command: bf stop'),(260,'Command: bf switch'),(261,'Command: bf timer'),(262,'Command: bf enable'),(263,'Command: account email'),(264,'Command: account set sec'),(265,'Command: account set sec email'),(266,'Command: account set sec regmail'),(267,'Command: cast'),(268,'Command: cast back'),(269,'Command: cast dist'),(270,'Command: cast self'),(271,'Command: cast target'),(272,'Command: cast dest'),(273,'Command: character'),(274,'Command: character customize'),(275,'Command: character changefaction'),(276,'Command: character changerace'),(277,'Command: character deleted'),(279,'Command: character deleted list'),(280,'Command: character deleted restore'),(283,'Command: character level'),(284,'Command: character rename'),(285,'Command: character reputation'),(286,'Command: character titles'),(287,'Command: levelup'),(288,'Command: pdump'),(289,'Command: pdump load'),(290,'Command: pdump write'),(291,'Command: cheat'),(292,'Command: cheat casttime'),(293,'Command: cheat cooldown'),(294,'Command: cheat explore'),(295,'Command: cheat god'),(296,'Command: cheat power'),(297,'Command: cheat status'),(298,'Command: cheat taxi'),(299,'Command: cheat waterwalk'),(300,'Command: debug'),(301,'Command: debug anim'),(302,'Command: debug areatriggers'),(303,'Command: debug arena'),(304,'Command: debug bg'),(305,'Command: debug entervehicle'),(306,'Command: debug getitemstate'),(307,'Command: debug getitemvalue'),(308,'Command: debug getvalue'),(309,'Command: debug hostil'),(310,'Command: debug itemexpire'),(311,'Command: debug lootrecipient'),(312,'Command: debug los'),(313,'Command: debug mod32value'),(314,'Command: debug moveflags'),(315,'Command: debug play'),(316,'Command: debug play cinematics'),(317,'Command: debug play movie'),(318,'Command: debug play sound'),(319,'Command: debug send'),(320,'Command: debug send buyerror'),(321,'Command: debug send channelnotify'),(322,'Command: debug send chatmessage'),(323,'Command: debug send equiperror'),(324,'Command: debug send largepacket'),(325,'Command: debug send opcode'),(326,'Command: debug send qinvalidmsg'),(327,'Command: debug send qpartymsg'),(328,'Command: debug send sellerror'),(329,'Command: debug send setphaseshift'),(330,'Command: debug send spellfail'),(331,'Command: debug setaurastate'),(332,'Command: debug setbit'),(333,'Command: debug setitemvalue'),(334,'Command: debug setvalue'),(335,'Command: debug setvid'),(336,'Command: debug spawnvehicle'),(337,'Command: debug combat'),(338,'Command: debug update'),(339,'Command: debug worldstate'),(340,'Command: wpgps'),(341,'Command: deserter'),(342,'Command: deserter bg'),(343,'Command: deserter bg add'),(344,'Command: deserter bg remove'),(345,'Command: deserter instance'),(346,'Command: deserter instance add'),(347,'Command: deserter instance remove'),(348,'Command: disable'),(349,'Command: disable add'),(350,'Command: disable add achievement_criteria'),(351,'Command: disable add battleground'),(352,'Command: disable add map'),(353,'Command: disable add mmap'),(354,'Command: disable add outdoorpvp'),(355,'Command: disable add quest'),(356,'Command: disable add spell'),(357,'Command: disable add vmap'),(358,'Command: disable remove'),(359,'Command: disable remove achievement_criteria'),(360,'Command: disable remove battleground'),(361,'Command: disable remove map'),(362,'Command: disable remove mmap'),(363,'Command: disable remove outdoorpvp'),(364,'Command: disable remove quest'),(365,'Command: disable remove spell'),(366,'Command: disable remove vmap'),(367,'Command: event'),(368,'Command: event activelist'),(369,'Command: event start'),(370,'Command: event stop'),(371,'Command: gm'),(372,'Command: gm chat'),(373,'Command: gm fly'),(374,'Command: gm ingame'),(375,'Command: gm list'),(376,'Command: gm visible'),(377,'Command: go'),(378,'Command: go creature'),(379,'Command: go graveyard'),(380,'Command: go grid'),(381,'Command: go object'),(382,'Command: go taxinode'),(383,'Command: go ticket'),(384,'Command: go trigger'),(385,'Command: go xyz'),(386,'Command: go zonexy'),(387,'Command: gobject'),(388,'Command: gobject activate'),(389,'Command: gobject add'),(390,'Command: gobject add temp'),(391,'Command: gobject delete'),(392,'Command: gobject info'),(393,'Command: gobject move'),(394,'Command: gobject near'),(395,'Command: gobject set'),(396,'Command: gobject set phase'),(397,'Command: gobject set state'),(398,'Command: gobject target'),(399,'Command: gobject turn'),(400,'debug transport'),(401,'Command: guild'),(402,'Command: guild create'),(403,'Command: guild delete'),(404,'Command: guild invite'),(405,'Command: guild uninvite'),(406,'Command: guild rank'),(407,'Command: guild rename'),(408,'Command: honor'),(409,'Command: honor add'),(410,'Command: honor add kill'),(411,'Command: honor update'),(412,'Command: instance'),(413,'Command: instance listbinds'),(414,'Command: instance unbind'),(415,'Command: instance stats'),(416,'Command: instance savedata'),(417,'Command: learn'),(418,'Command: learn all'),(419,'Command: learn all my'),(420,'Command: learn all my class'),(421,'Command: learn all my pettalents'),(422,'Command: learn all my spells'),(423,'Command: learn all my talents'),(424,'Command: learn all gm'),(425,'Command: learn all crafts'),(426,'Command: learn all default'),(427,'Command: learn all lang'),(428,'Command: learn all recipes'),(429,'Command: unlearn'),(430,'Command: lfg'),(431,'Command: lfg player'),(432,'Command: lfg group'),(433,'Command: lfg queue'),(434,'Command: lfg clean'),(435,'Command: lfg options'),(436,'Command: list'),(437,'Command: list creature'),(438,'Command: list item'),(439,'Command: list object'),(440,'Command: list auras'),(441,'Command: list mail'),(442,'Command: lookup'),(443,'Command: lookup area'),(444,'Command: lookup creature'),(445,'Command: lookup event'),(446,'Command: lookup faction'),(447,'Command: lookup item'),(448,'Command: lookup itemset'),(449,'Command: lookup object'),(450,'Command: lookup quest'),(451,'Command: lookup player'),(452,'Command: lookup player ip'),(453,'Command: lookup player account'),(454,'Command: lookup player email'),(455,'Command: lookup skill'),(456,'Command: lookup spell'),(457,'Command: lookup spell id'),(458,'Command: lookup taxinode'),(459,'Command: lookup tele'),(460,'Command: lookup title'),(461,'Command: lookup map'),(462,'Command: announce'),(463,'Command: channel'),(464,'Command: channel set'),(465,'Command: channel set ownership'),(466,'Command: gmannounce'),(467,'Command: gmnameannounce'),(468,'Command: gmnotify'),(469,'Command: nameannounce'),(470,'Command: notify'),(471,'Command: whispers'),(472,'Command: group'),(473,'Command: group leader'),(474,'Command: group disband'),(475,'Command: group remove'),(476,'Command: group join'),(477,'Command: group list'),(478,'Command: group summon'),(479,'Command: pet'),(480,'Command: pet create'),(481,'Command: pet learn'),(482,'Command: pet unlearn'),(483,'Command: send'),(484,'Command: send items'),(485,'Command: send mail'),(486,'Command: send message'),(487,'Command: send money'),(488,'Command: additem'),(489,'Command: additemset'),(490,'Command: appear'),(491,'Command: aura'),(492,'Command: bank'),(493,'Command: bindsight'),(494,'Command: combatstop'),(495,'Command: cometome'),(496,'Command: commands'),(497,'Command: cooldown'),(498,'Command: damage'),(499,'Command: dev'),(500,'Command: die'),(501,'Command: dismount'),(502,'Command: distance'),(503,'Command: flusharenapoints'),(504,'Command: freeze'),(505,'Command: gps'),(506,'Command: guid'),(507,'Command: help'),(508,'Command: hidearea'),(509,'Command: itemmove'),(510,'Command: kick'),(511,'Command: linkgrave'),(512,'Command: listfreeze'),(513,'Command: maxskill'),(514,'Command: movegens'),(515,'Command: mute'),(516,'Command: neargrave'),(517,'Command: pinfo'),(518,'Command: playall'),(519,'Command: possess'),(520,'Command: recall'),(521,'Command: repairitems'),(522,'Command: respawn'),(523,'Command: revive'),(524,'Command: saveall'),(525,'Command: save'),(526,'Command: setskill'),(527,'Command: showarea'),(528,'Command: summon'),(529,'Command: unaura'),(530,'Command: unbindsight'),(531,'Command: unfreeze'),(532,'Command: unmute'),(533,'Command: unpossess'),(534,'Command: unstuck'),(535,'Command: wchange'),(536,'Command: mmap'),(537,'Command: mmap loadedtiles'),(538,'Command: mmap loc'),(539,'Command: mmap path'),(540,'Command: mmap stats'),(541,'Command: mmap testarea'),(542,'Command: morph'),(543,'Command: demorph'),(544,'Command: modify'),(545,'Command: modify arenapoints'),(546,'Command: modify bit'),(547,'Command: modify drunk'),(548,'Command: modify energy'),(549,'Command: modify faction'),(550,'Command: modify gender'),(551,'Command: modify honor'),(552,'Command: modify hp'),(553,'Command: modify mana'),(554,'Command: modify money'),(555,'Command: modify mount'),(556,'Command: modify phase'),(557,'Command: modify rage'),(558,'Command: modify reputation'),(559,'Command: modify runicpower'),(560,'Command: modify scale'),(561,'Command: modify speed'),(562,'Command: modify speed all'),(563,'Command: modify speed backwalk'),(564,'Command: modify speed fly'),(565,'Command: modify speed walk'),(566,'Command: modify speed swim'),(567,'Command: modify spell'),(568,'Command: modify standstate'),(569,'Command: modify talentpoints'),(570,'Command: npc'),(571,'Command: npc add'),(572,'Command: npc add formation'),(573,'Command: npc add item'),(574,'Command: npc add move'),(575,'Command: npc add temp'),(576,'Command: npc add delete'),(577,'Command: npc add delete item'),(578,'Command: npc add follow'),(579,'Command: npc add follow stop'),(580,'Command: npc set'),(581,'Command: npc set allowmove'),(582,'Command: npc set entry'),(583,'Command: npc set factionid'),(584,'Command: npc set flag'),(585,'Command: npc set level'),(586,'Command: npc set link'),(587,'Command: npc set model'),(588,'Command: npc set movetype'),(589,'Command: npc set phase'),(590,'Command: npc set spawndist'),(591,'Command: npc set spawntime'),(592,'Command: npc set data'),(593,'Command: npc info'),(594,'Command: npc near'),(595,'Command: npc move'),(596,'Command: npc playemote'),(597,'Command: npc say'),(598,'Command: npc textemote'),(599,'Command: npc whisper'),(600,'Command: npc yell'),(601,'Command: npc tame'),(602,'Command: quest'),(603,'Command: quest add'),(604,'Command: quest complete'),(605,'Command: quest remove'),(606,'Command: quest reward'),(607,'Command: reload'),(608,'Command: reload access_requirement'),(609,'Command: reload achievement_criteria_data'),(610,'Command: reload achievement_reward'),(611,'Command: reload all'),(612,'Command: reload all achievement'),(613,'Command: reload all area'),(614,'Command: broadcast_text'),(615,'Command: reload all gossips'),(616,'Command: reload all item'),(617,'Command: reload all locales'),(618,'Command: reload all loot'),(619,'Command: reload all npc'),(620,'Command: reload all quest'),(621,'Command: reload all scripts'),(622,'Command: reload all spell'),(623,'Command: reload areatrigger_involvedrelation'),(624,'Command: reload areatrigger_tavern'),(625,'Command: reload areatrigger_teleport'),(626,'Command: reload auctions'),(627,'Command: reload autobroadcast'),(628,'Command: reload command'),(629,'Command: reload conditions'),(630,'Command: reload config'),(631,'Command: reload battleground_template'),(632, 'Command: .mutehistory'),(633,'Command: reload creature_linked_respawn'),(634,'Command: reload creature_loot_template'),(635,'Command: reload creature_onkill_reputation'),(636,'Command: reload creature_questender'),(637,'Command: reload creature_queststarter'),(638,'Command: reload creature_summon_groups'),(639,'Command: reload creature_template'),(640,'Command: reload creature_text'),(641,'Command: reload disables'),(642,'Command: reload disenchant_loot_template'),(643,'Command: reload event_scripts'),(644,'Command: reload fishing_loot_template'),(645,'Command: reload game_graveyard_zone'),(646,'Command: reload game_tele'),(647,'Command: reload gameobject_questender'),(648,'Command: reload gameobject_loot_template'),(649,'Command: reload gameobject_queststarter'),(650,'Command: reload gm_tickets'),(651,'Command: reload gossip_menu'),(652,'Command: reload gossip_menu_option'),(653,'Command: reload item_enchantment_template'),(654,'Command: reload item_loot_template'),(655,'Command: reload item_set_names'),(656,'Command: reload lfg_dungeon_rewards'),(657,'Command: reload locales_achievement_reward'),(658,'Command: reload locales_creature'),(659,'Command: reload locales_creature_text'),(660,'Command: reload locales_gameobject'),(661,'Command: reload locales_gossip_menu_option'),(662,'Command: reload locales_item'),(663,'Command: reload locales_item_set_name'),(664,'Command: reload locales_npc_text'),(665,'Command: reload locales_page_text'),(666,'Command: reload locales_points_of_interest'),(667,'Command: reload locales_quest'),(668,'Command: reload mail_level_reward'),(669,'Command: reload mail_loot_template'),(670,'Command: reload milling_loot_template'),(671,'Command: reload npc_spellclick_spells'),(672,'Command: reload npc_trainer'),(673,'Command: reload npc_vendor'),(674,'Command: reload page_text'),(675,'Command: reload pickpocketing_loot_template'),(676,'Command: reload points_of_interest'),(677,'Command: reload prospecting_loot_template'),(678,'Command: reload quest_poi'),(679,'Command: reload quest_template'),(680,'Command: reload rbac'),(681,'Command: reload reference_loot_template'),(682,'Command: reload reserved_name'),(683,'Command: reload reputation_reward_rate'),(684,'Command: reload reputation_spillover_template'),(685,'Command: reload skill_discovery_template'),(686,'Command: reload skill_extra_item_template'),(687,'Command: reload skill_fishing_base_level'),(688,'Command: reload skinning_loot_template'),(689,'Command: reload smart_scripts'),(690,'Command: reload spell_required'),(691,'Command: reload spell_area'),(692,'Command: reload spell_bonus_data'),(693,'Command: reload spell_group'),(694,'Command: reload spell_learn_spell'),(695,'Command: reload spell_loot_template'),(696,'Command: reload spell_linked_spell'),(697,'Command: reload spell_pet_auras'),(698,'Command: character changeaccount'),(699,'Command: reload spell_proc'),(700,'Command: reload spell_scripts'),(701,'Command: reload spell_target_position'),(702,'Command: reload spell_threats'),(703,'Command: reload spell_group_stack_rules'),(704,'Command: reload trinity_string'),(705,'Command: reload warden_action'),(706,'Command: reload waypoint_scripts'),(707,'Command: reload waypoint_data'),(708,'Command: reload vehicle_accessory'),(709,'Command: reload vehicle_template_accessory'),(710,'Command: reset'),(711,'Command: reset achievements'),(712,'Command: reset honor'),(713,'Command: reset level'),(714,'Command: reset spells'),(715,'Command: reset stats'),(716,'Command: reset talents'),(717,'Command: reset all'),(718,'Command: server'),(719,'Command: server corpses'),(720,'Command: server exit'),(721,'Command: server idlerestart'),(722,'Command: server idlerestart cancel'),(723,'Command: server idleshutdown'),(724,'Command: server idleshutdown cancel'),(725,'Command: server info'),(726,'Command: server plimit'),(727,'Command: server restart'),(728,'Command: server restart cancel'),(729,'Command: server set'),(730,'Command: server set closed'),(731,'Command: server set difftime'),(732,'Command: server set loglevel'),(733,'Command: server set motd'),(734,'Command: server shutdown'),(735,'Command: server shutdown cancel'),(736,'Command: server motd'),(737,'Command: tele'),(738,'Command: tele add'),(739,'Command: tele del'),(740,'Command: tele name'),(741,'Command: tele group'),(742,'Command: ticket'),(743,'Command: ticket assign'),(744,'Command: ticket close'),(745,'Command: ticket closedlist'),(746,'Command: ticket comment'),(747,'Command: ticket complete'),(748,'Command: ticket delete'),(749,'Command: ticket escalate'),(750,'Command: ticket escalatedlist'),(751,'Command: ticket list'),(752,'Command: ticket onlinelist'),(753,'Command: ticket reset'),(754,'Command: ticket response'),(755,'Command: ticket response append'),(756,'Command: ticket response appendln'),(757,'Command: ticket togglesystem'),(758,'Command: ticket unassign'),(759,'Command: ticket viewid'),(760,'Command: ticket viewname'),(761,'Command: titles'),(762,'Command: titles add'),(763,'Command: titles current'),(764,'Command: titles remove'),(765,'Command: titles set'),(766,'Command: titles set mask'),(767,'Command: wp'),(768,'Command: wp add'),(769,'Command: wp event'),(770,'Command: wp load'),(771,'Command: wp modify'),(772,'Command: wp unload'),(773,'Command: wp reload'),(774,'Command: wp show'),(777,'Command: mailbox'),(778,'Command: ahbot'),(779,'Command: ahbot items'),(780,'Command: ahbot items gray'),(781,'Command: ahbot items white'),(782,'Command: ahbot items green'),(783,'Command: ahbot items blue'),(784,'Command: ahbot items purple'),(785,'Command: ahbot items orange'),(786,'Command: ahbot items yellow'),(787,'Command: ahbot ratio'),(788,'Command: ahbot ratio alliance'),(789,'Command: ahbot ratio horde'),(790,'Command: ahbot ratio neutral'),(791,'Command: ahbot rebuild'),(792,'Command: ahbot reload'),(793,'Command: ahbot status'),(794,'Command: .guild info'),(835,'Command: debug loadcells'),(836,'Command: .debug boundary'),(837,"Command: .npc evade"), (838,"Command: .pet level"), (839,"Command: .server shutdown force"), (840,"Command: .server restart force"), (841,'Command: .debug neargraveyard'),(845, 'Command: go offset'),(855,'Command: debug play music'),(856,'Command: npc spawngroup'),(857,'Command: npc despawngroup'),(858,'Command: gobject spawngroup'),(859,'Command: gobject despawngroup'),(860,'Command: list respawns'),(861,'Command: group set'),(862,'Command: group set assistant'),(863,'Command: group set maintank'),(864,'Command: group set mainassist'),(865,'Command: npc showloot'),(867,'Command: reload quest_greeting_locale'); +INSERT INTO `rbac_permissions` VALUES +(1,'Instant logout'), +(2,'Skip Queue'), +(3,'Join Normal Battleground'), +(4,'Join Random Battleground'), +(5,'Join Arenas'), +(6,'Join Dungeon Finder'), +(7,'Skip idle connection check'), +(11,'Log GM trades'), +(13,'Skip Instance required bosses check'), +(14,'Skip character creation team mask check'), +(15,'Skip character creation class mask check'), +(16,'Skip character creation race mask check'), +(17,'Skip character creation reserved name check'), +(18,'Skip character creation heroic min level check'), +(19,'Skip needed requirements to use channel check'), +(20,'Skip disable map check'), +(21,'Skip reset talents when used more than allowed check'), +(22,'Skip spam chat check'), +(23,'Skip over-speed ping check'), +(24,'Two side faction characters on the same account'), +(25,'Allow say chat between factions'), +(26,'Allow channel chat between factions'), +(27,'Two side mail interaction'), +(28,'See two side who list'), +(29,'Add friends of other faction'), +(30,'Save character without delay with .save command'), +(31,'Use params with .unstuck command'), +(32,'Can be assigned tickets with .assign ticket command'), +(33,'Notify if a command was not found'), +(34,'Check if should appear in list using .gm ingame command'), +(35,'See all security levels with who command'), +(36,'Filter whispers'), +(37,'Use staff badge in chat'), +(38,'Resurrect with full Health Points'), +(39,'Restore saved gm setting states'), +(40,'Allows to add a gm to friend list'), +(41,'Use Config option START_GM_LEVEL to assign new character level'), +(42,'Allows to use CMSG_WORLD_TELEPORT opcode'), +(43,'Allows to use CMSG_WHOIS opcode'), +(44,'Receive global GM messages/texts'), +(45,'Join channels without announce'), +(46,'Change channel settings without being channel moderator'), +(47,'Enables lower security than target check'), +(48,'Enable IP, Last Login and EMail output in pinfo'), +(49,'Forces to enter the email for confirmation on password change'), +(50,'Allow user to check his own email with .account'), +(192,'Role: Sec Level Administrator'), +(193,'Role: Sec Level Gamemaster'), +(194,'Role: Sec Level Moderator'), +(195,'Role: Sec Level Player'), +(196,'Role: Administrator Commands'), +(197,'Role: Gamemaster Commands'), +(198,'Role: Moderator Commands'), +(199,'Role: Player Commands'), +(200,'Command: rbac'), +(201,'Command: rbac account'), +(202,'Command: rbac account list'), +(203,'Command: rbac account grant'), +(204,'Command: rbac account deny'), +(205,'Command: rbac account revoke'), +(206,'Command: rbac list'), +(207,'Command: battlenetaccount'), +(208,'Command: battlenetaccount create'), +(209,'Command: battlenetaccount lock country'), +(210,'Command: battlenetaccount lock ip'), +(211,'Command: battlenetaccount password'), +(212,'Command: battlenetaccount set'), +(213,'Command: battlenetaccount set password'), +(217,'Command: account'), +(218,'Command: account addon'), +(219,'Command: account create'), +(220,'Command: account delete'), +(221,'Command: account lock'), +(222,'Command: account lock country'), +(223,'Command: account lock ip'), +(224,'Command: account onlinelist'), +(225,'Command: account password'), +(226,'Command: account set'), +(227,'Command: account set addon'), +(228,'Command: account set gmlevel'), +(229,'Command: account set password'), +(230,'Command: achievement'), +(231,'Command: achievement add'), +(232,'Command: arena'), +(233,'Command: arena captain'), +(234,'Command: arena create'), +(235,'Command: arena disband'), +(236,'Command: arena info'), +(237,'Command: arena lookup'), +(238,'Command: arena rename'), +(239,'Command: ban'), +(240,'Command: ban account'), +(241,'Command: ban character'), +(242,'Command: ban ip'), +(243,'Command: ban playeraccount'), +(244,'Command: baninfo'), +(245,'Command: baninfo account'), +(246,'Command: baninfo character'), +(247,'Command: baninfo ip'), +(248,'Command: banlist'), +(249,'Command: banlist account'), +(250,'Command: banlist character'), +(251,'Command: banlist ip'), +(252,'Command: unban'), +(253,'Command: unban account'), +(254,'Command: unban character'), +(255,'Command: unban ip'), +(256,'Command: unban playeraccount'), +(257,'Command: bf'), +(258,'Command: bf start'), +(259,'Command: bf stop'), +(260,'Command: bf switch'), +(261,'Command: bf timer'), +(262,'Command: bf enable'), +(263,'Command: account email'), +(264,'Command: account set sec'), +(265,'Command: account set sec email'), +(266,'Command: account set sec regmail'), +(267,'Command: cast'), +(268,'Command: cast back'), +(269,'Command: cast dist'), +(270,'Command: cast self'), +(271,'Command: cast target'), +(272,'Command: cast dest'), +(273,'Command: character'), +(274,'Command: character customize'), +(275,'Command: character changefaction'), +(276,'Command: character changerace'), +(277,'Command: character deleted'), +(279,'Command: character deleted list'), +(280,'Command: character deleted restore'), +(283,'Command: character level'), +(284,'Command: character rename'), +(285,'Command: character reputation'), +(286,'Command: character titles'), +(287,'Command: levelup'), +(288,'Command: pdump'), +(289,'Command: pdump load'), +(290,'Command: pdump write'), +(291,'Command: cheat'), +(292,'Command: cheat casttime'), +(293,'Command: cheat cooldown'), +(294,'Command: cheat explore'), +(295,'Command: cheat god'), +(296,'Command: cheat power'), +(297,'Command: cheat status'), +(298,'Command: cheat taxi'), +(299,'Command: cheat waterwalk'), +(300,'Command: debug'), +(301,'Command: debug anim'), +(302,'Command: debug areatriggers'), +(303,'Command: debug arena'), +(304,'Command: debug bg'), +(305,'Command: debug entervehicle'), +(306,'Command: debug getitemstate'), +(307,'Command: debug getitemvalue'), +(308,'Command: debug getvalue'), +(309,'Command: debug hostil'), +(310,'Command: debug itemexpire'), +(311,'Command: debug lootrecipient'), +(312,'Command: debug los'), +(313,'Command: debug mod32value'), +(314,'Command: debug moveflags'), +(315,'Command: debug play'), +(316,'Command: debug play cinematics'), +(317,'Command: debug play movie'), +(318,'Command: debug play sound'), +(319,'Command: debug send'), +(320,'Command: debug send buyerror'), +(321,'Command: debug send channelnotify'), +(322,'Command: debug send chatmessage'), +(323,'Command: debug send equiperror'), +(324,'Command: debug send largepacket'), +(325,'Command: debug send opcode'), +(326,'Command: debug send qinvalidmsg'), +(327,'Command: debug send qpartymsg'), +(328,'Command: debug send sellerror'), +(329,'Command: debug send setphaseshift'), +(330,'Command: debug send spellfail'), +(331,'Command: debug setaurastate'), +(332,'Command: debug setbit'), +(333,'Command: debug setitemvalue'), +(334,'Command: debug setvalue'), +(335,'Command: debug setvid'), +(336,'Command: debug spawnvehicle'), +(337,'Command: debug combat'), +(338,'Command: debug update'), +(339,'Command: debug worldstate'), +(340,'Command: wpgps'), +(341,'Command: deserter'), +(342,'Command: deserter bg'), +(343,'Command: deserter bg add'), +(344,'Command: deserter bg remove'), +(345,'Command: deserter instance'), +(346,'Command: deserter instance add'), +(347,'Command: deserter instance remove'), +(348,'Command: disable'), +(349,'Command: disable add'), +(350,'Command: disable add achievement_criteria'), +(351,'Command: disable add battleground'), +(352,'Command: disable add map'), +(353,'Command: disable add mmap'), +(354,'Command: disable add outdoorpvp'), +(355,'Command: disable add quest'), +(356,'Command: disable add spell'), +(357,'Command: disable add vmap'), +(358,'Command: disable remove'), +(359,'Command: disable remove achievement_criteria'), +(360,'Command: disable remove battleground'), +(361,'Command: disable remove map'), +(362,'Command: disable remove mmap'), +(363,'Command: disable remove outdoorpvp'), +(364,'Command: disable remove quest'), +(365,'Command: disable remove spell'), +(366,'Command: disable remove vmap'), +(367,'Command: event'), +(368,'Command: event activelist'), +(369,'Command: event start'), +(370,'Command: event stop'), +(371,'Command: gm'), +(372,'Command: gm chat'), +(373,'Command: gm fly'), +(374,'Command: gm ingame'), +(375,'Command: gm list'), +(376,'Command: gm visible'), +(377,'Command: go'), +(378,'Command: go creature'), +(379,'Command: go graveyard'), +(380,'Command: go grid'), +(381,'Command: go object'), +(382,'Command: go taxinode'), +(383,'Command: go ticket'), +(384,'Command: go trigger'), +(385,'Command: go xyz'), +(386,'Command: go zonexy'), +(387,'Command: gobject'), +(388,'Command: gobject activate'), +(389,'Command: gobject add'), +(390,'Command: gobject add temp'), +(391,'Command: gobject delete'), +(392,'Command: gobject info'), +(393,'Command: gobject move'), +(394,'Command: gobject near'), +(395,'Command: gobject set'), +(396,'Command: gobject set phase'), +(397,'Command: gobject set state'), +(398,'Command: gobject target'), +(399,'Command: gobject turn'), +(400,'Command: debug transport'), +(401,'Command: guild'), +(402,'Command: guild create'), +(403,'Command: guild delete'), +(404,'Command: guild invite'), +(405,'Command: guild uninvite'), +(406,'Command: guild rank'), +(407,'Command: guild rename'), +(408,'Command: honor'), +(409,'Command: honor add'), +(410,'Command: honor add kill'), +(411,'Command: honor update'), +(412,'Command: instance'), +(413,'Command: instance listbinds'), +(414,'Command: instance unbind'), +(415,'Command: instance stats'), +(416,'Command: instance savedata'), +(417,'Command: learn'), +(418,'Command: learn all'), +(419,'Command: learn all my'), +(420,'Command: learn all my class'), +(421,'Command: learn all my pettalents'), +(422,'Command: learn all my spells'), +(423,'Command: learn all my talents'), +(424,'Command: learn all gm'), +(425,'Command: learn all crafts'), +(426,'Command: learn all default'), +(427,'Command: learn all lang'), +(428,'Command: learn all recipes'), +(429,'Command: unlearn'), +(430,'Command: lfg'), +(431,'Command: lfg player'), +(432,'Command: lfg group'), +(433,'Command: lfg queue'), +(434,'Command: lfg clean'), +(435,'Command: lfg options'), +(436,'Command: list'), +(437,'Command: list creature'), +(438,'Command: list item'), +(439,'Command: list object'), +(440,'Command: list auras'), +(441,'Command: list mail'), +(442,'Command: lookup'), +(443,'Command: lookup area'), +(444,'Command: lookup creature'), +(445,'Command: lookup event'), +(446,'Command: lookup faction'), +(447,'Command: lookup item'), +(448,'Command: lookup itemset'), +(449,'Command: lookup object'), +(450,'Command: lookup quest'), +(451,'Command: lookup player'), +(452,'Command: lookup player ip'), +(453,'Command: lookup player account'), +(454,'Command: lookup player email'), +(455,'Command: lookup skill'), +(456,'Command: lookup spell'), +(457,'Command: lookup spell id'), +(458,'Command: lookup taxinode'), +(459,'Command: lookup tele'), +(460,'Command: lookup title'), +(461,'Command: lookup map'), +(462,'Command: announce'), +(463,'Command: channel'), +(464,'Command: channel set'), +(465,'Command: channel set ownership'), +(466,'Command: gmannounce'), +(467,'Command: gmnameannounce'), +(468,'Command: gmnotify'), +(469,'Command: nameannounce'), +(470,'Command: notify'), +(471,'Command: whispers'), +(472,'Command: group'), +(473,'Command: group leader'), +(474,'Command: group disband'), +(475,'Command: group remove'), +(476,'Command: group join'), +(477,'Command: group list'), +(478,'Command: group summon'), +(479,'Command: pet'), +(480,'Command: pet create'), +(481,'Command: pet learn'), +(482,'Command: pet unlearn'), +(483,'Command: send'), +(484,'Command: send items'), +(485,'Command: send mail'), +(486,'Command: send message'), +(487,'Command: send money'), +(488,'Command: additem'), +(489,'Command: additemset'), +(490,'Command: appear'), +(491,'Command: aura'), +(492,'Command: bank'), +(493,'Command: bindsight'), +(494,'Command: combatstop'), +(495,'Command: cometome'), +(496,'Command: commands'), +(497,'Command: cooldown'), +(498,'Command: damage'), +(499,'Command: dev'), +(500,'Command: die'), +(501,'Command: dismount'), +(502,'Command: distance'), +(503,'Command: flusharenapoints'), +(504,'Command: freeze'), +(505,'Command: gps'), +(506,'Command: guid'), +(507,'Command: help'), +(508,'Command: hidearea'), +(509,'Command: itemmove'), +(510,'Command: kick'), +(511,'Command: linkgrave'), +(512,'Command: listfreeze'), +(513,'Command: maxskill'), +(514,'Command: movegens'), +(515,'Command: mute'), +(516,'Command: neargrave'), +(517,'Command: pinfo'), +(518,'Command: playall'), +(519,'Command: possess'), +(520,'Command: recall'), +(521,'Command: repairitems'), +(522,'Command: respawn'), +(523,'Command: revive'), +(524,'Command: saveall'), +(525,'Command: save'), +(526,'Command: setskill'), +(527,'Command: showarea'), +(528,'Command: summon'), +(529,'Command: unaura'), +(530,'Command: unbindsight'), +(531,'Command: unfreeze'), +(532,'Command: unmute'), +(533,'Command: unpossess'), +(534,'Command: unstuck'), +(535,'Command: wchange'), +(536,'Command: mmap'), +(537,'Command: mmap loadedtiles'), +(538,'Command: mmap loc'), +(539,'Command: mmap path'), +(540,'Command: mmap stats'), +(541,'Command: mmap testarea'), +(542,'Command: morph'), +(543,'Command: demorph'), +(544,'Command: modify'), +(545,'Command: modify arenapoints'), +(546,'Command: modify bit'), +(547,'Command: modify drunk'), +(548,'Command: modify energy'), +(549,'Command: modify faction'), +(550,'Command: modify gender'), +(551,'Command: modify honor'), +(552,'Command: modify hp'), +(553,'Command: modify mana'), +(554,'Command: modify money'), +(555,'Command: modify mount'), +(556,'Command: modify phase'), +(557,'Command: modify rage'), +(558,'Command: modify reputation'), +(559,'Command: modify runicpower'), +(560,'Command: modify scale'), +(561,'Command: modify speed'), +(562,'Command: modify speed all'), +(563,'Command: modify speed backwalk'), +(564,'Command: modify speed fly'), +(565,'Command: modify speed walk'), +(566,'Command: modify speed swim'), +(567,'Command: modify spell'), +(568,'Command: modify standstate'), +(569,'Command: modify talentpoints'), +(570,'Command: npc'), +(571,'Command: npc add'), +(572,'Command: npc add formation'), +(573,'Command: npc add item'), +(574,'Command: npc add move'), +(575,'Command: npc add temp'), +(576,'Command: npc add delete'), +(577,'Command: npc add delete item'), +(578,'Command: npc add follow'), +(579,'Command: npc add follow stop'), +(580,'Command: npc set'), +(581,'Command: npc set allowmove'), +(582,'Command: npc set entry'), +(583,'Command: npc set factionid'), +(584,'Command: npc set flag'), +(585,'Command: npc set level'), +(586,'Command: npc set link'), +(587,'Command: npc set model'), +(588,'Command: npc set movetype'), +(589,'Command: npc set phase'), +(590,'Command: npc set spawndist'), +(591,'Command: npc set spawntime'), +(592,'Command: npc set data'), +(593,'Command: npc info'), +(594,'Command: npc near'), +(595,'Command: npc move'), +(596,'Command: npc playemote'), +(597,'Command: npc say'), +(598,'Command: npc textemote'), +(599,'Command: npc whisper'), +(600,'Command: npc yell'), +(601,'Command: npc tame'), +(602,'Command: quest'), +(603,'Command: quest add'), +(604,'Command: quest complete'), +(605,'Command: quest remove'), +(606,'Command: quest reward'), +(607,'Command: reload'), +(608,'Command: reload access_requirement'), +(609,'Command: reload achievement_criteria_data'), +(610,'Command: reload achievement_reward'), +(611,'Command: reload all'), +(612,'Command: reload all achievement'), +(613,'Command: reload all area'), +(614,'Command: broadcast_text'), +(615,'Command: reload all gossips'), +(616,'Command: reload all item'), +(617,'Command: reload all locales'), +(618,'Command: reload all loot'), +(619,'Command: reload all npc'), +(620,'Command: reload all quest'), +(621,'Command: reload all scripts'), +(622,'Command: reload all spell'), +(623,'Command: reload areatrigger_involvedrelation'), +(624,'Command: reload areatrigger_tavern'), +(625,'Command: reload areatrigger_teleport'), +(626,'Command: reload auctions'), +(627,'Command: reload autobroadcast'), +(628,'Command: reload command'), +(629,'Command: reload conditions'), +(630,'Command: reload config'), +(631,'Command: reload battleground_template'), +(632,'Command: .mutehistory'), +(633,'Command: reload creature_linked_respawn'), +(634,'Command: reload creature_loot_template'), +(635,'Command: reload creature_onkill_reputation'), +(636,'Command: reload creature_questender'), +(637,'Command: reload creature_queststarter'), +(638,'Command: reload creature_summon_groups'), +(639,'Command: reload creature_template'), +(640,'Command: reload creature_text'), +(641,'Command: reload disables'), +(642,'Command: reload disenchant_loot_template'), +(643,'Command: reload event_scripts'), +(644,'Command: reload fishing_loot_template'), +(645,'Command: reload game_graveyard_zone'), +(646,'Command: reload game_tele'), +(647,'Command: reload gameobject_questender'), +(648,'Command: reload gameobject_loot_template'), +(649,'Command: reload gameobject_queststarter'), +(650,'Command: reload gm_tickets'), +(651,'Command: reload gossip_menu'), +(652,'Command: reload gossip_menu_option'), +(653,'Command: reload item_enchantment_template'), +(654,'Command: reload item_loot_template'), +(655,'Command: reload item_set_names'), +(656,'Command: reload lfg_dungeon_rewards'), +(657,'Command: reload locales_achievement_reward'), +(658,'Command: reload locales_creature'), +(659,'Command: reload locales_creature_text'), +(660,'Command: reload locales_gameobject'), +(661,'Command: reload locales_gossip_menu_option'), +(662,'Command: reload locales_item'), +(663,'Command: reload locales_item_set_name'), +(664,'Command: reload locales_npc_text'), +(665,'Command: reload locales_page_text'), +(666,'Command: reload locales_points_of_interest'), +(667,'Command: reload locales_quest'), +(668,'Command: reload mail_level_reward'), +(669,'Command: reload mail_loot_template'), +(670,'Command: reload milling_loot_template'), +(671,'Command: reload npc_spellclick_spells'), +(672,'Command: reload npc_trainer'), +(673,'Command: reload npc_vendor'), +(674,'Command: reload page_text'), +(675,'Command: reload pickpocketing_loot_template'), +(676,'Command: reload points_of_interest'), +(677,'Command: reload prospecting_loot_template'), +(678,'Command: reload quest_poi'), +(679,'Command: reload quest_template'), +(680,'Command: reload rbac'), +(681,'Command: reload reference_loot_template'), +(682,'Command: reload reserved_name'), +(683,'Command: reload reputation_reward_rate'), +(684,'Command: reload reputation_spillover_template'), +(685,'Command: reload skill_discovery_template'), +(686,'Command: reload skill_extra_item_template'), +(687,'Command: reload skill_fishing_base_level'), +(688,'Command: reload skinning_loot_template'), +(689,'Command: reload smart_scripts'), +(690,'Command: reload spell_required'), +(691,'Command: reload spell_area'), +(692,'Command: reload spell_bonus_data'), +(693,'Command: reload spell_group'), +(694,'Command: reload spell_learn_spell'), +(695,'Command: reload spell_loot_template'), +(696,'Command: reload spell_linked_spell'), +(697,'Command: reload spell_pet_auras'), +(698,'Command: character changeaccount'), +(699,'Command: reload spell_proc'), +(700,'Command: reload spell_scripts'), +(701,'Command: reload spell_target_position'), +(702,'Command: reload spell_threats'), +(703,'Command: reload spell_group_stack_rules'), +(704,'Command: reload trinity_string'), +(705,'Command: reload warden_action'), +(706,'Command: reload waypoint_scripts'), +(707,'Command: reload waypoint_data'), +(708,'Command: reload vehicle_accessory'), +(709,'Command: reload vehicle_template_accessory'), +(710,'Command: reset'), +(711,'Command: reset achievements'), +(712,'Command: reset honor'), +(713,'Command: reset level'), +(714,'Command: reset spells'), +(715,'Command: reset stats'), +(716,'Command: reset talents'), +(717,'Command: reset all'), +(718,'Command: server'), +(719,'Command: server corpses'), +(720,'Command: server exit'), +(721,'Command: server idlerestart'), +(722,'Command: server idlerestart cancel'), +(723,'Command: server idleshutdown'), +(724,'Command: server idleshutdown cancel'), +(725,'Command: server info'), +(726,'Command: server plimit'), +(727,'Command: server restart'), +(728,'Command: server restart cancel'), +(729,'Command: server set'), +(730,'Command: server set closed'), +(731,'Command: server set difftime'), +(732,'Command: server set loglevel'), +(733,'Command: server set motd'), +(734,'Command: server shutdown'), +(735,'Command: server shutdown cancel'), +(736,'Command: server motd'), +(737,'Command: tele'), +(738,'Command: tele add'), +(739,'Command: tele del'), +(740,'Command: tele name'), +(741,'Command: tele group'), +(742,'Command: ticket'), +(743,'Command: ticket assign'), +(744,'Command: ticket close'), +(745,'Command: ticket closedlist'), +(746,'Command: ticket comment'), +(747,'Command: ticket complete'), +(748,'Command: ticket delete'), +(749,'Command: ticket escalate'), +(750,'Command: ticket escalatedlist'), +(751,'Command: ticket list'), +(752,'Command: ticket onlinelist'), +(753,'Command: ticket reset'), +(754,'Command: ticket response'), +(755,'Command: ticket response append'), +(756,'Command: ticket response appendln'), +(757,'Command: ticket togglesystem'), +(758,'Command: ticket unassign'), +(759,'Command: ticket viewid'), +(760,'Command: ticket viewname'), +(761,'Command: titles'), +(762,'Command: titles add'), +(763,'Command: titles current'), +(764,'Command: titles remove'), +(765,'Command: titles set'), +(766,'Command: titles set mask'), +(767,'Command: wp'), +(768,'Command: wp add'), +(769,'Command: wp event'), +(770,'Command: wp load'), +(771,'Command: wp modify'), +(772,'Command: wp unload'), +(773,'Command: wp reload'), +(774,'Command: wp show'), +(777,'Command: mailbox'), +(778,'Command: ahbot'), +(779,'Command: ahbot items'), +(780,'Command: ahbot items gray'), +(781,'Command: ahbot items white'), +(782,'Command: ahbot items green'), +(783,'Command: ahbot items blue'), +(784,'Command: ahbot items purple'), +(785,'Command: ahbot items orange'), +(786,'Command: ahbot items yellow'), +(787,'Command: ahbot ratio'), +(788,'Command: ahbot ratio alliance'), +(789,'Command: ahbot ratio horde'), +(790,'Command: ahbot ratio neutral'), +(791,'Command: ahbot rebuild'), +(792,'Command: ahbot reload'), +(793,'Command: ahbot status'), +(794,'Command: guild info'), +(835,'Command: debug loadcells'), +(836,'Command: debug boundary'), +(837,'Command: npc evade'), +(838,'Command: pet level'), +(839,'Command: server shutdown force'), +(840,'Command: server restart force'), +(841,'Command: debug neargraveyard'), +(845,'Command: go offset'), +(855,'Command: debug play music'), +(856,'Command: npc spawngroup'), +(857,'Command: npc despawngroup'), +(858,'Command: gobject spawngroup'), +(859,'Command: gobject despawngroup'), +(860,'Command: list respawns'), +(861,'Command: group set'), +(862,'Command: group set assistant'), +(863,'Command: group set maintank'), +(864,'Command: group set mainassist'), +(865,'Command: npc showloot'), +(867,'Command: reload quest_greeting_locale'); /*!40000 ALTER TABLE `rbac_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -688,7 +1996,9 @@ INSERT INTO `updates` VALUES ('2017_10_16_00_auth.sql','50ABC07082EA6B0578B034BB30EBBCDDDDF7AD45','ARCHIVED','2017-10-16 01:40:04',0), ('2017_10_29_00_auth.sql','F742569F56BB29CE9C8DBBD40A6AB474F846485C','ARCHIVED','2017-10-29 01:40:04',0), ('2017_11_08_00_auth.sql','DB37CC4B077D6C2413F4091E48C3382411F59228','ARCHIVED','2017-11-08 01:40:04',0), -('2017_11_15_00_auth.sql','BF17A1BAF2C3B5A64AEB4DC9C0E46508AA704129','ARCHIVED','2017-10-16 01:40:04',0); +('2017_11_15_00_auth.sql','BF17A1BAF2C3B5A64AEB4DC9C0E46508AA704129','ARCHIVED','2017-10-16 01:40:04',0), +('2017_11_16_00_auth.sql','A53D70B4DB8686AB3A0B0E62471717F4F3902ADD','ARCHIVED','2017-11-16 01:40:04',0), +('2017_12_17_00_auth.sql','E2EC5999D5305FC12EA576D08EFB95D1660DCF4D','ARCHIVED','2017-12-17 01:40:04',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 19eb0e0926..f9041f2ea7 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2873,7 +2873,8 @@ INSERT INTO `updates` VALUES ('2017_10_16_00_characters.sql','74500AFF41A5FB2EEE24B0BFAD750C988136BA6B','ARCHIVED','2017-10-16 00:00:00',0), ('2017_11_15_00_characters.sql','22D0C3854EE6D0983CD8C43DF0AC4269386F587C','ARCHIVED','2017-11-15 00:00:00',0), ('2017_11_26_00_characters.sql','4609CDC122E0A7F27A09C2605B329A06FC7FB7C2','ARCHIVED','2017-11-27 00:00:00',0), -('2017_11_28_00_characters.sql','6FF1F84B8985ADFC7FF97F0BF8E53403CF13C320','ARCHIVED','2017-11-28 00:00:00',0); +('2017_11_28_00_characters.sql','6FF1F84B8985ADFC7FF97F0BF8E53403CF13C320','ARCHIVED','2017-11-28 00:00:00',0), +('2017_12_17_00_characters.sql','937E8F51DC74AC41FF8F213CE36C69DDEB878D6A','ARCHIVED','2017-12-17 00:00:00',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/4.3.4/2017_11_15_00_auth.sql b/sql/old/4.3.4/auth/24_2017_12_17/2017_11_15_00_auth.sql similarity index 100% rename from sql/updates/auth/4.3.4/2017_11_15_00_auth.sql rename to sql/old/4.3.4/auth/24_2017_12_17/2017_11_15_00_auth.sql diff --git a/sql/old/4.3.4/auth/24_2017_12_17/2017_12_16_00_auth.sql b/sql/old/4.3.4/auth/24_2017_12_17/2017_12_16_00_auth.sql new file mode 100644 index 0000000000..c25e423261 --- /dev/null +++ b/sql/old/4.3.4/auth/24_2017_12_17/2017_12_16_00_auth.sql @@ -0,0 +1,2 @@ +-- +UPDATE `rbac_linked_permissions` SET `id` = 197 WHERE `linkedId` = 501; diff --git a/sql/updates/characters/4.3.4/2017_11_15_00_characters.sql b/sql/old/4.3.4/characters/24_2017_12_17/2017_11_15_00_characters.sql similarity index 100% rename from sql/updates/characters/4.3.4/2017_11_15_00_characters.sql rename to sql/old/4.3.4/characters/24_2017_12_17/2017_11_15_00_characters.sql diff --git a/sql/updates/characters/4.3.4/2017_11_26_00_characters.sql b/sql/old/4.3.4/characters/24_2017_12_17/2017_11_26_00_characters.sql similarity index 100% rename from sql/updates/characters/4.3.4/2017_11_26_00_characters.sql rename to sql/old/4.3.4/characters/24_2017_12_17/2017_11_26_00_characters.sql diff --git a/sql/updates/characters/4.3.4/2017_11_28_00_characters.sql b/sql/old/4.3.4/characters/24_2017_12_17/2017_11_28_00_characters.sql similarity index 100% rename from sql/updates/characters/4.3.4/2017_11_28_00_characters.sql rename to sql/old/4.3.4/characters/24_2017_12_17/2017_11_28_00_characters.sql diff --git a/sql/updates/world/4.3.4/2017_11_15_20_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_15_20_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_15_20_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_15_20_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_15_21_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_15_21_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_15_21_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_15_21_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_00_world_from_master_was_2017_11_15_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_00_world_from_master_was_2017_11_15_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_00_world_from_master_was_2017_11_15_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_00_world_from_master_was_2017_11_15_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_01_world_from_master_was_2017_11_16_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_01_world_from_master_was_2017_11_16_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_01_world_from_master_was_2017_11_16_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_01_world_from_master_was_2017_11_16_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_02_world_from_master_was_2017_11_16_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_02_world_from_master_was_2017_11_16_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_02_world_from_master_was_2017_11_16_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_02_world_from_master_was_2017_11_16_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_03_world_from_master_was_2017_11_16_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_03_world_from_master_was_2017_11_16_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_03_world_from_master_was_2017_11_16_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_03_world_from_master_was_2017_11_16_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_04_world_from_335_was_2017_11_16_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_04_world_from_335_was_2017_11_16_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_04_world_from_335_was_2017_11_16_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_04_world_from_335_was_2017_11_16_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_05_world_from_335_was_2017_11_16_01_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_05_world_from_335_was_2017_11_16_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_05_world_from_335_was_2017_11_16_01_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_05_world_from_335_was_2017_11_16_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_06_world_from_335_was_2017_11_16_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_06_world_from_335_was_2017_11_16_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_06_world_from_335_was_2017_11_16_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_06_world_from_335_was_2017_11_16_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_07_world_from_335_was_2017_11_16_03_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_07_world_from_335_was_2017_11_16_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_07_world_from_335_was_2017_11_16_03_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_07_world_from_335_was_2017_11_16_03_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_08_world_from_335_was_2017_11_16_04_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_08_world_from_335_was_2017_11_16_04_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_08_world_from_335_was_2017_11_16_04_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_08_world_from_335_was_2017_11_16_04_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_09_world_from_335_was_2017_11_16_05_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_09_world_from_335_was_2017_11_16_05_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_09_world_from_335_was_2017_11_16_05_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_09_world_from_335_was_2017_11_16_05_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_10_world_from_335_was_2017_11_16_06_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_10_world_from_335_was_2017_11_16_06_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_10_world_from_335_was_2017_11_16_06_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_10_world_from_335_was_2017_11_16_06_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_11_world_from_335_was_2017_11_16_07_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_11_world_from_335_was_2017_11_16_07_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_11_world_from_335_was_2017_11_16_07_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_11_world_from_335_was_2017_11_16_07_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_12_world_from_335_was_2017_11_16_08_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_12_world_from_335_was_2017_11_16_08_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_12_world_from_335_was_2017_11_16_08_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_12_world_from_335_was_2017_11_16_08_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_13_world_from_335_was_2017_11_16_09_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_13_world_from_335_was_2017_11_16_09_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_13_world_from_335_was_2017_11_16_09_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_13_world_from_335_was_2017_11_16_09_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_14_world_from_master_was_2017_11_16_03_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_14_world_from_master_was_2017_11_16_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_14_world_from_master_was_2017_11_16_03_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_14_world_from_master_was_2017_11_16_03_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_15_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_15_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_15_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_15_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_16_16_world_from_335_was_2017_11_16_10_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_16_16_world_from_335_was_2017_11_16_10_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_16_16_world_from_335_was_2017_11_16_10_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_16_16_world_from_335_was_2017_11_16_10_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_00_world_from_335_was_2017_11_17_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_00_world_from_335_was_2017_11_17_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_00_world_from_335_was_2017_11_17_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_00_world_from_335_was_2017_11_17_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_01_world_from_335_was_2017_11_17_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_01_world_from_335_was_2017_11_17_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_01_world_from_335_was_2017_11_17_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_01_world_from_335_was_2017_11_17_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_02_world_from_335_was_2017_11_17_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_02_world_from_335_was_2017_11_17_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_02_world_from_335_was_2017_11_17_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_02_world_from_335_was_2017_11_17_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_03_world_from_335_was_2017_11_17_03_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_03_world_from_335_was_2017_11_17_03_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_03_world_from_335_was_2017_11_17_03_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_03_world_from_335_was_2017_11_17_03_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_04_world_from_335_was_2017_11_17_04_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_04_world_from_335_was_2017_11_17_04_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_04_world_from_335_was_2017_11_17_04_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_04_world_from_335_was_2017_11_17_04_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_05_world_from_335_was_2017_11_17_05_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_05_world_from_335_was_2017_11_17_05_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_05_world_from_335_was_2017_11_17_05_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_05_world_from_335_was_2017_11_17_05_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_06_world_from_335_was_2017_11_17_06_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_06_world_from_335_was_2017_11_17_06_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_06_world_from_335_was_2017_11_17_06_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_06_world_from_335_was_2017_11_17_06_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_07_world_from_335_was_2017_11_17_07_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_07_world_from_335_was_2017_11_17_07_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_07_world_from_335_was_2017_11_17_07_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_07_world_from_335_was_2017_11_17_07_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_08_world_from_335_was_2017_11_17_08_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_08_world_from_335_was_2017_11_17_08_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_08_world_from_335_was_2017_11_17_08_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_08_world_from_335_was_2017_11_17_08_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_09_world_from_335_was_2017_11_17_09_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_09_world_from_335_was_2017_11_17_09_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_09_world_from_335_was_2017_11_17_09_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_09_world_from_335_was_2017_11_17_09_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_10_world_from_335_was_2017_11_17_10_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_10_world_from_335_was_2017_11_17_10_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_10_world_from_335_was_2017_11_17_10_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_10_world_from_335_was_2017_11_17_10_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_11_world_from_335_was_2017_11_17_11_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_11_world_from_335_was_2017_11_17_11_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_11_world_from_335_was_2017_11_17_11_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_11_world_from_335_was_2017_11_17_11_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_17_12_world_from_335_was_2017_11_17_12_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_17_12_world_from_335_was_2017_11_17_12_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_17_12_world_from_335_was_2017_11_17_12_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_17_12_world_from_335_was_2017_11_17_12_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_19_00_world_from_335_was_2017_11_19_00_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_19_00_world_from_335_was_2017_11_19_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_19_00_world_from_335_was_2017_11_19_00_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_19_00_world_from_335_was_2017_11_19_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_19_01_world_from_335_was_2017_11_19_01_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_19_01_world_from_335_was_2017_11_19_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_19_01_world_from_335_was_2017_11_19_01_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_19_01_world_from_335_was_2017_11_19_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_19_02_world_from_335_was_2017_11_19_02_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_19_02_world_from_335_was_2017_11_19_02_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_19_02_world_from_335_was_2017_11_19_02_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_19_02_world_from_335_was_2017_11_19_02_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_20_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_20_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_20_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_20_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_21_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_21_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_21_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_21_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_00_world_from_335_was_2017_11_20_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_00_world_from_335_was_2017_11_20_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_00_world_from_335_was_2017_11_20_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_00_world_from_335_was_2017_11_20_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_01_world_from_335_was_2017_11_21_00_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_01_world_from_335_was_2017_11_21_00_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_01_world_from_335_was_2017_11_21_00_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_01_world_from_335_was_2017_11_21_00_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_02_world_from_335_was_2017_11_21_01_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_02_world_from_335_was_2017_11_21_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_02_world_from_335_was_2017_11_21_01_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_02_world_from_335_was_2017_11_21_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_03_world_from_335_was_2017_11_21_02_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_03_world_from_335_was_2017_11_21_02_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_03_world_from_335_was_2017_11_21_02_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_03_world_from_335_was_2017_11_21_02_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_04_world_from_335_was_2017_11_21_03_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_04_world_from_335_was_2017_11_21_03_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_04_world_from_335_was_2017_11_21_03_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_04_world_from_335_was_2017_11_21_03_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_05_world_from_335_was_2017_11_21_04_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_05_world_from_335_was_2017_11_21_04_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_05_world_from_335_was_2017_11_21_04_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_05_world_from_335_was_2017_11_21_04_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_06_world_from_335_was_2017_11_21_05_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_06_world_from_335_was_2017_11_21_05_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_06_world_from_335_was_2017_11_21_05_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_06_world_from_335_was_2017_11_21_05_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_07_world_from_335_was_2017_11_21_06_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_07_world_from_335_was_2017_11_21_06_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_07_world_from_335_was_2017_11_21_06_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_07_world_from_335_was_2017_11_21_06_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_08_world_from_335_was_2017_11_21_07_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_08_world_from_335_was_2017_11_21_07_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_08_world_from_335_was_2017_11_21_07_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_08_world_from_335_was_2017_11_21_07_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_09_world_from_335_was_2017_11_21_08_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_09_world_from_335_was_2017_11_21_08_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_09_world_from_335_was_2017_11_21_08_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_09_world_from_335_was_2017_11_21_08_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_10_world_from_335_was_2017_11_21_09_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_10_world_from_335_was_2017_11_21_09_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_10_world_from_335_was_2017_11_21_09_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_10_world_from_335_was_2017_11_21_09_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_11_world_from_master_was_2017_11_22_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_11_world_from_master_was_2017_11_22_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_11_world_from_master_was_2017_11_22_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_11_world_from_master_was_2017_11_22_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_12_world_from_335_was_2017_11_22_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_12_world_from_335_was_2017_11_22_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_12_world_from_335_was_2017_11_22_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_12_world_from_335_was_2017_11_22_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_22_13_world_from_335_was_2017_11_22_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_22_13_world_from_335_was_2017_11_22_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_22_13_world_from_335_was_2017_11_22_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_22_13_world_from_335_was_2017_11_22_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_23_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_23_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_23_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_23_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_23_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_23_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_23_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_23_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_24_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_24_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_24_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_24_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_00_world_from_335_was_2017_11_22_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_25_00_world_from_335_was_2017_11_22_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_25_00_world_from_335_was_2017_11_22_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_25_00_world_from_335_was_2017_11_22_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_01_world_from_335_was_2017_11_22_03_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_25_01_world_from_335_was_2017_11_22_03_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_25_01_world_from_335_was_2017_11_22_03_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_25_01_world_from_335_was_2017_11_22_03_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_02_world_from_335_was_2017_11_22_04_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_25_02_world_from_335_was_2017_11_22_04_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_25_02_world_from_335_was_2017_11_22_04_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_25_02_world_from_335_was_2017_11_22_04_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_03_world_from_335_was_2017_11_24_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_25_03_world_from_335_was_2017_11_24_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_25_03_world_from_335_was_2017_11_24_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_25_03_world_from_335_was_2017_11_24_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_04_world_from_335_was_2017_11_25_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_25_04_world_from_335_was_2017_11_25_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_25_04_world_from_335_was_2017_11_25_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_25_04_world_from_335_was_2017_11_25_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_05_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_25_05_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_25_05_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_25_05_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_26_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_26_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_26_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_26_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_26_01_world_from_335_was_2017_11_26_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_26_01_world_from_335_was_2017_11_26_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_26_01_world_from_335_was_2017_11_26_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_26_01_world_from_335_was_2017_11_26_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_27_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_27_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_27_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_27_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_27_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_27_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_27_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_27_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_27_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_27_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_27_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_27_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_00_world_from_335_was_2017_11_28_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_00_world_from_335_was_2017_11_28_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_00_world_from_335_was_2017_11_28_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_00_world_from_335_was_2017_11_28_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_01_world_from_335_was_2017_11_28_01_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_01_world_from_335_was_2017_11_28_01_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_01_world_from_335_was_2017_11_28_01_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_01_world_from_335_was_2017_11_28_01_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_02_world_from_335_was_2017_11_28_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_02_world_from_335_was_2017_11_28_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_02_world_from_335_was_2017_11_28_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_02_world_from_335_was_2017_11_28_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_03_world_from_335_was_2017_11_28_03_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_03_world_from_335_was_2017_11_28_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_03_world_from_335_was_2017_11_28_03_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_03_world_from_335_was_2017_11_28_03_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_04_world_from_335_was_2017_11_28_04_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_04_world_from_335_was_2017_11_28_04_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_04_world_from_335_was_2017_11_28_04_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_04_world_from_335_was_2017_11_28_04_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_05_world_from_335_was_2017_11_28_05_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_05_world_from_335_was_2017_11_28_05_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_05_world_from_335_was_2017_11_28_05_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_05_world_from_335_was_2017_11_28_05_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_06_world_from_335_was_2017_11_28_06_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_06_world_from_335_was_2017_11_28_06_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_06_world_from_335_was_2017_11_28_06_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_06_world_from_335_was_2017_11_28_06_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_07_world_from_335_was_2017_11_28_07_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_07_world_from_335_was_2017_11_28_07_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_07_world_from_335_was_2017_11_28_07_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_07_world_from_335_was_2017_11_28_07_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_08_world_from_335_was_2017_11_28_08_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_08_world_from_335_was_2017_11_28_08_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_08_world_from_335_was_2017_11_28_08_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_08_world_from_335_was_2017_11_28_08_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_09_world_from_335_was_2017_11_28_09_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_09_world_from_335_was_2017_11_28_09_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_09_world_from_335_was_2017_11_28_09_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_09_world_from_335_was_2017_11_28_09_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_10_world_from_335_was_2017_11_28_10_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_10_world_from_335_was_2017_11_28_10_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_10_world_from_335_was_2017_11_28_10_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_10_world_from_335_was_2017_11_28_10_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_11_world_from_335_was_2017_11_28_11_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_11_world_from_335_was_2017_11_28_11_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_11_world_from_335_was_2017_11_28_11_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_11_world_from_335_was_2017_11_28_11_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_12_world_from_335_was_2017_11_28_12_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_12_world_from_335_was_2017_11_28_12_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_12_world_from_335_was_2017_11_28_12_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_12_world_from_335_was_2017_11_28_12_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_13_world_from_335_was_2017_11_28_13_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_13_world_from_335_was_2017_11_28_13_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_13_world_from_335_was_2017_11_28_13_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_13_world_from_335_was_2017_11_28_13_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_14_world_from_335_was_2017_11_28_14_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_14_world_from_335_was_2017_11_28_14_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_14_world_from_335_was_2017_11_28_14_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_14_world_from_335_was_2017_11_28_14_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_15_world_from_335_was_2017_11_28_15_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_15_world_from_335_was_2017_11_28_15_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_15_world_from_335_was_2017_11_28_15_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_15_world_from_335_was_2017_11_28_15_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_16_world_from_335_was_2017_11_28_17_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_16_world_from_335_was_2017_11_28_17_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_16_world_from_335_was_2017_11_28_17_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_16_world_from_335_was_2017_11_28_17_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_17_world_from_335_was_2017_11_28_18_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_17_world_from_335_was_2017_11_28_18_world_335.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_17_world_from_335_was_2017_11_28_18_world_335.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_17_world_from_335_was_2017_11_28_18_world_335.sql diff --git a/sql/updates/world/4.3.4/2017_11_28_18_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_28_18_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_28_18_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_28_18_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_00_world_from_335_was_2017_11_29_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_00_world_from_335_was_2017_11_29_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_00_world_from_335_was_2017_11_29_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_00_world_from_335_was_2017_11_29_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_03_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_03_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_03_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_04_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_04_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_04_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_04_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_05_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_05_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_05_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_05_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_06_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_06_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_06_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_06_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_07_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_07_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_07_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_07_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_08_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_08_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_08_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_08_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_09_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_09_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_09_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_09_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_10_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_10_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_10_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_10_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_11_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_11_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_11_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_11_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_12_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_12_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_12_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_12_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_13_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_13_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_13_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_13_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_14_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_14_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_14_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_14_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_15_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_15_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_15_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_15_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_16_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_16_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_16_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_16_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_30_17_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_11_30_17_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_11_30_17_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_11_30_17_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_03_world_from_335_was_2017_11_30_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_03_world_from_335_was_2017_11_30_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_03_world_from_335_was_2017_11_30_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_03_world_from_335_was_2017_11_30_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_04_world_from_335_was_2017_11_30_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_04_world_from_335_was_2017_11_30_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_04_world_from_335_was_2017_11_30_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_04_world_from_335_was_2017_11_30_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_05_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_05_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_05_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_05_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_01_06_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_01_06_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_01_06_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_01_06_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_02_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_02_00_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_02_00_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_02_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_02_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_02_01_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_02_01_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_02_01_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_02_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_02_02_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_02_02_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_02_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_12_02_03_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_02_03_world.sql similarity index 100% rename from sql/updates/world/4.3.4/2017_12_02_03_world.sql rename to sql/old/4.3.4/world/24_2017_12_17/2017_12_02_03_world.sql diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_03_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_03_00_world.sql new file mode 100644 index 0000000000..0d1715b2d8 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_03_00_world.sql @@ -0,0 +1 @@ +-- DELETE FROM `spell_dbc` WHERE `Effect1` >= 165 OR `Effect2` >= 165 OR `Effect3` >= 165 OR `EffectApplyAuraName1` >= 317 OR `EffectApplyAuraName2` >= 317 OR `EffectApplyAuraName3` >= 317 OR `EffectImplicitTargetA1` >= 111 OR `EffectImplicitTargetA2` >= 111 OR `EffectImplicitTargetA3` >= 111 OR `EffectImplicitTargetB1` >= 111 OR `EffectImplicitTargetB2` >= 111 OR `EffectImplicitTargetB3` >= 111; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_03_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_03_01_world.sql new file mode 100644 index 0000000000..642be9b12a --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_03_01_world.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `spell_proc` WHERE `SpellID` IN (-11213, 11213, 12574, 12575); +INSERT INTO `spell_proc` (`SpellID`, `SpellTypeMask`, `SpellPhaseMask`, `Chance`) VALUES +(11213, 1, 2, 3), +(12574, 1, 2, 6), +(12575, 1, 2, 10); + diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_04_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_04_00_world.sql new file mode 100644 index 0000000000..776d3e6221 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_04_00_world.sql @@ -0,0 +1,30 @@ +-- +DELETE FROM `game_event_gameobject` WHERE `guid` IN (220147, 220148, 220041, 220029, 220102, 220600, 224456, 220076, 220044, 220043, 220048, 220049, 220042, 220458, 220468, 220602, 220476, 220466, 220463, 220437, 220438, 220461); +INSERT INTO `game_event_gameobject` (`eventEntry`, `guid`) VALUES +(2, 220147), +(2, 220148), +(2, 220041), +(2, 220029), +(2, 220102), +(2, 220600), +(2, 224456), +(2, 220076), +(2, 220044), +(2, 220043), +(2, 220048), +(2, 220049), +(2, 220042), +(2, 220458), +(2, 220468), +(2, 220602), +(2, 220476), +(2, 220466), +(2, 220463), +(2, 220437), +(2, 220438), +(2, 220461); + +DELETE FROM `game_event_creature` WHERE `guid` IN (314484, 314040); +INSERT INTO `game_event_creature` (`eventEntry`, `guid`) VALUES +(2, 314484), +(2, 314040); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_04_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_04_01_world.sql new file mode 100644 index 0000000000..1b4f6c17b0 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_04_01_world.sql @@ -0,0 +1,88 @@ +-- +DELETE FROM `game_event_gameobject` WHERE `guid` IN (224436, 224389, 224438, 224391, 224447, 224395, 224397, 224399, 224440, 224401, 224443, 224386, 224393, 224458, 224457, 224461, 224460, 224459, 224403, 224448, 224409, 224413, 224415, 224417, 224419, 224453, 224422, 224424, 224445, 224427, 224429, 224431, 224434, 224452, 224435, 224433, 224446, 224430, 224432, 224428, 224405, 224411, 224451, 224426, 224423, 224425, 224444, 224421, 224420, 224449, 224418, 224416, 224414, 224442, 224412, 224410, 224408, 224455, 224407, 224406, 224404, 224402, 224398, 224450, 224396, 224394, 224392, 224390, 224439, 224388, 224385, 224454, 224387, 224383, 224384, 224437, 224400); +INSERT INTO `game_event_gameobject` (`eventEntry`, `guid`) VALUES +(2, 224436), +(2, 224389), +(2, 224438), +(2, 224391), +(2, 224447), +(2, 224395), +(2, 224397), +(2, 224399), +(2, 224440), +(2, 224401), +(2, 224443), +(2, 224386), +(2, 224393), +(2, 224458), +(2, 224457), +(2, 224461), +(2, 224460), +(2, 224459), +(2, 224403), +(2, 224405), +(2, 224448), +(2, 224409), +(2, 224411), +(2, 224413), +(2, 224415), +(2, 224417), +(2, 224419), +(2, 224453), +(2, 224422), +(2, 224424), +(2, 224445), +(2, 224427), +(2, 224429), +(2, 224431), +(2, 224434), +(2, 224452), +(2, 224435), +(2, 224433), +(2, 224446), +(2, 224430), +(2, 224432), +(2, 224428), +(2, 224451), +(2, 224426), +(2, 224423), +(2, 224425), +(2, 224444), +(2, 224421), +(2, 224420), +(2, 224449), +(2, 224418), +(2, 224416), +(2, 224414), +(2, 224442), +(2, 224412), +(2, 224410), +(2, 224408), +(2, 224455), +(2, 224407), +(2, 224406), +(2, 224404), +(2, 224402), +(2, 224398), +(2, 224450), +(2, 224396), +(2, 224394), +(2, 224392), +(2, 224390), +(2, 224439), +(2, 224388), +(2, 224385), +(2, 224454), +(2, 224387), +(2, 224383), +(2, 224384), +(2, 224437), +(2, 224400); + +DELETE FROM `game_event_creature` WHERE `guid` IN (358708, 358707, 358706, 358704, 358705); +INSERT INTO `game_event_creature` (`eventEntry`, `guid`) VALUES +(2, 358708), +(2, 358707), +(2, 358706), +(2, 358704), +(2, 358705); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_00_world_from_335_was_2017_12_04_00_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_00_world_from_335_was_2017_12_04_00_world_335.sql new file mode 100644 index 0000000000..9b9772cb48 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_00_world_from_335_was_2017_12_04_00_world_335.sql @@ -0,0 +1,2 @@ +-- Replace two Riverpaw Scouts with Riverpaw Shamans +-- UPDATE `creature` SET `id`=1065, `modelid`=204, `curhealth`=230, `curmana`=249 WHERE `guid` IN (86657, 86662); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_01_world_from_335_was_2017_12_04_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_01_world_from_335_was_2017_12_04_01_world.sql new file mode 100644 index 0000000000..258db74120 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_01_world_from_335_was_2017_12_04_01_world.sql @@ -0,0 +1,8 @@ +-- Add two Draenei Artificers +DELETE FROM `creature` WHERE `guid` IN (82823,82841); +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(82823, 17228, 530, 0, 0, 1, 1, 0, 1, -4191.44, -12464.07, 45.340, 3.7988, 300, 0, 0, 98, 115, 2, 0, 0, 0, 0), +(82841, 17228, 530, 0, 0, 1, 1, 0, 1, -4213.64, -12467.37, 45.464, 0.9833, 300, 0, 0, 98, 115, 0, 0, 0, 0, 0); + +-- Move script of Draenei Artificer from ID to specific GUID +UPDATE `smart_scripts` SET `entryorguid`=-61962 WHERE `entryorguid`=17228 AND `source_type`=0; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_02_world_from_335_was_2017_12_04_02_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_02_world_from_335_was_2017_12_04_02_world_335.sql new file mode 100644 index 0000000000..c919fd90ba --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_02_world_from_335_was_2017_12_04_02_world_335.sql @@ -0,0 +1,11 @@ +/* +-- Rigglefuzz +DELETE FROM `creature_text` WHERE `CreatureID`=2817; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(2817,0,0,"%s cooks up a batch of spicy hot buzzard wings for $n.",16,0,100,0,0,0,887,0,"Rigglefuzz"); + +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2817; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2817 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2817,0,0,0,20,0,100,0,703,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Rigglefuzz - On Quest 'Barbecued Buzzard Wings' Rewarded - Say Line 0"); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_03_world_from_335_was_2017_12_04_03_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_03_world_from_335_was_2017_12_04_03_world_335.sql new file mode 100644 index 0000000000..5b18c740f0 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_03_world_from_335_was_2017_12_04_03_world_335.sql @@ -0,0 +1,2 @@ +-- Parqual Fintallas +-- UPDATE `smart_scripts` SET `event_param1`=4764 WHERE `entryorguid`=4488 AND `source_type`=0 AND `id`=10; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_04_world_from_335_was_2017_12_04_04_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_04_world_from_335_was_2017_12_04_04_world_335.sql new file mode 100644 index 0000000000..f5960ecc2a --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_04_world_from_335_was_2017_12_04_04_world_335.sql @@ -0,0 +1,2 @@ +-- +-- UPDATE `creature` SET `MovementType`=0 WHERE `guid`=82823; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_05_world_from_335_was_2017_12_05_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_05_world_from_335_was_2017_12_05_00_world.sql new file mode 100644 index 0000000000..3707ef18f3 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_05_world_from_335_was_2017_12_05_00_world.sql @@ -0,0 +1,319 @@ +-- DK Starting Zone - phase 64 +-- Duplicates removed +DELETE FROM `creature` WHERE `guid` IN (130751,130657,130620,130670,130808,130674,130569,130599,130719,130565,130609,130566,130717,130741,130799,130821,130668,130667,130800,130708,130664,130750,130666,130807,130817,130814,130681,130822,130816,130673,130680,130672,130678,130684,130823); +DELETE FROM `creature_addon` WHERE `guid` IN (130751,130657,130620,130670,130808,130674,130569,130599,130719,130565,130609,130566,130717,130741,130799,130821,130668,130667,130800,130708,130664,130750,130666,130807,130817,130814,130681,130822,130816,130673,130680,130672,130678,130684,130823); +-- Rampaging Abomination +UPDATE `creature` SET `spawntimesecs` = 5, `spawndist` = 20, `movementType` = 1 WHERE `id` = 29115; +-- Volatile Ghoul +UPDATE `creature` SET `spawntimesecs` = 5 WHERE `id` = 29136; +UPDATE `creature` SET `position_x` = 2198.392090, `position_y` = -5828.402832, `position_z` = 101.502411 WHERE `guid` = 130923; +UPDATE `creature` SET `position_x` = 2175.717285, `position_y` = -5816.032715, `position_z` = 101.343269 WHERE `guid` = 130951; +UPDATE `creature` SET `position_x` = 2089.767090, `position_y` = -5782.844727, `position_z` = 99.5929110 WHERE `guid` = 130932; +UPDATE `creature` SET `position_x` = 2156.671875, `position_y` = -5757.208984, `position_z` = 100.663902 WHERE `guid` = 130949; +UPDATE `creature` SET `position_x` = 2238.655518, `position_y` = -5845.669434, `position_z` = 101.297417 WHERE `guid` = 130926; +UPDATE `creature` SET `position_x` = 2223.981934, `position_y` = -5862.010742, `position_z` = 101.434555 WHERE `guid` = 130937; +-- Crusaders +UPDATE `creature` SET `Spawndist` = 0, `MovementType` = 0 WHERE `guid` = 130616; +UPDATE `creature` SET `position_x` = 2171.041504, `position_y` = -5746.948242, `position_z` = 101.453552, `orientation` = 4.915133, `Spawndist` = 10, `MovementType` = 1 WHERE `guid` = 130665; +UPDATE `creature` SET `position_x` = 2021.283081, `position_y` = -5767.769043, `position_z` = 102.069725, `orientation` = 0.455777 WHERE `guid` = 130663; +UPDATE `creature` SET `position_x` = 1938.300537, `position_y` = -5806.917480, `position_z` = 100.326469, `orientation` = 0.036730 WHERE `guid` = 130669; +UPDATE `creature` SET `position_x` = 1822.585205, `position_y` = -5806.501465, `position_z` = 103.471199, `orientation` = 6.123573 WHERE `guid` = 130676; +UPDATE `creature` SET `position_x` = 1886.295898, `position_y` = -5815.069824, `position_z` = 102.595604, `orientation` = 0.085570 WHERE `guid` = 130803; +UPDATE `creature` SET `position_x` = 1919.796875, `position_y` = -5810.199707, `position_z` = 100.092346, `orientation` = 0.194942 WHERE `guid` = 130671; +UPDATE `creature` SET `position_x` = 2062.375000, `position_y` = -5827.616211, `position_z` = 101.632080, `orientation` = 6.049894 WHERE `guid` = 130789; +UPDATE `creature` SET `position_x` = 2062.264404, `position_y` = -5863.437988, `position_z` = 103.230919, `orientation` = 0.077718 WHERE `guid` = 130662; +UPDATE `creature` SET `position_x` = 1847.384644, `position_y` = -5861.911621, `position_z` = 102.175438, `orientation` = 6.141752 WHERE `guid` = 130679; +UPDATE `creature` SET `position_x` = 1872.653320, `position_y` = -5855.841309, `position_z` = 102.853523, `orientation` = 0.010887 WHERE `guid` = 130811; +UPDATE `creature` SET `position_x` = 1887.613525, `position_y` = -5854.142578, `position_z` = 102.406212, `orientation` = 0.058871 WHERE `guid` = 130809; +UPDATE `creature` SET `position_x` = 1897.007813, `position_y` = -5852.924805, `position_z` = 101.451141, `orientation` = 0.009392 WHERE `guid` = 130805; +UPDATE `creature` SET `position_x` = 1919.654297, `position_y` = -5846.907715, `position_z` = 100.235977, `orientation` = 0.124753 WHERE `guid` = 130804; +UPDATE `creature` SET `position_x` = 1935.207397, `position_y` = -5843.156250, `position_z` = 100.510971, `orientation` = 0.203284 WHERE `guid` = 130810; +UPDATE `creature` SET `position_x` = 2105.251221, `position_y` = -5900.707031, `position_z` = 104.638618, `orientation` = 6.202802 WHERE `guid` = 130754; +UPDATE `creature` SET `position_x` = 1982.372559, `position_y` = -5917.364258, `position_z` = 104.190681, `orientation` = 0.246334 WHERE `guid` = 130801; +UPDATE `creature` SET `position_x` = 1928.129761, `position_y` = -5933.635742, `position_z` = 103.063942, `orientation` = 6.162736 WHERE `guid` = 130677; +UPDATE `creature` SET `position_x` = 1888.227783, `position_y` = -5932.001465, `position_z` = 104.198326, `orientation` = 0.181147 WHERE `guid` = 130802; +UPDATE `creature` SET `position_x` = 1887.905151, `position_y` = -5911.649414, `position_z` = 102.921516, `orientation` = 0.015411 WHERE `guid` = 130813; +UPDATE `creature` SET `position_x` = 1846.163696, `position_y` = -5901.961426, `position_z` = 104.819687, `orientation` = 0.024871 WHERE `guid` = 130675; +UPDATE `creature` SET `position_x` = 1860.970825, `position_y` = -5927.291504, `position_z` = 104.586868, `orientation` = 0.181141 WHERE `guid` = 130825; +-- Waypoints +UPDATE `creature` SET `spawntimesecs` = 30, `Spawndist` = 0, `MovementType` = 2 WHERE `guid` IN (130615,130653,130788,130791,130820,130663,130669,130819,130676,130812,130803,130806,130671,130789,130662,130679,130811,130809,130805,130804,130810,130754,130801,130677,130802,130813,130675,130825); +DELETE FROM `creature_addon` WHERE `guid` IN (130615,130653,130788,130791,130820,130663,130669,130819,130676,130812,130803,130806,130671,130789,130662,130679,130811,130809,130805,130804,130810,130754,130801,130677,130802,130813,130675,130825); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(130615,1306150,0,0,1, 0,''), +(130653,1306530,0,0,1, 0,''), +(130788,1307880,0,0,1, 0,''), +(130791,1307910,0,0,1, 0,''), +(130820,1308200,0,0,1, 0,''), +(130663,1306630,0,0,1, 0,''), +(130669,1306690,0,0,1, 0,''), +(130819,1308190,0,0,1, 0,''), +(130676,1306760,0,0,1, 0,''), +(130812,1308120,0,0,1, 0,''), +(130803,1308030,0,0,1, 0,''), +(130806,1308060,0,0,1, 0,''), +(130671,1306710,0,0,1, 0,''), +(130789,1307890,0,0,1, 0,''), +(130662,1306620,0,0,1, 0,''), +(130679,1306790,0,0,1, 0,''), +(130811,1308110,0,0,1, 0,''), +(130809,1308090,0,0,1, 0,''), +(130805,1308050,0,0,1, 0,''), +(130804,1308040,0,0,1, 0,''), +(130810,1308100,0,0,1, 0,''), +(130754,1307540,0,0,1, 0,''), +(130801,1308010,0,0,1, 0,''), +(130677,1306770,0,0,1, 0,''), +(130802,1308020,0,0,1, 0,''), +(130813,1308130,0,0,1, 0,''), +(130675,1306750,0,0,1, 0,''), +(130825,1308250,0,0,1, 0,''); +DELETE FROM `waypoint_data` WHERE `id` IN (1306150,1306530,1307880,1307910,1308200,1306630,1306690,1308190,1306760,1308120,1308030,1308060,1306710,1307890,1306620,1306790,1308110,1308090,1308050,1308040,1308100,1307540,1308010,1306770,1308020,1308130,1306750,1308250); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `delay`, `action`, `orientation`, `action_chance`, `move_type`) VALUES +(1308200,1,2110.63,-5730.45,100.176,1500,0,4.8397,100,1), +(1308200,2,2122.33,-5722.27,100.328,0,0,0.410476,100,1), +(1308200,3,2139.85,-5717.74,100.963,0,0,0.558131,100,1), +(1308200,4,2169.78,-5698.14,106.245,0,0,0.644525,100,1), +(1308200,5,2201.61,-5670.41,116.544,0,0,0.691649,100,1), +(1308200,6,2221.2,-5654.19,126.493,0,0,0.49687,100,1), +(1308200,7,2247.14,-5647.54,134.152,0,0,0.100244,100,1), +(1308200,8,2281.82,-5649.43,144.037,10000,1188,6.15959,100,1), +(1306150,1,2082.57,-5729.92,100.968,1500,0,-3.0862,100,1), +(1306150,2,2120.29,-5721.2,100.326,0,0,0.206275,100,1), +(1306150,3,2144.6,-5714.86,101.333,0,0,0.611541,100,1), +(1306150,4,2164.79,-5698.69,105.338,0,0,0.701862,100,1), +(1306150,5,2185.95,-5676.26,112.802,0,0,0.862868,100,1), +(1306150,6,2205.62,-5656.75,121.586,0,0,0.752912,100,1), +(1306150,7,2235.14,-5646.35,131.467,0,0,0.214915,100,1), +(1306150,8,2282.81,-5638.38,145.358,10000,1188,0.210988,100,1), +(1307880,1,2076.79,-5733.08,100.771,1500,0,0.948046,100,1), +(1307880,2,2105.55,-5727.9,100.32,0,0,0.301308,100,1), +(1307880,3,2146.32,-5717.57,101.241,0,0,0.577768,100,1), +(1307880,4,2176.44,-5699.26,106.766,0,0,0.485091,100,1), +(1307880,5,2197.89,-5686.52,111.027,0,0,0.593476,100,1), +(1307880,6,2213.47,-5677.43,117.313,0,0,0.628819,100,1), +(1307880,7,2227.61,-5672.47,125.733,0,0,0.150511,100,1), +(1307880,8,2241.09,-5668.24,133.771,0,0,0.150512,100,1), +(1307880,9,2251.19,-5671.61,140.211,0,0,6.05592,100,1), +(1307880,10,2260.7,-5667.87,139.602,0,0,0.602901,100,1), +(1307880,11,2279.49,-5654.93,143.935,10000,1188,0.602901,100,1), +(1307910,1,2050.23,-5752.25,98.5459,1500,0,0.39066,100,1), +(1307910,2,2084.27,-5739.38,100.087,0,0,0.382198,100,1), +(1307910,3,2124.82,-5722.72,100.35,0,0,0.360207,100,1), +(1307910,4,2161.06,-5706.96,103.656,0,0,0.712851,100,1), +(1307910,5,2179.11,-5688.84,109.467,0,0,0.791391,100,1), +(1307910,6,2204.98,-5664.79,119.164,0,0,0.720705,100,1), +(1307910,7,2239.17,-5651.26,131.423,0,0,0.225904,100,1), +(1307910,8,2280.17,-5649.69,143.613,10000,1188,6.26169,100,1), +(1306530,1,2047.67,-5750.46,98.8524,1500,0,0.017199,100,1), +(1306530,2,2082.62,-5736.98,100.434,0,0,0.682447,100,1), +(1306530,3,2136.05,-5719.88,100.712,0,0,0.382425,100,1), +(1306530,4,2169.42,-5696.4,106.528,0,0,0.739781,100,1), +(1306530,5,2191.5,-5675.34,113.472,0,0,0.77748,100,1), +(1306530,6,2207.61,-5659.48,121.455,0,0,0.77748,100,1), +(1306530,7,2233.29,-5643.46,131.681,0,0,0.520655,100,1), +(1306530,8,2280.33,-5637.12,145.183,10000,1188,0.0706218,100,1), +(1306630,1,2021.283081,-5767.769043,102.069725,1500,0,0.455777,100,1), +(1306630,2,2057,-5753.29,98.0162,0,0,0.389378,100,1), +(1306630,3,2087.16,-5739.97,99.9644,0,0,0.440429,100,1), +(1306630,4,2123.28,-5722.97,100.322,0,0,0.45221,100,1), +(1306630,5,2151.2,-5708.97,102.328,0,0,0.602221,100,1), +(1306630,6,2178.39,-5680.06,111.376,0,0,0.821347,100,1), +(1306630,7,2201.81,-5659.44,119.913,0,0,0.711391,100,1), +(1306630,8,2228.17,-5646.67,129.653,0,0,0.414511,100,1), +(1306630,9,2278.72,-5651.94,143.384,10000,1188,5.70338,100,1), +(1306690,1,1938.300537,-5806.917480,100.326469,1500,0,0.036730,100,1), +(1306690,2,1983.64,-5790.51,100.901,0,0,0.378378,100,1), +(1306690,3,2022.91,-5769.81,102.141,0,0,0.539385,100,1), +(1306690,4,2045.72,-5758.77,98.3942,0,0,0.386232,100,1), +(1306690,5,2076.32,-5743.14,99.4291,0,0,0.456918,100,1), +(1306690,6,2109.68,-5727.88,100.259,0,0,0.421575,100,1), +(1306690,7,2143.97,-5714.37,101.331,0,0,0.496973,100,1), +(1306690,8,2175.38,-5689.75,108.822,0,0,0.680756,100,1), +(1306690,9,2199.47,-5669.2,116.494,0,0,0.716099,100,1), +(1306690,10,2222.41,-5653.69,126.852,0,0,0.567659,100,1), +(1306690,11,2252.28,-5644.34,136.182,0,0,0.200093,100,1), +(1306690,12,2282.95,-5638.85,145.296,10000,1188,0.273134,100,1), +(1308190,1,1848.26,-5817.4,100.084,1500,0,0.031333,100,1), +(1308190,2,1885.95,-5813.1,102.329,0,0,0.127844,100,1), +(1308190,3,1939.43,-5807.45,100.38,0,0,0.151406,100,1), +(1308190,4,1987.9,-5788.39,100.894,0,0,0.383098,100,1), +(1308190,5,2042.2,-5757.65,98.5925,0,0,0.44593,100,1), +(1308190,6,2089.15,-5735.17,100.139,0,0,0.438076,100,1), +(1308190,7,2128.01,-5720.92,100.474,0,0,0.28885,100,1), +(1308190,8,2170.04,-5695.56,106.79,0,0,0.650134,100,1), +(1308190,9,2196.58,-5672.94,114.801,0,0,0.712966,100,1), +(1308190,10,2235.65,-5650.01,130.788,0,0,0.461638,100,1), +(1308190,11,2287.21,-5648.74,145.223,10000,1188,6.18012,100,1), +(1306760,1,1822.585205,-5806.501465,103.471199,1500,0,6.123573,100,1), +(1306760,2,1860.7,-5814.45,100.235,0,0,6.13614,100,1), +(1306760,3,1902.01,-5807.95,100.908,0,0,0.00610447,100,1), +(1306760,4,1944.01,-5807.69,100.583,0,0,0.00610447,100,1), +(1306760,5,1989.78,-5789.95,100.913,0,0,0.482841,100,1), +(1306760,6,2025.41,-5769.5,102.127,0,0,0.593583,100,1), +(1306760,7,2037.01,-5761.67,99.3255,0,0,0.593583,100,1), +(1306760,8,2081.03,-5738.27,100.278,0,0,0.389379,100,1), +(1306760,9,2121.93,-5722.76,100.309,0,0,0.354036,100,1), +(1306760,10,2158.34,-5704.48,103.737,0,0,0.683903,100,1), +(1306760,11,2184.91,-5680.44,111.729,0,0,0.759302,100,1), +(1306760,12,2207.65,-5658.66,121.698,0,0,0.767156,100,1), +(1306760,13,2232.85,-5646.12,130.964,0,0,0.399589,100,1), +(1306760,14,2281.53,-5657.82,144.979,10000,1188,5.88874,100,1), +(1308120,1,1871.52,-5814.89,100.977,1500,0,0.149239,100,1), +(1308120,2,1911.67,-5811.62,100.215,0,0,0.166323,100,1), +(1308120,3,1978.48,-5793.12,100.877,0,0,0.434929,100,1), +(1308120,4,2036.66,-5758.3,98.9885,0,0,0.44671,100,1), +(1308120,5,2100.58,-5730.91,100.349,0,0,0.399586,100,1), +(1308120,6,2155.04,-5707.06,102.968,0,0,0.509542,100,1), +(1308120,7,2201.83,-5665.23,118.262,0,0,0.737308,100,1), +(1308120,8,2256.58,-5647.82,136.801,0,0,0.266069,100,1), +(1308120,9,2287.16,-5648.41,145.2,10000,1188,6.24295,100,1), +(1308030,1,1886.295898,-5815.069824,102.595604,1500,0,0.085570,100,1), +(1308030,2,1940.44,-5807.54,100.42,0,0,0.329044,100,1), +(1308030,3,1996.59,-5784.59,100.768,0,0,0.441355,100,1), +(1308030,4,2037.36,-5758.5,98.9918,0,0,0.517539,100,1), +(1308030,5,2095.88,-5728.01,100.327,0,0,0.156255,100,1), +(1308030,6,2142.68,-5713.79,101.296,0,0,0.442926,100,1), +(1308030,7,2192.1,-5676.26,113.266,0,0,0.717815,100,1), +(1308030,8,2229.92,-5650.07,129.412,0,0,0.521466,100,1), +(1308030,9,2286.4,-5645.88,144.972,10000,1188,0.0266647,100,1), +(1308060,1,1901.66,-5809.61,100.974,1500,0,0.342551,100,1), +(1308060,2,1941.71,-5807.93,100.478,0,0,0.0728286,100,1), +(1308060,3,1998.5,-5780,100.674,0,0,0.41055,100,1), +(1308060,4,2043,-5758.39,98.5521,0,0,0.430185,100,1), +(1308060,5,2100.37,-5732.46,100.333,0,0,0.426258,100,1), +(1308060,6,2154.27,-5707.19,102.864,0,0,0.481236,100,1), +(1308060,7,2193.28,-5674.47,113.916,0,0,0.650096,100,1), +(1308060,8,2232.26,-5647.25,130.574,0,0,0.204775,100,1), +(1308060,9,2297.9,-5651.41,147.427,10000,1188,6.19931,100,1), +(1306710,1,1919.796875,-5810.199707,100.092346,1500,0,0.194942,100,1), +(1306710,2,1984.03,-5789.59,100.889,0,0,0.472187,100,1), +(1306710,3,2039.46,-5758.65,98.8531,0,0,0.511457,100,1), +(1306710,4,2097.4,-5732.33,100.316,0,0,0.319035,100,1), +(1306710,5,2151.62,-5712.35,101.993,0,0,0.57429,100,1), +(1306710,6,2176.82,-5720.66,102.775,10000,1188,5.69509,100,1), +(1307890,1,2062.375,-5827.616211,101.632080,1500,0,6.049894,100,1), +(1307890,2,2080.54,-5829.92,102.423,0,0,5.93994,100,1), +(1307890,3,2115.34,-5840.62,102.029,0,0,5.92109,100,1), +(1307890,4,2158.14,-5843.73,102.082,0,0,6.26274,100,1), +(1307890,5,2229.69,-5844.69,101.44,10000,1188,0.0463068,100,1), +(1306620,1,2062.264404,-5863.437988,103.230919,1500,0,0.077718,100,1), +(1306620,2,2086.83,-5858.89,102.861,0,0,0.160184,100,1), +(1306620,3,2132.76,-5855.41,101.544,0,0,6.21011,100,1), +(1306620,4,2168.02,-5845.59,101.368,0,0,0.292129,100,1), +(1306620,5,2251.48,-5838.18,101.258,10000,1188,0.190027,100,1), +(1306790,1,1847.384644,-5861.911621,102.175438,1500,0,6.141752,100,1), +(1306790,2,1891.38,-5854.81,102.046,0,0,0.11303,100,1), +(1306790,3,1949.22,-5847.57,100.357,0,0,0.0109272,100,1), +(1306790,4,1995.6,-5848.39,100.826,0,0,6.18809,100,1), +(1306790,5,2053.46,-5857.73,103.066,0,0,0.124811,100,1), +(1306790,6,2094.38,-5854.87,103.519,0,0,0.128738,100,1), +(1306790,7,2155.67,-5844.05,102.032,0,0,0.0384166,100,1), +(1306790,8,2220.64,-5849.55,101.569,10000,1188,6.14489,100,1), +(1308110,1,1872.653320,-5855.841309,102.853523,1500,0,0.010887,100,1), +(1308110,2,1945.15,-5846.42,100.348,0,0,0.152258,100,1), +(1308110,3,2009.83,-5844.98,100.555,0,0,0.0108862,100,1), +(1308110,4,2081.97,-5842.18,103.485,0,0,0.0462298,100,1), +(1308110,5,2156.12,-5816.6,101.968,0,0,0.305411,100,1), +(1308110,6,2206.36,-5808.57,101.34,10000,1188,0.219017,100,1), +(1308090,1,1887.613525,-5854.142578,102.406212,1500,0,0.058871,100,1), +(1308090,2,1946.51,-5847.73,100.335,0,0,0.180608,100,1), +(1308090,3,2008.43,-5844.67,100.563,0,0,0.0313824,100,1), +(1308090,4,2073.83,-5841.62,103.163,0,0,0.0235284,100,1), +(1308090,5,2143.41,-5819.68,100.946,0,0,0.28271,100,1), +(1308090,6,2205.36,-5821.85,101.321,10000,1188,6.10251,100,1), +(1308050,1,1897.007813,-5852.924805,101.451141,1500,0,0.009392,100,1), +(1308050,2,1946.35,-5847.82,100.335,0,0,0.107488,100,1), +(1308050,3,2034.81,-5850.42,100.401,0,0,6.17862,100,1), +(1308050,4,2104.6,-5857.17,102.44,0,0,0.00538468,100,1), +(1308050,5,2156.86,-5859.74,101.353,0,0,6.03332,100,1), +(1308050,6,2179.67,-5864.91,101.337,0,0,0.00302753,100,1), +(1308050,7,2226.17,-5848.94,101.294,10000,1188,0.372165,100,1), +(1308040,1,1919.654297,-5846.907715,100.235977,1500,0,0.124753,100,1), +(1308040,2,1989.29,-5843.83,100.667,0,0,0.0422862,100,1), +(1308040,3,2053.05,-5844.47,101.489,0,0,6.28227,100,1), +(1308040,4,2115.32,-5842.73,102.499,0,0,0.085484,100,1), +(1308040,5,2173.43,-5843.51,101.35,0,0,6.24301,100,1), +(1308040,6,2218.12,-5839.82,101.329,10000,1188,0.101191,100,1), +(1308100,1,1935.207397,-5843.156250,100.510971,1500,0,0.203284,100,1), +(1308100,2,1981.56,-5842.15,100.582,0,0,6.24299,100,1), +(1308100,3,2016.35,-5842.54,100.545,0,0,6.25556,100,1), +(1308100,4,2079.2,-5845.73,102.93,0,0,6.22021,100,1), +(1308100,5,2161.35,-5845.08,101.875,0,0,0.0312731,100,1), +(1308100,6,2223.11,-5844.07,101.298,10000,1188,6.23199,100,1), +(1307540,1,2105.251221,-5900.707031,104.638618,1500,0,6.202802,100,1), +(1307540,2,2147.59,-5901.54,101.074,0,0,0.0138609,100,1), +(1307540,3,2207.9,-5900.44,100.831,0,0,0.0138609,100,1), +(1307540,4,2248.68,-5894.8,101.004,10000,1188,0.135598,100,1), +(1308010,1,1982.372559,-5917.364258,104.190681,1500,0,0.246334,100,1), +(1308010,2,2060.33,-5911.86,106.458,0,0,0.0177885,100,1), +(1308010,3,2129.89,-5903.91,102.994,0,0,0.139525,100,1), +(1308010,4,2190.71,-5899.29,101.074,0,0,6.28134,100,1), +(1308010,5,2244.32,-5898.24,100.877,10000,1188,0.0609853,100,1), +(1306770,1,1928.129761,-5933.635742,103.063942,1500,0,6.162736,100,1), +(1306770,2,1981.24,-5929.33,103.63,0,0,0.115955,100,1), +(1306770,3,2046.15,-5921.03,106.025,0,0,0.22591,100,1), +(1306770,4,2119.48,-5903.34,104.28,0,0,0.0491957,100,1), +(1306770,5,2173.87,-5897.81,100.759,0,0,0.025634,100,1), +(1306770,6,2216.33,-5899.95,100.666,0,0,6.21065,100,1), +(1306770,7,2243.88,-5903.52,100.662,10000,1188,6.15567,100,1), +(1308020,1,1888.227783,-5932.001465,104.198326,1500,0,0.181147,100,1), +(1308020,2,1957.72,-5914.99,102.575,0,0,0.224344,100,1), +(1308020,3,2025.95,-5907.58,104.953,0,0,0.0633372,100,1), +(1308020,4,2078.47,-5904.05,105.728,0,0,0.0358482,100,1), +(1308020,5,2141.54,-5898.15,102.3,0,0,0.0162122,100,1), +(1308020,6,2192.28,-5899.28,101.138,0,0,6.18552,100,1), +(1308020,7,2245.25,-5899.67,100.817,10000,1188,6.26406,100,1), +(1308130,1,1887.905151,-5911.649414,102.921516,1500,0,0.015411,100,1), +(1308130,2,1950.41,-5906.33,101.542,0,0,0.125367,100,1), +(1308130,3,2024.78,-5907.01,104.901,0,0,6.27111,100,1), +(1308130,4,2070.91,-5897.83,104.986,0,0,6.1965,100,1), +(1308130,5,2126.33,-5901.08,103.446,0,0,0.0193386,100,1), +(1308130,6,2249.12,-5903.34,100.523,10000,1188,6.22398,100,1), +(1306750,1,1846.163696,-5901.961426,104.819687,1500,0,0.024871,100,1), +(1306750,2,1894.25,-5906.52,102.022,0,0,6.17061,100,1), +(1306750,3,1961.34,-5907.78,102.362,0,0,6.257,100,1), +(1306750,4,2031.98,-5908.53,105.049,0,0,0.0405757,100,1), +(1306750,5,2098.74,-5905.52,105.628,0,0,6.28056,100,1), +(1306750,6,2160.55,-5915.42,100.01,0,0,6.0528,100,1), +(1306750,7,2196.82,-5919.73,101.013,0,0,0.0829842,100,1), +(1306750,8,2250.08,-5905.68,100.325,10000,1188,0.42149,100,1), +(1308250,1,1860.970825,-5927.291504,104.586868,1500,0,0.181141,100,1), +(1308250,2,1919.96,-5923.4,102.163,0,0,0.137944,100,1), +(1308250,3,1994.91,-5908.86,103.971,0,0,0.102601,100,1), +(1308250,4,2050.26,-5906.36,105.613,0,0,0.122236,100,1), +(1308250,5,2112.05,-5908.49,104.778,0,0,0.00835337,100,1), +(1308250,6,2173.17,-5899.52,100.583,0,0,0.0829662,100,1), +(1308250,7,2251.93,-5902.93,100.478,10000,1188,6.20122,100,1); +-- Balista defenders +DELETE FROM `creature_addon` WHERE `guid` IN (130630,130625,130759,130629,130631,130628,130627,130626,130760,130710,130725,130699,130583,130575,130643,130633,130638,130764,130767,130611,130639,130766,130774); +INSERT INTO `creature_addon` (`guid`,`path_id`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(130630,0,0,1,333,""), +(130625,0,0,1,333,""), +(130759,0,0,1,333,""), +(130629,0,0,1,333,""), +(130631,0,0,1,333,""), +(130628,0,0,1,333,""), +(130627,0,0,1,333,""), +(130626,0,0,1,333,""), +(130760,0,0,1,333,""), +(130710,0,0,1,333,""), +(130725,0,0,1,333,""), +(130699,0,0,1,333,""), +(130583,0,0,1,333,""), +(130575,0,0,1,333,""), +(130643,0,0,1,333,""), +(130633,0,0,1,333,""), +(130638,0,0,1,333,""), +(130764,0,0,1,333,""), +(130767,0,0,1,333,""), +(130611,0,0,1,333,""), +(130639,0,0,1,333,""), +(130766,0,0,1,333,""), +(130774,0,0,1,333,""); +-- Citizen of Havenshire -- Phase 1 +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 28576); +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 28577); +DELETE FROM `creature_template_addon` WHERE `entry` IN (28576,28577); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(28576,0,0,1,0,""), +(28577,0,0,1,0,""); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_06_world_from_335_was_2017_12_05_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_06_world_from_335_was_2017_12_05_01_world.sql new file mode 100644 index 0000000000..e990dd8e84 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_06_world_from_335_was_2017_12_05_01_world.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=22091 AND `source_type`=0; +UPDATE `creature_template` SET `AIName`="" WHERE `entry`=22091; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_07_world_from_335_was_2017_12_05_02_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_07_world_from_335_was_2017_12_05_02_world.sql new file mode 100644 index 0000000000..0a278bd33e --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_07_07_world_from_335_was_2017_12_05_02_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `InhabitType`=3 WHERE `entry`=18877; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_08_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_08_00_world.sql new file mode 100644 index 0000000000..1314e68bd5 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_08_00_world.sql @@ -0,0 +1,6 @@ +-- Lost City of the Tol'vir trigger updates +UPDATE `creature_template` SET `InhabitType`= 4 WHERE `entry` IN (37231, 48092, 50496); +UPDATE `creature_template` SET `flags_extra`= 128 WHERE `entry` IN (37231, 48097); + +-- Nordrassil fixups +UPDATE `creature_template` SET `InhabitType`= 4 WHERE `entry` IN (49844, 41027, 41028, 42663, 42658, 42660, 42664, 42659, 42657); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_08_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_08_01_world.sql new file mode 100644 index 0000000000..2e923abccf --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_08_01_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_hun_serpent_sting'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(1978, 'spell_hun_serpent_sting'); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_00_world_from_335_was_2017_12_09_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_00_world_from_335_was_2017_12_09_00_world.sql new file mode 100644 index 0000000000..aae5b838b3 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_00_world_from_335_was_2017_12_09_00_world.sql @@ -0,0 +1,7 @@ +-- +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=25800; +DELETE FROM `smart_scripts` WHERE `entryorguid`=25800 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(25800,0,0,0,0,0,100,0,2000,5000,6000,8000,11,49711,0,0,0,0,0,2,0,0,0,0,0,0,0,"Clam Master K - IC - Cast "), +(25800,0,1,0,4,0,100,0,0,0,0,0,18,32768,0,0,0,0,0,1,0,0,0,0,0,0,0,"Clam Master K - on aggro - Set unitflag UNK_15"), +(25800,0,2,0,25,0,100,0,0,0,0,0,19,32768,0,0,0,0,0,1,0,0,0,0,0,0,0,"Clam Master K - on reset - remove unitflag UNK_15"); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_01_world_from_master_was_2017_12_09_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_01_world_from_master_was_2017_12_09_00_world.sql new file mode 100644 index 0000000000..4dde1fe197 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_01_world_from_master_was_2017_12_09_00_world.sql @@ -0,0 +1,2 @@ +ALTER TABLE `version` + CHANGE `core_version` `core_version` VARCHAR(255) DEFAULT '' NOT NULL COMMENT 'Core revision dumped at startup.'; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_02_world_from_master_was_2017_12_10_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_02_world_from_master_was_2017_12_10_00_world.sql new file mode 100644 index 0000000000..47ead11907 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_10_02_world_from_master_was_2017_12_10_00_world.sql @@ -0,0 +1,37 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry` IN ( +8593, +13982, +29528, +31225, +31333, +34367, +39246, +42788, +44422, +44550, +44610, +46488, +47374, +47469, +47634, +47911, +48363, +49367, +55161, +56765, +57908, +65200, +65258, +65265, +70586, +77585); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (29528,44610,46488,57908,70586); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13,1,29528,0,0,31,0,3,16518,0,0,0,0,'',NULL), +(13,1,44610,0,0,31,0,3,24824,0,0,0,0,'','Allow spell Collect Data only on Iron Dwarf Relics'), +(13,1,46488,0,0,31,0,3,26817,0,0,0,0,'',NULL), +(13,1,46488,0,0,36,0,0, 0,0,1,0,0,'',NULL), +(13,1,57908,0,0,31,0,3,26631,0,0,0,0,'',NULL), +(13,1,57908,0,0,36,0,0, 0,0,1,0,0,'',NULL), +(13,1,70586,0,0,31,0,3,37852,0,0,0,0,'','Throw Quel''delar on Quel''delar skull'); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_12_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_12_00_world.sql new file mode 100644 index 0000000000..e248a17884 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_12_00_world.sql @@ -0,0 +1,148 @@ +-- Oathsworn Captain +UPDATE `creature` SET `position_x`= -10784, `position_y`= -1397.36, `position_z`= 15.47772, `orientation`= 3.854353, `MovementType`= 2 WHERE `guid`= 295192; +UPDATE `creature` SET `position_x`= -10837.9, `position_y`= -1299.11, `position_z`= 15.44543, `orientation`= 3.379167, `MovementType`= 2 WHERE `guid`= 313314; +UPDATE `creature_template` SET `difficulty_entry_1`= 49334, `DamageModifier`= 15 WHERE `entry`= 45122; +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `exp`= 3, `DamageModifier`= 20 WHERE `entry`= 49334; + +DELETE FROM `waypoint_data` WHERE `id` IN (2951920, 3133140); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`) VALUES +-- Left Captain +(2951920, 1, -10792.2, -1403.64, 15.39894), +(2951920, 2, -10800.6, -1410.26, 15.47772), +(2951920, 3, -10806.6, -1412.06, 15.47772), +(2951920, 4, -10813.8, -1413.42, 15.47772), +(2951920, 5, -10821.1, -1414.79, 15.47772), +(2951920, 6, -10827.6, -1414.14, 15.47772), +(2951920, 7, -10821.1, -1414.79, 15.47772), +(2951920, 8, -10813.8, -1413.42, 15.47772), +(2951920, 9, -10806.6, -1412.06, 15.47772), +(2951920, 10, -10800.6, -1410.26, 15.47772), +(2951920, 11, -10792.2, -1403.64, 15.39894), +(2951920, 12, -10784, -1397.36, 15.47772), +-- Right Captain +(3133140, 1, -10847, -1303.65, 15.47772), +(3133140, 2, -10860.1, -1313.22, 15.47772), +(3133140, 3, -10855.1, -1309.42, 15.47772), +(3133140, 4, -10847, -1303.65, 15.47772), +(3133140, 5, -10837.9, -1299.11, 15.44543), +(3133140, 6, -10829.6, -1297.1, 15.41835), +(3133140, 7, -10822.9, -1296.66, 15.41835), +(3133140, 8, -10822.9, -1296.66, 15.41835), +(3133140, 9, -10829.6, -1297.1, 15.41835), +(3133140, 10, -10837.9, -1299.11, 15.44543); + +DELETE FROM `creature_addon` WHERE `guid` IN (295192, 313314); +INSERT INTO `creature_addon` (`guid`, `path_id`, `bytes2`) VALUES +(295192, 2951920, 1), +(313314, 3133140, 1); + +-- Earthquake +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 14, `unit_flags`= 33554432, `flags_extra`= 131 WHERE `entry`= 45126; +DELETE FROM `creature_template_addon` WHERE `entry`= 45126; +INSERT INTO `creature_template_addon` (`entry`, `Auras`) VALUES +(45126, '84249'); + +-- Creature Oathsworn Captain 45122 SAI +SET @ENTRY := 45122; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 0, 0, 100, 0, 6000, 10000, 13000, 17000, 11, 84248, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 6000 and 10000 ms (and later repeats every 13000 and 17000 ms) - Self: Cast spell 84248 on Self // "), +(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 6000, 10000, 13000, 17000, 11, 82670, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 6000 and 10000 ms (and later repeats every 13000 and 17000 ms) - Self: Cast spell 82670 on Victim // "); + +-- Enslaved Bandit visual +UPDATE `creature` SET `unit_flags`= 33587200 WHERE `guid` IN (339628, 339639); +DELETE FROM `creature_addon` WHERE `guid` IN (339628, 339639); +INSERT INTO `creature_addon` (`guid`, `emote`, `Auras`) VALUES +(339628, 420, '16245'), +(339639, 420, '16245'); + +-- Creature Enslaved Bandit 45007 SAI +SET @ENTRY := 45007; +UPDATE `creature_template` SET `InhabitType`= 1, `AIName`="SmartAI" WHERE `entry`= @ENTRY; + +SET @ENTRY := -339628; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 1, 60, 0, 100, 1, 100, 100, 0, 0, 18, 33556480, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 100 and 100 ms) - Self: Set UNIT_FLAGS_2 to 33556480 // "), +(@ENTRY, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, " Linked - Self: Set react state to REACT_PASSIVE // "), +(@ENTRY, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84172, 2, 0, 0, 0, 0, 10, 339626, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84172 on Creature Rope Beam Stalker 37231 (339626) // "), +(@ENTRY, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84168, 2, 0, 0, 0, 0, 10, 339623, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84168 on Creature Rope Beam Stalker 37231 (339623) // "), +(@ENTRY, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84167, 2, 0, 0, 0, 0, 10, 339624, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84167 on Creature Rope Beam Stalker 37231 (339624) // "), +(@ENTRY, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84171, 2, 0, 0, 0, 0, 10, 339625, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84171 on Creature Rope Beam Stalker 37231 (339625) // "); + + +SET @ENTRY := -339639; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 1, 60, 0, 100, 1, 100, 100, 0, 0, 18, 33556480, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 100 and 100 ms) - Self: Set UNIT_FLAGS_2 to 33556480 // "), +(@ENTRY, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, " Linked - Self: Set react state to REACT_PASSIVE // "), +(@ENTRY, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84168, 2, 0, 0, 0, 0, 10, 339620, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84168 on Creature Rope Beam Stalker 37231 (339620) // "), +(@ENTRY, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84167, 2, 0, 0, 0, 0, 10, 339621, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84167 on Creature Rope Beam Stalker 37231 (339621) // "), +(@ENTRY, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84171, 2, 0, 0, 0, 0, 10, 339636, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84171 on Creature Rope Beam Stalker 37231 (339636) // "), +(@ENTRY, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 84172, 2, 0, 0, 0, 0, 10, 339637, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 84172 on Creature Rope Beam Stalker 37231 (339637) // "); + +-- Creature Pygmy Brute 44896 SAI +SET @ENTRY := 44896; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 63, 0, 100, 1, 0, 0, 0, 0, 12, 44897, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "When just created - Self: Summon creature Pygmy Scout (44897) at Self, moved by offset (0, 0, 0, 0) // "); + +-- Creature Pygmy Scout 44897 SAI +SET @ENTRY := 44897; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 1, 54, 0, 100, 1, 0, 0, 0, 0, 67, 0, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "On just summoned - Trigger timed event #0 in 100 - 100 ms // "), +(@ENTRY, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 12, 44898, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, " Linked - Self: Summon creature Pygmy Firebreather (44898) at Self, moved by offset (0, 0, 0, 0) // "), +(@ENTRY, 0, 2, 0, 59, 0, 100, 1, 0, 0, 0, 0, 11, 46598, 0, 0, 0, 0, 0, 11, 44896, 5, 0, 0, 0, 0, 0, "On timed event 0 triggered - Self: Cast spell 46598 on Creature Pygmy Brute (44896) in 5 yd // "); + +-- Creature Pygmy Firebreather 44898 SAI +SET @ENTRY := 44898; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 67, 0, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "On just summoned - Trigger timed event #0 in 100 - 100 ms // "), +(@ENTRY, 0, 1, 0, 59, 0, 100, 1, 0, 0, 0, 0, 11, 47020 , 0, 0, 0, 0, 0, 11, 44897, 5, 0, 0, 0, 0, 0, "On timed event 0 triggered - Self: Cast spell 47020 on Creature Pygmy Scout (44897) in 5 yd // "); + +-- Wind Tunnels +DELETE FROM `creature_summon_groups` WHERE `summonerId`= 755 AND `summonerType`= 2; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`) VALUES +(755, 2, 0, 48092, -10891.5, -1379.72, 15.436, 5.34071, 8), +(755, 2, 0, 48092, -10964.9, -1481.17, 6.75973, 5.34071, 8), +(755, 2, 0, 48092, -10930.6, -1302.74, 2.202043, 5.35816, 8), +(755, 2, 0, 48092, -10998.4, -1356.15, 10.8898, 5.34071, 8), +(755, 2, 0, 48092, -11027.7, -1427.97, 5.69384, 5.34071, 8), +(755, 2, 0, 48092, -10887.7, -1447.7, 2.24816, 4.74729, 8); + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`= 48092; +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(48092, 93970, 1, 0); + +DELETE FROM `creature` WHERE `guid` IN (339650, 339653, 339654, 339656, 339659, 339661); +DELETE FROM `creature_addon` WHERE `guid` IN (339650, 339653, 339654, 339656, 339659, 339661); +DELETE FROM `creature_template_addon` WHERE `entry`= 48092; +INSERT INTO `creature_template_addon` (`entry`, `Auras`) VALUES +(48092, '89698'); + +-- Creature Wind Tunnel 48092 SAI +SET @ENTRY := 48092; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 8, 0, 100, 0, 93970, 0, 0, 0, 67, 0, 500, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "On spell 93970 hit - Trigger timed event #0 in 500 - 500 ms // "), +(@ENTRY, 0, 1, 0, 59, 0, 100, 0, 0, 0, 0, 0, 11, 85016, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, "On timed event 0 triggered - Self: Cast spell 85016 on Action invoker // "); + +DELETE FROM `conditions` WHERE `SourceEntry`= 85017; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 85017, 0, 0, 31, 0, 3, 48097, 0, 0, 0, '', 'Slipstream - Target Wind Tunnel Landing Zone'); + +-- Creature Wind Tunnel Landing Zone 48097 SAI +SET @ENTRY := 48097; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 27, 0, 100, 0, 0, 0, 0, 0, 67, 0, 1500, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "On passenger boarded (vehicle) - Trigger timed event #0 in 1500 - 1500 ms // "), +(@ENTRY, 0, 1, 0, 59, 0, 100, 1, 0, 0, 0, 0, 28, 85017, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "On timed event 0 triggered - Self: Remove aura due to spell 85017 // "); + diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_12_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_12_01_world.sql new file mode 100644 index 0000000000..5501a6707e --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_12_01_world.sql @@ -0,0 +1,106 @@ +-- High Prophet Barim +UPDATE `creature_template` SET `difficulty_entry_1`= 48951, `mechanic_immune_mask`= 667893759, `lootid`= 43612, `mingold`= 19800, `maxgold`= 19900, `scriptname`= 'boss_high_prophet_barim' WHERE `entry`= 43612; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `faction`= 16, `exp`= 3, `mechanic_immune_mask`= 667893759, `lootid`= 48951, `mingold`= 19800, `maxgold`= 19900, `movementId`= 138 WHERE `entry`= 48951; +UPDATE `creature` SET `PhaseID`= 0, `PhaseGroup`= 391 WHERE `guid`= 306829; +-- Heavens Fury +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33554432, `flags_extra`= 128 WHERE `entry`= 43801; +-- Wail of Twilight +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33554432, `flags_extra`= 128 WHERE `entry`= 43926; +-- Repentance +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 14, `unit_flags`= 33554432, `flags_extra`= 2, `scriptname`= 'npc_barim_repentance' WHERE `entry`= 43817; +-- Harbinger of Darkness +UPDATE `creature_template` SET `difficulty_entry_1`= 48953, `minlevel`= 86, `maxlevel`= 86, `faction`= 16, `mechanic_immune_mask`= 667893759, `scriptname`= 'npc_barim_harbinger_of_darkness' WHERE `entry`= 43927; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `faction`= 16, `exp`= 3, `mechanic_immune_mask`= 667893759 WHERE `entry`= 48953; +-- Blaze of the Heavens Dummy +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33554432, `flags_extra`= 128 WHERE `entry`= 48904; +-- Blaze of the Heavens +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `faction`= 16, `mechanic_immune_mask`= 667893759, `scriptname`= 'npc_barim_blaze_of_the_heavens' WHERE `entry`= 48906; +-- Blaze of the Heavens Fire Dummy +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `unit_flags`= 33554496, `flags_extra`= 128 WHERE `entry`= 48907; +-- Soul Fragment +UPDATE `creature_template` SET `mechanic_immune_mask`= 667893759, `difficulty_entry_1`= 48954, `faction`= 16, `exp`= 3, `minlevel`= 84, `maxlevel`= 84, `scriptname`= 'npc_barim_soul_fragment' WHERE `entry`= 43934; +UPDATE `creature_template` SET `mechanic_immune_mask`= 667893759, `faction`= 16, `exp`= 3, `minlevel`= 85, `maxlevel`= 85 WHERE `entry`= 48954; +-- Burning Soul +UPDATE `creature_template` SET `difficulty_entry_1`= 49220, `minlevel`= 84, `maxlevel`= 84, `unit_flags`= 33554432, `faction`= 16, `flags_extra`= 128 WHERE `entry`= 49219; +UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `unit_flags`= 33554432, `faction`= 16, `flags_extra`= 131 WHERE `entry`= 49220; + +-- Creature Text +DELETE FROM `creature_text` WHERE `CreatureID` IN (43612, 43934); +INSERT INTO `creature_text` (`CreatureID`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(43612, 0, 0, 'Begone infidels, you are not welcome here!', 14, 0, 100, 0, 0, 19735, 44791, 'High Prophet Barim'), +(43612, 1, 0, 'May peace find you now.', 14, 0, 100, 0, 0, 19738, 44793, 'High Prophet Barim'), +(43612, 1, 1, 'The heavens take you!', 14, 0, 100, 0, 0, 19736, 44794, 'High Prophet Barim'), +(43612, 2, 0, 'Kneel before me and repent!', 14, 0, 100, 0, 0, 19737, 44795, 'High Prophet Barim'), +(43612, 3, 0, 'Death is only the beginning!', 14, 0, 100, 0, 0, 19733, 44792, 'High Prophet Barim'), +(43934, 0, 0, 'A soul fragment merges souls with the Harbinger of Darkness!', 41, 0, 100, 0, 0, 0, 52151, 'Soul Fragment'); + +-- Spell Script Names +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_barim_plague_of_ages_first', + 'spell_barim_plague_of_ages_second', + 'spell_barim_repentance_script', + 'spell_barim_repentance_pull'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(82637, 'spell_barim_plague_of_ages_first'), +(89996, 'spell_barim_plague_of_ages_first'), +(82640, 'spell_barim_plague_of_ages_second'), +(89995, 'spell_barim_plague_of_ages_second'), +(82009, 'spell_barim_repentance_script'), +(81960, 'spell_barim_repentance_script'), +(82220, 'spell_barim_repentance_script'), +(82168, 'spell_barim_repentance_pull'); + +-- Template Addons +DELETE FROM `creature_template_addon` WHERE `entry` IN (43801, 43926, 48907); +INSERT INTO `creature_template_addon` (`entry`, `Auras`) VALUES +(43801, '81940 81941'), +(48907, '91195'); + +-- Creature Veil of Twilight 43926 SAI +SET @ENTRY := 43926; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 60, 0, 100, 1, 1000, 1000, 0, 0, 11, 82197, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 1000 and 1000 ms) - Self: Cast spell 82197 on Self // "), +(@ENTRY, 0, 1, 2, 60, 0, 100, 1, 2000, 2000, 0, 0, 41, 4000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 2000 and 2000 ms) - Self: Despawn in 4000 ms // "), +(@ENTRY, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 82203, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 82203 on Self // "); + +-- Creature Blaze of the Heavens 48904 SAI +SET @ENTRY := 48904; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 60, 0, 100, 1, 1000, 1000, 0, 0, 11, 91179, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 1000 and 1000 ms) - Self: Cast spell 91179 on Self // "), +(@ENTRY, 0, 1, 2, 60, 0, 100, 1, 2000, 2000, 0, 0, 41, 4000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Every 0 and 0 ms (for the first time, timer between 2000 and 2000 ms) - Self: Despawn in 4000 ms // "), +(@ENTRY, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 91180, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, " Linked - Self: Cast spell 91180 on Self // "); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceEntry` IN (91196, 91277, 82224, 82263) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO conditions (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 2, 91196, 0, 0, 31, 0, 3, 48907, 0, 0, 0, '', 'Blaze of the Heavens - Target Blaze of the Heavens'), +(13, 2, 91196, 0, 0, 31, 0, 3, 48906, 0, 0, 0, '', 'Blaze of the Heavens - Target Blaze of the Heavens'), +(13, 1, 91277, 0, 0, 31, 0, 3, 43934, 0, 0, 0, '', 'Burning Soul - Target Soul Fragment'), +(13, 1, 82224, 0, 0, 31, 0, 3, 43927, 0, 0, 0, '', 'Soul Fragment - Target Harbinger of Darkness'), +(13, 7, 82263, 0, 0, 31, 0, 3, 43927, 0, 0, 0, '', 'Soul Fragment - Target Harbinger of Darkness'); + +-- Loot +DELETE FROM `creature_loot_template` WHERE `Entry` IN (43612, 48951); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `LootMode`, `MinCount`, `MaxCount`) VALUES +(43612, 436120, 436120, 100, 1, 1, 1), +(48951, 489510, 489510, 100, 1, 1, 1); + +DELETE FROM `reference_loot_template` WHERE `Entry` IN (436120, 489510); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Chance`, `LootMode`, `MinCount`, `MaxCount`, `GroupId`) VALUES +-- Normal Mode +(436120, 55865, 0, 1, 1, 1, 1), +(436120, 55864, 0, 1, 1, 1, 1), +(436120, 55861, 0, 1, 1, 1, 1), +(436120, 55862, 0, 1, 1, 1, 1), +(436120, 55863, 0, 1, 1, 1, 1), +-- Heroic Mode +(489510, 56384, 0, 1, 1, 1, 1), +(489510, 56385, 0, 1, 1, 1, 1), +(489510, 56386, 0, 1, 1, 1, 1), +(489510, 56387, 0, 1, 1, 1, 1), +(489510, 56388, 0, 1, 1, 1, 1); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_13_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_13_00_world.sql new file mode 100644 index 0000000000..4ace2a47eb --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_13_00_world.sql @@ -0,0 +1,4 @@ +-- +UPDATE `creature_template` SET `exp`=3, `flags_extra`=128 WHERE `entry`=49220; +UPDATE `creature_template` SET `unit_class`=2 WHERE `entry`=48951; + diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_00_world_from_335_was_2017_12_14_00_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_00_world_from_335_was_2017_12_14_00_world_335.sql new file mode 100644 index 0000000000..75d048d562 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_00_world_from_335_was_2017_12_14_00_world_335.sql @@ -0,0 +1,21 @@ +/* +-- Dran Droffers & Malton Droffers +DELETE FROM `creature_text` WHERE `CreatureID` IN (6986,6987); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(6986,0,0,"Now we just need to figure out how to get this thing working again.",12,0,100,1,0,0,3077,0,"Dran Droffers"), +(6986,1,0,"Boy, you couldn't fix a sandwich without someone tellin' ya how to do it.",12,0,100,274,0,0,3080,0,"Dran Droffers"), +(6986,2,0,"Malton, you dummy!",14,0,100,5,0,0,3081,0,"Dran Droffers"), +(6987,0,0,"Maybe I can fix it, pop. Lemme take a look at it.",12,0,100,1,0,0,3078,0,"Malton Droffers"), +(6987,1,0,"Sandwich? What? You makin' a sandwich for me, pop?",12,0,100,6,0,0,3079,0,"Malton Droffers"); + +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=6986; +DELETE FROM `smart_scripts` WHERE `entryorguid`=6986 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=698600 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(6986,0,0,0,20,0,100,0,2340,0,0,0,80,698600,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dran Droffers - On Quest 'Deliver the Gems' Finished - Run Script"), +(698600,9,0,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dran Droffers - On Script - Say Line 0"), +(698600,9,1,0,0,0,100,0,4000,4000,0,0,1,0,0,0,0,0,0,19,6987,0,0,0,0,0,0,"Dran Droffers - On Script - Say Line 0 (Malton Droffers)"), +(698600,9,2,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dran Droffers - On Script - Say Line 1"), +(698600,9,3,0,0,0,100,0,4000,4000,0,0,1,1,0,0,0,0,0,19,6987,0,0,0,0,0,0,"Dran Droffers - On Script - Say Line 1 (Malton Droffers)"), +(698600,9,4,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dran Droffers - On Script - Say Line 2"); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_01_world_from_335_was_2017_12_14_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_01_world_from_335_was_2017_12_14_01_world.sql new file mode 100644 index 0000000000..1faf5fc48c --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_01_world_from_335_was_2017_12_14_01_world.sql @@ -0,0 +1,58 @@ +-- Ogron +DELETE FROM `smart_scripts` WHERE `entryorguid`=4983 AND `source_type`=0 AND `id`=8; +DELETE FROM `smart_scripts` WHERE `entryorguid`=498300 AND `source_type`=9 AND `id`=2; +DELETE FROM `smart_scripts` WHERE `entryorguid`=498302 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4983,0,8,0,38,0,100,0,2,2,0,0,80,498302,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ogron - On Data Set 2 2 - Run Script"), +(498300,9,2,0,0,0,100,0,0,0,0,0,19,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ogron - On Script - Remove Unit Flag 'Immune to NPC'"), +(498302,9,0,0,0,0,100,0,3000,3000,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ogron - On Script - Say Line 6"), +(498302,9,1,0,0,0,100,0,4000,4000,0,0,1,7,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ogron - On Script - Say Line 7"), +(498302,9,2,0,0,0,100,0,5000,5000,0,0,18,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ogron - On Script - Add Unit Flag 'Immune to NPC'"), +(498302,9,3,0,0,0,100,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,-3317.64,-3125.36,33.0284,0,"Ogron - On Script - Move to Position"); + +DELETE FROM `creature_text` WHERE `CreatureID`=4983 AND `GroupID`=8; -- Ogron shouldn't have ogres' common aggro texts + +-- Paval Reethe +DELETE FROM `smart_scripts` WHERE `entryorguid`=4980 AND `source_type`=0 AND `id` IN (1,2,3); +DELETE FROM `smart_scripts` WHERE `entryorguid`=498000 AND `source_type`=9 AND `id` IN (8,9,10); +DELETE FROM `smart_scripts` WHERE `entryorguid`=498001 AND `source_type`=9 AND `id` IN (3,4,5,6,7); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4980,0,1,0,75,0,100,1,0,4983,10,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.77747,"Paval Reethe - On 'Ogron' in Range - Set Orientation"), +(4980,0,2,0,75,0,100,1,0,4983,10,0,17,333,0,0,0,0,0,1,0,0,0,0,0,0,0,"Paval Reethe - On 'Ogron' in Range - Set Emote State 333"), +(4980,0,3,0,8,0,100,0,7105,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,"Paval Reethe - On Spellhit 'Fake Shot' - Set Flag Standstate Kneel"), +(498000,9,8,0,0,0,100,0,0,0,0,0,45,3,3,0,0,0,0,11,5045,30,0,0,0,0,0,"Paval Reethe - On Script - Set Data 3 3"), +(498000,9,9,0,0,0,100,0,0,0,0,0,45,3,3,0,0,0,0,11,5044,30,0,0,0,0,0,"Paval Reethe - On Script - Set Data 3 3"), +(498000,9,10,0,0,0,100,0,0,0,0,0,45,3,3,0,0,0,0,11,5046,30,0,0,0,0,0,"Paval Reethe - On Script - Set Data 3 3"), +(498001,9,3,0,0,0,100,0,2000,2000,0,0,45,2,2,0,0,0,0,19,4983,0,0,0,0,0,0,"Paval Reethe - On Script - Set Data 2 2"), +(498001,9,4,0,0,0,100,0,0,0,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Paval Reethe - On Script - Kill Self"); + +UPDATE `smart_scripts` SET `target_type`=1, `target_param1`=0, `target_param3`=0 WHERE `entryorguid`=498000 AND `source_type`=9 AND `id` IN (0,1); +UPDATE `smart_scripts` SET `action_type`=1 WHERE `entryorguid`=498001 AND `source_type`=9 AND `id` IN (1,5,6); + +UPDATE `creature_text` SET `Emote`=1 WHERE `CreatureID`=4980 AND `GroupID` IN (1,2,4); +UPDATE `creature_text` SET `Emote`=25 WHERE `CreatureID`=4980 AND `GroupID`=3; +UPDATE `creature_text` SET `Emote`=6 WHERE `CreatureID`=4980 AND `GroupID`=5; +UPDATE `creature_text` SET `Emote`=0 WHERE `CreatureID`=4980 AND `GroupID`=7; + +-- Lieutenant Caldwell +UPDATE `smart_scripts` SET `target_type`=1 WHERE `entryorguid`=504600 AND `source_type`=9 AND `id` IN (1,2); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=5046 AND `source_type`=0 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(5046,0,3,0,38,0,100,0,3,3,0,0,49,0,0,0,0,0,0,19,4983,0,0,0,0,0,0,"Lieutenant Caldwell - On Data Set - Start Attaking"); + +UPDATE `creature_text` SET `Emote`=5 WHERE `CreatureID`=5046 AND `GroupID`=0; +UPDATE `creature_text` SET `Emote`=1 WHERE `CreatureID`=5046 AND `GroupID`=1; +UPDATE `creature_text` SET `Emote`=25 WHERE `CreatureID`=5046 AND `GroupID`=2; + +-- Private Hallan +UPDATE `smart_scripts` SET `target_type`=1 WHERE `entryorguid`=504500 AND `source_type`=9 AND `id`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=5045 AND `source_type`=0 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(5045,0,3,0,38,0,100,0,3,3,0,0,49,0,0,0,0,0,0,19,4983,0,0,0,0,0,0,"Private Hallan - On Data Set - Start Attaking"); + +-- Theramore Skirmisher +DELETE FROM `smart_scripts` WHERE `entryorguid`=5044 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(5044,0,2,0,38,0,100,0,3,3,0,0,49,0,0,0,0,0,0,21,100,0,0,0,0,0,0,"Theramore Skirmisher - On Data Set - Start Attaking"); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_02_world_from_335_was_2017_12_14_02_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_02_world_from_335_was_2017_12_14_02_world_335.sql new file mode 100644 index 0000000000..8d2542b58b --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_02_world_from_335_was_2017_12_14_02_world_335.sql @@ -0,0 +1,160 @@ +/* +-- Warden Belamoore +DELETE FROM `smart_scripts` WHERE `entryorguid`=2415 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2415,0,1,0,9,0,100,0,0,10,14000,19000,11,20828,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warden Belamoore - Within 0-10 Range - Cast Cone of Cold"); + +-- Dalaran Theurgist +UPDATE `smart_scripts` SET `event_flags`=0, `action_param2`=0 WHERE `entryorguid`=2272 AND `source_type`=0 AND `id`=1; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2272 AND `source_type`=0 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2272,0,3,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Dalaran Theurgist - Just Summoned - Start Attacking"); + +-- Spirit of Old +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2623; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2623 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2623,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Spirit of Old - Just Summoned - Start Attacking"); + +-- Dalaran Summoner +UPDATE `smart_scripts` SET `event_param3`=3200 WHERE `entryorguid`=2358 AND `source_type`=0 AND `id`=0; +UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=2358 AND `source_type`=0 AND `id` IN (1,3); + +-- Dalaran Shield Guard +DELETE FROM `smart_scripts` WHERE `entryorguid`=2271 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2271,0,2,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Dalaran Shield Guard - Just Summoned - Start Attacking"); + +-- Mountain Yeti +DELETE FROM `smart_scripts` WHERE `entryorguid`=2250 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2250,0,0,0,0,0,100,0,4000,11000,10000,17000,11,3131,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mountain Yeti - In Combat - Cast Frost Breath"); + +-- Giant Yeti +DELETE FROM `smart_scripts` WHERE `entryorguid`=2251 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2251,0,0,0,0,0,100,0,4000,11000,10000,17000,11,3131,0,0,0,0,0,2,0,0,0,0,0,0,0,"Giant Yeti - In Combat - Cast Frost Breath"); + +-- Crushridge Ogres +UPDATE `smart_scripts` SET `event_chance`=15 WHERE `entryorguid` IN (2252,2253,2254,2255,2287,2416) AND `source_type`=0 AND `id`=0; + +-- Crushridge Mage +UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=2255 AND `source_type`=0 AND `id`=2; + +-- Crushridge Plunderer +DELETE FROM `smart_scripts` WHERE `entryorguid`=2416 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2416,0,1,0,0,0,100,0,5000,7000,8000,12000,11,15496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Crushridge Plunderer - In Combat - Cast Cleave"); + +-- Crushridge Enforcer +DELETE FROM `smart_scripts` WHERE `entryorguid`=2256 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2256,0,1,0,4,0,15,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Crushridge Enforcer - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=2256; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(2256,0,0,"Raaar!!! Me smash $r!",12,0,100,0,0,0,1925,0,"Crushridge Enforcer"), +(2256,0,1,"Me smash! You die!",12,0,100,0,0,0,1926,0,"Crushridge Enforcer"), +(2256,0,2,"I'll crush you!",12,0,100,0,0,0,1927,0,"Crushridge Enforcer"); + +-- Mug'thol +DELETE FROM `smart_scripts` WHERE `entryorguid`=2257 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2257,0,0,0,0,0,100,0,5000,7000,9000,13000,11,11976,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mug'thol - In Combat - Cast Strike"), +(2257,0,1,0,0,0,100,0,9000,12000,18000,24000,11,13730,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mug'thol - In Combat - Cast Demoralizing Shout"); + +-- Lo'Grosh +UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=2453 AND `source_type`=0; + +-- Syndicate Assassin +DELETE FROM `smart_scripts` WHERE `entryorguid`=2246 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2246,0,1,0,0,0,100,0,4000,14000,8000,18000,11,744,32,0,0,0,0,2,0,0,0,0,0,0,0,"Syndicate Assassin - In Combat - Cast Poison"); + +-- Syndicate Thief +DELETE FROM `smart_scripts` WHERE `entryorguid`=2241 AND `source_type`=0 AND `id` IN (0,1); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2241,0,0,0,0,0,100,0,4000,12000,18000,26000,11,6713,0,0,0,0,0,2,0,0,0,0,0,0,0,"Syndicate Thief - In Combat - Cast Disarm"), +(2241,0,1,0,0,0,100,0,4000,14000,8000,18000,11,744,32,0,0,0,0,2,0,0,0,0,0,0,0,"Syndicate Thief - In Combat - Cast Poison"); + +-- Drunken Footpad +DELETE FROM `smart_scripts` WHERE `entryorguid`=2440 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2440,0,0,0,0,0,100,0,5000,8000,9000,15000,11,13584,0,0,0,0,0,2,0,0,0,0,0,0,0,"Drunken Footpad - In Combat - Cast Strike"), +(2440,0,1,0,0,0,100,0,5000,25000,30000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Drunken Footpad - Out of Combat - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=2440 AND `GroupID`=0 AND `ID`=1; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(2440,0,1,"Southshore stout, how do I love thee? Let me count the ways...",12,7,100,0,0,0,606,0,"Drunken Footpad"); + +-- Pooling for Araga +DELETE FROM `creature` WHERE `guid` IN (82864, 82870); +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(82864,14222,0,0,0,1,1,0,0,-198.314,-306.058,157.444,6.23466,72000,15,0,1342,0,1,0,0,0,"",0), +(82870,14222,0,0,0,1,1,0,0,-105.223,-104.623,137.257,3.78422,72000,15,0,1342,0,1,0,0,0,"",0); + +DELETE FROM `pool_template` WHERE `entry`=1117; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(1117,1,"Araga"); + +DELETE FROM `pool_creature` WHERE `pool_entry`=1117; +INSERT INTO `pool_creature` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(82864,1117,0,"Araga (14222) - Spawn 1"), +(82870,1117,0,"Araga (14222) - Spawn 2"), +(17066,1117,0,"Araga (14222) - Spawn 3"); + +UPDATE `creature` SET `position_x`=139.819, `position_y`=-63.8495, `position_z`=101.407, `spawndist`=10, `MovementType`=1 WHERE `guid`=17066; + +-- Pathing for Gravis Slipknot +UPDATE `creature` SET `position_x`=688.872, `position_y`=-937.22, `position_z`=164.95, `spawndist`=0, `MovementType`=2 WHERE `guid`=86756; + +DELETE FROM `creature_addon` WHERE `guid`=86756; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(86756,867560,0,0,1,0,""); + +DELETE FROM `waypoint_data` WHERE `id`=867560; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(867560,1,688.872,-937.22,164.95,0,0,0,0,100,0), +(867560,2,681.325,-937.484,164.935,0,0,0,0,100,0), +(867560,3,680.741,-951.257,164.289,0,0,0,0,100,0), +(867560,4,665.078,-953.5,164.342,0,0,0,0,100,0), +(867560,5,657.901,-957.89,164.342,0,0,0,0,100,0), +(867560,6,654.432,-964.331,164.531,0,0,0,0,100,0), +(867560,7,657.184,-973.619,164.927,0,0,0,0,100,0), +(867560,8,661.672,-977.083,164.781,0,0,0,0,100,0), +(867560,9,671.532,-975.53,164.356,0,0,0,0,100,0), +(867560,10,686.471,-965.257,164.29,0,0,0,0,100,0), +(867560,11,708.6,-961.881,164.292,0,0,0,0,100,0), +(867560,12,732.751,-960.906,166.226,0,0,0,0,100,0), +(867560,13,732.826,-947.077,165.326,0,0,0,0,100,0), +(867560,14,742.555,-946.404,166.228,0,0,0,0,100,0), +(867560,15,745.466,-953.826,166.228,0,0,0,0,100,0), +(867560,16,746.201,-960.484,166.228,0,0,0,0,100,0), +(867560,17,746.416,-949.084,166.228,0,0,0,0,100,0), +(867560,18,742.495,-947.208,166.228,0,0,0,0,100,0), +(867560,19,733.151,-946.913,165.326,0,0,0,0,100,0), +(867560,20,732.868,-960.773,166.227,0,0,0,0,100,0), +(867560,21,717.405,-961.266,166.227,0,0,0,0,100,0), +(867560,22,708.584,-960.933,164.299,0,0,0,0,100,0), +(867560,23,684.935,-954.861,164.292,0,0,0,0,100,0), +(867560,24,681.499,-946.261,164.935,0,0,0,0,100,0), +(867560,25,681.944,-937.438,164.936,0,0,0,0,100,0), +(867560,26,688.632,-937.48,164.95,0,0,0,0,100,0), +(867560,27,688.207,-926.509,164.325,0,0,0,0,100,0), +(867560,28,696.862,-921.751,164.706,0,0,0,0,100,0), +(867560,29,697.017,-913.874,168.168,0,0,0,0,100,0), +(867560,30,691.865,-913.407,168.173,0,0,0,0,100,0), +(867560,31,691.63,-922.2,171.806,0,0,0,0,100,0), +(867560,32,688.334,-925.043,171.806,0,0,0,0,100,0), +(867560,33,691.635,-924.719,171.806,0,0,0,0,100,0), +(867560,34,691.644,-920.726,171.806,0,0,0,0,100,0), +(867560,35,691.839,-913.313,168.175,0,0,0,0,100,0), +(867560,36,697.023,-913.94,168.169,0,0,0,0,100,0), +(867560,37,696.323,-922.92,164.325,0,0,0,0,100,0), +(867560,38,688.325,-927.531,164.325,0,0,0,0,100,0), +(867560,39,688.301,-934.973,164.951,0,0,0,0,100,0); + +-- Delete wrong spawns +DELETE FROM `creature` WHERE `guid` IN (16668,16669,17553,16806); -- These mobs are summoned by Dalaran Summoneres. +DELETE FROM `creature_addon` WHERE `guid` IN (16668,16669,17553,16806); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_03_world_from_335_was_2017_12_14_03_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_03_world_from_335_was_2017_12_14_03_world_335.sql new file mode 100644 index 0000000000..eed73178da --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_03_world_from_335_was_2017_12_14_03_world_335.sql @@ -0,0 +1,150 @@ +/* +-- Crag Coyote +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2727; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2727 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2727,0,0,1,1,0,100,0,30000,600000,120000,600000,4,1018,0,1,0,0,0,1,0,0,0,0,0,0,0,"Crag Coyote - Out of Combat - Play Sound 1018"), +(2727,0,1,0,61,0,100,0,0,0,0,0,5,393,0,0,0,0,0,1,0,0,0,0,0,0,0,"Crag Coyote - Out of Combat - Play Emote 393"); + +-- Feral Crag Coyote +DELETE FROM `smart_scripts` WHERE `entryorguid`=2728 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2728,0,0,1,1,0,100,0,30000,600000,120000,600000,4,1018,0,1,0,0,0,1,0,0,0,0,0,0,0,"Feral Crag Coyote - Out of Combat - Play Sound 1018"), +(2728,0,1,0,61,0,100,0,0,0,0,0,5,393,0,0,0,0,0,1,0,0,0,0,0,0,0,"Feral Crag Coyote - Out of Combat - Play Emote 393"), +(2728,0,2,0,25,0,100,0,0,0,0,0,11,8876,0,0,0,0,0,1,0,0,0,0,0,0,0,"Feral Crag Coyote - On Reset - Cast Thrash"); + +-- Elder Crag Coyote +DELETE FROM `smart_scripts` WHERE `entryorguid`=2729 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2729,0,2,0,0,0,100,0,4000,8000,6000,9000,11,32919,0,0,0,0,0,2,0,0,0,0,0,0,0,"Elder Crag Coyote - In Combat - Cast Snarl"); + +-- Rabid Crag Coyote +DELETE FROM `smart_scripts` WHERE `entryorguid`=2730 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2730,0,0,1,1,0,100,0,30000,600000,120000,600000,4,1018,0,1,0,0,0,1,0,0,0,0,0,0,0,"Rabid Crag Coyote - Out of Combat - Play Sound 1018"), +(2730,0,1,0,61,0,100,0,0,0,0,0,5,393,0,0,0,0,0,1,0,0,0,0,0,0,0,"Rabid Crag Coyote - Out of Combat - Play Emote 393"), +(2730,0,2,0,0,0,100,0,4000,12000,16000,19000,11,3427,32,0,0,0,0,2,0,0,0,0,0,0,0,"Rabid Crag Coyote - In Combat - Cast Infected Wound"), +(2730,0,3,0,0,0,100,0,4000,12000,10000,18000,11,3150,34,0,0,0,0,5,0,0,0,0,0,0,0,"Rabid Crag Coyote - In Combat - Cast Rabies"); + +-- Ridge Stalker +DELETE FROM `smart_scripts` WHERE `entryorguid`=2731 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2731,0,0,0,25,0,100,0,0,0,0,0,11,22766,0,0,0,0,0,1,0,0,0,0,0,0,0,"Feral Crag Coyote - On Reset - Cast Sneak"); + +-- Starving Buzzard +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2829; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2829 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2829,0,0,0,0,0,100,0,5000,9000,16000,24000,11,3427,0,0,0,0,0,2,0,0,0,0,0,0,0,"Starving Buzzard - In Combat - Cast Infected Wound"); + +-- Buzzard +DELETE FROM `smart_scripts` WHERE `entryorguid`=2830 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2830,0,0,0,0,0,100,0,5000,9000,16000,24000,11,3427,0,0,0,0,0,2,0,0,0,0,0,0,0,"Buzzard - In Combat - Cast Infected Wound"); + +-- Giant Buzzard +DELETE FROM `smart_scripts` WHERE `entryorguid`=2831 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2831,0,0,0,0,0,100,0,5000,9000,16000,24000,11,3427,0,0,0,0,0,2,0,0,0,0,0,0,0,"Giant Buzzard - In Combat - Cast Infected Wound"); + +-- Dustbelcher Ogres +UPDATE `smart_scripts` SET `event_chance`=15 WHERE `entryorguid` IN (2715,2906,2717,2701) AND `source_type`=0 AND `id`=0; + +-- Dustbelcher Mauler +DELETE FROM `smart_scripts` WHERE `entryorguid`=2717 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2717,0,1,0,25,0,100,0,0,0,0,0,11,8876,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dustbelcher Mauler - On Reset - Cast Thrash"); + +-- Dustbelcher Shaman +DELETE FROM `smart_scripts` WHERE `entryorguid`=2718 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2718,0,2,0,14,0,100,0,800,40,18000,24000,11,8005,1,0,0,0,0,7,0,0,0,0,0,0,0,"Dustbelcher Shaman - On Friendly At 800 Health - Cast Healing Wave"); + +-- Dustbelcher Wyrmhunter +DELETE FROM `smart_scripts` WHERE `entryorguid`=2716 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2716,0,2,0,0,0,100,0,6000,13000,18000,25000,11,6533,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dustbelcher Wyrmhunter - In Combat - Cast Net"); + +-- Dustbelcher Ogre Mage +DELETE FROM `smart_scripts` WHERE `entryorguid`=2720 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2720,0,2,0,0,0,100,0,4000,8000,31000,37000,11,6742,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dustbelcher Ogre Mage - In Combat - Cast Bloodlust"); + +-- Dustbelcher Lord +DELETE FROM `smart_scripts` WHERE `entryorguid`=2719 AND `source_type`=0 AND `id` IN (0,1,3); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2719,0,0,0,0,0,100,0,2000,5000,18000,21000,11,9128,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dustbelcher Lord - In Combat - Cast Battle Shout"), +(2719,0,1,0,0,0,100,0,7000,11000,31000,35000,11,13730,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dustbelcher Lord - In Combat - Cast Demoralizing Shout"), +(2719,0,3,0,4,0,15,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dustbelcher Lord - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=2719; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(2719,0,0,"Raaar!!! Me smash $r!",12,0,100,0,0,0,1925,0,"Dustbelcher Lord"), +(2719,0,1,"Me smash! You die!",12,0,100,0,0,0,1926,0,"Dustbelcher Lord"), +(2719,0,2,"I'll crush you!",12,0,100,0,0,0,1927,0,"Dustbelcher Lord"); + +-- Dustbelcher Mystic +DELETE FROM `smart_scripts` WHERE `entryorguid`=2907 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2907,0,0,0,0,0,100,0,0,0,3000,5000,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Dustbelcher Mystic - In Combat - Cast Lightning Bolt"), +(2907,0,1,0,0,0,100,0,6000,12000,24000,30000,11,13281,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dustbelcher Mystic - In Combat - Cast Earth Shock"), +(2907,0,3,0,4,0,15,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dustbelcher Mystic - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=2907; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(2907,0,0,"Raaar!!! Me smash $r!",12,0,100,0,0,0,1925,0,"Dustbelcher Mystic"), +(2907,0,1,"Me smash! You die!",12,0,100,0,0,0,1926,0,"Dustbelcher Mystic"), +(2907,0,2,"I'll crush you!",12,0,100,0,0,0,1927,0,"Dustbelcher Mystic"); + +-- Stonevault Bonesnapper +DELETE FROM `smart_scripts` WHERE `entryorguid`=2893 AND `source_type`=0 AND `id` IN (0,1); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2893,0,0,0,0,0,100,0,5000,8000,11000,17000,11,11976,0,0,0,0,0,2,0,0,0,0,0,0,0,"Stonevault Bonesnapper - In Combat - Cast Strike"), +(2893,0,1,0,0,0,100,0,9000,13000,17000,21000,11,12555,0,0,0,0,0,2,0,0,0,0,0,0,0,"Stonevault Bonesnapper - In Combat - Cast Pummel"); + +-- Stonevault Shaman +DELETE FROM `smart_scripts` WHERE `entryorguid`=2894 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2894,0,0,0,0,0,100,0,5000,7000,22000,25000,11,5605,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stonevault Shaman - In Combat - Cast Healing Ward"), +(2894,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stonevault Shaman - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Rumbler +DELETE FROM `smart_scripts` WHERE `entryorguid`=2752 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2752,0,0,0,0,0,100,0,5000,9000,11000,16000,11,6524,0,0,0,0,0,1,0,0,0,0,0,0,0,"Rumbler - In Combat - Cast Ground Tremor"), +(2752,0,1,0,0,0,100,0,7000,11000,14000,19000,11,5568,0,0,0,0,0,1,0,0,0,0,0,0,0,"Rumbler - In Combat - Cast Trample"); + +-- War Golem +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2751; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2751 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2751,0,0,0,0,0,100,0,8000,11000,25000,28000,11,9576,0,0,0,0,0,1,0,0,0,0,0,0,0,"War Golem - In Combat - Cast Lock Down"); + +-- Shadowforge Darkweaver +DELETE FROM `smart_scripts` WHERE `entryorguid`=2740 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2740,0,1,0,0,0,100,0,12000,14000,18000,22000,11,9482,32,0,0,0,0,5,0,0,0,0,0,0,0,"Shadowforge Darkweaver - In Combat - Cast Amplify Flames"); + +-- Shadowforge Warrior +DELETE FROM `smart_scripts` WHERE `entryorguid`=2743 AND `source_type`=0 AND `id`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2743,0,0,0,0,0,100,0,7000,10000,12000,15000,11,17207,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shadowforge Warrior - In Combat - Cast Whirlwind"); + +-- Shadowforge Chanter +DELETE FROM `smart_scripts` WHERE `entryorguid`=2742 AND `source_type`=0 AND `id` IN (0,1); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2742,0,0,0,0,0,100,0,8000,12000,21000,25000,11,6066,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shadowforge Chanter - In Combat - Cast Power Word: Shield"), +(2742,0,1,0,14,0,100,0,400,40,18000,22000,11,6077,0,0,0,0,0,7,0,0,0,0,0,0,0,"Shadowforge Chanter - On Friendly At 400 Health - Cast Renew"); + +-- Shadowforge Surveyor +DELETE FROM `smart_scripts` WHERE `entryorguid`=4844 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4844,0,2,0,9,0,100,0,0,8,18000,22000,11,11831,1,0,0,0,0,1,0,0,0,0,0,0,0,"Shadowforge Surveyor - Within 0-8 Range - Cast Frost Nova"); + +-- Fix spawn position for some creatures +UPDATE `creature` SET `position_x`=-7131.71, `position_y`=-3156.27, `position_z`=244.252, `spawndist`=10, `MovementType`=1 WHERE `guid`=6947; +UPDATE `creature` SET `position_x`=-6636.55, `position_y`=-3547.18, `position_z`=256.767, `spawndist`=5, `MovementType`=1 WHERE `guid`=6926; +UPDATE `creature` SET `position_x`=-6693.88, `position_y`=-3021.04, `position_z`=265.355, `spawndist`=10, `MovementType`=1 WHERE `guid`=6910; +UPDATE `creature` SET `position_x`=-6632.95, `position_y`=-3476.25, `position_z`=272.378, `spawndist`=5, `MovementType`=1 WHERE `guid`=6915; +UPDATE `creature` SET `position_x`=-7149.89, `position_y`=-3477.44, `position_z`=255.994, `spawndist`=10, `MovementType`=1 WHERE `guid`=6911; +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_04_world_from_335_was_2017_12_14_04_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_04_world_from_335_was_2017_12_14_04_world_335.sql new file mode 100644 index 0000000000..028a8cdc00 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_04_world_from_335_was_2017_12_14_04_world_335.sql @@ -0,0 +1,328 @@ +/* +-- Bloodsail Warlock +UPDATE `smart_scripts` SET `event_param3`=3400, `event_param4`=4800 WHERE `entryorguid`=1564 AND `source_type`=0 AND `id`=3; +UPDATE `smart_scripts` SET `event_param1`=3000, `event_param2`=9000, `event_param3`=15000, `event_param4`=20000 WHERE `entryorguid`=1564 AND `source_type`=0 AND `id`=4; + +-- Bloodsail Swashbuckler +UPDATE `smart_scripts` SET `event_param1`=5000, `event_param2`=9000 WHERE `entryorguid`=1563 AND `source_type`=0 AND `id`=0; + +-- Bloodsail Sea Dog +DELETE FROM `smart_scripts` WHERE `entryorguid`=1565 AND `source_type`=0 AND `id` IN (0,1,2); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1565,0,0,0,25,0,100,0,0,0,0,0,11,3616,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodsail Sea Dog - On Reset - Cast Poison Proc"), +(1565,0,1,0,67,0,100,0,6000,8000,0,0,11,37685,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodsail Sea Dog - On Behind Target - Cast Backstab"), +(1565,0,2,0,0,0,100,0,11000,14000,21000,24000,11,12540,0,0,0,0,0,5,0,0,0,0,0,0,0,"Bloodsail Sea Dog - In Combat - Cast Gouge"); + +-- Bloodsail Swabby +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4506; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4506 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4506,0,0,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodsail Swabby - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Captain Keelhaul +DELETE FROM `smart_scripts` WHERE `entryorguid`=2548 AND `source_type`=0 AND `id` IN (1,2); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2548,0,1,0,0,0,100,0,3000,5000,12000,18000,11,7896,0,0,0,0,0,2,0,0,0,0,0,0,0,"Captain Keelhaul - In Combat - Cast Exploding Shot"), +(2548,0,2,0,9,0,100,0,0,8,30000,35000,11,13730,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Keelhaul - Within 0-8 Range - Cast Demoralizing Shout"); + +-- Bloodsail Elder Magus +DELETE FROM `smart_scripts` WHERE `entryorguid`=1653 AND `source_type`=0 AND `id` IN (0,1,2); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1653,0,0,0,0,0,100,0,0,0,3400,4800,11,20823,64,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodsail Elder Magus - In Combat CMC - Cast Fireball"), +(1653,0,1,0,9,0,100,0,0,8,12000,16000,11,11969,2,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodsail Elder Magus - Within 0-8 Range - Cast Fire Nova"), +(1653,0,2,0,0,0,100,0,7000,11000,9000,15000,11,20827,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodsail Elder Magus - In Combat - Cast Flamestrike"); + +-- Captain Stillwater +UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=2550 AND `source_type`=0 AND `id`=0; + +-- Zanzil Witch Doctor +UPDATE `smart_scripts` SET `event_param1`=500, `event_param2`=1000, `event_param3`=3000, `event_param4`=5000 WHERE `entryorguid`=1490 AND `source_type`=0 AND `id`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=1490 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1490,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Zanzil Witch Doctor - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Zanzil Hunter +DELETE FROM `smart_scripts` WHERE `entryorguid`=1489 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1489,0,0,0,0,0,100,0,0,0,2000,4000,11,10277,64,0,0,0,0,2,0,0,0,0,0,0,0,"Zanzil Hunter - In Combat - Cast Throw"); + +-- Zanzil Zombie +UPDATE `smart_scripts` SET `event_param1`=4000, `event_param2`=9000 WHERE `entryorguid`=1488 AND `source_type`=0 AND `id`=0; + +-- Zanzil the Outcast +DELETE FROM `smart_scripts` WHERE `entryorguid`=2534 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2534,0,0,0,0,0,100,0,0,0,23000,28000,11,8832,2,0,0,0,0,1,0,0,0,0,0,0,0,"Zanzil the Outcast - In Combat - Cast Ward of Zanzil"), +(2534,0,1,0,0,0,100,0,1000,1000,3000,5000,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Zanzil the Outcast - In Combat - Cast Lightning Bolt"), +(2534,0,2,0,0,0,100,0,6000,9000,19000,22000,11,8264,0,0,0,0,0,1,0,0,0,0,0,0,0,"Zanzil the Outcast - In Combat - Cast Lava Spout Totem"); + +-- Zanzil Skeleton +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=6388; +DELETE FROM `smart_scripts` WHERE `entryorguid`=6388 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(6388,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Zanzil Skeleton - Just Summoned - Start Attacking"); + +-- Naga Explorer +DELETE FROM `smart_scripts` WHERE `entryorguid`=1907 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1907,0,2,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Naga Explorer - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Lord Sakrasis +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2541; +DELETE FROM `smart_scripts` WHERE `entryorguid`=2541 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2541,0,0,0,0,0,100,0,5000,7000,7000,11000,11,15496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Lord Sakrasis - In Combat - Cast Cleave"), +(2541,0,1,0,0,0,100,0,6000,9000,13000,16000,11,3583,34,0,0,0,0,2,0,0,0,0,0,0,0,"Lord Sakrasis - In Combat - Cast Deadly Poison"); + +-- Lashtail Raptor +DELETE FROM `smart_scripts` WHERE `entryorguid`=686 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(686,0,0,0,0,0,100,0,5000,8000,16000,21000,11,6607,2,0,0,0,0,2,0,0,0,0,0,0,0,"Lashtail Raptor - In Combat - Cast Lash"); + +-- Snapjaw Crocolisk +DELETE FROM `smart_scripts` WHERE `entryorguid`=1152 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1152,0,0,0,0,0,100,0,3000,5000,11000,13000,11,3604,2,0,0,0,0,2,0,0,0,0,0,0,0,"Snapjaw Crocolisk - In Combat - Cast Tendon Rip"); + +-- Elder Stranglethorn Tiger +DELETE FROM `smart_scripts` WHERE `entryorguid`=1085 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1085,0,0,0,0,0,100,0,6000,9000,16000,19000,11,13443,0,0,0,0,0,2,0,0,0,0,0,0,0,"Elder Stranglethorn Tiger - In Combat - Cast Rend"); + +-- Murkgill Oracle +UPDATE `smart_scripts` SET `event_param3`=3400, `event_param4`=4800 WHERE `entryorguid`=4459 AND `source_type`=0 AND `id`=0; + +-- Murkgill Forager +DELETE FROM `smart_scripts` WHERE `entryorguid`=4457 AND `source_type`=0 AND `id` IN (0,1); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4457,0,0,0,0,0,100,0,6000,8000,16000,19000,11,13443,0,0,0,0,0,2,0,0,0,0,0,0,0,"Murkgill Forager - In Combat - Cast Rend"), +(4457,0,1,0,0,0,100,0,3000,5000,4000,9000,11,744,32,0,0,0,0,2,0,0,0,0,0,0,0,"Murkgill Forager - In Combat - Cast Poison"); + +-- Murkgill Lord +UPDATE `smart_scripts` SET `event_param3`=3400, `event_param4`=4800 WHERE `entryorguid`=4460 AND `source_type`=0 AND `id`=1; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4460 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4460,0,2,0,9,0,100,0,0,8,15000,18000,11,11831,1,0,0,0,0,1,0,0,0,0,0,0,0,"Murkgill Lord - Within 0-8 Range - Cast Frost Nova"); + +-- Gluggle +UPDATE `smart_scripts` SET `event_param1`=7000, `event_param2`=9000 WHERE `entryorguid`=14487 AND `source_type`=0 AND `id`=0; + +-- Bhag'thera +DELETE FROM `smart_scripts` WHERE `entryorguid`=728 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(728,0,0,0,0,0,100,0,7000,9000,13000,16000,11,3147,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bhag'thera - In Combat - Cast Rend Flesh"), +(728,0,1,0,0,0,100,0,3000,5000,24000,26000,11,6016,2,0,0,0,0,2,0,0,0,0,0,0,0,"Bhag'thera - In Combat - Cast Pierce Armor"); + +-- Mosh'Ogg Brute +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=1142; +DELETE FROM `smart_scripts` WHERE `entryorguid`=1142 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1142,0,0,0,4,0,15,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mosh'Ogg Brute - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=1142; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(1142,0,0,"Raaar!!! Me smash $r!",12,0,100,0,0,0,1925,0,"Mosh'Ogg Brute"), +(1142,0,1,"Me smash! You die!",12,0,100,0,0,0,1926,0,"Mosh'Ogg Brute"), +(1142,0,2,"I'll crush you!",12,0,100,0,0,0,1927,0,"Mosh'Ogg Brute"); + +-- Mosh'Ogg Witch Doctor +DELETE FROM `smart_scripts` WHERE `entryorguid`=1144 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1144,0,2,0,4,0,15,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mosh'Ogg Witch Doctor - On Aggro - Say Line 0"); + +DELETE FROM `creature_text` WHERE `CreatureID`=1144; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(1144,0,0,"Raaar!!! Me smash $r!",12,0,100,0,0,0,1925,0,"Mosh'Ogg Witch Doctor"), +(1144,0,1,"Me smash! You die!",12,0,100,0,0,0,1926,0,"Mosh'Ogg Witch Doctor"), +(1144,0,2,"I'll crush you!",12,0,100,0,0,0,1927,0,"Mosh'Ogg Witch Doctor"); + +-- Mosh'Ogg Mauler +UPDATE `smart_scripts` SET `event_chance`=100 WHERE `entryorguid`=678 AND `source_type`=0 AND `id`=0; + +-- Mosh'Ogg Shaman +UPDATE `smart_scripts` SET `event_param1`=2000, `event_param2`=6000, `event_param3`=5000, `event_param4`=11000 WHERE `entryorguid`=679 AND `source_type`=0 AND `id`=0; +UPDATE `smart_scripts` SET `event_param1`=7000, `event_param2`=13000 WHERE `entryorguid`=679 AND `source_type`=0 AND `id`=2; + +-- Mosh'Ogg Warmonger +UPDATE `smart_scripts` SET `event_chance`=100, `event_param1`=5000, `event_param2`=7000 WHERE `entryorguid`=709 AND `source_type`=0 AND `id`=0; + +-- Mosh'Ogg Spellcrafter +DELETE FROM `smart_scripts` WHERE `entryorguid`=710 AND `source_type`=0 AND `id` IN (0,1,2); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(710,0,0,0,1,0,100,0,1000,1000,1800000,1800000,11,12544,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mosh'Ogg Spellcrafter - Out of Combat - Cast Frost Armor"), +(710,0,1,0,0,0,100,0,0,0,3000,5000,11,9053,64,0,0,0,0,2,0,0,0,0,0,0,0,"Mosh'Ogg Spellcrafter - In Combat CMC - Cast Fireball"), +(710,0,2,0,0,0,100,0,7000,8000,9000,12000,11,11829,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mosh'Ogg Spellcrafter - In Combat - Cast Flamestrike"); + +-- Mosh'Ogg Butcher +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=723; +DELETE FROM `smart_scripts` WHERE `entryorguid`=723 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(723,0,0,0,4,0,100,0,0,0,0,0,11,29651,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mosh'Ogg Butcher - On Aggro - Cast Dual Wield"), +(723,0,1,0,0,0,100,0,5000,7000,7000,11000,11,15496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mosh'Ogg Butcher - In Combat - Cast Cleave"), +(723,0,2,0,25,0,100,0,0,0,0,0,11,12787,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mosh'Ogg Butcher - On Reset - Cast Thrash"); + +-- Venture Co. Geologist +DELETE FROM `smart_scripts` WHERE `entryorguid`=1096 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1096,0,0,0,0,0,100,0,0,0,3000,5000,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Venture Co. Geologist - Out of Combat - Cast Lightning Bolt"), +(1096,0,1,0,0,0,100,0,5000,8000,30000,33000,11,184,32,0,0,0,0,1,0,0,0,0,0,0,0,"Venture Co. Geologist - In Combat - Cast Fire Shield II"), +(1096,0,2,0,2,0,100,0,0,50,11000,16000,11,4979,2,0,0,0,0,1,0,0,0,0,0,0,0,"Venture Co. Geologist - Between 0-50% Health - Cast Quick Flame Ward"), +(1096,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Venture Co. Geologist - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Foreman Cozzle +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4723; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4723 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4723,0,0,0,0,0,100,0,0,0,3000,5000,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Foreman Cozzle - In Combat - Cast Lightning Bolt"), +(4723,0,1,0,0,0,100,0,5000,8000,30000,33000,11,184,32,0,0,0,0,1,0,0,0,0,0,0,0,"Foreman Cozzle - In Combat - Cast Fire Shield II"), +(4723,0,2,0,2,0,100,0,0,50,11000,16000,11,4979,2,0,0,0,0,1,0,0,0,0,0,0,0,"Foreman Cozzle - Between 0-50% Health - Cast Quick Flame Ward"), +(4723,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Foreman Cozzle - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Kurzen Subchief +DELETE FROM `smart_scripts` WHERE `entryorguid`=978 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(978,0,1,0,25,0,100,0,0,0,0,0,11,3284,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kurzen Subchief - On Reset - Cast Violent Shield"); + +-- Kurzen Headshrinker +UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=941 AND `source_type`=0 AND `id`=1; + +-- Sergeant Malthus +UPDATE `smart_scripts` SET `event_param1`=3000, `event_param2`=6000 WHERE `entryorguid`=814 AND `source_type`=0 AND `id`=0; + +-- Kurzen Medicine Man +DELETE FROM `smart_scripts` WHERE `entryorguid`=940 AND `source_type`=0 AND `id` IN (0,1); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(940,0,0,0,14,0,100,0,250,30,19000,28000,11,6077,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kurzen Medicine Man - On Friendly At 250 Health - Cast Renew"), +(940,0,1,0,14,0,100,0,550,30,34000,39000,11,6064,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kurzen Medicine Man - On Friendly At 550 Health - Cast Heal"); + +-- Cold Eye Basilisk +DELETE FROM `smart_scripts` WHERE `entryorguid`=690 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(690,0,0,0,0,0,100,0,7000,9000,22000,26000,11,3636,0,0,0,0,0,5,0,0,0,0,0,0,0,"Cold Eye Basilisk - In Combat - Cast Crystalline Slumber"); + +-- Thrashtail Basilisk +DELETE FROM `smart_scripts` WHERE `entryorguid`=1550 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1550,0,0,0,0,0,100,0,5000,7000,14000,18000,11,6607,0,0,0,0,0,2,0,0,0,0,0,0,0,"Thrashtail Basilisk - In Combat - Cast Lash"); + +-- Ironjaw Basilisk +DELETE FROM `smart_scripts` WHERE `entryorguid`=1551 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1551,0,0,0,0,0,100,0,7000,9000,22000,26000,11,5106,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ironjaw Basilisk - In Combat - Cast Crystal Flash"); + +-- Scale Belly +DELETE FROM `smart_scripts` WHERE `entryorguid`=1552 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1552,0,0,0,0,0,100,0,7000,9000,22000,26000,11,5106,0,0,0,0,0,2,0,0,0,0,0,0,0,"Scale Belly - In Combat - Cast Crystal Flash"); + +-- Kurmokk +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=14491; +DELETE FROM `smart_scripts` WHERE `entryorguid`=14491 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(14491,0,0,0,2,0,100,1,0,50,0,0,11,8599,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kurmokk - Between 0-50% Health - Cast Enrage (No Repeat)"), +(14491,0,1,0,2,0,100,1,0,50,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kurmokk - Between 0-50% Health - Say Line 0 (No Repeat)"); + +DELETE FROM `creature_text` WHERE `CreatureID`=14491; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(14491,0,0,"%s becomes enraged!",16,0,100,0,0,0,10677,0,"Kurmokk"); + +-- Bloodscalp Shaman +DELETE FROM `smart_scripts` WHERE `entryorguid`=697 AND `source_type`=0 AND `id` IN (1,4,5); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(697,0,1,0,16,0,100,0,8788,1,15000,30000,11,8788,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodscalp Shaman - On Friendly Unit Missing Buff 'Lightning Shield' - Cast Lightning Shield"), +(697,0,4,0,0,0,100,0,7000,11000,15000,19000,11,11969,2,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodscalp Shaman - In Combat - Cast Fire Nova"), +(697,0,5,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloodscalp Shaman - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Bloodscalp Warrior +DELETE FROM `smart_scripts` WHERE `entryorguid`=587 AND `source_type`=0 AND `id`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(587,0,0,0,0,0,100,0,5000,9000,16000,22000,11,6713,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodscalp Warrior - In Combat - Cast Disarm"); + +-- Bloodscalp Scavenger +DELETE FROM `smart_scripts` WHERE `entryorguid`=702 AND `source_type`=0 AND `id` IN (1,3); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(702,0,1,0,0,0,100,0,5000,10000,20000,30000,11,744,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodscalp Scavenger - In Combat - Cast Poison"), +(702,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloodscalp Scavenger - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Bloodscalp Witch Doctor +DELETE FROM `smart_scripts` WHERE `entryorguid`=660 AND `source_type`=0 AND `id` IN (0,2,3); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(660,0,0,0,0,0,100,0,4000,6000,25000,30000,11,8376,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodscalp Witch Doctor - In Combat - Cast Earthgrab Totem"), +(660,0,2,0,0,0,100,0,7000,9000,25000,30000,11,5605,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodscalp Witch Doctor - In Combat - Cast Healing Ward"), +(660,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloodscalp Witch Doctor - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Skullsplitter Mystic +UPDATE `smart_scripts` SET `event_param3`=3000, `event_param4`=5000 WHERE `entryorguid`=780 AND `source_type`=0 AND `id`=0; + +-- Skullsplitter Spiritchaser +UPDATE `smart_scripts` SET `event_param1`=0, `event_param2`=0, `event_param3`=3000, `event_param4`=5000 WHERE `entryorguid`=672 AND `source_type`=0 AND `id`=1; +DELETE FROM `smart_scripts` WHERE `entryorguid`=672 AND `source_type`=0 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(672,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skullsplitter Spiritchaser - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Skullsplitter Scout +DELETE FROM `smart_scripts` WHERE `entryorguid`=782 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(782,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skullsplitter Scout - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Skullsplitter Witch Doctor +DELETE FROM `smart_scripts` WHERE `entryorguid`=670 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(670,0,2,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skullsplitter Witch Doctor - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Skullsplitter Beastmaster +DELETE FROM `smart_scripts` WHERE `entryorguid`=784 AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(784,0,2,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skullsplitter Beastmaster - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Skullsplitter Headhunter +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=781; +DELETE FROM `smart_scripts` WHERE `entryorguid`=781 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(781,0,0,0,0,0,100,0,3000,5000,12000,16000,11,6533,0,0,0,0,0,2,0,0,0,0,0,0,0,"Skullsplitter Headhunter - In Combat - Cast Net"), +(781,0,1,0,9,0,100,0,0,5,22000,26000,11,3148,0,0,0,0,0,2,0,0,0,0,0,0,0,"Skullsplitter Headhunter - Within 0-5 Range - Cast Head Crack"), +(781,0,2,0,0,0,100,0,0,0,2000,4000,11,10277,64,0,0,0,0,2,0,0,0,0,0,0,0,"Skullsplitter Headhunter - In Combat - Cast Throw"), +(781,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skullsplitter Headhunter - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Ana'thek the Cruel +DELETE FROM `smart_scripts` WHERE `entryorguid`=1059 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1059,0,1,0,12,0,100,1,0,20,0,0,11,7160,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ana'thek the Cruel - Target Between 0-20% Health - Cast 'Execute' (No Repeat)"); + +-- Mogh the Undying +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=1060; +DELETE FROM `smart_scripts` WHERE `entryorguid`=1060 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1060,0,0,0,1,0,100,1,1000,2000,0,0,11,8813,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mogh the Undying - Out of Combat - Cast Summon Kurzen Mindslave"), +(1060,0,1,0,2,0,100,0,0,50,12000,16000,11,8809,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mogh the Undying - Between 0-50% Health - Cast Slave Drain"), +(1060,0,2,0,0,0,100,0,0,0,3000,5000,11,12471,64,0,0,0,0,2,0,0,0,0,0,0,0,"Mogh the Undying - In Combat - Cast Shadow Bolt"), +(1060,0,3,0,1,0,100,0,1000,1000,1800000,1800000,11,20798,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mogh the Undying - Out of Combat - Cast Demon Skin"); + +-- Kurzen Mindslave +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=6366; +DELETE FROM `smart_scripts` WHERE `entryorguid`=6366 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(6366,0,0,0,14,0,100,0,800,40,15000,18000,11,11642,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kurzen Mindslave - Friendly At 800 Health - Cast Heal"), +(6366,0,1,0,0,0,100,0,8000,12000,18000,24000,11,7964,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kurzen Mindslave - In Combat - Cast Smoke Bomb"); + +-- Delete wrong spawn +DELETE FROM `creature` WHERE `guid`=769; -- Kurzen Mindslave spawns via script +DELETE FROM `creature_addon` WHERE `guid`=769; + +-- Add missing spawn for Mosh'Ogg Butcher +SET @GUID := 769; +DELETE FROM `creature` WHERE `guid`=@GUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(@GUID,723,0,0,0,1,1,0,1,-12492.5,-942.217,42.1543,0.814825,300,10,0,2050,0,1,0,0,0,"",0); + +-- Fix spawn position for Rippa +UPDATE `creature` SET `position_x`=-14451.6, `position_y`=806.17, `position_z`=-36.7082 WHERE `guid`=49058; + +-- Add random movement for some creatures +UPDATE `creature` SET `spawndist`=10, `MovementType`=1 WHERE `guid` IN (2169,1342,1348); + +-- Add equipment to Zanzil the Outcast +DELETE FROM `creature_equip_template` WHERE `CreatureID` IN (2534); +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES +(2534,1,5303,0,0,0); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_05_world_from_335_was_2017_12_14_05_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_05_world_from_335_was_2017_12_14_05_world_335.sql new file mode 100644 index 0000000000..f59c35a2c8 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_05_world_from_335_was_2017_12_14_05_world_335.sql @@ -0,0 +1,18 @@ +/* +-- Draz'Zilb +DELETE FROM `creature_text` WHERE `CreatureID`=4501; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(4501,0,0,"%s begins to cast a spell over the hearts and tongues.",16,0,100,0,0,0,1511,0,"Draz'Zilb"), +(4501,1,0,"The brood of Onyxia!",12,0,100,0,0,0,1512,0,"Draz'Zilb"); + +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4501; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4501 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=450100 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4501,0,0,0,20,0,100,0,1169,0,0,0,80,450100,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draz'Zilb - On Quest 'Identifying the Brood' Finished - Run Script"), +(450100,9,0,0,0,0,100,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draz'Zilb - On Script - Remove Npc Flag Questgiver+Gossip"), +(450100,9,1,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draz'Zilb - On Script - Say Line 0"), +(450100,9,2,0,0,0,100,0,0,0,0,0,11,6741,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draz'Zilb - On Script - Cast Identify Brood"), +(450100,9,3,0,0,0,100,0,11000,11000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draz'Zilb - On Script - Say Line 1"), +(450100,9,4,0,0,0,100,0,0,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draz'Zilb - On Script - Add Npc Flag Questgiver+Gossip"); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_06_world_from_335_was_2017_12_14_06_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_06_world_from_335_was_2017_12_14_06_world_335.sql new file mode 100644 index 0000000000..4c635c1c94 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_06_world_from_335_was_2017_12_14_06_world_335.sql @@ -0,0 +1,69 @@ +/* +-- Piznik +UPDATE `smart_scripts` SET `action_param2`=2 WHERE `entryorguid`=4276 AND `source_type`=0 AND `id`=1; +DELETE FROM `smart_scripts` WHERE `entryorguid`=427600 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(427600,9,0,0,0,0,100,0,0,0,0,0,19,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Remove UNIT_FLAG_IMMUNE_TO_NPC"), +(427600,9,1,0,0,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Remove Questgiver flag"), +(427600,9,2,0,0,0,100,0,0,0,0,0,2,42,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Change Faction"), +(427600,9,3,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Say Line 0"), +(427600,9,4,0,0,0,100,0,10000,10000,0,0,12,3998,4,20000,0,0,0,8,0,0,0,938.3,-257.35,-2.22,0,"Piznik - On Script - Summon Windshear Vermin"), +(427600,9,5,0,0,0,100,0,0,0,0,0,12,3998,4,20000,0,0,0,8,0,0,0,942.28,-254.49,-2.38,0,"Piznik - On Script - Summon Windshear Vermin"), +(427600,9,6,0,0,0,100,0,0,0,0,0,12,4001,4,20000,0,0,0,8,0,0,0,938.52,-253.2,-2.08,0,"Piznik - On Script - Summon Windshear Tunnel Rat"), +(427600,9,7,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,4001,0,0,0,0,0,0,"Piznik - On Script - Say Line 0 (Windshear Tunnel Rat)"), +(427600,9,8,0,0,0,100,0,75000,75000,0,0,12,4002,4,20000,0,0,0,8,0,0,0,924.96,-266.582,-1.32596,0.620443,"Piznik - On Script - Summon Windshear Stonecutter"), +(427600,9,9,0,0,0,100,0,0,0,0,0,12,4002,4,20000,0,0,0,8,0,0,0,928.351,-268.308,-1.57308,0.769668,"Piznik - On Script - Summon Windshear Stonecutter"), +(427600,9,10,0,0,0,100,0,0,0,0,0,12,4003,4,20000,0,0,0,8,0,0,0,928.377,-264.272,-1.36686,0.871769,"Piznik - On Script - Summon Windshear Geomancer"), +(427600,9,11,0,0,0,100,0,0,0,0,0,12,4003,4,20000,0,0,0,8,0,0,0,932.595,-265.232,-1.86839,0.918893,"Piznik - On Script - Summon Windshear Geomancer"), +(427600,9,12,0,0,0,100,0,0,0,0,0,12,4004,4,20000,0,0,0,8,0,0,0,933.813,-261.041,-2.12867,0.930675,"Piznik - On Script - Summon Windshear Overlord"), +(427600,9,13,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,4004,0,0,0,0,0,0,"Piznik - On Script - Say Line 0 (Windshear Overlord)"), +(427600,9,14,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Say Line 1"), +(427600,9,15,0,0,0,100,0,120000,120000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Say Line 2"), +(427600,9,16,0,0,0,100,0,5000,5000,0,0,12,4001,4,20000,0,0,0,8,0,0,0,938.3,-257.35,-2.22,0,"Piznik - On Script - Summon Windshear Tunnel Rat"), +(427600,9,17,0,0,0,100,0,0,0,0,0,12,4001,4,20000,0,0,0,8,0,0,0,942.28,-254.49,-2.38,0,"Piznik - On Script - Summon Windshear Tunnel Rat"), +(427600,9,18,0,0,0,100,0,0,0,0,0,12,4001,4,20000,0,0,0,8,0,0,0,938.52,-253.2,-2.08,0,"Piznik - On Script - Summon Windshear Tunnel Rat"), +(427600,9,19,0,0,0,100,0,0,0,0,0,12,4004,4,20000,0,0,0,8,0,0,0,939.51,-253.11,-2.02,0,"Piznik - On Script - Summon Windshear Overlord"), +(427600,9,20,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,19,4004,0,0,0,0,0,0,"Piznik - On Script - Say Line 1 (Windshear Overlord)"), +(427600,9,21,0,0,0,100,0,100000,100000,0,0,18,512,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Set UNIT_FLAG_IMMUNE_TO_NPC"), +(427600,9,22,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Add Questgiver flag"), +(427600,9,23,0,0,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Change Faction"), +(427600,9,24,0,0,0,100,0,0,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Piznik - On Script - Say Line 3"), +(427600,9,25,0,0,0,100,0,0,0,0,0,15,1090,0,0,0,0,0,12,1,0,0,0,0,0,0,"Piznik - On Script - Complete quest 'Gerenzo's Orders'"); + +-- Windshear Vermin +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=3998; +DELETE FROM `smart_scripts` WHERE `entryorguid`=3998 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(3998,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Windshear Vermin - Just Summoned - Start Attacking"); + +-- Windshear Tunnel Rat +DELETE FROM `smart_scripts` WHERE `entryorguid`=4001 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4001,0,1,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Windshear Tunnel Rat - Just Summoned - Start Attacking"); + +-- Windshear Stonecutter +DELETE FROM `smart_scripts` WHERE `entryorguid`=4002 AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4002,0,1,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Windshear Stonecutter - Just Summoned - Start Attacking"); + +-- Windshear Geomancer +DELETE FROM `smart_scripts` WHERE `entryorguid`=4003 AND `source_type`=0 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4003,0,3,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Windshear Geomancer - Just Summoned - Start Attacking"); + +-- Windshear Overlord +DELETE FROM `smart_scripts` WHERE `entryorguid`=4004 AND `source_type`=0 AND `id`=3; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4004,0,3,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Windshear Overlord - Just Summoned - Start Attacking"); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID` IN (4276, 4001, 4004); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(4276,0,0,"All right, watch my back while I get you some of this ore.",12,0,100,0,0,0,1427,0,"Piznik"), +(4276,1,0,"Look out! It sounds like more of them!",12,0,100,0,0,0,1431,0,"Piznik"), +(4276,2,0,"Just a little while longer, I've almost got it!",12,0,100,0,0,0,1432,0,"Piznik"), +(4276,3,0,"There, I've got it!",12,0,100,0,0,0,1434,0,"Piznik"), +(4001,0,0,"Hey! You're not supposed to be here! C'mon boys!",12,0,100,0,0,0,1428,0,"Windshear Tunnel Rat"), +(4004,0,0,"I think the sounds came from over here. We'd better check it out.",12,0,100,0,0,0,1430,0,"Windshear Overlord"), +(4004,1,0,"What's going on here? Piznik! I knew we shouldn't have let you stick around!",12,0,100,0,0,0,1433,0,"Windshear Overlord"); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_07_world_from_335_was_2017_12_14_07_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_07_world_from_335_was_2017_12_14_07_world_335.sql new file mode 100644 index 0000000000..0531bd2bdf --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_07_world_from_335_was_2017_12_14_07_world_335.sql @@ -0,0 +1,29 @@ +/* +-- Jarkal Mossmeld +DELETE FROM `creature_text` WHERE `CreatureID`=6868; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(6868,0,0,"Allow me to get some water for the inking reagent.",12,0,100,0,0,0,3082,0,"Jarkal Mossmeld"), +(6868,1,0,"This will do nicely. Now to the task at hand!",12,0,100,0,0,0,3084,0,"Jarkal Mossmeld"), +(6868,2,0,"There we go, all finished. The journal has been translated for you.",12,0,100,1,0,0,3085,0,"Jarkal Mossmeld"), +(6868,3,0,"And now for a quick look at these gems.",12,0,100,0,0,0,3083,0,"Jarkal Mossmeld"), +(6868,4,0,"Just as I thought, the gems and the necklace don't matter. It's all about the power source.",12,0,100,1,0,0,3091,0,"Jarkal Mossmeld"); + +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=6868; +DELETE FROM `smart_scripts` WHERE `entryorguid`=6868 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (686800,686801) AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(6868,0,0,0,20,0,100,0,2338,0,0,0,80,686800,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Quest 'Translating the Journal (Part 2)' Finished - Run Script"), +(6868,0,1,0,20,0,100,0,2339,0,0,0,80,686801,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Quest 'Find the Gems and Power Source' Finished - Run Script"), +(686800,9,0,0,0,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Remove Npc Flag Questgiver"), +(686800,9,1,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Say Line 0"), +(686800,9,2,0,0,0,100,0,2000,2000,0,0,11,5504,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Cast Conjure Water"), +(686800,9,3,0,0,0,100,0,4000,4000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Say Line 1"), +(686800,9,4,0,0,0,100,0,2000,2000,0,0,11,9744,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Cast Jarkal's Translation"), +(686800,9,5,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Say Line 2"), +(686800,9,6,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Add Npc Flag Questgiver"), +(686801,9,0,0,0,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Remove Npc Flag Questgiver"), +(686801,9,1,0,0,0,100,0,1000,1000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Say Line 3"), +(686801,9,2,0,0,0,100,0,2000,2000,0,0,11,5017,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Cast Divining Trance"), +(686801,9,3,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Say Line 4"), +(686801,9,4,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jarkal Mossmeld - On Script - Add Npc Flag Questgiver"); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_09_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_09_world.sql new file mode 100644 index 0000000000..bd10d31531 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_14_09_world.sql @@ -0,0 +1,3 @@ +-- DELETE FROM `spawn_group` WHERE `groupId`=2 AND `spawnType`=0 AND `spawnId` IN (16668,16669,16806,17553); +UPDATE `conditions` SET `SourceTypeOrReferenceId`=17, `SourceGroup`=0, `ConditionTarget`=1 WHERE `SourceEntry`=29528 AND `SourceTypeOrReferenceId`=13; +-- UPDATE `conditions` SET `SourceTypeOrReferenceId`=17, `SourceGroup`=0, `ConditionTarget`=1 WHERE `SourceEntry`=57908 AND `SourceTypeOrReferenceId`=13; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_00_world.sql new file mode 100644 index 0000000000..fbcd6578c8 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra`= flags_extra | 2048 WHERE `entry` IN (49874, 50039); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_00_world_from_335_was_2017_12_16_00_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_00_world_from_335_was_2017_12_16_00_world.sql new file mode 100644 index 0000000000..12ff8116a9 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_00_world_from_335_was_2017_12_16_00_world.sql @@ -0,0 +1,12 @@ +-- +UPDATE `reference_loot_template` SET `Entry`=34210 WHERE `Item` IN (42117,46373,42116,42075,42074,42073,42072,42071,42070,42069,42040,42039,42038,42037,42036,42035,42034,42017,42005,41971,41959,41940,41927,41909,41903,41898,41893,41885,41881,41874,41864,41840,41836,41832,41773,41767,41667,41655,41640,41635,41630,41625,41621,41617,41304,41298,41293,41287,41235,41230,41225,41205,41199,41143,41137,41075,41070,41065,41060,41055,41051,41033,41027,41007,41001,40983,40977,40976,40939,40927,40889,40882,40881,40849,40848,40847,40809,40808,40807) AND entry=34204; +UPDATE `creature_loot_template` SET `MaxCount`=1 WHERE `Entry`=35013 AND `Item`=1 AND `Reference`=34204; +DELETE FROM `creature_loot_template` WHERE `Entry`=35013 AND `Item`=3 AND `Reference`=34210; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`) VALUES +(35013, 3, 34210, 100, 0, 1, 0, 1, 1); + +UPDATE `reference_loot_template` SET `Entry`=34211 WHERE `item` IN (41972,42006,41960,41941,41928,41034,41144,41028,41008,41002,40940,41200,41206,40928,40852,41875,41865,40851,40850,40812,40811,41288,41774,41768,41668,41656,41294,41299,41138,42018,40810,41305,41618,41626,41631,41636,41641,41833,41236,41231,41226,41837,41841,41882,41886,41894,41899,41904,41910,46374,42119,41076,41071,42118,42082,41066,41061,42081,42080,41056,41052,42079,42078,42077,42076,40984,40979,40978,42047,42046,40890,40884,40883,42045,42044,42043,42042,42041,41622) AND entry=34205; +UPDATE `creature_loot_template` SET `MaxCount`=2 WHERE `Entry`=35360 AND `Item`=1 AND `Reference`=34205; +DELETE FROM `creature_loot_template` WHERE `Entry`=35360 AND `Item`=3 AND `Reference`=34211; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`) VALUES +(35360, 3, 34211, 100, 0, 1, 0, 1, 2); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_01_world_from_335_was_2017_12_14_09_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_01_world_from_335_was_2017_12_14_09_world.sql new file mode 100644 index 0000000000..a60d585673 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_01_world_from_335_was_2017_12_14_09_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=19 AND `SourceGroup` IN (25286, 25500); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(19, 0, 25286, 0, 0, 27, 0, 75, 3, 0, 0, 0, 0, "", "Quest 'Words of Delivery' requires level 75 or higher"), +(19, 0, 25500, 0, 0, 27, 0, 74, 4, 0, 0, 0, 0, "", "Quest 'Words of Delivery' requires level 74 or lower"); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_01_world_from_335_was_2017_12_16_01_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_01_world_from_335_was_2017_12_16_01_world.sql new file mode 100644 index 0000000000..0ebce4f5c9 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_01_world_from_335_was_2017_12_16_01_world.sql @@ -0,0 +1,212 @@ +-- missing creatures -- +DELETE FROM creature WHERE guid IN (16668,16669,82879,82899,82915,84418,84423,84432,84436,84437,84439); +INSERT INTO creature (guid, id, modelid, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, curhealth, curmana, MovementType) VALUES +-- Acherus Necromancer +(16668,28889,0,609,1,4,2105.21,-6131.12,6.17389,0.168441,360,0,8982,0,2), +(16669,28889,0,609,1,4,2117.44,-5762.23,98.3189,1.36616,360,0,8982,0,2), +(82879,28889,0,609,1,4,2153.62,-5878.11,101.263,4.94146,360,0,8982,0,2), +-- Scarlet Ghoul -- fast respawntime needed for event +(82899,28897,0,609,1,4,2077.1,-5744.47,99.3915,3.69346,30,0,925,0,2), +(82915,28897,0,609,1,4,2090.98,-5772.49,99.1364,3.00624,30,0,891,0,2), +(84418,28897,0,609,1,4,2130.24,-5786.56,98.8595,3.53639,30,0,925,0,2), +(84423,28897,0,609,1,4,2132.06,-5680.27,101.872,3.74295,30,0,925,0,2), +(84432,28897,0,609,1,4,2146.72,-5850.4,101.348,2.97874,30,0,960,0,2), +(84436,28897,0,609,1,4,2146.68,-5891.05,101.386,2.83344,30,0,891,0,2), +(84437,28897,0,609,1,4,2170.08,-5862.69,101.377,3.13975,30,0,960,0,2), +(84439,28897,0,609,1,4,2163.73,-5819.37,101.347,3.34395,30,0,960,0,2); +-- Gluttonous Geist +UPDATE creature SET spawndist = 10, MovementType = 1, spawntimesecs = 25 WHERE guid BETWEEN 130297 AND 130331; +UPDATE creature SET position_x = 2179.580078, position_y = -5735.517578, position_z = 102.051216, orientation = 0.28 WHERE guid = 130321; +UPDATE creature SET position_x = 2285.824463, position_y = -5825.710938, position_z = 100.934158, orientation = 6.24 WHERE guid = 130316; +UPDATE creature SET position_x = 2424.753418, position_y = -5879.221191, position_z = 104.670280, orientation = 2.05 WHERE guid = 130323; +UPDATE creature SET position_x = 2352.291992, position_y = -5857.714844, position_z = 102.684357, orientation = 1.54 WHERE guid = 130315; +UPDATE creature SET position_x = 2237.403320, position_y = -5911.937988, position_z = 100.284546, orientation = 5.57 WHERE guid = 130311; +UPDATE creature SET position_x = 2207.168457, position_y = -5783.182617, position_z = 101.517105, orientation = 4.78 WHERE guid = 130320; +UPDATE creature SET position_x = 2108.11, position_y = -5844.99, position_z = 102.581, orientation = 3.31 WHERE guid = 130301; +-- Acherus Necromancer +UPDATE creature SET position_x = 2239.78, position_y = -6059.1, position_z = 5.76, orientation = 4.1 WHERE guid = 130118; +UPDATE creature SET position_x = 2193.64, position_y = -6099.1, position_z = 1.52, orientation = 1.84 WHERE guid = 130120; +UPDATE creature SET position_x = 2251.14, position_y = -6139.8, position_z = 1.86, orientation = 1.98 WHERE guid = 130119; +UPDATE creature SET spawndist = 0, MovementType = 2 WHERE guid IN (130118,130119,130120,16668,16669,82879); +DELETE FROM waypoint_data WHERE id IN (1301180,1301190,1301200,166680,166690,828790); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `delay`, `action`, `orientation`, `action_chance`, `move_type`) VALUES +-- 1st +(1301180,1,2234.99,-6065.31,5.73,31000,0,4.29,100,0), +(1301180,2,2240.05,-6060.546,5.688,40000,0,0,100,0), +(1301180,3,2248.52,-6078.31,6.09,31000,0,4.90,100,0), +(1301180,4,2240.05,-6060.546,5.688,40000,0,0,100,0), +-- 2nd +(1301200,1,2199.24,-6095.62,1.83137,31000,0,0.639755,100,0), +(1301200,2,2193.64,-6099.1,1.52,40000,0,0,100,0), +(1301200,3,2188.74,-6091.56,1.91467,31000,0,1.92388,100,0), +(1301200,4,2193.64,-6099.1,1.52,40000,0,0,100,0), +-- 3rd +(1301190,1,2258.88,-6144.58,2.50571,31000,0,5.62306,100,0), +(1301190,2,2251.14,-6139.8,1.86,40000,0,0,100,0), +(1301190,3,2247.4,-6147.9,2.02971,31000,0,4.47245,100,0), +(1301190,4,2251.14,-6139.8,1.86,40000,0,0,100,0), +-- 4th +(166680,1,2115.99,-6144.1,3.84152,40000,0,5.46595,100,0), +(166680,2,2105.21,-6131.12,6.17389,31000,0,0,100,0), +(166680,3,2112.93,-6120.35,7.26217,40000,0,1.12662,100,0), +(166680,4,2105.21,-6131.12,6.17389,31000,0,0,100,0), +-- 5th +(166690,1,2124.6,-5749.84,98.8654,31000,0,1.02847,100,0), +(166690,2,2117.44,-5762.23,98.3189,40000,0,0,100,0), +(166690,3,2109.09,-5755.77,98.9729,31000,0,2.48049,100,0), +(166690,4,2117.44,-5762.23,98.3189,40000,0,0,100,0), +-- 6th +(828790,1,2149.98,-5888.45,101.283,40000,0,3.84142,100,0), +(828790,2,2153.62,-5878.11,101.263,31000,0,0,100,0), +(828790,3,2162.13,-5881.28,101.332,40000,0,6.04446,100,0), +(828790,4,2153.62,-5878.11,101.263,31000,0,0,100,0); + +DELETE FROM `creature_addon` WHERE `guid` IN (130118,130119,130120,16668,16669,82879); +INSERT INTO `creature_addon` (`guid`, `path_id`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(130118,1301180,0,1,0,""), +(130119,1301190,0,1,0,""), +(130120,1301200,0,1,0,""), +(16668,166680,0,1,0,""), +(16669,166690,0,1,0,""), +(82879,828790,0,1,0,""); + +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=28889; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (28889,28897) AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(28889,0,0,0,34,0,100,0,2,0,0,0,11,52683,0,0,0,0,0,1,0,0,0,0,0,0,0,"Acherus Necromancer - On movement informer - Cast Scarlet Ghoul"), +(28889,0,1,0,34,0,100,0,2,3,0,0,11,52683,0,0,0,0,0,1,0,0,0,0,0,0,0,"Acherus Necromancer - On movement informer - Cast Scarlet Ghoul"), +(28897, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Scarlet Ghoul - On reset - Set Active On"), +(28897, 0, 1, 0, 54, 0, 100, 0, 0, 0, 0, 0, 53, 1, 28897, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, "Scarlet Ghoul - On Just summoned - Start Waypoint"), +(28897, 0, 2, 3, 54, 0, 100, 0, 0, 0, 0, 0, 41, 300000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Scarlet Ghoul - On Just summoned - Despawn In 300000 ms"), +(28897, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Scarlet Ghoul - On Just summoned - Say Line 0"), +(28897, 0, 5, 0, 54, 0, 100, 0, 0, 0, 0, 0, 53, 1, 288970, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, "Scarlet Ghoul - On Just summoned - Start Waypoint"); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (28897); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 2, 28897, 0, 0, 23, 1, 4354, 0, 0, 1, 0, 0, '', 'Scarlet Ghoul SAI'), +(22, 6, 28897, 0, 0, 23, 1, 4354, 0, 0, 0, 0, 0, '', 'Scarlet Ghoul SAI'); + +-- Scralet Ghoul +UPDATE creature_template SET MovementType = 0, InhabitType = 3 WHERE entry = 28897; +DELETE FROM `creature_template_addon` WHERE `entry` IN (28897); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(28897,0,0,1,0,""); + +DELETE FROM `waypoints` WHERE `entry`=288970; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`) VALUES +(288970,1,2109.46,-6060.24,5.68025), +(288970,2,2070.14,-6009.97,14.1785), +(288970,3,2026.73,-5988.91,34.4922), +(288970,4,2012.75,-5986.29,41.7496), +(288970,5,1968.02,-5981.75,78.1271), +(288970,6,1940.42,-5973.18,100.583), +(288970,7,1889.64,-5929.67,103.984), +(288970,8,1853.33,-5918.92,105.118), +(288970,9,1805.12,-5934.13,115.66), +(288970,10,1724.81,-5922.4,117.299); + +-- Waypoints +UPDATE creature SET spawndist = 0, MovementType = 2 WHERE guid IN (82899,82915,84418,84423,84432,84436,84437,84439); +DELETE FROM `creature_addon` WHERE `guid` IN (82899,82915,84418,84423,84432,84436,84437,84439); +INSERT INTO `creature_addon` (`guid`, `path_id`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(82899,828990,0,1,0,""), +(82915,829150,0,1,0,""), +(84418,844180,0,1,0,""), +(84423,844230,0,1,0,""), +(84432,844320,0,1,0,""), +(84436,844360,0,1,0,""), +(84437,844370,0,1,0,""), +(84439,844390,0,1,0,""); + +DELETE FROM waypoint_data WHERE id IN (828990,829150,844180,844230,844320,844360,844370,844390); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `delay`, `action`, `orientation`, `action_chance`, `move_type`) VALUES +-- Scarlet Ghoul +-- #1 +(828990,1,2077.1,-5744.47,99.3915,2000,0,3.69346,100,1), +(828990,2,2037.4,-5753.16,98.4207,0,0,3.62744,100,1), +(828990,3,2016.68,-5768.47,102.027,0,0,3.85128,100,1), +(828990,4,1988.66,-5790.4,100.921,0,0,3.76096,100,1), +(828990,5,1955.34,-5805.9,101.012,0,0,3.41931,100,1), +(828990,6,1923.02,-5809.99,100.145,0,0,3.17191,100,1), +(828990,7,1883.31,-5811.93,102.057,0,0,3.26223,100,1), +(828990,8,1845.49,-5811.9,100.457,0,0,3.13657,100,1), +(828990,9,1818.34,-5814.16,104.528,0,0,3.23081,100,1), +(828990,10,1790.43,-5813.92,112.024,0,0,3.11301,100,1), +(828990,11,1771.37,-5801.06,116.041,0,0,2.57501,100,1), +(828990,12,1744.92,-5785.9,116.122,0,0,2.81063,100,1), +(828990,13,1699.92,-5778.87,113.453,30000,1188,0,100,1), +-- #2 +(829150,1,2090.98,-5772.49,99.1364,2000,0,3.00624,100,1), +(829150,2,2074.1,-5788.09,101.267,0,0,3.81592,100,1), +(829150,3,2057.83,-5799.68,101.801,0,0,3.66277,100,1), +(829150,4,2034.62,-5803.96,100.546,0,0,3.23473,100,1), +(829150,5,1989.39,-5810.89,100.804,0,0,3.23866,100,1), +(829150,6,1940.36,-5843.1,100.335,0,0,3.54496,100,1), +(829150,7,1893.36,-5846.78,101.331,0,0,3.14441,100,1), +(829150,8,1852.1,-5836.64,101.806,0,0,2.89308,100,1), +(829150,9,1836.54,-5830.45,100.72,0,0,2.71244,100,1), +(829150,10,1812.11,-5822.54,105.733,0,0,2.90643,100,1), +(829150,11,1792.25,-5822.46,111.503,0,0,3.18918,100,1), +(829150,12,1749.64,-5832.9,116.486,30000,1188,0,100,1), +-- #3 +(844180,1,2130.24,-5786.56,98.8595,2000,0,3.53639,100,1), +(844180,2,2108.39,-5791.13,99.6639,0,0,3.31091,100,1), +(844180,3,2083.15,-5805.23,102.845,0,0,3.7743,100,1), +(844180,4,2068.88,-5827.84,102.066,0,0,4.01385,100,1), +(844180,5,2036.77,-5848.15,100.365,0,0,3.61329,100,1), +(844180,6,1978.2,-5853.32,100.708,0,0,3.08314,100,1), +(844180,7,1939.37,-5848.67,100.858,0,0,3.1499,100,1), +(844180,8,1889.51,-5831.7,101.353,0,0,2.8593,100,1), +(844180,9,1842.17,-5818.86,100.294,0,0,3.13262,100,1), +(844180,10,1806.12,-5818.45,107.736,0,0,3.0423,100,1), +(844180,11,1775.45,-5818.74,115.4,30000,1188,0,100,1), +-- #4 +(844230,1,2132.06,-5680.27,101.872,2000,0,3.74295,100,1), +(844230,2,2095.29,-5701.47,100.297,0,0,3.67382,100,1), +(844230,3,2044.51,-5738.45,98.9834,0,0,3.47747,100,1), +(844230,4,1991.4,-5752.36,101.254,0,0,3.38715,100,1), +(844230,5,1934.35,-5757.02,105.033,0,0,3.75079,100,1), +(844230,6,1881.51,-5781.34,103.301,0,0,3.527,100,1), +(844230,7,1841.71,-5798.38,101.761,0,0,3.40919,100,1), +(844230,8,1807.28,-5817.31,107.472,0,0,3.25996,100,1), +(844230,9,1775.64,-5821.64,115.384,0,0,3.12252,100,1), +(844230,10,1735.1,-5821.55,116.123,0,0,2.98115,100,1), +(844230,11,1699.1,-5781.46,113.715,30000,1188,0,100,1), +-- #5 +(844320,1,2146.72,-5850.4,101.348,2000,0,2.97874,100,1), +(844320,2,2113.71,-5845.58,103.176,0,0,2.69361,100,1), +(844320,3,2062.49,-5812.86,103.405,0,0,2.8664,100,1), +(844320,4,2033.06,-5803.11,100.477,0,0,3.12165,100,1), +(844320,5,1981.41,-5808.84,100.994,0,0,3.41617,100,1), +(844320,6,1938.5,-5809.06,100.369,0,0,3.01719,100,1), +(844320,7,1887.08,-5806.34,101.47,0,0,3.10359,100,1), +(844320,8,1837.55,-5812.48,101.002,0,0,3.24103,100,1), +(844320,9,1762.94,-5838.98,116.452,30000,1188,0,100,1), +-- #6 +(844360,1,2146.68,-5891.05,101.386,2000,0,2.83344,100,1), +(844360,2,2118.53,-5903.55,104.329,0,0,3.53163,100,1), +(844360,3,2076.95,-5910.58,106.063,0,0,3.31957,100,1), +(844360,4,2024.11,-5921.23,105.048,0,0,3.42167,100,1), +(844360,5,1974.84,-5932.61,103.075,0,0,2.95463,100,1), +(844360,6,1901.55,-5926.27,102.896,0,0,3.04888,100,1), +(844360,7,1838.23,-5925.68,108.629,0,0,3.19418,100,1), +(844360,8,1805.08,-5924.84,115.492,0,0,2.96641,100,1), +(844360,9,1754.33,-5910.94,116.066,30000,1188,0,100,1), +-- #7 +(844370,1,2170.08,-5862.69,101.377,2000,0,3.13975,100,1), +(844370,2,2142.05,-5859.07,101.352,0,0,2.97007,100,1), +(844370,3,2082.66,-5886.58,104.147,0,0,3.64944,100,1), +(844370,4,2028.09,-5908.18,104.992,0,0,3.31957,100,1), +(844370,5,1961.21,-5907.68,102.35,0,0,3.13107,100,1), +(844370,6,1895.26,-5906.86,101.947,0,0,3.17034,100,1), +(844370,7,1850.95,-5908.88,104.766,0,0,3.36277,100,1), +(844370,8,1813.52,-5931.68,114.631,30000,1188,0,100,1), +-- #8 +(844390,1,2163.73,-5819.37,101.347,2000,0,3.34395,100,1), +(844390,2,2113.22,-5847.34,103.411,0,0,3.45855,100,1), +(844390,3,2052.44,-5861.79,102.836,0,0,3.33682,100,1), +(844390,4,2001.1,-5892.32,101.117,0,0,3.77271,100,1), +(844390,5,1981.55,-5900.67,102.871,0,0,3.33053,100,1), +(844390,6,1911.11,-5907.35,101.617,0,0,3.25985,100,1), +(844390,7,1858.52,-5910.56,104.28,0,0,3.17738,100,1), +(844390,8,1804.56,-5934.23,115.703,30000,1188,3.59757,100,1); diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_02_world_from_335_was_2017_12_15_04_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_02_world_from_335_was_2017_12_15_04_world_335.sql new file mode 100644 index 0000000000..3938f3a303 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_02_world_from_335_was_2017_12_15_04_world_335.sql @@ -0,0 +1,24 @@ +/* +-- +UPDATE `creature_template` SET `npcflag`=2, `gossip_menu_id`=0 WHERE `entry` IN (737, 773, 1937, 2121, 2285, 2498, 2921, 3845, 5204, 5394, 5591, 7882, 7900, 9078, 10926,11039,22292); +DELETE FROM `quest_greeting` WHERE `ID` IN (737, 773, 1937, 2076, 2121, 2285, 2498, 2921, 3845, 5204, 5394, 5591, 7882, 7900, 9078, 10926,11039,22292); +INSERT INTO `quest_greeting` (`ID`, `Type`, `GreetEmoteType`, `GreetEmoteDelay`, `Greeting`, `VerifiedBuild`) VALUES +(737, 0, 0, 0, "Well,, hello there. You seem like you wouldn't be opposed to making some coin,, hm? I can tell from the look in your eyes. I am Mogul Kebok,, overseer of operations in Azeroth,, and if it is riches you seek,, perhaps I can make arrangements.", 0), +(773, 0, 0, 0, "$C,, eh? I am Krazek,, Baron Revilgaz's secretary. I know everything about the goings on in this jungle and beyond. Perhaps you'd be interested in knowing the going price on oil in Ratchet? No? Looking for work,, maybe? I can help you there.", 0), +(1937, 0, 0, 0, "The Dark Lady has put the challenge forth. Now it is up to the Royal Apothecary Society to develop a new plague. We shall bring Arthas and his wretched army to their knees.", 0), +(2076, 1, 0, 0, "This cauldron churns with thick,, green bubbles. Skulls,, bones and organs of unknown creatures swim within its viscous broth...$B$BAnd rising lazily to the surface are the skulls of two,, once mighty trolls:$B$BGan'zulah and Nezzliok.", 0), +(2121, 0, 0, 0, "Information... With our scouts and agents,, we control the flow of information in Lordaeron. Scourge movements,, their holdings,, all underneath our watchful eyes...", 0), +(2285, 0, 0, 0, "My family boasts the finest collection of jewelry and objects of fine art among all the nobles of Stormwind!$B$BAnd we are always wishing to increase the size our collection...", 0), +(2498, 0, 0, 0, "What what?!? We all have profit to make... and we won't do it by standing idle.", 0), +(2921, 0, 0, 0, "How perfect of you to come by,, $c.$B$BMy name is Lotwil Veriatus,, founding member of the Enlightened Assembly of Arcanology,, Alchemy,, and Engineering Sciences: we seek to blend the intelligent sciences of Azeroth together into one comprehensive school.", 0), +(3845, 0, 0, 0, "We elves have a long history. Let us hope this history does not return to haunt us.", 0), +(5204, 0, 0, 0, "If we are to make our place in this world,, then we will do so through study,, and through the will to ignore our fading human instincts.", 0), +(5394, 0, 1, 0, "Don't let the heat bother you. In the Badlands,, heat is the least of your worries.", 0), +(5591, 0, 1, 0, "This sty's a little shy of comfy,, but it has history,, so Stonard must be important to someone. I'd gamble that's why we stay here. It sure ain't for the view--it don't even look like home.", 0), +(7882, 0, 1, 0, "We're here to make a profit. And having our goods stolen is no way to make a profit.", 0), +(7900, 0, 0, 0, "Hello,, $N. Perhaps you have some time to chat?", 0), +(9078, 0, 1, 0, "Dear $g boy:girl;,, you have arrived just in time to assist the Kargath Expeditionary Force.", 0), +(10926,0, 0, 0, "I never feel warm anymore...", 0), +(11039,0, 1, 0, "Greetings,, $N. I am Duke Nicholas Zverenhoff of the Argent Dawn.", 0), +(22292,0, 396, 0, "The Light does not yet shine on Skettis.", 0); +*/ diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_02_world_from_335_was_2017_12_16_02_world_335.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_02_world_from_335_was_2017_12_16_02_world_335.sql new file mode 100644 index 0000000000..d52b3e5af4 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_02_world_from_335_was_2017_12_16_02_world_335.sql @@ -0,0 +1 @@ +-- UPDATE `spell_proc` SET `SpellFamilyName`=0 WHERE `SpellId`=-29441; diff --git a/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_03_world.sql b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_03_world.sql new file mode 100644 index 0000000000..34cf7f6db8 --- /dev/null +++ b/sql/old/4.3.4/world/24_2017_12_17/2017_12_15_03_world.sql @@ -0,0 +1,2544 @@ +DELETE FROM `creature` WHERE `map`= 654; +DELETE FROM `gameobject` WHERE `map`= 654; +DELETE FROM `gameobject_addon` WHERE `guid` NOT IN (SELECT `guid` FROM `gameobject`); + +SET @CGUID := 376242; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+1226; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+0, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1734.951, 1663.092, 20.56362, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+1, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1617.578, 1531.641, 26.23375, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+2, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1549.41, 1595.73, 26.53588, 1.710423, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) +(@CGUID+3, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1425.078, 1409.701, 36.87229, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+4, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1444.934, 1405.981, 35.63924, 3.159046, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+5, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1458.681, 1418.543, 35.63924, 1.029744, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+6, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1420.962, 1418.455, 35.63927, 3.246312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+7, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1453.01, 1437.085, 35.94489, 5.096361, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+8, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1539.028, 1617.955, 20.56887, 5.67232, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+9, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1441.104, 1413.96, 35.63924, 3.228859, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+10, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1470.285, 1384.361, 36.08721, 1.099557, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+11, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1566.795, 1555.3, 29.28475, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+12, 4075, 654, 4755, 4756, 1, 169, 0, 0, 0, -1490.295, 1424.214, 35.6809, 4.247014, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+13, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1441.144, 1418.014, 35.63924, 3.263766, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+14, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1565.299, 1556.535, 29.28475, 5.5676, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+15, 35010, 654, 4755, 4756, 1, 169, 0, 0, 0, -1475.002, 1426.059, 35.63924, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Near) (Area: Merchant Square - Difficulty: 0) +(@CGUID+16, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1444.939, 1398.372, 35.63924, 3.124139, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+17, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1540.175, 1613.618, 20.56887, 0.6806784, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) +(@CGUID+18, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1441.21, 1405.986, 35.63924, 3.159046, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+19, 35010, 654, 4755, 4756, 1, 169, 0, 0, 0, -1437.25, 1420.738, 35.63927, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Near) (Area: Merchant Square - Difficulty: 0) +(@CGUID+20, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1444.941, 1418, 35.63924, 3.263766, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+21, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1423.906, 1432.493, 36.50103, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+22, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1528.205, 1588.418, 26.53708, 0.7990122, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+23, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1444.915, 1410.274, 35.63924, 3.193953, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+24, 34850, 654, 4755, 4756, 1, 169, 0, 0, 0, -1447.979, 1407.352, 35.63924, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Prince Liam Greymane (Area: Merchant Square - Difficulty: 0) +(@CGUID+25, 6368, 654, 4755, 4756, 1, 169, 0, 0, 0, -1461.45, 1402.828, 37.74655, 0.2268928, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Cat (Area: Merchant Square - Difficulty: 0) +(@CGUID+26, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1545.081, 1640.24, 20.48777, 3.93261, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+27, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1444.622, 1402.186, 35.63924, 3.141593, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+28, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1517.84, 1603.986, 20.56887, 0.8028514, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) +(@CGUID+29, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1464.09, 1440.082, 36.0566, 4.625123, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+30, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1528.698, 1610.229, 20.56887, 1.064651, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) +(@CGUID+31, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1441.313, 1402.193, 35.63924, 3.141593, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+32, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1517.669, 1612.602, 20.4855, 4.776461, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+33, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1433.323, 1437.436, 35.95538, 3.089233, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+34, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1441.116, 1410.38, 35.63924, 3.193953, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+35, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1540.95, 1596.29, 26.53644, 1.562069, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) +(@CGUID+36, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1521.584, 1621.586, 20.6104, 0.8224227, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+37, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1441.002, 1397.965, 35.63926, 3.124139, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+38, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1444.95, 1414.047, 35.63924, 3.228859, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+39, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1522.868, 1680.894, 20.59014, 2.776726, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+40, 35317, 654, 4755, 4756, 1, 169, 0, 0, 0, -1533.46, 1591.96, 26.53648, 0.9442232, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Merchant Square - Difficulty: 0) +(@CGUID+41, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1519.996, 1616.039, 20.61054, 0.9206055, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+42, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1421.56, 1386.36, 71.88338, 1.595842, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+43, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1430.37, 1353.85, 35.63923, 4.764749, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+44, 44426, 654, 4755, 4756, 1, 169, 0, 0, 0, -1518.53, 1381.32, 36.52353, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+45, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1489.311, 1330.344, 36.56679, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+46, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1432.97, 1352.17, 35.63923, 5.061455, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+47, 44426, 654, 4755, 4756, 1, 169, 0, 0, 0, -1520.22, 1382.78, 36.08493, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+48, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1487.21, 1338.227, 35.63927, 3.246312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+49, 35010, 654, 4755, 4756, 1, 169, 0, 0, 0, -1402.882, 1391.72, 35.63926, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Near) (Area: Merchant Square - Difficulty: 0) +(@CGUID+50, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1403.392, 1444.313, 35.63926, 2.600541, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+51, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1506.026, 1416.773, 35.55592, 5.258136, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+52, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1403.54, 1446.675, 35.63926, 2.617994, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+53, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1533.911, 1447.528, 36.72313, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+54, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1427.55, 1354.11, 35.63923, 4.520403, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+55, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1490.538, 1367.53, 36.61352, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+56, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1407.161, 1445.04, 35.63926, 4.118977, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+57, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1435.73, 1355.46, 35.63923, 5.148721, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+58, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1435.15, 1352.44, 35.63923, 5.218534, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+59, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1566.021, 1410.03, 71.13116, 0.1396263, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+60, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1407.205, 1441.679, 35.63926, 2.199115, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+61, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1459.776, 1447.688, 36.72193, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+62, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1537.741, 1439.448, 36.03258, 4.625123, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+63, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1438.47, 1353.14, 35.63923, 5.427974, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+64, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1506.928, 1321.813, 76.19249, 3.456795, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+65, 34863, 654, 4755, 4756, 1, 169, 0, 0, 0, -1405.486, 1447.415, 35.63926, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lieutenant Walden (Area: Merchant Square - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+66, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1492.767, 1371.201, 36.62104, 3.246312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+67, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1401.519, 1448.191, 35.63926, 4.782202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+68, 34864, 654, 4755, 4756, 1, 169, 0, 0, 0, -1430.47, 1345.55, 35.57663, 1.780236, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+69, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1536.078, 1371.512, 60.56247, 1.553343, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+70, 39095, 654, 4755, 4756, 1, 169, 0, 0, 0, -1404.509, 1435.073, 35.63926, 3.804818, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Merchant Square - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+71, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1521.514, 1403.049, 35.63925, 4.520403, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+72, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1406.899, 1446.514, 35.63926, 0.6981317, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+73, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1398.88, 1403.543, 35.63926, 3.246312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+74, 44426, 654, 4755, 4756, 1, 169, 0, 0, 0, -1529.61, 1380.22, 36.57993, 0.6632251, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+75, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1391.248, 1399.266, 36.50103, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+76, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1517.184, 1358.682, 35.67543, 5.585053, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+77, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1420.476, 1425.659, 73.86883, 1.524312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+78, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1421.443, 1380.905, 72.87177, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+79, 35010, 654, 4755, 4756, 1, 169, 0, 0, 0, -1546.288, 1408.818, 35.63925, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Near) (Area: Merchant Square - Difficulty: 0) +(@CGUID+80, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1405.477, 1444.845, 35.63926, 4.834562, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+81, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1531.319, 1370.038, 71.83533, 2.199115, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+82, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1432.83, 1354.98, 35.63923, 4.956735, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+83, 4075, 654, 4755, 4756, 1, 169, 0, 0, 0, -1541.412, 1411.171, 35.67107, 1.285822, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+84, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1516.33, 1375.245, 36.6125, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+85, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1387.781, 1394.849, 72.97905, 1.500983, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+86, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1431.38, 1356.77, 35.63923, 4.834562, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+87, 44426, 654, 4755, 4756, 1, 169, 0, 0, 0, -1522.18, 1381.2, 37.18743, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+88, 6368, 654, 4755, 4756, 1, 169, 0, 0, 0, -1530.689, 1383.311, 40.11686, 0.4712389, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Cat (Area: Merchant Square - Difficulty: 0) +(@CGUID+89, 35010, 654, 4755, 4756, 1, 169, 0, 0, 0, -1495.502, 1340.696, 35.63927, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Near) (Area: Merchant Square - Difficulty: 0) +(@CGUID+90, 50260, 654, 4755, 4756, 1, 169, 0, 0, 0, -1408.594, 1443.686, 36.09393, 0.7504916, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+91, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1511.776, 1382.741, 35.95466, 1.099557, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+92, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1464.899, 1450.804, 71.7703, 6.257058, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+93, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1437.52, 1350.65, 35.63923, 5.410521, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+94, 39095, 654, 4755, 4756, 1, 169, 0, 0, 0, -1396.684, 1445.738, 36.04398, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Merchant Square - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+95, 34867, 654, 4755, 4756, 1, 169, 0, 0, 0, -1446.231, 1340.991, 71.15733, 1.857003, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shadowy Figure (Area: Merchant Square - Difficulty: 0) (Auras: 39662 - Vertex Color Black) +(@CGUID+96, 44086, 654, 4755, 4756, 1, 169, 0, 0, 0, -1428.64, 1356.64, 35.63923, 4.625123, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+97, 35006, 654, 4755, 4756, 1, 169, 0, 0, 0, -1401.517, 1368.231, 35.63927, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Market Evacuation Credit (Area: Merchant Square - Difficulty: 0) +(@CGUID+98, 44426, 654, 4755, 4756, 1, 169, 0, 0, 0, -1516.56, 1381.3, 36.48103, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+99, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1510.833, 1437.731, 35.94954, 5.532694, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+100, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1507.766, 1370.988, 35.63925, 6.230825, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+101, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1538.72, 1390.661, 35.55592, 0.005486719, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+102, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1476.811, 1439.623, 35.63926, 3.714623, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+103, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1398.113, 1431.059, 35.63926, 3.478062, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+104, 4075, 654, 4755, 4756, 1, 169, 0, 0, 0, -1527.604, 1439.422, 35.95203, 5.445497, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+105, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1530.157, 1389.502, 35.55592, 0.1329265, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+106, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1464.753, 1505.498, 20.74778, 0.5018748, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) (possible waypoints or random movement) +(@CGUID+107, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1432.875, 1431.646, 35.63927, 3.390748, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+108, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1566.311, 1413.51, 36.72263, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+109, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1558.247, 1409.644, 36.00442, 0.122173, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+110, 35010, 654, 4755, 4756, 1, 169, 0, 0, 0, -1552.142, 1394.392, 35.63925, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Near) (Area: Merchant Square - Difficulty: 0) +(@CGUID+111, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1475.917, 1355.622, 35.63927, 5.878766, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+112, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1559.502, 1384.313, 36.2494, 0.5759587, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+113, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1559, 1419.451, 35.79858, 5.532694, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+114, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1517.184, 1358.682, 35.67543, 4.704118, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+115, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1573.932, 1381.87, 37.07738, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+116, 35011, 654, 4755, 4756, 1, 169, 0, 0, 0, -1570.665, 1322.703, 35.63926, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (Far) (Area: Merchant Square - Difficulty: 0) +(@CGUID+117, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1579.764, 1339.984, 36.61267, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+118, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1530.535, 1326.66, 35.63927, 3.246312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+119, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1569.372, 1388.644, 36.50435, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+120, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1571.861, 1335.837, 35.70319, 3.246312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+121, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1531.887, 1318.653, 36.66387, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+122, 4075, 654, 4755, 4756, 1, 169, 0, 0, 0, -1563.413, 1319.129, 35.61959, 0.3532892, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+123, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1587.821, 1356.023, 36.61205, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+124, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1583.439, 1363.099, 35.73989, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+125, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1566.021, 1390.835, 36.08628, 3.410385, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+126, 35830, 654, 4755, 4756, 1, 169, 0, 0, 0, -1551.714, 1308.932, 35.9628, 3.385939, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas Evacuation Facing Marker (First) (Area: Merchant Square - Difficulty: 0) +(@CGUID+127, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1545.533, 1436.92, 35.8738, 5.710992, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+128, 35374, 654, 4755, 4756, 1, 169, 0, 0, 0, -1545.368, 1306.566, 36.50438, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Merchant Square - Difficulty: 0) +(@CGUID+129, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1557.66, 1333.977, 35.63924, 1.756745, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+130, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1501.219, 1424.144, 35.55591, 3.531477, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+131, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1432.875, 1431.646, 35.63927, 3.390748, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+132, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1398.113, 1431.059, 35.63926, 3.176499, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+133, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1475.917, 1355.622, 35.63927, 5.878766, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) +(@CGUID+134, 34851, 654, 4755, 4756, 1, 169, 0, 0, 0, -1464.249, 1509.075, 21.07458, 5.491656, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Panicked Citizen (Area: Merchant Square - Difficulty: 0) (Auras: 52385 - Cosmetic - Periodic Cower) (possible waypoints or random movement) +(@CGUID+135, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1411.623, 1379.29, 35.99875, 0.08382688, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+136, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1544.979, 1428.746, 35.67107, 2.410889, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+137, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1459.328, 1427.792, 35.68091, 2.618594, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+138, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1562.182, 1340.674, 35.68091, 1.011261, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+139, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1511.999, 1339.039, 35.68091, 4.364907, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+140, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1490.471, 1403.829, 35.6809, 0.108385, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+141, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1462.993, 1427.874, 35.68091, 6.261045, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+142, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1520.884, 1382.729, 36.08524, 4.468043, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+143, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1527.523, 1354.498, 36.05591, 5.903816, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+144, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1470.778, 1441.059, 36.3436, 2.600541, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+145, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1462.504, 1429.624, 35.68091, 3.402726, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+146, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1509.267, 1396.259, 35.68091, 2.253919, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+147, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1437.901, 1395.618, 35.68091, 3.874631, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+148, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1571.26, 1362.925, 35.90884, 1.977821, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+149, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1438.052, 1355.324, 35.65739, 5.395221, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+150, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1454.704, 1397.945, 35.68091, 2.627764, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+151, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1488.574, 1407.449, 35.6809, 5.209097, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+152, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1470.932, 1383.085, 36.0872, 4.118977, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+153, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1538.002, 1336.111, 35.68091, 6.273883, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+154, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1483.571, 1402.54, 35.6809, 2.663725, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+155, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1437.842, 1397.483, 35.68091, 1.601698, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+156, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1478.35, 1344.564, 35.68091, 1.843216, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+157, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1503.202, 1347.594, 35.68091, 1.716386, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+158, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.121, 1364.976, 35.83338, 5.934, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+159, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1518.033, 1397.408, 35.68091, 3.924403, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+160, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1404.842, 1379.777, 35.68092, 3.198992, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+161, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1437.861, 1391.952, 35.68091, 1.581783, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+162, 34936, 654, 4755, 4756, 1, 170, 0, 0, 0, -1465.224, 1403.517, 35.63924, 4.590216, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gwen Armstead (Area: Merchant Square - Difficulty: 0) (Auras: 49414 - Generic Quest Invisibility 1) +(@CGUID+163, 4075, 654, 4755, 4756, 1, 170, 0, 0, 0, -1487.394, 1435.067, 35.74765, 6.266773, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+164, 34913, 654, 4755, 4756, 1, 170, 0, 0, 0, -1437.955, 1401.148, 35.63927, 3.559063, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Prince Liam Greymane (Area: Merchant Square - Difficulty: 0) +(@CGUID+165, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1528.881, 1396.515, 35.68091, 2.905208, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+166, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.989, 1363.836, 35.91072, 2.407679, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+167, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1407.969, 1379.597, 35.99876, 0.05827284, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+168, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1502.964, 1379.617, 35.68091, 0.3837707, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+169, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1441.501, 1391.511, 35.68091, 0.1203412, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+170, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1500.891, 1377.572, 35.68091, 1.200417, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+171, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1496.102, 1450.55, 71.45199, 4.813382, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+172, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.1, 1366.922, 35.98795, 3.314257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+173, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1405.453, 1442.995, 35.63926, 0.05235988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+174, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1436.949, 1401.039, 35.68091, 4.466555, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+175, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1437.937, 1355.966, 35.65739, 3.086175, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+176, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.545, 1364.445, 35.84069, 2.613681, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+177, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1459.488, 1386.6, 36.006, 1.416546, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+178, 4075, 654, 4755, 4756, 1, 170, 0, 0, 0, -1409.747, 1431.328, 35.80848, 1.434918, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+179, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1555.162, 1352.488, 35.68091, 2.187409, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+180, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1532.05, 1344.733, 35.68091, 0.1200156, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+181, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1540.104, 1426.833, 35.67107, 4.147413, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+182, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1525.883, 1396.422, 35.68091, 5.695255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+183, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1512.604, 1381.182, 35.94044, 3.632241, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+184, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1523.613, 1399.309, 35.68091, 5.176178, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+185, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1524.862, 1400.903, 35.67238, 5.497787, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+186, 4075, 654, 4755, 4756, 1, 170, 0, 0, 0, -1481.881, 1348.072, 35.68091, 0.2636206, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+187, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1514.827, 1383.181, 35.99901, 0.1841887, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+188, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1519.631, 1385.293, 36.00101, 0.4849597, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+189, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1503.177, 1380.439, 35.68091, 5.385518, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+190, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1528.125, 1382.695, 36.00388, 2.699286, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+191, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1517.668, 1384.143, 36.00019, 0.566143, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+192, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1503.541, 1383.238, 35.68091, 4.870417, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+193, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1505.046, 1382.635, 35.68091, 5.316182, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+194, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1503.827, 1383.18, 35.68091, 4.950028, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+195, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1513.84, 1384.72, 35.97263, 6.141618, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+196, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1502.522, 1380.856, 35.68091, 5.173283, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+197, 44426, 654, 4755, 4756, 1, 170, 0, 0, 0, -1524.035, 1380.907, 37.04765, 3.426318, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frightened Chicken (Area: Merchant Square - Difficulty: 0) +(@CGUID+198, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1499.564, 1380.99, 35.63924, 1.466077, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+199, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1571.531, 1409.302, 71.54961, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+200, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1565.527, 1367.742, 36.05777, 3.367269, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+201, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1555.116, 1406.403, 35.63925, 0.4363323, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+202, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.828, 1359.559, 35.66602, 1.973129, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+203, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.777, 1360.378, 35.7738, 1.907929, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+204, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1572.712, 1366.292, 35.93214, 6.002982, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+205, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.423, 1360.955, 35.7741, 1.881922, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+206, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.137, 1363.385, 35.86844, 1.836628, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+207, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.777, 1360.378, 35.7738, 1.907929, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+208, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.952, 1359.508, 35.66602, 1.936406, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+209, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.777, 1360.378, 35.7738, 1.907929, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+210, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1569.952, 1359.508, 35.66602, 1.936406, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+211, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.423, 1360.955, 35.7741, 1.881922, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+212, 34916, 654, 4755, 4756, 1, 170, 0, 0, 0, -1568.423, 1360.955, 35.7741, 1.881922, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+213, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1611.757, 1493.896, 67.43678, 3.636799, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) +(@CGUID+214, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1497.306, 1439.811, 36.05542, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+215, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1572.33, 1441.46, 71.89567, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+216, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1492.047, 1434.349, 35.78022, 6.108652, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+217, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1522.747, 1458.594, 63.98261, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+218, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1441.899, 1450.797, 71.41571, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+219, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1490.005, 1370.417, 71.98634, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+220, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1576.019, 1377.854, 71.78739, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+221, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1387.137, 1385.486, 64.50874, 3.647738, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+222, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1539.394, 1370.75, 63.33633, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+223, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1371.455, 1346.75, 36.23652, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+224, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1671.273, 1396.834, 52.28713, 2.120071, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+225, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1677.784, 1446.555, 52.28713, 4.632704, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+226, 35457, 654, 4755, 4756, 1, 170, 0, 0, 0, -1680.415, 1445.724, 52.28713, 4.899159, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Bloodletter (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+227, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1614.557, 1313.599, 18.88782, 2.617994, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+228, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1612.536, 1315.115, 18.51861, 4.782202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+229, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1616.495, 1311.769, 19.28115, 4.834562, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+230, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1614.41, 1311.236, 18.92509, 2.600541, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+231, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1620.339, 1311.874, 21.43651, 3.183164, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+232, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1620.076, 1313.175, 21.32948, 3.262381, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+233, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1618.142, 1311.979, 21.86692, 0.7504916, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+234, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1620.374, 1308.914, 21.5301, 2.997874, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+235, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1614.464, 1310.024, 21.34093, 0.05236621, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+236, 35233, 654, 4755, 4756, 1, 170, 0, 0, 0, -1634.908, 1311.217, 19.7658, 4.921828, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Merchant Square - Difficulty: 0) +(@CGUID+237, 4075, 654, 4755, 4756, 1, 170, 0, 0, 0, -1635.938, 1328.867, 19.88487, 4.712389, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+238, 35233, 654, 4755, 4756, 1, 170, 0, 0, 0, -1634.498, 1306.882, 19.7463, 5.462881, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Merchant Square - Difficulty: 0) +(@CGUID+239, 38853, 654, 4755, 4756, 1, 170, 0, 0, 0, -1634.16, 1301.483, 19.7463, 2.286381, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Marie Allen (Area: Merchant Square - Difficulty: 0) +(@CGUID+240, 35840, 654, 4755, 4756, 1, 170, 0, 0, 0, -1633.137, 1303.786, 19.7463, 3.333579, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gwen Armstead (Area: Merchant Square - Difficulty: 0) +(@CGUID+241, 35233, 654, 4755, 4756, 1, 170, 0, 0, 0, -1637.024, 1305.241, 19.7463, 5.759586, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Merchant Square - Difficulty: 0) +(@CGUID+242, 35233, 654, 4755, 4756, 1, 170, 0, 0, 0, -1634.955, 1300.274, 20.36875, 1.204277, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Merchant Square - Difficulty: 0) +(@CGUID+243, 4075, 654, 4755, 4756, 1, 170, 0, 0, 0, -1650.648, 1305.062, 19.86187, 6.276712, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+244, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1663.002, 1345.666, 15.25987, 2.003033, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+245, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1654.24, 1382.9, 15.69825, 1.398736, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+246, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1681.47, 1348.348, 15.25987, 4.675255, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+247, 4075, 654, 4755, 4756, 1, 170, 0, 0, 0, -1687.852, 1344.949, 15.25987, 0.2024606, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Merchant Square - Difficulty: 0) +(@CGUID+248, 35872, 654, 4755, 4756, 1, 170, 0, 0, 0, -1690.356, 1328.24, 16.33291, 1.448623, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Myriam Spellwaker (Area: Merchant Square - Difficulty: 0) +(@CGUID+249, 51947, 654, 4755, 4756, 1, 170, 0, 0, 0, -1673.247, 1313.538, 20.37605, 3.75902, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383); -- Gilnean Steed (Area: Merchant Square - Difficulty: 0) + +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+250, 35874, 654, 4755, 4756, 1, 170, 0, 0, 0, -1670.313, 1297.233, 21.33171, 5.88176, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Huntsman Blake (Area: Merchant Square - Difficulty: 0) +(@CGUID+251, 47091, 654, 4755, 4756, 1, 170, 0, 0, 0, -1682.102, 1312.526, 20.36353, 4.031711, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Wounded Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+252, 35869, 654, 4755, 4756, 1, 170, 0, 0, 0, -1688.852, 1297.922, 20.3675, 1.605703, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Vitus Darkwalker (Area: Merchant Square - Difficulty: 0) (Auras: 45104 - Shadow Channelling) +(@CGUID+253, 35870, 654, 4755, 4756, 1, 170, 0, 0, 0, -1695.432, 1306.851, 19.86565, 1.53589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Sister Almyra (Area: Merchant Square - Difficulty: 0) +(@CGUID+254, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1684.968, 1334.247, 15.50245, 3.763325, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +-- (@CGUID+255, 68993, 654, 4755, 4756, 1, 170, 0, 0, 0, -1675.292, 1312.405, 20.37601, 0.6372635, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Fenegan Cobbler (Area: Merchant Square - Difficulty: 0) +(@CGUID+256, 35912, 654, 4755, 4756, 1, 170, 0, 0, 0, -1695.146, 1308.727, 19.86565, 4.014257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: Merchant Square - Difficulty: 0) +(@CGUID+257, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1671.831, 1371.134, 15.34935, 3.195228, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+258, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1686.677, 1335.55, 15.25987, 4.358563, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+259, 35839, 654, 4755, 4756, 1, 170, 0, 0, 0, -1687.948, 1332.111, 15.2182, 1.343904, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Sergeant Cleese (Area: Merchant Square - Difficulty: 0) +(@CGUID+260, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1688.573, 1335.724, 15.25987, 3.102018, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+261, 38832, 654, 4755, 4756, 1, 170, 0, 0, 0, -1669.259, 1299.177, 20.36763, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Baron (Area: Merchant Square - Difficulty: 0) +(@CGUID+262, 35118, 654, 4755, 4756, 1, 170, 0, 0, 0, -1685.416, 1334.896, 15.25987, 3.974637, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Merchant Square - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+263, 35873, 654, 4755, 4756, 1, 170, 0, 0, 0, -1697.469, 1308.936, 19.86565, 6.143559, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Celestine of the Harvest (Area: Merchant Square - Difficulty: 0) (Auras: 13236 - Nature Channeling) +(@CGUID+264, 35871, 654, 4755, 4756, 1, 170, 0, 0, 0, -1696.627, 1298.148, 20.36746, 2.234021, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Loren the Fence (Area: Merchant Square - Difficulty: 0) (Auras: 34189 - Stealth) +(@CGUID+265, 47091, 654, 4755, 4756, 1, 170, 0, 0, 0, -1701.379, 1301.646, 20.36758, 0.6457718, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Wounded Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+266, 47091, 654, 4755, 4756, 1, 170, 0, 0, 0, -1701.472, 1315.807, 20.37346, 5.602507, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Wounded Guard (Area: Merchant Square - Difficulty: 0) +(@CGUID+267, 39095, 654, 4755, 0, 1, 170, 0, 0, 0, -1686.365, 1381.307, 52.37962, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: 0 - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+268, 35118, 654, 4755, 0, 1, 170, 0, 0, 0, -1683.859, 1377.537, 52.30361, 4.699296, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: 0 - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+269, 47091, 654, 4755, 0, 1, 170, 0, 0, 0, -1705.064, 1305.964, 19.86565, 0.2268928, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Wounded Guard (Area: 0 - Difficulty: 0) +(@CGUID+270, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1715.443, 1359.477, 19.92279, 5.218534, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+271, 39095, 654, 4755, 4757, 1, 170, 0, 0, 0, -1701.415, 1378.955, 23.04241, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Military District - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+272, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1700.557, 1383.612, 22.57896, 0.4822469, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+273, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1702.098, 1382.846, 22.70604, 1.771977, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+274, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1702.806, 1386.316, 21.75196, 4.91357, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+275, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1698.959, 1386.979, 21.72435, 3.312145, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+276, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1685.607, 1405.381, 21.75987, 1.636262, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+277, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1736.975, 1358.908, 19.91482, 3.054724, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+278, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1685.846, 1409.039, 21.75987, 4.642576, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+279, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1726.121, 1391.939, 21.52553, 4.081202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+280, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1701.22, 1405.007, 21.75196, 6.021386, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+281, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1758.411, 1338.688, 19.94407, 2.286381, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+282, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1729.486, 1384.931, 20.06848, 0.5469471, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+283, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1761.031, 1336.861, 20.02162, 1.797689, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+284, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1738.293, 1377.038, 19.86756, 3.933294, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+285, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1760.655, 1338.832, 19.98563, 2.199115, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+286, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1726.737, 1392.283, 21.53432, 4.275197, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+287, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1737.245, 1392.142, 19.97222, 0.8856892, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+288, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1769.642, 1340.62, 20.04936, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+289, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1768.514, 1342.24, 19.96984, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+290, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1726.369, 1392.094, 21.53286, 4.161312, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+291, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1768.682, 1345.535, 19.92146, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+292, 4075, 654, 4755, 4757, 1, 170, 0, 0, 0, -1747.624, 1377.837, 20.04159, 0.238745, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+293, 35112, 654, 4755, 4757, 1, 170, 0, 0, 0, -1767.661, 1347.892, 19.97346, 0.9773844, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- King Genn Greymane (Area: Military District - Difficulty: 0) +(@CGUID+294, 35115, 654, 4755, 4757, 1, 170, 0, 0, 0, -1767.094, 1352.62, 20.00146, 5.148721, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lord Godfrey (Area: Military District - Difficulty: 0) +(@CGUID+295, 4075, 654, 4755, 4757, 1, 170, 0, 0, 0, -1697.96, 1409.813, 21.75987, 1.351309, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+296, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1767.078, 1343.66, 19.92292, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+297, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1725.832, 1392.89, 21.78212, 4.15907, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+298, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1764.774, 1340.016, 19.96545, 1.692969, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+299, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1770.201, 1343.783, 19.97769, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+300, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1775.906, 1351.906, 19.9379, 5.654867, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+301, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1771.661, 1351.129, 19.86565, 5.654867, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+302, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1774.109, 1353.189, 19.84836, 4.817109, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+303, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1766.576, 1362.365, 19.79161, 5.654867, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+304, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1770.465, 1346.887, 19.89095, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+305, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1777.217, 1343.545, 19.88775, 0.6806784, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+306, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1771.806, 1345.877, 19.87305, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+307, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1773.55, 1344.495, 19.86592, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+308, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1778.993, 1342.891, 19.90075, 0.541052, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+309, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1778.109, 1340.135, 19.90196, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+310, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1773.804, 1350.967, 19.88576, 5.899213, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+311, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1771.601, 1342.394, 20.01954, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+312, 35233, 654, 4755, 4757, 1, 170, 0, 0, 0, -1778.181, 1344.861, 19.97241, 0.1570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Survivor (Area: Military District - Difficulty: 0) +(@CGUID+313, 35374, 654, 4755, 4757, 1, 170, 0, 0, 0, -1756.212, 1389.637, 19.91755, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Military District - Difficulty: 0) +(@CGUID+314, 4075, 654, 4755, 4757, 1, 170, 0, 0, 0, -1776.416, 1360.228, 19.70127, 5.374861, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+315, 35374, 654, 4755, 4757, 1, 170, 0, 0, 0, -1763.314, 1389.778, 19.95122, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Military District - Difficulty: 0) +(@CGUID+316, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1757.899, 1394.538, 19.87307, 5.113815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+317, 39095, 654, 4755, 4757, 1, 170, 0, 0, 0, -1738.149, 1408.92, 21.75196, 0.1745329, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Military District - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+318, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1721.658, 1415.642, 21.79362, 3.036873, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+319, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1740.236, 1419.12, 22.93485, 6.024833, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+320, 35374, 654, 4755, 4757, 1, 170, 0, 0, 0, -1785.16, 1367.691, 19.90518, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Military District - Difficulty: 0) +(@CGUID+321, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1733.176, 1418.101, 21.79362, 4.769615, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+322, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1728.906, 1416.694, 21.79362, 6.099685, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+323, 35374, 654, 4755, 4757, 1, 170, 0, 0, 0, -1783.217, 1372.266, 19.93655, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Military District - Difficulty: 0) +(@CGUID+324, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1736.779, 1418.206, 22.1215, 2.497379, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +(@CGUID+325, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1699.236, 1425.878, 21.76275, 3.21073, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) (Auras: ) (possible waypoints or random movement) +(@CGUID+326, 39095, 654, 4755, 4757, 1, 170, 0, 0, 0, -1715.153, 1435.698, 21.75196, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Military District - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+327, 39095, 654, 4755, 4757, 1, 170, 0, 0, 0, -1669.826, 1435.016, 52.37046, 0.4537856, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Military District - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+328, 50371, 654, 4755, 4757, 1, 170, 0, 0, 0, -1755.069, 1418.04, 24.11409, 0.3490658, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Captain Broderick (Area: Military District - Difficulty: 0) +(@CGUID+329, 35232, 654, 4755, 4757, 1, 170, 0, 0, 0, -1713.533, 1434.259, 21.75196, 1.658063, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Royal Guard (Area: Military District - Difficulty: 0) +-- (@CGUID+330, 89715, UNKNOWN, 4755, 4757, 1, 170, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Franklin Martin (Area: Military District - Difficulty: 0) (Auras: 46598 - Ride Vehicle Hardcoded) - !!! on transport - transport template not found !!! +(@CGUID+331, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1618.179, 1311.964, 19.59211, 4.118977, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+332, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1765.586, 1434.784, 20.2734, 0.5630513, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+333, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1748.606, 1428.061, 52.74531, 6.197523, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+334, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1617.917, 1313.438, 19.50114, 0.6981317, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+335, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1763.908, 1398.491, 20.0508, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+336, 35123, 654, 4755, 4757, 1, 170, 0, 0, 0, -1682.8, 1441.262, 52.37046, 5.480334, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Vincent Hersham (Area: Military District - Difficulty: 0) +(@CGUID+337, 35124, 654, 4755, 4757, 1, 170, 0, 0, 0, -1678.51, 1438.786, 52.37044, 6.253154, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Tobias Mistmantle (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+338, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1768.085, 1449.607, 20.25494, 1.860381, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+339, 39095, 654, 4755, 4757, 1, 170, 0, 0, 0, -1735.67, 1437.476, 52.37084, 1.937315, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Slain Guard (Area: Military District - Difficulty: 0) (Auras: 29266 - Permanent Feign Death) +(@CGUID+340, 35077, 654, 4755, 4757, 1, 170, 0, 0, 0, -1679.734, 1442.122, 52.37046, 0.7504916, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lord Darius Crowley (Area: Military District - Difficulty: 0) (Auras: 67503 - Rebel Valor) +(@CGUID+341, 35081, 654, 4755, 4757, 1, 170, 0, 0, 0, -1682.167, 1439.67, 52.37046, 0.8377581, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Sean Dempsey (Area: Military District - Difficulty: 0) (Auras: 52165 - Cosmetic - Stun Permanent (no anim)) +(@CGUID+342, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1712.974, 1437.882, 21.69875, 4.559332, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+343, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1723.535, 1395.212, 21.75196, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+344, 35374, 654, 4755, 4757, 1, 170, 0, 0, 0, -1787.943, 1427.24, 13.00155, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Military District - Difficulty: 0) +(@CGUID+345, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1715.033, 1413.74, 21.75196, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+346, 35369, 654, 4755, 4757, 1, 170, 0, 0, 0, -1813.616, 1428.318, 12.54652, 3.857178, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Josiah Avery (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+347, 35374, 654, 4755, 4757, 1, 170, 0, 0, 0, -1813.611, 1428.142, 12.54652, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Generic Trigger LAB - Multiphase (Area: Military District - Difficulty: 0) +(@CGUID+348, 4075, 654, 4755, 4757, 1, 170, 0, 0, 0, -1805.197, 1457.219, 18.96187, 4.875721, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+349, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1704.799, 1425.266, 21.75196, 2.360414, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+350, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1682.042, 1414.962, 21.75196, 1.661328, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+351, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1721.273, 1391.679, 21.75196, 1.857025, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+352, 4075, 654, 4755, 4757, 1, 170, 0, 0, 0, -1731.122, 1480.054, 24.40585, 4.728887, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+353, 41561, 654, 4755, 0, 1, 170, 0, 0, 0, -1731.951, 1631.554, 20.88563, 1.867502, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Wary Mastiff (Area: 0 - Difficulty: 0) +(@CGUID+354, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1569.112, 1364.23, 35.79102, 5.814743, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+355, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1563.572, 1360.435, 35.68091, 5.275905, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+356, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1561.194, 1339.962, 35.68091, 2.10333, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+357, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1518.483, 1426.316, 35.67107, 2.149821, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+358, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1542.932, 1428.961, 35.67107, 4.87862, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+359, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1616.495, 1311.769, 19.28115, 4.834562, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+360, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1520.884, 1382.729, 36.08524, 4.468043, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+361, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1616.47, 1309.918, 19.33193, 0.05235988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+362, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1614.41, 1311.236, 18.92509, 2.600541, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+363, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1619.611, 1310.609, 19.85793, 0.7504916, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+364, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1614.557, 1313.599, 18.88782, 2.617994, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+365, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1612.536, 1315.115, 18.51861, 4.782202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+366, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1510.103, 1395.395, 35.68091, 4.484837, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+367, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1470.778, 1441.059, 36.3436, 2.600541, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+368, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1442.207, 1390.193, 35.68091, 2.743438, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+369, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1420.164, 1370.47, 35.68092, 5.409766, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+370, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1444.965, 1421.747, 35.68091, 0.1491247, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) +(@CGUID+371, 34884, 654, 4755, 4756, 1, 170, 0, 0, 0, -1406.99, 1377.31, 35.99875, 0.7507603, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Merchant Square - Difficulty: 0) +(@CGUID+372, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1611.757, 1493.896, 67.43678, 3.636799, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+373, 35457, 654, 4755, 4756, 1, 170, 0, 0, 0, -1701.495, 1477.289, 59.41336, 5.3915, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Bloodletter (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+374, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1720.653, 1526.708, 55.9107, 5.844984, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+375, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1625.62, 1487.033, 71.27762, 3.531424, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+376, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1627.273, 1499.689, 68.89395, 4.251452, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+377, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1618.054, 1489.644, 68.45153, 3.593639, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+378, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1631.979, 1491.585, 71.11481, 4.032866, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+379, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1634.344, 1491.3, 70.10101, 4.6248, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+380, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1622.424, 1483.882, 67.67381, 3.404875, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+381, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1630.399, 1481.66, 71.41516, 3.484555, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+382, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1622.665, 1489.818, 71.03797, 3.776179, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+383, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1638.569, 1489.736, 68.55273, 4.548815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +-- (@CGUID+384, 89715, UNKNOWN, 4755, 4756, 1, 170, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Franklin Martin (Area: Merchant Square - Difficulty: 0) (Auras: 46598 - Ride Vehicle Hardcoded) - !!! on transport - transport template not found !!! +(@CGUID+385, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1677.284, 1444.848, 52.28713, 2.803765, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) +(@CGUID+386, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1678.199, 1447.438, 52.28713, 4.676456, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) +(@CGUID+387, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1614.557, 1313.599, 18.88782, 2.617994, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+388, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1612.536, 1315.115, 18.51861, 4.782202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+389, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1614.41, 1311.236, 18.92509, 2.600541, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+390, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1618.222, 1308.602, 19.70086, 2.199115, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+391, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1616.495, 1311.769, 19.28115, 4.834562, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+392, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1616.47, 1309.918, 19.33193, 0.05235988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+393, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1617.917, 1313.438, 19.50114, 0.6981317, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+394, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1619.611, 1310.609, 19.85793, 0.7504916, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+395, 50260, 654, 4755, 4756, 1, 170, 0, 0, 0, -1618.179, 1311.964, 19.59211, 4.118977, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Merchant Square - Difficulty: 0) +(@CGUID+396, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1700.017, 1469.25, 52.60233, 5.309082, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+397, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1699.088, 1467.081, 53.23332, 5.346412, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) +(@CGUID+398, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1697.831, 1473.165, 54.11327, 5.407074, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+399, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1701.65, 1470.94, 52.2871, 5.363472, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+400, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1697.73, 1469.52, 52.2871, 5.285114, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+401, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1699.376, 1470.318, 56.496, 5.33299, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+402, 35456, 654, 4755, 4756, 1, 170, 0, 0, 0, -1694.03, 1466.33, 52.2872, 5.227995, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Merchant Square - Difficulty: 0) (Auras: ) +(@CGUID+403, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1734.11, 1393.921, 20.71096, 3.657613, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+404, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1720.82, 1400.421, 21.79362, 1.206352, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+405, 34884, 654, 4755, 4757, 1, 170, 0, 0, 0, -1564.684, 1341.403, 35.81101, 1.605703, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Rampaging Worgen (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+406, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1617.917, 1313.438, 19.50114, 0.6981317, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+407, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1618.222, 1308.602, 19.70086, 2.199115, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+408, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1618.179, 1311.964, 19.59211, 4.118977, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+409, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1612.536, 1315.115, 18.51861, 4.782202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+410, 50260, 654, 4755, 4757, 1, 170, 0, 0, 0, -1619.611, 1310.609, 19.85793, 0.7504916, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+411, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1740.278, 1418.944, 22.93476, 6.075404, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+412, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1741.318, 1435.574, 55.42303, 5.01926, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+413, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1717.031, 1459.035, 52.74283, 0.1724717, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) +(@CGUID+414, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1696.247, 1370.394, 23.10253, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+415, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1723.076, 1354.24, 19.91219, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+416, 35118, 654, 4755, 4757, 1, 170, 0, 0, 0, -1739.832, 1378.422, 20.04544, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Military District - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+417, 35118, 654, 4755, 4762, 1, 170, 0, 0, 0, -1693.439, 1387.392, 21.75196, 2.600541, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Stoneward Prison - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+418, 35118, 654, 4755, 4762, 1, 170, 0, 0, 0, -1733.302, 1417.552, 21.75196, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Stoneward Prison - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) +(@CGUID+419, 35118, 654, 4755, 4762, 1, 170, 0, 0, 0, -1682.281, 1349.592, 15.2182, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Worgen (Area: Stoneward Prison - Difficulty: 0) (Auras: 83470 - Arcane Missiles Trainer) (possible waypoints or random movement) +(@CGUID+420, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1627.273, 1499.689, 68.89395, 4.251452, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+421, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1618.054, 1489.644, 68.45153, 3.593639, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+422, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1631.979, 1491.585, 71.11481, 4.032866, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+423, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1634.344, 1491.3, 70.10101, 4.6248, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+424, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1622.424, 1483.882, 67.67381, 3.404875, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+425, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1630.399, 1481.66, 71.41516, 3.484555, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+426, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1622.665, 1489.818, 71.03797, 3.776179, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+427, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1638.569, 1489.736, 68.55273, 4.548815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+428, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1720.653, 1526.708, 55.9107, 5.844984, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+429, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1625.62, 1487.033, 71.27762, 3.531424, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+430, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1724.719, 1526.731, 55.66177, 6.138319, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+431, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1717.75, 1513.727, 55.47941, 4.704845, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+432, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1709.63, 1527.464, 56.86086, 3.258752, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+433, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1729.345, 1526.495, 55.47962, 6.188943, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+434, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1718.262, 1518.557, 55.55954, 4.726997, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+435, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1718.104, 1524.071, 55.81641, 4.709816, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+436, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1713.974, 1526.625, 56.21981, 3.306195, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+437, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1627.273, 1499.689, 68.89395, 4.251452, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+438, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1618.054, 1489.644, 68.45153, 3.593639, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+439, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1631.979, 1491.585, 71.11481, 4.032866, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+440, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1634.344, 1491.3, 70.10101, 4.6248, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+441, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1622.424, 1483.882, 67.67381, 3.404875, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+442, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1630.399, 1481.66, 71.41516, 3.484555, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+443, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1622.665, 1489.818, 71.03797, 3.776179, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+444, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1638.569, 1489.736, 68.55273, 4.548815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+445, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1720.653, 1526.708, 55.9107, 5.844984, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+446, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1625.62, 1487.033, 71.27762, 3.531424, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+447, 35457, 654, 4755, 4762, 1, 170, 0, 0, 0, -1718.165, 1521.936, 55.71669, 4.732433, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Bloodletter (Area: Stoneward Prison - Difficulty: 0) +(@CGUID+448, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1611.757, 1493.896, 67.43678, 4.677482, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: ) +(@CGUID+449, 35456, 654, 4755, 4762, 1, 170, 0, 0, 0, -1630.399, 1481.66, 71.41516, 3.484555, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Worgen Runt (Area: Stoneward Prison - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+450, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1760.277, 1337.226, 19.87675, 5.541513, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+451, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1677.406, 1340.441, 15.25987, 3.773301, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+452, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1759.486, 1410.245, 20.94987, 5.097866, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+453, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1767.688, 1400.507, 20.00809, 5.627713, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+454, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1710.879, 1360.24, 19.88487, 0.09382436, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+455, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1712.042, 1348.053, 19.82813, 3.809261, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+456, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1790.345, 1399.434, 20.37605, 5.033753, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+457, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1730.684, 1347.464, 19.75987, 2.108419, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+458, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1746.15, 1369.673, 19.97488, 0.01157437, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+459, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1689.073, 1337.146, 15.25987, 2.105538, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+460, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1755.899, 1409.438, 19.86546, 5.117027, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+461, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1794.821, 1397.097, 19.93506, 4.884682, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+462, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1799.769, 1402.174, 19.97234, 4.956735, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+463, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1721.444, 1359.1, 19.75987, 2.412025, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+464, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1707.693, 1352.161, 19.88487, 1.015765, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+465, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1739.178, 1373.495, 19.95046, 2.967142, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+466, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1753.76, 1377.172, 19.81179, 3.45587, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+467, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1743.115, 1372.345, 20.07546, 3.405706, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+468, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1740.253, 1359.001, 19.82436, 4.055814, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+469, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1802.125, 1389.582, 20.36794, 4.764749, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+470, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1773.132, 1360.342, 19.71486, 2.103249, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+471, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.167, 1404.51, 19.92372, 5.087076, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+472, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1768.301, 1347.354, 19.95631, 6.026972, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+473, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1789.317, 1483.763, 20.27034, 2.8409, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) +(@CGUID+474, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1758.484, 1399.424, 19.86806, 4.764749, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+475, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1737.666, 1359.027, 19.9573, 3.512149, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+476, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1688.13, 1338.939, 15.25987, 3.111466, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+477, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1746.853, 1329.636, 19.96486, 0.9896676, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+478, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1739.871, 1323.233, 20.06179, 1.587202, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+479, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1726.362, 1362.047, 19.90904, 5.841092, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+480, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1726.881, 1378.309, 19.90771, 0.8136587, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+481, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1740.702, 1513.067, 26.32375, 4.123241, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) +(@CGUID+482, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1702.911, 1352.507, 19.39717, 0.2724707, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+483, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1734.636, 1325.94, 20.29512, 3.450653, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+484, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1800.219, 1398.863, 19.98782, 5.156498, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+485, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1772.382, 1354.381, 19.83986, 2.479361, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+486, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1750.834, 1328.362, 19.83986, 1.104868, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+487, 38844, 654, 4755, 4757, 1, 171, 0, 0, 0, -1788.74, 1428.526, 12.99595, 3.351032, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Mastiff (Area: Military District - Difficulty: 0) +(@CGUID+488, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1771.878, 1353.877, 19.83986, 6.203314, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+489, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1740.915, 1371.662, 19.98525, 3.39781, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+490, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1728.636, 1359.391, 19.86341, 4.553943, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+491, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1730.936, 1389.145, 20.49269, 2.609706, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+492, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.148, 1320.7, 20.28475, 2.777936, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+493, 35906, 654, 4755, 4757, 1, 171, 0, 0, 0, -1785.66, 1437.613, 20.20581, 0.6457718, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lord Godfrey (Area: Military District - Difficulty: 0) +(@CGUID+494, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1765.899, 1396.703, 19.96007, 4.764749, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+495, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1803.911, 1395.08, 20.36791, 5.113815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+496, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1780.334, 1364.271, 19.83986, 6.01896, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+497, 35550, 654, 4755, 4757, 1, 171, 0, 0, 0, -1803.646, 1406.674, 19.92054, 5.098837, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- King Genn Greymane (Area: Military District - Difficulty: 0) +(@CGUID+498, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1721.004, 1355.47, 19.81864, 3.648055, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+499, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1743.861, 1320.997, 19.83986, 0.08877843, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+500, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1739.439, 1356.086, 19.83498, 5.993, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+501, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1690.881, 1336.603, 15.25987, 4.33409, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+502, 35378, 654, 4755, 4757, 1, 171, 0, 0, 0, -1789.75, 1427.413, 13.0063, 3.176499, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lorna Crowley (Area: Military District - Difficulty: 0) +(@CGUID+503, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1739.797, 1318.662, 19.83986, 1.072088, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+504, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1774.825, 1400.552, 20.37605, 5.190791, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+505, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1794.439, 1393.835, 19.97655, 4.764749, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+506, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1740.907, 1361.023, 19.78982, 0.8035973, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+507, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1730.992, 1345.687, 19.75987, 1.685814, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+508, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1718.126, 1360.131, 19.90062, 1.38012, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+509, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1727.067, 1368.267, 19.90712, 3.006678, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+510, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.36, 1379.322, 19.99429, 2.947789, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+511, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1740.624, 1360.486, 19.78982, 1.148354, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+512, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1757.507, 1402.976, 19.86546, 4.747153, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+513, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1714.998, 1357.138, 19.88487, 1.413195, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+514, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1766.274, 1409.792, 19.86569, 5.172817, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+515, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.78, 1395.314, 19.98374, 5.078908, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+516, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1771.304, 1338.672, 19.97005, 3.095394, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+517, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1731.696, 1345.131, 19.75987, 5.707503, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+518, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1736.614, 1321.062, 19.83986, 1.33716, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+519, 4075, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.532, 1453.433, 19.10015, 3.143548, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+520, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1738.005, 1362.708, 19.87734, 3.122375, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+521, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1761.358, 1347.306, 19.91482, 3.220107, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+522, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1686.123, 1349.393, 15.25987, 4.813005, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+523, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1727.632, 1319.135, 19.88487, 2.449417, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+524, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1760.862, 1350.681, 19.78982, 2.37871, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+525, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1725.447, 1316.842, 19.88487, 2.740652, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+526, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1763.819, 1401.568, 19.95603, 5.375283, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+527, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1764.308, 1363.319, 19.9756, 5.491621, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+528, 4075, 654, 4755, 4757, 1, 171, 0, 0, 0, -1745.352, 1373.216, 20.05667, 5.368284, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+529, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1737.42, 1386.949, 19.82546, 1.71414, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+530, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1763.12, 1504.561, 26.32375, 2.349224, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) +(@CGUID+531, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1769.294, 1353.224, 19.96486, 2.281791, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+532, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1720.328, 1354.83, 19.75987, 3.335369, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+533, 38844, 654, 4755, 4757, 1, 171, 0, 0, 0, -1788.554, 1426.823, 13.00639, 3.351032, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Mastiff (Area: Military District - Difficulty: 0) +(@CGUID+534, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1737.821, 1509.776, 26.32375, 3.199308, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) +(@CGUID+535, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1731.475, 1358.273, 19.94004, 2.034523, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+536, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1739.751, 1327.354, 19.88321, 5.991296, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+537, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1769.109, 1410.066, 19.86565, 5.113815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+538, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1728.863, 1381.428, 19.90712, 1.161817, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+539, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1731.088, 1390.118, 20.63345, 0.2933281, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+540, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1707.652, 1352.755, 19.88487, 0.4173355, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+541, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1722.094, 1360.276, 19.75987, 0.8951911, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+542, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1754.711, 1330.614, 19.829, 3.635673, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+543, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1770.152, 1344.958, 19.93179, 4.350411, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+544, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1712.321, 1355.149, 19.88487, 2.601887, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+545, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1803.564, 1468.672, 19.39296, 4.8502, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) +(@CGUID+546, 35504, 654, 4755, 4757, 1, 171, 0, 0, 0, -1772.229, 1402.641, 19.86592, 5.160146, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+547, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1730.595, 1360.739, 19.78367, 4.533161, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+548, 35509, 654, 4755, 4757, 1, 171, 0, 0, 0, -1805.082, 1393.403, 20.36976, 5.358161, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+549, 4075, 654, 4755, 4757, 1, 171, 0, 0, 0, -1805.791, 1447.843, 19.08687, 1.559442, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+550, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1720.627, 1369.185, 19.90712, 3.976244, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+551, 4075, 654, 4755, 4757, 1, 171, 0, 0, 0, -1740.488, 1512.509, 26.32375, 5.931868, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+552, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1790.889, 1454.852, 19.47076, 3.224734, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) (possible waypoints or random movement) +(@CGUID+553, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1753.438, 1439.001, 21.98342, 6.272454, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) +(@CGUID+554, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1800.299, 1549.613, 22.82806, 4.869469, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+555, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1797.958, 1547.196, 22.81093, 2.949606, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+556, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1797.644, 1549.366, 22.82015, 0.8028514, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+557, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1800.358, 1547.642, 22.83263, 1.500983, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+558, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1801.149, 1550.842, 22.82806, 1.448623, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+559, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.879, 1553.325, 22.81422, 3.368485, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+560, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.965, 1550.661, 22.82149, 5.585053, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+561, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.512, 1555.826, 22.806, 5.532694, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+562, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1797.109, 1551.752, 22.81293, 3.351032, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+563, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1789.022, 1523.904, 20.35213, 3.681444, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) +(@CGUID+564, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1808.373, 1528.279, 20.48392, 3.870828, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) +(@CGUID+565, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1762.845, 1460.222, 20.56118, 4.45059, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) (possible waypoints or random movement) +(@CGUID+566, 35463, 654, 4755, 0, 1, 171, 0, 0, 0, -1800.377, 1474.845, 20.36627, 4.45059, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: 0 - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) (possible waypoints or random movement) +(@CGUID+567, 41561, 654, 4755, 0, 1, 171, 0, 0, 0, -1731.951, 1631.554, 20.88563, 1.867502, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Wary Mastiff (Area: 0 - Difficulty: 0) +(@CGUID+568, 35505, 654, 4755, 4758, 1, 171, 0, 0, 0, -1749.575, 1377.16, 19.98192, 1.77969, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Greymane Court - Difficulty: 0) +(@CGUID+569, 35505, 654, 4755, 4758, 1, 171, 0, 0, 0, -1737.934, 1380.582, 19.92874, 3.504158, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Greymane Court - Difficulty: 0) +(@CGUID+570, 35505, 654, 4755, 4758, 1, 171, 0, 0, 0, -1771.161, 1365.819, 19.83986, 0.7857106, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Greymane Court - Difficulty: 0) +(@CGUID+571, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1720.712, 1368.991, 19.86546, 2.13413, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+572, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.594, 1377.879, 19.91718, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+573, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1732.46, 1333.002, 19.86573, 1.963331, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+574, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.879, 1553.325, 22.81422, 3.368485, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+575, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1797.109, 1551.752, 22.81293, 3.351032, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+576, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.965, 1550.661, 22.82149, 5.585053, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+577, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1800.299, 1549.613, 22.82806, 4.869469, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+578, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1800.358, 1547.642, 22.83263, 1.500983, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+579, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1797.644, 1549.366, 22.82015, 0.8028514, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+580, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1801.149, 1550.842, 22.82806, 1.448623, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+581, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1798.512, 1555.826, 22.806, 5.532694, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+582, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1760.705, 1372.467, 19.97486, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+583, 50260, 654, 4755, 4757, 1, 171, 0, 0, 0, -1797.958, 1547.196, 22.81093, 2.949606, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+584, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1751.63, 1377.689, 19.94535, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+585, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1737.934, 1380.582, 19.92874, 1.414315, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+586, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1756.665, 1482.342, 25.21637, 4.45059, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) +(@CGUID+587, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1749.575, 1377.16, 19.98192, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+588, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1736.514, 1382.905, 19.91917, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+589, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1750.677, 1368.717, 19.93879, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+590, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1720.712, 1368.991, 19.86546, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+591, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1807.28, 1445.72, 19.21187, 1.88084, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) (possible waypoints or random movement) +(@CGUID+592, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.594, 1377.879, 19.91718, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+593, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1751.63, 1377.689, 19.94535, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+594, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1750.677, 1368.717, 19.93879, 2.111256, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+595, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1744.25, 1369.384, 20.05559, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+596, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1737.934, 1380.582, 19.92874, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+597, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.594, 1377.879, 19.91718, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+598, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1709.747, 1307.653, 19.86565, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+599, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1801.762, 1485.844, 19.79056, 4.45059, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+600, 35463, 654, 4755, 4757, 1, 171, 0, 0, 0, -1762.63, 1513.986, 26.30628, 4.45059, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Lurker (Area: Military District - Difficulty: 0) (Auras: 5916 - Shadowstalker Stealth) +(@CGUID+601, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.594, 1377.879, 19.91718, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+602, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1720.712, 1368.991, 19.86546, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+603, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1749.575, 1377.16, 19.98192, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+604, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.594, 1377.879, 19.91718, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+605, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1750.677, 1368.717, 19.93879, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+606, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1749.575, 1377.16, 19.98192, 2.182679, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+607, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1709.747, 1307.653, 19.86565, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+608, 35753, 654, 4755, 4757, 1, 171, 0, 0, 0, -1673.238, 1344.802, 18.98268, 0.4014257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Krennan Aranas (Area: Military District - Difficulty: 0) (Auras: 49414 - Generic Quest Invisibility 1) +(@CGUID+609, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1750.677, 1368.717, 19.93879, 1.658219, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+610, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1736.514, 1382.905, 19.91917, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+611, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1751.63, 1377.689, 19.94535, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+612, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1749.575, 1377.16, 19.98192, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+613, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1720.712, 1368.991, 19.86546, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+614, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1744.25, 1369.384, 20.05559, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+615, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1748.594, 1377.879, 19.91718, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+616, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1709.747, 1307.653, 19.86565, 3.083668, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+617, 35505, 654, 4755, 4757, 1, 171, 0, 0, 0, -1745.727, 1379.918, 19.93644, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+618, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1756.089, 1466.741, 22.0611, 4.223697, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+619, 35915, 654, 4755, 4757, 1, 172, 0, 0, 0, -1771.266, 1411.809, 19.86565, 4.991642, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+620, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1678.745, 1596.986, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+621, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1765.013, 1510.141, 26.32375, 1.126698, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+622, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1790.66, 1515.188, 19.86566, 2.21243, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+623, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1786.54, 1512.07, 19.7823, 2.968343, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+624, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1787.424, 1515.899, 20.35626, 3.35798, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+625, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1728.389, 1621.436, 20.60363, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+626, 4075, 654, 4755, 4757, 1, 172, 0, 0, 0, -1751.582, 1511.741, 26.32375, 3.250127, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+627, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1680.278, 1579.983, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+628, 4075, 654, 4755, 4757, 1, 172, 0, 0, 0, -1806.048, 1437.62, 19.40325, 1.582553, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+629, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1761.462, 1464.099, 20.88732, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+630, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1794.33, 1485.91, 20.01979, 6.073746, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+631, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1804.166, 1489.727, 19.66969, 4.620064, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+632, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1730.139, 1505.712, 26.30264, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+633, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1788.412, 1504.92, 20.29344, 4.512715, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+634, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1743.424, 1578.219, 20.56873, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+635, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1787.948, 1506.699, 20.29572, 1.355791, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+636, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1788.428, 1504.887, 20.29342, 4.507551, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+637, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1690.505, 1593.313, 20.56891, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+638, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1764.135, 1468.696, 21.78699, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+639, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1757.969, 1454.63, 21.29383, 1.416782, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+640, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1787.977, 1511.413, 19.90623, 3.236958, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+641, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1739.054, 1513.156, 26.30628, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+642, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1794.003, 1516.613, 20.34048, 4.053951, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+643, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1758.806, 1466.868, 21.36701, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+644, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1766.108, 1457.472, 20.46494, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+645, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1684.262, 1609.717, 20.5728, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+646, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1769.906, 1514.127, 25.89461, 2.844887, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+647, 35915, 654, 4755, 4757, 1, 172, 0, 0, 0, -1802.76, 1407.512, 19.93638, 4.991642, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+648, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1788.333, 1504.867, 20.29341, 4.501601, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+649, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1788.464, 1510.366, 19.86566, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+650, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1765.781, 1476.898, 23.82987, 5.183628, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+651, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1763.832, 1455.307, 20.4565, 1.160691, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+652, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1787.51, 1514.08, 19.7823, 2.901756, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+653, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1791.508, 1483.572, 20.13498, 2.449669, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+654, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1766.413, 1513.141, 26.30628, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+655, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1800.197, 1509.2, 19.93174, 3.22336, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+656, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1695.958, 1594.573, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+657, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1760.646, 1507.042, 26.30628, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+658, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1788.293, 1504.948, 20.29348, 4.508884, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+659, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1791.073, 1519.34, 20.32849, 3.767407, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+660, 35914, 654, 4755, 4757, 1, 172, 0, 0, 0, -1768.823, 1410.156, 19.86565, 5.235988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Commandeered Cannon (Area: Military District - Difficulty: 0) +(@CGUID+661, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1732.649, 1596.457, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+662, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1701.806, 1611.01, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+663, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1755.747, 1513.792, 26.30628, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+664, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1791.609, 1506.51, 20.37783, 1.675015, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+665, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1766.504, 1513.019, 26.09093, 4.171191, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+666, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1745.245, 1590.203, 20.56698, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+667, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1713.762, 1612.561, 20.6894, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+668, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1687.965, 1588.323, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+669, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1686.375, 1599.16, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+670, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1791.477, 1486.665, 20.05961, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+671, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1721.549, 1617.684, 20.56892, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+672, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1787.579, 1513.97, 19.90623, 5.084849, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+673, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1791.044, 1518.802, 20.29265, 2.998155, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+674, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1721.297, 1616.066, 20.56892, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+675, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1715.661, 1590.962, 20.56892, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) (possible waypoints or random movement) +(@CGUID+676, 4075, 654, 4755, 4757, 1, 172, 0, 0, 0, -1803.003, 1484.257, 19.6223, 3.301854, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+677, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1788.045, 1506.732, 20.29605, 3.203807, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+678, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1685.16, 1584.892, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+679, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1747.872, 1569.88, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+680, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1725.616, 1612.509, 20.56892, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+681, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1789.812, 1518.39, 20.30914, 2.62785, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+682, 35915, 654, 4755, 4757, 1, 172, 0, 0, 0, -1768.245, 1413.576, 19.86565, 4.991642, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+683, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1697.222, 1598.13, 20.56892, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+684, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1787.718, 1517.279, 20.34851, 5.584971, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+685, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1725.399, 1619.444, 20.56892, 0, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+686, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1786.7, 1516.66, 20.3522, 2.541651, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+687, 50474, 654, 4755, 4757, 1, 172, 0, 0, 0, -1791.627, 1511.064, 19.86566, 1.739223, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilneas City Guard (Area: Military District - Difficulty: 0) +(@CGUID+688, 35914, 654, 4755, 4757, 1, 172, 0, 0, 0, -1800.604, 1406.835, 19.95013, 4.956735, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Commandeered Cannon (Area: Military District - Difficulty: 0) +(@CGUID+689, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1789.169, 1518.462, 20.30987, 2.452118, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+690, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1744.358, 1363.382, 19.89969, 2.022662, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+691, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1730.286, 1390.384, 20.77077, 3.675044, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+692, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1732.773, 1367.837, 19.90107, 1.411434, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+693, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1734.391, 1359.887, 19.9064, 2.408094, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+694, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1734.542, 1344.554, 19.87691, 1.992707, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+695, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1737.693, 1352.986, 19.8711, 2.024995, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+696, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1724.385, 1348.462, 19.67817, 2.246326, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+697, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1726.747, 1364.599, 19.92638, 2.158717, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+698, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1746.523, 1361.108, 19.86813, 2.050741, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+699, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1728.276, 1353.201, 19.68232, 2.953147, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+700, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1721.182, 1350.429, 19.86563, 2.447646, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+701, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1719.358, 1357.512, 19.77914, 2.914889, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+702, 35916, 654, 4755, 4757, 1, 172, 0, 0, 0, -1715.219, 1352.839, 19.86458, 2.551367, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Ripper (Area: Military District - Difficulty: 0) +(@CGUID+703, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1686.823, 1606.386, 20.61058, 4.340439, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+704, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1682.004, 1603.635, 20.61058, 3.877607, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+705, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1683.088, 1603.866, 20.61058, 3.960172, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+706, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1778.186, 1513.896, 22.93163, 2.844887, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+707, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1682.323, 1607.065, 20.61058, 3.820121, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+708, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1687.421, 1605.343, 20.61055, 3.671268, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+709, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1689.715, 1606.641, 20.61058, 3.92746, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+710, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1698.909, 1614.584, 20.61032, 3.524276, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (Auras: ) +(@CGUID+711, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1789.438, 1518.111, 20.38599, 3.316126, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+712, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1752.774, 1512.857, 32.47686, 3.131317, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+713, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1761.462, 1464.099, 20.88732, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+714, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1758.806, 1466.868, 21.36701, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+715, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1764.135, 1468.696, 21.78699, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+716, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1756.089, 1466.741, 22.0611, 4.223697, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+717, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1702.953, 1625.394, 20.5728, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+718, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1800.014, 1546.861, 22.73474, 5.585053, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+719, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1799.007, 1543.396, 22.37639, 2.949606, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+720, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1684.451, 1626.823, 20.5728, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+721, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1681.733, 1619.833, 20.5728, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+722, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1804.587, 1551.469, 14.95241, 1.500983, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+723, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1799.561, 1552.024, 22.82473, 5.532694, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+724, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1802.198, 1547.042, 22.74299, 1.448623, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+725, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1798.158, 1547.951, 22.81662, 3.351032, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+726, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1798.693, 1545.566, 22.60542, 0.8028514, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+727, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1795.063, 1548.858, 22.80489, 3.368485, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+728, 50260, 654, 4755, 4757, 1, 172, 0, 0, 0, -1801.347, 1545.813, 22.61855, 4.869469, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Crow (Area: Military District - Difficulty: 0) +(@CGUID+729, 4075, 654, 4755, 4757, 1, 172, 0, 0, 0, -1746.048, 1569.968, 20.60736, 4.362316, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+730, 4075, 654, 4755, 4757, 1, 172, 0, 0, 0, -1778.579, 1585.499, 20.72848, 4.254898, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Military District - Difficulty: 0) +(@CGUID+731, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1659.352, 1620.34, 20.5728, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+732, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1714.93, 1687.323, 20.27616, 5.303787, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+733, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1666.214, 1649.962, 20.57315, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+734, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1644.929, 1619.708, 20.53298, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+735, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1674.469, 1672.149, 20.57525, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+736, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1662.318, 1662.663, 20.57315, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+737, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1664.951, 1671.149, 20.57251, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+738, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1675.429, 1679.66, 20.58432, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+739, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1745.719, 1509.401, 26.29873, 3.067861, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+740, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1656.7, 1671.398, 20.57315, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+741, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1761.462, 1464.099, 20.88732, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+742, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1696.576, 1692.135, 20.35366, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+743, 35229, 654, 4755, 4757, 1, 172, 0, 0, 0, -1656.7, 1671.398, 20.57315, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Military District - Difficulty: 0) +(@CGUID+744, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1758.806, 1466.868, 21.36701, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+745, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1764.135, 1468.696, 21.78699, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+746, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1790.45, 1482.694, 20.15673, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+747, 50471, 654, 4755, 4757, 1, 172, 0, 0, 0, -1756.089, 1466.741, 22.0611, 4.223697, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Military District - Difficulty: 0) +(@CGUID+748, 51947, 654, 4755, 0, 1, 172, 0, 0, 0, -1741.495, 1633.519, 20.56441, 1.222871, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gilnean Steed (Area: 0 - Difficulty: 0) +(@CGUID+749, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1677.302, 1703.078, 20.57291, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+750, 44469, 654, 4755, 0, 1, 172, 0, 0, 0, -1745.82, 1633.39, 20.56253, 1.605703, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Vitus Darkwalker (Area: 0 - Difficulty: 0) (Auras: 45104 - Shadow Channelling) +-- (@CGUID+751, 68993, 654, 4755, 0, 1, 172, 0, 0, 0, -1740.254, 1635.766, 20.56551, 1.416518, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Fenegan Cobbler (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+752, 44463, 654, 4755, 0, 1, 172, 0, 0, 0, -1735.75, 1640.2, 20.64153, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Baron (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+753, 44470, 654, 4755, 0, 1, 172, 0, 0, 0, -1764.78, 1654.13, 20.99363, 4.014257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+754, 44470, 654, 4755, 0, 1, 172, 0, 0, 0, -1760.32, 1652.16, 20.99393, 1.884956, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+755, 44468, 654, 4755, 0, 1, 172, 0, 0, 0, -1759.36, 1652.85, 20.99393, 2.75762, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Sister Almyra (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+756, 44470, 654, 4755, 0, 1, 172, 0, 0, 0, -1761.89, 1650.96, 20.99393, 5.742133, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+757, 44461, 654, 4755, 0, 1, 172, 0, 0, 0, -1734.89, 1637.4, 20.70203, 5.934119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Huntsman Blake (Area: 0 - Difficulty: 0) +(@CGUID+758, 44470, 654, 4755, 0, 1, 172, 0, 0, 0, -1762.8, 1654.74, 20.99373, 2.007129, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+759, 4075, 654, 4755, 0, 1, 172, 0, 0, 0, -1720.707, 1629.158, 20.6074, 2.620029, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: 0 - Difficulty: 0) +(@CGUID+760, 44460, 654, 4755, 0, 1, 172, 0, 0, 0, -1767.57, 1657.62, 20.99343, 5.72468, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Gwen Armstead (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+761, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1746.719, 1652.63, 20.52352, 1.151917, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+762, 44470, 654, 4755, 0, 1, 172, 0, 0, 0, -1758.17, 1654.24, 20.99403, 5.77704, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+763, 44459, 654, 4755, 0, 1, 172, 0, 0, 0, -1764.99, 1658.86, 20.99353, 5.445427, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Celestine of the Harvest (Area: 0 - Difficulty: 0) (Auras: 13236 - Nature Channeling) +(@CGUID+764, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1750.405, 1653.955, 20.49492, 0.9075712, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+765, 44470, 654, 4755, 0, 1, 172, 0, 0, 0, -1760.73, 1656.72, 20.99373, 4.014257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Injured Citizen (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+766, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1652.622, 1709.967, 20.58432, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+767, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1755.108, 1665.076, 21.81791, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+768, 44464, 654, 4755, 0, 1, 172, 0, 0, 0, -1765.03, 1667.14, 22.37123, 5.689773, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Loren the Fence (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+769, 35552, 654, 4755, 0, 1, 172, 0, 0, 0, -1735.88, 1656.62, 20.56363, 2.129302, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lord Darius Crowley (Area: 0 - Difficulty: 0) (Auras: 67503 - Rebel Valor) +(@CGUID+770, 35911, 654, 4755, 0, 1, 172, 0, 0, 0, -1740.59, 1663.13, 20.56363, 4.886922, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- King Genn Greymane (Area: 0 - Difficulty: 0) +(@CGUID+771, 44465, 654, 4755, 0, 1, 172, 0, 0, 0, -1732.12, 1648.08, 20.58433, 3.054326, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Myriam Spellwaker (Area: 0 - Difficulty: 0) +(@CGUID+772, 4075, 654, 4755, 0, 1, 172, 0, 0, 0, -1745.051, 1654.349, 20.42433, 5.382618, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: 0 - Difficulty: 0) +(@CGUID+773, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1631.29, 1692.815, 20.55083, 1.967758, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+774, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1730.168, 1653.691, 20.58432, 2.6529, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+775, 44427, 654, 4755, 0, 1, 172, 0, 0, 0, -1737.68, 1655.11, 20.56283, 1.64061, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Crowley's Horse (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+776, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1640.988, 1704.443, 20.56139, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+777, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1748.46, 1656.115, 20.50162, 0.9250245, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+778, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1730.604, 1651.448, 20.58432, 2.565634, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+779, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1752.019, 1662.146, 21.81791, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+780, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1750.434, 1668.642, 21.81791, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+781, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1755.608, 1674.998, 21.81791, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+782, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1635.057, 1710.239, 20.58983, 2.874167, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+783, 44455, 654, 4755, 0, 1, 172, 0, 0, 0, -1731.34, 1657.62, 20.57063, 3.665191, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Sergeant Cleese (Area: 0 - Difficulty: 0) +(@CGUID+784, 35551, 654, 4755, 0, 1, 172, 0, 0, 0, -1734, 1662.89, 20.56363, 3.490659, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Prince Liam Greymane (Area: 0 - Difficulty: 0) +(@CGUID+785, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1749.047, 1679.066, 21.81791, 5.305801, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+786, 35554, 654, 4755, 0, 1, 172, 0, 0, 0, -1741.802, 1673.792, 21.81791, 3.874631, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Shaken Survivor (Area: 0 - Difficulty: 0) (Auras: ) +(@CGUID+787, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1591.649, 1639.243, 20.80508, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+788, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1635.914, 1726.119, 21.29574, 0.3775561, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+789, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1641.954, 1725.178, 21.29583, 2.072681, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+790, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1619.158, 1711.749, 22.50085, 3.035452, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+791, 50471, 654, 4755, 4758, 1, 172, 0, 0, 0, -1748.098, 1509.577, 26.27493, 3.067861, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Greymane Court - Difficulty: 0) +(@CGUID+792, 4075, 654, 4755, 4758, 1, 172, 0, 0, 0, -1721.054, 1671.668, 20.52616, 4.7315, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Greymane Court - Difficulty: 0) +(@CGUID+793, 50471, 654, 4755, 4758, 1, 172, 0, 0, 0, -1766.413, 1513.141, 26.30628, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Greymane Court - Difficulty: 0) +(@CGUID+794, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1581.292, 1622.759, 20.83248, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+795, 4075, 654, 4755, 4758, 1, 172, 0, 0, 0, -1688.832, 1649.287, 20.61058, 4.701189, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Greymane Court - Difficulty: 0) +(@CGUID+796, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1577.932, 1626.953, 20.76298, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+797, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1582.194, 1640.776, 20.77001, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+798, 50471, 654, 4755, 4758, 1, 172, 0, 0, 0, -1769.906, 1514.127, 25.89461, 2.844887, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Greymane Court - Difficulty: 0) +(@CGUID+799, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1595.026, 1708.665, 20.58986, 2.766437, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+800, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1588.604, 1685.367, 20.60992, 1.412326, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+801, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1579.151, 1674.623, 20.60992, 0.05444579, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+802, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1565.693, 1661.338, 20.60992, 0.4486424, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+803, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1571.713, 1686.37, 20.60992, 1.021555, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+804, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1567.799, 1629.111, 21.09017, 5.548601, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) (possible waypoints or random movement) +(@CGUID+805, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1570.419, 1631.411, 20.67582, 2.501606, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+806, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1562.623, 1631.934, 20.85992, 5.316223, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+807, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1571.09, 1660.012, 20.60992, 2.262483, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+808, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1569.017, 1675.512, 20.64554, 3.804818, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+809, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1553.049, 1645.807, 20.60992, 6.241207, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+810, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1568.481, 1675.498, 20.63037, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+811, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1569.379, 1706.066, 20.58986, 5.066102, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+812, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1575.252, 1633.707, 20.63508, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+813, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1573.2, 1710.519, 20.58986, 1.319262, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+814, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1576.632, 1650.339, 20.57547, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+815, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1569.012, 1686.951, 20.75, 3.595378, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+816, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1575.387, 1632.431, 20.61754, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+817, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1572.181, 1671.609, 20.59549, 4.014257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+818, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1571.017, 1644.951, 20.58359, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+819, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1579.229, 1672.809, 20.57273, 4.031711, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+820, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1566.306, 1680.399, 20.57465, 3.682645, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+821, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1553.966, 1657.794, 20.60992, 2.316462, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+822, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1575.623, 1676.594, 20.77257, 3.909538, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+823, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1570.83, 1627.345, 20.61968, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+824, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1565.45, 1647.733, 20.56825, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+825, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1572.792, 1618.106, 20.67422, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+826, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1572.63, 1682.483, 20.647, 3.735005, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+827, 4075, 654, 4755, 4758, 1, 172, 0, 0, 0, -1671.579, 1620.622, 20.61058, 0.5060208, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Greymane Court - Difficulty: 0) +(@CGUID+828, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1556.044, 1674.495, 20.60992, 2.685451, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+829, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1567.25, 1636.655, 20.73294, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+830, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1573.307, 1641.491, 20.62816, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+831, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1567.498, 1621.637, 20.58333, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+832, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1576.531, 1679.274, 20.84377, 4.452699, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+833, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1547.585, 1643.332, 20.56825, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+834, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1547.395, 1610.938, 20.48554, 4.391389, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+835, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1549.071, 1607.944, 21.61214, 0.7513461, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+836, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1547.127, 1613.251, 20.60992, 3.076198, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+837, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1546.386, 1611.262, 20.60992, 0.0822799, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+838, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1545.319, 1657.25, 20.56825, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+839, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1546.757, 1610.106, 20.56887, 5.094086, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+840, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1548.611, 1612.673, 20.60992, 6.183802, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+841, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1545.313, 1613.021, 20.60992, 4.248742, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+842, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1556.25, 1710.416, 20.59575, 2.184042, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+843, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1544.271, 1611.979, 20.60992, 3.681043, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+844, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1550.875, 1711.374, 20.59575, 1.011473, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+845, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1545.391, 1677.013, 20.70542, 4.907635, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+846, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1540.839, 1650.399, 20.58919, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+847, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1542.438, 1671.901, 20.61111, 4.747295, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+848, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1542.809, 1679.042, 20.79861, 4.747295, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+849, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1541.326, 1659.11, 20.60992, 4.097472, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+850, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1542.74, 1674.582, 20.68429, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+851, 4075, 654, 4755, 4758, 1, 172, 0, 0, 0, -1645.88, 1673.467, 20.53271, 3.284411, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Greymane Court - Difficulty: 0) +(@CGUID+852, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1544.546, 1696.755, 20.60992, 3.834562, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+853, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1555.436, 1625.783, 20.79516, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+854, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1542.36, 1687.596, 20.60992, 2.608137, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+855, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1541.149, 1694.974, 20.57747, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+856, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1538.401, 1657.207, 20.58791, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+857, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1543.696, 1610.916, 20.64965, 5.14318, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+858, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1539.335, 1672.689, 20.60992, 1.848512, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+859, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1537.134, 1668.095, 20.56825, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+860, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1537.938, 1669.667, 20.56825, 4.625123, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+861, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1539.072, 1613.437, 20.60992, 4.91555, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+862, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1538.326, 1676.351, 20.62554, 4.642576, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+863, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1533.387, 1662.943, 20.61247, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+864, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1536.406, 1613.8, 20.60992, 4.407624, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+865, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1539.483, 1608.435, 22.02348, 0.8326259, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+866, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1528.556, 1662.396, 20.56991, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+867, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1530.06, 1661.538, 20.60992, 1.375643, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+868, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1526.774, 1672.163, 21.14063, 4.380776, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+869, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1532.576, 1668.089, 20.70447, 4.485496, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+870, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1527.891, 1679.512, 21.09798, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+871, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1538.828, 1607.976, 22.27796, 1.086011, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+872, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1524.524, 1671.315, 21.23431, 0.5283892, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+873, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1536.979, 1611.979, 20.48554, 4.578099, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+874, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1525.713, 1655.847, 20.60992, 0.04958549, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+875, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1516.266, 1663.562, 20.73492, 1.670897, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+876, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1521.263, 1672.271, 21.10992, 0.6001306, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+877, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1531.925, 1674.715, 20.77431, 4.502949, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+878, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1532.49, 1654.474, 20.82552, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+879, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1533.868, 1685.939, 20.72612, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+880, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1513.874, 1594.72, 21.11072, 1.262488, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+881, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1525.478, 1602.952, 21.89165, 1.145671, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+882, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1512.824, 1622.502, 20.61054, 3.044244, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+883, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1522.132, 1608.777, 20.61054, 4.105892, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+884, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1524.492, 1606.784, 20.61054, 3.074504, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+885, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1515.107, 1600.288, 20.61054, 5.380086, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+886, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1512.278, 1598.298, 20.61053, 3.660435, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+887, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1515.712, 1599.657, 20.65541, 5.584325, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+888, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1513.021, 1598.438, 20.61053, 0.03600139, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+889, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1513.352, 1598.78, 20.61053, 0.600765, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+890, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1523.69, 1606.712, 20.61054, 4.209234, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+891, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1512.312, 1600.857, 20.61054, 4.445843, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+892, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1513.182, 1648.819, 20.60992, 6.256214, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+893, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1524.827, 1602.739, 21.81232, 1.362401, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+894, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1511.093, 1591.52, 20.85522, 5.309209, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+895, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1523.178, 1605.939, 20.61054, 5.207413, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+896, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1520.878, 1607.447, 20.61054, 5.389186, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+897, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1513.963, 1598.377, 20.61053, 3.705605, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+898, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1506.74, 1689.609, 20.60992, 4.335462, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+899, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1503.937, 1645.838, 20.60992, 1.401211, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+900, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1510.675, 1636.139, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+901, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1511.049, 1623.622, 20.61054, 1.718672, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+902, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1510.051, 1638.197, 20.60992, 0.5674251, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+903, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1514.46, 1601.225, 20.61054, 5.078954, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+904, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1494.11, 1682.133, 20.6096, 0.6011815, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+905, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1497.734, 1628.078, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+906, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1520.064, 1566.929, 26.53265, 2.918723, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+907, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1492.655, 1636.46, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+908, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1509.32, 1592.152, 20.61053, 4.789409, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+909, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1491.854, 1662.354, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+910, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1509.489, 1592.135, 20.61053, 4.835588, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+911, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1509.849, 1592.072, 20.61053, 4.93537, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+912, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1510.221, 1591.967, 20.61053, 5.040815, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+913, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1494.356, 1644.056, 20.61054, 2.731191, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+914, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1497.382, 1628.24, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+915, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1495.419, 1637.227, 20.61054, 0.5379505, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+916, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1488.039, 1653.688, 20.61054, 2.215276, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+917, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1505.648, 1577.324, 20.88468, 1.848905, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+918, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1505.729, 1565.104, 20.55082, 2.540735, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+919, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1486.101, 1670.07, 20.6096, 0.9287285, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+920, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1488.785, 1669.26, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+921, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1503.214, 1564.542, 20.96792, 2.730097, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+922, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1485.363, 1654.872, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+923, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1481.413, 1614.206, 20.61054, 5.375309, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+924, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1479.786, 1670.735, 20.6096, 5.510816, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+925, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1505.196, 1564.52, 20.83101, 3.851781, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+926, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1486.297, 1608.044, 20.61054, 2.037755, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+927, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1487.099, 1646.846, 20.61054, 0.5673299, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+928, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1483.325, 1605.934, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+929, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1489.071, 1645.182, 20.61054, 1.301282, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+930, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1505.729, 1566.146, 20.55082, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+931, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1504.649, 1567.387, 20.61053, 4.323196, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+932, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1502.407, 1563.616, 20.98853, 3.037641, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+933, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1471.912, 1626.082, 20.61054, 3.742743, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) (possible waypoints or random movement) +(@CGUID+934, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1469.755, 1656.703, 20.61054, 2.470408, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+935, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1477.302, 1656.328, 20.61054, 5.190209, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+936, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1478.102, 1646.113, 20.61054, 1.473317, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+937, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1470.555, 1626.791, 20.61054, 1.342795, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+938, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1482.4, 1592.636, 20.61054, 6.263905, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+939, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1474.981, 1618.252, 20.61054, 0.3649602, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+940, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1493.464, 1541.554, 20.73554, 1.21336, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+941, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1491.091, 1554.72, 20.61054, 1.162939, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (possible waypoints or random movement) +(@CGUID+942, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1481.764, 1603.568, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+943, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1486.317, 1586.549, 20.61054, 2.478844, 120, 10, 0, 0, 0, 1, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) (possible waypoints or random movement) +(@CGUID+944, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1485.137, 1545.34, 20.63842, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+945, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1478.49, 1570.66, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+946, 50471, 654, 4755, 4758, 1, 172, 0, 0, 0, -1755.747, 1513.792, 26.30628, 3.316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Afflicted Gilnean (Area: Greymane Court - Difficulty: 0) +(@CGUID+947, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1569.4, 1680.01, 20.62353, 5.211932, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) (Auras: ) +(@CGUID+948, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1463.674, 1663.509, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+949, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1467.083, 1619.84, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+950, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1460.509, 1625.913, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+951, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1468.375, 1610.901, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+952, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1459.144, 1657.638, 20.61054, 0.7170594, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+953, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1457.369, 1645.081, 20.61054, 1.946729, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+954, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1450.749, 1665.401, 20.61054, 0.775319, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+955, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1445.148, 1682.257, 20.56888, 4.031711, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+956, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1462.198, 1631.562, 20.61054, 1.571582, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+957, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1461.109, 1635.227, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+958, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1447.191, 1675.406, 20.56887, 4.014257, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+959, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1458.177, 1622.27, 20.61054, 3.735652, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+960, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1441.826, 1678.22, 20.56888, 3.909538, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+961, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1455.873, 1621.101, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+962, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1449.453, 1630.363, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+963, 4075, 654, 4755, 4758, 1, 172, 0, 0, 0, -1538.197, 1673.28, 20.63907, 2.355481, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Greymane Court - Difficulty: 0) +(@CGUID+964, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1460.04, 1625.441, 20.61054, 3.512687, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+965, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1439.177, 1668.51, 20.56887, 3.682645, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+966, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1432.345, 1670.405, 20.56887, 3.595378, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+967, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1443.7, 1671.793, 20.56887, 3.804818, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+968, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1453.991, 1630.91, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+969, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1452.576, 1631.301, 20.61054, 2.373015, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+970, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1436.344, 1674.536, 20.56888, 3.735005, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+971, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1445.217, 1625.257, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+972, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1464.163, 1584.979, 20.83926, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+973, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1452.376, 1596.786, 20.68366, 3.709406, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+974, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1462.028, 1586.967, 20.80812, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+975, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1470.457, 1577.96, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+976, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1470.396, 1581.286, 20.60655, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+977, 4075, 654, 4755, 4758, 1, 172, 0, 0, 0, -1565.231, 1627.656, 20.86602, 3.998843, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Greymane Court - Difficulty: 0) +(@CGUID+978, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1473.31, 1571.881, 20.61054, 2.127095, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+979, 35229, 654, 4755, 4758, 1, 172, 0, 0, 0, -1438.868, 1636.081, 20.61054, 0.8629105, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Greymane Court - Difficulty: 0) +(@CGUID+980, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1434.07, 1618.807, 20.61054, 3.450052, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+981, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1461.351, 1570.427, 20.57662, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+982, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1443.552, 1588.415, 20.73554, 1.742603, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+983, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1425.063, 1610.361, 20.58984, 3.09043, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+984, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1454.431, 1575.026, 20.62816, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+985, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1455.545, 1581.023, 20.86054, 0.5041659, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+986, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1474.738, 1564.786, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+987, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1455.352, 1579.851, 20.77096, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+988, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1476.491, 1554.091, 20.727, 4.770686, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+989, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1481.665, 1549.939, 20.86006, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+990, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1445.532, 1595.7, 20.41266, 4.257154, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+991, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1461.993, 1573.932, 20.70747, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+992, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1448.279, 1563.828, 20.61054, 0.2684954, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+993, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1477.05, 1540.513, 20.61054, 3.859549, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+994, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1465.304, 1548.628, 20.61054, 2.397149, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+995, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1438.533, 1572.833, 20.8981, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+996, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1482.887, 1535.017, 20.87049, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+997, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1463.561, 1559.607, 20.61054, 1.556043, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+998, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1442.974, 1577.82, 20.88654, 4.294116, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+999, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1484.109, 1533.401, 20.87567, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1000, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1437.926, 1573.495, 20.99701, 5.417018, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1001, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1446.887, 1568.714, 20.6602, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1002, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1459.153, 1523.677, 20.60095, 2.052628, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1003, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1458.127, 1527.064, 20.59778, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1004, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1411.426, 1555.027, 20.55698, 1.735069, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1005, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1478.952, 1513.816, 20.60095, 2.750952, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1006, 36057, 654, 4755, 0, 1, 172, 0, 0, 0, -1524.172, 1605.837, 20.56887, 5.835415, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: 0 - Difficulty: 0) +(@CGUID+1007, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1412.576, 1572.133, 20.58984, 2.435014, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1008, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1454.479, 1527.574, 20.68424, 4.426008, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1009, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1461.245, 1527.719, 20.60095, 5.84154, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1010, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1465.122, 1515.106, 20.57019, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1011, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1452.513, 1522.339, 20.70914, 0.2405661, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1012, 36057, 654, 4755, 0, 1, 172, 0, 0, 0, -1537.352, 1610.778, 20.56887, 3.11985, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: 0 - Difficulty: 0) +(@CGUID+1013, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1424.017, 1554.649, 20.55698, 0.1794786, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1014, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1478.214, 1520.303, 20.77184, 4.195181, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1015, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1443.006, 1539.675, 20.61054, 3.820926, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1016, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1439.074, 1553.287, 20.61054, 6.122747, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1017, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1464.799, 1530.75, 20.58896, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1018, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1425.84, 1572.026, 20.65065, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1019, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1467.931, 1536.267, 21.58475, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1020, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1437.057, 1559.253, 20.61054, 1.207458, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1021, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1473.257, 1530.587, 20.68695, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1022, 36057, 654, 4755, 0, 1, 172, 0, 0, 0, -1543.222, 1593.944, 26.62166, 5.113521, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: 0 - Difficulty: 0) +(@CGUID+1023, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1427.688, 1540.552, 20.68059, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1024, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1420.124, 1585.935, 20.58984, 3.139843, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1025, 35229, 654, 4755, 0, 1, 172, 0, 0, 0, -1489.856, 1525.296, 21.00293, 3.972361, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: 0 - Difficulty: 0) +(@CGUID+1026, 36057, 654, 4755, 0, 1, 172, 0, 0, 0, -1546.757, 1610.106, 20.56887, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: 0 - Difficulty: 0) +(@CGUID+1027, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1436.822, 1529.454, 20.61975, 2.376629, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1028, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1440.58, 1519.75, 20.8914, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1029, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1439.085, 1515.434, 20.58447, 1.832596, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1030, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1462.451, 1514.757, 20.60095, 4.630144, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1031, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1435.479, 1519.219, 20.65972, 2.042035, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1032, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1445.286, 1518.646, 20.65088, 4.644417, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1033, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1440.629, 1527.302, 20.73973, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1034, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1526.024, 1585.354, 26.62065, 1.502035, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1035, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1422.409, 1527.202, 20.5646, 4.139052, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1036, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1486.848, 1503.883, 20.87939, 2.600354, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1037, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1536.83, 1591.826, 26.62194, 2.325644, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1038, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1426.161, 1523.024, 20.56955, 2.478368, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1039, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1430.295, 1535.651, 20.69854, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1040, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1406.417, 1543.52, 20.55698, 1.007639, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1041, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1428.868, 1529.576, 20.77604, 2.670354, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1042, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1432.486, 1525.108, 20.96528, 2.356194, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1043, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1513.146, 1597.802, 20.56887, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1044, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1509.727, 1593.285, 20.56887, 0.418879, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1045, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1404.216, 1559.235, 20.55698, 5.677884, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1046, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1415.391, 1547.333, 20.55698, 0.6247604, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1047, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1427.757, 1537.93, 20.68198, 0.9851462, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1048, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1441.249, 1523.606, 20.97595, 2.964524, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1049, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1522.68, 1576.44, 26.53769, 0.4886922, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1050, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1432.036, 1514.234, 20.74479, 2.076942, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1051, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1418.31, 1518.308, 20.56606, 3.322854, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1052, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1438.902, 1511.807, 20.60095, 0.8217489, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1053, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1403.715, 1537.347, 20.55698, 2.577238, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1054, 35618, 654, 4755, 4759, 1, 172, 0, 0, 0, -1540.45, 1572.61, 29.28853, 0.715585, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Tobias Mistmantle (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1055, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1504.372, 1583.052, 20.48572, 0.3316126, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1056, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1505.911, 1578.247, 20.60233, 4.59393, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1057, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1400.337, 1529.663, 20.64216, 5.426582, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1058, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1509.038, 1588.497, 20.56887, 1.966453, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1059, 44429, 654, 4755, 4759, 1, 172, 0, 0, 0, -1539.03, 1570.91, 29.28873, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Crowley's Horse (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1060, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1409.375, 1528.125, 20.56606, 3.444999, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1061, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1424.818, 1522.13, 20.56606, 0.4480821, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1062, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1444.94, 1508.779, 20.60095, 3.928619, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1063, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1428.873, 1518.137, 20.56944, 2.268928, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1064, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1521.899, 1579.773, 26.61992, 5.609224, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1065, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1523.639, 1567.74, 26.62185, 6.274876, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1066, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1504.215, 1568.773, 20.48546, 5.602507, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1067, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1521.599, 1558.726, 28.19049, 0.1047198, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1068, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1506.04, 1563.995, 20.56887, 3.282701, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1069, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1522.51, 1569.66, 26.53678, 6.126106, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1070, 35317, 654, 4755, 4759, 1, 172, 0, 0, 0, -1515.845, 1552.627, 28.10939, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rebel Cannon (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1071, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1481.766, 1619.983, 24.49369, 3.756897, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1072, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1463.59, 1656.58, 20.56883, 4.011911, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1073, 4075, 654, 4755, 4759, 1, 172, 0, 0, 0, -1486.889, 1541.185, 20.7381, 3.309861, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1074, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.47, 1652.83, 20.56883, 4.118817, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1075, 4075, 654, 4755, 4759, 1, 172, 0, 0, 0, -1442.282, 1579.115, 20.86054, 5.094589, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1076, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.75, 1664.37, 20.56883, 4.131517, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1077, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.51, 1663.36, 20.56883, 4.209224, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1078, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1501.34, 1651.94, 20.56883, 4.252816, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1079, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1484.08, 1655.13, 20.56883, 4.029567, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1080, 4075, 654, 4755, 4759, 1, 172, 0, 0, 0, -1423.973, 1529.619, 20.65734, 3.426554, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Rat (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1081, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1442.58, 1527.46, 20.69613, 3.461719, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1082, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1578.75, 1528.743, 29.34149, 0.8901179, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1083, 36057, 654, 4755, 4759, 1, 172, 0, 0, 0, -1588.887, 1539.076, 29.33588, 0.6632251, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1084, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1472.02, 1664.82, 20.56883, 4.161993, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1085, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1543.414, 1652.647, 24.25841, 4.856165, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1086, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1449.4, 1656.5, 20.56883, 3.885785, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1087, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.66, 1622.61, 20.56883, 3.875825, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1088, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.26, 1665.83, 20.56883, 4.099041, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1089, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1422.142, 1545.318, 20.66782, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1090, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1569.4, 1680.01, 20.62353, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1091, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1534.81, 1678.38, 20.69953, 5.124135, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1092, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1442.46, 1576.4, 20.77533, 3.325181, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1093, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1415.98, 1558.04, 20.56253, 2.27141, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1094, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1476.88, 1665.26, 20.56883, 4.040174, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1095, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1417.32, 1526.83, 20.81423, 2.438991, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1096, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1458.83, 1532.5, 20.56883, 2.657984, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1097, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1432.34, 1514.14, 20.77083, 4.167494, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1098, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1476.305, 1549.377, 25.04453, 2.68468, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1099, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.17, 1624.06, 20.56883, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1100, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.75, 1664.37, 20.56883, 4.131517, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1101, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1483.65, 1664.25, 20.56883, 4.105886, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1102, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.47, 1652.83, 20.56883, 4.118817, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1103, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1475.22, 1656.02, 20.56883, 4.134988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1104, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1484.08, 1655.13, 20.56883, 4.029567, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1105, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1460.22, 1634.1, 20.56883, 3.742735, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1106, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1469.09, 1633.21, 20.56883, 3.818596, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1107, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1501.34, 1651.94, 20.56883, 4.252816, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1108, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1476.88, 1665.26, 20.56883, 4.040174, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1109, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1491.895, 1616.983, 24.59634, 3.875825, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1110, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.51, 1663.36, 20.56883, 4.209224, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1111, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1544.16, 1657.8, 20.56823, 4.500988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1112, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1472.02, 1664.82, 20.56883, 4.161993, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1113, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1463.59, 1656.58, 20.56883, 4.011911, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1114, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1480.85, 1653.4, 20.56883, 4.18615, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1115, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.26, 1665.83, 20.56883, 4.099041, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1116, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1461.03, 1655.93, 20.56883, 5.139096, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1117, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1448.6, 1634.66, 20.56883, 3.660445, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1118, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1469.9, 1655.04, 20.56883, 4.065339, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1119, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1443.81, 1545.19, 20.56883, 2.594656, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1120, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.17, 1624.06, 20.56883, 3.64231, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1121, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1534.81, 1678.38, 20.69953, 5.124135, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1122, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1555.3, 1697.47, 20.56823, 4.905379, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1123, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1501.34, 1651.94, 20.56883, 4.252816, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1124, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1476.79, 1623.5, 20.56883, 3.756897, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1125, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1449.4, 1656.5, 20.56883, 3.885785, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1126, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.66, 1622.61, 20.56883, 3.875825, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1127, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1529.97, 1658.738, 21.08091, 4.559667, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1128, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1484.08, 1655.13, 20.56883, 4.029567, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1129, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1469.09, 1633.21, 20.56883, 3.818596, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1130, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.26, 1665.83, 20.56883, 4.099041, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1131, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1475.22, 1656.02, 20.56883, 4.134988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1132, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1469.9, 1655.04, 20.56883, 4.065339, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1133, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1483.65, 1664.25, 20.56883, 4.105886, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1134, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1448.6, 1634.66, 20.56883, 3.660445, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1135, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1480.85, 1653.4, 20.56883, 4.18615, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1136, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1460.22, 1634.1, 20.56883, 3.742735, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1137, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.66, 1622.61, 20.56883, 3.875825, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1138, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.75, 1664.37, 20.56883, 4.131517, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1139, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1472.02, 1664.82, 20.56883, 4.161993, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1140, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.17, 1624.06, 20.56883, 3.64231, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1141, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.51, 1663.36, 20.56883, 4.209224, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1142, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1566.873, 1628.275, 21.8902, 5.548601, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1143, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.47, 1652.83, 20.56883, 4.118817, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1144, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1531.03, 1678.73, 21.01523, 4.8657, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1145, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1540.93, 1665.62, 20.56823, 4.928545, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1146, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1442.58, 1527.46, 20.69613, 3.461719, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1147, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1552.91, 1682, 20.56823, 4.766211, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1148, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1479.748, 1621.409, 23.05213, 3.756897, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1149, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1530.445, 1655.655, 23.4204, 4.559667, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1150, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1463.59, 1656.58, 20.56883, 4.011911, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1151, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1461.03, 1655.93, 20.56883, 5.139096, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1152, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1476.88, 1665.26, 20.56883, 4.040174, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1153, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1501.34, 1651.94, 20.56883, 4.252816, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1154, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1544.16, 1657.8, 20.56823, 4.500988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1155, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1476.79, 1623.5, 20.56883, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1156, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1483.65, 1664.25, 20.56883, 4.105886, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1157, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1460.22, 1634.1, 20.56883, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1158, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1480.85, 1653.4, 20.56883, 4.18615, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1159, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.75, 1664.37, 20.56883, 4.131517, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1160, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1469.09, 1633.21, 20.56883, 3.818596, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1161, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1449.4, 1656.5, 20.56883, 3.885785, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1162, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1484.08, 1655.13, 20.56883, 4.029567, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1163, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1469.9, 1655.04, 20.56883, 4.065339, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1164, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1465.17, 1624.06, 20.56883, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1165, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.47, 1652.83, 20.56883, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1166, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1485.66, 1622.61, 20.56883, 3.875825, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1167, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1492.51, 1663.36, 20.56883, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1168, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1569.4, 1680.01, 20.62353, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1169, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1475.22, 1656.02, 20.56883, 4.134988, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1170, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1587.21, 1679.06, 20.57713, 4.641073, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) (Auras: ) +(@CGUID+1171, 35229, 654, 4755, 4759, 1, 172, 0, 0, 0, -1514.918, 1620.793, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1172, 35566, 654, 4755, 4761, 1, 172, 0, 0, 0, -1619.7, 1498.03, 32.88292, 0.7853982, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Lord Darius Crowley (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: 67503 - Rebel Valor) +(@CGUID+1173, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1485.03, 1593.115, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1174, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1488.33, 1605.313, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1175, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1481.764, 1603.568, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1176, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1432.34, 1514.14, 20.77083, 4.167494, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1177, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1473.859, 1618.677, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1178, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1483.325, 1605.934, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1179, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1468.375, 1610.901, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1180, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1497.734, 1628.078, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1181, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1510.675, 1636.139, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1182, 35229, 654, 4755, 4761, 1, 172, 0, 0, 0, -1497.382, 1628.24, 20.56887, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Bloodfang Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1183, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1558.277, 1568.383, 29.19984, 3.71316, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1184, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1552.227, 1566.482, 29.2256, 0.7035502, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1185, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1554.786, 1570.727, 29.19917, 2.703048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+1186, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1553.623, 1570.04, 29.18957, 2.404701, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1187, 41015, 654, 4755, 4761, 1, 179, 0, 0, 0, -1579.273, 1546.21, 29.33743, 3.658013, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1188, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1545.201, 1561.826, 29.1982, 1.097429, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1189, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1603.005, 1530.483, 29.23638, 2.289958, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1190, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1559.211, 1567.555, 29.20271, 6.095902, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1191, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1553.72, 1570.917, 29.1904, 5.072607, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+1192, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1570.023, 1558.912, 29.19252, 1.158583, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1193, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1550.121, 1563.688, 29.22885, 1.532578, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1194, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1558.788, 1569.206, 29.19624, 6.045046, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1195, 41015, 654, 4755, 4761, 1, 179, 0, 0, 0, -1587.554, 1537.847, 29.33993, 0.8901179, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1196, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1558.526, 1547.833, 29.19279, 1.359904, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1197, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1597.547, 1535.834, 29.22873, 0.4459984, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1198, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1568.411, 1560.587, 29.19242, 3.381811, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1199, 41015, 654, 4755, 4761, 1, 179, 0, 0, 0, -1605.42, 1533.241, 29.31243, 0.3427013, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1200, 41015, 654, 4755, 4761, 1, 179, 0, 0, 0, -1594.24, 1537.415, 29.31602, 0.3316673, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1201, 41015, 654, 4755, 4761, 1, 179, 0, 0, 0, -1593.609, 1524.2, 29.32428, 0.7679449, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Northgate Rebel (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1202, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1554.579, 1550.99, 29.20203, 1.77492, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1203, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1579.341, 1542.546, 29.22209, 1.552176, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1204, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1580.632, 1524.778, 29.33551, 4.782202, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1205, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1595.38, 1512.05, 29.32603, 1.570796, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1206, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1586.365, 1507.825, 29.31241, 1.832596, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1207, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1586.752, 1540.686, 29.33968, 3.874631, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1208, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1571.536, 1537.554, 29.33545, 4.974188, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1209, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1592.363, 1537.835, 29.31415, 3.438299, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1210, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1601.52, 1520.15, 29.32303, 0.8203048, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1211, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1564.031, 1555.111, 29.29027, 3.874631, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: 8599 - Enrage) +(@CGUID+1212, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1575.057, 1544.705, 29.32289, 2.80998, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1213, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1609.705, 1527.16, 29.31234, 5.969026, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1214, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1561.54, 1553.106, 29.2925, 3.298672, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1215, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1578.359, 1530.28, 29.33911, 4.171337, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1216, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1553.806, 1551.823, 29.28475, 2.841066, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1217, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1595.38, 1512.05, 29.32603, 1.01116, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1218, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1602.799, 1534.434, 29.31235, 1.390373, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1219, 35627, 654, 4755, 4759, 1, 179, 0, 0, 0, -1586.365, 1507.825, 29.31241, 1.832596, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1220, 35627, 654, 4755, 4759, 1, 179, 0, 0, 0, -1558.177, 1548.964, 29.28476, 2.844887, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1221, 35627, 654, 4755, 4759, 1, 179, 0, 0, 0, -1546.13, 1560.172, 29.28475, 4.974188, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Cathedral Quarter - Difficulty: 0) +(@CGUID+1222, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1555.502, 1569.983, 29.28476, 4.071931, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1223, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1553.807, 1566.149, 29.28474, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1224, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1552.158, 1569.375, 29.28475, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) +(@CGUID+1225, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1554.533, 1567.629, 29.28475, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383), -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) (Auras: ) +(@CGUID+1226, 35627, 654, 4755, 4761, 1, 179, 0, 0, 0, -1553.122, 1569.988, 29.28476, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 25383); -- Frenzied Stalker (Area: Light's Dawn Cathedral - Difficulty: 0) + +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+1226; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(@CGUID+0, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+1, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+2, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+3, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+4, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+5, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+6, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+7, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+8, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+9, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+10, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+11, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+12, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+13, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+14, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+15, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Near) +(@CGUID+16, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+17, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+18, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+19, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Near) +(@CGUID+20, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+21, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+22, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+23, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+24, 0, 2410, 0, 1, 0, ''), -- Prince Liam Greymane +(@CGUID+25, 0, 0, 3, 1, 0, ''), -- Cat +(@CGUID+26, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+27, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+28, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+29, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+30, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+31, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+32, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+33, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+34, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+35, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+36, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+37, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+38, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+39, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+40, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+41, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+42, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+43, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+44, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+45, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+46, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+47, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+48, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+49, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Near) +(@CGUID+50, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+51, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+52, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+53, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+54, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+55, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+56, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+57, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+58, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+59, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+60, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+61, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+62, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+63, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+64, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+65, 0, 0, 0, 1, 0, '29266'), -- Lieutenant Walden - 29266 - Permanent Feign Death +(@CGUID+66, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+67, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+68, 0, 14582, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+69, 0, 0, 8, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+70, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+71, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+72, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+73, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+74, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+75, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+76, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+77, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+78, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+79, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Near) +(@CGUID+80, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+81, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+82, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+83, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+84, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+85, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+86, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+87, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+88, 0, 0, 3, 1, 0, ''), -- Cat +(@CGUID+89, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Near) +(@CGUID+90, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+91, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+92, 0, 0, 0, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+93, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+94, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+95, 0, 0, 8, 1, 0, '39662'), -- Shadowy Figure - 39662 - Vertex Color Black +(@CGUID+96, 0, 0, 0, 1, 0, ''), -- Panicked Citizen +(@CGUID+97, 0, 0, 0, 1, 0, ''), -- Gilneas Market Evacuation Credit +(@CGUID+98, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+99, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+100, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+101, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+102, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+103, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+104, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+105, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+106, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+107, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+108, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+109, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+110, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Near) +(@CGUID+111, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+112, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+113, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+114, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+115, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+116, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (Far) +(@CGUID+117, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+118, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+119, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+120, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+121, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+122, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+123, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+124, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+125, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+126, 0, 0, 0, 1, 0, ''), -- Gilneas Evacuation Facing Marker (First) +(@CGUID+127, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+128, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+129, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+130, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+131, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+132, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+133, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+134, 0, 0, 0, 1, 0, '52385'), -- Panicked Citizen - 52385 - Cosmetic - Periodic Cower +(@CGUID+135, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+136, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+137, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+138, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+139, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+140, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+141, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+142, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+143, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+144, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+145, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+146, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+147, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+148, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+149, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+150, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+151, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+152, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+153, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+154, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+155, 0, 0, 0, 1, 0, '8599'), -- Rampaging Worgen - 8599 - Enrage +(@CGUID+156, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+157, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+158, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+159, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+160, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+161, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+162, 0, 0, 65536, 1, 0, '49414'), -- Gwen Armstead - 49414 - Generic Quest Invisibility 1 +(@CGUID+163, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+164, 0, 2410, 0, 1, 0, ''), -- Prince Liam Greymane +(@CGUID+165, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+166, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+167, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+168, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+169, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+170, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+171, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+172, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+173, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+174, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+175, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+176, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+177, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+178, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+179, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+180, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+181, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+182, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+183, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+184, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+185, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+186, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+187, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+188, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+189, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+190, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+191, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+192, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+193, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+194, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+195, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+196, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+197, 0, 0, 0, 1, 0, ''), -- Frightened Chicken +(@CGUID+198, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+199, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+200, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+201, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+202, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+203, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+204, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+205, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+206, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+207, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+208, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+209, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+210, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+211, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+212, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+213, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+214, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+215, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+216, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+217, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+218, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+219, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+220, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+221, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+222, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+223, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+224, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+225, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+226, 0, 0, 0, 1, 0, ''), -- Bloodfang Bloodletter +(@CGUID+227, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+228, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+229, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+230, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+231, 0, 0, 50331648, 1, 0, ''), -- Gilnean Crow +(@CGUID+232, 0, 0, 50331648, 1, 0, ''), -- Gilnean Crow +(@CGUID+233, 0, 0, 50331648, 1, 0, ''), -- Gilnean Crow +(@CGUID+234, 0, 0, 50331648, 1, 0, ''), -- Gilnean Crow +(@CGUID+235, 0, 0, 50331648, 1, 0, ''), -- Gilnean Crow +(@CGUID+236, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+237, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+238, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+239, 0, 0, 0, 1, 0, ''), -- Marie Allen +(@CGUID+240, 0, 0, 0, 1, 0, ''), -- Gwen Armstead +(@CGUID+241, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+242, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+243, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+244, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+245, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+246, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+247, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+248, 0, 0, 0, 1, 0, ''), -- Myriam Spellwaker +(@CGUID+249, 0, 0, 0, 1, 0, ''), -- Gilnean Steed +(@CGUID+250, 0, 0, 0, 2, 0, ''), -- Huntsman Blake +(@CGUID+251, 0, 0, 8, 1, 0, ''), -- Wounded Guard +(@CGUID+252, 0, 0, 0, 1, 0, '45104'), -- Vitus Darkwalker - 45104 - Shadow Channelling +(@CGUID+253, 0, 0, 8, 1, 0, ''), -- Sister Almyra +(@CGUID+254, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+255, 0, 0, 0, 1, 0, ''), -- Fenegan Cobbler +(@CGUID+256, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+257, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+258, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+259, 0, 0, 0, 1, 0, ''), -- Sergeant Cleese +(@CGUID+260, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+261, 0, 0, 0, 1, 0, ''), -- Baron +(@CGUID+262, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+263, 0, 0, 0, 1, 0, '13236'), -- Celestine of the Harvest - 13236 - Nature Channeling +(@CGUID+264, 0, 0, 0, 1, 0, '34189'), -- Loren the Fence - 34189 - Stealth +(@CGUID+265, 0, 0, 8, 1, 0, ''), -- Wounded Guard +(@CGUID+266, 0, 0, 8, 1, 0, ''), -- Wounded Guard +(@CGUID+267, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+268, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+269, 0, 0, 8, 1, 0, ''), -- Wounded Guard +(@CGUID+270, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+271, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+272, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+273, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+274, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+275, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+276, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+277, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+278, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+279, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+280, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+281, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+282, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+283, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+284, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+285, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+286, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+287, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+288, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+289, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+290, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+291, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+292, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+293, 0, 2410, 0, 1, 0, ''), -- King Genn Greymane +(@CGUID+294, 0, 2410, 0, 1, 0, ''), -- Lord Godfrey +(@CGUID+295, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+296, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+297, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+298, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+299, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+300, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+301, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+302, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+303, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+304, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+305, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+306, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+307, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+308, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+309, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+310, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+311, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+312, 0, 0, 0, 1, 0, ''), -- Gilnean Survivor +(@CGUID+313, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+314, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+315, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+316, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+317, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+318, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+319, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+320, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+321, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+322, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+323, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+324, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+325, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+326, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+327, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+328, 0, 0, 0, 1, 0, ''), -- Captain Broderick +(@CGUID+329, 0, 0, 0, 1, 0, ''), -- Gilnean Royal Guard +(@CGUID+330, 0, 0, 0, 1, 0, '46598'), -- Franklin Martin - 46598 - Ride Vehicle Hardcoded +(@CGUID+331, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+332, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+333, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+334, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+335, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+336, 0, 0, 8, 1, 0, ''), -- Vincent Hersham +(@CGUID+337, 0, 0, 0, 1, 0, ''), -- Tobias Mistmantle +(@CGUID+338, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+339, 0, 0, 0, 1, 0, '29266'), -- Slain Guard - 29266 - Permanent Feign Death +(@CGUID+340, 0, 0, 0, 1, 0, '67503'), -- Lord Darius Crowley - 67503 - Rebel Valor +(@CGUID+341, 0, 0, 7, 1, 0, '52165'), -- Sean Dempsey - 52165 - Cosmetic - Stun Permanent (no anim) +(@CGUID+342, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+343, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+344, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+345, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+346, 0, 0, 0, 1, 0, ''), -- Josiah Avery +(@CGUID+347, 0, 0, 0, 1, 0, ''), -- Generic Trigger LAB - Multiphase +(@CGUID+348, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+349, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+350, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+351, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+352, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+353, 0, 0, 0, 1, 0, ''), -- Wary Mastiff +(@CGUID+354, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+355, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+356, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+357, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+358, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+359, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+360, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+361, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+362, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+363, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+364, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+365, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+366, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+367, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+368, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+369, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+370, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+371, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+372, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+373, 0, 0, 0, 1, 0, ''), -- Bloodfang Bloodletter +(@CGUID+374, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+375, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+376, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+377, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+378, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+379, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+380, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+381, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+382, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+383, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+384, 0, 0, 0, 1, 0, '46598'), -- Franklin Martin - 46598 - Ride Vehicle Hardcoded +(@CGUID+385, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+386, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+387, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+388, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+389, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+390, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+391, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+392, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+393, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+394, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+395, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+396, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+397, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+398, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+399, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+400, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+401, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+402, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+403, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+404, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+405, 0, 0, 0, 1, 0, ''), -- Rampaging Worgen +(@CGUID+406, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+407, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+408, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+409, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+410, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+411, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+412, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+413, 0, 0, 0, 1, 0, ''), -- Bloodfang Worgen +(@CGUID+414, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+415, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+416, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+417, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+418, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+419, 0, 0, 0, 1, 0, '83470'), -- Bloodfang Worgen - 83470 - Arcane Missiles Trainer +(@CGUID+420, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+421, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+422, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+423, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+424, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+425, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+426, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+427, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+428, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+429, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+430, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+431, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+432, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+433, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+434, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+435, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+436, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+437, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+438, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+439, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+440, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+441, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+442, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+443, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+444, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+445, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+446, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+447, 0, 0, 0, 1, 0, ''), -- Bloodfang Bloodletter +(@CGUID+448, 0, 0, 0, 1, 0, ''), -- Worgen Runt +(@CGUID+449, 0, 0, 0, 1, 0, '8599'), -- Worgen Runt - 8599 - Enrage +(@CGUID+450, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+451, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+452, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+453, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+454, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+455, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+456, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+457, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+458, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+459, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+460, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+461, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+462, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+463, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+464, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+465, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+466, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+467, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+468, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+469, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+470, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+471, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+472, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+473, 0, 0, 0, 1, 0, ''), -- Bloodfang Lurker +(@CGUID+474, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+475, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+476, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+477, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+478, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+479, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+480, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+481, 0, 0, 0, 1, 0, ''), -- Bloodfang Lurker +(@CGUID+482, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+483, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+484, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+485, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+486, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+487, 0, 0, 0, 1, 0, ''), -- Gilnean Mastiff +(@CGUID+488, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+489, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+490, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+491, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+492, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+493, 0, 2410, 0, 1, 0, ''), -- Lord Godfrey +(@CGUID+494, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+495, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+496, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+497, 0, 2410, 0, 1, 0, ''), -- King Genn Greymane +(@CGUID+498, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+499, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+500, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+501, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+502, 0, 0, 0, 2, 0, ''), -- Lorna Crowley +(@CGUID+503, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+504, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+505, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+506, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+507, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+508, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+509, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+510, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+511, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+512, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+513, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+514, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+515, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+516, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+517, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+518, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+519, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+520, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+521, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+522, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+523, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+524, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+525, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+526, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+527, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+528, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+529, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+530, 0, 0, 0, 1, 0, ''), -- Bloodfang Lurker +(@CGUID+531, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+532, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+533, 0, 0, 0, 1, 0, ''), -- Gilnean Mastiff +(@CGUID+534, 0, 0, 0, 1, 0, ''), -- Bloodfang Lurker +(@CGUID+535, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+536, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+537, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+538, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+539, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+540, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+541, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+542, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+543, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+544, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+545, 0, 0, 0, 1, 0, ''), -- Bloodfang Lurker +(@CGUID+546, 0, 0, 0, 2, 0, ''), -- Gilneas City Guard +(@CGUID+547, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+548, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+549, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+550, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+551, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+552, 0, 0, 131072, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+553, 0, 0, 131072, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+554, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+555, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+556, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+557, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+558, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+559, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+560, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+561, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+562, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+563, 0, 0, 131072, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+564, 0, 0, 131072, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+565, 0, 0, 0, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+566, 0, 0, 0, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+567, 0, 0, 0, 1, 0, ''), -- Wary Mastiff +(@CGUID+568, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+569, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+570, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+571, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+572, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+573, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+574, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+575, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+576, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+577, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+578, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+579, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+580, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+581, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+582, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+583, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+584, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+585, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+586, 0, 0, 0, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+587, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+588, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+589, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+590, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+591, 0, 0, 131072, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+592, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+593, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+594, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+595, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+596, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+597, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+598, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+599, 0, 0, 0, 1, 0, '8599'), -- Bloodfang Lurker - 8599 - Enrage +(@CGUID+600, 0, 0, 0, 1, 0, '5916'), -- Bloodfang Lurker - 5916 - Shadowstalker Stealth +(@CGUID+601, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+602, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+603, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+604, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+605, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+606, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+607, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+608, 0, 0, 50397184, 1, 0, '49414'), -- Krennan Aranas - 49414 - Generic Quest Invisibility 1 +(@CGUID+609, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+610, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+611, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+612, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+613, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+614, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+615, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+616, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+617, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+618, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+619, 0, 0, 8, 1, 0, ''), -- Gilneas City Guard +(@CGUID+620, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+621, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+622, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+623, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+624, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+625, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+626, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+627, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+628, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+629, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+630, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+631, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+632, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+633, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+634, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+635, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+636, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+637, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+638, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+639, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+640, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+641, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+642, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+643, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+644, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+645, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+646, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+647, 0, 0, 8, 1, 0, ''), -- Gilneas City Guard +(@CGUID+648, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+649, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+650, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+651, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+652, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+653, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+654, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+655, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+656, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+657, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+658, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+659, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+660, 0, 0, 0, 1, 0, ''), -- Commandeered Cannon +(@CGUID+661, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+662, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+663, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+664, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+665, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+666, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+667, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+668, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+669, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+670, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+671, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+672, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+673, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+674, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+675, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+676, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+677, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+678, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+679, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+680, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+681, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+682, 0, 0, 8, 1, 0, ''), -- Gilneas City Guard +(@CGUID+683, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+684, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+685, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+686, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+687, 0, 0, 0, 1, 0, ''), -- Gilneas City Guard +(@CGUID+688, 0, 0, 0, 1, 0, ''), -- Commandeered Cannon +(@CGUID+689, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+690, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+691, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+692, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+693, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+694, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+695, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+696, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+697, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+698, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+699, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+700, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+701, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+702, 0, 0, 0, 1, 0, ''), -- Bloodfang Ripper +(@CGUID+703, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+704, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+705, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+706, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+707, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+708, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+709, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+710, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+711, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+712, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+713, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+714, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+715, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+716, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+717, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+718, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+719, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+720, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+721, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+722, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+723, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+724, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+725, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+726, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+727, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+728, 0, 0, 50331649, 1, 0, ''), -- Gilnean Crow +(@CGUID+729, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+730, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+731, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+732, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+733, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+734, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+735, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+736, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+737, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+738, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+739, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+740, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+741, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+742, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+743, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+744, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+745, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+746, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+747, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+748, 0, 0, 0, 1, 0, ''), -- Gilnean Steed +(@CGUID+749, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+750, 0, 0, 0, 1, 0, '45104'), -- Vitus Darkwalker - 45104 - Shadow Channelling +(@CGUID+751, 0, 0, 0, 1, 0, ''), -- Fenegan Cobbler +(@CGUID+752, 0, 0, 0, 1, 0, ''), -- Baron +(@CGUID+753, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+754, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+755, 0, 0, 8, 1, 0, ''), -- Sister Almyra +(@CGUID+756, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+757, 0, 0, 0, 2, 0, ''), -- Huntsman Blake +(@CGUID+758, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+759, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+760, 0, 0, 0, 1, 0, ''), -- Gwen Armstead +(@CGUID+761, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+762, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+763, 0, 0, 0, 1, 0, '13236'), -- Celestine of the Harvest - 13236 - Nature Channeling +(@CGUID+764, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+765, 0, 0, 7, 1, 0, ''), -- Injured Citizen +(@CGUID+766, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+767, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+768, 0, 0, 0, 1, 0, ''), -- Loren the Fence +(@CGUID+769, 0, 0, 0, 1, 0, '67503'), -- Lord Darius Crowley - 67503 - Rebel Valor +(@CGUID+770, 0, 2410, 0, 1, 0, ''), -- King Genn Greymane +(@CGUID+771, 0, 0, 0, 1, 0, ''), -- Myriam Spellwaker +(@CGUID+772, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+773, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+774, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+775, 0, 0, 0, 1, 0, ''), -- Crowley's Horse +(@CGUID+776, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+777, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+778, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+779, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+780, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+781, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+782, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+783, 0, 0, 0, 1, 0, ''), -- Sergeant Cleese +(@CGUID+784, 0, 2410, 0, 1, 0, ''), -- Prince Liam Greymane +(@CGUID+785, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+786, 0, 0, 0, 1, 0, ''), -- Shaken Survivor +(@CGUID+787, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+788, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+789, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+790, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+791, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+792, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+793, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+794, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+795, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+796, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+797, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+798, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+799, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+800, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+801, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+802, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+803, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+804, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+805, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+806, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+807, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+808, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+809, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+810, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+811, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+812, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+813, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+814, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+815, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+816, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+817, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+818, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+819, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+820, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+821, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+822, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+823, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+824, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+825, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+826, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+827, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+828, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+829, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+830, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+831, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+832, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+833, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+834, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+835, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+836, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+837, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+838, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+839, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+840, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+841, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+842, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+843, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+844, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+845, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+846, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+847, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+848, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+849, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+850, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+851, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+852, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+853, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+854, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+855, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+856, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+857, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+858, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+859, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+860, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+861, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+862, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+863, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+864, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+865, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+866, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+867, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+868, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+869, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+870, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+871, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+872, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+873, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+874, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+875, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+876, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+877, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+878, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+879, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+880, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+881, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+882, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+883, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+884, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+885, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+886, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+887, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+888, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+889, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+890, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+891, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+892, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+893, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+894, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+895, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+896, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+897, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+898, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+899, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+900, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+901, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+902, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+903, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+904, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+905, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+906, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+907, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+908, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+909, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+910, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+911, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+912, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+913, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+914, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+915, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+916, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+917, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+918, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+919, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+920, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+921, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+922, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+923, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+924, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+925, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+926, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+927, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+928, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+929, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+930, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+931, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+932, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+933, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+934, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+935, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+936, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+937, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+938, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+939, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+940, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+941, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+942, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+943, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+944, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+945, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+946, 0, 0, 0, 1, 0, ''), -- Afflicted Gilnean +(@CGUID+947, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+948, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+949, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+950, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+951, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+952, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+953, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+954, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+955, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+956, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+957, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+958, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+959, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+960, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+961, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+962, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+963, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+964, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+965, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+966, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+967, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+968, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+969, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+970, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+971, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+972, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+973, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+974, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+975, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+976, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+977, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+978, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+979, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+980, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+981, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+982, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+983, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+984, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+985, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+986, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+987, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+988, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+989, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+990, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+991, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+992, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+993, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+994, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+995, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+996, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+997, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+998, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+999, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1000, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1001, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1002, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1003, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1004, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1005, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1006, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1007, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1008, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1009, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1010, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1011, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1012, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1013, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1014, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1015, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1016, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1017, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1018, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1019, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1020, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1021, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1022, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1023, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1024, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1025, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1026, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1027, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1028, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1029, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1030, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1031, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1032, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1033, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1034, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1035, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1036, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1037, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1038, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1039, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1040, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1041, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1042, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1043, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1044, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1045, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1046, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1047, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1048, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1049, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1050, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1051, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1052, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1053, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1054, 0, 0, 0, 2, 0, ''), -- Tobias Mistmantle +(@CGUID+1055, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1056, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1057, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1058, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1059, 0, 0, 0, 1, 0, ''), -- Crowley's Horse +(@CGUID+1060, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1061, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1062, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1063, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1064, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1065, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1066, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1067, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1068, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1069, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1070, 0, 0, 0, 1, 0, ''), -- Rebel Cannon +(@CGUID+1071, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1072, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1073, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+1074, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1075, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+1076, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1077, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1078, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1079, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1080, 0, 0, 0, 1, 0, ''), -- Rat +(@CGUID+1081, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1082, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1083, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1084, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1085, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1086, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1087, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1088, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1089, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1090, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1091, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1092, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1093, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1094, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1095, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1096, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1097, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1098, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1099, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1100, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1101, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1102, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1103, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1104, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1105, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1106, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1107, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1108, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1109, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1110, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1111, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1112, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1113, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1114, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1115, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1116, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1117, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1118, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1119, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1120, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1121, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1122, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1123, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1124, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1125, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1126, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1127, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1128, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1129, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1130, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1131, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1132, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1133, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1134, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1135, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1136, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1137, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1138, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1139, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1140, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1141, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1142, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1143, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1144, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1145, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1146, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1147, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1148, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1149, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1150, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1151, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1152, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1153, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1154, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1155, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1156, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1157, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1158, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1159, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1160, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1161, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1162, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1163, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1164, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1165, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1166, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1167, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1168, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1169, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1170, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1171, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1172, 0, 0, 0, 2, 0, '67503'), -- Lord Darius Crowley - 67503 - Rebel Valor +(@CGUID+1173, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1174, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1175, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1176, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1177, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1178, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1179, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1180, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1181, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1182, 0, 0, 0, 1, 0, ''), -- Bloodfang Stalker +(@CGUID+1183, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1184, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1185, 0, 0, 0, 1, 0, '8599'), -- Frenzied Stalker - 8599 - Enrage +(@CGUID+1186, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1187, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1188, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1189, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1190, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1191, 0, 0, 0, 1, 0, '8599'), -- Frenzied Stalker - 8599 - Enrage +(@CGUID+1192, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1193, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1194, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1195, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1196, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1197, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1198, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1199, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1200, 0, 0, 0, 1, 0, ''), -- Northgate Rebel +(@CGUID+1201, 0, 0, 0, 2, 0, ''), -- Northgate Rebel +(@CGUID+1202, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1203, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1204, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1205, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1206, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1207, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1208, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1209, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1210, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1211, 0, 0, 0, 1, 0, '8599'), -- Frenzied Stalker - 8599 - Enrage +(@CGUID+1212, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1213, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1214, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1215, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1216, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1217, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1218, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1219, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1220, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1221, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1222, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1223, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1224, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1225, 0, 0, 0, 1, 0, ''), -- Frenzied Stalker +(@CGUID+1226, 0, 0, 0, 1, 0, ''); -- Frenzied Stalker + + +SET @OGUID := 235505; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+60; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(@OGUID+0, 195327, 654, 4755, 4756, 1, 0, 379,-1513.217, 1371.139, 36.53497, 6.213374, 0, 0, -0.03489876, 0.9993908, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+1, 196404, 654, 4755, 4756, 1, 0, 379,-1880.474, 2545.83, 3.087044, 3.822272, 0.01975298, 0.006994247, -0.9424343, 0.3337342, 120, 255, 0, 25383), -- Basement Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+2, 195327, 654, 4755, 4756, 1, 0, 379,-1463.903, 1444.259, 36.59575, 4.71239, 0, 0, -0.7071066, 0.7071069, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+3, 202591, 654, 4755, 4756, 1, 0, 379,-1496.141, 1409.729, 35.5236, 6.274461, 0, 0, -0.004362106, 0.9999905, 120, 255, 1, 25383), -- Mailbox (Area: Merchant Square - Difficulty: 0) +(@OGUID+4, 195430, 654, 4755, 4756, 1, 0, 379,-1790.04, 1435.53, 21.7363, 1.668168, -0.01063776, 0.01383495, 0.7405329, 0.6717935, 120, 255, 0, 25383), -- Cellar Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+5, 195327, 654, 4755, 4756, 1, 0, 379,-1493.828, 1371.16, 36.55773, 3.089183, 0, 0, 0.9996567, 0.02620165, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+6, 195327, 654, 4755, 4756, 1, 0, 379,-1394.589, 1403.332, 36.42323, 3.124123, 0, 0, 0.9999619, 0.008734641, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+7, 195327, 654, 4755, 4756, 1, 0, 379,-1426.658, 1436.557, 36.39017, 3.071766, 0, 0, 0.9993906, 0.03490613, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+8, 195327, 654, 4755, 4756, 1, 0, 379,-1486.285, 1334.576, 36.48906, 1.832595, 0, 0, 0.7933531, 0.6087617, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+9, 196401, 654, 4755, 4756, 1, 0, 379,-1681.84, 2507.57, 97.7786, 3.938617, 0, 0, -0.9216394, 0.3880474, 120, 255, 1, 25383), -- 196401 (Area: Merchant Square - Difficulty: 0) +(@OGUID+10, 196400, 654, 4755, 4756, 1, 0, 379,-1542.021, 1978.71, 5.616106, 3.708827, 0, 0, -0.9600496, 0.2798298, 120, 255, 1, 25383), -- 196400 (Area: Merchant Square - Difficulty: 0) +(@OGUID+11, 204986, 654, 4755, 4756, 1, 0, 379,-1586.271, 1613.42, 20.3519, 1.416609, 0, 0, 0.650547, 0.7594659, 120, 255, 1, 25383), -- Cathedral Gate (Area: Merchant Square - Difficulty: 0) +(@OGUID+12, 206693, 654, 4755, 4756, 1, 0, 379,-1880.474, 2545.83, 3.087044, 3.822272, 0.01975298, 0.006994247, -0.9424343, 0.3337342, 120, 255, 1, 25383), -- Doodad_Worgen_Cellar_Door_02 (Area: Merchant Square - Difficulty: 0) +(@OGUID+13, 196412, 654, 4755, 4756, 1, 0, 379,-1872.92, 2073.58, 89.1548, 1.547509, 0, 0, 0.6988258, 0.7152919, 120, 255, 1, 25383), -- King's Gate (Area: Merchant Square - Difficulty: 0) +(@OGUID+14, 195327, 654, 4755, 4756, 1, 0, 379,-1537.47, 1443.967, 36.70511, 4.71239, 0, 0, -0.7071066, 0.7071069, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+15, 196399, 654, 4755, 4756, 1, 0, 379,-1817.84, 2333.37, 36.3445, 3.798994, 0, 0, -0.9464626, 0.3228134, 120, 255, 1, 25383), -- 196399 (Area: Merchant Square - Difficulty: 0) +(@OGUID+16, 207417, 654, 4755, 4756, 1, 0, 379,-1405.87, 1442.179, 35.55592, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Merchant Square - Difficulty: 0) +(@OGUID+17, 195327, 654, 4755, 4756, 1, 0, 379,-1421.076, 1412.984, 36.79442, 1.53589, 0, 0, 0.6946583, 0.7193398, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+18, 207093, 654, 4755, 4756, 1, 0, 379,-1651.25, 1607.085, 23.26756, 2.404515, 0, 0, 0.9328547, 0.360253, 120, 255, 1, 25383), -- Cozy Fire (Area: Merchant Square - Difficulty: 0) +(@OGUID+19, 207330, 654, 4755, 4756, 1, 0, 379,-1672.759, 1579.179, 20.2763, 4.022988, 0, 0, -0.9044542, 0.4265707, 120, 255, 1, 25383), -- Cauldron (Area: Merchant Square - Difficulty: 0) +(@OGUID+20, 202695, 654, 4755, 4756, 1, 0, 379,-1587.657, 1543.983, 29.20138, 2.347464, 0, 0, 0.9222002, 0.3867128, 120, 255, 1, 25383), -- Bench (Area: Merchant Square - Difficulty: 0) +(@OGUID+21, 202694, 654, 4755, 4756, 1, 0, 379,-1583.412, 1546.471, 29.20138, 1.911136, 0, 0, 0.8166418, 0.5771448, 120, 255, 1, 25383), -- Bench (Area: Merchant Square - Difficulty: 0) +(@OGUID+22, 202696, 654, 4755, 4756, 1, 0, 379,-1588.717, 1539.919, 29.20138, 3.045582, 0, 0, 0.998848, 0.04798714, 120, 255, 1, 25383), -- Bench (Area: Merchant Square - Difficulty: 0) +(@OGUID+23, 195327, 654, 4755, 4756, 1, 0, 379,-1562.477, 1409.71, 36.53197, 6.265733, 0, 0, -0.00872612, 0.9999619, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+24, 195327, 654, 4755, 4756, 1, 0, 379,-1583.431, 1359.09, 36.53497, 1.53589, 0, 0, 0.6946583, 0.7193398, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+25, 195327, 654, 4755, 4756, 1, 0, 379,-1576.568, 1335.938, 36.53497, 6.265733, 0, 0, -0.00872612, 0.9999619, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+26, 195327, 654, 4755, 4756, 1, 0, 379,-1529.502, 1322.795, 36.5849, 1.832595, 0, 0, 0.7933531, 0.6087617, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+27, 195327, 654, 4755, 4756, 1, 0, 379,-1569.804, 1384.913, 36.99949, 1.466076, 0, 0, 0.6691303, 0.743145, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+28, 195327, 654, 4755, 4756, 1, 0, 379,-1549.554, 1309.613, 36.4266, 3.38594, 0, 0, -0.9925461, 0.12187, 120, 255, 1, 25383), -- Merchant Square Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+29, 195306, 654, 4755, 4756, 1, 170, 0, -1478.734, 1380.339, 36.00387, 3.176533, 0, 0, -0.9998474, 0.01746928, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+30, 195306, 654, 4755, 4756, 1, 170, 0, -1440.887, 1440.72, 35.97989, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+31, 195306, 654, 4755, 4756, 1, 170, 0, -1482.493, 1440.37, 35.97626, 3.176533, 0, 0, -0.9998474, 0.01746928, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+32, 195306, 654, 4755, 4756, 1, 170, 0, -1419.036, 1428.557, 35.7935, 4.590216, 0, 0, -0.7489557, 0.6626201, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+33, 195621, 654, 4755, 4756, 1, 170, 0, -1790.03, 1435.53, 21.7358, 1.668168, -0.01063776, 0.01383495, 0.7405329, 0.6717935, 120, 255, 1, 25383), -- Cellar Door (Area: Merchant Square - Difficulty: 0) +(@OGUID+34, 195306, 654, 4755, 4756, 1, 170, 0, -1429.873, 1399.259, 36.00387, 4.590216, 0, 0, -0.7489557, 0.6626201, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+35, 195306, 654, 4755, 4756, 1, 170, 0, -1477.672, 1412.656, 35.55591, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+36, 202191, 654, 4755, 4756, 1, 170, 0, -1586.271, 1613.42, 20.3519, 1.416612, 0, 0, 0.650548, 0.7594652, 120, 255, 1, 25383), -- 202191 (Area: Merchant Square - Difficulty: 0) +(@OGUID+37, 195306, 654, 4755, 4756, 1, 170, 0, -1523.359, 1413.342, 35.55592, 4.590216, 0, 0, -0.7489557, 0.6626201, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+38, 195306, 654, 4755, 4756, 1, 170, 0, -1466.045, 1362.194, 36.00388, 3.176533, 0, 0, -0.9998474, 0.01746928, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+39, 195306, 654, 4755, 4756, 1, 170, 0, -1493.899, 1362.938, 35.99874, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+40, 195306, 654, 4755, 4756, 1, 170, 0, -1525.323, 1382.156, 36.00392, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+41, 195306, 654, 4755, 4756, 1, 170, 0, -1537.446, 1406.859, 35.55592, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+42, 195306, 654, 4755, 4756, 1, 170, 0, -1510.307, 1328.089, 35.80275, 5.009095, 0, 0, -0.5948229, 0.8038568, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+43, 195306, 654, 4755, 4756, 1, 170, 0, -1561.401, 1432.832, 35.96232, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+44, 195306, 654, 4755, 4756, 1, 170, 0, -1574.023, 1401.144, 36.63025, 3.176533, 0, 0, -0.9998474, 0.01746928, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+45, 195306, 654, 4755, 4756, 1, 170, 0, -1548.738, 1305.165, 35.8792, 3.281239, 0, 0, -0.9975634, 0.06976615, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+46, 207417, 654, 4755, 4756, 1, 170, 0, -1615.212, 1310.425, 18.9967, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Merchant Square - Difficulty: 0) +(@OGUID+47, 207417, 654, 4755, 4757, 1, 170, 0, -1615.212, 1310.425, 18.9967, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Military District - Difficulty: 0) +(@OGUID+48, 195306, 654, 4755, 4756, 1, 170, 0, -1541.222, 1381.214, 36.00387, 3.176533, 0, 0, -0.9998474, 0.01746928, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+49, 195306, 654, 4755, 4756, 1, 170, 0, -1477.672, 1412.656, 35.55591, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+50, 195306, 654, 4755, 4756, 1, 170, 0, -1574.023, 1401.144, 36.63025, 3.176533, 0, 0, -0.9998474, 0.01746928, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+51, 195306, 654, 4755, 4756, 1, 170, 0, -1561.401, 1432.832, 35.96232, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Supply Crate (Area: Merchant Square - Difficulty: 0) +(@OGUID+52, 207417, 654, 4755, 4756, 1, 170, 0, -1615.212, 1310.425, 18.9967, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Merchant Square - Difficulty: 0) +(@OGUID+53, 207417, 654, 4755, 4757, 1, 170, 0, -1615.212, 1310.425, 18.9967, 0, 0, 0, 0, 1, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Military District - Difficulty: 0) +(@OGUID+54, 195453, 654, 4755, 4757, 1, 171, 0, -1769.5, 1405.62, 20.0667, 5.896716, -0.02017355, 0.06879044, -0.1894732, 0.9792655, 120, 255, 1, 25383), -- 195453 (Area: Military District - Difficulty: 0) +(@OGUID+55, 195454, 654, 4755, 4757, 1, 171, 0, -1764.931, 1415.87, 20.1221, 1.40499, 0, 0, 0.6461239, 0.7632326, 120, 255, 1, 25383), -- 195454 (Area: Military District - Difficulty: 0) +(@OGUID+56, 195465, 654, 4755, 4757, 1, 171, 0, -1794.13, 1402.51, 20.1318, 2.155482, -0.03809595, -0.02527809, 0.8803816, 0.4720572, 120, 255, 1, 25383), -- 195465 (Area: Military District - Difficulty: 0) +(@OGUID+57, 195466, 654, 4755, 4757, 1, 171, 0, -1805.29, 1399.5, 20.261, 1.265364, 0.06552887, 0.01846695, 0.5911665, 0.8036711, 120, 255, 1, 25383), -- 195466 (Area: Military District - Difficulty: 0) +(@OGUID+58, 207417, 654, 4755, 4757, 1, 171, 0, -1797.111, 1550.611, 22.73234, 0.7504908, 0, 0, 0.3665009, 0.9304177, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Military District - Difficulty: 0) +(@OGUID+59, 207417, 654, 4755, 4757, 1, 171, 0, -1797.111, 1550.611, 22.73234, 0.7504908, 0, 0, 0.3665009, 0.9304177, 120, 255, 1, 25383), -- Crow Scatter Trap (Area: Military District - Difficulty: 0) +(@OGUID+60, 207417, 654, 4755, 4757, 1, 172, 0, -1799.163, 1547.597, 22.73689, 0.7504908, 0, 0, 0.3665009, 0.9304177, 120, 255, 1, 25383); -- Crow Scatter Trap (Area: Military District - Difficulty: 0) + +DELETE FROM `gameobject_addon` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+22; +INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`) VALUES +(@OGUID+1, 0, 0, 0.9426414, -0.3338069), -- Basement Door +(@OGUID+12, 0, 0, 0.9426414, -0.3338069), -- Doodad_Worgen_Cellar_Door_02 +(@OGUID+18, 0, 0, 0.9999967, -0.00259022), -- Cozy Fire +(@OGUID+20, 0, 0, 0.9255404, -0.3786487), -- Bench +(@OGUID+21, 0, 0, 0.9255404, -0.3786487), -- Bench +(@OGUID+22, 0, 0, 0.9255404, -0.3786487); -- Bench + +DELETE FROM `creature_addon` WHERE `guid` NOT IN (SELECT `guid` FROM `creature`); + diff --git a/sql/updates/auth/4.3.4/2017_12_17_00_auth.sql b/sql/updates/auth/4.3.4/2017_12_17_00_auth.sql new file mode 100644 index 0000000000..d28bbfca49 --- /dev/null +++ b/sql/updates/auth/4.3.4/2017_12_17_00_auth.sql @@ -0,0 +1,2 @@ +-- TDB 4.3.4-25 auth database +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/characters/4.3.4/2017_12_17_00_characters.sql b/sql/updates/characters/4.3.4/2017_12_17_00_characters.sql new file mode 100644 index 0000000000..f6e9fa9240 --- /dev/null +++ b/sql/updates/characters/4.3.4/2017_12_17_00_characters.sql @@ -0,0 +1,2 @@ +-- TDB 4.3.4-25 characters database +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/4.3.4/2017_12_17_00_world.sql b/sql/updates/world/4.3.4/2017_12_17_00_world.sql new file mode 100644 index 0000000000..920d24d8a5 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_17_00_world.sql @@ -0,0 +1,3 @@ +UPDATE `version` SET `db_version`='TDB 434.25', `cache_id`=25 LIMIT 1; + +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/4.3.4/2017_12_17_01_world_from_335_was_2017_12_16_03_world.sql b/sql/updates/world/4.3.4/2017_12_17_01_world_from_335_was_2017_12_16_03_world.sql new file mode 100644 index 0000000000..a5031c8e50 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_17_01_world_from_335_was_2017_12_16_03_world.sql @@ -0,0 +1,3 @@ +-- +ALTER TABLE `creature_template` ADD COLUMN `spell_school_immune_mask` int(3) unsigned NOT NULL DEFAULT '0' AFTER `mechanic_immune_mask`; + diff --git a/sql/updates/world/4.3.4/2017_12_17_02_world_from_335_was_2017_12_16_04_world.sql b/sql/updates/world/4.3.4/2017_12_17_02_world_from_335_was_2017_12_16_04_world.sql new file mode 100644 index 0000000000..d12014e054 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_17_02_world_from_335_was_2017_12_16_04_world.sql @@ -0,0 +1,2 @@ +DELETE FROM `trinity_string` WHERE `entry`=1188; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES (1188, 'Ban exists'); diff --git a/sql/updates/world/4.3.4/2017_12_17_03_world_from_335_was_2017_12_17_00_world.sql b/sql/updates/world/4.3.4/2017_12_17_03_world_from_335_was_2017_12_17_00_world.sql new file mode 100644 index 0000000000..999a4b2554 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_17_03_world_from_335_was_2017_12_17_00_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `creature_queststarter` WHERE `quest`=10901; +DELETE FROM `quest_template_addon` WHERE `ID` IN (13431, 10900); +INSERT INTO `quest_template_addon` (`ID`, `MaxLevel`, `PrevQuestID`, `ExclusiveGroup`) VALUES (13431, 70, 10900, 13431), (10900, 70, 0, 0); +UPDATE `quest_template_addon` SET `ExclusiveGroup`=13431 WHERE `ID`=10901; diff --git a/sql/updates/world/4.3.4/2017_12_17_04_world_from_335_was_2017_12_17_01_world.sql b/sql/updates/world/4.3.4/2017_12_17_04_world_from_335_was_2017_12_17_01_world.sql new file mode 100644 index 0000000000..3ae0c2d95f --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_17_04_world_from_335_was_2017_12_17_01_world.sql @@ -0,0 +1,11 @@ +-- +UPDATE `creature_template` SET `spell_school_immune_mask`=`spell_school_immune_mask`|2 WHERE `entry` IN (12457,16491); -- Holy +UPDATE `creature_template` SET `spell_school_immune_mask`=`spell_school_immune_mask`|4 WHERE `entry` IN (2091,2108,2447,2726,2760,4036,4037,4038,4676,5850,5852,7137,7664,7734,7735,9016,9017,9026,9816,9878,9879,10485,11502,11666,11667,11668,12056,12143,12457,16491,19203,19973,20703,21706,22323,25001,25417,30847); -- Fire +UPDATE `creature_template` SET `spell_school_immune_mask`=`spell_school_immune_mask`|8 WHERE `entry` IN (92,2258,2592,2735,2736,2752,2762,2791,4499,10485,11321,11744,11777,11778,11779,11783,11784,12201,12237,12457,14435,14455,16491,17085,17154,17156,17157,17158,17159,17160,18062,18181,21707,22036,23029,26407,28411,28585,28825); -- Nature +UPDATE `creature_template` SET `spell_school_immune_mask`=`spell_school_immune_mask`|16 WHERE `entry` IN (691,2761,3917,5461,5462,7079,7132,7428,7429,7664,7734,7735,9453,10198,10485,10642,10756,10757,12457,13280,16491,17153,17155,17167,17207,17358,19204,20704,21428,21728,22009,22035,22309,25740,25755,25756,25757,25865,26116,26178,26204,26214,26215,26216,26338,26339,26340,26341,26342,16570,24228,24601,25226,25514,25715,26316,30846); -- Frost +UPDATE `creature_template` SET `spell_school_immune_mask`=`spell_school_immune_mask`|32 WHERE `entry` IN (703,1043,1364,7664,10485,12457,16491,19206,20705,21032); -- Shadow +UPDATE `creature_template` SET `spell_school_immune_mask`=`spell_school_immune_mask`|64 WHERE `entry` IN (7734,7735,10202,10485,10662,10663,10664,11480,11483,12457,16488,16491,16530,16854,18864,18865,18866,18867,19205,20516,20702,21032,22310,26370,30848); -- Arcane + +UPDATE `creature_template` SET `dmgschool` = 4 WHERE `entry` = 17153; -- Lake Spirit +UPDATE `creature_template` SET `dmgschool` = 3 WHERE `entry` = 17154; -- Muck Spawn +UPDATE `creature_template` SET `dmgschool` = 4 WHERE `entry` = 17155; -- Lake Surger diff --git a/sql/updates/world/4.3.4/2017_12_18_00_world.sql b/sql/updates/world/4.3.4/2017_12_18_00_world.sql new file mode 100644 index 0000000000..27f2f8a0dc --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_18_00_world.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `difficulty_entry_1`=0, `ScriptName`='npc_sapphiron_blizzard' WHERE `entry`=16474; diff --git a/sql/updates/world/4.3.4/2017_12_19_00_world.sql b/sql/updates/world/4.3.4/2017_12_19_00_world.sql new file mode 100644 index 0000000000..0788aa230a --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_19_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `playercreateinfo_skills` SET `classMask`= `classMask`| 8 WHERE `skill`= 44; diff --git a/sql/updates/world/4.3.4/2017_12_19_01_world.sql b/sql/updates/world/4.3.4/2017_12_19_01_world.sql new file mode 100644 index 0000000000..1f995823f7 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_12_19_01_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `spell_learn_spell` WHERE `entry`= 87840; +INSERT INTO `spell_learn_spell` (`entry`, `SpellID`, `Active`) VALUES +(87840, 33388, 1); +UPDATE `spell_bonus_data` SET `direct_bonus`= 0.654 WHERE `entry`= 133; diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp index 7091dd0d37..b04fa645b6 100644 --- a/src/common/Metric/Metric.cpp +++ b/src/common/Metric/Metric.cpp @@ -208,11 +208,17 @@ void Metric::ScheduleSend() } } -void Metric::ForceSend() +void Metric::Unload() { // Send what's queued only if io_service is stopped (so only on shutdown) if (_enabled && _batchTimer->get_io_service().stopped()) + { + _enabled = false; SendBatch(); + } + + _batchTimer->cancel(); + _overallStatusTimer->cancel(); } void Metric::ScheduleOverallStatusLog() diff --git a/src/common/Metric/Metric.h b/src/common/Metric/Metric.h index 8e4d129251..82befe803e 100644 --- a/src/common/Metric/Metric.h +++ b/src/common/Metric/Metric.h @@ -110,7 +110,7 @@ public: void LogEvent(std::string const& category, std::string const& title, std::string const& description); - void ForceSend(); + void Unload(); bool IsEnabled() const { return _enabled; } }; diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index d1320995b9..206749b702 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -65,7 +65,7 @@ set_target_properties(authserver "server") if( WIN32 ) - if ( MSVC ) + if ( "${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild" ) add_custom_command(TARGET authserver POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/authserver.conf.dist ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/ diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index 611f63330d..e1943131e8 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp @@ -76,7 +76,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, permission, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); diff --git a/src/server/database/PrecompiledHeaders/databasePCH.cpp b/src/server/database/PrecompiledHeaders/databasePCH.cpp index f84a52be82..afc3186b65 100644 --- a/src/server/database/PrecompiledHeaders/databasePCH.cpp +++ b/src/server/database/PrecompiledHeaders/databasePCH.cpp @@ -1 +1,18 @@ -#include "PrecompiledHeaders/databasePCH.h" +/* + * Copyright (C) 2008-2017 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "databasePCH.h" diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 623d144d8a..191091cd85 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -288,7 +288,7 @@ bool DBUpdater::Populate(DatabaseWorkerPool& pool) case LOCATION_DOWNLOAD: { TC_LOG_ERROR("sql.updates", ">> File \"%s\" is missing, download it from \"https://t.me/trinitycorelegacy\"" \ - " Mirror: \"http://zippyshare.com/Aokromes/057kakzz/dir.html\"" \ + " Mirror: \"https://github.com/TrinityCoreLegacy/TrinityCore/releases\"" \ " uncompress it and place the file TDB_full_world_(a_variable_name).sql where your worldserver binary is located.", base.filename().generic_string().c_str()); break; } diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 1aaa64cd5e..84ead51cc9 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -29,9 +29,9 @@ class TC_GAME_API GameObjectAI { protected: - GameObject* const go; + GameObject* const me; public: - explicit GameObjectAI(GameObject* g) : go(g) { } + explicit GameObjectAI(GameObject* g) : me(g) { } virtual ~GameObjectAI() { } virtual void UpdateAI(uint32 /*diff*/) { } @@ -47,19 +47,39 @@ class TC_GAME_API GameObjectAI static int32 Permissible(GameObject const* /*go*/) { return PERMIT_BASE_NO; } - virtual bool GossipHello(Player* /*player*/, bool /*reportUse*/) { return false; } - virtual bool GossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) { return false; } - virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } - virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) { return false; } - virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } + // Called when a player opens a gossip dialog with the gameobject. + virtual bool GossipHello(Player* /*player*/) { return false; } + + // Called when a player selects a gossip item in the gameobject's gossip menu. + virtual bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { return false; } + + // Called when a player selects a gossip with a code in the gameobject's gossip menu. + virtual bool GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { return false; } + + // Called when a player accepts a quest from the gameobject. + virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { } + + // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } + + // Called when the dialog status between a player and the gameobject is requested. virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } + + // Called when a Player clicks a GameObject, before GossipHello + // prevents achievement tracking if returning true + virtual bool OnReportUse(Player* /*player*/) { return false; } + virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) { } + virtual void Damaged(Player* /*player*/, uint32 /*eventId*/) { } + virtual uint32 GetData(uint32 /*id*/) const { return 0; } virtual void SetData64(uint32 /*id*/, uint64 /*value*/) { } virtual uint64 GetData64(uint32 /*id*/) const { return 0; } virtual void SetData(uint32 /*id*/, uint32 /*value*/) { } + virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } - virtual void OnStateChanged(uint32 /*state*/, Unit* /*unit*/) { } + virtual void OnLootStateChanged(uint32 /*state*/, Unit* /*unit*/) { } + virtual void OnStateChanged(uint32 /*state*/) { } virtual void EventInform(uint32 /*eventId*/) { } virtual void SpellHit(Unit* /*unit*/, const SpellInfo* /*spellInfo*/) { } }; diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 4f4240887f..42f7cd6a63 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -297,13 +297,26 @@ class TC_GAME_API UnitAI static AISpellInfoType* AISpellInfo; static void FillAISpellInfo(); - virtual void sGossipHello(Player* /*player*/) { } - virtual void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { } - virtual void sGossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { } - virtual void sQuestAccept(Player* /*player*/, Quest const* /*quest*/) { } - virtual void sQuestSelect(Player* /*player*/, Quest const* /*quest*/) { } - virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } - virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + // Called when a player opens a gossip dialog with the creature. + virtual bool GossipHello(Player* /*player*/) { return false; } + + // Called when a player selects a gossip item in the creature's gossip menu. + virtual bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { return false; } + + // Called when a player selects a gossip with a code in the creature's gossip menu. + virtual bool GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { return false; } + + // Called when a player accepts a quest from the creature. + virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { } + + // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } + + // Called when a game event starts or ends + virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } + + // Called when the dialog status between a player and the creature is requested. + virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } private: UnitAI(UnitAI const& right) = delete; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index ada61de116..970b5718cd 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -795,24 +795,29 @@ void SmartAI::SetEvadeDisabled(bool disable) mEvadeDisabled = disable; } -void SmartAI::sGossipHello(Player* player) +bool SmartAI::GossipHello(Player* player) { GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player); + return false; } -void SmartAI::sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) +bool SmartAI::GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, menuId, gossipListId); + return false; } -void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { } +bool SmartAI::GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) +{ + return false; +} -void SmartAI::sQuestAccept(Player* player, Quest const* quest) +void SmartAI::QuestAccept(Player* player, Quest const* quest) { GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId()); } -void SmartAI::sQuestReward(Player* player, Quest const* quest, uint32 opt) +void SmartAI::QuestReward(Player* player, Quest const* quest, uint32 opt) { GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt); } @@ -902,7 +907,7 @@ void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) GetScript()->SetScript9(e, entry); } -void SmartAI::sOnGameEvent(bool start, uint16 eventId) +void SmartAI::OnGameEvent(bool start, uint16 eventId) { GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, nullptr, eventId); } @@ -951,10 +956,10 @@ void SmartGameObjectAI::UpdateAI(uint32 diff) void SmartGameObjectAI::InitializeAI() { - GetScript()->OnInitialize(go); + GetScript()->OnInitialize(me); // do not call respawn event if go is not spawned - if (go->isSpawned()) + if (me->isSpawned()) GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); //Reset(); } @@ -968,44 +973,49 @@ void SmartGameObjectAI::Reset() } // Called when a player opens a gossip dialog with the gameobject. -bool SmartGameObjectAI::GossipHello(Player* player, bool reportUse) +bool SmartGameObjectAI::GossipHello(Player* player) { TC_LOG_DEBUG("scripts.ai", "SmartGameObjectAI::GossipHello"); - GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, uint32(reportUse), 0, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, 0, 0, false, nullptr, me); + return false; +} + +bool SmartGameObjectAI::OnReportUse(Player* player) +{ + TC_LOG_DEBUG("scripts.ai", "SmartGameObjectAI::OnReportUse"); + GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, 1, 0, false, nullptr, me); return false; } // Called when a player selects a gossip item in the gameobject's gossip menu. -bool SmartGameObjectAI::GossipSelect(Player* player, uint32 sender, uint32 action) +bool SmartGameObjectAI::GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { - GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, menuId, gossipListId, false, nullptr, me); return false; } // Called when a player selects a gossip with a code in the gameobject's gossip menu. -bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) +bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { return false; } // Called when a player accepts a quest from the gameobject. -bool SmartGameObjectAI::QuestAccept(Player* player, Quest const* quest) +void SmartGameObjectAI::QuestAccept(Player* player, Quest const* quest) { - GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId(), 0, false, nullptr, go); - return false; + GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId(), 0, false, nullptr, me); } // Called when a player selects a quest reward. -bool SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt) +void SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt) { - GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt, false, nullptr, go); - return false; + GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt, false, nullptr, me); } // Called when the gameobject is destroyed (destructible buildings only). void SmartGameObjectAI::Destroyed(Player* player, uint32 eventId) { - GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, go); + GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, me); } void SmartGameObjectAI::SetData(uint32 id, uint32 value) @@ -1025,9 +1035,9 @@ void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId) GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, nullptr, eventId); } -void SmartGameObjectAI::OnStateChanged(uint32 state, Unit* unit) +void SmartGameObjectAI::OnLootStateChanged(uint32 state, Unit* unit) { - GetScript()->ProcessEventsFor(SMART_EVENT_GO_STATE_CHANGED, unit, state); + GetScript()->ProcessEventsFor(SMART_EVENT_GO_LOOT_STATE_CHANGED, unit, state); } void SmartGameObjectAI::EventInform(uint32 eventId) diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index bf0405eb1e..d8aa4164d0 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -178,13 +178,12 @@ class TC_GAME_API SmartAI : public CreatureAI void SetInvincibilityHpLevel(uint32 level) { mInvincibilityHpLevel = level; } - void sGossipHello(Player* player) override; - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override; - void sGossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override; - void sQuestAccept(Player* player, Quest const* quest) override; - //void sQuestSelect(Player* player, Quest const* quest) override; - void sQuestReward(Player* player, Quest const* quest, uint32 opt) override; - void sOnGameEvent(bool start, uint16 eventId) override; + bool GossipHello(Player* player) override; + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override; + bool GossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override; + void QuestAccept(Player* player, Quest const* quest) override; + void QuestReward(Player* player, Quest const* quest, uint32 opt) override; + void OnGameEvent(bool start, uint16 eventId) override; uint32 mEscortQuestID; @@ -255,16 +254,17 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI SmartScript* GetScript() { return &mScript; } static int32 Permissible(GameObject const* /*go*/) { return PERMIT_BASE_NO; } - bool GossipHello(Player* player, bool reportUse) override; - bool GossipSelect(Player* player, uint32 sender, uint32 action) override; - bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) override; - bool QuestAccept(Player* player, Quest const* quest) override; - bool QuestReward(Player* player, Quest const* quest, uint32 opt) override; + bool GossipHello(Player* player) override; + bool OnReportUse(Player* player) override; + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override; + bool GossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override; + void QuestAccept(Player* player, Quest const* quest) override; + void QuestReward(Player* player, Quest const* quest, uint32 opt) override; void Destroyed(Player* player, uint32 eventId) override; void SetData(uint32 id, uint32 value) override; void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); void OnGameEvent(bool start, uint16 eventId) override; - void OnStateChanged(uint32 state, Unit* unit) override; + void OnLootStateChanged(uint32 state, Unit* unit) override; void EventInform(uint32 eventId) override; void SpellHit(Unit* unit, const SpellInfo* spellInfo) override; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 1dd6a70694..d3f5718116 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2736,16 +2736,16 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e) if (!go) return; //store hostage as id1 - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0); //store invoker as id2 - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0); //signal hostage - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0); //when hostage raeched end point, give credit to invoker if (e.action.installTtemplate.param2) AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0); else - AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0); + AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0); break; } case SMARTAI_TEMPLATE_BASIC: @@ -3592,9 +3592,9 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui ProcessAction(e, nullptr, var0); break; } - case SMART_EVENT_GO_STATE_CHANGED: + case SMART_EVENT_GO_LOOT_STATE_CHANGED: { - if (e.event.goStateChanged.state != var0) + if (e.event.goLootStateChanged.lootState != var0) return; ProcessAction(e, unit, var0, var1); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 5b798a4073..a23ad8870e 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -811,7 +811,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_EVENT_LINK: - case SMART_EVENT_GO_STATE_CHANGED: + case SMART_EVENT_GO_LOOT_STATE_CHANGED: case SMART_EVENT_GO_EVENT_INFORM: case SMART_EVENT_TIMED_EVENT_TRIGGERED: case SMART_EVENT_INSTANCE_PLAYER_ENTER: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 161258f111..9e4dfc1a8b 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -182,7 +182,7 @@ enum SMART_EVENT SMART_EVENT_IS_BEHIND_TARGET = 67, // cooldownMin, CooldownMax SMART_EVENT_GAME_EVENT_START = 68, // game_event.Entry SMART_EVENT_GAME_EVENT_END = 69, // game_event.Entry - SMART_EVENT_GO_STATE_CHANGED = 70, // go state + SMART_EVENT_GO_LOOT_STATE_CHANGED = 70, // go LootState SMART_EVENT_GO_EVENT_INFORM = 71, // eventId SMART_EVENT_ACTION_DONE = 72, // eventId (SharedDefines.EventId) SMART_EVENT_ON_SPELLCLICK = 73, // clicker (unit) @@ -405,8 +405,8 @@ struct SmartEvent struct { - uint32 state; - } goStateChanged; + uint32 lootState; + } goLootStateChanged; struct { @@ -588,7 +588,7 @@ enum SMART_ACTION SMART_ACTION_LOAD_EQUIPMENT = 124, // id SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT = 125, // id min range, id max range SMART_ACTION_REMOVE_ALL_GAMEOBJECTS = 126, - SMART_ACTION_STOP_MOTION = 127, // stopMoving, movementExpired + SMART_ACTION_STOP_MOTION = 127, // stopMoving, movementExpired SMART_ACTION_PLAY_ANIMKIT = 128, // id, type (0 = oneShot, 1 = aiAnim, 2 = meleeAnim, 3 = movementAnim) SMART_ACTION_END = 129 @@ -1464,7 +1464,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_EVENT_GO_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, + {SMART_EVENT_GO_LOOT_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_GO_EVENT_INFORM, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_ACTION_DONE, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_ON_SPELLCLICK, SMART_SCRIPT_TYPE_MASK_CREATURE }, diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 8e5629c160..cd4ccc415a 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -384,6 +384,18 @@ std::string AccountMgr::CalculateShaPassHash(std::string const& name, std::strin return ByteArrayToHexStr(sha.GetDigest(), sha.GetLength()); } +bool AccountMgr::IsBannedAccount(std::string const& name) +{ + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME); + stmt->setString(0, name); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (!result) + return false; + + return true; +} + bool AccountMgr::IsPlayerAccount(uint32 gmlevel) { return gmlevel == SEC_PLAYER; diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 7159f32ce1..deb473bc97 100644 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -75,6 +75,7 @@ class TC_GAME_API AccountMgr static uint32 GetCharactersCount(uint32 accountId); static std::string CalculateShaPassHash(std::string const& name, std::string const& password); + static bool IsBannedAccount(std::string const& name); static bool IsPlayerAccount(uint32 gmlevel); static bool IsAdminAccount(uint32 gmlevel); static bool IsConsoleAccount(uint32 gmlevel); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 81f31bb349..40bef0af09 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -274,7 +274,7 @@ Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type) { bool isStatic = false; Creature* creature = NULL; - ASSERT(type <= AV_CPLACE_MAX + AV_STATICCPLACE_MAX); + ASSERT(type < AV_CPLACE_MAX + AV_STATICCPLACE_MAX); if (type >= AV_CPLACE_MAX) //static { type -= AV_CPLACE_MAX; diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index f015f73205..710d0c624b 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -91,6 +91,7 @@ void CalendarMgr::LoadFromDB() TC_LOG_INFO("server.loading", ">> Loaded %u calendar events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); count = 0; + oldMSTime = getMSTime(); // 0 1 2 3 4 5 6 7 if (QueryResult result = CharacterDatabase.Query("SELECT id, event, invitee, sender, status, statustime, rank, text FROM calendar_invites")) @@ -662,6 +663,6 @@ void CalendarMgr::SendPacketToAllEventRelatives(WorldPacket& packet, CalendarEve CalendarInviteStore invites = _invites[calendarEvent.GetEventId()]; for (CalendarInviteStore::iterator itr = invites.begin(); itr != invites.end(); ++itr) if (Player* player = ObjectAccessor::FindConnectedPlayer((*itr)->GetInviteeGUID())) - if (!calendarEvent.IsGuildEvent() || (calendarEvent.IsGuildEvent() && player->GetGuildId() != calendarEvent.GetGuildId())) + if (!calendarEvent.IsGuildEvent() || player->GetGuildId() != calendarEvent.GetGuildId()) player->SendDirectMessage(&packet); } diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 2e08061b77..5e5b9da5cc 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -345,6 +345,14 @@ enum AreaFlags AREA_FLAG_UNK9 = 0x40000000 }; +enum AreaMountFlags +{ + AREA_MOUNT_FLAG_GROUND_ALLOWED = 0x1, + AREA_MOUNT_FLAG_FLYING_ALLOWED = 0x2, + AREA_MOUNT_FLAG_FLOAT_ALLOWED = 0x4, + AREA_MOUNT_FLAG_UNDERWATER_ALLOWED = 0x8 +}; + enum Difficulty { REGULAR_DIFFICULTY = 0, @@ -449,10 +457,13 @@ enum ItemLimitCategoryMode ITEM_LIMIT_CATEGORY_MODE_EQUIP = 1 // limit applied to amount equipped items (including used gems) }; -enum MountFlags +enum MountCapabilityFlags { - MOUNT_FLAG_CAN_PITCH = 0x4, // client checks MOVEMENTFLAG2_FULL_SPEED_PITCHING - MOUNT_FLAG_CAN_SWIM = 0x8, // client checks MOVEMENTFLAG_SWIMMING + MOUNT_CAPABILITY_FLAG_GROUND = 0x1, + MOUNT_CAPABILITY_FLAG_FLYING = 0x2, + MOUNT_CAPABILITY_FLAG_FLOAT = 0x4, + MOUNT_CAPABILITY_FLAG_UNDERWATER = 0x8, + MOUNT_CAPABIILTY_FLAG_IGNORE_RESTRICTIONS = 0x20, }; enum SkillRaceClassInfoFlags diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 47ed0da65b..821cacebae 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -1385,3 +1385,20 @@ EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uin auto itr = sEmotesTextSoundMap.find(EmotesTextSoundKey(emote, race, gender)); return itr != sEmotesTextSoundMap.end() ? itr->second : nullptr; } + +bool IsInArea(uint32 objectAreaId, uint32 areaId) +{ + do + { + if (objectAreaId == areaId) + return true; + + AreaTableEntry const* objectArea = sAreaTableStore.LookupEntry(objectAreaId); + if (!objectArea) + break; + + objectAreaId = objectArea->zone; + } while (objectAreaId); + + return false; +} diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index a4fc6fe567..0e2e32e552 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -76,6 +76,7 @@ TC_GAME_API CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color); uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId); +TC_GAME_API bool IsInArea(uint32 objectAreaId, uint32 areaId); TC_GAME_API LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); uint32 GetDefaultMapLight(uint32 mapId); diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 5da7145978..f7636bbdb6 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -629,7 +629,7 @@ struct AreaTableEntry float MaxDepth; // 17, float AmbientMultiplier; // 18 client only? uint32 LightId; // 19 - //uint32 unk20; // 20 4.0.0 - Mounting related + uint32 MountFlags; // 20 //uint32 unk21; // 21 4.0.0 //uint32 unk22; // 22 4.0.0 //uint32 unk23; // 23 4.0.0 @@ -2252,7 +2252,7 @@ struct SpellShapeshiftFormEntry //uint32 unk3; // 9 unused always 0 //uint32 unk4; // 10 unused always 0 uint32 stanceSpell[MAX_SHAPESHIFT_SPELLS]; // 11-18 spells which appear in the bar after shapeshifting - //uint32 unk5; // 19 + uint32 MountTypeID; // 19 //uint32 unk6; // 20 }; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index cc394e308f..7fd82ed1f9 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -27,7 +27,7 @@ const std::string CustomAchievementfmt = "pppaaaapapaapp"; const std::string CustomAchievementIndex = "ID"; char const AnimKitfmt[] = "nxx"; char const AchievementCriteriafmt[] = "niiiliiiisiiiiixxiiiiii"; -char const AreaTableEntryfmt[] = "niiiixxxxxisiiiiiffixxxxxx"; +char const AreaTableEntryfmt[] = "niiiixxxxxisiiiiiffiixxxxx"; char const AreaGroupEntryfmt[] = "niiiiiii"; char const AreaPOIEntryfmt[] = "niiiiiiiiiiiffixixxixx"; char const AreaTriggerEntryfmt[] = "nifffxxxfffff"; @@ -172,7 +172,7 @@ char const SpellCooldownsEntryfmt[] = "diii"; char const SpellLevelsEntryfmt[] = "diii"; char const SpellRuneCostfmt[] = "niiii"; char const SpellShapeshiftEntryfmt[] = "niiiix"; -char const SpellShapeshiftFormfmt[] = "nxxiixiiixxiiiiiiiixx"; +char const SpellShapeshiftFormfmt[] = "nxxiixiiixxiiiiiiiiix"; char const StableSlotPricesfmt[] = "ni"; char const SummonPropertiesfmt[] = "niiiii"; char const TalentEntryfmt[] = "niiiiiiiiixxixxxxxx"; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 93e34636e6..52d77a57c0 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -294,7 +294,7 @@ void Creature::RemoveCorpse(bool setSpawnTime) // Should get removed later, just keep "compatibility" with scripts if (setSpawnTime) - m_respawnTime = std::max(time(NULL) + respawnDelay, m_respawnTime); + m_respawnTime = std::max(time(nullptr) + respawnDelay, m_respawnTime); // if corpse was removed during falling, the falling will continue and override relocation to respawn position if (IsFalling()) @@ -374,7 +374,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) // Load creature equipment if (!data || data->equipmentId == 0) LoadEquipment(); // use default equipment (if available) - else if (data && data->equipmentId != 0) // override, 0 means no equipment + else // override, 0 means no equipment { m_originalEquipmentId = data->equipmentId; LoadEquipment(data->equipmentId); @@ -395,6 +395,8 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) SetFloatValue(UNIT_FIELD_HOVERHEIGHT, cinfo->HoverHeight); + SetCanDualWield(cinfo->flags_extra & CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK); + // checked at loading m_defaultMovementType = MovementGeneratorType(data ? data->movementType : cinfo->MovementType); if (!m_respawnradius && m_defaultMovementType == RANDOM_MOTION_TYPE) @@ -436,6 +438,8 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); + SetCanDualWield(cInfo->flags_extra & CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK); + SetAttackTime(BASE_ATTACK, cInfo->BaseAttackTime); SetAttackTime(OFF_ATTACK, cInfo->BaseAttackTime); SetAttackTime(RANGED_ATTACK, cInfo->RangeAttackTime); @@ -487,7 +491,7 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, UpdateMovementFlags(); LoadCreaturesAddon(); - LoadMechanicTemplateImmunity(); + LoadTemplateImmunities(); return true; } @@ -708,8 +712,6 @@ void Creature::Update(uint32 diff) default: break; } - - sScriptMgr->OnCreatureUpdate(this, diff); } void Creature::RegenerateMana() @@ -1623,40 +1625,47 @@ bool Creature::CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) float Creature::GetAttackDistance(Unit const* player) const { + // WoW Wiki: the minimum radius seems to be 5 yards, while the maximum range is 45 yards + float maxRadius = (45.0f * sWorld->getRate(RATE_CREATURE_AGGRO)); + float minRadius = (5.0f * sWorld->getRate(RATE_CREATURE_AGGRO)); float aggroRate = sWorld->getRate(RATE_CREATURE_AGGRO); - if (aggroRate == 0) + uint8 expansionMaxLevel = uint8(GetMaxLevelForExpansion(GetCreatureTemplate()->expansion)); + + uint32 playerLevel = player->getLevel(); + uint32 creatureLevel = getLevel(); + + if (aggroRate == 0.0f) return 0.0f; - uint32 playerlevel = player->getLevelForTarget(this); - uint32 creaturelevel = getLevelForTarget(player); + // The aggro radius for creatures with equal level as the player is 20 yards. + // The combatreach should not get taken into account for the distance so we drop it from the range (see Supremus as expample) + float baseAggroDistance = 20.0f - GetCombatReach(); + float aggroRadius = baseAggroDistance; - int32 leveldif = int32(playerlevel) - int32(creaturelevel); - - // "The maximum Aggro Radius has a cap of 25 levels under. Example: A level 30 char has the same Aggro Radius of a level 5 char on a level 60 mob." - if (leveldif < - 25) - leveldif = -25; - - // "The aggro radius of a mob having the same level as the player is roughly 20 yards" - float RetDistance = 20; - - // "Aggro Radius varies with level difference at a rate of roughly 1 yard/level" - // radius grow if playlevel < creaturelevel - RetDistance -= (float)leveldif; - - if (creaturelevel+5 <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) + // detect range auras + if ((creatureLevel + 5) <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { - // detect range auras - RetDistance += GetTotalAuraModifier(SPELL_AURA_MOD_DETECT_RANGE); + aggroRadius += GetTotalAuraModifier(SPELL_AURA_MOD_DETECT_RANGE); - // detected range auras - RetDistance += player->GetTotalAuraModifier(SPELL_AURA_MOD_DETECTED_RANGE); + aggroRadius += player->GetTotalAuraModifier(SPELL_AURA_MOD_DETECTED_RANGE); } - // "Minimum Aggro Radius for a mob seems to be combat range (5 yards)" - if (RetDistance < 5) - RetDistance = 5; + // The aggro range of creatures with higher levels than the total player level for the expansion should get the maxlevel treatment + // This makes sure that creatures such as bosses wont have a bigger aggro range than the rest of the npc's + // The following code is used for blizzlike behavior such as skipable bosses (e.g. Commander Springvale at level 85) + if (creatureLevel > expansionMaxLevel) + aggroRadius += float(expansionMaxLevel) - float(playerLevel); + // + - 1 yard for each level difference between player and creature + else + aggroRadius += float(creatureLevel) - float(playerLevel); - return (RetDistance*aggroRate); + // Make sure that we wont go over the total range limits + if (aggroRadius > maxRadius) + aggroRadius = maxRadius; + else if (aggroRadius < minRadius) + aggroRadius = minRadius; + + return (aggroRadius * aggroRate); } void Creature::setDeathState(DeathState s) @@ -1842,7 +1851,7 @@ void Creature::DespawnOrUnsummon(uint32 msTimeToDespawn /*= 0*/, Seconds const& ForcedDespawn(msTimeToDespawn, forceRespawnTimer); } -void Creature::LoadMechanicTemplateImmunity() +void Creature::LoadTemplateImmunities() { // uint32 max used for "spell id", the immunity system will not perform SpellInfo checks against invalid spells // used so we know which immunities were loaded from template @@ -1852,6 +1861,9 @@ void Creature::LoadMechanicTemplateImmunity() for (uint32 i = MECHANIC_NONE + 1; i < MAX_MECHANIC; ++i) ApplySpellImmune(placeholderSpellId, IMMUNITY_MECHANIC, i, false); + for (uint32 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + ApplySpellImmune(placeholderSpellId, IMMUNITY_SCHOOL, 1 << i, false); + // don't inherit immunities for hunter pets if (GetOwnerGUID().IsPlayer() && IsHunterPet()) return; @@ -1864,6 +1876,15 @@ void Creature::LoadMechanicTemplateImmunity() ApplySpellImmune(placeholderSpellId, IMMUNITY_MECHANIC, i, true); } } + + if (uint32 mask = GetCreatureTemplate()->SpellSchoolImmuneMask) + { + for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + { + if (mask & (1 << i)) + ApplySpellImmune(placeholderSpellId, IMMUNITY_SCHOOL, 1 << i, true); + } + } } bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo, Unit* caster) const @@ -2196,7 +2217,7 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool /*force*/) const // if the mob is actively being damaged, do not reset due to distance unless it's a world boss if (!isWorldBoss()) - if (time(NULL) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME) + if (time(nullptr) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME) return true; //Use AttackDistance in distance check if threat radius is lower. This prevents creature bounce in and out of combat every update tick. diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 45d13911d6..03df8a160e 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -50,7 +50,7 @@ enum CreatureFlagsExtra : uint32 CREATURE_FLAG_EXTRA_NO_TAUNT = 0x00000100, // creature is immune to taunt auras and effect attack me CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE = 0x00000200, // creature won't update movement flags CREATURE_FLAG_EXTRA_GHOST_VISIBILITY = 0x00000400, // creature will be only visible for dead players - CREATURE_FLAG_EXTRA_UNUSED_11 = 0x00000800, + CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK = 0x00000800, // creature will use offhand attacks CREATURE_FLAG_EXTRA_UNUSED_12 = 0x00001000, CREATURE_FLAG_EXTRA_UNUSED_13 = 0x00002000, CREATURE_FLAG_EXTRA_WORLDEVENT = 0x00004000, // custom flag for world event creatures (left room for merging) @@ -73,10 +73,10 @@ enum CreatureFlagsExtra : uint32 CREATURE_FLAG_EXTRA_UNUSED_31 = 0x80000000, // Masks - CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_11 | CREATURE_FLAG_EXTRA_UNUSED_12 | CREATURE_FLAG_EXTRA_UNUSED_13 | - CREATURE_FLAG_EXTRA_UNUSED_16 | CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_23 | - CREATURE_FLAG_EXTRA_UNUSED_24 | CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_26 | - CREATURE_FLAG_EXTRA_UNUSED_27 | CREATURE_FLAG_EXTRA_UNUSED_31), + CREATURE_FLAG_EXTRA_UNUSED = (CREATURE_FLAG_EXTRA_UNUSED_12 | CREATURE_FLAG_EXTRA_UNUSED_13 | CREATURE_FLAG_EXTRA_UNUSED_16 | + CREATURE_FLAG_EXTRA_UNUSED_22 | CREATURE_FLAG_EXTRA_UNUSED_23 | CREATURE_FLAG_EXTRA_UNUSED_24 | + CREATURE_FLAG_EXTRA_UNUSED_25 | CREATURE_FLAG_EXTRA_UNUSED_26 | CREATURE_FLAG_EXTRA_UNUSED_27 | + CREATURE_FLAG_EXTRA_UNUSED_31), CREATURE_FLAG_EXTRA_DB_ALLOWED = (0xFFFFFFFF & ~(CREATURE_FLAG_EXTRA_UNUSED | CREATURE_FLAG_EXTRA_DUNGEON_BOSS)) }; @@ -154,6 +154,7 @@ struct TC_GAME_API CreatureTemplate uint32 movementId; bool RegenHealth; uint32 MechanicImmuneMask; + uint32 SpellSchoolImmuneMask; uint32 flags_extra; uint32 ScriptID; uint32 GetRandomValidModelId() const; @@ -496,7 +497,7 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma bool isCanInteractWithBattleMaster(Player* player, bool msg) const; bool isCanTrainingAndResetTalentsOf(Player* player) const; bool CanCreatureAttack(Unit const* victim, bool force = true) const; - void LoadMechanicTemplateImmunity(); + void LoadTemplateImmunities(); bool IsImmunedToSpell(SpellInfo const* spellInfo, Unit* caster) const override; bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const override; bool isElite() const; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 6bf67e5202..7f31215a4d 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -33,6 +33,7 @@ #include "UpdateFieldFlags.h" #include "World.h" #include "Transport.h" +#include "GossipDef.h" GameObject::GameObject() : WorldObject(false), MapObject(), m_model(nullptr), m_goValue(), m_AI(nullptr) @@ -721,7 +722,6 @@ void GameObject::Update(uint32 diff) break; } } - sScriptMgr->OnGameObjectUpdate(this, diff); } void GameObject::Refresh() @@ -1239,10 +1239,8 @@ void GameObject::Use(Unit* user) if (Player* playerUser = user->ToPlayer()) { - if (sScriptMgr->OnGossipHello(playerUser, this)) - return; - - if (AI()->GossipHello(playerUser, false)) + playerUser->PlayerTalkClass->ClearMenus(); + if (AI()->GossipHello(playerUser)) return; } @@ -2068,7 +2066,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* case GO_DESTRUCTIBLE_DAMAGED: { EventInform(m_goInfo->building.damagedEvent, eventInvoker); - sScriptMgr->OnGameObjectDamaged(this, eventInvoker); + AI()->Damaged(eventInvoker, m_goInfo->building.damageEvent); RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED); SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED); @@ -2092,8 +2090,9 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* } case GO_DESTRUCTIBLE_DESTROYED: { - sScriptMgr->OnGameObjectDestroyed(this, eventInvoker); EventInform(m_goInfo->building.destroyedEvent, eventInvoker); + AI()->Destroyed(eventInvoker, m_goInfo->building.destroyedEvent); + if (eventInvoker) if (Battleground* bg = eventInvoker->GetBattleground()) bg->DestroyGate(eventInvoker, this); @@ -2146,8 +2145,7 @@ void GameObject::SetLootState(LootState state, Unit* unit) else m_lootStateUnitGUID.Clear(); - AI()->OnStateChanged(state, unit); - sScriptMgr->OnGameObjectLootStateChanged(this, state, unit); + AI()->OnLootStateChanged(state, unit); if (GetGoType() == GAMEOBJECT_TYPE_DOOR) // only set collision for doors on SetGoState return; @@ -2166,7 +2164,8 @@ void GameObject::SetLootState(LootState state, Unit* unit) void GameObject::SetGoState(GOState state) { SetByteValue(GAMEOBJECT_BYTES_1, 0, state); - sScriptMgr->OnGameObjectStateChanged(this, state); + if (AI()) + AI()->OnStateChanged(state); if (m_model && !IsTransport()) { if (!IsInWorld()) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 2d25082242..340c0675af 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1301,7 +1301,7 @@ void WorldObject::RemoveFromWorld() Object::RemoveFromWorld(); } -InstanceScript* WorldObject::GetInstanceScript() +InstanceScript* WorldObject::GetInstanceScript() const { Map* map = GetMap(); return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceScript() : NULL; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index fcaa21a37d..de64babcd1 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -503,7 +503,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation uint32 GetAreaId() const { return m_areaId; } void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const { zoneid = m_zoneId, areaid = m_areaId; } - InstanceScript* GetInstanceScript(); + InstanceScript* GetInstanceScript() const; std::string const& GetName() const { return m_name; } void SetName(std::string const& newname) { m_name=newname; } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index c0d87711e3..7dbcced435 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -371,7 +371,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c owner->ToPlayer()->SetLastPetNumber(petId); // must be after SetMinion (owner guid check) - LoadMechanicTemplateImmunity(); + LoadTemplateImmunities(); m_loading = false; return true; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f487d8da1f..042a9dce20 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2266,7 +2266,6 @@ void Player::Regenerate(Powers power) float addvalue = 0.0f; // Powers now benefit from haste. - float rangedHaste = GetFloatValue(PLAYER_FIELD_MOD_RANGED_HASTE); float meleeHaste = GetFloatValue(PLAYER_FIELD_MOD_HASTE); float spellHaste = GetFloatValue(UNIT_MOD_CAST_SPEED); @@ -3872,7 +3871,7 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled, bool learn_low_rank) } // now re-learn if need re-activate - if (cur_active && !prev_itr->second->active && learn_low_rank) + if (!prev_itr->second->active && learn_low_rank) { if (AddSpell(prev_id, true, false, prev_itr->second->dependent, prev_itr->second->disabled)) { @@ -4196,7 +4195,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->ReqAbility[i])) { // check prev.rank requirement - if (prevSpell && !HasSpell(prevSpell)) + if (!HasSpell(prevSpell)) return TRAINER_SPELL_RED; } @@ -5892,7 +5891,6 @@ void Player::UpdateSkillsForLevel() uint16 field = itr->second.pos / 2; uint8 offset = itr->second.pos & 1; // itr->second.pos % 2 - uint16 val = GetUInt16Value(PLAYER_SKILL_RANK_0 + field, offset); uint16 max = GetUInt16Value(PLAYER_SKILL_MAX_RANK_0 + field, offset); /// update only level dependent max skill values @@ -9667,7 +9665,7 @@ void Player::SetVirtualItemSlot(uint8 i, Item* item) return; if (charges > 1) item->SetEnchantmentCharges(TEMP_ENCHANTMENT_SLOT, charges-1); - else if (charges <= 1) + else { ApplyEnchantment(item, TEMP_ENCHANTMENT_SLOT, false); item->ClearEnchantment(TEMP_ENCHANTMENT_SLOT); @@ -12330,7 +12328,7 @@ void Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, bool { if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) { - if (item && item->GetEntry() == itemEntry && !item->IsInTrade()) + if (item->GetEntry() == itemEntry && !item->IsInTrade()) { if (item->GetCount() + remcount <= count) { @@ -12964,7 +12962,7 @@ void Player::SwapItem(uint16 src, uint16 dst) } } - if (!released && IsBagPos(dst) && pDstItem) + if (!released && IsBagPos(dst)) { Bag* bag = pDstItem->ToBag(); for (uint32 i = 0; i < bag->GetBagSize(); ++i) @@ -13378,7 +13376,7 @@ void Player::AddEnchantmentDuration(Item* item, EnchantmentSlot slot, uint32 dur break; } } - if (item && duration > 0) + if (duration > 0) { GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration/1000)); m_enchantDuration.push_back(EnchantDuration(item, slot, duration)); @@ -14881,8 +14879,8 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver) switch (questGiver->GetTypeId()) { case TYPEID_UNIT: - sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest); - questGiver->ToCreature()->AI()->sQuestAccept(this, quest); + PlayerTalkClass->ClearMenus(); + questGiver->ToCreature()->AI()->QuestAccept(this, quest); break; case TYPEID_ITEM: case TYPEID_CONTAINER: @@ -14907,7 +14905,7 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver) break; } case TYPEID_GAMEOBJECT: - sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest); + PlayerTalkClass->ClearMenus(); questGiver->ToGameObject()->AI()->QuestAccept(this, quest); break; default: @@ -16023,11 +16021,12 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) QuestRelationBounds qr; QuestRelationBounds qir; + PlayerTalkClass->ClearMenus(); switch (questgiver->GetTypeId()) { case TYPEID_GAMEOBJECT: { - QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject())); + QuestGiverStatus questStatus = QuestGiverStatus(questgiver->ToGameObject()->AI()->GetDialogStatus(this)); if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS) return questStatus; qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry()); @@ -16036,7 +16035,7 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) } case TYPEID_UNIT: { - QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature())); + QuestGiverStatus questStatus = QuestGiverStatus(questgiver->ToCreature()->AI()->GetDialogStatus(this)); if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS) return questStatus; qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry()); @@ -16705,7 +16704,7 @@ bool Player::HasQuestForItem(uint32 itemid, uint32 excludeQuestId /* 0 */, bool // allows custom amount drop when not 0 if (qinfo->ItemDropQuantity[j]) { - if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j])) + if (ownedCount < qinfo->ItemDropQuantity[j] || turnIn ) return true; } else if (ownedCount < pProto->GetMaxStackSize()) return true; @@ -17315,7 +17314,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) RelocateToHomebind(); } // Player was saved in Arena or Bg - else if (mapEntry && mapEntry->IsBattlegroundOrArena()) + else if (mapEntry->IsBattlegroundOrArena()) { Battleground* currentBg = nullptr; if (m_bgData.bgInstanceID) //saved in Battleground @@ -20747,7 +20746,7 @@ Pet* Player::GetPet() const if (!pet) return nullptr; - if (IsInWorld() && pet) + if (IsInWorld()) return pet; // there may be a guardian in this slot @@ -24965,7 +24964,7 @@ bool Player::isTotalImmunity() const return false; } -uint32 Player::GetRuneTypeBaseCooldown(RuneType runeType) const +uint32 Player::GetRuneTypeBaseCooldown(RuneType /*runeType*/) const { return RUNE_BASE_COOLDOWN; } @@ -25268,31 +25267,6 @@ uint32 Player::CalculateTalentsPoints() const return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT)); } -bool Player::CanFlyInZone(uint32 mapid, uint32 areaid) const -{ - // continent checked in SpellInfo::CheckLocation at cast and area update - bool can_fly = false; - switch (mapid) - { - case 0: // Eastern Kingdoms - case 1: // Kalimdor - case 646: // Deepholm - can_fly = HasSpell(90267); // Flight Master's License - break; - case 571: // Northrend - can_fly = HasSpell(54197); // Cold Weather Flying - break; - case 530: // Outland - // Draenei and blood elves starting zones belong to Outland map, but are not flyable - // These zones don't have flag AREA_FLAG_OUTLAND2 - if (sAreaTableStore.AssertEntry(areaid)->flags & AREA_FLAG_OUTLAND2) - can_fly = true; - default: - break; - } - return can_fly; -} - void Player::LearnSpellHighestRank(uint32 spellid) { LearnSpell(spellid, false); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8be5ca484c..84bb34e7a7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2318,8 +2318,6 @@ class TC_GAME_API Player : public Unit, public GridObject void SetFallInformation(uint32 time, float z); void HandleFall(MovementInfo const& movementInfo); - bool CanFlyInZone(uint32 mapid, uint32 zone) const; - void SetClientControl(Unit* target, bool allowMove); void SetMover(Unit* target); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 92cc11459b..3163b8c037 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -139,6 +139,7 @@ DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo) case MELEE_HIT_EVADE: m_hitMask |= PROC_HIT_EVADE; break; + case MELEE_HIT_BLOCK: case MELEE_HIT_CRUSHING: case MELEE_HIT_GLANCING: case MELEE_HIT_NORMAL: @@ -149,8 +150,6 @@ DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo) if (!damageNullified) m_hitMask |= PROC_HIT_CRITICAL; break; - default: - break; } } @@ -5560,9 +5559,10 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); } - // delay offhand weapon attack to next attack time + // delay offhand weapon attack by 50% of the base attack time if (haveOffhandWeapon() && GetTypeId() != TYPEID_PLAYER) - resetAttackTimer(OFF_ATTACK); + setAttackTimer(OFF_ATTACK, std::max(getAttackTimer(OFF_ATTACK), getAttackTimer(BASE_ATTACK) + uint32(CalculatePct(GetFloatValue(UNIT_FIELD_BASEATTACKTIME), 50)))); + if (meleeAttack) SendMeleeAttackStart(victim); @@ -8084,18 +8084,35 @@ void Unit::Dismount() MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const { if (!mountType) - return NULL; + return nullptr; MountTypeEntry const* mountTypeEntry = sMountTypeStore.LookupEntry(mountType); if (!mountTypeEntry) - return NULL; + return nullptr; - uint32 zoneId, areaId; - GetZoneAndAreaId(zoneId, areaId); + + uint32 areaId = GetAreaId(); uint32 ridingSkill = 5000; + uint32 mountFlags = 0; + bool isSubmerged = false; + bool isInWater = false; + if (GetTypeId() == TYPEID_PLAYER) ridingSkill = ToPlayer()->GetSkillValue(SKILL_RIDING); + if (HasAuraType(SPELL_AURA_MOUNT_RESTRICTIONS)) + { + for (AuraEffect const* auraEffect : GetAuraEffectsByType(SPELL_AURA_MOUNT_RESTRICTIONS)) + mountFlags |= auraEffect->GetMiscValue(); + } + else if (AreaTableEntry const* areaTable = sAreaTableStore.LookupEntry(areaId)) + mountFlags = areaTable->MountFlags; + + LiquidData liquid; + ZLiquidStatus liquidStatus = GetMap()->GetLiquidStatus(GetPositionX(), GetPositionY(), GetPositionZ(), MAP_ALL_LIQUIDS, &liquid); + isSubmerged = (liquidStatus & LIQUID_MAP_UNDER_WATER) != 0 || HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING); + isInWater = (liquidStatus & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0; + for (uint32 i = MAX_MOUNT_CAPABILITIES; i > 0; --i) { MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(mountTypeEntry->MountCapability[i - 1]); @@ -8105,38 +8122,55 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const if (ridingSkill < mountCapability->RequiredRidingSkill) continue; - if (HasExtraUnitMovementFlag(MOVEMENTFLAG2_FULL_SPEED_PITCHING)) + if (!(mountCapability->Flags & MOUNT_CAPABIILTY_FLAG_IGNORE_RESTRICTIONS)) { - if (!(mountCapability->Flags & MOUNT_FLAG_CAN_PITCH)) + if (mountCapability->Flags & MOUNT_CAPABILITY_FLAG_GROUND && !(mountFlags & AREA_MOUNT_FLAG_GROUND_ALLOWED)) continue; - } - else if (HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING)) - { - if (!(mountCapability->Flags & MOUNT_FLAG_CAN_SWIM)) + if (mountCapability->Flags & MOUNT_CAPABILITY_FLAG_FLYING && !(mountFlags & AREA_MOUNT_FLAG_FLYING_ALLOWED)) continue; - } - else if (!(mountCapability->Flags & 0x1)) // unknown flags, checked in 4.2.2 14545 client - { - if (!(mountCapability->Flags & 0x2)) + if (mountCapability->Flags & MOUNT_CAPABILITY_FLAG_FLOAT && !(mountFlags & AREA_MOUNT_FLAG_FLOAT_ALLOWED)) + continue; + if (mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER && !(mountFlags & AREA_MOUNT_FLAG_UNDERWATER_ALLOWED)) continue; } - if (mountCapability->RequiredMap != -1 && int32(GetMapId()) != mountCapability->RequiredMap) + if (!isSubmerged) + { + if (!isInWater) + { + // player is completely out of water + if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_GROUND)) + continue; + } + else if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER)) + continue; + } + else if (isInWater) + { + if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_UNDERWATER)) + continue; + } + else if (!(mountCapability->Flags & MOUNT_CAPABILITY_FLAG_FLOAT)) continue; - if (mountCapability->RequiredArea && (mountCapability->RequiredArea != zoneId && mountCapability->RequiredArea != areaId)) + if (mountCapability->RequiredMap != -1 && + int32(GetMapId()) != mountCapability->RequiredMap && + GetMap()->GetEntry()->rootPhaseMap != mountCapability->RequiredMap) + continue; + + if (mountCapability->RequiredArea && !IsInArea(areaId, mountCapability->RequiredArea)) continue; if (mountCapability->RequiredAura && !HasAura(mountCapability->RequiredAura)) continue; - if (mountCapability->RequiredSpell && (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->HasSpell(mountCapability->RequiredSpell))) + if (mountCapability->RequiredSpell && !HasSpell(mountCapability->RequiredSpell)) continue; return mountCapability; } - return NULL; + return nullptr; } bool Unit::IsServiceProvider() const @@ -8396,6 +8430,9 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo Player const* player = playerAffectingAttacker ? playerAffectingAttacker : playerAffectingTarget; Unit const* creature = playerAffectingAttacker ? target : this; + if (creature->IsContestedGuard() && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP)) + return true; + if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry()) { if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate))) @@ -8529,7 +8566,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co && !((target->GetByteValue(UNIT_FIELD_BYTES_2, UNIT_BYTES_2_OFFSET_PVP_FLAG) & UNIT_BYTE2_FLAG_PVP))) { if (Creature const* creatureTarget = target->ToCreature()) - return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT; + return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST; } return true; } @@ -11757,7 +11794,6 @@ void Unit::SetStunned(bool apply) if (GetTypeId() == TYPEID_PLAYER) SetStandState(UNIT_STAND_STATE_STAND); - SetRooted(true); CastStop(); @@ -11788,7 +11824,7 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/) // setting MOVEMENTFLAG_ROOT RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING); AddUnitMovementFlag(MOVEMENTFLAG_ROOT); - StopMoving(); + StopMoving(); } else RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 5ef83f1373..b0711c9caf 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -42,7 +42,7 @@ bool GameEventMgr::CheckOneGameEvent(uint16 entry) const default: case GAMEEVENT_NORMAL: { - time_t currenttime = time(NULL); + time_t currenttime = time(nullptr); // Get the event information return mGameEvent[entry].start < currenttime && currenttime < mGameEvent[entry].end @@ -59,7 +59,7 @@ bool GameEventMgr::CheckOneGameEvent(uint16 entry) const // if inactive world event, check the prerequisite events case GAMEEVENT_WORLD_INACTIVE: { - time_t currenttime = time(NULL); + time_t currenttime = time(nullptr); for (std::set::const_iterator itr = mGameEvent[entry].prerequisite_events.begin(); itr != mGameEvent[entry].prerequisite_events.end(); ++itr) { if ((mGameEvent[*itr].state != GAMEEVENT_WORLD_NEXTPHASE && mGameEvent[*itr].state != GAMEEVENT_WORLD_FINISHED) || // if prereq not in nextphase or finished state, then can't start this one @@ -75,7 +75,7 @@ bool GameEventMgr::CheckOneGameEvent(uint16 entry) const uint32 GameEventMgr::NextCheck(uint16 entry) const { - time_t currenttime = time(NULL); + time_t currenttime = time(nullptr); // for NEXTPHASE state world events, return the delay to start the next event, so the followup event will be checked correctly if ((mGameEvent[entry].state == GAMEEVENT_WORLD_NEXTPHASE || mGameEvent[entry].state == GAMEEVENT_WORLD_FINISHED) && mGameEvent[entry].nextstart >= currenttime) @@ -135,7 +135,7 @@ bool GameEventMgr::StartEvent(uint16 event_id, bool overwrite) ApplyNewEvent(event_id); if (overwrite) { - mGameEvent[event_id].start = time(NULL); + mGameEvent[event_id].start = time(nullptr); if (data.end <= data.start) data.end = data.start + data.length; } @@ -1053,7 +1053,7 @@ void GameEventMgr::StartArenaSeason() uint32 GameEventMgr::Update() // return the next event delay in ms { - time_t currenttime = time(NULL); + time_t currenttime = time(nullptr); uint32 nextEventDelay = max_ge_check_delay; // 1 day uint32 calcDelay; std::set activate, deactivate; @@ -1262,7 +1262,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) } } - if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) + if (internal_event_id >= int32(mGameEventPoolIds.size())) { TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventGameobjectGuids element %i (size: %zu).", internal_event_id, mGameEventGameobjectGuids.size()); @@ -1641,7 +1641,7 @@ bool GameEventMgr::CheckOneGameEventConditions(uint16 event_id) // set the followup events' start time if (!mGameEvent[event_id].nextstart) { - time_t currenttime = time(NULL); + time_t currenttime = time(nullptr); mGameEvent[event_id].nextstart = currenttime + mGameEvent[event_id].length * 60; } return true; @@ -1684,7 +1684,7 @@ class GameEventAIHookWorker { for (auto const& p : creatureMap) if (p.second->IsInWorld() && p.second->IsAIEnabled) - p.second->AI()->sOnGameEvent(_activate, _eventId); + p.second->AI()->OnGameEvent(_activate, _eventId); } void Visit(std::unordered_map& gameObjectMap) @@ -1757,7 +1757,7 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event) bool singleDate = ((holiday->Date[0] >> 24) & 0x1F) == 31; // Events with fixed date within year have - 1 - time_t curTime = time(NULL); + time_t curTime = time(nullptr); for (int i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i) { uint32 date = holiday->Date[i]; @@ -1773,6 +1773,8 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event) timeInfo.tm_hour = (date >> 6) & 0x1F; timeInfo.tm_min = date & 0x3F; timeInfo.tm_sec = 0; + timeInfo.tm_wday = 0; + timeInfo.tm_yday = 0; timeInfo.tm_isdst = -1; tm tmCopy = timeInfo; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ade3e07a82..5a5192107b 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -434,8 +434,8 @@ void ObjectMgr::LoadCreatureTemplates() "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " // 64 65 66 67 68 69 70 71 72 "InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, " - // 73 74 75 76 77 78 - "RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template"); + // 73 74 75 76 77 78 79 + "RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template"); if (!result) { @@ -532,12 +532,14 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.ModArmor = fields[70].GetFloat(); creatureTemplate.ModDamage = fields[71].GetFloat(); creatureTemplate.ModExperience = fields[72].GetFloat(); - creatureTemplate.RacialLeader = fields[73].GetBool(); - creatureTemplate.movementId = fields[74].GetUInt32(); - creatureTemplate.RegenHealth = fields[75].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[76].GetUInt32(); - creatureTemplate.flags_extra = fields[77].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[78].GetCString()); + + creatureTemplate.RacialLeader = fields[73].GetBool(); + creatureTemplate.movementId = fields[74].GetUInt32(); + creatureTemplate.RegenHealth = fields[75].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[76].GetUInt32(); + creatureTemplate.SpellSchoolImmuneMask = fields[77].GetUInt32(); + creatureTemplate.flags_extra = fields[78].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[79].GetCString()); } void ObjectMgr::LoadCreatureTemplateAddons() diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index b1cde60c4c..944c53b942 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1535,6 +1535,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap) roll->getLoot()->NotifyItemRemoved(roll->itemSlot); roll->getLoot()->unlootedCount--; ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid); + ASSERT(pProto); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, 13262); // Disenchant ItemPosCountVec dest; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 97f6d5779f..5d17e69032 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1973,6 +1973,7 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool } Member const* memberMe = GetMember(player->GetGUID()); + ASSERT(memberMe); uint8 rankId = memberMe->GetRankId(); if (demote) { diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index c33d5904ac..1689b8efea 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -147,14 +147,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recvData) { if (unit) { - unit->AI()->sGossipSelectCode(_player, menuId, gossipListId, code.c_str()); - if (!sScriptMgr->OnGossipSelectCode(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId), code.c_str())) + if (!unit->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str())) _player->OnGossipSelect(unit, gossipListId, menuId); } else { - go->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str()); - if (!sScriptMgr->OnGossipSelectCode(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId), code.c_str())) + if (!go->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str())) _player->OnGossipSelect(go, gossipListId, menuId); } } @@ -162,14 +160,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recvData) { if (unit) { - unit->AI()->sGossipSelect(_player, menuId, gossipListId); - if (!sScriptMgr->OnGossipSelect(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId))) + if (!unit->AI()->GossipSelect(_player, menuId, gossipListId)) _player->OnGossipSelect(unit, gossipListId, menuId); } else { - go->AI()->GossipSelect(_player, menuId, gossipListId); - if (!sScriptMgr->OnGossipSelect(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId))) + if (!go->AI()->GossipSelect(_player, menuId, gossipListId)) _player->OnGossipSelect(go, gossipListId, menuId); } } @@ -618,19 +614,19 @@ void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData) if (!GetPlayer()->IsResurrectRequestedBy(guid)) return; - if (Player* ressPlayer = ObjectAccessor::GetPlayer(*GetPlayer(), guid)) - { - if (InstanceScript* instance = ressPlayer->GetInstanceScript()) - { - if ((instance->IsEncounterInProgress() && ressPlayer->GetMap()->IsRaid())) - { - if (!instance->GetCombatResurrectionCharges()) - return; - else - instance->UseCombatResurrection(); - } - } - } + if (Player* ressPlayer = ObjectAccessor::GetPlayer(*GetPlayer(), guid)) + { + if (InstanceScript* instance = ressPlayer->GetInstanceScript()) + { + if ((instance->IsEncounterInProgress() && ressPlayer->GetMap()->IsRaid())) + { + if (!instance->GetCombatResurrectionCharges()) + return; + else + instance->UseCombatResurrection(); + } + } + } GetPlayer()->ResurrectUsingRequestData(); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 08fb1e0249..6960d20246 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -32,6 +32,7 @@ #include "MovementStructures.h" #include "Vehicle.h" #include "GameTime.h" +#include "SpellAuraEffects.h" #define MOVEMENT_PACKET_TIME_DELAY 0 @@ -187,10 +188,6 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->GetZoneAndAreaId(newzone, newarea); GetPlayer()->UpdateZone(newzone, newarea); - // can fly check - if (!_player->CanFlyInZone(newMap->GetId(), newarea)) - _player->RemoveAurasByType(SPELL_AURA_FLY); - // honorless target if (GetPlayer()->pvpInfo.IsHostile) GetPlayer()->CastSpell(GetPlayer(), 2479, true); @@ -266,10 +263,6 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) // in friendly area else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); - - // can fly check - if (!plMover->CanFlyInZone(plMover->GetMapId(), newzone)) - plMover->RemoveAurasByType(SPELL_AURA_FLY); } // resummon pet diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 41c24442f2..b4d5583c0c 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -364,13 +364,13 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData) } } - if (!sScriptMgr->OnGossipHello(_player, unit)) + _player->PlayerTalkClass->ClearMenus(); + if (!unit->AI()->GossipHello(_player)) { // _player->TalkedToCreature(unit->GetEntry(), unit->GetGUID()); _player->PrepareGossipMenu(unit, unit->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(unit); } - unit->AI()->sGossipHello(_player); } void WorldSession::HandleSpiritHealerActivateOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 5f6a225ec2..48fbbc6c71 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -209,7 +209,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe pet->ClearUnitState(UNIT_STATE_FOLLOW); // This is true if pet has no target or has target but targets differs. - if (pet->GetVictim() != TargetUnit || (pet->GetVictim() == TargetUnit && !pet->GetCharmInfo()->IsCommandAttack())) + if (pet->GetVictim() != TargetUnit || !pet->GetCharmInfo()->IsCommandAttack()) { if (pet->GetVictim()) pet->AttackStop(); diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 2acaa287a7..61e59a3344 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -89,13 +89,12 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData) // Stop the npc if moving creature->StopMoving(); - if (sScriptMgr->OnGossipHello(_player, creature)) + _player->PlayerTalkClass->ClearMenus(); + if (creature->AI()->GossipHello(_player)) return; _player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true); _player->SendPreparedGossip(creature); - - creature->AI()->sGossipHello(_player); } void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData) @@ -308,48 +307,42 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) case TYPEID_UNIT: case TYPEID_PLAYER: { - //For AutoSubmition was added plr case there as it almost same exclute AI script cases. - Creature* creatureQGiver = object->ToCreature(); - if (!creatureQGiver || !sScriptMgr->OnQuestReward(_player, creatureQGiver, quest, reward)) + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); - } + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); } - - if (creatureQGiver) - creatureQGiver->AI()->sQuestReward(_player, quest, reward); } + + _player->PlayerTalkClass->ClearMenus(); + if (Creature* creatureQGiver = object->ToCreature()) + creatureQGiver->AI()->QuestReward(_player, quest, reward); break; } case TYPEID_GAMEOBJECT: { - GameObject* questGiver = object->ToGameObject(); - if (!sScriptMgr->OnQuestReward(_player, questGiver, quest, reward)) + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) { - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); - } + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); } - - questGiver->AI()->QuestReward(_player, quest, reward); } + + _player->PlayerTalkClass->ClearMenus(); + if (GameObject* questGiver = object->ToGameObject()) + questGiver->AI()->QuestReward(_player, quest, reward); break; } default: diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index a19bb478eb..fcfce3ee5a 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -337,7 +337,7 @@ void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket) if (GameObject* go = GetPlayer()->GetGameObjectIfCanInteractWith(guid)) { - if (go->AI()->GossipHello(_player, true)) + if (go->AI()->OnReportUse(_player)) return; _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry()); diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 5ddd3f6c77..085a9694fc 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -254,12 +254,17 @@ class TC_GAME_API InstanceScript : public ZoneScript uint32 GetEncounterCount() const { return bosses.size(); } - void InitializeCombatResurrections(uint8 charges = 1, uint32 interval = 0); - void AddCombatResurrectionCharge(); - void UseCombatResurrection(); - void ResetCombatResurrections(); - uint8 GetCombatResurrectionCharges() const { return _combatResurrectionCharges; } - uint32 GetCombatResurrectionChargeInterval() const; + // Only used by areatriggers that inherit from OnlyOnceAreaTriggerScript + void MarkAreaTriggerDone(uint32 id) { _activatedAreaTriggers.insert(id); } + void ResetAreaTriggerDone(uint32 id) { _activatedAreaTriggers.erase(id); } + bool IsAreaTriggerDone(uint32 id) const { return _activatedAreaTriggers.find(id) != _activatedAreaTriggers.end(); } + + void InitializeCombatResurrections(uint8 charges = 1, uint32 interval = 0); + void AddCombatResurrectionCharge(); + void UseCombatResurrection(); + void ResetCombatResurrections(); + uint8 GetCombatResurrectionCharges() const { return _combatResurrectionCharges; } + uint32 GetCombatResurrectionChargeInterval() const; protected: void SetHeaders(std::string const& dataHeaders); @@ -304,9 +309,10 @@ class TC_GAME_API InstanceScript : public ZoneScript ObjectInfoMap _gameObjectInfo; ObjectGuidMap _objectGuids; uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets - uint32 _combatResurrectionTimer; - uint8 _combatResurrectionCharges; // the counter for available battle resurrections - bool _combatResurrectionTimerStarted; + uint32 _combatResurrectionTimer; + uint8 _combatResurrectionCharges; // the counter for available battle resurrections + bool _combatResurrectionTimerStarted; + std::unordered_set _activatedAreaTriggers; #ifdef TRINITY_API_USE_DYNAMIC_LINKING // Strong reference to the associated script module diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 270b0a7485..c98519a727 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2528,8 +2528,10 @@ void Map::GetFullTerrainStatusForPosition(float x, float y, float z, PositionFul if (vmapData.areaInfo) data.areaInfo = boost::in_place(vmapData.areaInfo->adtId, vmapData.areaInfo->rootId, vmapData.areaInfo->groupId, vmapData.areaInfo->mogpFlags); + float mapHeight = VMAP_INVALID_HEIGHT; GridMap* gmap = const_cast(this)->GetGrid(x, y); - float mapHeight = gmap->getHeight(x, y); + if (gmap) + mapHeight = gmap->getHeight(x, y); // area lookup AreaTableEntry const* areaEntry = nullptr; @@ -2537,6 +2539,8 @@ void Map::GetFullTerrainStatusForPosition(float x, float y, float z, PositionFul if (WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(vmapData.areaInfo->rootId, vmapData.areaInfo->adtId, vmapData.areaInfo->groupId)) areaEntry = sAreaTableStore.LookupEntry(wmoEntry->areaId); + data.areaId = 0; + if (areaEntry) { data.floorZ = vmapData.floorZ; @@ -3140,7 +3144,7 @@ bool InstanceMap::AddPlayerToMap(Player* player) // increase current instances (hourly limit) if (!group || !group->isLFGGroup()) - player->AddInstanceEnterTime(GetInstanceId(), time(NULL)); + player->AddInstanceEnterTime(GetInstanceId(), time(nullptr)); // get or create an instance save for the map InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(GetInstanceId()); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 31c1688d08..41b350ab4c 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -999,7 +999,8 @@ enum TrinityStrings LANG_GROUP_NOT_IN_RAID_GROUP = 1185, LANG_GROUP_ROLE_CHANGED = 1186, LANG_LEADER_CANNOT_BE_ASSISTANT = 1187, - // Room for more level 3 1188-1198 not used + LANG_BAN_EXISTS = 1188, + // Room for more level 3 1189-1198 not used // Debug commands LANG_GUILD_INFO_LEVEL = 1999, // LANG_DO_NOT_USE_6X_DEBUG_AREATRIGGER_LEFT -- unused on 3.3.5a diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 4e3d9988f3..7637969526 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -254,11 +254,10 @@ enum SpellSchools SPELL_SCHOOL_NATURE = 3, SPELL_SCHOOL_FROST = 4, SPELL_SCHOOL_SHADOW = 5, - SPELL_SCHOOL_ARCANE = 6 + SPELL_SCHOOL_ARCANE = 6, + MAX_SPELL_SCHOOL = 7 }; -#define MAX_SPELL_SCHOOL 7 - enum SpellSchoolMask { SPELL_SCHOOL_MASK_NONE = 0x00, // not exist @@ -1510,7 +1509,7 @@ enum Mechanics MECHANIC_SAPPED = 30, MECHANIC_ENRAGED = 31, MECHANIC_WOUNDED = 32, - MAX_MECHANIC = 33 + MAX_MECHANIC = 33 }; // Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967ca6) @@ -3846,7 +3845,8 @@ enum BanReturn { BAN_SUCCESS, BAN_SYNTAX_ERROR, - BAN_NOTFOUND + BAN_NOTFOUND, + BAN_EXISTS }; enum BattlegroundTeamId diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 0040f01687..96eb4555a9 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1560,78 +1560,6 @@ bool ScriptMgr::OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo co return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item); } -bool ScriptMgr::OnGossipHello(Player* player, Creature* creature) -{ - ASSERT(player); - ASSERT(creature); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnGossipHello(player, creature); -} - -bool ScriptMgr::OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) -{ - ASSERT(player); - ASSERT(creature); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelect(player, creature, sender, action); -} - -bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(code); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelectCode(player, creature, sender, action, code); -} - -bool ScriptMgr::OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(quest); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestAccept(player, creature, quest); -} - -bool ScriptMgr::OnQuestSelect(Player* player, Creature* creature, Quest const* quest) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(quest); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestSelect(player, creature, quest); -} - -bool ScriptMgr::OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt) -{ - ASSERT(player); - ASSERT(creature); - ASSERT(quest); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestReward(player, creature, quest, opt); -} - -uint32 ScriptMgr::GetDialogStatus(Player* player, Creature* creature) -{ - ASSERT(player); - ASSERT(creature); - - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->GetDialogStatus(player, creature); -} - bool ScriptMgr::CanSpawn(ObjectGuid::LowType spawnId, uint32 entry, CreatureTemplate const* actTemplate, CreatureData const* cData, Map const* map) { ASSERT(actTemplate); @@ -1662,115 +1590,6 @@ GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject) return tmpscript->GetAI(gameobject); } -void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff) -{ - ASSERT(creature); - - GET_SCRIPT(CreatureScript, creature->GetScriptId(), tmpscript); - tmpscript->OnUpdate(creature, diff); -} - -bool ScriptMgr::OnGossipHello(Player* player, GameObject* go) -{ - ASSERT(player); - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnGossipHello(player, go); -} - -bool ScriptMgr::OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) -{ - ASSERT(player); - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelect(player, go, sender, action); -} - -bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code) -{ - ASSERT(player); - ASSERT(go); - ASSERT(code); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - return tmpscript->OnGossipSelectCode(player, go, sender, action, code); -} - -bool ScriptMgr::OnQuestAccept(Player* player, GameObject* go, Quest const* quest) -{ - ASSERT(player); - ASSERT(go); - ASSERT(quest); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestAccept(player, go, quest); -} - -bool ScriptMgr::OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt) -{ - ASSERT(player); - ASSERT(go); - ASSERT(quest); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->OnQuestReward(player, go, quest, opt); -} - -uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go) -{ - ASSERT(player); - ASSERT(go); - - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS); - player->PlayerTalkClass->ClearMenus(); - return tmpscript->GetDialogStatus(player, go); -} - -void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnDestroyed(go, player); -} - -void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnDamaged(go, player); -} - -void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnLootStateChanged(go, state, unit); -} - -void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnGameObjectStateChanged(go, state); -} - -void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff) -{ - ASSERT(go); - - GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript); - tmpscript->OnUpdate(go, diff); -} - bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger) { ASSERT(player); @@ -2381,6 +2200,22 @@ AreaTriggerScript::AreaTriggerScript(const char* name) ScriptRegistry::Instance()->AddScript(this); } +bool OnlyOnceAreaTriggerScript::OnTrigger(Player* player, AreaTriggerEntry const* trigger) +{ + uint32 const triggerId = trigger->id; + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (instance->IsAreaTriggerDone(triggerId)) + return true; + else + instance->MarkAreaTriggerDone(triggerId); + } + return _OnTrigger(player, trigger); +} +void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(InstanceScript* script, uint32 triggerId) { script->ResetAreaTriggerDone(triggerId); } +void OnlyOnceAreaTriggerScript::ResetAreaTriggerDone(Player const* player, AreaTriggerEntry const* trigger) { if (InstanceScript* instance = player->GetInstanceScript()) ResetAreaTriggerDone(instance, trigger->id); } + + BattlegroundScript::BattlegroundScript(const char* name) : ScriptObject(name) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 019cfdc322..226a2adacc 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -403,7 +403,7 @@ class TC_GAME_API UnitScript : public ScriptObject virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/) { } }; -class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript +class TC_GAME_API CreatureScript : public UnitScript { protected: @@ -411,32 +411,11 @@ class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript @@ -447,38 +426,8 @@ class TC_GAME_API GameObjectScript : public ScriptObject, public UpdatableScript public: - // Called when a player opens a gossip dialog with the gameobject. - virtual bool OnGossipHello(Player* /*player*/, GameObject* /*go*/) { return false; } - - // Called when a player selects a gossip item in the gameobject's gossip menu. - virtual bool OnGossipSelect(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) { return false; } - - // Called when a player selects a gossip with a code in the gameobject's gossip menu. - virtual bool OnGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; } - - // Called when a player accepts a quest from the gameobject. - virtual bool OnQuestAccept(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/) { return false; } - - // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 - virtual bool OnQuestReward(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } - - // Called when the dialog status between a player and the gameobject is requested. - virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } - - // Called when the game object is destroyed (destructible buildings only). - virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/) { } - - // Called when the game object is damaged (destructible buildings only). - virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { } - - // Called when the game object loot state is changed. - virtual void OnLootStateChanged(GameObject* /*go*/, uint32 /*state*/, Unit* /*unit*/) { } - - // Called when the game object state is changed. - virtual void OnGameObjectStateChanged(GameObject* /*go*/, uint32 /*state*/) { } - // Called when a GameObjectAI object is needed for the gameobject. - virtual GameObjectAI* GetAI(GameObject* /*go*/) const { return NULL; } + virtual GameObjectAI* GetAI(GameObject* /*go*/) const = 0; }; class TC_GAME_API AreaTriggerScript : public ScriptObject @@ -493,6 +442,19 @@ class TC_GAME_API AreaTriggerScript : public ScriptObject virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) { return false; } }; +class TC_GAME_API OnlyOnceAreaTriggerScript : public AreaTriggerScript +{ + using AreaTriggerScript::AreaTriggerScript; + + public: + bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) final override; + + protected: + virtual bool _OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/) = 0; + void ResetAreaTriggerDone(InstanceScript* /*instance*/, uint32 /*triggerId*/); + void ResetAreaTriggerDone(Player const* /*player*/, AreaTriggerEntry const* /*trigger*/); +}; + class TC_GAME_API BattlegroundScript : public ScriptObject { protected: @@ -952,30 +914,11 @@ class TC_GAME_API ScriptMgr public: /* CreatureScript */ - bool OnGossipHello(Player* player, Creature* creature); - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action); - bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code); - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest); - bool OnQuestSelect(Player* player, Creature* creature, Quest const* quest); - bool OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt); - uint32 GetDialogStatus(Player* player, Creature* creature); bool CanSpawn(ObjectGuid::LowType spawnId, uint32 entry, CreatureTemplate const* actTemplate, CreatureData const* cData, Map const* map); CreatureAI* GetCreatureAI(Creature* creature); - void OnCreatureUpdate(Creature* creature, uint32 diff); public: /* GameObjectScript */ - bool OnGossipHello(Player* player, GameObject* go); - bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action); - bool OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code); - bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest); - bool OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt); - uint32 GetDialogStatus(Player* player, GameObject* go); - void OnGameObjectDestroyed(GameObject* go, Player* player); - void OnGameObjectDamaged(GameObject* go, Player* player); - void OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit); - void OnGameObjectStateChanged(GameObject* go, uint32 state); - void OnGameObjectUpdate(GameObject* go, uint32 diff); GameObjectAI* GetGameObjectAI(GameObject* go); public: /* AreaTriggerScript */ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ac4539746d..f80c7df75b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -66,7 +66,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddIgnoreOpcode ); DEFINE_OPCODE_HANDLER(CMSG_ADD_VOICE_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAlterAppearance ); - DEFINE_OPCODE_HANDLER(CMSG_AREATRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaTriggerOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AREATRIGGER, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAreaTriggerOpcode ); DEFINE_OPCODE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_OPCODE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueueOpcode); DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamAcceptOpcode ); @@ -89,14 +89,14 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_AUCTION_REMOVE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionRemoveItem ); DEFINE_OPCODE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionSellItem ); DEFINE_OPCODE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess ); - DEFINE_OPCODE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutostoreLootItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoBankItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoEquipItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoEquipItemSlotOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoStoreBagItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoStoreBankItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutostoreLootItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_AUTO_DECLINE_GUILD_INVITES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoDeclineGuildInvites ); - DEFINE_OPCODE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBankerActivateOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBankerActivateOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfEntryInviteResponse ); @@ -111,12 +111,12 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena ); DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_JOIN_RATED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBinderActivateOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBinderActivateOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BUG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBugOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_BUYBACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuybackItem ); - DEFINE_OPCODE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankSlotOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_BUYBACK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuybackItem ); + DEFINE_OPCODE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyBankSlotOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_ADD_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent ); DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_ARENA_TEAM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarArenaTeam ); DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_COMPLAIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarComplain ); @@ -133,18 +133,18 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_GUILD_FILTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGuildFilter ); DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_REMOVE_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRemoveEvent ); DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_UPDATE_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent ); - DEFINE_OPCODE_HANDLER(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode); + DEFINE_OPCODE_HANDLER(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCancelAuraOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCancelAutoRepeatSpellOpcode); DEFINE_OPCODE_HANDLER(CMSG_CANCEL_CAST, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCancelCastOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_CANCEL_CHANNELLING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling ); + DEFINE_OPCODE_HANDLER(CMSG_CANCEL_CHANNELLING, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCancelChanneling ); DEFINE_OPCODE_HANDLER(CMSG_CANCEL_GROWTH_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelGrowthAuraOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelMountAuraOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCancelMountAuraOpcode ); DEFINE_OPCODE_HANDLER(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTempEnchantmentOpcode); + DEFINE_OPCODE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCancelTempEnchantmentOpcode); DEFINE_OPCODE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTradeOpcode); DEFINE_OPCODE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode ); DEFINE_OPCODE_HANDLER(CMSG_CHANGEPLAYER_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleChangePlayerDifficulty ); - DEFINE_OPCODE_HANDLER(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); + DEFINE_OPCODE_HANDLER(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeSeatsOnControlledVehicle); DEFINE_OPCODE_HANDLER(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelAnnouncements ); DEFINE_OPCODE_HANDLER(CMSG_CHANNEL_BAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelBan ); DEFINE_OPCODE_HANDLER(CMSG_CHANNEL_DISPLAY_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelDisplayListQuery ); @@ -200,23 +200,23 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode ); DEFINE_OPCODE_HANDLER(CMSG_DEL_VOICE_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDestroyItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_DISMISS_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissControlledVehicle ); + DEFINE_OPCODE_HANDLER(CMSG_DISMISS_CONTROLLED_VEHICLE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleDismissControlledVehicle ); DEFINE_OPCODE_HANDLER(CMSG_DISMISS_CRITTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter ); DEFINE_OPCODE_HANDLER(CMSG_DUEL_ACCEPTED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelAcceptedOpcode ); DEFINE_OPCODE_HANDLER(CMSG_DUEL_CANCELLED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelCancelledOpcode ); DEFINE_OPCODE_HANDLER(CMSG_EJECT_PASSENGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEjectPassenger ); - DEFINE_OPCODE_HANDLER(CMSG_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEmoteOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_EMOTE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleEmoteOpcode ); DEFINE_OPCODE_HANDLER(CMSG_ENABLETAXI, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); DEFINE_OPCODE_HANDLER(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER(CMSG_EQUIPMENT_SET_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete ); DEFINE_OPCODE_HANDLER(CMSG_EQUIPMENT_SET_SAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave ); - DEFINE_OPCODE_HANDLER(CMSG_EQUIPMENT_SET_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse ); + DEFINE_OPCODE_HANDLER(CMSG_EQUIPMENT_SET_USE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleEquipmentSetUse ); DEFINE_OPCODE_HANDLER(CMSG_FAR_SIGHT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode ); DEFINE_OPCODE_HANDLER(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); DEFINE_OPCODE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJECT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGameObjectQueryOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameobjectReportUse ); - DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameObjectUseOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGameobjectReportUse ); + DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_USE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGameObjectUseOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GET_MAIL_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetMailList ); DEFINE_OPCODE_HANDLER(CMSG_GET_MIRRORIMAGE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest ); DEFINE_OPCODE_HANDLER(CMSG_GMRESPONSE_RESOLVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGMResponseResolve ); @@ -227,7 +227,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_GMTICKET_SYSTEMSTATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketSystemStatusOpcode); DEFINE_OPCODE_HANDLER(CMSG_GMTICKET_UPDATETEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketUpdateOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GM_REPORT_LAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportLag ); - DEFINE_OPCODE_HANDLER(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipHelloOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGossipHelloOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipSelectOptionOpcode ); DEFINE_OPCODE_HANDLER(CMSG_GRANT_LEVEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGrantLevel ); DEFINE_OPCODE_HANDLER(CMSG_GROUP_ASSISTANT_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupAssistantLeaderOpcode); @@ -287,17 +287,17 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect ); DEFINE_OPCODE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode ); DEFINE_OPCODE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleInspectOpcode ); DEFINE_OPCODE_HANDLER(CMSG_INSPECT_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectHonorStatsOpcode ); DEFINE_OPCODE_HANDLER(CMSG_INSTANCE_LOCK_WARNING_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse ); - DEFINE_OPCODE_HANDLER(CMSG_ITEM_REFUND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); - DEFINE_OPCODE_HANDLER(CMSG_ITEM_REFUND_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefundInfoRequest ); - DEFINE_OPCODE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery ); + DEFINE_OPCODE_HANDLER(CMSG_ITEM_REFUND, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefund ); + DEFINE_OPCODE_HANDLER(CMSG_ITEM_REFUND_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefundInfoRequest ); + DEFINE_OPCODE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemTextQuery ); DEFINE_OPCODE_HANDLER(CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannel ); DEFINE_OPCODE_HANDLER(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess ); - DEFINE_OPCODE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalents ); - DEFINE_OPCODE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalentsPet ); - DEFINE_OPCODE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnPreviewTalents ); + DEFINE_OPCODE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnPreviewTalentsPet ); + DEFINE_OPCODE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnTalentOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel ); DEFINE_OPCODE_HANDLER(CMSG_LFG_GET_STATUS, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus ); DEFINE_OPCODE_HANDLER(CMSG_LFG_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode ); @@ -318,7 +318,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_POST_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderPostRequest ); DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderRemoveRecruit ); DEFINE_OPCODE_HANDLER(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost ); - DEFINE_OPCODE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleListInventoryOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleListInventoryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LOAD_SCREEN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleLoadScreenOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutRequestOpcode ); @@ -381,16 +381,16 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode ); DEFINE_OPCODE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode ); DEFINE_OPCODE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); - DEFINE_OPCODE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNameQueryOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleNameQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera ); - DEFINE_OPCODE_HANDLER(CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNpcTextQueryOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleNpcTextQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleObjectUpdateFailedOpcode ); DEFINE_OPCODE_HANDLER(CMSG_OBJECT_UPDATE_RESCUED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_OFFER_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleOfferPetitionOpcode ); DEFINE_OPCODE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); - DEFINE_OPCODE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleOpenItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleOpenItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleOptOutOfLootOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_PAGE_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePageTextQueryOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_PAGE_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePageTextQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_PARTY_SILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_PARTY_UNSILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionBuyOpcode ); @@ -400,16 +400,16 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_PETITION_SIGN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionSignOpcode ); DEFINE_OPCODE_HANDLER(CMSG_PET_ABANDON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAbandon ); DEFINE_OPCODE_HANDLER(CMSG_PET_ACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAction ); - DEFINE_OPCODE_HANDLER(CMSG_PET_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCancelAuraOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCastSpellOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_PET_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetLearnTalent ); - DEFINE_OPCODE_HANDLER(CMSG_PET_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery ); + DEFINE_OPCODE_HANDLER(CMSG_PET_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePetCancelAuraOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePetCastSpellOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_PET_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePetLearnTalent ); + DEFINE_OPCODE_HANDLER(CMSG_PET_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePetNameQuery ); DEFINE_OPCODE_HANDLER(CMSG_PET_RENAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetRename ); DEFINE_OPCODE_HANDLER(CMSG_PET_SET_ACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSetAction ); - DEFINE_OPCODE_HANDLER(CMSG_PET_SPELL_AUTOCAST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSpellAutocastOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_PET_STOP_ATTACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetStopAttack ); + DEFINE_OPCODE_HANDLER(CMSG_PET_SPELL_AUTOCAST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePetSpellAutocastOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_PET_STOP_ATTACK, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePetStopAttack ); DEFINE_OPCODE_HANDLER(CMSG_PING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess ); - DEFINE_OPCODE_HANDLER(CMSG_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayedTime ); + DEFINE_OPCODE_HANDLER(CMSG_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePlayedTime ); DEFINE_OPCODE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayerLoginOpcode ); DEFINE_OPCODE_HANDLER(CMSG_PLAYER_VEHICLE_ENTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEnterPlayerVehicle ); DEFINE_OPCODE_HANDLER(CMSG_PLAY_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -421,31 +421,31 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_QUERY_GUILD_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_QUERY_GUILD_REWARDS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGuildRewardsQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_QUERY_GUILD_XP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryXPOpcode ); // STATUS_AUTHED - DEFINE_OPCODE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryInspectAchievements ); - DEFINE_OPCODE_HANDLER(CMSG_QUERY_QUESTS_COMPLETED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryQuestsCompleted ); - DEFINE_OPCODE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryTimeOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); - DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverChooseRewardOpcode); - DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverCompleteQuest ); - DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverHelloOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverQueryQuestOpcode); - DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverRequestRewardOpcode); + DEFINE_OPCODE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryInspectAchievements ); + DEFINE_OPCODE_HANDLER(CMSG_QUERY_QUESTS_COMPLETED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryQuestsCompleted ); + DEFINE_OPCODE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTimeOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); + DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverChooseRewardOpcode); + DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverCompleteQuest ); + DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_HELLO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverHelloOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverQueryQuestOpcode); + DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverRequestRewardOpcode); DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverStatusMultipleQuery); DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverStatusQueryOpcode); - DEFINE_OPCODE_HANDLER(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestLogRemoveQuest ); + DEFINE_OPCODE_HANDLER(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestLogRemoveQuest ); DEFINE_OPCODE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept ); DEFINE_OPCODE_HANDLER(CMSG_QUEST_NPC_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery ); - DEFINE_OPCODE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPOIQuery ); - DEFINE_OPCODE_HANDLER(CMSG_QUEST_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestQueryOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestPOIQuery ); + DEFINE_OPCODE_HANDLER(CMSG_QUEST_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode ); DEFINE_OPCODE_HANDLER(CMSG_READY_FOR_ACCOUNT_DATA_TIMES, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadyForAccountDataTimes ); - DEFINE_OPCODE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReadItem ); + DEFINE_OPCODE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleReadItem ); DEFINE_OPCODE_HANDLER(CMSG_REALM_SPLIT, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRealmSplitOpcode ); DEFINE_OPCODE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpseOpcode ); DEFINE_OPCODE_HANDLER(CMSG_REDIRECTION_AUTH_PROOF, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_REFORGE_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleReforgeItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_REORDER_CHARACTERS, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleReorderCharacters ); - DEFINE_OPCODE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepairItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRepairItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequestOpcode ); DEFINE_OPCODE_HANDLER(CMSG_REPORT_PVP_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData ); @@ -461,10 +461,10 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RATED_BG_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestRatedBgInfo ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RATED_BG_STATS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestRatedBgStats ); DEFINE_OPCODE_HANDLER(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestResearchHistory ); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleExit ); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); - DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestVehicleExit ); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeSeatsOnControlledVehicle); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeSeatsOnControlledVehicle); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeSeatsOnControlledVehicle); DEFINE_OPCODE_HANDLER(CMSG_RESET_FACTION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_RESET_INSTANCES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResetInstancesOpcode ); DEFINE_OPCODE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResurrectResponseOpcode ); @@ -472,7 +472,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_ROLE_POLL_BEGIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRolePollBeginOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSaveCUFProfiles ); DEFINE_OPCODE_HANDLER(CMSG_SELF_RES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSelfResOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSellItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSellItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSendMail ); DEFINE_OPCODE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -498,18 +498,18 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend ); DEFINE_OPCODE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SET_TITLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTitleOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SET_TITLE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetTitleOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_SET_TRADE_GOLD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeGoldOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SET_VEHICLE_REC_ID_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetWatchedFactionOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingCloakOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SHOWING_HELM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingHelmOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SPELLCLICK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSpellClick ); + DEFINE_OPCODE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleShowingCloakOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SHOWING_HELM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleShowingHelmOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSocketOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SPELLCLICK, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSpellClick ); DEFINE_OPCODE_HANDLER(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSpiritHealerActivateOpcode); - DEFINE_OPCODE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSplitItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_STANDSTATECHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleStandStateChangeOpcode ); DEFINE_OPCODE_HANDLER(CMSG_STOP_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_SUBMIT_BUG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -517,34 +517,34 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_SUGGESTION_SUBMIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_SUMMON_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSummonResponseOpcode ); DEFINE_OPCODE_HANDLER(CMSG_SUSPEND_TOKEN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapInvItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapItem ); + DEFINE_OPCODE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSwapInvItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSwapItem ); DEFINE_OPCODE_HANDLER(CMSG_SYNC_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_TAXINODE_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode ); DEFINE_OPCODE_HANDLER(CMSG_TAXIQUERYAVAILABLENODES, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); DEFINE_OPCODE_HANDLER(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTextEmoteOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTextEmoteOpcode ); DEFINE_OPCODE_HANDLER(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_TIME_SYNC_RESP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTimeSyncResp ); DEFINE_OPCODE_HANDLER(CMSG_TIME_SYNC_RESP_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP ); - DEFINE_OPCODE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed ); - DEFINE_OPCODE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerBuySpellOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerListOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTotemDestroyed ); + DEFINE_OPCODE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTrainerBuySpellOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTrainerListOpcode ); DEFINE_OPCODE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); DEFINE_OPCODE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetitionOpcode ); DEFINE_OPCODE_HANDLER(CMSG_TUTORIAL_CLEAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialClear ); DEFINE_OPCODE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag ); DEFINE_OPCODE_HANDLER(CMSG_TUTORIAL_RESET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialReset ); DEFINE_OPCODE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUnlearnSkillOpcode ); DEFINE_OPCODE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode); DEFINE_OPCODE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData ); DEFINE_OPCODE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); DEFINE_OPCODE_HANDLER(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition ); DEFINE_OPCODE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUseItemOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUseItemOpcode ); DEFINE_OPCODE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleViolenceLevel ); DEFINE_OPCODE_HANDLER(CMSG_VOICE_SESSION_ENABLE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleVoiceSessionEnableOpcode ); DEFINE_OPCODE_HANDLER(CMSG_VOID_STORAGE_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageQuery ); @@ -559,13 +559,13 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleWorldStateUITimerUpdate ); DEFINE_OPCODE_HANDLER(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode ); DEFINE_OPCODE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_ZONEUPDATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleZoneUpdateOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_ZONEUPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleZoneUpdateOpcode ); DEFINE_OPCODE_HANDLER(MSG_AUCTION_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionHelloOpcode ); DEFINE_OPCODE_HANDLER(MSG_CHANNEL_START, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(MSG_CHANNEL_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(MSG_CORPSE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseQueryOpcode ); - DEFINE_OPCODE_HANDLER(MSG_INSPECT_ARENA_TEAMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectArenaTeamsOpcode ); - DEFINE_OPCODE_HANDLER(MSG_LIST_STABLED_PETS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode ); + DEFINE_OPCODE_HANDLER(MSG_INSPECT_ARENA_TEAMS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleInspectArenaTeamsOpcode ); + DEFINE_OPCODE_HANDLER(MSG_LIST_STABLED_PETS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode ); DEFINE_OPCODE_HANDLER(MSG_MINIMAP_PING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode ); DEFINE_OPCODE_HANDLER(MSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(MSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); @@ -612,8 +612,8 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(MSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblemOpcode ); DEFINE_OPCODE_HANDLER(MSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetDungeonDifficultyOpcode); DEFINE_OPCODE_HANDLER(MSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetRaidDifficultyOpcode ); - DEFINE_OPCODE_HANDLER(MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode); - DEFINE_OPCODE_HANDLER(MSG_TALENT_WIPE_CONFIRM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTalentWipeConfirmOpcode ); + DEFINE_OPCODE_HANDLER(MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTabardVendorActivateOpcode); + DEFINE_OPCODE_HANDLER(MSG_TALENT_WIPE_CONFIRM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTalentWipeConfirmOpcode ); DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1119,7 +1119,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RAID_INSTANCE_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_THROTTLED_ERROR, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RAID_SUMMON_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_RANDOMIZE_CHAR_NAME, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_ServerSide ); @@ -1330,7 +1330,7 @@ void OpcodeTable::Initialize() //DEFINE_OPCODE_HANDLER(CMSG_BOOTME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_BOT_DETECTED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_BOT_DETECTED2, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(CMSG_BUY_ITEM_IN_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyItemInSlotOpcode ); + //DEFINE_OPCODE_HANDLER(CMSG_BUY_ITEM_IN_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyItemInSlotOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_BUY_LOTTERY_TICKET_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_BUY_STABLE_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyStableSlot ); //DEFINE_OPCODE_HANDLER(CMSG_CALENDAR_CONTEXT_EVENT_SIGNUP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1467,13 +1467,13 @@ void OpcodeTable::Initialize() //DEFINE_OPCODE_HANDLER(CMSG_QUERY_OBJECT_ROTATION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_QUERY_SERVER_BUCK_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_QUERY_VEHICLE_STATUS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverCancel ); - //DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_QUEST_AUTOLAUNCH, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverQuestAutoLaunch ); - //DEFINE_OPCODE_HANDLER(CMSG_QUESTLOG_SWAP_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestLogSwapQuest ); + //DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_CANCEL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverCancel ); + //DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_QUEST_AUTOLAUNCH, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverQuestAutoLaunch ); + //DEFINE_OPCODE_HANDLER(CMSG_QUESTLOG_SWAP_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestLogSwapQuest ); //DEFINE_OPCODE_HANDLER(CMSG_RECHARGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_REDIRECTION_FAILED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_REFER_A_FRIEND, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //DEFINE_OPCODE_HANDLER(CMSG_REMOVE_GLYPH, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRemoveGlyph ); + //DEFINE_OPCODE_HANDLER(CMSG_REMOVE_GLYPH, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRemoveGlyph ); //DEFINE_OPCODE_HANDLER(CMSG_REPLACE_ACCOUNT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_RUN_SCRIPT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //DEFINE_OPCODE_HANDLER(CMSG_SAVE_DANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index af87b2b585..70aebf71d8 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -623,7 +623,7 @@ class TC_GAME_API WorldSession void HandleGroupInviteOpcode(WorldPacket& recvPacket); //void HandleGroupCancelOpcode(WorldPacket& recvPacket); void HandleGroupInviteResponseOpcode(WorldPacket& recvPacket); - void HandleGroupClearMarker(WorldPacket& recvPacket); + void HandleGroupClearMarker(WorldPacket& recvPacket); void HandleGroupUninviteOpcode(WorldPacket& recvPacket); void HandleGroupUninviteGuidOpcode(WorldPacket& recvPacket); void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index c34b321651..411b0aaf0f 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -395,7 +395,7 @@ enum AuraType SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED = 333, // Spells cast with this override have no cast time or power cost SPELL_AURA_MOD_BLIND = 334, // NYI SPELL_AURA_335 = 335, - SPELL_AURA_MOD_FLYING_RESTRICTIONS = 336, // NYI + SPELL_AURA_MOUNT_RESTRICTIONS = 336, SPELL_AURA_MOD_VENDOR_ITEMS_PRICES = 337, SPELL_AURA_MOD_DURABILITY_LOSS = 338, SPELL_AURA_INCREASE_SKILL_GAIN_CHANCE = 339, // NYI diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 6aae2023c6..a990705159 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -394,7 +394,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNoImmediateEffect, //333 SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED implemented in Unit::GetCastSpellInfo &AuraEffect::HandleNULL, //334 SPELL_AURA_MOD_BLIND &AuraEffect::HandleNULL, //335 SPELL_AURA_335 - &AuraEffect::HandleNULL, //336 SPELL_AURA_MOD_FLYING_RESTRICTIONS + &AuraEffect::HandleNULL, //336 SPELL_AURA_MOUNT_RESTRICTIONS implemented in Unit::GetMountCapability &AuraEffect::HandleNoImmediateEffect, //337 SPELL_AURA_MOD_VENDOR_ITEMS_PRICES &AuraEffect::HandleNoImmediateEffect, //338 SPELL_AURA_MOD_DURABILITY_LOSS &AuraEffect::HandleNULL, //339 SPELL_AURA_INCREASE_SKILL_GAIN_CHANCE diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 81ba81c437..34c90f2734 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1054,6 +1054,11 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar { if (focusObject) AddGOTarget(focusObject, effMask); + else + { + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); + } return; } break; @@ -1066,6 +1071,11 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar CallScriptDestinationTargetSelectHandlers(dest, effIndex, targetType); m_targets.SetDst(dest); } + else + { + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); + } return; } break; @@ -1078,6 +1088,8 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar if (!target) { TC_LOG_DEBUG("spells", "Spell::SelectImplicitNearbyTargets: cannot find nearby target for spell ID %u, effect %u", m_spellInfo->Id, effIndex); + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); return; } @@ -1085,6 +1097,8 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar if (!target) { TC_LOG_DEBUG("spells", "Spell::SelectImplicitNearbyTargets: OnObjectTargetSelect script hook for spell Id %u set NULL target, effect %u", m_spellInfo->Id, effIndex); + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); return; } @@ -1096,6 +1110,8 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar else { TC_LOG_DEBUG("spells", "Spell::SelectImplicitNearbyTargets: OnObjectTargetSelect script hook for spell Id %u set object of wrong type, expected unit, got %s, effect %u", m_spellInfo->Id, target->GetGUID().GetTypeName(), effMask); + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); return; } break; @@ -1105,6 +1121,8 @@ void Spell::SelectImplicitNearbyTargets(SpellEffIndex effIndex, SpellImplicitTar else { TC_LOG_DEBUG("spells", "Spell::SelectImplicitNearbyTargets: OnObjectTargetSelect script hook for spell Id %u set object of wrong type, expected gameobject, got %s, effect %u", m_spellInfo->Id, target->GetGUID().GetTypeName(), effMask); + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); + finish(false); return; } break; @@ -5512,13 +5530,13 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint if (res != SPELL_CAST_OK) return res; - // chance for fail at orange mining/herb/LockPicking gathering attempt + // chance for fail at LockPicking attempt // second check prevent fail at rechecks if (skillId != SKILL_NONE && (!m_selfContainer || ((*m_selfContainer) != this))) { - bool canFailAtMax = skillId != SKILL_HERBALISM && skillId != SKILL_MINING && skillId != SKILL_ARCHAEOLOGY; + bool canFailAtMax = skillId == SKILL_LOCKPICKING; - // chance for failure in orange gather / lockpick (gathering skill can't fail at maxskill) + // chance for failure in orange lockpick if ((canFailAtMax && skillValue < sWorld->GetConfigMaxSkillValue()) && reqSkillValue > irand(skillValue - 25, skillValue + 37)) return SPELL_FAILED_TRY_AGAIN; } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ba4577cf38..5b23bfbc9a 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1675,10 +1675,8 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype) return; } - if (sScriptMgr->OnGossipHello(player, gameObjTarget)) - return; - - if (gameObjTarget->AI()->GossipHello(player, false)) + player->PlayerTalkClass->ClearMenus(); + if (gameObjTarget->AI()->GossipHello(player)) return; switch (gameObjTarget->GetGoType()) @@ -4153,23 +4151,23 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) void Spell::EffectSummonDynObj(SpellEffIndex effIndex) { - if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) - return; + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; - Player* player = m_caster->ToPlayer(); - if (!player) - return; + Player* player = m_caster->ToPlayer(); + if (!player) + return; - float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); - DynamicObject* dynObj = new DynamicObject(false); + float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); + DynamicObject* dynObj = new DynamicObject(false); if (!dynObj->CreateDynamicObject(m_caster->GetMap()->GenerateLowGuid(), m_caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_RAID_MARKER)) - { - delete dynObj; - return; - } + { + delete dynObj; + return; + } - int32 duration = m_spellInfo->GetDuration(); - dynObj->SetDuration(duration); + int32 duration = m_spellInfo->GetDuration(); + dynObj->SetDuration(duration); } void Spell::EffectSummonRaidMarker(SpellEffIndex effIndex) @@ -5333,7 +5331,7 @@ void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/) FactionTemplateEntry const* casterFaction = caster->GetFactionTemplateEntry(); FactionTemplateEntry const* targetFaction = sFactionTemplateStore.LookupEntry(gameObjTarget->GetFaction()); // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons) - if (!targetFaction || (casterFaction && targetFaction && !casterFaction->IsFriendlyTo(*targetFaction))) + if (!targetFaction || (casterFaction && !casterFaction->IsFriendlyTo(*targetFaction))) gameObjTarget->ModifyHealth(-damage, caster, GetSpellInfo()->Id); } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 921de39e00..64731c06e3 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1649,11 +1649,10 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a // continent limitation (virtual continent) if (HasAttribute(SPELL_ATTR4_CAST_ONLY_IN_OUTLAND)) { - AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(area_id); - if (!areaEntry) - areaEntry = sAreaTableStore.LookupEntry(zone_id); + uint32 v_map = GetVirtualMapForMapAndZone(map_id, zone_id); + MapEntry const* mapEntry = sMapStore.LookupEntry(v_map); - if (!areaEntry || !areaEntry->IsFlyable() || !player->CanFlyInZone(map_id, zone_id)) + if (!mapEntry || mapEntry->addon < 1 || !mapEntry->IsContinent()) return SPELL_FAILED_INCORRECT_AREA; } @@ -1752,18 +1751,12 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a switch (Effects[i].ApplyAuraName) { - case SPELL_AURA_FLY: + case SPELL_AURA_MOD_SHAPESHIFT: { - if (player) - { - SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(Id); - for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter) - { - // spell 54197 (Cold Weather Flying) is a prereq for flying in Northrend - if (skillIter->second->skillId == SKILL_MOUNTS && player->GetMapId() != 571 && !player->HasSpell(54197)) - return SPELL_FAILED_INCORRECT_AREA; // maybe: SPELL_CUSTOM_ERROR_CANT_USE_THAT_MOUNT - } - } + if (SpellShapeshiftFormEntry const* spellShapeshiftForm = sSpellShapeshiftFormStore.LookupEntry(Effects[i].MiscValue)) + if (uint32 mountType = spellShapeshiftForm->MountTypeID) + if (!player->GetMountCapability(mountType)) + return SPELL_FAILED_NOT_HERE; break; } case SPELL_AURA_MOUNTED: diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 8d4af0a5f5..f6ff79fc4f 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2394,9 +2394,11 @@ void SpellMgr::LoadSpellAreas() uint32 oldMSTime = getMSTime(); mSpellAreaMap.clear(); // need for reload case + mSpellAreaForAreaMap.clear(); mSpellAreaForQuestMap.clear(); mSpellAreaForQuestEndMap.clear(); mSpellAreaForAuraMap.clear(); + mSpellAreaForQuestAreaMap.clear(); // 0 1 2 3 4 5 6 7 8 9 QueryResult result = WorldDatabase.Query("SELECT spell, area, quest_start, quest_start_status, quest_end_status, quest_end, aura_spell, racemask, gender, autocast FROM spell_area"); @@ -2622,13 +2624,13 @@ void SpellMgr::LoadSpellInfoStore() if (!mSpellInfoMap[spellIndex]) continue; - for (uint32 effectIndex = 0; effectIndex < MAX_SPELL_EFFECTS; ++effectIndex) + for (auto const& effect : mSpellInfoMap[spellIndex]->Effects) { - if (mSpellInfoMap[spellIndex]->Effects[effectIndex].Effect >= TOTAL_SPELL_EFFECTS) - { - TC_LOG_ERROR("sql.sql", "Spell (Entry: %u) has `Effect` '%u' greater than max allowed value '%u', removing", spellIndex, mSpellInfoMap[spellIndex]->Effects[effectIndex].Effect, (TOTAL_SPELL_EFFECTS - 1)); - mSpellInfoMap[spellIndex]->Effects[effectIndex].Effect = 0; - } + //ASSERT(effect.EffectIndex < MAX_SPELL_EFFECTS, "MAX_SPELL_EFFECTS must be at least %u", effect.EffectIndex + 1); + ASSERT(effect.Effect < TOTAL_SPELL_EFFECTS, "TOTAL_SPELL_EFFECTS must be at least %u", effect.Effect + 1); + ASSERT(effect.ApplyAuraName < TOTAL_AURAS, "TOTAL_AURAS must be at least %u", effect.ApplyAuraName + 1); + ASSERT(effect.TargetA.GetTarget() < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect.TargetA.GetTarget() + 1); + ASSERT(effect.TargetB.GetTarget() < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect.TargetB.GetTarget() + 1); } } @@ -2792,14 +2794,1454 @@ void SpellMgr::LoadSpellInfoCustomAttributes() TC_LOG_INFO("server.loading", ">> Loaded SpellInfo custom attributes in %u ms", GetMSTimeDiffToNow(oldMSTime)); } +inline void ApplySpellFix(std::initializer_list spellIds, void(*fix)(SpellInfo*)) +{ + for (uint32 spellId : spellIds) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!spellInfo) + { + TC_LOG_ERROR("server.loading", "Spell info correction specified for non-existing spell %u", spellId); + continue; + } + + fix(const_cast(spellInfo)); + } +} + void SpellMgr::LoadSpellInfoCorrections() { uint32 oldMSTime = getMSTime(); - SpellInfo* spellInfo = NULL; + ApplySpellFix({ + 63026, // Force Cast (HACK: Target shouldn't be changed) + 63137 // Force Cast (HACK: Target shouldn't be changed; summon position should be untied from spell destination) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); + }); + + // Drink! (Brewfest) + ApplySpellFix({ 42436 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + }); + + // Summon Skeletons + ApplySpellFix({ 52611, 52612 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].MiscValueB = 64; + }); + + ApplySpellFix({ + 40244, // Simon Game Visual + 40245, // Simon Game Visual + 40246, // Simon Game Visual + 40247, // Simon Game Visual + 42835 // Spout, remove damage effect, only anim is needed + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Effect = 0; + }); + + ApplySpellFix({ + 63665, // Charge (Argent Tournament emote on riders) + 31298, // Sleep (needs target selection script) + 51904, // Summon Ghouls On Scarlet Crusade (this should use conditions table, script for this spell needs to be fixed) + 2895, // Wrath of Air Totem rank 1 (Aura) + 68933, // Wrath of Air Totem rank 2 (Aura) + 29200 // Purify Helboar Meat + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); + }); + + ApplySpellFix({ + 56690, // Thrust Spear + 60586, // Mighty Spear Thrust + 60776, // Claw Swipe + 60881, // Fatal Strike + 60864 // Jaws of Death + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx4 |= SPELL_ATTR4_FIXED_DAMAGE; + }); + + // Howl of Azgalor + ApplySpellFix({ 31344 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yards instead of 50000?! + }); + + ApplySpellFix({ + 42818, // Headless Horseman - Wisp Flight Port + 42821 // Headless Horseman - Wisp Flight Missile + }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(6); // 100 yards + }); + + // They Must Burn Bomb Aura (self) + ApplySpellFix({ 36350 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TriggerSpell = 36325; // They Must Burn Bomb Drop (DND) + }); + + ApplySpellFix({ + 61407, // Energize Cores + 62136, // Energize Cores + 54069, // Energize Cores + 56251 // Energize Cores + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); + }); + + ApplySpellFix({ + 50785, // Energize Cores + 59372 // Energize Cores + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY); + }); + + ApplySpellFix({ + 63320, // Glyph of Life Tap + 53228, // Rapid Killing (Rank 1) + 53232 // Rapid Killing (Rank 2) + // Entries were not updated after spell effect change, we have to do that manually :/ + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED; + }); + + // Execute + ApplySpellFix({ 5308 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_CANT_TRIGGER_PROC; + }); + + // Improved Spell Reflection - aoe aura + ApplySpellFix({ 59725 }, [](SpellInfo* spellInfo) + { + // Target entry seems to be wrong for this spell :/ + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER_AREA_PARTY); + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); + }); + + // Death and Decay + ApplySpellFix({ 43265 }, [](SpellInfo* spellInfo) + { + // We need access to the targets of the dynaura to correctly apply the damage spell + // Currently EFFECT_1 has PERIODIC_DUMMY aura but TARGET_UNIT_CASTER set + // This will leave the spell in the same state as it was in 335 DBC + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_PERIODIC_DUMMY; + spellInfo->Effects[EFFECT_0].Amplitude = spellInfo->Effects[EFFECT_1].Amplitude; + spellInfo->Effects[EFFECT_1].Effect = 0; // might as well save a few cpu cycles + }); + + ApplySpellFix({ + 31347, // Doom + 36327, // Shoot Arcane Explosion Arrow + 39365, // Thundering Storm + 41071, // Raise Dead (HACK) + 42442, // Vengeance Landing Cannonfire + 42611, // Shoot + 44978, // Wild Magic + 45001, // Wild Magic + 45002, // Wild Magic + 45004, // Wild Magic + 45006, // Wild Magic + 45010, // Wild Magic + 45761, // Shoot Gun + 45863, // Cosmetic - Incinerate to Random Target + 48246, // Ball of Flame + 41635, // Prayer of Mending + 44869, // Spectral Blast + 45027, // Revitalize + 45976, // Muru Portal Channel + 52124, // Sky Darkener Assault + 52479, // Gift of the Harvester + 61588, // Blazing Harpoon + 55479, // Force Obedience + 28560, // Summon Blizzard (Sapphiron) + 53096, // Quetz'lun's Judgment + 70743, // AoD Special + 70614, // AoD Special - Vegard + 4020, // Safirdrang's Chill + 52438, // Summon Skittering Swarmer (Force Cast) + 52449, // Summon Skittering Infector (Force Cast) + 53609, // Summon Anub'ar Assassin (Force Cast) + 53457 // Summon Impale Trigger (AoE + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + + // Skartax Purple Beam + ApplySpellFix({ 36384 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 2; + }); + + ApplySpellFix({ + 28542, // Life Drain - Sapphiron + 29213, // Curse of the Plaguebringer - Noth + 29576, // Multi-Shot + 37790, // Spread Shot + 39992, // Needle Spine + 40816, // Saber Lash + 41303, // Soul Drain + 41376, // Spite + 45248, // Shadow Blades + 46771, // Flame Sear + 54171, // Divine Storm + 54172, // Divine Storm (heal) + 66588 // Flaming Spear + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 3; + }); + + ApplySpellFix({ + 38310, // Multi-Shot + 53385 // Divine Storm (Damage) + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 4; + }); + + ApplySpellFix({ + 42005, // Bloodboil + 38296, // Spitfire Totem + 37676, // Insidious Whisper + 46008, // Negative Energy + 45641, // Fire Bloom + 55665, // Life Drain - Sapphiron (H) + 28796 // Poison Bolt Volly - Faerlina + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 5; + }); + + // Curse of the Plaguebringer - Noth (H) + ApplySpellFix({ 54835 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 8; + }); + + ApplySpellFix({ + 40827, // Sinful Beam + 40859, // Sinister Beam + 40860, // Vile Beam + 40861, // Wicked Beam + 54098 // Poison Bolt Volly - Faerlina (H) + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 10; + }); + + // Unholy Frenzy + ApplySpellFix({ 50312 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 15; + }); + + // Murmur's Touch + ApplySpellFix({ 33711, 38794 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + spellInfo->Effects[EFFECT_0].TriggerSpell = 33760; + }); + + // Fingers of Frost + ApplySpellFix({ 44544 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(685904631, 1151048, 0); + }); + + // Magic Suppression - DK + ApplySpellFix({ 49224, 49610, 49611 }, [](SpellInfo* spellInfo) + { + spellInfo->ProcCharges = 0; + }); + + // Oscillation Field + ApplySpellFix({ 37408 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + }); + + // Everlasting Affliction + ApplySpellFix({ 47201, 47202, 47203 }, [](SpellInfo* spellInfo) + { + // add corruption to affected spells + spellInfo->Effects[EFFECT_1].SpellClassMask[0] |= 2; + }); + + // Renewed Hope + ApplySpellFix({ + 57470, // (Rank 1) + 57472 // (Rank 2) + }, [](SpellInfo* spellInfo) + { + // should also affect Flash Heal + spellInfo->Effects[EFFECT_0].SpellClassMask[0] |= 0x800; + }); + + // Cobra Strikes + ApplySpellFix({ 53257 }, [](SpellInfo* spellInfo) + { + spellInfo->ProcCharges = 2; + spellInfo->StackAmount = 0; + }); + + // Wrecking Crew + ApplySpellFix({ 46867, 56611, 56612 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x02000000, 0, 0); + }); + + // Death and Decay + ApplySpellFix({ 52212 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; + }); + + // Crafty's Ultra-Advanced Proto-Typical Shortening Blaster + ApplySpellFix({ 51912 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Amplitude = 3000; + }); + + // Master Shapeshifter: missing stance data for forms other than bear - bear version has correct data + // To prevent aura staying on target after talent unlearned + ApplySpellFix({ + 48420, // Master Shapeshifter + 24900 // Heart of the Wild - Cat Effect + }, [](SpellInfo* spellInfo) + { + spellInfo->Stances = UI64LIT(1) << (FORM_CAT - 1); + }); + + ApplySpellFix({ 48421 }, [](SpellInfo* spellInfo) + { + spellInfo->Stances = UI64LIT(1) << (FORM_MOONKIN - 1); + }); + + ApplySpellFix({ 24899 }, [](SpellInfo* spellInfo) + { + spellInfo->Stances = UI64LIT(1) << (FORM_BEAR - 1); + }); + + // Elemental Oath + ApplySpellFix({ + 51466, // (Rank 1) + 51470 // (Rank 2) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_APPLY_AURA; + spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + spellInfo->Effects[EFFECT_1].MiscValue = SPELLMOD_EFFECT2; + spellInfo->Effects[EFFECT_1].SpellClassMask = flag96(0x00000000, 0x00004000, 0x00000000); + }); + + // Improved Shadowform (Rank 1) + ApplySpellFix({ 47569 }, [](SpellInfo* spellInfo) + { + // with this spell atrribute aura can be stacked several times + spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFT; + }); + + // Hymn of Hope + ApplySpellFix({ 64904 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT; + }); + + // Nether Portal - Perseverence + ApplySpellFix({ 30421 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_2].BasePoints += 30000; + }); + + // Parasitic Shadowfiend Passive + ApplySpellFix({ 41913 }, [](SpellInfo* spellInfo) + { + // proc debuff, and summon infinite fiends + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_DUMMY; + }); + + ApplySpellFix({ + 27892, // To Anchor 1 + 27928, // To Anchor 1 + 27935, // To Anchor 1 + 27915, // Anchor to Skulls + 27931, // Anchor to Skulls + 27937, // Anchor to Skulls + 16177, // Ancestral Fortitude (Rank 1) + 16236, // Ancestral Fortitude (Rank 2) + 47930, // Grace + }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); + }); + + // Wrath of the Plaguebringer + ApplySpellFix({ 29214, 54836 }, [](SpellInfo* spellInfo) + { + // target allys instead of enemies, target A is src_caster, spells with effect like that have ally target + // this is the only known exception, probably just wrong data + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); + spellInfo->Effects[EFFECT_1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); + }); + + // Vampiric Embrace + ApplySpellFix({ 15290 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; + }); + + // Improved Devouring Plague + ApplySpellFix({ 63675 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + }); + + // Deep Wounds + ApplySpellFix({ 12721 }, [](SpellInfo* spellInfo) + { + // shouldnt ignore resillience or damage taken auras because its damage is not based off a spell. + spellInfo->AttributesEx4 &= ~SPELL_ATTR4_FIXED_DAMAGE; + }); + + // Tremor Totem (instant pulse) + ApplySpellFix({ 8145 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; + spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; + }); + + // Earthbind Totem (instant pulse) + ApplySpellFix({ 6474 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; + }); + + // Marked for Death + ApplySpellFix({ + 53241, // (Rank 1) + 53243, // (Rank 2) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x00067801, 0x10820001, 0x00000801); + }); + + ApplySpellFix({ + 5176, // Wrath + 2912, // Starfire + 78674 // Starsurge + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_DUMMY; + spellInfo->Effects[EFFECT_1].TargetA = TARGET_UNIT_CASTER; + }); + + ApplySpellFix({ + 70728, // Exploit Weakness (needs target selection script) + 70840 // Devious Minds (needs target selection script) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_PET); + }); + + // Culling The Herd (needs target selection script) + ApplySpellFix({ 70893 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_MASTER); + }); + + // Sigil of the Frozen Conscience + ApplySpellFix({ 54800 }, [](SpellInfo* spellInfo) + { + // change class mask to custom extended flags of Icy Touch + // this is done because another spell also uses the same SpellFamilyFlags as Icy Touch + // SpellFamilyFlags[0] & 0x00000040 in SPELLFAMILY_DEATHKNIGHT is currently unused (3.3.5a) + // this needs research on modifier applying rules, does not seem to be in Attributes fields + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x00000040, 0x00000000, 0x00000000); + }); + + // Idol of the Flourishing Life + ApplySpellFix({ 64949 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x00000000, 0x02000000, 0x00000000); + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + }); + + ApplySpellFix({ + 34231, // Libram of the Lightbringer + 60792, // Libram of Tolerance + 64956 // Libram of the Resolute + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x80000000, 0x00000000, 0x00000000); + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + }); + + ApplySpellFix({ + 28851, // Libram of Light + 28853, // Libram of Divinity + 32403 // Blessed Book of Nagrand + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x40000000, 0x00000000, 0x00000000); + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; + }); + + // Ride Carpet + ApplySpellFix({ 45602 }, [](SpellInfo* spellInfo) + { + // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)" + spellInfo->Effects[EFFECT_0].BasePoints = 0; + }); + + // Easter Lay Noblegarden Egg Aura + ApplySpellFix({ 61719 }, [](SpellInfo* spellInfo) + { + // Interrupt flags copied from aura which this aura is linked with + spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE; + }); + + ApplySpellFix({ + 71838, // Drain Life - Bryntroll Normal + 71839 // Drain Life - Bryntroll Heroic + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT; + }); + + ApplySpellFix({ + 56606, // Ride Jokkum + 61791 // Ride Vehicle (Yogg-Saron) + }, [](SpellInfo* spellInfo) + { + /// @todo: remove this when basepoints of all Ride Vehicle auras are calculated correctly + spellInfo->Effects[EFFECT_0].BasePoints = 1; + }); + + // Black Magic + ApplySpellFix({ 59630 }, [](SpellInfo* spellInfo) + { + spellInfo->Attributes |= SPELL_ATTR0_PASSIVE; + }); + + ApplySpellFix({ + 17364, // Stormstrike + 48278, // Paralyze + 53651 // Light's Beacon + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + }); + + ApplySpellFix({ + 51798, // Brewfest - Relay Race - Intro - Quest Complete + 47134 // Quest Complete + }, [](SpellInfo* spellInfo) + { + //! HACK: This spell break quest complete for alliance and on retail not used °_O + spellInfo->Effects[EFFECT_0].Effect = 0; + }); + + ApplySpellFix({ + 15487, // Priest - Silence + 47476, // Deathknight - Strangulate + 69179 // Arcane Torrent (Rage) + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx7 |= SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER; + }); + + ApplySpellFix({ + 42490, // Energized! + 42492, // Cast Energized + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT; + }); + + // Siege Cannon (Tol Barad) + ApplySpellFix({ 85123 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); + }); + + ApplySpellFix({ + 46842, // Flame Ring + 46836 // Flame Patch + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(); + }); + + // Test Ribbon Pole Channel + ApplySpellFix({ 29726 }, [](SpellInfo* spellInfo) + { + spellInfo->InterruptFlags &= ~AURA_INTERRUPT_FLAG_CAST; + }); + + ApplySpellFix({ + 42767, // Sic'em + 43092 // Stop the Ascension!: Halfdan's Soul Destruction + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_NEARBY_ENTRY); + }); + + // Safeguard + ApplySpellFix({ + 46946, // (Rank 1) + 46947 // (Rank 2) + }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(34); // Twenty-Five yards + }); + + // + // BLACK TEMPLE SPELLS + // + ApplySpellFix({ + 41485, // Deadly Poison + 41487 // Envenom + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; + }); + // ENDOF BLACK TEMPLE SPELLS + + // Summon Corpse Scarabs + ApplySpellFix({ 28864, 29105 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); + }); + + // + // VIOLET HOLD SPELLS + // + // Water Globule (Ichoron) + ApplySpellFix({ 54258, 54264, 54265, 54266, 54267 }, [](SpellInfo* spellInfo) + { + // in 3.3.5 there is only one radius in dbc which is 0 yards in this + // use max radius from 4.3.4 + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); + }); + // ENDOF VIOLET HOLD + + // + // ULDUAR SPELLS + // + // Pursued (Flame Leviathan) + ApplySpellFix({ 62374 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + // Focused Eyebeam Summon Trigger (Kologarn) + ApplySpellFix({ 63342 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + + ApplySpellFix({ + 65584, // Growth of Nature (Freya) + 64381 // Strength of the Pack (Auriaya) + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + }); + + ApplySpellFix({ + 63018, // Searing Light (XT-002) + 65121, // Searing Light (25m) (XT-002) + 63024, // Gravity Bomb (XT-002) + 64234 // Gravity Bomb (25m) (XT-002) + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + + // Boom (XT-002) + ApplySpellFix({ 62834 }, [](SpellInfo* spellInfo) + { + // This hack is here because we suspect our implementation of spell effect execution on targets + // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets, + // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc. + // The above situation causes the visual for this spell to be bugged, so we remove the instakill + // effect and implement a script hack for that. + spellInfo->Effects[EFFECT_1].Effect = 0; + }); + + ApplySpellFix({ + 64386, // Terrifying Screech (Auriaya) + 64389, // Sentinel Blast (Auriaya) + 64678 // Sentinel Blast (Auriaya) + }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(28); // 5 seconds, wrong DBC data? + }); + + // Potent Pheromones (Freya) + ApplySpellFix({ 64321 }, [](SpellInfo* spellInfo) + { + // spell should dispel area aura, but doesn't have the attribute + // may be db data bug, or blizz may keep reapplying area auras every update with checking immunity + // that will be clear if we get more spells with problem like this + spellInfo->AttributesEx |= SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY; + }); + + // Spinning Up (Mimiron) + ApplySpellFix({ 63414 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + spellInfo->ChannelInterruptFlags = 0; + }); + + // Rocket Strike (Mimiron) + ApplySpellFix({ 63036 }, [](SpellInfo* spellInfo) + { + spellInfo->Speed = 0; + }); + + // Magnetic Field (Mimiron) + ApplySpellFix({ 64668 }, [](SpellInfo* spellInfo) + { + spellInfo->Mechanic = MECHANIC_NONE; + }); + + // Empowering Shadows (Yogg-Saron) + ApplySpellFix({ 64468, 64486 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 3; // same for both modes? + }); + + // Cosmic Smash (Algalon the Observer) + ApplySpellFix({ 62301 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + + // Cosmic Smash (Algalon the Observer) + ApplySpellFix({ 64598 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 3; + }); + + // Cosmic Smash (Algalon the Observer) + ApplySpellFix({ 62293 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER); + }); + + // Cosmic Smash (Algalon the Observer) + ApplySpellFix({ 62311, 64596 }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(6); // 100yd + }); + + ApplySpellFix({ + 64014, // Expedition Base Camp Teleport + 64024, // Conservatory Teleport + 64025, // Halls of Invention Teleport + 64028, // Colossal Forge Teleport + 64029, // Shattered Walkway Teleport + 64030, // Antechamber Teleport + 64031, // Scrapyard Teleport + 64032, // Formation Grounds Teleport + 65042 // Prison of Yogg-Saron Teleport + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); + }); + // ENDOF ULDUAR SPELLS + + // + // TRIAL OF THE CRUSADER SPELLS + // + // Infernal Eruption + ApplySpellFix({ 66258, 67901 }, [](SpellInfo* spellInfo) + { + // increase duration from 15 to 18 seconds because caster is already + // unsummoned when spell missile hits the ground so nothing happen in result + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(85); + }); + // ENDOF TRIAL OF THE CRUSADER SPELLS + + // + // HALLS OF REFLECTION SPELLS + // + ApplySpellFix({ + 72435, // Defiling Horror + 72452 // Defiling Horror + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd + }); + + // Achievement Check + ApplySpellFix({ 72830 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + // Start Halls of Reflection Quest AE + ApplySpellFix({ 72900 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + }); + // ENDOF HALLS OF REFLECTION SPELLS + + // + // ICECROWN CITADEL SPELLS + // + ApplySpellFix({ + // THESE SPELLS ARE WORKING CORRECTLY EVEN WITHOUT THIS HACK + // THE ONLY REASON ITS HERE IS THAT CURRENT GRID SYSTEM + // DOES NOT ALLOW FAR OBJECT SELECTION (dist > 333) + 70781, // Light's Hammer Teleport + 70856, // Oratory of the Damned Teleport + 70857, // Rampart of Skulls Teleport + 70858, // Deathbringer's Rise Teleport + 70859, // Upper Spire Teleport + 70860, // Frozen Throne Teleport + 70861 // Sindragosa's Lair Teleport + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); + }); + + ApplySpellFix({ + 69075, // Bone Storm (Lord Marrowgar) + 70834, // Bone Storm (Lord Marrowgar) + 70835, // Bone Storm (Lord Marrowgar) + 70836, // Bone Storm (Lord Marrowgar) + 72864, // Death Plague (Rotting Frost Giant) + 71160, // Plague Stench (Stinky) + 71161, // Plague Stench (Stinky) + 71123 // Decimate (Stinky & Precious) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd + }); + + // Shadow's Fate + ApplySpellFix({ 71169 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + }); + + // Lock Players and Tap Chest + ApplySpellFix({ 72347 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 &= ~SPELL_ATTR3_NO_INITIAL_AGGRO; + }); + + // Award Reputation - Boss Kill + ApplySpellFix({ 73843, 73844, 73845, 73846 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + ApplySpellFix({ + 72378, // Blood Nova (Deathbringer Saurfang) + 73058, // Blood Nova (Deathbringer Saurfang) + 72769 // Scent of Blood (Deathbringer Saurfang) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + }); + + // Scent of Blood (Deathbringer Saurfang) + ApplySpellFix({ 72771 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); + }); + + // Resistant Skin (Deathbringer Saurfang adds) + ApplySpellFix({ 72723 }, [](SpellInfo* spellInfo) + { + // this spell initially granted Shadow damage immunity, however it was removed but the data was left in client + spellInfo->Effects[EFFECT_2].Effect = 0; + }); + + // Coldflame Jets (Traps after Saurfang) + ApplySpellFix({ 70460 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(1); // 10 seconds + }); + + ApplySpellFix({ + 71412, // Green Ooze Summon (Professor Putricide) + 71415 // Orange Ooze Summon (Professor Putricide) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + }); + + // Ooze flood + ApplySpellFix({ 69783, 69797, 69799, 69802 }, [](SpellInfo* spellInfo) + { + // Those spells are cast on creatures with same entry as caster while they have TARGET_UNIT_NEARBY_ENTRY. + spellInfo->AttributesEx |= SPELL_ATTR1_CANT_TARGET_SELF; + }); + + // Awaken Plagued Zombies + ApplySpellFix({ 71159 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(21); + }); + + // Volatile Ooze Beam Protection (Professor Putricide) + ApplySpellFix({ 70530 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA; // for an unknown reason this was SPELL_EFFECT_APPLY_AREA_AURA_RAID + }); + + // Mutated Strength (Professor Putricide) + ApplySpellFix({ 71604, 72673, 72674, 72675 }, [](SpellInfo* spellInfo) + { + // THIS IS HERE BECAUSE COOLDOWN ON CREATURE PROCS WERE NOT IMPLEMENTED WHEN THE SCRIPT WAS WRITTEN + spellInfo->Effects[EFFECT_1].Effect = 0; + }); + + // Mutated Plague (Professor Putricide) + ApplySpellFix({ 72454, 72464, 72506, 72507 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + // Unbound Plague (Professor Putricide) (needs target selection script) + ApplySpellFix({ 70911, 72854, 72855, 72856 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); + }); + + ApplySpellFix({ + 71518, // Unholy Infusion Quest Credit (Professor Putricide) + 72934, // Blood Infusion Quest Credit (Blood-Queen Lana'thel) + 72289 // Frost Infusion Quest Credit (Sindragosa) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // another missing radius + }); + + // Empowered Flare (Blood Prince Council) + ApplySpellFix({ 71708, 72785, 72786, 72787 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + }); + + // Swarming Shadows + ApplySpellFix({ 71266, 72890 }, [](SpellInfo* spellInfo) + { + spellInfo->AreaGroupId = 0; // originally, these require area 4522, which is... outside of Icecrown Citadel + }); + + // Corruption + ApplySpellFix({ 70602 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + }); + + // Column of Frost (visual marker) + ApplySpellFix({ 70715 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(32); // 6 seconds (missing) + }); + + // Mana Void (periodic aura) + ApplySpellFix({ 71085 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(9); // 30 seconds (missing) + }); + + // Frostbolt Volley (only heroic) + ApplySpellFix({ 72015, 72016 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS); + }); + + // Summon Suppressor (needs target selection script) + ApplySpellFix({ 70936 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(157); // 90yd + }); + + ApplySpellFix({ + 72706, // Achievement Check (Valithria Dreamwalker) + 71357 // Order Whelp + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + }); + + // Sindragosa's Fury + ApplySpellFix({ 70598 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST); + }); + + // Frost Bomb + ApplySpellFix({ 69846 }, [](SpellInfo* spellInfo) + { + spellInfo->Speed = 0.0f; // This spell's summon happens instantly + }); + + // Chilled to the Bone + ApplySpellFix({ 70106 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + spellInfo->AttributesEx6 |= SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS; + }); + + // Ice Lock + ApplySpellFix({ 71614 }, [](SpellInfo* spellInfo) + { + spellInfo->Mechanic = MECHANIC_STUN; + }); + + // Defile + ApplySpellFix({ 72762 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(559); // 53 seconds + }); + + // Defile + ApplySpellFix({ 72743 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(22); // 45 seconds + }); + + // Defile + ApplySpellFix({ 72754, 73708, 73709, 73710 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + }); + + // Val'kyr Target Search + ApplySpellFix({ 69030 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + spellInfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY; + }); + + // Raging Spirit Visual + ApplySpellFix({ 69198 }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd + }); + + // Harvest Souls + ApplySpellFix({ 73654, 74295, 74296, 74297 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + // Harvest Soul + ApplySpellFix({ 73655 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + }); + + // Summon Shadow Trap + ApplySpellFix({ 73540 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(23); // 90 seconds + }); + + // Shadow Trap (visual) + ApplySpellFix({ 73530 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(28); // 5 seconds + }); + + // Shadow Trap + ApplySpellFix({ 73529 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd + }); + + // Shadow Trap (searcher) + ApplySpellFix({ 74282 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS); // 5yd + }); + + // Restore Soul + ApplySpellFix({ 72595, 73650 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + }); + + // Destroy Soul + ApplySpellFix({ 74086 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + }); + + // Summon Spirit Bomb + ApplySpellFix({ 74302, 74342 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + spellInfo->MaxAffectedTargets = 1; + }); + + // Summon Spirit Bomb + ApplySpellFix({ 74341, 74343 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + spellInfo->MaxAffectedTargets = 3; + }); + + // Summon Spirit Bomb + ApplySpellFix({ 73579 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd + }); + + // Fury of Frostmourne + ApplySpellFix({ 72350 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + ApplySpellFix( + { + 75127, // Kill Frostmourne Players + 72351, // Fury of Frostmourne + 72431, // Jump (removes Fury of Frostmourne debuff) + 72429, // Mass Resurrection + 73159, // Play Movie + 73582 // Trigger Vile Spirit (Inside, Heroic) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + // Raise Dead + ApplySpellFix({ 72376 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 3; + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd + }); + + // Jump + ApplySpellFix({ 71809 }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(5); // 40yd + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd + spellInfo->Effects[EFFECT_0].MiscValue = 190; + }); + + // Broken Frostmourne + ApplySpellFix({ 72405 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd + spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT; + }); + // ENDOF ICECROWN CITADEL SPELLS + + // + // RUBY SANCTUM SPELLS + // + // Soul Consumption + ApplySpellFix({ 74799 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_12_YARDS); + }); + + // Twilight Cutter + ApplySpellFix({ 74769, 77844, 77845, 77846 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd + }); + + // Twilight Mending + ApplySpellFix({ 75509 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; + spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; + }); + + // Combustion and Consumption Heroic versions lacks radius data + ApplySpellFix({ 75875 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Mechanic = MECHANIC_NONE; + spellInfo->Effects[EFFECT_1].Mechanic = MECHANIC_SNARE; + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); + }); + + ApplySpellFix({ 75884 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); + }); + + ApplySpellFix({ 75883, 75876 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); + }); + // ENDOF RUBY SANCTUM SPELLS + + // + // EYE OF ETERNITY SPELLS + // + ApplySpellFix({ + // All spells below work even without these changes. The LOS attribute is due to problem + // from collision between maps & gos with active destroyed state. + 57473, // Arcane Storm bonus explicit visual spell + 57431, // Summon Static Field + 56091, // Flame Spike (Wyrmrest Skytalon) + 56092, // Engulf in Flames (Wyrmrest Skytalon) + 57090, // Revivify (Wyrmrest Skytalon) + 57143 // Life Burst (Wyrmrest Skytalon) + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; + }); + + // Arcane Barrage (cast by players and NONMELEEDAMAGELOG with caster Scion of Eternity (original caster)). + ApplySpellFix({ 63934 }, [](SpellInfo* spellInfo) + { + // This would never crit on retail and it has attribute for SPELL_ATTR3_NO_DONE_BONUS because is handled from player, + // until someone figures how to make scions not critting without hack and without making them main casters this should stay here. + spellInfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT; + }); + // ENDOF EYE OF ETERNITY SPELLS + + // Introspection + ApplySpellFix({ 40055, 40165, 40166, 40167 }, [](SpellInfo* spellInfo) + { + spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; + }); + + // Minor Fortitude + ApplySpellFix({ 2378 }, [](SpellInfo* spellInfo) + { + spellInfo->ManaCost = 0; + spellInfo->ManaPerSecond = 0; + }); + + // + // STONECORE SPELLS + // + ApplySpellFix({ + 95284, // Teleport (from entrance to Slabhide) + 95285 // Teleport (from Slabhide to entrance) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DB); + }); + // ENDOF STONECORE SPELLS + + // + // THE VORTEX PINNACLE SPELLS + // + // Howling Gale + ApplySpellFix({ 85085 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS); + }); + + // Howling Gale + ApplySpellFix({ 85159 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(84); // To-do: Enum this radius entry - EFFECT_RADIUS_17_YARDS. + }); + + // Upwind of Altairus + ApplySpellFix({ 88282 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); + }); + + // Twisting Winds + ApplySpellFix({ 88314 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); + }); + + // Grounding Field + ApplySpellFix({ + 87721, // Beam A + 87722, // Beam B + 87723 // Beam C + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + }); + // ENDOF THE VORTEX PINNACLE SPELLS + + // + // THE LOST CITY OF THE TOL'VIR SPELLS + // + // Summon Shockwave Target N + ApplySpellFix({ 83131 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); + }); + + // Hurl + ApplySpellFix({ 83235 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA; + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); + }); + // ENDOF THE LOST CITY OF THE TOL'VIR SPELLS + + // + // THE HALLS OF ORIGINATION SPELLS + // + ApplySpellFix({ + 76606, // Disable Beacon Beams L + 76608 // Disable Beacon Beams R + }, [](SpellInfo* spellInfo) + { + // Little hack, Increase the radius so it can hit the Cave In Stalkers in the platform. + spellInfo->Effects[EFFECT_0].MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_45_YARDS); + }); + + // Reverberating Hymn + ApplySpellFix({ 75323 }, [](SpellInfo* spellInfo) + { + // Aura is refreshed at 3 seconds, and the tick should happen at the fourth. + spellInfo->AttributesEx8 |= SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER; + }); + + // Solar Fire + ApplySpellFix({ 89133, 89878 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); + }); + + // Solar Winds + ApplySpellFix({ 74108, 89130 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); + }); + + // Heaven's Fury + ApplySpellFix({ 81942, 90040 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); + }); + + // Hallowed Ground + ApplySpellFix({ 88814, 90010 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_13_YARDS); + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_13_YARDS); + }); + + // Blaze of the Heavens + ApplySpellFix({ 91196 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); + }); + + // Repentance + ApplySpellFix({ 82430 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].MiscValue = 150; + }); + + // Blaze of the Heavens + ApplySpellFix({ 95249 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); + }); + // ENDOF HALLS OF ORIGINATION SPELLS + + // Threatening Gaze + ApplySpellFix({ 24314 }, [](SpellInfo* spellInfo) + { + spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP; + }); + + // Tree of Life (Passive) + ApplySpellFix({ 5420 }, [](SpellInfo* spellInfo) + { + spellInfo->Stances = UI64LIT(1) << (FORM_TREE - 1); + }); + + // Feral Charge (Cat Form + ApplySpellFix({ 49376 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC; + }); + + // + // BARADIN HOLD SPELLS + // + // Gaze of Occu'thar + ApplySpellFix({ 96942, 101009 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx &= ~SPELL_ATTR1_CHANNELED_1; + }); + // ENDOF BARADIN HOLD SPELLS + + // + // BLACKROCK CAVERNS SPELLS + // + // Evolution + ApplySpellFix({ 75610 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + + // Evolution + ApplySpellFix({ 75697 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); + }); + // ENDOF BLACKROCK CAVERNS SPELLS + + // + // ISLE OF CONQUEST SPELLS + // + // Teleport + ApplySpellFix({ 66551 }, [](SpellInfo* spellInfo) + { + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd + }); + // ENDOF ISLE OF CONQUEST SPELLS + + // + // FIRELANDS SPELLS + // + // Torment + ApplySpellFix({ 99256, 100230, 100231, 100232 }, [](SpellInfo* spellInfo) + { + spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; + }); + // ENDOF FIRELANDS SPELLS + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { - spellInfo = (SpellInfo*)mSpellInfoMap[i]; + SpellInfo* spellInfo = mSpellInfoMap[i]; if (!spellInfo) continue; @@ -2834,872 +4276,6 @@ void SpellMgr::LoadSpellInfoCorrections() if (spellInfo->ActiveIconID == 2158) // flight spellInfo->Attributes |= SPELL_ATTR0_PASSIVE; - switch (spellInfo->Id) - { - case 63026: // Force Cast (HACK: Target shouldn't be changed) - case 63137: // Force Cast (HACK: Target shouldn't be changed; summon position should be untied from spell destination) - spellInfo->Effects[0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); - break; - case 42436: // Drink! (Brewfest) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); - break; - case 52611: // Summon Skeletons - case 52612: // Summon Skeletons - spellInfo->Effects[EFFECT_0].MiscValueB = 64; - break; - case 40244: // Simon Game Visual - case 40245: // Simon Game Visual - case 40246: // Simon Game Visual - case 40247: // Simon Game Visual - case 42835: // Spout, remove damage effect, only anim is needed - spellInfo->Effects[EFFECT_0].Effect = 0; - break; - case 63665: // Charge (Argent Tournament emote on riders) - case 31298: // Sleep (needs target selection script) - case 51904: // Summon Ghouls On Scarlet Crusade (this should use conditions table, script for this spell needs to be fixed) - case 68933: // Wrath of Air Totem rank 2 (Aura) - case 29200: // Purify Helboar Meat - case 10872: // Abolish Disease Effect - case 3137: // Abolish Poison Effect - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); - break; - case 56690: // Thrust Spear - case 60586: // Mighty Spear Thrust - case 60776: // Claw Swipe - case 60881: // Fatal Strike - case 60864: // Jaws of Death - spellInfo->AttributesEx4 |= SPELL_ATTR4_FIXED_DAMAGE; - break; - case 31344: // Howl of Azgalor - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yards instead of 50000?! - break; - case 42818: // Headless Horseman - Wisp Flight Port - case 42821: // Headless Horseman - Wisp Flight Missile - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(6); // 100 yards - break; - case 36350: // They Must Burn Bomb Aura (self) - spellInfo->Effects[EFFECT_0].TriggerSpell = 36325; // They Must Burn Bomb Drop (DND) - break; - case 61407: // Energize Cores - case 62136: // Energize Cores - case 54069: // Energize Cores - case 56251: // Energize Cores - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); - break; - case 50785: // Energize Cores - case 59372: // Energize Cores - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENEMY); - break; - case 63320: // Glyph of Life Tap - case 53228: // Rapid Killing (Rank 1) - case 53232: // Rapid Killing (Rank 2) - // Entries were not updated after spell effect change, we have to do that manually :/ - spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED; - break; - case 5308: // Execute - spellInfo->AttributesEx3 |= SPELL_ATTR3_CANT_TRIGGER_PROC; - break; - case 59725: // Improved Spell Reflection - aoe aura - // Target entry seems to be wrong for this spell :/ - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER_AREA_PARTY); - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); - break; - case 43265: // Death and Decay - // We need access to the targets of the dynaura to correctly apply the damage spell - // Currently EFFECT_1 has PERIODIC_DUMMY aura but TARGET_UNIT_CASTER set - // This will leave the spell in the same state as it was in 335 DBC - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_PERIODIC_DUMMY; - spellInfo->Effects[EFFECT_0].Amplitude = spellInfo->Effects[EFFECT_1].Amplitude; - spellInfo->Effects[EFFECT_1].Effect = 0; // might as well save a few cpu cycles - break; - case 31347: // Doom - case 36327: // Shoot Arcane Explosion Arrow - case 39365: // Thundering Storm - case 41071: // Raise Dead (HACK) - case 42442: // Vengeance Landing Cannonfire - case 42611: // Shoot - case 44978: // Wild Magic - case 45001: // Wild Magic - case 45002: // Wild Magic - case 45004: // Wild Magic - case 45006: // Wild Magic - case 45010: // Wild Magic - case 45761: // Shoot Gun - case 45863: // Cosmetic - Incinerate to Random Target - case 48246: // Ball of Flame - case 41635: // Prayer of Mending - case 44869: // Spectral Blast - case 45027: // Revitalize - case 45976: // Muru Portal Channel - case 52124: // Sky Darkener Assault - case 52479: // Gift of the Harvester - case 61588: // Blazing Harpoon - case 55479: // Force Obedience - case 28560: // Summon Blizzard (Sapphiron) - case 53096: // Quetz'lun's Judgment - case 70743: // AoD Special - case 70614: // AoD Special - Vegard - case 4020: // Safirdrang's Chill - case 52438: // Summon Skittering Swarmer (Force Cast) - case 52449: // Summon Skittering Infector (Force Cast) - case 53609: // Summon Anub'ar Assassin (Force Cast) - case 53457: // Summon Impale Trigger (AoE) - spellInfo->MaxAffectedTargets = 1; - break; - case 36384: // Skartax Purple Beam - spellInfo->MaxAffectedTargets = 2; - break; - case 28542: // Life Drain - Sapphiron - case 29213: // Curse of the Plaguebringer - Noth - case 29576: // Multi-Shot - case 37790: // Spread Shot - case 39992: // Needle Spine - case 40816: // Saber Lash - case 41303: // Soul Drain - case 41376: // Spite - case 45248: // Shadow Blades - case 46771: // Flame Sear - case 54171: // Divine Storm - case 54172: // Divine Storm (heal) - case 66588: // Flaming Spear - spellInfo->MaxAffectedTargets = 3; - break; - case 38310: // Multi-Shot - case 53385: // Divine Storm (Damage) - spellInfo->MaxAffectedTargets = 4; - break; - case 42005: // Bloodboil - case 38296: // Spitfire Totem - case 37676: // Insidious Whisper - case 46008: // Negative Energy - case 45641: // Fire Bloom - case 55665: // Life Drain - Sapphiron (H) - case 28796: // Poison Bolt Volly - Faerlina - spellInfo->MaxAffectedTargets = 5; - break; - case 54835: // Curse of the Plaguebringer - Noth (H) - spellInfo->MaxAffectedTargets = 8; - break; - case 40827: // Sinful Beam - case 40859: // Sinister Beam - case 40860: // Vile Beam - case 40861: // Wicked Beam - case 54098: // Poison Bolt Volly - Faerlina (H) - spellInfo->MaxAffectedTargets = 10; - break; - case 50312: // Unholy Frenzy - spellInfo->MaxAffectedTargets = 15; - break; - case 33711: // Murmur's Touch - case 38794: // Murmur's Touch - spellInfo->MaxAffectedTargets = 1; - spellInfo->Effects[EFFECT_0].TriggerSpell = 33760; - break; - case 44544: // Fingers of Frost - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(685904631, 1151048, 0); - break; - case 53257: // Cobra Strikes - spellInfo->ProcCharges = 2; - spellInfo->StackAmount = 0; - break; - case 46867: // Wrecking Crew - case 56611: - case 56612: - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x02000000, 0, 0); - break; - case 47201: // Everlasting Affliction (1) - case 47202: // Everlasting Affliction (2) - case 47203: // Everlasting Affliction (3) - case 47204: // Everlasting Affliction (4) - case 47205: // Everlasting Affliction (5) - // add corruption to affected spells - spellInfo->Effects[EFFECT_1].SpellClassMask[0] |= 2; - break; - case 49224: // Magic Suppression - DK - case 49610: // Magic Suppression - DK - case 49611: // Magic Suppression - DK - spellInfo->ProcCharges = 0; - break; - case 52212: // Death and Decay - spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; - break; - case 37408: // Oscillation Field - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - break; - case 57470: // Renewed Hope (Rank 1) - case 57472: // Renewed Hope (Rank 2) - // should also affect Flash Heal - spellInfo->Effects[EFFECT_0].SpellClassMask[0] |= 0x800; - break; - case 51912: // Crafty's Ultra-Advanced Proto-Typical Shortening Blaster - spellInfo->Effects[EFFECT_0].Amplitude = 3000; - break; - // Master Shapeshifter: missing stance data for forms other than bear - bear version has correct data - // To prevent aura staying on target after talent unlearned - case 48420: // Master Shapeshifter - case 24900: // Heart of the Wild - Cat Effect - spellInfo->Stances = UI64LIT(1) << (FORM_CAT - 1); - break; - case 24899: // Heart of the Wild - Bear Effect - spellInfo->Stances = UI64LIT(1) << (FORM_BEAR - 1); - break; - case 48421: // Master Shapeshifter - spellInfo->Stances = UI64LIT(1) << (FORM_MOONKIN - 1); - break; - case 51466: // Elemental Oath (Rank 1) - case 51470: // Elemental Oath (Rank 2) - spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_APPLY_AURA; - spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; - spellInfo->Effects[EFFECT_1].MiscValue = SPELLMOD_EFFECT2; - spellInfo->Effects[EFFECT_1].SpellClassMask = flag96(0x00000000, 0x00004000, 0x00000000); - break; - case 47569: // Improved Shadowform (Rank 1) - // with this spell atrribute aura can be stacked several times - spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFT; - break; - case 64904: // Hymn of Hope - spellInfo->Effects[EFFECT_1].ApplyAuraName = SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT; - break; - case 30421: // Nether Portal - Perseverence - spellInfo->Effects[EFFECT_2].BasePoints += 30000; - break; - case 41913: // Parasitic Shadowfiend Passive - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_DUMMY; // proc debuff, and summon infinite fiends - break; - case 27892: // To Anchor 1 - case 27928: // To Anchor 1 - case 27935: // To Anchor 1 - case 27915: // Anchor to Skulls - case 27931: // Anchor to Skulls - case 27937: // Anchor to Skulls - case 16177: // Ancestral Fortitude (Rank 1) - case 16236: // Ancestral Fortitude (Rank 2) - case 16237: // Ancestral Fortitude (Rank 3) - case 47930: // Grace - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(EFFECT_RADIUS_10_YARDS); - break; - // target allys instead of enemies, target A is src_caster, spells with effect like that have ally target - // this is the only known exception, probably just wrong data - case 29214: // Wrath of the Plaguebringer - case 54836: // Wrath of the Plaguebringer - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); - spellInfo->Effects[EFFECT_1].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); - break; - case 15290: // Vampiric Embrace - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; - break; - case 63675: // Improved Devouring Plague - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; - break; - case 12721: // Deep Wounds shouldnt ignore resillience or damage taken auras because its damage is not based off a spell. - spellInfo->AttributesEx4 = 0; - break; - case 8145: // Tremor Totem (instant pulse) - spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; - /*no break*/ - case 6474: // Earthbind Totem (instant pulse) - spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; - break; - case 53241: // Marked for Death (Rank 1) - case 53243: // Marked for Death (Rank 2) - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x00067801, 0x10820001, 0x00000801); - break; - case 5176: // Wrath - case 2912: // Starfire - case 78674: // Starsurge - spellInfo->Effects[EFFECT_1].Effect = SPELL_EFFECT_DUMMY; - spellInfo->Effects[EFFECT_1].TargetA = TARGET_UNIT_CASTER; - break; - case 70728: // Exploit Weakness (needs target selection script) - case 70840: // Devious Minds (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_PET); - break; - case 70893: // Culling The Herd (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_MASTER); - break; - case 54800: // Sigil of the Frozen Conscience - change class mask to custom extended flags of Icy Touch - // this is done because another spell also uses the same SpellFamilyFlags as Icy Touch - // SpellFamilyFlags[0] & 0x00000040 in SPELLFAMILY_DEATHKNIGHT is currently unused (3.3.5a) - // this needs research on modifier applying rules, does not seem to be in Attributes fields - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x00000040, 0x00000000, 0x00000000); - break; - case 64949: // Idol of the Flourishing Life - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x00000000, 0x02000000, 0x00000000); - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; - break; - case 34231: // Libram of the Lightbringer - case 60792: // Libram of Tolerance - case 64956: // Libram of the Resolute - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x80000000, 0x00000000, 0x00000000); - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; - break; - case 28851: // Libram of Light - case 28853: // Libram of Divinity - case 32403: // Blessed Book of Nagrand - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(0x40000000, 0x00000000, 0x00000000); - spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_ADD_FLAT_MODIFIER; - break; - case 45602: // Ride Carpet - spellInfo->Effects[EFFECT_0].BasePoints = 0; // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)" - break; - case 61719: // Easter Lay Noblegarden Egg Aura - Interrupt flags copied from aura which this aura is linked with - spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE; - break; - case 71838: // Drain Life - Bryntroll Normal - case 71839: // Drain Life - Bryntroll Heroic - spellInfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT; - break; - case 56606: // Ride Jokkum - case 61791: // Ride Vehicle (Yogg-Saron) - /// @todo: remove this when basepoints of all Ride Vehicle auras are calculated correctly - spellInfo->Effects[EFFECT_0].BasePoints = 1; - break; - case 59630: // Black Magic - spellInfo->Attributes |= SPELL_ATTR0_PASSIVE; - break; - case 17364: // Stormstrike - case 48278: // Paralyze - case 53651: // Light's Beacon - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - break; - case 51798: // Brewfest - Relay Race - Intro - Quest Complete - case 47134: // Quest Complete - //! HACK: This spell break quest complete for alliance and on retail not used - spellInfo->Effects[EFFECT_0].Effect = 0; - break; - case 15487: // Priest - Silence - case 47476: // Deathknight - Strangulate - case 69179: // Arcane Torrent (Rage) - spellInfo->AttributesEx7 |= SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER; - break; - case 42490: // Energized! - case 42492: // Cast Energized - spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT; - break; - case 85123: // Siege Cannon (Tol Barad) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); - break; - case 46842: // Flame Ring - case 46836: // Flame Patch - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(); - break; - case 29726: // Test Ribbon Pole Channel - spellInfo->InterruptFlags &= ~AURA_INTERRUPT_FLAG_CAST; - break; - case 42767: // Sic'em - case 43092: // Stop the Ascension!: Halfdan's Soul Destruction - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_NEARBY_ENTRY); - break; - case 46946: // Safeguard (Rank 1) - case 46947: // Safeguard (Rank 2) - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(34); // Twenty-Five yards - break; - // VIOLET HOLD SPELLS - // - case 54258: // Water Globule (Ichoron) - case 54264: // Water Globule (Ichoron) - case 54265: // Water Globule (Ichoron) - case 54266: // Water Globule (Ichoron) - case 54267: // Water Globule (Ichoron) - // in 3.3.5 there is only one radius in dbc which is 0 yards in this case - // use max radius from 4.3.4 - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); - break; - // ENDOF VIOLET HOLD - // - // ULDUAR SPELLS - // - case 62374: // Pursued (Flame Leviathan) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 63342: // Focused Eyebeam Summon Trigger (Kologarn) - spellInfo->MaxAffectedTargets = 1; - break; - case 62716: // Growth of Nature (Freya) - case 65584: // Growth of Nature (Freya) - case 64381: // Strength of the Pack (Auriaya) - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - break; - case 63018: // Searing Light (XT-002) - case 65121: // Searing Light (25m) (XT-002) - case 63024: // Gravity Bomb (XT-002) - case 64234: // Gravity Bomb (25m) (XT-002) - spellInfo->MaxAffectedTargets = 1; - break; - case 62834: // Boom (XT-002) - // This hack is here because we suspect our implementation of spell effect execution on targets - // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets, - // then EFFECT_1, etc - instead of applying each effect on target1, then target2, etc. - // The above situation causes the visual for this spell to be bugged, so we remove the instakill - // effect and implement a script hack for that. - spellInfo->Effects[EFFECT_1].Effect = 0; - break; - case 64386: // Terrifying Screech (Auriaya) - case 64389: // Sentinel Blast (Auriaya) - case 64678: // Sentinel Blast (Auriaya) - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(28); // 5 seconds, wrong DBC data? - break; - case 64321: // Potent Pheromones (Freya) - // spell should dispel area aura, but doesn't have the attribute - // may be db data bug, or blizz may keep reapplying area auras every update with checking immunity - // that will be clear if we get more spells with problem like this - spellInfo->AttributesEx |= SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY; - break; - case 63414: // Spinning Up (Mimiron) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); - spellInfo->ChannelInterruptFlags = 0; - break; - case 63036: // Rocket Strike (Mimiron) - spellInfo->Speed = 0; - break; - case 64668: // Magnetic Field (Mimiron) - spellInfo->Mechanic = MECHANIC_NONE; - break; - case 64468: // Empowering Shadows (Yogg-Saron) - case 64486: // Empowering Shadows (Yogg-Saron) - spellInfo->MaxAffectedTargets = 3; // same for both modes? - break; - case 62301: // Cosmic Smash (Algalon the Observer) - spellInfo->MaxAffectedTargets = 1; - break; - case 64598: // Cosmic Smash (Algalon the Observer) - spellInfo->MaxAffectedTargets = 3; - break; - case 62293: // Cosmic Smash (Algalon the Observer) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_CASTER); - break; - case 62311: // Cosmic Smash (Algalon the Observer) - case 64596: // Cosmic Smash (Algalon the Observer) - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(6); // 100yd - break; - case 64014: // Expedition Base Camp Teleport - case 64024: // Conservatory Teleport - case 64025: // Halls of Invention Teleport - case 64028: // Colossal Forge Teleport - case 64029: // Shattered Walkway Teleport - case 64030: // Antechamber Teleport - case 64031: // Scrapyard Teleport - case 64032: // Formation Grounds Teleport - case 65042: // Prison of Yogg-Saron Teleport - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); - break; - // ENDOF ULDUAR SPELLS - // - // TRIAL OF THE CRUSADER SPELLS - // - case 66258: // Infernal Eruption (10N) - case 67901: // Infernal Eruption (25N) - // increase duration from 15 to 18 seconds because caster is already - // unsummoned when spell missile hits the ground so nothing happen in result - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(85); - break; - // ENDOF TRIAL OF THE CRUSADER SPELLS - // - // HALLS OF REFLECTION SPELLS - // - case 72435: // Defiling Horror - case 72452: // Defiling Horror - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd - break; - case 72830: // Achievement Check - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 72900: // Start Halls of Reflection Quest AE - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - break; - // ENDOF HALLS OF REFLECTION SPELLS - // - // ICECROWN CITADEL SPELLS - // - // THESE SPELLS ARE WORKING CORRECTLY EVEN WITHOUT THIS HACK - // THE ONLY REASON ITS HERE IS THAT CURRENT GRID SYSTEM - // DOES NOT ALLOW FAR OBJECT SELECTION (dist > 333) - case 70781: // Light's Hammer Teleport - case 70856: // Oratory of the Damned Teleport - case 70857: // Rampart of Skulls Teleport - case 70858: // Deathbringer's Rise Teleport - case 70859: // Upper Spire Teleport - case 70860: // Frozen Throne Teleport - case 70861: // Sindragosa's Lair Teleport - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); - break; - case 69075: // Bone Storm (Lord Marrowgar) - case 70834: // Bone Storm (Lord Marrowgar) - case 70835: // Bone Storm (Lord Marrowgar) - case 70836: // Bone Storm (Lord Marrowgar) - case 72864: // Death Plague (Rotting Frost Giant) - case 71160: // Plague Stench (Stinky) - case 71161: // Plague Stench (Stinky) - case 71123: // Decimate (Stinky & Precious) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd - break; - case 71169: // Shadow's Fate - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - break; - case 72347: // Lock Players and Tap Chest - spellInfo->AttributesEx3 &= ~SPELL_ATTR3_NO_INITIAL_AGGRO; - break; - case 73843: // Award Reputation - Boss Kill - case 73844: // Award Reputation - Boss Kill - case 73845: // Award Reputation - Boss Kill - case 73846: // Award Reputation - Boss Kill - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 72378: // Blood Nova (Deathbringer Saurfang) - case 73058: // Blood Nova (Deathbringer Saurfang) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); - break; - case 72769: // Scent of Blood (Deathbringer Saurfang) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); - // no break - case 72771: // Scent of Blood (Deathbringer Saurfang) - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); - break; - case 72723: // Resistant Skin (Deathbringer Saurfang adds) - // this spell initially granted Shadow damage immunity, however it was removed but the data was left in client - spellInfo->Effects[EFFECT_2].Effect = 0; - break; - case 70460: // Coldflame Jets (Traps after Saurfang) - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(1); // 10 seconds - break; - case 71412: // Green Ooze Summon (Professor Putricide) - case 71415: // Orange Ooze Summon (Professor Putricide) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); - break; - case 69783: // Ooze flood - case 69797: // Ooze flood - case 69799: // Ooze flood - case 69802: // Ooze flood - // Those spells are cast on creatures with same entry as caster while they have TARGET_UNIT_NEARBY_ENTRY. - spellInfo->AttributesEx |= SPELL_ATTR1_CANT_TARGET_SELF; - break; - case 71159: // Awaken Plagued Zombies - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(21); - break; - case 70530: // Volatile Ooze Beam Protection (Professor Putricide) - spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA; // for an unknown reason this was SPELL_EFFECT_APPLY_AREA_AURA_RAID - break; - // THIS IS HERE BECAUSE COOLDOWN ON CREATURE PROCS IS NOT IMPLEMENTED - case 71604: // Mutated Strength (Professor Putricide) - case 72673: // Mutated Strength (Professor Putricide) - case 72674: // Mutated Strength (Professor Putricide) - case 72675: // Mutated Strength (Professor Putricide) - spellInfo->Effects[EFFECT_1].Effect = 0; - break; - case 72454: // Mutated Plague (Professor Putricide) - case 72464: // Mutated Plague (Professor Putricide) - case 72506: // Mutated Plague (Professor Putricide) - case 72507: // Mutated Plague (Professor Putricide) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 70911: // Unbound Plague (Professor Putricide) (needs target selection script) - case 72854: // Unbound Plague (Professor Putricide) (needs target selection script) - case 72855: // Unbound Plague (Professor Putricide) (needs target selection script) - case 72856: // Unbound Plague (Professor Putricide) (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); - break; - case 71518: // Unholy Infusion Quest Credit (Professor Putricide) - case 72934: // Blood Infusion Quest Credit (Blood-Queen Lana'thel) - case 72289: // Frost Infusion Quest Credit (Sindragosa) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // another missing radius - break; - case 71708: // Empowered Flare (Blood Prince Council) - case 72785: // Empowered Flare (Blood Prince Council) - case 72786: // Empowered Flare (Blood Prince Council) - case 72787: // Empowered Flare (Blood Prince Council) - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; - break; - case 71266: // Swarming Shadows - case 72890: // Swarming Shadows - spellInfo->AreaGroupId = 0; // originally, these require area 4522, which is... outside of Icecrown Citadel - break; - case 70602: // Corruption - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - break; - case 70715: // Column of Frost (visual marker) - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(32); // 6 seconds (missing) - break; - case 71085: // Mana Void (periodic aura) - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(9); // 30 seconds (missing) - break; - case 72015: // Frostbolt Volley (only heroic) - case 72016: // Frostbolt Volley (only heroic) - spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_40_YARDS); - break; - case 70936: // Summon Suppressor (needs target selection script) - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(157); // 90yd - break; - case 72706: // Achievement Check (Valithria Dreamwalker) - case 71357: // Order Whelp - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - break; - case 70598: // Sindragosa's Fury - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST); - break; - case 69846: // Frost Bomb - spellInfo->Speed = 0.0f; // This spell's summon happens instantly - break; - case 70106: // Chilled to the Bone - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; - spellInfo->AttributesEx6 |= SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS; - break; - case 71614: // Ice Lock - spellInfo->Mechanic = MECHANIC_STUN; - break; - case 72762: // Defile - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(559); // 53 seconds - break; - case 72743: // Defile - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(22); // 45 seconds - break; - case 72754: // Defile - case 73708: // Defile - case 73709: // Defile - case 73710: // Defile - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - break; - case 69030: // Val'kyr Target Search - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY; - break; - case 69198: // Raging Spirit Visual - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd - break; - case 73654: // Harvest Souls - case 74295: // Harvest Souls - case 74296: // Harvest Souls - case 74297: // Harvest Souls - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 73655: // Harvest Soul - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; - break; - case 73540: // Summon Shadow Trap - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(3); // 60 seconds - break; - case 73530: // Shadow Trap (visual) - spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(27); // 3 seconds - break; - case 73529: // Shadow Trap - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd - break; - case 74282: // Shadow Trap (searcher) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS); // 5yd - break; - case 72595: // Restore Soul - case 73650: // Restore Soul - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - break; - case 74086: // Destroy Soul - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - break; - case 74302: // Summon Spirit Bomb - case 74342: // Summon Spirit Bomb - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->MaxAffectedTargets = 1; - break; - case 74341: // Summon Spirit Bomb - case 74343: // Summon Spirit Bomb - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd - spellInfo->MaxAffectedTargets = 3; - break; - case 73579: // Summon Spirit Bomb - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd - break; - case 72350: // Fury of Frostmourne - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 75127: // Kill Frostmourne Players - case 72351: // Fury of Frostmourne - case 72431: // Jump (removes Fury of Frostmourne debuff) - case 72429: // Mass Resurrection - case 73159: // Play Movie - case 73582: // Trigger Vile Spirit (Inside, Heroic) - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 72376: // Raise Dead - spellInfo->MaxAffectedTargets = 3; - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd - break; - case 71809: // Jump - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(5); // 40yd - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd - spellInfo->Effects[EFFECT_0].MiscValue = 190; - break; - case 72405: // Broken Frostmourne - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd - spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT; - break; - // ENDOF ICECROWN CITADEL SPELLS - // - // RUBY SANCTUM SPELLS - // - case 74799: // Soul Consumption - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_12_YARDS); - break; - case 74769: // Twilight Cutter - case 77844: // Twilight Cutter - case 77845: // Twilight Cutter - case 77846: // Twilight Cutter - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_100_YARDS); // 100yd - break; - case 75509: // Twilight Mending - spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; - spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; - break; - case 75875: // Combustion and Consumption Heroic versions lacks radius data - spellInfo->Effects[EFFECT_0].Mechanic = MECHANIC_NONE; - spellInfo->Effects[EFFECT_1].Mechanic = MECHANIC_SNARE; - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); - break; - case 75884: - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); - // No break - case 75883: - case 75876: - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_6_YARDS); - break; - // ENDOF RUBY SANCTUM SPELLS - // - // EYE OF ETERNITY SPELLS - // All spells below work even without these changes. The LOS attribute is due to problem - // from collision between maps & gos with active destroyed state. - case 57473: // Arcane Storm bonus explicit visual spell - case 57431: // Summon Static Field - case 56091: // Flame Spike (Wyrmrest Skytalon) - case 56092: // Engulf in Flames (Wyrmrest Skytalon) - case 57090: // Revivify (Wyrmrest Skytalon) - case 57143: // Life Burst (Wyrmrest Skytalon) - spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; - break; - // This would never crit on retail and it has attribute for SPELL_ATTR3_NO_DONE_BONUS because is handled from player, - // until someone figures how to make scions not critting without hack and without making them main casters this should stay here. - case 63934: // Arcane Barrage (cast by players and NONMELEEDAMAGELOG with caster Scion of Eternity (original caster)). - spellInfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT; - break; - // ENDOF EYE OF ETERNITY SPELLS - // - case 40055: // Introspection - case 40165: // Introspection - case 40166: // Introspection - case 40167: // Introspection - spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; - break; - case 2378: // Minor Fortitude - spellInfo->ManaCost = 0; - spellInfo->ManaPerSecond = 0; - break; - // Stonecore spells - case 95284: // Teleport (from entrance to Slabhide) - case 95285: // Teleport (from Slabhide to entrance) - spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DB); - break; - // Vortex of Pinnacle spells - case 85085: // Howling Gale - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS); - break; - case 85159: // Howling Gale - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(84); // To-do: Enum this radius entry - EFFECT_RADIUS_17_YARDS. - break; - // Altairus - case 88282: // Upwind of Altairus - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); - break; - case 88314: // Twisting Winds - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); - spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); - break; - // Grounding Field - case 87721: // Beam A - case 87722: // Beam B - case 87723: // Beam C - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); - break; - // The Lost City of the Tol'Vir Spells - // General Husam - case 83131: // Summon Shockwave Target N - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); - break; - case 83235: // Hurl - spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA; - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); - break; - // Halls Of Origination spells - // Temple Guardian Anhuur - case 76606: // Disable Beacon Beams L - case 76608: // Disable Beacon Beams R - // Little hack, Increase the radius so it can hit the Cave In Stalkers in the platform. - spellInfo->Effects[EFFECT_0].MaxRadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_45_YARDS); - break; - case 75323: // Reverberating Hymn - // Aura is refreshed at 3 seconds, and the tick should happen at the fourth. - spellInfo->AttributesEx8 |= SPELL_ATTR8_DONT_RESET_PERIODIC_TIMER; - break; - // Rajh - case 89133: // Solar Fire - case 89878: // Solar Fire - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); - break; - case 74108: // Solar Winds - case 89130: // Solar Winds - spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_4_YARDS); - break; - case 24314: // Threatening Gaze - spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP; - break; - case 5420: // Tree of Life (Passive) - spellInfo->Stances = UI64LIT(1) << (FORM_TREE - 1); - break; - case 49376: // Feral Charge (Cat Form) - spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC; - break; - case 96942: // Gaze of Occu'thar - case 101009: // Gaze of Occu'thar - spellInfo->AttributesEx &= ~SPELL_ATTR1_CHANNELED_1; - break; - case 75610: // Evolution - spellInfo->MaxAffectedTargets = 1; - break; - case 75697: // Evolution - spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); - break; - // ISLE OF CONQUEST SPELLS - // - case 66551: // Teleport - spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd - break; - // ENDOF ISLE OF CONQUEST SPELLS - // - // Firelands Spells - // - case 99256: // Torment - case 100230: //Torment - case 100231: //Torment - case 100232: //Torment - spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; - break; - // End of Firelands Spells - case 41485: // Deadly Poison - Black Temple - case 41487: // Envenom - Black Temple - spellInfo->AttributesEx6 |= SPELL_ATTR6_CAN_TARGET_INVISIBLE; - break; - default: - break; - } - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++) { if (spellInfo->Effects[i].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CONE || spellInfo->Effects[i].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CONE) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 330df3cadd..ec402579bd 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2588,6 +2588,10 @@ BanReturn World::BanAccount(BanMode mode, std::string const& nameOrIP, uint32 du PreparedQueryResult resultAccounts = PreparedQueryResult(NULL); //used for kicking PreparedStatement* stmt = NULL; + // Prevent banning an already banned account + if (mode == BAN_ACCOUNT && AccountMgr::IsBannedAccount(nameOrIP)) + return BAN_EXISTS; + ///- Update the database with ban information switch (mode) { diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 76db435dc3..5ace6d3ed1 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -230,6 +230,9 @@ public: } handler->SetSentErrorMessage(true); return false; + case BAN_EXISTS: + handler->PSendSysMessage(LANG_BAN_EXISTS); + break; } return true; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index ab0d83bfef..4d649067f0 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -666,7 +666,7 @@ public: static bool HandleDismountCommand(ChatHandler* handler, char const* /*args*/) { - Player* player = handler->GetSession()->GetPlayer(); + Player* player = handler->getSelectedPlayerOrSelf(); // If player is not mounted, so go out :) if (!player->IsMounted()) @@ -678,7 +678,7 @@ public: if (player->IsInFlight()) { - handler->SendSysMessage(LANG_YOU_IN_FLIGHT); + handler->SendSysMessage(LANG_CHAR_IN_FLIGHT); handler->SetSentErrorMessage(true); return false; } diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 2221e1327c..beba216abe 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1023,7 +1023,7 @@ public: if (!*args) return false; - uint16 display_id = (uint16)atoi((char*)args); + uint32 display_id = (uint32)atoi((char*)args); Unit* target = handler->getSelectedUnit(); if (!target) diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 3d80e6f88a..64baa0a551 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -43,7 +43,7 @@ struct EnumName #define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) } #define NPCFLAG_COUNT 24 -#define FLAGS_EXTRA_COUNT 20 +#define FLAGS_EXTRA_COUNT 21 EnumName const npcFlagTexts[NPCFLAG_COUNT] = { @@ -167,7 +167,8 @@ EnumName const flagsExtra[FLAGS_EXTRA_COUNT] = CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ), CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_DUNGEON_BOSS), CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING), - CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK) + CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK), + CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK) }; class npc_commandscript : public CommandScript diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 36134848d8..6d944c7571 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -121,32 +121,40 @@ public: return false; } - // remove all quest entries for 'entry' from quest log - for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) + if (player->GetQuestStatus(entry) != QUEST_STATUS_NONE) { - uint32 logQuest = player->GetQuestSlotQuestId(slot); - if (logQuest == entry) + // remove all quest entries for 'entry' from quest log + for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) { - player->SetQuestSlot(slot, 0); - - // we ignore unequippable quest items in this case, its' still be equipped - player->TakeQuestSourceItem(logQuest, false); - - if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP)) + uint32 logQuest = player->GetQuestSlotQuestId(slot); + if (logQuest == entry) { - player->pvpInfo.IsHostile = player->pvpInfo.IsInHostileArea || player->HasPvPForcingQuest(); - player->UpdatePvPState(); + player->SetQuestSlot(slot, 0); + + // we ignore unequippable quest items in this case, its' still be equipped + player->TakeQuestSourceItem(logQuest, false); + + if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP)) + { + player->pvpInfo.IsHostile = player->pvpInfo.IsInHostileArea || player->HasPvPForcingQuest(); + player->UpdatePvPState(); + } } } + player->RemoveActiveQuest(entry, false); + player->RemoveRewardedQuest(entry); + + sScriptMgr->OnQuestStatusChange(player, entry); + + handler->SendSysMessage(LANG_COMMAND_QUEST_REMOVED); + return true; + } + else + { + handler->SendSysMessage(LANG_COMMAND_QUEST_NOTFOUND); + handler->SetSentErrorMessage(true); + return false; } - - player->RemoveActiveQuest(entry, false); - player->RemoveRewardedQuest(entry); - - sScriptMgr->OnQuestStatusChange(player, entry); - - handler->SendSysMessage(LANG_COMMAND_QUEST_REMOVED); - return true; } static bool HandleQuestComplete(ChatHandler* handler, const char* args) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index a643d05fa9..0e685770ce 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -22,6 +22,7 @@ #include "blackrock_depths.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" //go_shadowforge_brazier class go_shadowforge_brazier : public GameObjectScript @@ -29,21 +30,31 @@ class go_shadowforge_brazier : public GameObjectScript public: go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_shadowforge_brazierAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_shadowforge_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override { - if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS) - instance->SetData(TYPE_LYCEUM, DONE); - else - instance->SetData(TYPE_LYCEUM, IN_PROGRESS); - // If used brazier open linked doors (North or South) - if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) - instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); - else if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) - instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS) + instance->SetData(TYPE_LYCEUM, DONE); + else + instance->SetData(TYPE_LYCEUM, IN_PROGRESS); + // If used brazier open linked doors (North or South) + if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) + instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); + else if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) + instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shadowforge_brazierAI(go); } }; @@ -429,45 +440,57 @@ enum Lokhtos class npc_lokhtos_darkbargainer : public CreatureScript { -public: - npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } + public: + npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) + struct npc_lokhtos_darkbargainerAI : public ScriptedAI { - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false); - } - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_lokhtos_darkbargainerAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false); + } + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); - if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + return true; + } - if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 && - !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && - player->HasItemCount(ITEM_SULFURON_INGOT)) + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 && + !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && + player->HasItemCount(ITEM_SULFURON_INGOT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + } + + if (player->GetReputationRank(59) < REP_FRIENDLY) + SendGossipMenuFor(player, 3673, me->GetGUID()); + else + SendGossipMenuFor(player, 3677, me->GetGUID()); + + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + return new npc_lokhtos_darkbargainerAI(creature); } - - if (player->GetReputationRank(59) < REP_FRIENDLY) - SendGossipMenuFor(player, 3673, creature->GetGUID()); - else - SendGossipMenuFor(player, 3677, creature->GetGUID()); - - return true; - } }; // npc_rocknot @@ -480,134 +503,134 @@ enum Rocknot class npc_rocknot : public CreatureScript { -public: - npc_rocknot() : CreatureScript("npc_rocknot") { } + public: + npc_rocknot() : CreatureScript("npc_rocknot") { } - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL) - return true; - - if (quest->GetQuestId() == QUEST_ALE) + struct npc_rocknotAI : public npc_escortAI { - if (instance->GetData(TYPE_BAR) != IN_PROGRESS) - instance->SetData(TYPE_BAR, IN_PROGRESS); - - instance->SetData(TYPE_BAR, SPECIAL); - - //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress - if (instance->GetData(TYPE_BAR) == SPECIAL) + npc_rocknotAI(Creature* creature) : npc_escortAI(creature) { - creature->AI()->Talk(SAY_GOT_BEER); - creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false); - - if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI())) - escortAI->Start(false, false); + Initialize(); + instance = creature->GetInstanceScript(); } - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } - - struct npc_rocknotAI : public npc_escortAI - { - npc_rocknotAI(Creature* creature) : npc_escortAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - BreakKeg_Timer = 0; - BreakDoor_Timer = 0; - } - - InstanceScript* instance; - - uint32 BreakKeg_Timer; - uint32 BreakDoor_Timer; - - void Reset() override - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - return; - - Initialize(); - } - - void DoGo(uint32 id, uint32 state) - { - if (GameObject* go = instance->instance->GetGameObject(instance->GetGuidData(id))) - go->SetGoState((GOState)state); - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) + void Initialize() { - case 1: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - break; - case 2: - me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); - break; - case 3: - me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); - break; - case 4: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - break; - case 5: - me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); - BreakKeg_Timer = 2000; - break; + BreakKeg_Timer = 0; + BreakDoor_Timer = 0; } - } - void UpdateAI(uint32 diff) override - { - if (BreakKeg_Timer) + InstanceScript* instance; + + uint32 BreakKeg_Timer; + uint32 BreakDoor_Timer; + + void Reset() override { - if (BreakKeg_Timer <= diff) + if (HasEscortState(STATE_ESCORT_ESCORTING)) + return; + + Initialize(); + } + + void DoGo(uint32 id, uint32 state) + { + if (GameObject* go = instance->instance->GetGameObject(instance->GetGuidData(id))) + go->SetGoState((GOState)state); + } + + void WaypointReached(uint32 waypointId) override + { + switch (waypointId) { - DoGo(DATA_GO_BAR_KEG, 0); - BreakKeg_Timer = 0; - BreakDoor_Timer = 1000; - } else BreakKeg_Timer -= diff; + case 1: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + break; + case 2: + me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); + break; + case 3: + me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED); + break; + case 4: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + break; + case 5: + me->HandleEmoteCommand(EMOTE_ONESHOT_KICK); + BreakKeg_Timer = 2000; + break; + } } - if (BreakDoor_Timer) + void UpdateAI(uint32 diff) override { - if (BreakDoor_Timer <= diff) + if (BreakKeg_Timer) { - DoGo(DATA_GO_BAR_DOOR, 2); - DoGo(DATA_GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future - //spell by trap has effect61, this indicate the bar go hostile + if (BreakKeg_Timer <= diff) + { + DoGo(DATA_GO_BAR_KEG, 0); + BreakKeg_Timer = 0; + BreakDoor_Timer = 1000; + } + else BreakKeg_Timer -= diff; + } - if (Unit* tmp = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PHALANX))) - tmp->SetFaction(FACTION_MONSTER); + if (BreakDoor_Timer) + { + if (BreakDoor_Timer <= diff) + { + DoGo(DATA_GO_BAR_DOOR, 2); + DoGo(DATA_GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future + //spell by trap has effect61, this indicate the bar go hostile - //for later, this event(s) has alot more to it. - //optionally, DONE can trigger bar to go hostile. - instance->SetData(TYPE_BAR, DONE); + if (Unit* tmp = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PHALANX))) + tmp->SetFaction(FACTION_MONSTER); - BreakDoor_Timer = 0; - } else BreakDoor_Timer -= diff; + //for later, this event(s) has alot more to it. + //optionally, DONE can trigger bar to go hostile. + instance->SetData(TYPE_BAR, DONE); + + BreakDoor_Timer = 0; + } + else BreakDoor_Timer -= diff; + } + + npc_escortAI::UpdateAI(diff); } - npc_escortAI::UpdateAI(diff); + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return; + + if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL) + return; + + if (quest->GetQuestId() == QUEST_ALE) + { + if (instance->GetData(TYPE_BAR) != IN_PROGRESS) + instance->SetData(TYPE_BAR, IN_PROGRESS); + + instance->SetData(TYPE_BAR, SPECIAL); + + //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress + if (instance->GetData(TYPE_BAR) == SPECIAL) + { + me->AI()->Talk(SAY_GOT_BEER); + me->CastSpell(me, SPELL_DRUNKEN_RAGE, false); + + if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, me->AI())) + escortAI->Start(false, false); + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_rocknotAI(creature); } - }; }; void AddSC_blackrock_depths() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp index 70173704fb..37b7e892ae 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp @@ -119,10 +119,10 @@ public: { boss_coren_direbrewAI(Creature* creature) : BossAI(creature, DATA_COREN) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId != GOSSIP_ID) - return; + return false; if (gossipListId == GOSSIP_OPTION_FIGHT) { @@ -131,6 +131,8 @@ public: } else if (gossipListId == GOSSIP_OPTION_APOLOGIZE) CloseGossipMenuFor(player); + + return false; } void Reset() override @@ -425,16 +427,16 @@ public: void Reset() override { - go->SetLootState(GO_READY); + me->SetLootState(GO_READY); _scheduler .Schedule(Seconds(1), [this](TaskContext /*context*/) { - go->UseDoorOrButton(8); - go->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true); + me->UseDoorOrButton(8); + me->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true); }) .Schedule(Seconds(4), [this](TaskContext /*context*/) { - if (GameObject* trap = go->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f)) + if (GameObject* trap = me->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f)) { trap->SetLootState(GO_ACTIVATED); trap->UseDoorOrButton(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index b4ebc8b05a..f86b36f3ec 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -54,45 +54,56 @@ class boss_gloomrel : public CreatureScript public: boss_gloomrel() : CreatureScript("boss_gloomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct boss_gloomrelAI : public ScriptedAI { - ClearGossipMenuFor(player); - switch (action) + boss_gloomrelAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - SendGossipMenuFor(player, 2606, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+11: - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_LEARN_SMELT, false); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); - SendGossipMenuFor(player, 2604, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+22: - CloseGossipMenuFor(player); - if (InstanceScript* instance = creature->GetInstanceScript()) - { - //are 5 minutes expected? go template may have data to despawn when used at quest - instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE*5); - } - break; + if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - return true; - } - bool OnGossipHello(Player* player, Creature* creature) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + SendGossipMenuFor(player, 2606, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 11: + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_LEARN_SMELT, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); + SendGossipMenuFor(player, 2604, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 22: + CloseGossipMenuFor(player); + if (InstanceScript* instance = me->GetInstanceScript()) + { + //are 5 minutes expected? go template may have data to despawn when used at quest + instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE * 5); + } + break; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; + return new boss_gloomrelAI(creature); } }; @@ -122,37 +133,6 @@ class boss_doomrel : public CreatureScript public: boss_doomrel() : CreatureScript("boss_doomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 2605, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - //start event here - creature->SetFaction(FACTION_DARK_IRON_DWARVES); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->AttackStart(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 2601, creature->GetGUID()); - - return true; - } - struct boss_doomrelAI : public ScriptedAI { boss_doomrelAI(Creature* creature) : ScriptedAI(creature) @@ -161,6 +141,39 @@ class boss_doomrel : public CreatureScript _instance = creature->GetInstanceScript(); } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 2605, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + //start event here + me->SetFaction(FACTION_DARK_IRON_DWARVES); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->AI()->AttackStart(player); + InstanceScript* instance = me->GetInstanceScript(); + if (instance) + instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID()); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 2601, me->GetGUID()); + + return true; + } + void Initialize() { _voidwalkers = false; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 4791f4ecf1..4f5074d470 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -370,7 +370,7 @@ public: } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) { @@ -378,6 +378,7 @@ public: Talk(SAY_GAMESBEGIN_1); BeginEvent(player); } + return false; } private: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 56b6731da8..cbedc69d00 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -21,6 +21,7 @@ #include "SpellScript.h" #include "blackwing_lair.h" #include "Player.h" +#include "GameObjectAI.h" enum Say { @@ -174,20 +175,30 @@ public: class go_orb_of_domination : public GameObjectScript { -public: - go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } + public: + go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) - { - razorgore->Attack(player, true); - player->CastSpell(razorgore, SPELL_MINDCONTROL); - } - return true; - } + struct go_orb_of_dominationAI : public GameObjectAI + { + go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetData(DATA_EGG_EVENT) != DONE) + if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + { + razorgore->Attack(player, true); + player->CastSpell(razorgore, SPELL_MINDCONTROL); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_dominationAI(go); + } }; class spell_egg_event : public SpellScriptLoader diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 5ed364f0f0..784cf55430 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -222,13 +222,14 @@ public: DoMeleeAttackIfReady(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == 0) { CloseGossipMenuFor(player); BeginSpeech(player); } + return false; } private: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index c91b9bc813..d0028bdd65 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -195,13 +195,15 @@ class boss_majordomo : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US) { CloseGossipMenuFor(player); DoAction(ACTION_START_RAGNAROS); } + + return true; } }; diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index 120e56dc69..18bdc09d2d 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -121,7 +121,7 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { @@ -132,6 +132,7 @@ public: player->PlayerTalkClass->SendCloseGossip(); } + return false; } void NextStep(uint32 uiTimerStep, bool bNextStep = true, uint8 uiPhaseStep = 0) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index c40def9a5c..7926f2ab05 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -20,6 +20,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "karazhan.h" +#include "GameObjectAI.h" enum NightbaneSpells { @@ -415,25 +416,35 @@ class spell_rain_of_bones : public SpellScriptLoader class go_blackened_urn : public GameObjectScript { -public: - go_blackened_urn() : GameObjectScript("go_blackened_urn") { } + public: + go_blackened_urn() : GameObjectScript("go_blackened_urn") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) - return false; - - InstanceScript* instance = go->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) - return false; - - if (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE))) + struct go_blackened_urnAI : public GameObjectAI { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - nightbane->AI()->DoAction(ACTION_SUMMON); + go_blackened_urnAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override + { + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) + return false; + + InstanceScript* instance = me->GetInstanceScript(); + if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) + return false; + + if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE))) + { + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + nightbane->AI()->DoAction(ACTION_SUMMON); + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blackened_urnAI(go); } - return false; - } }; void AddSC_boss_nightbane() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index 0130f7b9a8..2b9562b0d6 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -816,7 +816,7 @@ class npc_grandmother : public CreatureScript { npc_grandmotherAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == OPTION_WHAT_PHAT_LEWTS_YOU_HAVE && gossipListId == 0) { @@ -828,6 +828,7 @@ class npc_grandmother : public CreatureScript me->DespawnOrUnsummon(); } } + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index d45fa9fc9b..cc678f8b53 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -335,74 +335,71 @@ public: } } } - }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - npc_barnesAI* pBarnesAI = ENSURE_AI(npc_barnes::npc_barnesAI, creature->AI()); - - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, 8971, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - pBarnesAI->StartEvent(); - break; - case GOSSIP_ACTION_INFO_DEF+3: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_OZ; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_HOOD; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_RAJ; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 8971, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + StartEvent(); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_OZ; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_HOOD; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_RAJ; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str()); + break; + } + + return true; } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) + bool GossipHello(Player* player) override { - // Check for death of Moroes and if opera event is not done already - if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) + if (InstanceScript* instance = me->GetInstanceScript()) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - if (player->IsGameMaster()) + // Check for death of Moroes and if opera event is not done already + if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) { - AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - } + AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI())) - { - if (!pBarnesAI->RaidWiped) - SendGossipMenuFor(player, 8970, creature->GetGUID()); + if (player->IsGameMaster()) + { + AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + } + + if (!RaidWiped) + SendGossipMenuFor(player, 8970, me->GetGUID()); else - SendGossipMenuFor(player, 8975, creature->GetGUID()); + SendGossipMenuFor(player, 8975, me->GetGUID()); return true; } } - } - SendGossipMenuFor(player, 8978, creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, 8978, me->GetGUID()); + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index 9792ea0cfb..588086b122 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -68,46 +68,6 @@ class npc_kalecgos : public CreatureScript public: npc_kalecgos() : CreatureScript("npc_kalecgos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 12500, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 12502, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, 12606, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - SendGossipMenuFor(player, 12607, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - SendGossipMenuFor(player, 12608, creature->GetGUID()); - break; - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 12498, creature->GetGUID()); - - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_kalecgosAI(creature); @@ -153,6 +113,47 @@ public: } } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 12500, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 12502, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, 12606, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, 12607, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + SendGossipMenuFor(player, 12608, me->GetGUID()); + break; + } + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 12498, me->GetGUID()); + + return true; + } + private: EventMap events; }; diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 774cf41fd1..67330fe964 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -27,6 +27,7 @@ #include "SpellInfo.h" #include "CreatureTextMgr.h" #include "MoveSplineInit.h" +#include "GameObjectAI.h" /*###### ##Quest 12848 @@ -322,16 +323,25 @@ class go_acherus_soul_prison : public GameObjectScript public: go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_acherus_soul_prisonAI : public GameObjectAI { - if (Creature* anchor = go->FindNearestCreature(29521, 15)) - if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID()) - if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) - ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); + go_acherus_soul_prisonAI(GameObject* go) : GameObjectAI(go) { } - return false; + bool GossipHello(Player* player) override + { + if (Creature* anchor = me->FindNearestCreature(29521, 15)) + if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID()) + if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) + ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_acherus_soul_prisonAI(go); } - }; /*###### @@ -473,47 +483,6 @@ class npc_death_knight_initiate : public CreatureScript public: npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) - { - CloseGossipMenuFor(player); - - if (player->IsInCombat() || creature->IsInCombat()) - return true; - - if (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, creature->AI())) - { - if (pInitiateAI->m_bIsDuelInProgress) - return true; - } - - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15); - - player->CastSpell(creature, SPELL_DUEL, false); - player->CastSpell(player, SPELL_DUEL_FLAG, true); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && creature->IsFullHealth()) - { - if (player->HealthBelowPct(10)) - return true; - - if (player->IsInCombat() || creature->IsInCombat()) - return true; - - AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - struct npc_death_knight_initiateAI : public CombatAI { npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature) @@ -616,6 +585,48 @@ public: CombatAI::UpdateAI(uiDiff); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + CloseGossipMenuFor(player); + + if (player->IsInCombat() || me->IsInCombat()) + return true; + + if (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, me->AI())) + { + if (pInitiateAI->m_bIsDuelInProgress) + return true; + } + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15); + + player->CastSpell(me, SPELL_DUEL, false); + player->CastSpell(player, SPELL_DUEL_FLAG, true); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && me->IsFullHealth()) + { + if (player->HealthBelowPct(10)) + return true; + + if (player->IsInCombat() || me->IsInCombat()) + return true; + + AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override @@ -749,13 +760,14 @@ public: { npc_salanar_the_horsemanAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_SALANAR_MENU && gossipListId == GOSSIP_SALANAR_OPTION) { player->CastSpell(player, SPELL_REALM_OF_SHADOWS, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void SpellHit(Unit* caster, const SpellInfo* spell) override diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 5c492d9770..c2779bcdf4 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -199,18 +199,6 @@ class npc_koltira_deathweaver : public CreatureScript public: npc_koltira_deathweaver() : CreatureScript("npc_koltira_deathweaver") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_BREAKOUT) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - - if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI())) - escortAI->Start(false, false, player->GetGUID()); - } - return true; - } - struct npc_koltira_deathweaverAI : public npc_escortAI { npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature) @@ -354,6 +342,16 @@ public: } } + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_BREAKOUT) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + + Start(false, false, player->GetGUID()); + } + } + private: uint8 wave; uint32 waveTimer; diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 42c10ed929..1bcda1676c 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -270,33 +270,6 @@ class npc_highlord_darion_mograine : public CreatureScript public: npc_highlord_darion_mograine() : CreatureScript("npc_highlord_darion_mograine") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - CloseGossipMenuFor(player); - ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1; - ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_highlord_darion_mograineAI(creature); @@ -1636,6 +1609,34 @@ public: temp->KillSelf(); } } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + CloseGossipMenuFor(player); + uiStep = 1; + Start(true, false, player->GetGUID()); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } }; }; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 3102b7461d..4d377bc075 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -31,6 +31,7 @@ EndScriptData */ #include "Player.h" #include "Group.h" #include "SpellInfo.h" +#include "GameObjectAI.h" //this texts are already used by 3975 and 3976 enum Says @@ -876,32 +877,41 @@ enum LooselyTurnedSoil class go_loosely_turned_soil : public GameObjectScript { -public: - go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } + public: + go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) - return true; - - return false; - } - - bool OnQuestReward(Player* player, GameObject* go, Quest const* /*quest*/, uint32 /*opt*/) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) - return false; - - player->AreaExploredOrEventHappens(11405); - if (Creature* horseman = go->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0)) + struct go_loosely_turned_soilAI : public GameObjectAI { - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + go_loosely_turned_soilAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) + return true; + + return false; + } + + void QuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) + return; + + player->AreaExploredOrEventHappens(11405); + if (Creature* horseman = me->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0)) + { + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_loosely_turned_soilAI(go); } - return true; - } }; void npc_head::npc_headAI::Disappear() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index acb9073294..51228f1a19 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -280,12 +280,22 @@ class go_brazier_of_the_herald : public GameObjectScript public: go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_brazier_of_the_heraldAI : public GameObjectAI { - go->UseDoorOrButton(); - go->PlayDirectSound(SOUND_SCREECH, 0); - player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000); - return true; + go_brazier_of_the_heraldAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + me->UseDoorOrButton(); + me->PlayDirectSound(SOUND_SCREECH, 0); + player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_brazier_of_the_heraldAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp index 78f286c82c..5c81941793 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp @@ -97,7 +97,7 @@ class boss_apothecary_hummel : public CreatureScript { boss_apothecary_hummelAI(Creature* creature) : BossAI(creature, DATA_APOTHECARY_HUMMEL), _deadCount(0), _isDead(false) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_HUMMEL && gossipListId == GOSSIP_OPTION_START) { @@ -105,6 +105,7 @@ class boss_apothecary_hummel : public CreatureScript CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void Reset() override @@ -259,6 +260,12 @@ class boss_apothecary_hummel : public CreatureScript DoMeleeAttackIfReady(); } + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) + DoAction(ACTION_START_EVENT); + } + private: uint8 _deadCount; bool _isDead; @@ -268,14 +275,6 @@ class boss_apothecary_hummel : public CreatureScript { return GetInstanceAI(creature); } - - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override - { - if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) - creature->AI()->DoAction(ACTION_START_EVENT); - - return true; - } }; struct npc_apothecary_genericAI : public ScriptedAI diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index 3b19da7965..ad78cc71b0 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -72,31 +72,6 @@ public: return GetInstanceAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_shadowfang_prisoner::npc_shadowfang_prisonerAI, creature->AI())) - pEscortAI->Start(false, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance && instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) - AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - struct npc_shadowfang_prisonerAI : public npc_escortAI { npc_shadowfang_prisonerAI(Creature* creature) : npc_escortAI(creature) @@ -106,6 +81,31 @@ public: InstanceScript* instance; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + + Start(false, false); + } + return true; + } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + + if (instance && instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) + AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + void WaypointReached(uint32 waypointId) override { switch (waypointId) diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 3ccf0e3dd1..2275956daa 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -36,6 +36,7 @@ EndContentData */ #include "Group.h" #include "Player.h" #include "SpellInfo.h" +#include "GameObjectAI.h" /*###### ## go_gauntlet_gate (this is the _first_ of the gauntlet gates, two exist) @@ -46,38 +47,48 @@ class go_gauntlet_gate : public GameObjectScript public: go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_gauntlet_gateAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + go_gauntlet_gateAI(GameObject* go) : GameObjectAI(go) { } - if (!instance) - return false; - - if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) - return false; - - if (Group* group = player->GetGroup()) + bool GossipHello(Player* player) override { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + InstanceScript* instance = me->GetInstanceScript(); + + if (!instance) + return false; + + if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) + return false; + + if (Group* group = player->GetGroup()) { - Player* pGroupie = itr->GetSource(); - if (!pGroupie || !pGroupie->IsInMap(player)) - continue; + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + { + Player* pGroupie = itr->GetSource(); + if (!pGroupie || !pGroupie->IsInMap(player)) + continue; - if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && - !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) && - pGroupie->GetMap() == go->GetMap()) - pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); + if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) && + pGroupie->GetMap() == me->GetMap()) + pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); + } } - } else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && - !player->HasAura(SPELL_BARON_ULTIMATUM) && - player->GetMap() == go->GetMap()) - player->CastSpell(player, SPELL_BARON_ULTIMATUM, true); + else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + !player->HasAura(SPELL_BARON_ULTIMATUM) && + player->GetMap() == me->GetMap()) + player->CastSpell(player, SPELL_BARON_ULTIMATUM, true); - instance->SetData(TYPE_BARON_RUN, IN_PROGRESS); - return false; + instance->SetData(TYPE_BARON_RUN, IN_PROGRESS); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gauntlet_gateAI(go); } - }; /*###### diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp index e6be567052..466270d618 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp @@ -31,6 +31,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "sunken_temple.h" #include "Player.h" +#include "GameObjectAI.h" /*##### # at_malfurion_Stormrage_trigger @@ -63,16 +64,25 @@ class at_malfurion_stormrage : public AreaTriggerScript class go_atalai_statue : public GameObjectScript { -public: - go_atalai_statue() : GameObjectScript("go_atalai_statue") { } + public: + go_atalai_statue() : GameObjectScript("go_atalai_statue") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(EVENT_STATE, go->GetEntry()); - return false; - } + struct go_atalai_statueAI : public GameObjectAI + { + go_atalai_statueAI(GameObject* go) : GameObjectAI(go) { } + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + instance->SetData(EVENT_STATE, me->GetEntry()); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_atalai_statueAI(go); + } }; void AddSC_sunken_temple() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 5db76065f7..70cdfa85c1 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "sunwell_plateau.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" enum Yells { @@ -536,27 +537,37 @@ class kalecgos_teleporter : public GameObjectScript public: kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct kalecgos_teleporterAI : public GameObjectAI { -#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0 - uint8 SpectralPlayers = 0; - Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5) - ++SpectralPlayers; - } + kalecgos_teleporterAI(GameObject* go) : GameObjectAI(go) { } - if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM) + bool GossipHello(Player* player) override { - return true; - } +#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0 + uint8 SpectralPlayers = 0; + Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5) + ++SpectralPlayers; + } + + if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM) + { + return true; + } #else - (void)go; + (void)me; #endif - player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); - return true; + player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new kalecgos_teleporterAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 6e4a1cbb0c..0d52fcbe25 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -29,6 +29,7 @@ EndScriptData */ #include "sunwell_plateau.h" #include #include "Player.h" +#include "GameObjectAI.h" /*** Speech and sounds***/ enum Yells @@ -359,25 +360,35 @@ public: class go_orb_of_the_blue_flight : public GameObjectScript { -public: - go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { } + public: + go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetFaction() == 35) + struct go_orb_of_the_blue_flightAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); - player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false); - go->SetFaction(FACTION_NONE); + go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) - ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + bool GossipHello(Player* player) override + { + if (me->GetFaction() == 35) + { + InstanceScript* instance = me->GetInstanceScript(); + player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); + player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false); + me->SetFaction(FACTION_NONE); - go->Refresh(); + if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + + me->Refresh(); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_the_blue_flightAI(go); } - return true; - } }; //AI for Kil'jaeden Event Controller diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index f03b0cbaf3..ec1208f035 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -30,6 +30,7 @@ EndScriptData */ #include "ScriptedCreature.h" #include "uldaman.h" #include "Player.h" +#include "GameObjectAI.h" enum Says { @@ -394,22 +395,28 @@ EndScriptData */ class go_altar_of_archaedas : public GameObjectScript { public: + go_altar_of_archaedas() : GameObjectScript("go_altar_of_archaedas") { } - go_altar_of_archaedas() - : GameObjectScript("go_altar_of_archaedas") + struct go_altar_of_archaedasAI : public GameObjectAI { - } + go_altar_of_archaedasAI(GameObject* go) : GameObjectAI(go) { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance) + bool GossipHello(Player* player) override + { + InstanceScript* instance = player->GetInstanceScript(); + if (!instance) + return false; + + player->CastSpell(player, SPELL_BOSS_OBJECT_VISUAL, false); + + instance->SetGuidData(0, player->GetGUID()); // activate archaedas return false; + } + }; - player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false); - - instance->SetGuidData(0, player->GetGUID()); // activate archaedas - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_altar_of_archaedasAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp index 23f4c66ac7..9f229bafa7 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "uldaman.h" #include "Player.h" +#include "GameObjectAI.h" /*###### ## npc_jadespine_basilisk @@ -116,16 +117,26 @@ class npc_jadespine_basilisk : public CreatureScript class go_keystone_chamber : public GameObjectScript { -public: - go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { } + public: + go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + struct go_keystone_chamberAI : public GameObjectAI + { + go_keystone_chamberAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* /*player*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_keystone_chamberAI(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index c737e8d317..bd13a10a48 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -97,10 +97,10 @@ class npc_voljin_zulaman : public CreatureScript _gongCount = 0; } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED) - return; + return true; if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -112,6 +112,8 @@ class npc_voljin_zulaman : public CreatureScript Talk(SAY_INTRO_1, player); me->SetWalk(true); } + + return true; } void DoAction(int32 action) override diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index 533031aed4..c9d846bd36 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -107,7 +107,7 @@ class npc_professor_phizzlethorpe : public CreatureScript Talk(SAY_AGGRO); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) { diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index bdb623c4f2..5aef66e5d4 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -126,25 +126,21 @@ public: if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) Cage->SetGoState(GO_STATE_READY); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) + void QuestAccept(Player* player, Quest const* quest) override { - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_ranger_lilatha::npc_ranger_lilathaAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) + { + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + Start(true, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { return new npc_ranger_lilathaAI(creature); } - }; void AddSC_ghostlands() diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index 5dea92a763..328ac2e18d 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -72,7 +72,7 @@ public: summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_RESQUE_OOX_09) { diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index e05ad0541a..026b5346ae 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -113,20 +113,16 @@ public: { Talk(SAY_AGGRO, who); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCORTING) + void QuestAccept(Player* player, Quest const* quest) override { - creature->AI()->Talk(SAY_QUESTACCEPT, player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_deathstalker_erland::npc_deathstalker_erlandAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCORTING) + { + Talk(SAY_QUESTACCEPT, player); + Start(true, false, player->GetGUID()); + } } - - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp index 37ac4d9804..ba2fb6c4da 100644 --- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp @@ -52,7 +52,7 @@ class npc_tb_spirit_guide : public CreatureScript DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { player->PlayerTalkClass->SendCloseGossip(); @@ -78,11 +78,12 @@ class npc_tb_spirit_guide : public CreatureScript areaId = TB_GY_SOUTH_SPIRE; break; default: - return; + return true; } if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(areaId)) player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); + return true; } }; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index ac79762244..4cbdf3b2e5 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -101,14 +101,6 @@ class npc_lady_sylvanas_windrunner : public CreatureScript public: npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { } - bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override - { - if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) - creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); - - return true; - } - struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI { npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature) @@ -116,6 +108,12 @@ public: Initialize(); } + void QuestReward(Player* player, const Quest *_Quest, uint32 /*slot*/) override + { + if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) + SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); + } + void Initialize() { LamentEvent = false; diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index f5dd22ed29..f97527dcb4 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -134,26 +134,35 @@ public: class npc_mikhail : public CreatureScript { -public: - npc_mikhail() : CreatureScript("npc_mikhail") { } + public: + npc_mikhail() : CreatureScript("npc_mikhail") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) + struct npc_mikhailAI : public ScriptedAI { - Creature* pSlim = creature->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); + npc_mikhailAI(Creature* creature) : ScriptedAI(creature) { } - if (!pSlim) - return false; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) + { + Creature* pSlim = me->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); - if (!pSlim->HasStealthAura()) - pSlim->CastSpell(pSlim, SPELL_STEALTH, true); + if (!pSlim) + return; - if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + if (!pSlim->HasStealthAura()) + pSlim->CastSpell(pSlim, SPELL_STEALTH, true); + + if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI())) + pEscortAI->Start(false, false, player->GetGUID(), quest); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_mikhailAI(creature); } - return false; - } }; /*###### diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index 11877f3e37..cc38aed296 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -674,7 +674,7 @@ class npc_the_etymidian : public CreatureScript Initialize(); } - void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (quest->GetQuestId() != QUEST_THE_ACTIVATION_RUNE) return; diff --git a/src/server/scripts/Events/fireworks_show.cpp b/src/server/scripts/Events/fireworks_show.cpp index 97c0e33b94..b6b9cacf05 100644 --- a/src/server/scripts/Events/fireworks_show.cpp +++ b/src/server/scripts/Events/fireworks_show.cpp @@ -843,12 +843,12 @@ public: { case EVENT_CHEER: { - go->PlayDistanceSound(CheerPicker()); + me->PlayDistanceSound(CheerPicker()); break; } case EVENT_FIRE: { - auto it = pos.find(go->GetZoneId()); + auto it = pos.find(me->GetZoneId()); if (it != pos.end()) { Position const& rndpos = Trinity::Containers::SelectRandomContainerElement(it->second); @@ -857,7 +857,7 @@ public: if (_big) { - if (GameObject* firework = go->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) + if (GameObject* firework = me->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) { firework->SetRespawnTime(0); firework->Delete(); @@ -865,7 +865,7 @@ public: } else { - if (GameObject* firework = go->SummonGameObject(FireworksPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) + if (GameObject* firework = me->SummonGameObject(FireworksPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300)) { firework->SetRespawnTime(0); firework->Delete(); diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index 333780d2b7..a99f749d94 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "GameObjectAI.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" @@ -35,35 +36,53 @@ const Position HomePosition = {-815.817f, -145.299f, -25.870f, 0}; class go_blackfathom_altar : public GameObjectScript { -public: - go_blackfathom_altar() : GameObjectScript("go_blackfathom_altar") { } + public: + go_blackfathom_altar() : GameObjectScript("go_blackfathom_altar") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (!player->HasAura(SPELL_BLESSING_OF_BLACKFATHOM)) - player->AddAura(SPELL_BLESSING_OF_BLACKFATHOM, player); - return true; - } + struct go_blackfathom_altarAI : public GameObjectAI + { + go_blackfathom_altarAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (!player->HasAura(SPELL_BLESSING_OF_BLACKFATHOM)) + player->AddAura(SPELL_BLESSING_OF_BLACKFATHOM, player); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blackfathom_altarAI(go); + } }; class go_blackfathom_fire : public GameObjectScript { -public: - go_blackfathom_fire() : GameObjectScript("go_blackfathom_fire") { } + public: + go_blackfathom_fire() : GameObjectScript("go_blackfathom_fire") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - InstanceScript* instance = go->GetInstanceScript(); - - if (instance) + struct go_blackfathom_fireAI : public GameObjectAI { - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); - return true; + go_blackfathom_fireAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + me->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1); + return true; + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blackfathom_fireAI(go); } - return false; - } }; class npc_blackfathom_deeps_event : public CreatureScript @@ -226,9 +245,10 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { DoCast(player, SPELL_TELEPORT_DARNASSUS); + return false; } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index a0459e9eaf..38dbd8b6e7 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -50,208 +50,208 @@ EndContentData */ class npc_jaina_proudmoore : public CreatureScript { -public: - npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { } + public: + npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - switch (action) + struct npc_jaina_proudmooreAI : public hyjalAI { - case GOSSIP_ACTION_INFO_DEF + 1: - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ai->FirstBossDead = true; - ai->WaveCount = 9; - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ai->Retreat(); - break; - case GOSSIP_ACTION_INFO_DEF: - ai->Debug = !ai->Debug; - TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); - break; + npc_jaina_proudmooreAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); + + Spells[0].SpellId = SPELL_BLIZZARD; + Spells[0].Cooldown = urand(15000, 35000); + Spells[0].TargetType = TARGETTYPE_RANDOM; + + Spells[1].SpellId = SPELL_PYROBLAST; + Spells[1].Cooldown = urand(5500, 9500); + Spells[1].TargetType = TARGETTYPE_RANDOM; + + Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS; + Spells[2].Cooldown = urand(15000, 45000); + Spells[2].TargetType = TARGETTYPE_SELF; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + FirstBossDead = true; + WaveCount = 9; + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + Retreat(); + break; + case GOSSIP_ACTION_INFO_DEF: + Debug = !Debug; + TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (EventBegun) + return false; + + uint32 RageEncounter = GetInstanceData(DATA_RAGEWINTERCHILLEVENT); + uint32 AnetheronEncounter = GetInstanceData(DATA_ANETHERONEVENT); + if (RageEncounter == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + else if (RageEncounter == DONE && AnetheronEncounter == DONE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + + if (player->IsGameMaster()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_jaina_proudmooreAI(creature); } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - if (ai->EventBegun) - return false; - - uint32 RageEncounter = ai->GetInstanceData(DATA_RAGEWINTERCHILLEVENT); - uint32 AnetheronEncounter = ai->GetInstanceData(DATA_ANETHERONEVENT); - if (RageEncounter == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - else if (RageEncounter == DONE && AnetheronEncounter == DONE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - - if (player->IsGameMaster()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - - ai->Reset(); - ai->EnterEvadeMode(); - - ai->Spells[0].SpellId = SPELL_BLIZZARD; - ai->Spells[0].Cooldown = urand(15000, 35000); - ai->Spells[0].TargetType = TARGETTYPE_RANDOM; - - ai->Spells[1].SpellId = SPELL_PYROBLAST; - ai->Spells[1].Cooldown = urand(5500, 9500); - ai->Spells[1].TargetType = TARGETTYPE_RANDOM; - - ai->Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS; - ai->Spells[2].Cooldown = urand(15000, 45000); - ai->Spells[2].TargetType = TARGETTYPE_SELF; - - return ai; - } - }; class npc_thrall : public CreatureScript { -public: - npc_thrall() : CreatureScript("npc_thrall") { } + public: + npc_thrall() : CreatureScript("npc_thrall") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - ai->DeSpawnVeins();//despawn the alliance veins - switch (action) + struct npc_thrallAI : public hyjalAI { - case GOSSIP_ACTION_INFO_DEF + 1: - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ai->FirstBossDead = true; - ai->WaveCount = 9; - ai->StartEvent(player); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ai->Retreat(); - break; - case GOSSIP_ACTION_INFO_DEF: - ai->Debug = !ai->Debug; - TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); - break; - } - return true; - } + npc_thrallAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - if (ai->EventBegun) - return false; + Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; + Spells[0].Cooldown = urand(3000, 8000); + Spells[0].TargetType = TARGETTYPE_VICTIM; - uint32 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT); - // Only let them start the Horde phases if Anetheron is dead. - if (AnetheronEvent == DONE && ai->GetInstanceData(DATA_ALLIANCE_RETREAT)) + Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; + Spells[1].Cooldown = urand(6000, 41000); + Spells[1].TargetType = TARGETTYPE_RANDOM; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + DeSpawnVeins();//despawn the alliance veins + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + FirstBossDead = true; + WaveCount = 9; + StartEvent(player); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + Retreat(); + break; + case GOSSIP_ACTION_INFO_DEF: + Debug = !Debug; + TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled"); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (EventBegun) + return false; + + uint32 AnetheronEvent = GetInstanceData(DATA_ANETHERONEVENT); + // Only let them start the Horde phases if Anetheron is dead. + if (AnetheronEvent == DONE && GetInstanceData(DATA_ALLIANCE_RETREAT)) + { + uint32 KazrogalEvent = GetInstanceData(DATA_KAZROGALEVENT); + uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT); + if (KazrogalEvent == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + else if (AzgalorEvent == DONE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + } + + if (player->IsGameMaster()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT); - uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); - if (KazrogalEvent == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - else if (AzgalorEvent == DONE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + return new npc_thrallAI(creature); } - - if (player->IsGameMaster()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - - ai->Reset(); - ai->EnterEvadeMode(); - - ai->Spells[0].SpellId = SPELL_CHAIN_LIGHTNING; - ai->Spells[0].Cooldown = urand(3000, 8000); - ai->Spells[0].TargetType = TARGETTYPE_VICTIM; - - ai->Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF; - ai->Spells[1].Cooldown = urand(6000, 41000); - ai->Spells[1].TargetType = TARGETTYPE_RANDOM; - - return ai; - } - }; class npc_tyrande_whisperwind : public CreatureScript { -public: - npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } + public: + npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { } - CreatureAI* GetAI(Creature* creature) const override - { - if (!creature->GetInstanceScript()) - return NULL; - - hyjalAI* ai = new hyjalAI(creature); - ai->Reset(); - ai->EnterEvadeMode(); - return ai; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) + struct npc_tyrande_whisperwindAI : public hyjalAI { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); - if (msg == EQUIP_ERR_OK) - if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) - player->SendNewItem(item, 1, true, false, true); + npc_tyrande_whisperwindAI(Creature* creature) : hyjalAI(creature) + { + Reset(); + EnterEvadeMode(); + } - SendGossipMenuFor(player, 907, creature->GetGUID()); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1); + if (msg == EQUIP_ERR_OK) + if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true)) + player->SendNewItem(item, 1, true, false, true); + + SendGossipMenuFor(player, 907, me->GetGUID()); + } + return true; + } + + bool GossipHello(Player* player) override + { + uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT); + + // Only let them get item if Azgalor is dead. + if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 907, me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_tyrande_whisperwindAI(creature); } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); - uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); - - // Only let them get item if Azgalor is dead. - if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 907, creature->GetGUID()); - return true; - } - }; void AddSC_hyjal() diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 7b05567b17..a0744b992f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -1343,9 +1343,9 @@ public: if (!me->IsWithinDist(me->GetVictim(), 20) || forcemove) { - forcemove = false; if (forcemove) { + forcemove = false; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) me->Attack(target, false); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 9de4194c73..9c0388e893 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -254,93 +254,6 @@ class npc_arthas : public CreatureScript public: npc_arthas() : CreatureScript("npc_arthas") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI()); - - if (!ai) - return false; - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - ai->Start(true, true, player->GetGUID(), 0, false, false); - ai->SetDespawnAtEnd(false); - ai->bStepping = false; - ai->step = 1; - break; - case GOSSIP_ACTION_INFO_DEF+1: - ai->bStepping = true; - ai->step = 24; - break; - case GOSSIP_ACTION_INFO_DEF+2: - ai->SetHoldState(false); - ai->bStepping = false; - ai->step = 61; - break; - case GOSSIP_ACTION_INFO_DEF+3: - ai->SetHoldState(false); - break; - case GOSSIP_ACTION_INFO_DEF+4: - ai->bStepping = true; - ai->step = 84; - break; - case GOSSIP_ACTION_INFO_DEF+5: - ai->bStepping = true; - ai->step = 85; - break; - } - CloseGossipMenuFor(player); - ai->SetDespawnAtFar(false); - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI()); - - if (ai && ai->bStepping == false) - { - switch (ai->gossipStep) - { - case 0: //This one is a workaround since the very beggining of the script is wrong. - { - QuestStatus status = player->GetQuestStatus(13149); - if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED) - return false; - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 907, creature->GetGUID()); - break; - } - case 1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, creature->GetGUID()); - break; - case 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, creature->GetGUID()); - break; - case 3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, creature->GetGUID()); - break; - case 4: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, creature->GetGUID()); - break; - case 5: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, creature->GetGUID()); - break; - default: - return false; - } - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); @@ -1231,6 +1144,88 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + Start(true, true, player->GetGUID(), 0, false, false); + SetDespawnAtEnd(false); + bStepping = false; + step = 1; + break; + case GOSSIP_ACTION_INFO_DEF + 1: + bStepping = true; + step = 24; + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SetHoldState(false); + bStepping = false; + step = 61; + break; + case GOSSIP_ACTION_INFO_DEF + 3: + SetHoldState(false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + bStepping = true; + step = 84; + break; + case GOSSIP_ACTION_INFO_DEF + 5: + bStepping = true; + step = 85; + break; + } + CloseGossipMenuFor(player); + SetDespawnAtFar(false); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return true; + } + + bool GossipHello(Player* player) override + { + if (!bStepping) + { + switch (gossipStep) + { + case 0: //This one is a workaround since the very beggining of the script is wrong. + { + QuestStatus status = player->GetQuestStatus(13149); + if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED) + return false; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 907, me->GetGUID()); + break; + } + case 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, me->GetGUID()); + break; + case 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, me->GetGUID()); + break; + case 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, me->GetGUID()); + break; + case 4: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, me->GetGUID()); + break; + case 5: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, me->GetGUID()); + break; + default: + return false; + } + } + return true; + } }; }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp index f3b302497d..d5a7af487a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -27,6 +27,7 @@ EndScriptData */ #include "ScriptedCreature.h" #include "old_hillsbrad.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" /*###### ## go_barrel_old_hillsbrad @@ -37,17 +38,27 @@ class go_barrel_old_hillsbrad : public GameObjectScript public: go_barrel_old_hillsbrad() : GameObjectScript("go_barrel_old_hillsbrad") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_barrel_old_hillsbradAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_barrel_old_hillsbradAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override { - if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE) - return false; + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE) + return false; - instance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + instance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS); + } + + return false; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_barrel_old_hillsbradAI(go); } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp index 5e4c9c0ed0..a90769b4a4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp @@ -165,7 +165,7 @@ public: m_auiEncounter[4] = NOT_STARTED; m_auiEncounter[5] = NOT_STARTED; } - else if (mThrallEventCount > 20) + else { m_auiEncounter[1] = data; m_auiEncounter[2] = data; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 7c87459223..227b89b459 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -56,41 +56,52 @@ class npc_erozion : public CreatureScript public: npc_erozion() : CreatureScript("npc_erozion") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override + struct npc_erozionAI : public ScriptedAI { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + npc_erozionAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1); - if (msg == EQUIP_ERR_OK) + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true); + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1); + if (msg == EQUIP_ERR_OK) + { + player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true); + } + SendGossipMenuFor(player, 9515, me->GetGUID()); } - SendGossipMenuFor(player, 9515, creature->GetGUID()); + if (gossipListId == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + } + return true; } - if (action == GOSSIP_ACTION_INFO_DEF+2) + + bool GossipHello(Player* player) override { - CloseGossipMenuFor(player); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + InstanceScript* instance = me->GetInstanceScript(); + if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + + SendGossipMenuFor(player, 9778, me->GetGUID()); + + return true; } - return true; - } + }; - bool OnGossipHello(Player* player, Creature* creature) override + CreatureAI* GetAI(Creature* creature) const override { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - InstanceScript* instance = creature->GetInstanceScript(); - if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - - SendGossipMenuFor(player, 9778, creature->GetGUID()); - - return true; + return new npc_erozionAI(creature); } }; @@ -190,88 +201,6 @@ public: return GetInstanceAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - CloseGossipMenuFor(player); - if (instance) - { - instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS); - instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS); - } - - creature->AI()->Talk(SAY_TH_START_EVENT_PART1); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())) - pEscortAI->Start(true, true, player->GetGUID()); - - ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - break; - - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+20); - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, creature->GetGUID()); - break; - - case GOSSIP_ACTION_INFO_DEF+20: - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, creature->GetGUID()); - creature->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000); - if (instance) - instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS); - - creature->AI()->Talk(SAY_TH_START_EVENT_PART2); - - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); - break; - - case GOSSIP_ACTION_INFO_DEF+3: - CloseGossipMenuFor(player); - if (instance) - instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - { - player->PrepareQuestMenu(creature->GetGUID()); - player->SendPreparedQuest(creature->GetGUID()); - } - - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - { - if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_ID_START, creature->GetGUID()); - } - - if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, creature->GetGUID()); - } - - if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - SendGossipMenuFor(player, GOSSIP_ID_TARREN, creature->GetGUID()); - } - } - return true; - } - struct npc_thrall_old_hillsbradAI : public npc_escortAI { npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature) @@ -292,6 +221,88 @@ public: bool LowHp; bool HadMount; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + InstanceScript* instance = me->GetInstanceScript(); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + CloseGossipMenuFor(player); + if (instance) + { + instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS); + instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS); + } + + Talk(SAY_TH_START_EVENT_PART1); + + Start(true, true, player->GetGUID()); + + SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far + SetDespawnAtEnd(false); + SetDespawnAtFar(false); + break; + + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20); + SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, me->GetGUID()); + break; + + case GOSSIP_ACTION_INFO_DEF + 20: + SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, me->GetGUID()); + me->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000); + if (instance) + instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS); + + me->AI()->Talk(SAY_TH_START_EVENT_PART2); + + StartWP(); + break; + + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + if (instance) + instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); + StartWP(); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + { + player->PrepareQuestMenu(me->GetGUID()); + player->SendPreparedQuest(me->GetGUID()); + } + + InstanceScript* instance = me->GetInstanceScript(); + if (instance) + { + if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_ID_START, me->GetGUID()); + } + + if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, me->GetGUID()); + } + + if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, GOSSIP_ID_TARREN, me->GetGUID()); + } + } + return true; + } + void WaypointReached(uint32 waypointId) override { switch (waypointId) @@ -568,43 +579,6 @@ public: return GetInstanceAI(creature); } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_ID_EPOCH2, creature->GetGUID()); - } - if (action == GOSSIP_ACTION_INFO_DEF+2) - { - CloseGossipMenuFor(player); - - if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) - { - instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS); - if (instance->GetGuidData(DATA_EPOCH).IsEmpty()) - creature->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - - if (Creature* thrall = (ObjectAccessor::GetCreature(*creature, instance->GetGuidData(DATA_THRALL)))) - ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); - } - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_ID_EPOCH1, creature->GetGUID()); - } - return true; - } - struct npc_tarethaAI : public npc_escortAI { npc_tarethaAI(Creature* creature) : npc_escortAI(creature) @@ -614,6 +588,44 @@ public: InstanceScript* instance; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + InstanceScript* instance = me->GetInstanceScript(); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_ID_EPOCH2, me->GetGUID()); + } + if (action == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + + if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) + { + instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS); + if (instance->GetGuidData(DATA_EPOCH).IsEmpty()) + me->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); + + if (Creature* thrall = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THRALL)))) + ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); + } + } + return true; + } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_ID_EPOCH1, me->GetGUID()); + } + return true; + } + void WaypointReached(uint32 waypointId) override { switch (waypointId) @@ -635,7 +647,6 @@ public: npc_escortAI::UpdateAI(diff); } }; - }; /*###### diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp index f6b6f614c7..3cc85062c5 100644 --- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp @@ -329,12 +329,12 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript { npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { } - void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) override + bool GossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override { if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE) - return; + return true; - if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) + if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { _instance->SetBossState(DATA_VAULT_OF_LIGHTS, IN_PROGRESS); _currentPoint = 0; @@ -344,6 +344,8 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript Talk(BRANN_SAY_DOOR_INTRO); events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500); } + + return true; } void DoAction(int32 action) override diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_high_prophet_barim.cpp b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_high_prophet_barim.cpp new file mode 100644 index 0000000000..75ea1aebe4 --- /dev/null +++ b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_high_prophet_barim.cpp @@ -0,0 +1,798 @@ +/* +* Copyright (C) 2008-2017 TrinityCore +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +*/ + +#include "ScriptMgr.h" +#include "lost_city_of_the_tolvir.h" +#include "ObjectMgr.h" +#include "Player.h" +#include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" + +enum Spells +{ + // High Prophet Barim + SPELL_FIFTY_LASHINGS = 82506, + SPELL_PLAGUE_OF_AGES = 82622, + SPELL_HEAVENS_FURY = 81939, + SPELL_REPANTANCE = 82320, + SPELL_REPENTANCE_PULL = 82168, + SPELL_REPENTANCE_STUN = 81947, + SPELL_REPENTANCE_KNOCKBACK = 82012, + SPELL_REPENTANCE_SCREEN_EFFECT = 82139, + SPELL_WAIL_OF_DARKNESS_DUMMY = 82195, + SPELL_BLAZE_OF_THE_HEAVENS = 91181, + + // Repentance + SPELL_REPENTANCE_SCRIPT_1 = 82009, + SPELL_REPENTANCE_SCRIPT_2 = 81960, + SPELL_REPENTANCE_PULL_BACK = 82430, + + // Harbinger of Darkness + SPELL_BIRTH = 26586, + SPELL_WAIL_OF_DARKNESS = 82533, + SPELL_SOUL_SEVER = 82255, + SPELL_WAIL_OF_DARKNESS_END = 82425, + + // Blaze of the Heavens + SPELL_BLAZE_OF_THE_HEAVENS_TRIGGER = 95248, + SPELL_BLAZE_OF_THE_HEAVENS_FLAME = 91189, + SPELL_TRANSFORM = 95276, + + // Soul Fragment + SPELL_SOUL_SEVER_SCRIPT = 82220, + SPELL_SOUL_FRAGMENT_DUMMY = 82224, + SPELL_MERGED_SOULS = 82263, +}; + +enum Events +{ + // High Prophet Barim + EVENT_FIFTY_LASHINGS = 1, + EVENT_PLAGUE_OF_AGES, + EVENT_HEAVENS_FURY, + EVENT_REPENTANCE_PULL, + EVENT_REPENTANCE_STUN, + EVENT_REPENTANCE_KNOCKBACK, + EVENT_BLAZE_OF_THE_HEAVENS, + EVENT_COUNT_PLAYERS, + + // Repentance + EVENT_COPY_WEAPON, + + // Harbinger of Darkness + EVENT_MAKE_AGGRESSIVE, + EVENT_WAIL_OF_DARKNESS, + EVENT_SOUL_SEVER, + + // Blaze of the Heavens + EVENT_TRIGGER_BLAZE, + EVENT_SUMMON_BLAZE_FLAME, + EVENT_CHECK_HEALTH, + EVENT_TRANSFORMED, + + // Soul Fragment + EVENT_MOVE_TO_HARBINGER, + EVENT_CHECK_DISTANCE +}; + +enum Actions +{ + ACTION_PULL_BACK = 1, + ACTION_MAKE_PASSIVE, + ACTION_ATTACK_PLAYERS, + ACTION_BLAZE_DIED +}; + +enum Texts +{ + // High Prophet Barim + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_REPENTEANCE = 2, + SAY_DEATH = 3, + + // Soul Fragment + SAY_ANNOUNCE_MERGE_SOUL = 0 +}; + +enum PhaseMisc +{ + PHASE_ID_REPENTANCE = 173, + PHASE_GROUP_ENCOUNTER_1 = 391 +}; + +class boss_high_prophet_barim : public CreatureScript +{ +public: + boss_high_prophet_barim() : CreatureScript("boss_high_prophet_barim") { } + + struct boss_high_prophet_barimAI : public BossAI + { + boss_high_prophet_barimAI(Creature* creature) : BossAI(creature, DATA_HIGH_PROPHET_BARIM) { } + + void Reset() override + { + _Reset(); + _repentanceStarted = false; + } + + void EnterCombat(Unit* /*who*/) override + { + _EnterCombat(); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_FIFTY_LASHINGS, Seconds(9)); + events.ScheduleEvent(EVENT_PLAGUE_OF_AGES, Seconds(7) + Milliseconds(500)); + events.ScheduleEvent(EVENT_HEAVENS_FURY, Seconds(7) + Milliseconds(500)); + if (IsHeroic()) + events.ScheduleEvent(EVENT_BLAZE_OF_THE_HEAVENS, Seconds(10)); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + if (Creature* blaze = instance->GetCreature(DATA_BLAZE_OF_THE_HEAVENS)) + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, blaze); + blaze->DespawnOrUnsummon(Milliseconds(100)); + } + Talk(SAY_DEATH); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _EnterEvadeMode(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SOUL_SEVER); + if (Creature* blaze = instance->GetCreature(DATA_BLAZE_OF_THE_HEAVENS)) + { + blaze->AI()->EnterEvadeMode(); + blaze->DespawnOrUnsummon(Milliseconds(700)); + } + _DespawnAtEvade(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override + { + if (me->HealthBelowPct(50) && !_repentanceStarted) + { + events.Reset(); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + me->StopMoving(); + DoCastSelf(SPELL_REPANTANCE); + events.ScheduleEvent(EVENT_REPENTANCE_PULL, Seconds(1)); + _repentanceStarted = true; + } + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_PULL_BACK: + { + std::list units; + GetCreatureListWithEntryInGrid(units, me, NPC_REPENTANCE, 30.0f); + for (std::list::iterator itr = units.begin(); itr != units.end(); ++itr) + (*itr)->AI()->DoAction(ACTION_PULL_BACK); + + me->RemoveAurasDueToSpell(SPELL_REPANTANCE); + me->SetReactState(REACT_AGGRESSIVE); + + summons.DespawnEntry(NPC_SOUL_FRAGMENT); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SOUL_SEVER); + if (Creature* blaze = instance->GetCreature(DATA_BLAZE_OF_THE_HEAVENS)) + blaze->AI()->DoAction(ACTION_ATTACK_PLAYERS); + break; + } + case ACTION_BLAZE_DIED: + events.ScheduleEvent(EVENT_BLAZE_OF_THE_HEAVENS, Seconds(3)); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FIFTY_LASHINGS: + DoCastSelf(SPELL_FIFTY_LASHINGS); + events.Repeat(Seconds(40)); + break; + case EVENT_PLAGUE_OF_AGES: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) + DoCast(target, SPELL_PLAGUE_OF_AGES); + events.Repeat(Seconds(25)); + break; + case EVENT_HEAVENS_FURY: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) + DoCast(target, SPELL_HEAVENS_FURY); + events.Repeat(Seconds(22)); + break; + case EVENT_REPENTANCE_PULL: + Talk(SAY_REPENTEANCE); + DoCastSelf(SPELL_REPENTANCE_PULL); + events.ScheduleEvent(EVENT_REPENTANCE_STUN, Seconds(1) + Milliseconds(300)); + + if (Creature* blaze = instance->GetCreature(DATA_BLAZE_OF_THE_HEAVENS)) + blaze->AI()->DoAction(ACTION_MAKE_PASSIVE); + break; + case EVENT_REPENTANCE_STUN: + DoCastAOE(SPELL_REPENTANCE_STUN, true); + events.ScheduleEvent(EVENT_REPENTANCE_KNOCKBACK, Seconds(6)); + break; + case EVENT_REPENTANCE_KNOCKBACK: + DoCastAOE(SPELL_REPENTANCE_KNOCKBACK); + DoCastAOE(SPELL_REPENTANCE_SCREEN_EFFECT, true); + DoCastSelf(SPELL_WAIL_OF_DARKNESS_DUMMY, true); + break; + case EVENT_BLAZE_OF_THE_HEAVENS: + DoCastSelf(SPELL_BLAZE_OF_THE_HEAVENS, true); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + bool _repentanceStarted; + }; + + CreatureAI* GetAI(Creature *creature) const override + { + return GetLostCityOfTheTolvirAI(creature); + } +}; + +class npc_barim_repentance : public CreatureScript +{ +public: + npc_barim_repentance() : CreatureScript("npc_barim_repentance") { } + + struct npc_barim_repentanceAI : public PassiveAI + { + npc_barim_repentanceAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* summoner) override + { + if (Creature* barim = _instance->GetCreature(DATA_HIGH_PROPHET_BARIM)) + barim->AI()->JustSummoned(me); + + for (uint32 id : GetPhasesForGroup(PHASE_GROUP_ENCOUNTER_1)) + me->SetInPhase(id, false, true); + + DoCastSelf(SPELL_REPENTANCE_SCRIPT_1, true); + _events.ScheduleEvent(EVENT_COPY_WEAPON, Seconds(2)); + + if (Aura* aura = summoner->GetAura(SPELL_REPENTANCE_STUN)) + if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1)) + aurEff->SetPeriodic(false); + } + + void DoAction(int32 action) override + { + if (action == ACTION_PULL_BACK) + { + DoCastAOE(SPELL_REPENTANCE_PULL_BACK, true); + me->DespawnOrUnsummon(Seconds(1) + Milliseconds(500)); + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_COPY_WEAPON: + DoCastSelf(SPELL_REPENTANCE_SCRIPT_2, true); + break; + default: + break; + } + } + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetLostCityOfTheTolvirAI(creature); + } +}; + +class npc_barim_harbinger_of_darkness : public CreatureScript +{ +public: + npc_barim_harbinger_of_darkness() : CreatureScript("npc_barim_harbinger_of_darkness") { } + + struct npc_barim_harbinger_of_darknessAI : public ScriptedAI + { + npc_barim_harbinger_of_darknessAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + me->SetReactState(REACT_PASSIVE); + DoZoneInCombat(); + DoCastSelf(SPELL_BIRTH, true); + _events.ScheduleEvent(EVENT_WAIL_OF_DARKNESS, Seconds(6)); + _events.ScheduleEvent(EVENT_SOUL_SEVER, Seconds(11)); + } + + void EnterCombat(Unit* /*who*/) override + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + _events.ScheduleEvent(EVENT_MAKE_AGGRESSIVE, Seconds(1) + Milliseconds(500)); + } + + void JustDied(Unit* /*killer*/) override + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + DoCastAOE(SPELL_WAIL_OF_DARKNESS_END, true); + me->DespawnOrUnsummon(Milliseconds(700)); + + if (Creature* barim = _instance->GetCreature(DATA_HIGH_PROPHET_BARIM)) + barim->AI()->DoAction(ACTION_PULL_BACK); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->DespawnOrUnsummon(Milliseconds(700)); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MAKE_AGGRESSIVE: + me->SetReactState(REACT_AGGRESSIVE); + if (Player* victim = me->SelectNearestPlayer(100.0f)) + me->AI()->AttackStart(victim); + break; + case EVENT_WAIL_OF_DARKNESS: + DoCastAOE(SPELL_WAIL_OF_DARKNESS); + _events.Repeat(Seconds(2) + Milliseconds(500)); + break; + case EVENT_SOUL_SEVER: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true, 0)) + DoCast(target, SPELL_SOUL_SEVER); + _events.Repeat(Seconds(11)); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetLostCityOfTheTolvirAI(creature); + } +}; + +class npc_barim_blaze_of_the_heavens : public CreatureScript +{ +public: + npc_barim_blaze_of_the_heavens() : CreatureScript("npc_barim_blaze_of_the_heavens") { } + + struct npc_barim_blaze_of_the_heavensAI : public ScriptedAI + { + npc_barim_blaze_of_the_heavensAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + _isInEgg = false; + _isTransforming = false; + me->SetReactState(REACT_PASSIVE); + DoZoneInCombat(); + DoCastSelf(SPELL_BIRTH, true); + me->SetInPhase(PHASE_ID_REPENTANCE, true, false); + } + + void EnterCombat(Unit* /*who*/) override + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + _events.ScheduleEvent(EVENT_MAKE_AGGRESSIVE, Seconds(1) + Milliseconds(500)); + _events.ScheduleEvent(EVENT_TRIGGER_BLAZE, Seconds(3)); + _events.ScheduleEvent(EVENT_SUMMON_BLAZE_FLAME, Seconds(4)); + } + + void JustSummoned(Creature* summon) override + { + if (Creature* barim = _instance->GetCreature(DATA_HIGH_PROPHET_BARIM)) + barim->AI()->JustSummoned(summon); + + for (uint32 id : GetPhasesForGroup(PHASE_GROUP_ENCOUNTER_1)) + summon->SetInPhase(id, false, true); + } + + void JustDied(Unit* /*killer*/) override + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->DespawnOrUnsummon(Seconds(4)); + if (Creature* barim = _instance->GetCreature(DATA_HIGH_PROPHET_BARIM)) + barim->AI()->DoAction(ACTION_BLAZE_DIED); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_ATTACK_PLAYERS: + if (Player* victim = me->SelectNearestPlayer(100.0f)) + { + _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + if (!_isInEgg) + { + me->SetReactState(REACT_AGGRESSIVE); + me->AI()->AttackStart(victim); + _events.ScheduleEvent(EVENT_MAKE_AGGRESSIVE, Seconds(1) + Milliseconds(500)); + _events.ScheduleEvent(EVENT_TRIGGER_BLAZE, Seconds(3)); + _events.ScheduleEvent(EVENT_SUMMON_BLAZE_FLAME, Seconds(4)); + } + else + _events.ScheduleEvent(EVENT_CHECK_HEALTH, Seconds(1)); + } + break; + case ACTION_MAKE_PASSIVE: + _events.Reset(); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + break; + default: + break; + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPct(1) && !_isTransforming) + { + _events.Reset(); + _isTransforming = true; + _events.ScheduleEvent(EVENT_TRANSFORMED, Seconds(2) + Milliseconds(300)); + me->RemoveAllAuras(); + DoCastSelf(SPELL_TRANSFORM); + } + + if (damage >= me->GetHealth() && !_isInEgg) + damage = me->GetHealth() - 1; + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MAKE_AGGRESSIVE: + me->SetReactState(REACT_AGGRESSIVE); + if (Player* victim = me->SelectNearestPlayer(100.0f)) + me->AI()->AttackStart(victim); + break; + case EVENT_TRIGGER_BLAZE: + DoCastSelf(SPELL_BLAZE_OF_THE_HEAVENS_TRIGGER, true); + break; + case EVENT_SUMMON_BLAZE_FLAME: + DoCastSelf(SPELL_BLAZE_OF_THE_HEAVENS_FLAME, true); + _events.Repeat(Seconds(1)); + break; + case EVENT_TRANSFORMED: + _isInEgg = true; + _events.ScheduleEvent(EVENT_CHECK_HEALTH, Seconds(1)); + break; + case EVENT_CHECK_HEALTH: + if (me->GetHealthPct() == 100.0f) + { + me->RemoveAurasDueToSpell(SPELL_TRANSFORM); + DoCastSelf(SPELL_BIRTH, true); + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_MAKE_AGGRESSIVE, Seconds(1) + Milliseconds(500)); + _events.ScheduleEvent(EVENT_TRIGGER_BLAZE, Seconds(3)); + _events.ScheduleEvent(EVENT_SUMMON_BLAZE_FLAME, Seconds(4)); + _isInEgg = false; + _isTransforming = false; + } + else + _events.Repeat(Seconds(1)); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + + private: + EventMap _events; + InstanceScript* _instance; + bool _isInEgg; + bool _isTransforming; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetLostCityOfTheTolvirAI(creature); + } +}; + +class npc_barim_soul_fragment : public CreatureScript +{ +public: + npc_barim_soul_fragment() : CreatureScript("npc_barim_soul_fragment") { } + + struct npc_barim_soul_fragmentAI : public PassiveAI + { + npc_barim_soul_fragmentAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { } + + void IsSummonedBy(Unit* /*summoner*/) override + { + me->SetWalk(true); + DoCastSelf(SPELL_SOUL_SEVER_SCRIPT, true); + DoCastSelf(SPELL_REPENTANCE_SCRIPT_2, true); + DoCastAOE(SPELL_SOUL_FRAGMENT_DUMMY, true); + + if (Creature* barim = _instance->GetCreature(DATA_HIGH_PROPHET_BARIM)) + barim->AI()->JustSummoned(me); + + _events.ScheduleEvent(EVENT_MOVE_TO_HARBINGER, Seconds(5)); + } + + void JustDied(Unit* /*killer*/) override + { + me->DespawnOrUnsummon(Seconds(1)); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MOVE_TO_HARBINGER: + if (Creature* harbinger = _instance->GetCreature(DATA_HARBINGER_OF_DARKNESS)) + { + me->GetMotionMaster()->MovePoint(0, harbinger->GetPosition(), true); + _events.ScheduleEvent(EVENT_CHECK_DISTANCE, Milliseconds(500)); + } + break; + case EVENT_CHECK_DISTANCE: + if (Creature* harbinger = me->FindNearestCreature(NPC_HARBINGER_OF_DARKNESS, 0.3f, true)) + { + Talk(SAY_ANNOUNCE_MERGE_SOUL); + me->CastStop(); + DoCastAOE(SPELL_MERGED_SOULS, true); + me->DespawnOrUnsummon(Seconds(1)); + } + else + { + if (Creature* harbinger = _instance->GetCreature(DATA_HARBINGER_OF_DARKNESS)) + me->GetMotionMaster()->MovePoint(0, harbinger->GetPosition(), true); + _events.Repeat(Milliseconds(500)); + } + break; + default: + break; + } + } + } + + private: + EventMap _events; + InstanceScript* _instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetLostCityOfTheTolvirAI(creature); + } +}; + +class spell_barim_plague_of_ages_first : public SpellScriptLoader +{ +public: + spell_barim_plague_of_ages_first() : SpellScriptLoader("spell_barim_plague_of_ages_first") { } + + class spell_barim_plague_of_ages_first_SpellScript : public SpellScript + { + PrepareSpellScript(spell_barim_plague_of_ages_first_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + Trinity::Containers::RandomResize(targets, 1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_barim_plague_of_ages_first_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_barim_plague_of_ages_first_SpellScript(); + } +}; + +class spell_barim_plague_of_ages_second : public SpellScriptLoader +{ +public: + spell_barim_plague_of_ages_second() : SpellScriptLoader("spell_barim_plague_of_ages_second") { } + + class spell_barim_plague_of_ages_second_SpellScript : public SpellScript + { + PrepareSpellScript(spell_barim_plague_of_ages_second_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + Trinity::Containers::RandomResize(targets, 1); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_barim_plague_of_ages_second_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_barim_plague_of_ages_second_SpellScript(); + } +}; + +class spell_barim_repentance_script : public SpellScriptLoader +{ +public: + spell_barim_repentance_script() : SpellScriptLoader("spell_barim_repentance_script") { } + + class spell_barim_repentance_script_SpellScript : public SpellScript + { + PrepareSpellScript(spell_barim_repentance_script_SpellScript); + + void EffectScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* playerTarget = GetHitPlayer()) + playerTarget->CastSpell(GetCaster(), GetSpellInfo()->Effects[EFFECT_0].BasePoints, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_barim_repentance_script_SpellScript::EffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_barim_repentance_script_SpellScript(); + } +}; + +class spell_barim_repentance_pull : public SpellScriptLoader +{ +public: + spell_barim_repentance_pull() : SpellScriptLoader("spell_barim_repentance_pull") { } + + class spell_barim_repentance_pull_SpellScript : public SpellScript + { + PrepareSpellScript(spell_barim_repentance_pull_SpellScript); + + void HandPullEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* playerTarget = GetHitPlayer()) + { + if (Unit* barim = GetCaster()) // unneeded, but we use it for readability instead of tons of GetCaster() calls + { + // Calculate our own destination since players should land in front of Barim instead of inside him + Position pos; + float angle = barim->GetAngle(playerTarget); + float distance = barim->GetCombatReach() * 2; + pos.m_positionX = barim->GetPositionX() + cos(angle) * distance; + pos.m_positionY = barim->GetPositionY() + sin(angle) * distance; + pos.m_positionZ = barim->GetPositionZ(); + + float speedXY = float(GetSpellInfo()->Effects[EFFECT_0].MiscValue) * 0.1f; + float speedZ = playerTarget->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; + playerTarget->GetMotionMaster()->MoveJump(pos, speedXY, speedZ); + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_barim_repentance_pull_SpellScript::HandPullEffect, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_barim_repentance_pull_SpellScript(); + } +}; + +void AddSC_boss_high_prophet_barim() +{ + new boss_high_prophet_barim(); + new npc_barim_repentance(); + new npc_barim_harbinger_of_darkness(); + new npc_barim_blaze_of_the_heavens(); + new npc_barim_soul_fragment(); + new spell_barim_plague_of_ages_first(); + new spell_barim_plague_of_ages_second(); + new spell_barim_repentance_script(); + new spell_barim_repentance_pull(); +} diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp index d7c2a9cfdb..ea3be9c72c 100644 --- a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp +++ b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp @@ -21,12 +21,14 @@ ObjectData const creatureData[] = { - { BOSS_GENERAL_HUSAM, DATA_GENERAL_HUSAM }, - { BOSS_LOCKMAW, DATA_LOCKMAW }, - { BOSS_AUGH, DATA_AUGH }, - { BOSS_HIGH_PROPHET_BARIM, DATA_HIGH_PROPHET_BARIM }, - { BOSS_SIAMAT, DATA_SIAMAT }, - { 0, 0 } // End + { BOSS_GENERAL_HUSAM, DATA_GENERAL_HUSAM }, + { BOSS_LOCKMAW, DATA_LOCKMAW }, + { BOSS_AUGH, DATA_AUGH }, + { BOSS_HIGH_PROPHET_BARIM, DATA_HIGH_PROPHET_BARIM }, + { BOSS_SIAMAT, DATA_SIAMAT }, + { NPC_BLAZE_OF_THE_HEAVENS, DATA_BLAZE_OF_THE_HEAVENS }, + { NPC_HARBINGER_OF_DARKNESS, DATA_HARBINGER_OF_DARKNESS }, + { 0, 0 } // End }; ObjectData const gameObjectData[] = diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h index f23f2780ef..1107ed6934 100644 --- a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h +++ b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h @@ -26,30 +26,36 @@ uint32 const EncounterCount = 4; enum LCTDataTypes { // Encounter States - DATA_GENERAL_HUSAM = 1, - DATA_LOCKMAW = 2, - DATA_AUGH = 3, - DATA_HIGH_PROPHET_BARIM = 4, - DATA_SIAMAT = 5, + DATA_GENERAL_HUSAM = 1, + DATA_LOCKMAW = 2, + DATA_AUGH = 3, + DATA_HIGH_PROPHET_BARIM = 4, + DATA_SIAMAT = 5, // Additional Data - DATA_SIAMAT_PLATFORM = 6 + DATA_SIAMAT_PLATFORM = 6, + DATA_BLAZE_OF_THE_HEAVENS = 7, + DATA_HARBINGER_OF_DARKNESS = 8, }; enum LCTCreatureIds { // Bosses - BOSS_GENERAL_HUSAM = 44577, - BOSS_LOCKMAW = 43614, - BOSS_AUGH = 49045, - BOSS_HIGH_PROPHET_BARIM = 43612, - BOSS_SIAMAT = 44819, + BOSS_GENERAL_HUSAM = 44577, + BOSS_LOCKMAW = 43614, + BOSS_AUGH = 49045, + BOSS_HIGH_PROPHET_BARIM = 43612, + BOSS_SIAMAT = 44819, // Misc - NPC_BAD_INTENTIONS_TARGET = 44586, - NPC_SHOCKWAVE_STALKER = 44711, - NPC_SHOCKWAVE_VISUAL = 44712, - NPC_TOLVIR_LAND_MINE = 44796 + NPC_BAD_INTENTIONS_TARGET = 44586, + NPC_SHOCKWAVE_STALKER = 44711, + NPC_SHOCKWAVE_VISUAL = 44712, + NPC_TOLVIR_LAND_MINE = 44796, + NPC_REPENTANCE = 43817, + NPC_BLAZE_OF_THE_HEAVENS = 48906, + NPC_SOUL_FRAGMENT = 43934, + NPC_HARBINGER_OF_DARKNESS = 43927, }; enum LCTGameObjectIds diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index 4bdff3de27..c7c1033527 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -36,6 +36,7 @@ EndContentData */ #include "GridNotifiersImpl.h" #include "Cell.h" #include "CellImpl.h" +#include "GameObjectAI.h" /*### ## npc_belnistrasz for Quest 3525 "Extinguishing the Idol" @@ -127,7 +128,7 @@ public: me->DespawnOrUnsummon(5000); } - void sQuestAccept(Player* /*player*/, Quest const* quest) override + void QuestAccept(Player* /*player*/, Quest const* quest) override { if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL) { @@ -371,22 +372,31 @@ public: class go_gong : public GameObjectScript { -public: - go_gong() : GameObjectScript("go_gong") { } + public: + go_gong() : GameObjectScript("go_gong") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - InstanceScript* instance = go->GetInstanceScript(); - - if (instance) + struct go_gongAI : public GameObjectAI { - go->SendCustomAnim(0); - instance->SetData(DATA_WAVE, IN_PROGRESS); - return true; - } - return false; - } + go_gongAI(GameObject* go) : GameObjectAI(go) { } + bool GossipHello(Player* /*player*/) override + { + InstanceScript* instance = me->GetInstanceScript(); + + if (instance) + { + me->SendCustomAnim(0); + instance->SetData(DATA_WAVE, IN_PROGRESS); + return true; + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gongAI(go); + } }; void AddSC_razorfen_downs() diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp index bfd92dce47..64feea5015 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -51,7 +51,7 @@ public: { npc_willixAI(Creature* creature) : npc_escortAI(creature) { } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER) { diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 14ccca00ca..569f3a9105 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -22,6 +22,7 @@ #include "SpellInfo.h" #include "WorldPacket.h" #include "Opcodes.h" +#include "GameObjectAI.h" enum Texts { @@ -278,18 +279,28 @@ class go_ossirian_crystal : public GameObjectScript public: go_ossirian_crystal() : GameObjectScript("go_ossirian_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_ossirian_crystalAI : public GameObjectAI { - InstanceScript* Instance = player->GetInstanceScript(); - if (!Instance) - return false; + go_ossirian_crystalAI(GameObject* go) : GameObjectAI(go) { } - Creature* Ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f); - if (!Ossirian || Instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS) - return false; + bool GossipHello(Player* player) override + { + InstanceScript* Instance = player->GetInstanceScript(); + if (!Instance) + return false; - Ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS); - return true; + Creature* Ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f); + if (!Ossirian || Instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS) + return false; + + Ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ossirian_crystalAI(go); } }; diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index 36eb2f584b..250ea964ff 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -73,53 +73,6 @@ class npc_disciple_of_naralex : public CreatureScript public: npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - if (instance) - instance->SetData(DATA_NARALEX_EVENT, IN_PROGRESS); - - creature->AI()->Talk(SAY_MAKE_PREPARATIONS); - - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if(InstanceScript* instance = creature->GetInstanceScript()) - { - creature->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true); - if ((instance->GetBossState(DATA_LORD_COBRAHN) == DONE) && (instance->GetBossState(DATA_LORD_PYTHAS) == DONE) && - (instance->GetBossState(DATA_LADY_ANACONDRA) == DONE) && (instance->GetBossState(DATA_LORD_SERPENTIS) == DONE)) - { - AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, creature->GetGUID()); - - if (!instance->GetData(DATA_NARALEX_YELLED)) - { - creature->AI()->Talk(SAY_AT_LAST); - instance->SetData(DATA_NARALEX_YELLED, 1); - } - } - else - { - SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, creature->GetGUID()); - } - } - return true; - } - struct npc_disciple_of_naralexAI : public npc_escortAI { npc_disciple_of_naralexAI(Creature* creature) : npc_escortAI(creature) @@ -132,7 +85,53 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + InstanceScript* instance = me->GetInstanceScript(); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + if (instance) + instance->SetData(DATA_NARALEX_EVENT, IN_PROGRESS); + Talk(SAY_MAKE_PREPARATIONS); + + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + + Start(false, false, player->GetGUID()); + SetDespawnAtFar(false); + SetDespawnAtEnd(false); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + me->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true); + if ((instance->GetBossState(DATA_LORD_COBRAHN) == DONE) && (instance->GetBossState(DATA_LORD_PYTHAS) == DONE) && + (instance->GetBossState(DATA_LADY_ANACONDRA) == DONE) && (instance->GetBossState(DATA_LORD_SERPENTIS) == DONE)) + { + AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, me->GetGUID()); + + if (!instance->GetData(DATA_NARALEX_YELLED)) + { + Talk(SAY_AT_LAST); + instance->SetData(DATA_NARALEX_YELLED, 1); + } + } + else + { + SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, me->GetGUID()); + } + } + return true; + } void WaypointReached(uint32 waypointId) override { diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index ed166973fc..176f9da054 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "zulfarrak.h" #include "Player.h" +#include "GameObjectAI.h" /*###### ## npc_sergeant_bly @@ -57,37 +58,6 @@ class npc_sergeant_bly : public CreatureScript public: npc_sergeant_bly() : CreatureScript("npc_sergeant_bly") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID(); - creature->AI()->DoAction(0); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 1517, creature->GetGUID()); - } - else - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED) - SendGossipMenuFor(player, 1515, creature->GetGUID()); - else - SendGossipMenuFor(player, 1516, creature->GetGUID()); - return true; - } - return false; - } - CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); @@ -117,6 +87,38 @@ public: uint32 Revenge_Timer; //this is wrong, spell should never be used unless me->GetVictim() dodge, parry or block attack. Trinity support required. ObjectGuid PlayerGUID; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + PlayerGUID = player->GetGUID(); + DoAction(0); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 1517, me->GetGUID()); + } + else + if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED) + SendGossipMenuFor(player, 1515, me->GetGUID()); + else + SendGossipMenuFor(player, 1516, me->GetGUID()); + return true; + } + return false; + } + void Reset() override { Initialize(); @@ -204,32 +206,42 @@ class go_troll_cage : public GameObjectScript public: go_troll_cage() : GameObjectScript("go_troll_cage") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_troll_cageAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) - { - instance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN); - //set bly & co to aggressive & start moving to top of stairs - initBlyCrewMember(instance, ENTRY_BLY, 1884.99f, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_RAVEN, 1882.5f, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); - initBlyCrewMember(instance, ENTRY_WEEGLI, 1890, 1263, 41.52f); - initBlyCrewMember(instance, ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f); - } - return false; - } + go_troll_cageAI(GameObject* go) : GameObjectAI(go) { } -private: - void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) - { - if (Creature* crew = instance->instance->GetCreature(instance->GetGuidData(entry))) + bool GossipHello(Player* /*player*/) override { - crew->SetReactState(REACT_AGGRESSIVE); - crew->SetWalk(true); - crew->SetHomePosition(x, y, z, 0); - crew->GetMotionMaster()->MovePoint(1, x, y, z); - crew->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); + if (InstanceScript* instance = me->GetInstanceScript()) + { + instance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN); + //set bly & co to aggressive & start moving to top of stairs + initBlyCrewMember(instance, ENTRY_BLY, 1884.99f, 1263, 41.52f); + initBlyCrewMember(instance, ENTRY_RAVEN, 1882.5f, 1263, 41.52f); + initBlyCrewMember(instance, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f); + initBlyCrewMember(instance, ENTRY_WEEGLI, 1890, 1263, 41.52f); + initBlyCrewMember(instance, ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f); + } + return false; } + + private: + void initBlyCrewMember(InstanceScript* instance, uint32 entry, float x, float y, float z) const + { + if (Creature* crew = instance->instance->GetCreature(instance->GetGuidData(entry))) + { + crew->SetReactState(REACT_AGGRESSIVE); + crew->SetWalk(true); + crew->SetHomePosition(x, y, z, 0); + crew->GetMotionMaster()->MovePoint(1, x, y, z); + crew->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_troll_cageAI(go); } }; @@ -258,39 +270,6 @@ class npc_weegli_blastfuse : public CreatureScript public: npc_weegli_blastfuse() : CreatureScript("npc_weegli_blastfuse") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - //here we make him run to door, set the charge and run away off to nowhere - creature->AI()->DoAction(0); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(EVENT_PYRAMID)) - { - case PYRAMID_KILLED_ALL_TROLLS: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, 1514, creature->GetGUID()); //if event can proceed to end - break; - case PYRAMID_NOT_STARTED: - SendGossipMenuFor(player, 1511, creature->GetGUID()); //if event not started - break; - default: - SendGossipMenuFor(player, 1513, creature->GetGUID()); //if event are in progress - } - return true; - } - return false; - } - CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); @@ -311,6 +290,40 @@ public: bool destroyingDoor; InstanceScript* instance; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + //here we make him run to door, set the charge and run away off to nowhere + DestroyDoor(); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + { + switch (instance->GetData(EVENT_PYRAMID)) + { + case PYRAMID_KILLED_ALL_TROLLS: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 1514, me->GetGUID()); //if event can proceed to end + break; + case PYRAMID_NOT_STARTED: + SendGossipMenuFor(player, 1511, me->GetGUID()); //if event not started + break; + default: + SendGossipMenuFor(player, 1513, me->GetGUID()); //if event are in progress + } + return true; + } + return false; + } + void Reset() override { /*instance->SetData(0, NOT_STARTED);*/ @@ -368,11 +381,6 @@ public: }; } - void DoAction(int32 /*param*/) override - { - DestroyDoor(); - } - void DestroyDoor() { if (me->IsAlive()) @@ -402,24 +410,34 @@ enum ShallowGrave class go_shallow_grave : public GameObjectScript { -public: - go_shallow_grave() : GameObjectScript("go_shallow_grave") { } + public: + go_shallow_grave() : GameObjectScript("go_shallow_grave") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - // randomly summon a zombie or dead hero the first time a grave is used - if (go->GetUseCount() == 0) + struct go_shallow_graveAI : public GameObjectAI { - uint32 randomchance = urand(0, 100); - if (randomchance < CHANCE_ZOMBIE) - go->SummonCreature(NPC_ZOMBIE, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - else - if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO) - go->SummonCreature(NPC_DEAD_HERO, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + go_shallow_graveAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override + { + // randomly summon a zombie or dead hero the first time a grave is used + if (me->GetUseCount() == 0) + { + uint32 randomchance = urand(0, 100); + if (randomchance < CHANCE_ZOMBIE) + me->SummonCreature(NPC_ZOMBIE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + else + if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO) + me->SummonCreature(NPC_DEAD_HERO, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + } + me->AddUse(); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shallow_graveAI(go); } - go->AddUse(); - return false; - } }; /*###### diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp index 7e3382a269..d03254e618 100644 --- a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -95,6 +95,7 @@ void AddSC_zulfarrak(); void AddSC_instance_zulfarrak(); void AddSC_instance_lost_city_of_the_tolvir(); // Lost City of the Tol'Vir void AddSC_boss_general_husam(); +void AddSC_boss_high_prophet_barim(); void AddSC_instance_halls_of_origination(); //Halls of Origination void AddSC_boss_temple_guardian_anhuur(); void AddSC_boss_earthrager_ptah(); @@ -207,6 +208,7 @@ void AddKalimdorScripts() AddSC_instance_zulfarrak(); AddSC_instance_lost_city_of_the_tolvir(); // Lost City of the Tol'Vir AddSC_boss_general_husam(); + AddSC_boss_high_prophet_barim(); AddSC_instance_halls_of_origination(); //Halls of Origination AddSC_boss_temple_guardian_anhuur(); AddSC_boss_earthrager_ptah(); diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index d8a8affd13..748442a379 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -32,6 +32,7 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "Player.h" #include "SpellScript.h" +#include "GameObjectAI.h" /*#### # npc_ruul_snowhoof @@ -78,7 +79,7 @@ public: summoned->AI()->AttackStart(me); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_FREEDOM_TO_RUUL) { @@ -220,7 +221,7 @@ public: summoned->AI()->AttackStart(me); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_VORSHA) { @@ -327,20 +328,30 @@ class go_naga_brazier : public GameObjectScript public: go_naga_brazier() : GameObjectScript("go_naga_brazier") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_naga_brazierAI : public GameObjectAI { - if (Creature* creature = GetClosestCreatureWithEntry(go, NPC_MUGLASH, INTERACTION_DISTANCE*2)) + go_naga_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override { - if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI())) + if (Creature* creature = GetClosestCreatureWithEntry(me, NPC_MUGLASH, INTERACTION_DISTANCE * 2)) { - creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT); + if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI())) + { + creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT); - pEscortAI->_isBrazierExtinguished = true; - return false; + pEscortAI->_isBrazierExtinguished = true; + return false; + } } - } - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_naga_brazierAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 5718881c82..739e74e875 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -40,6 +40,7 @@ EndContentData */ #include "CellImpl.h" #include "GridNotifiersImpl.h" #include "GridNotifiers.h" +#include "GameObjectAI.h" /*###### ## npc_draenei_survivor @@ -228,11 +229,12 @@ public: Talk(ATTACK_YELL, who); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); me->SetFaction(FACTION_MONSTER); me->Attack(player, true); + return false; } void UpdateAI(uint32 diff) override @@ -358,7 +360,7 @@ public: Talk(SAY_AGGRO, who); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP) { @@ -627,23 +629,33 @@ enum RavegerCage class go_ravager_cage : public GameObjectScript { -public: - go_ravager_cage() : GameObjectScript("go_ravager_cage") { } + public: + go_ravager_cage() : GameObjectScript("go_ravager_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE) + struct go_ravager_cageAI : public GameObjectAI { - if (Creature* ravager = go->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + go_ravager_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - ravager->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - ravager->SetReactState(REACT_AGGRESSIVE); - ravager->AI()->AttackStart(player); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE) + { + if (Creature* ravager = me->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true)) + { + ravager->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + ravager->SetReactState(REACT_AGGRESSIVE); + ravager->AI()->AttackStart(player); + } + } + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ravager_cageAI(go); } - return true; - } }; class npc_death_ravager : public CreatureScript diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp index 21b30c68fc..9dfd78f52e 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -361,7 +361,7 @@ public: Initialize(); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_ENDING_THEIR_WORLD) { diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 6fee111cb4..33b7f161e3 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -102,25 +102,24 @@ public: me->DespawnOrUnsummon(60000); } } - }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) + bool GossipHello(Player* player) override { - player->TalkedToCreature(creature->GetEntry(), ObjectGuid::Empty); - player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); - } + if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) + { + player->TalkedToCreature(me->GetEntry(), ObjectGuid::Empty); + player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); + } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { return new npc_aged_dying_ancient_kodoAI(creature); } - }; void AddSC_desolace() diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 2f638dc5ff..1471253584 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "Group.h" #include "Player.h" +#include "GameObjectAI.h" /*##### # Quest: A Pawn on the Eternal Board @@ -949,60 +950,68 @@ class go_crystalline_tear : public GameObjectScript public: go_crystalline_tear() : GameObjectScript("go_crystalline_tear") { } - bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest) override + struct go_crystalline_tearAI : public GameObjectAI { - if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) + go_crystalline_tearAI(GameObject* go) : GameObjectAI(go) { } + + void QuestAccept(Player* player, Quest const* quest) override { - if (Creature* trigger = go->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100)) + if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) { - Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - - if (Merithra) + if (Creature* trigger = me->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100)) { - Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM); - Merithra->SetFaction(FACTION_FRIENDLY); - } + Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); + Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000); - if (Caelestrasz) - { - Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM); - Caelestrasz->SetFaction(FACTION_FRIENDLY); - } - - if (Arygos) - { - Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM); - Arygos->SetFaction(FACTION_FRIENDLY); - } - - if (Anachronos) - { - if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())) - anachronosAI->PlayerGUID = player->GetGUID(); - - if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) + if (Merithra) { - triggerAI->Failed = false; - triggerAI->PlayerGUID = player->GetGUID(); - triggerAI->EventStarted = true; - triggerAI->Announced = true; + Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM); + Merithra->SetFaction(FACTION_FRIENDLY); + } + + if (Caelestrasz) + { + Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM); + Caelestrasz->SetFaction(FACTION_FRIENDLY); + } + + if (Arygos) + { + Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM); + Arygos->SetFaction(FACTION_FRIENDLY); + } + + if (Anachronos) + { + if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI())) + anachronosAI->PlayerGUID = player->GetGUID(); + + if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI())) + { + triggerAI->Failed = false; + triggerAI->PlayerGUID = player->GetGUID(); + triggerAI->EventStarted = true; + triggerAI->Announced = true; + } } } } } - return true; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_crystalline_tearAI(go); + } }; /*### @@ -1117,241 +1126,251 @@ class go_wind_stone : public GameObjectScript public: go_wind_stone() : GameObjectScript("go_wind_stone") { } - private: - uint8 GetPlayerRank(Player* player) // For random summoning + struct go_wind_stoneAI : public GameObjectAI { - bool setAura = player->HasAura(AURA_TWILIGHT_SET); - bool medallionAura = player->HasAura(AURA_MEDALLION); - bool ringAura = player->HasAura(AURA_RING); + go_wind_stoneAI(GameObject* go) : GameObjectAI(go) { } - if (setAura && medallionAura && ringAura) - return 3; - else if (setAura && medallionAura) - return 2; - else if (setAura) - return 1; - else - return 0; - } - - uint8 GetItems(Player* player, WS type) - { - uint8 result = 0x0; - - switch (type) + bool GossipHello(Player* player) override { - case TEMPLAR: - { - if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_TEMPLAR_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_TEMPLAR_AIR)) - result |= AIR; - break; - } - case DUKE: - { - if (player->HasItemCount(ITEM_DUKE_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_DUKE_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_DUKE_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_DUKE_AIR)) - result |= AIR; - break; - } - case ROYAL: - { - if (player->HasItemCount(ITEM_ROYAL_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_ROYAL_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_ROYAL_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_ROYAL_AIR)) - result |= AIR; - break; - } - default: - break; - } - return result; - } + uint8 rank = GetPlayerRank(player); - void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) - { - go->CastSpell(player, spell); - TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); - summons->CastSpell(summons, SPELL_SPAWN_IN, false); - switch (summons->GetEntry()) - { - case NPC_TEMPLAR_FIRE: - case NPC_TEMPLAR_WATER: - case NPC_TEMPLAR_AIR: - case NPC_TEMPLAR_EARTH: - summons->AI()->Talk(SAY_TEMPLAR_AGGRO, player); - break; - - case NPC_DUKE_FIRE: - case NPC_DUKE_WATER: - case NPC_DUKE_EARTH: - case NPC_DUKE_AIR: - summons->AI()->Talk(SAY_DUKE_AGGRO, player); - break; - case NPC_ROYAL_FIRE: - case NPC_ROYAL_AIR: - case NPC_ROYAL_EARTH: - case NPC_ROYAL_WATER: - summons->AI()->Talk(YELL_ROYAL_AGGRO, player); - break; - } - summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summons->SendMeleeAttackStart(player); - summons->CombatStart(player); - } - - public: - bool OnGossipHello(Player* player, GameObject* go) override - { - uint8 rank = GetPlayerRank(player); - - uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); - switch (gossipId) - { - case GOSSIP_ID_LESSER_WS: + uint32 gossipId = me->GetGOInfo()->GetGossipMenuId(); + switch (gossipId) { - if (rank >= 1) // 1 or 2 or 3 - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else + case GOSSIP_ID_LESSER_WS: { - go->CastSpell(player, SPELL_PUNISHMENT); + if (rank >= 1) // 1 or 2 or 3 + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, TEMPLAR); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); break; } - - uint8 item = GetItems(player, TEMPLAR); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - break; - } - case GOSSIP_ID_WIND_STONE: - { - if (rank >= 2) // 2 or 3 - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - else + case GOSSIP_ID_WIND_STONE: { - go->CastSpell(player, SPELL_PUNISHMENT); + if (rank >= 2) // 2 or 3 + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, DUKE); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); break; } - - uint8 item = GetItems(player, DUKE); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - break; - } - case GOSSIP_ID_GREATER_WS: - { - if (rank == 3) // 3 - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - else + case GOSSIP_ID_GREATER_WS: { - go->CastSpell(player, SPELL_PUNISHMENT); + if (rank == 3) // 3 + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + else + { + me->CastSpell(player, SPELL_PUNISHMENT); + break; + } + + uint8 item = GetItems(player, ROYAL); + if (item & FIRE) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); + if (item & WATER) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); + if (item & EARTH) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); + if (item & AIR) + AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); break; } - - uint8 item = GetItems(player, ROYAL); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); - break; + default: + break; } - default: - break; + + SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID()); + return true; } - SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - player->PlayerTalkClass->SendCloseGossip(); - - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF + 1: - SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + player->PlayerTalkClass->SendCloseGossip(); - case GOSSIP_ACTION_INFO_DEF + 6: - SummonNPC(go, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 8: - SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); - break; + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + SummonNPC(me, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SummonNPC(me, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + SummonNPC(me, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + SummonNPC(me, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + SummonNPC(me, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); + break; - case GOSSIP_ACTION_INFO_DEF + 11: - SummonNPC(go, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 12: - SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 13: - SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 14: - SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 15: - SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); - break; + case GOSSIP_ACTION_INFO_DEF + 6: + SummonNPC(me, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + SummonNPC(me, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 8: + SummonNPC(me, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 9: + SummonNPC(me, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 10: + SummonNPC(me, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); + break; - default: - break; + case GOSSIP_ACTION_INFO_DEF + 11: + SummonNPC(me, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); + break; + case GOSSIP_ACTION_INFO_DEF + 12: + SummonNPC(me, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); + break; + case GOSSIP_ACTION_INFO_DEF + 13: + SummonNPC(me, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); + break; + case GOSSIP_ACTION_INFO_DEF + 14: + SummonNPC(me, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); + break; + case GOSSIP_ACTION_INFO_DEF + 15: + SummonNPC(me, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); + break; + + default: + break; + } + return true; } - return true; + + private: + uint8 GetPlayerRank(Player* player) const // For random summoning + { + bool setAura = player->HasAura(AURA_TWILIGHT_SET); + bool medallionAura = player->HasAura(AURA_MEDALLION); + bool ringAura = player->HasAura(AURA_RING); + + if (setAura && medallionAura && ringAura) + return 3; + else if (setAura && medallionAura) + return 2; + else if (setAura) + return 1; + else + return 0; + } + + uint8 GetItems(Player* player, WS type) const + { + uint8 result = 0x0; + + switch (type) + { + case TEMPLAR: + { + if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_TEMPLAR_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_TEMPLAR_AIR)) + result |= AIR; + break; + } + case DUKE: + { + if (player->HasItemCount(ITEM_DUKE_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_DUKE_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_DUKE_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_DUKE_AIR)) + result |= AIR; + break; + } + case ROYAL: + { + if (player->HasItemCount(ITEM_ROYAL_FIRE)) + result |= FIRE; + if (player->HasItemCount(ITEM_ROYAL_WATER)) + result |= WATER; + if (player->HasItemCount(ITEM_ROYAL_EARTH)) + result |= EARTH; + if (player->HasItemCount(ITEM_ROYAL_AIR)) + result |= AIR; + break; + } + default: + break; + } + return result; + } + + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) const + { + go->CastSpell(player, spell); + TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); + summons->CastSpell(summons, SPELL_SPAWN_IN, false); + switch (summons->GetEntry()) + { + case NPC_TEMPLAR_FIRE: + case NPC_TEMPLAR_WATER: + case NPC_TEMPLAR_AIR: + case NPC_TEMPLAR_EARTH: + summons->AI()->Talk(SAY_TEMPLAR_AGGRO, player); + break; + + case NPC_DUKE_FIRE: + case NPC_DUKE_WATER: + case NPC_DUKE_EARTH: + case NPC_DUKE_AIR: + summons->AI()->Talk(SAY_DUKE_AGGRO, player); + break; + case NPC_ROYAL_FIRE: + case NPC_ROYAL_AIR: + case NPC_ROYAL_EARTH: + case NPC_ROYAL_WATER: + summons->AI()->Talk(YELL_ROYAL_AGGRO, player); + break; + } + summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_wind_stoneAI(go); } }; diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 441aa4736e..3ed60b943c 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -194,22 +194,6 @@ class npc_OOX17 : public CreatureScript public: npc_OOX17() : CreatureScript("npc_OOX17") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == Q_OOX17) - { - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - creature->SetFullHealth(); - creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->Talk(SAY_OOX_START); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_OOX17::npc_OOX17AI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_OOX17AI(creature); @@ -219,6 +203,19 @@ public: { npc_OOX17AI(Creature* creature) : npc_escortAI(creature) { } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == Q_OOX17) + { + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + me->SetFullHealth(); + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + Talk(SAY_OOX_START); + Start(true, false, player->GetGUID()); + } + } + void WaypointReached(uint32 waypointId) override { if (Player* player = GetPlayerForEscort()) @@ -286,149 +283,143 @@ Position const ToWaterLoc = {-7032.664551f, -4906.199219f, -1.606446f, 0.0f}; class npc_tooga : public CreatureScript { -public: - npc_tooga() : CreatureScript("npc_tooga") { } + public: + npc_tooga() : CreatureScript("npc_tooga") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOOGA) + CreatureAI* GetAI(Creature* creature) const override { - if (npc_toogaAI* pToogaAI = CAST_AI(npc_tooga::npc_toogaAI, creature->AI())) - pToogaAI->StartFollow(player, FACTION_TOOG_ESCORTEE, quest); + return new npc_toogaAI(creature); } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_toogaAI(creature); - } - - struct npc_toogaAI : public FollowerAI - { - npc_toogaAI(Creature* creature) : FollowerAI(creature) + struct npc_toogaAI : public FollowerAI { - Initialize(); - } - - void Initialize() - { - CheckSpeechTimer = 2500; - PostEventTimer = 1000; - PhasePostEvent = 0; - - TortaGUID.Clear(); - } - - uint32 CheckSpeechTimer; - uint32 PostEventTimer; - uint32 PhasePostEvent; - - ObjectGuid TortaGUID; - - void Reset() override - { - Initialize(); - } - - void MoveInLineOfSight(Unit* who) override - { - FollowerAI::MoveInLineOfSight(who); - - if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE | STATE_FOLLOW_POSTEVENT) && who->GetEntry() == NPC_TORTA) + npc_toogaAI(Creature* creature) : FollowerAI(creature) { - if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) - { - Player* player = GetLeaderForFollower(); - if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) - player->GroupEventHappens(QUEST_TOOGA, me); - - TortaGUID = who->GetGUID(); - SetFollowComplete(true); - } - } - } - - void MovementInform(uint32 MotionType, uint32 PointId) override - { - FollowerAI::MovementInform(MotionType, PointId); - - if (MotionType != POINT_MOTION_TYPE) - return; - - if (PointId == POINT_ID_TO_WATER) - SetFollowComplete(); - } - - void UpdateFollowerAI(uint32 Diff) override - { - if (!UpdateVictim()) - { - //we are doing the post-event, or... - if (HasFollowState(STATE_FOLLOW_POSTEVENT)) - { - if (PostEventTimer <= Diff) - { - PostEventTimer = 5000; - - Creature* torta = ObjectAccessor::GetCreature(*me, TortaGUID); - if (!torta || !torta->IsAlive()) - { - //something happened, so just complete - SetFollowComplete(); - return; - } - - switch (PhasePostEvent) - { - case 1: - Talk(SAY_TOOG_POST_1); - break; - case 2: - torta->AI()->Talk(SAY_TORT_POST_2); - break; - case 3: - Talk(SAY_TOOG_POST_3); - break; - case 4: - torta->AI()->Talk(SAY_TORT_POST_4); - break; - case 5: - Talk(SAY_TOOG_POST_5); - break; - case 6: - torta->AI()->Talk(SAY_TORT_POST_6); - me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc); - break; - } - - ++PhasePostEvent; - } - else - PostEventTimer -= Diff; - } - //...we are doing regular speech check - else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) - { - if (CheckSpeechTimer <= Diff) - { - CheckSpeechTimer = 5000; - - if (urand(0, 9) > 8) - Talk(SAY_TOOG_WORRIED); - } - else - CheckSpeechTimer -= Diff; - } - - return; + Initialize(); } - DoMeleeAttackIfReady(); - } - }; + void Initialize() + { + CheckSpeechTimer = 2500; + PostEventTimer = 1000; + PhasePostEvent = 0; + TortaGUID.Clear(); + } + + uint32 CheckSpeechTimer; + uint32 PostEventTimer; + uint32 PhasePostEvent; + + ObjectGuid TortaGUID; + + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_TOOGA) + StartFollow(player, FACTION_TOOG_ESCORTEE, quest); + } + + void Reset() override + { + Initialize(); + } + + void MoveInLineOfSight(Unit* who) override + { + FollowerAI::MoveInLineOfSight(who); + + if (!me->GetVictim() && !HasFollowState(STATE_FOLLOW_COMPLETE | STATE_FOLLOW_POSTEVENT) && who->GetEntry() == NPC_TORTA) + { + if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE)) + { + Player* player = GetLeaderForFollower(); + if (player && player->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) + player->GroupEventHappens(QUEST_TOOGA, me); + + TortaGUID = who->GetGUID(); + SetFollowComplete(true); + } + } + } + + void MovementInform(uint32 MotionType, uint32 PointId) override + { + FollowerAI::MovementInform(MotionType, PointId); + + if (MotionType != POINT_MOTION_TYPE) + return; + + if (PointId == POINT_ID_TO_WATER) + SetFollowComplete(); + } + + void UpdateFollowerAI(uint32 Diff) override + { + if (!UpdateVictim()) + { + //we are doing the post-event, or... + if (HasFollowState(STATE_FOLLOW_POSTEVENT)) + { + if (PostEventTimer <= Diff) + { + PostEventTimer = 5000; + + Creature* torta = ObjectAccessor::GetCreature(*me, TortaGUID); + if (!torta || !torta->IsAlive()) + { + //something happened, so just complete + SetFollowComplete(); + return; + } + + switch (PhasePostEvent) + { + case 1: + Talk(SAY_TOOG_POST_1); + break; + case 2: + torta->AI()->Talk(SAY_TORT_POST_2); + break; + case 3: + Talk(SAY_TOOG_POST_3); + break; + case 4: + torta->AI()->Talk(SAY_TORT_POST_4); + break; + case 5: + Talk(SAY_TOOG_POST_5); + break; + case 6: + torta->AI()->Talk(SAY_TORT_POST_6); + me->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, ToWaterLoc); + break; + } + + ++PhasePostEvent; + } + else + PostEventTimer -= Diff; + } + //...we are doing regular speech check + else if (HasFollowState(STATE_FOLLOW_INPROGRESS)) + { + if (CheckSpeechTimer <= Diff) + { + CheckSpeechTimer = 5000; + + if (urand(0, 9) > 8) + Talk(SAY_TOOG_WORRIED); + } + else + CheckSpeechTimer -= Diff; + } + + return; + } + + DoMeleeAttackIfReady(); + } + }; }; void AddSC_tanaris() diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index de6d440af2..f2e45de0c7 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -55,13 +55,14 @@ class npc_beaten_corpse : public CreatureScript { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_OPTION_INSPECT_BODY && gossipListId == GOSSIP_OPTION_ID_BEATEN_CORPSE) { CloseGossipMenuFor(player); player->TalkedToCreature(me->GetEntry(), me->GetGUID()); } + return true; } }; @@ -96,21 +97,6 @@ class npc_gilthares : public CreatureScript public: npc_gilthares() : CreatureScript("npc_gilthares") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD) - { - creature->SetFaction(FACTION_ESCORTEE); - creature->SetStandState(UNIT_STAND_STATE_STAND); - - creature->AI()->Talk(SAY_GIL_START, player); - - if (npc_giltharesAI* pEscortAI = CAST_AI(npc_gilthares::npc_giltharesAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_giltharesAI(creature); @@ -120,6 +106,19 @@ public: { npc_giltharesAI(Creature* creature) : npc_escortAI(creature) { } + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD) + { + me->SetFaction(FACTION_ESCORTEE); + me->SetStandState(UNIT_STAND_STATE_STAND); + + Talk(SAY_GIL_START, player); + + Start(false, false, player->GetGUID(), quest); + } + } + void Reset() override { } void WaypointReached(uint32 waypointId) override @@ -486,7 +485,7 @@ public: Talk(SAY_TWIGGY_FLATHEAD_OVER); Reset(); } - else if (creature) // Makes BIG WILL attackable. + else // Makes BIG WILL attackable. { creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -646,19 +645,17 @@ public: DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE) + void QuestAccept(Player* player, Quest const* quest) override { - creature->SetFaction(FACTION_RATCHET); - creature->AI()->Talk(SAY_START); - if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCAPE) + { + me->SetFaction(FACTION_RATCHET); + Talk(SAY_START); + Start(true, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index 8a8de5d879..b2b3e291dd 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" enum Says { @@ -258,21 +259,7 @@ class npc_ranshalla : public CreatureScript { public: npc_ranshalla() : CreatureScript("npc_ranshalla") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR) - { - creature->AI()->Talk(SAY_QUEST_START); - creature->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); - if (npc_ranshallaAI* escortAI = dynamic_cast(creature->AI())) - escortAI->Start(false, false, player->GetGUID(), quest); - - return true; - } - - return false; - } CreatureAI* GetAI(Creature* creature) const override { return new npc_ranshallaAI(creature); @@ -299,6 +286,16 @@ public: ObjectGuid _voiceEluneGUID; ObjectGuid _altarGUID; + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR) + { + Talk(SAY_QUEST_START); + me->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); + Start(false, false, player->GetGUID(), quest); + } + } + void Reset() override { Initialize(); @@ -565,25 +562,35 @@ public: class go_elune_fire : public GameObjectScript { -public: - go_elune_fire() : GameObjectScript("go_elune_fire") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - // Check if we are using the torches or the altar - bool isAltar = false; + public: + go_elune_fire() : GameObjectScript("go_elune_fire") { } - if (go->GetEntry() == GO_ELUNE_ALTAR) - isAltar = true; - - if (Creature* ranshalla = GetClosestCreatureWithEntry(go, NPC_RANSHALLA, 10.0f)) + struct go_elune_fireAI : public GameObjectAI { - if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast(ranshalla->AI())) - escortAI->DoContinueEscort(isAltar); - } - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go_elune_fireAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* /*player*/) override + { + // Check if we are using the torches or the altar + bool isAltar = false; + + if (me->GetEntry() == GO_ELUNE_ALTAR) + isAltar = true; + + if (Creature* ranshalla = GetClosestCreatureWithEntry(me, NPC_RANSHALLA, 10.0f)) + { + if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast(ranshalla->AI())) + escortAI->DoContinueEscort(isAltar); + } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_elune_fireAI(go); + } }; void AddSC_winterspring() diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index 32e296a508..7e7a7d09b5 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -20,6 +20,7 @@ #include "SpellScript.h" #include "Player.h" #include "ahnkahet.h" +#include "GameObjectAI.h" enum Spells { @@ -380,33 +381,43 @@ class go_prince_taldaram_sphere : public GameObjectScript public: go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_prince_taldaram_sphereAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_prince_taldaram_sphereAI(GameObject* go) : GameObjectAI(go) { } - Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_PRINCE_TALDARAM)); - if (PrinceTaldaram && PrinceTaldaram->IsAlive()) + bool GossipHello(Player* /*player*/) override { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; - switch (go->GetEntry()) + Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM)); + if (PrinceTaldaram && PrinceTaldaram->IsAlive()) { - case GO_SPHERE_1: - instance->SetData(DATA_SPHERE_1, IN_PROGRESS); - PrinceTaldaram->AI()->Talk(SAY_1); - break; - case GO_SPHERE_2: - instance->SetData(DATA_SPHERE_2, IN_PROGRESS); - PrinceTaldaram->AI()->Talk(SAY_1); - break; - } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + switch (me->GetEntry()) + { + case GO_SPHERE_1: + instance->SetData(DATA_SPHERE_1, IN_PROGRESS); + PrinceTaldaram->AI()->Talk(SAY_1); + break; + case GO_SPHERE_2: + instance->SetData(DATA_SPHERE_2, IN_PROGRESS); + PrinceTaldaram->AI()->Talk(SAY_1); + break; + } + + ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_prince_taldaram_sphereAI(go); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index 7a5084bb1f..865b8e423e 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -34,7 +34,8 @@ enum ANDataTypes DATA_WATCHER_GASHRA, DATA_WATCHER_SILTHIK, DATA_ANUBARAK_WALL, - DATA_ANUBARAK_WALL_2 + DATA_ANUBARAK_WALL_2, + DATA_GATEWATCHER_GREET }; enum ANCreatureIds diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 27b4e7702b..58f791e9a4 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -130,7 +130,7 @@ class boss_krik_thir : public CreatureScript struct boss_krik_thirAI : public BossAI { - boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR), _hadGreet(false), _hadFrenzy(false), _petsInCombat(false), _watchersActive(0) { } + boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR), _hadFrenzy(false), _petsInCombat(false), _watchersActive(0) { } void SummonAdds() { @@ -216,9 +216,9 @@ class boss_krik_thir : public CreatureScript switch (action) { case -ACTION_GATEWATCHER_GREET: - if (!_hadGreet && me->IsAlive() && !me->IsInCombat() && !_petsInCombat) + if (!instance->GetData(DATA_GATEWATCHER_GREET) && me->IsAlive() && !me->IsInCombat() && !_petsInCombat) { - _hadGreet = true; + instance->SetData(DATA_GATEWATCHER_GREET, 1); Talk(SAY_PREFIGHT); } break; @@ -311,7 +311,6 @@ class boss_krik_thir : public CreatureScript } private: - bool _hadGreet; bool _hadFrenzy; bool _petsInCombat; uint8 _watchersActive; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 09253883c6..03ba3b4b26 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -67,6 +67,7 @@ class instance_azjol_nerub : public InstanceMapScript LoadBossBoundaries(boundaries); LoadDoorData(doorData); LoadObjectData(creatureData, gameobjectData); + GateWatcherGreet = 0; } void OnUnitDeath(Unit* who) override @@ -94,6 +95,32 @@ class instance_azjol_nerub : public InstanceMapScript return true; } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_GATEWATCHER_GREET: + return GateWatcherGreet; + default: + return 0; + } + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { + case DATA_GATEWATCHER_GREET: + GateWatcherGreet = data; + break; + default: + break; + } + } + + protected: + uint8 GateWatcherGreet; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 71487b5e04..88de9ff9d1 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -324,7 +324,7 @@ public: if (Creature* fetchVesp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VESPERON))) { - if (fetchVesp && fetchVesp->IsAlive() && !fetchVesp->GetVictim()) + if (fetchVesp->IsAlive() && !fetchVesp->GetVictim()) { _canUseWill = true; if (!fetchVesp->IsInCombat()) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 9bc4de0ae9..b448ce1bda 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -72,8 +72,7 @@ class boss_baltharus_the_warborn : public CreatureScript struct boss_baltharus_the_warbornAI : public BossAI { - boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN), - _cloneCount(0), _introDone(false) { } + boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN), _cloneCount(0) { } void Reset() override { @@ -90,9 +89,6 @@ class boss_baltharus_the_warborn : public CreatureScript switch (action) { case ACTION_INTRO_BALTHARUS: - if (_introDone) - return; - _introDone = true; me->setActive(true); events.ScheduleEvent(EVENT_INTRO_TALK, Seconds(7), 0, PHASE_INTRO); break; @@ -231,7 +227,6 @@ class boss_baltharus_the_warborn : public CreatureScript private: uint8 _cloneCount; - bool _introDone; }; CreatureAI* GetAI(Creature* creature) const override @@ -338,16 +333,22 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader { PrepareSpellScript(spell_baltharus_enervating_brand_trigger_SpellScript); - void CheckDistance() + bool Validate(SpellInfo const* /*spell*/) override { - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true); + return ValidateSpellInfo({ SPELL_SIPHONED_MIGHT }); + } + + void HandleSiphonedMight() + { + if (SpellInfo const* spellInfo = GetTriggeringSpell()) + if (Aura* triggerAura = GetCaster()->GetAura(spellInfo->Id)) + if (Unit* caster = triggerAura->GetCaster()) + GetHitUnit()->CastSpell(caster, SPELL_SIPHONED_MIGHT, true); } void Register() override { - OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::CheckDistance); + OnHit += SpellHitFn(spell_baltharus_enervating_brand_trigger_SpellScript::HandleSiphonedMight); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 473d08abf9..46a74d8411 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1364,7 +1364,7 @@ class go_twilight_portal : public GameObjectScript } } - bool GossipHello(Player* player, bool /*reportUse*/) override + bool GossipHello(Player* player) override { if (_spellId != 0) player->CastSpell(player, _spellId, true); @@ -1379,7 +1379,7 @@ class go_twilight_portal : public GameObjectScript if (!_deleted) { _deleted = true; - go->Delete(); + me->Delete(); } } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp index d298c35dd0..e9ed41f0fe 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp @@ -150,12 +150,12 @@ class npc_xerestrasza : public CreatureScript } }; -class at_baltharus_plateau : public AreaTriggerScript +class at_baltharus_plateau : public OnlyOnceAreaTriggerScript { public: - at_baltharus_plateau() : AreaTriggerScript("at_baltharus_plateau") { } + at_baltharus_plateau() : OnlyOnceAreaTriggerScript("at_baltharus_plateau") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { // Only trigger once if (InstanceScript* instance = player->GetInstanceScript()) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 0b6c7738cc..663df7faf2 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -224,7 +224,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) { DoCast(target, SPELL_HAMMER_JUSTICE); DoCast(target, SPELL_HAMMER_RIGHTEOUS); @@ -350,7 +350,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_HOLY_FIRE); } if (me->HasAura(SPELL_SHIELD)) @@ -363,7 +363,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_SMITE); } if (me->HasAura(SPELL_SHIELD)) @@ -456,7 +456,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_OLD_WOUNDS); } uiOldWoundsTimer = 12000; @@ -472,7 +472,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_SHADOWS_PAST); } uiShadowPastTimer = 5000; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index e5b749c5da..8e4400a285 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -197,7 +197,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_DEATH_RESPITE); } uiDeathRespiteTimer = urand(15000, 16000); @@ -225,7 +225,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_DESECRATION); } uiDesecration = urand(15000, 16000); @@ -252,7 +252,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, SPELL_MARKED_DEATH); } uiMarkedDeathTimer = urand(5000, 7000); @@ -333,7 +333,7 @@ public: { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) { - if (target && target->IsAlive()) + if (target->IsAlive()) DoCast(target, (SPELL_LEAP)); } uiAttackTimer = 3500; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index 708db6bb8d..3bb4a121d6 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -446,49 +446,49 @@ public: break; } } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + + if (instance && + ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && + instance->GetData(BOSS_BLACK_KNIGHT) == DONE && + instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) || + instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)) + return false; + + if (instance && + instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED && + instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && + instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED && + instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + StartEncounter(); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance && - ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && - instance->GetData(BOSS_BLACK_KNIGHT) == DONE && - instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) || - instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)) - return false; - - if (instance && - instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED && - instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && - instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED && - instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); - } - - return true; - } }; void AddSC_trial_of_the_champion() diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 3b1e84d5ee..598caddd72 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -514,20 +514,20 @@ class npc_essence_of_twin : public CreatureScript return spellReturned; } + + bool GossipHello(Player* player) override + { + player->RemoveAurasDueToSpell(GetData(ESSENCE_REMOVE)); + player->CastSpell(player, GetData(ESSENCE_APPLY), true); + CloseGossipMenuFor(player); + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_essence_of_twinAI(creature); }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - player->RemoveAurasDueToSpell(creature->GetAI()->GetData(ESSENCE_REMOVE)); - player->CastSpell(player, creature->GetAI()->GetData(ESSENCE_APPLY), true); - CloseGossipMenuFor(player); - return true; - } }; struct npc_unleashed_ballAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 711be2c577..86b16216d9 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -123,92 +123,92 @@ class npc_announcer_toc10 : public CreatureScript } void AttackStart(Unit* /*who*/) override { } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return true; + + char const* _message = "We are ready!"; + + if (player->IsInCombat() || instance->IsEncounterInProgress()) + return true; + + uint8 i = 0; + for (; i < NUM_MESSAGES; ++i) + { + if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE) + || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); + break; + } + } + + if (i >= NUM_MESSAGES) + return false; + + SendGossipMenuFor(player, _GossipMessage[i].msgnum, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return true; + + if (instance->GetBossState(BOSS_BEASTS) != DONE) + { + instance->SetData(TYPE_EVENT, 110); + instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); + instance->SetBossState(BOSS_BEASTS, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) + { + // if Jaraxxus is spawned, but the raid wiped + if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) + { + jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); + jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); + jaraxxus->SetReactState(REACT_DEFENSIVE); + jaraxxus->SetInCombatWithZone(); + } + else + { + instance->SetData(TYPE_EVENT, 1010); + instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); + } + } + else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) + { + if (player->GetTeam() == ALLIANCE) + instance->SetData(TYPE_EVENT, 3000); + else + instance->SetData(TYPE_EVENT, 3001); + instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) + { + instance->SetData(TYPE_EVENT, 4000); + instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_LICH_KING) != DONE) + { + if (me->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE) + instance->SetData(TYPE_EVENT, 4020); + else + instance->SetData(TYPE_EVENT, 4030); + instance->SetBossState(BOSS_LICH_KING, NOT_STARTED); + } + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return true; + } }; - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - char const* _message = "We are ready!"; - - if (player->IsInCombat() || instance->IsEncounterInProgress()) - return true; - - uint8 i = 0; - for (; i < NUM_MESSAGES; ++i) - { - if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE) - || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); - break; - } - } - - if (i >= NUM_MESSAGES) - return false; - - SendGossipMenuFor(player, _GossipMessage[i].msgnum, creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override - { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - if (instance->GetBossState(BOSS_BEASTS) != DONE) - { - instance->SetData(TYPE_EVENT, 110); - instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); - instance->SetBossState(BOSS_BEASTS, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) - { - // if Jaraxxus is spawned, but the raid wiped - if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) - { - jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); - jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); - jaraxxus->SetReactState(REACT_DEFENSIVE); - jaraxxus->SetInCombatWithZone(); - } - else - { - instance->SetData(TYPE_EVENT, 1010); - instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); - } - } - else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) - { - if (player->GetTeam() == ALLIANCE) - instance->SetData(TYPE_EVENT, 3000); - else - instance->SetData(TYPE_EVENT, 3001); - instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) - { - instance->SetData(TYPE_EVENT, 4000); - instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_LICH_KING) != DONE) - { - if (creature->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE) - instance->SetData(TYPE_EVENT, 4020); - else - instance->SetData(TYPE_EVENT, 4030); - instance->SetBossState(BOSS_LICH_KING, NOT_STARTED); - } - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_announcer_toc10AI(creature); diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index 4e11e4afdb..ca15dec665 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -99,7 +99,7 @@ public: Initialize(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID) { @@ -109,6 +109,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override @@ -196,7 +197,7 @@ public: Initialize(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID) { @@ -206,6 +207,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index eb3cb7ed7b..f0ecdc07dc 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -343,20 +343,6 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript public: npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL) - { - ClearGossipMenuFor(player); - return true; - } - - // load default gossip - return false; - } - struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI { npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature) @@ -364,7 +350,21 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript _instance = me->GetInstanceScript(); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL) + { + ClearGossipMenuFor(player); + return true; + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -383,6 +383,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript default: break; } + return false; } void Reset() override @@ -790,21 +791,6 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript public: npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) - { - player->PrepareGossipMenu(creature, creature->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); - player->SendPreparedGossip(creature); - return true; - } - - // load default gossip - return false; - } - struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI { npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature), @@ -858,7 +844,22 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) + { + player->PrepareGossipMenu(me, me->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); + player->SendPreparedGossip(me); + return true; + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -872,6 +873,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript default: break; } + return false; } void DestroyIceWall() diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 8ceceeff8e..cec1d885e7 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -545,18 +545,18 @@ class spell_tyrannus_rimefang_icy_blast : public SpellScriptLoader } }; -class at_tyrannus_event_starter : public AreaTriggerScript +class at_tyrannus_event_starter : public OnlyOnceAreaTriggerScript { public: - at_tyrannus_event_starter() : AreaTriggerScript("at_tyrannus_event_starter") { } + at_tyrannus_event_starter() : OnlyOnceAreaTriggerScript("at_tyrannus_event_starter") { } - bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override + bool _OnTrigger(Player* player, const AreaTriggerEntry * /*at*/) override { InstanceScript* instance = player->GetInstanceScript(); if (player->IsGameMaster() || !instance) return false; - if (instance->GetBossState(DATA_TYRANNUS) != IN_PROGRESS && instance->GetBossState(DATA_TYRANNUS) != DONE) + if (instance->GetBossState(DATA_TYRANNUS) != DONE) if (Creature* tyrannus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_TYRANNUS))) { tyrannus->AI()->DoAction(ACTION_START_INTRO); diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index b35b4f7696..244d5aa918 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -20,6 +20,7 @@ #include "ScriptMgr.h" #include "gundrak.h" #include "EventMap.h" +#include "GameObjectAI.h" DoorData const doorData[] = { @@ -350,18 +351,28 @@ class go_gundrak_altar : public GameObjectScript public: go_gundrak_altar() : GameObjectScript("go_gundrak_altar") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_gundrak_altarAI : public GameObjectAI { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + go_gundrak_altarAI(GameObject* go) : GameObjectAI(go) { } - if (InstanceScript* instance = go->GetInstanceScript()) + bool GossipHello(Player* /*player*/) override { - instance->SetData(DATA_STATUE_ACTIVATE, go->GetEntry()); - return true; - } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - return false; + if (InstanceScript* instance = me->GetInstanceScript()) + { + instance->SetData(DATA_STATUE_ACTIVATE, me->GetEntry()); + return true; + } + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gundrak_altarAI(go); } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 49697f757a..abc0d22162 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -215,7 +215,7 @@ class boss_blood_council_controller : public CreatureScript struct boss_blood_council_controllerAI : public BossAI { - boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL), _intro(true) + boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) { Initialize(); SetCombatMovement(false); @@ -233,7 +233,7 @@ class boss_blood_council_controller : public CreatureScript Initialize(); me->SummonCreatureGroup(SUMMON_PRINCES_GROUP); - if (!_intro) + if (!instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO)) for (uint32 bossData : PrincesData) if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) { @@ -303,7 +303,7 @@ class boss_blood_council_controller : public CreatureScript uint32 GetData(uint32 data) const override { - if (data == DATA_INTRO && !_intro) + if (data == DATA_INTRO && !instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO)) return DATA_INTRO_DONE; return 0; } @@ -330,9 +330,9 @@ class boss_blood_council_controller : public CreatureScript void DoAction(int32 actionId) override { - if (actionId == ACTION_START_INTRO && _intro && instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) + if (actionId == ACTION_START_INTRO && instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO) && instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) { - _intro = false; + instance->SetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO, 0); if (Creature* bloodQueen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL))) bloodQueen->AI()->DoAction(ACTION_START_INTRO); } @@ -417,7 +417,6 @@ class boss_blood_council_controller : public CreatureScript uint32 _invocationStage; uint32 _resetCounter; - bool _intro; }; CreatureAI* GetAI(Creature* creature) const override @@ -998,7 +997,7 @@ class npc_ball_of_flame : public CreatureScript { // need to clear states now because this call is before AuraEffect is fully removed me->ClearUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED); - if (target && me->Attack(target, true)) + if (me->Attack(target, true)) me->GetMotionMaster()->MoveChase(target, 1.0f); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 2e074d8c73..cea762cca3 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -635,13 +635,14 @@ class npc_high_overlord_saurfang_icc : public CreatureScript _events.Reset(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId == GOSSIP_MENU_HIGH_OVERLORD_SAURFANG) { player->PlayerTalkClass->SendCloseGossip(); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override @@ -831,13 +832,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript _events.Reset(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId == GOSSIP_MENU_MURADIN_BRONZEBEARD) { player->PlayerTalkClass->SendCloseGossip(); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 0e4e9a1ee6..f2fcf44fd8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -962,7 +962,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript } } - void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -972,6 +972,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_SUMMON_SKYBREAKER, 24600, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_3, 29600, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_4, 39200, 0, PHASE_INTRO); + return false; } void DamageTaken(Unit* , uint32& damage) override @@ -1230,7 +1231,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript } } - void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -1241,6 +1242,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_A_3, 33000, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_4, 39000, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_5, 45000, 0, PHASE_INTRO); + return false; } void DamageTaken(Unit* , uint32& damage) override @@ -1395,10 +1397,11 @@ class npc_zafod_boombox : public CreatureScript me->SetReactState(REACT_PASSIVE); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { player->AddItem(ITEM_GOBLIN_ROCKET_PACK, 1); player->PlayerTalkClass->SendCloseGossip(); + return false; } void UpdateAI(uint32 /*diff*/) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index dad8012106..765b871794 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -199,7 +199,7 @@ class boss_lady_deathwhisper : public CreatureScript struct boss_lady_deathwhisperAI : public BossAI { boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER), - _dominateMindCount(RAID_MODE(0, 1, 1, 3)), _introDone(false) + _dominateMindCount(RAID_MODE(0, 1, 1, 3)) { Initialize(); } @@ -233,43 +233,39 @@ class boss_lady_deathwhisper : public CreatureScript if (action != ACTION_START_INTRO) return; - if (!_introDone) + Talk(SAY_INTRO_1); + _phase = PHASE_INTRO; + scheduler.Schedule(Seconds(10), GROUP_INTRO, [this](TaskContext context) { - _introDone = true; - Talk(SAY_INTRO_1); - _phase = PHASE_INTRO; - scheduler.Schedule(Seconds(10), GROUP_INTRO, [this](TaskContext context) + switch (context.GetRepeatCounter()) { - switch (context.GetRepeatCounter()) - { - case 0: - Talk(SAY_INTRO_2); - context.Repeat(Seconds(21)); - break; - case 1: - Talk(SAY_INTRO_3); - context.Repeat(Seconds(11)); - break; - case 2: - Talk(SAY_INTRO_4); - context.Repeat(Seconds(9)); - break; - case 3: - Talk(SAY_INTRO_5); - context.Repeat(Seconds(21)); - break; - case 4: - Talk(SAY_INTRO_6); - context.Repeat(Seconds(10)); - break; - case 5: - Talk(SAY_INTRO_7); - return; - default: - break; - } - }); - } + case 0: + Talk(SAY_INTRO_2); + context.Repeat(Seconds(21)); + break; + case 1: + Talk(SAY_INTRO_3); + context.Repeat(Seconds(11)); + break; + case 2: + Talk(SAY_INTRO_4); + context.Repeat(Seconds(9)); + break; + case 3: + Talk(SAY_INTRO_5); + context.Repeat(Seconds(21)); + break; + case 4: + Talk(SAY_INTRO_6); + context.Repeat(Seconds(10)); + break; + case 5: + Talk(SAY_INTRO_7); + return; + default: + break; + } + }); } void AttackStart(Unit* victim) override @@ -580,7 +576,6 @@ class boss_lady_deathwhisper : public CreatureScript uint32 _waveCounter; uint8 const _dominateMindCount; uint8 _phase; - bool _introDone; }; CreatureAI* GetAI(Creature* creature) const override @@ -1017,12 +1012,12 @@ class spell_deathwhisper_mana_barrier : public SpellScriptLoader } }; -class at_lady_deathwhisper_entrance : public AreaTriggerScript +class at_lady_deathwhisper_entrance : public OnlyOnceAreaTriggerScript { public: - at_lady_deathwhisper_entrance() : AreaTriggerScript("at_lady_deathwhisper_entrance") { } + at_lady_deathwhisper_entrance() : OnlyOnceAreaTriggerScript("at_lady_deathwhisper_entrance") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 5b616ff024..d27ec7fb40 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -135,7 +135,6 @@ class boss_lord_marrowgar : public CreatureScript _boneStormDuration = RAID_MODE(20000, 30000, 20000, 30000); _baseSpeed = creature->GetSpeedRate(MOVE_RUN); _coldflameLastPos.Relocate(creature); - _introDone = false; _boneSlice = false; } @@ -150,7 +149,6 @@ class boss_lord_marrowgar : public CreatureScript events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL); events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000)); events.ScheduleEvent(EVENT_ENRAGE, 600000); - _introDone = false; _boneSlice = false; _boneSpikeImmune.clear(); } @@ -328,11 +326,7 @@ class boss_lord_marrowgar : public CreatureScript _boneSpikeImmune.clear(); break; case ACTION_TALK_ENTER_ZONE: - if (!_introDone) - { Talk(SAY_ENTER_ZONE); - _introDone = true; - } break; default: break; @@ -345,7 +339,6 @@ class boss_lord_marrowgar : public CreatureScript ObjectGuid _coldflameTarget; uint32 _boneStormDuration; float _baseSpeed; - bool _introDone; bool _boneSlice; }; @@ -760,12 +753,12 @@ class spell_marrowgar_bone_slice : public SpellScriptLoader } }; -class at_lord_marrowgar_entrance : public AreaTriggerScript +class at_lord_marrowgar_entrance : public OnlyOnceAreaTriggerScript { public: - at_lord_marrowgar_entrance() : AreaTriggerScript("at_lord_marrowgar_entrance") { } + at_lord_marrowgar_entrance() : OnlyOnceAreaTriggerScript("at_lord_marrowgar_entrance") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (Creature* lordMarrowgar = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LORD_MARROWGAR))) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index bed297de5c..446f9c4afa 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -219,7 +219,7 @@ class boss_sindragosa : public CreatureScript struct boss_sindragosaAI : public BossAI { - boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false) + boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA) { Initialize(); } @@ -244,7 +244,7 @@ class boss_sindragosa : public CreatureScript events.ScheduleEvent(EVENT_AIR_PHASE, 50000); Initialize(); - if (!_summoned) + if (instance->GetData(DATA_SINDRAGOSA_INTRO)) { me->SetCanFly(true); me->SetDisableGravity(true); @@ -304,10 +304,8 @@ class boss_sindragosa : public CreatureScript { if (action == ACTION_START_FROSTWYRM) { - if (_summoned) - return; - _summoned = true; + instance->SetData(DATA_SINDRAGOSA_INTRO, 0); if (TempSummon* summon = me->ToTempSummon()) summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); @@ -558,7 +556,6 @@ class boss_sindragosa : public CreatureScript uint8 _mysticBuffetStack; bool _isInAirPhase; bool _isThirdPhase; - bool _summoned; }; CreatureAI* GetAI(Creature* creature) const override @@ -1624,12 +1621,12 @@ public: } }; -class at_sindragosa_lair : public AreaTriggerScript +class at_sindragosa_lair : public OnlyOnceAreaTriggerScript { public: - at_sindragosa_lair() : AreaTriggerScript("at_sindragosa_lair") { } + at_sindragosa_lair() : OnlyOnceAreaTriggerScript("at_sindragosa_lair") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index a4e857fc51..078b2dd513 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1202,7 +1202,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->LoadEquipment(1); // remove glow on ashbringer } - void sGossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override { if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -1211,6 +1211,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro); } + return false; } void JustReachedHome() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 104df273ad..067520caf0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -717,12 +717,22 @@ class npc_alchemist_adrianna : public CreatureScript public: npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_alchemist_adriannaAI : public ScriptedAI { - if (!creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) - if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) - creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false); - return false; + npc_alchemist_adriannaAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + if (!me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) + if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) + me->CastSpell(me, SPELL_HARVEST_BLIGHT_SPECIMEN, false); + return false; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_alchemist_adriannaAI(creature); } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 8607714ff9..94a0a21bc7 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -116,7 +116,9 @@ enum ICDataTypes DATA_TERENAS_MENETHIL = 39, DATA_ENEMY_GUNSHIP = 40, DATA_UPPERSPIRE_TELE_ACT = 41, /// also used by conditions - DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42 + DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42, + DATA_BLOOD_PRINCE_COUNCIL_INTRO = 43, + DATA_SINDRAGOSA_INTRO = 44 }; enum ICCreaturesIds diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index d4b38cad22..c674d1bfdf 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -145,6 +145,8 @@ class instance_icecrown_citadel : public InstanceMapScript UpperSpireTeleporterActiveState = NOT_STARTED; BloodQuickeningState = NOT_STARTED; BloodQuickeningMinutes = 0; + BloodPrinceIntro = 1; + SindragosaIntro = 1; } // A function to help reduce the number of lines for teleporter management. @@ -730,6 +732,10 @@ class instance_icecrown_citadel : public InstanceMapScript return BloodQuickeningState; case DATA_HEROIC_ATTEMPTS: return HeroicAttempts; + case DATA_BLOOD_PRINCE_COUNCIL_INTRO: + return BloodPrinceIntro; + case DATA_SINDRAGOSA_INTRO: + return SindragosaIntro; default: break; } @@ -1104,6 +1110,12 @@ class instance_icecrown_citadel : public InstanceMapScript SaveToDB(); } break; + case DATA_BLOOD_PRINCE_COUNCIL_INTRO: + BloodPrinceIntro = data; + break; + case DATA_SINDRAGOSA_INTRO: + SindragosaIntro = data; + break; default: break; } @@ -1518,6 +1530,8 @@ class instance_icecrown_citadel : public InstanceMapScript uint32 BloodQuickeningState; uint32 HeroicAttempts; uint16 BloodQuickeningMinutes; + uint8 BloodPrinceIntro; + uint8 SindragosaIntro; bool IsBonedEligible; bool IsOozeDanceEligible; bool IsNauseaEligible; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 371b250358..9df479f51c 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -237,20 +237,19 @@ public: }; -class at_anubrekhan_entrance : public AreaTriggerScript +class at_anubrekhan_entrance : public OnlyOnceAreaTriggerScript { public: - at_anubrekhan_entrance() : AreaTriggerScript("at_anubrekhan_entrance") { } + at_anubrekhan_entrance() : OnlyOnceAreaTriggerScript("at_anubrekhan_entrance") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetData(DATA_HAD_ANUBREKHAN_GREET) || instance->GetBossState(BOSS_ANUBREKHAN) != NOT_STARTED) + if (!instance || instance->GetBossState(BOSS_ANUBREKHAN) != NOT_STARTED) return true; if (Creature* anub = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_ANUBREKHAN))) anub->AI()->Talk(SAY_GREET); - instance->SetData(DATA_HAD_ANUBREKHAN_GREET, 1u); return true; } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index 2814a504b1..db1f7975e8 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -259,20 +259,19 @@ class achievement_momma_said_knock_you_out : public AchievementCriteriaScript } }; -class at_faerlina_entrance : public AreaTriggerScript +class at_faerlina_entrance : public OnlyOnceAreaTriggerScript { public: - at_faerlina_entrance() : AreaTriggerScript("at_faerlina_entrance") { } + at_faerlina_entrance() : OnlyOnceAreaTriggerScript("at_faerlina_entrance") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetData(DATA_HAD_FAERLINA_GREET) || instance->GetBossState(BOSS_FAERLINA) != NOT_STARTED) + if (!instance || instance->GetBossState(BOSS_FAERLINA) != NOT_STARTED) return true; if (Creature* faerlina = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_FAERLINA))) faerlina->AI()->Talk(SAY_GREET); - instance->SetData(DATA_HAD_FAERLINA_GREET, 1u); return true; } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index c8064e169d..d97cc9fa59 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -73,11 +73,6 @@ enum Events EVENT_CHECK_RESISTS }; -enum Actions -{ - ACTION_BIRTH = 1 -}; - enum Misc { NPC_BLIZZARD = 16474, @@ -86,11 +81,35 @@ enum Misc // The Hundred Club DATA_THE_HUNDRED_CLUB = 21462147, - MAX_FROST_RESISTANCE = 100 + MAX_FROST_RESISTANCE = 100, + ACTION_BIRTH = 1, + DATA_BLIZZARD_TARGET }; typedef std::map IceBlockMap; +class BlizzardTargetSelector +{ +public: + BlizzardTargetSelector(std::vector const& blizzards) : _blizzards(blizzards) { } + + bool operator()(Unit* unit) const + { + if (unit->GetTypeId() != TYPEID_PLAYER) + return false; + + // Check if unit is target of some blizzard + for (Unit* blizzard : _blizzards) + if (blizzard->GetAI()->GetGUID(DATA_BLIZZARD_TARGET) == unit->GetGUID()) + return false; + + return true; + } + +private: + std::vector const& _blizzards; +}; + class boss_sapphiron : public CreatureScript { public: @@ -224,6 +243,24 @@ class boss_sapphiron : public CreatureScript return 0; } + ObjectGuid GetGUID(int32 data) const override + { + if (data == DATA_BLIZZARD_TARGET) + { + // Filtering blizzards from summon list + std::vector blizzards; + for (ObjectGuid summonGuid : summons) + if (summonGuid.GetEntry() == NPC_BLIZZARD) + if (Unit* temp = ObjectAccessor::GetUnit(*me, summonGuid)) + blizzards.push_back(temp); + + if (Unit* newTarget = me->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1, BlizzardTargetSelector(blizzards))) + return newTarget->GetGUID(); + } + + return ObjectGuid::Empty; + } + void UpdateAI(uint32 diff) override { events.Update(diff); @@ -368,7 +405,7 @@ class boss_sapphiron : public CreatureScript } private: - std::vector _iceboltTargets; + GuidVector _iceboltTargets; ObjectGuid _buffet; bool _delayedDrain; bool _canTheHundredClub; @@ -380,6 +417,41 @@ class boss_sapphiron : public CreatureScript } }; +struct npc_sapphiron_blizzard : public ScriptedAI +{ + npc_sapphiron_blizzard(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + me->SetReactState(REACT_PASSIVE); + _scheduler.Schedule(Seconds(3), [this](TaskContext chill) + { + DoCastSelf(me->m_spells[0], true); + chill.Repeat(); + }); + } + + ObjectGuid GetGUID(int32 data) const override + { + return data == DATA_BLIZZARD_TARGET ? _targetGuid : ObjectGuid::Empty; + } + + void SetGUID(ObjectGuid guid, int32 data) override + { + if (data == DATA_BLIZZARD_TARGET) + _targetGuid = guid; + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; + ObjectGuid _targetGuid; +}; + class go_sapphiron_birth : public GameObjectScript { public: @@ -389,21 +461,21 @@ class go_sapphiron_birth : public GameObjectScript { go_sapphiron_birthAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - void OnStateChanged(uint32 state, Unit* who) override + void OnLootStateChanged(uint32 state, Unit* who) override { if (state == GO_ACTIVATED) { if (who) { - if (Creature* sapphiron = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_SAPPHIRON))) + if (Creature* sapphiron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SAPPHIRON))) sapphiron->AI()->DoAction(ACTION_BIRTH); instance->SetData(DATA_HAD_SAPPHIRON_BIRTH, 1u); } } else if (state == GO_JUST_DEACTIVATED) { // prevent ourselves from going back to _READY and resetting the client anim - go->SetRespawnTime(0); - go->Delete(); + me->SetRespawnTime(0); + me->Delete(); } } @@ -431,11 +503,12 @@ class spell_sapphiron_change_blizzard_target : public SpellScriptLoader TempSummon* me = GetTarget()->ToTempSummon(); if (Creature* owner = me ? me->GetSummonerCreatureBase() : nullptr) { - Unit* newTarget = owner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true); - if (!newTarget) - newTarget = owner->getAttackerForHelper(); - if (newTarget) + me->GetAI()->SetGUID(ObjectGuid::Empty, DATA_BLIZZARD_TARGET); + if (Unit* newTarget = ObjectAccessor::GetUnit(*owner, owner->AI()->GetGUID(DATA_BLIZZARD_TARGET))) + { + me->GetAI()->SetGUID(newTarget->GetGUID(), DATA_BLIZZARD_TARGET); me->GetMotionMaster()->MoveFollow(newTarget, 0.1f, 0.0f); + } else { me->StopMoving(); @@ -528,8 +601,10 @@ class spell_sapphiron_summon_blizzard : public SpellScriptLoader blizzard->CastSpell(nullptr, blizzard->m_spells[0], TRIGGERED_NONE); if (Creature* creatureCaster = GetCaster()->ToCreature()) { - if (Unit* newTarget = creatureCaster->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + blizzard->AI()->SetGUID(ObjectGuid::Empty, DATA_BLIZZARD_TARGET); + if (Unit* newTarget = ObjectAccessor::GetUnit(*creatureCaster, creatureCaster->AI()->GetGUID(DATA_BLIZZARD_TARGET))) { + blizzard->AI()->SetGUID(newTarget->GetGUID(), DATA_BLIZZARD_TARGET); blizzard->GetMotionMaster()->MoveFollow(newTarget, 0.1f, 0.0f); return; } @@ -564,6 +639,7 @@ class achievement_the_hundred_club : public AchievementCriteriaScript void AddSC_boss_sapphiron() { new boss_sapphiron(); + RegisterNaxxramasCreatureAI(npc_sapphiron_blizzard); new go_sapphiron_birth(); new spell_sapphiron_change_blizzard_target(); new spell_sapphiron_icebolt(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 48459ffd3a..ea86b88523 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -1270,20 +1270,19 @@ class spell_thaddius_magnetic_pull : public SpellScriptLoader } }; -class at_thaddius_entrance : public AreaTriggerScript +class at_thaddius_entrance : public OnlyOnceAreaTriggerScript { public: - at_thaddius_entrance() : AreaTriggerScript("at_thaddius_entrance") { } + at_thaddius_entrance() : OnlyOnceAreaTriggerScript("at_thaddius_entrance") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetData(DATA_HAD_THADDIUS_GREET) || instance->GetBossState(BOSS_THADDIUS) == DONE) + if (!instance || instance->GetBossState(BOSS_THADDIUS) == DONE) return true; if (Creature* thaddius = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_THADDIUS))) thaddius->AI()->Talk(SAY_GREET); - instance->SetData(DATA_HAD_THADDIUS_GREET, 1u); return true; } diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index a76284d803..8eccf5cce6 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -116,9 +116,6 @@ class instance_naxxramas : public InstanceMapScript LoadDoorData(doorData); LoadObjectData(nullptr, objectData); - hadAnubRekhanGreet = false; - hadFaerlinaGreet = false; - hadThaddiusGreet = false; hadSapphironBirth = false; CurrentWingTaunt = SAY_KELTHUZAD_FIRST_WING_TAUNT; @@ -274,15 +271,6 @@ class instance_naxxramas : public InstanceMapScript if (GameObject* gate = instance->GetGameObject(GothikGateGUID)) gate->SetGoState(GOState(value)); break; - case DATA_HAD_ANUBREKHAN_GREET: - hadAnubRekhanGreet = (value == 1u); - break; - case DATA_HAD_FAERLINA_GREET: - hadFaerlinaGreet = (value == 1u); - break; - case DATA_HAD_THADDIUS_GREET: - hadThaddiusGreet = (value == 1u); - break; case DATA_HAD_SAPPHIRON_BIRTH: hadSapphironBirth = (value == 1u); break; @@ -295,12 +283,6 @@ class instance_naxxramas : public InstanceMapScript { switch (id) { - case DATA_HAD_ANUBREKHAN_GREET: - return hadAnubRekhanGreet ? 1u : 0u; - case DATA_HAD_FAERLINA_GREET: - return hadFaerlinaGreet ? 1u : 0u; - case DATA_HAD_THADDIUS_GREET: - return hadThaddiusGreet ? 1u : 0u; case DATA_HAD_SAPPHIRON_BIRTH: return hadSapphironBirth ? 1u : 0u; default: @@ -620,9 +602,6 @@ class instance_naxxramas : public InstanceMapScript ObjectGuid PortalsGUID[4]; ObjectGuid KelthuzadDoorGUID; ObjectGuid LichKingGUID; - bool hadAnubRekhanGreet; - bool hadFaerlinaGreet; - bool hadThaddiusGreet; bool hadSapphironBirth; uint8 CurrentWingTaunt; diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index e847179dde..64e313fea5 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -18,6 +18,9 @@ #ifndef DEF_NAXXRAMAS_H #define DEF_NAXXRAMAS_H +#include "CreatureAIImpl.h" + +#define NaxxramasScriptName "instance_naxxramas" #define DataHeader "NAX" uint32 const EncounterCount = 15; @@ -44,9 +47,6 @@ enum NAXEncounter enum NAXData { DATA_GOTHIK_GATE, - DATA_HAD_ANUBREKHAN_GREET, - DATA_HAD_FAERLINA_GREET, - DATA_HAD_THADDIUS_GREET, DATA_HAD_SAPPHIRON_BIRTH, DATA_HORSEMEN_CHECK_ACHIEVEMENT_CREDIT, @@ -215,17 +215,12 @@ enum NAXInstanceTexts SAY_DIALOGUE_SAPPHIRON_LICH_KING2 = 2 }; -/* -template -CreatureAI* GetNaxxramasAI(Creature* creature) -{ - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(NaxxramasScriptName)) - return new AI(creature); - return NULL; +template +inline AI* GetNaxxramasAI(T* obj) +{ + return GetInstanceAI(obj, NaxxramasScriptName); } -*/ +#define RegisterNaxxramasCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNaxxramasAI) #endif diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 0e64a02f0d..5a0177cf03 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -1182,7 +1182,7 @@ public: else if (unit->GetTypeId() == TYPEID_PLAYER) me->SetDisableGravity(true); } - else if (!apply) + else { if (unit->GetTypeId() != TYPEID_PLAYER) { @@ -1285,7 +1285,7 @@ public: if (unit->GetTypeId() == TYPEID_UNIT) unit->CastSpell(unit, SPELL_TELEPORT_VISUAL_ONLY); } - else if (!apply) + else { me->StopMoving(); me->SetDisableGravity(false); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 1a9216efda..6f02f9abf1 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -21,6 +21,7 @@ #include "SpellAuraEffects.h" #include "Player.h" #include "nexus.h" +#include "GameObjectAI.h" enum Spells { @@ -224,22 +225,31 @@ class containment_sphere : public GameObjectScript public: containment_sphere() : GameObjectScript("containment_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct containment_sphereAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + containment_sphereAI(GameObject* go) : GameObjectAI(go) { } - Creature* pKeristrasza = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_KERISTRASZA)); - if (pKeristrasza && pKeristrasza->IsAlive()) + bool GossipHello(Player* /*player*/) override { - // maybe these are hacks :( - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance = me->GetInstanceScript(); - ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + Creature* pKeristrasza = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KERISTRASZA)); + if (pKeristrasza && pKeristrasza->IsAlive()) + { + // maybe these are hacks :( + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + + ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + } + return true; } - return true; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return new containment_sphereAI(go); + } }; class spell_intense_cold : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index dbb177b4c7..647f2ffc71 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -237,7 +237,7 @@ class instance_oculus : public InstanceMapScript return KILL_NO_CONSTRUCT; else if (CentrifugueConstructCounter == 1) return KILL_ONE_CONSTRUCT; - else if (CentrifugueConstructCounter > 1) + else return KILL_MORE_CONSTRUCT; } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 66095046f6..9fa184da93 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -141,7 +141,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript player->DestroyItemCount(itemId, 1, true, false); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { switch (menuId) { @@ -156,7 +156,6 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_EMERALD_ESSENCE); break; } - return; case GOSSIP_MENU_ETERNOS: if (gossipListId >= 1 && gossipListId <= 3) { @@ -168,7 +167,6 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_AMBER_ESSENCE); break; } - return; case GOSSIP_MENU_BELGARISTRASZ: if (gossipListId <= 2) { @@ -180,11 +178,11 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_RUBY_ESSENCE); break; } - return; default: - return; + break; } player->PlayerTalkClass->SendCloseGossip(); + return false; } void MovementInform(uint32 /*type*/, uint32 id) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index fdb0b53980..c9b83d7e01 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -269,29 +269,6 @@ class npc_brann_hos : public CreatureScript public: npc_brann_hos() : CreatureScript("npc_brann_hos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1 || action == GOSSIP_ACTION_INFO_DEF+2) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP(); - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, TEXT_ID_START, creature->GetGUID()); - - return true; - } - struct npc_brann_hosAI : public npc_escortAI { npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) @@ -322,6 +299,30 @@ public: bool bIsLowHP; bool brannSparklinNews; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1 || action == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + StartWP(); + } + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, TEXT_ID_START, me->GetGUID()); + + return true; + } + void Reset() override { if (!HasEscortState(STATE_ESCORT_ESCORTING)) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index e0b7634173..f62f7ec51f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -979,13 +979,13 @@ class go_celestial_planetarium_access : public GameObjectScript { } - bool GossipHello(Player* player, bool /*reportUse*/) override + bool GossipHello(Player* player) override { - if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) return true; bool hasKey = true; - if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId)) + if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->goober.lockId)) { hasKey = false; for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) @@ -1005,18 +1005,18 @@ class go_celestial_planetarium_access : public GameObjectScript return false; // Start Algalon event - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); _events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000); - if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) + if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) brann->AI()->DoAction(ACTION_START_INTRO); - if (InstanceScript* instance = go->GetInstanceScript()) + if (InstanceScript* instance = me->GetInstanceScript()) { instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_01))) + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_01))) sigil->SetGoState(GO_STATE_ACTIVE); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_02))) + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_02))) sigil->SetGoState(GO_STATE_ACTIVE); } @@ -1035,7 +1035,7 @@ class go_celestial_planetarium_access : public GameObjectScript switch (eventId) { case EVENT_DESPAWN_CONSOLE: - go->Delete(); + me->Delete(); break; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index fedc245b57..412295a664 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -39,6 +39,7 @@ #include "VehicleDefines.h" #include "ulduar.h" #include "Spell.h" +#include "GameObjectAI.h" enum Spells { @@ -1185,7 +1186,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript _instance = creature->GetInstanceScript(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_BRANN_BRONZEBEARD && gossipListId == GOSSIP_OPTION_BRANN_BRONZEBEARD) { @@ -1194,6 +1195,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript if (Creature* loreKeeper = _instance->GetCreature(DATA_LORE_KEEPER_OF_NORGANNON)) loreKeeper->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } + return false; } private: @@ -1238,7 +1240,7 @@ class npc_lorekeeper : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_LORE_KEEPER && gossipListId == GOSSIP_OPTION_LORE_KEEPER) { @@ -1262,6 +1264,7 @@ class npc_lorekeeper : public CreatureScript } } } + return false; } private: @@ -1279,30 +1282,40 @@ class go_ulduar_tower : public GameObjectScript public: go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { } - void OnDestroyed(GameObject* go, Player* /*player*/) override + struct go_ulduar_towerAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return; + go_ulduar_towerAI(GameObject* go) : GameObjectAI(go) { } - switch (go->GetEntry()) + void Destroyed(Player* /*player*/, uint32 /*eventId*/) override { - case GO_TOWER_OF_STORMS: - instance->ProcessEvent(go, EVENT_TOWER_OF_STORM_DESTROYED); - break; - case GO_TOWER_OF_FLAMES: - instance->ProcessEvent(go, EVENT_TOWER_OF_FLAMES_DESTROYED); - break; - case GO_TOWER_OF_FROST: - instance->ProcessEvent(go, EVENT_TOWER_OF_FROST_DESTROYED); - break; - case GO_TOWER_OF_LIFE: - instance->ProcessEvent(go, EVENT_TOWER_OF_LIFE_DESTROYED); - break; - } + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return; - if (Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) - trigger->DisappearAndDie(); + switch (me->GetEntry()) + { + case GO_TOWER_OF_STORMS: + instance->ProcessEvent(me, EVENT_TOWER_OF_STORM_DESTROYED); + break; + case GO_TOWER_OF_FLAMES: + instance->ProcessEvent(me, EVENT_TOWER_OF_FLAMES_DESTROYED); + break; + case GO_TOWER_OF_FROST: + instance->ProcessEvent(me, EVENT_TOWER_OF_FROST_DESTROYED); + break; + case GO_TOWER_OF_LIFE: + instance->ProcessEvent(me, EVENT_TOWER_OF_LIFE_DESTROYED); + break; + } + + if (Creature* trigger = me->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) + trigger->DisappearAndDie(); + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ulduar_towerAI(go); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index e56de3450c..0a1131e713 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -25,6 +25,7 @@ #include "SpellAuraEffects.h" #include "ulduar.h" #include "Vehicle.h" +#include "GameObjectAI.h" enum Yells { @@ -1645,20 +1646,30 @@ class go_mimiron_hardmode_button : public GameObjectScript public: go_mimiron_hardmode_button() : GameObjectScript("go_mimiron_hardmode_button") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_mimiron_hardmode_buttonAI : public GameObjectAI { - if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) + go_mimiron_hardmode_buttonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override + { + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) + return true; + + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; + + if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) + computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); + me->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); return true; + } + }; - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; - - if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) - computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_mimiron_hardmode_buttonAI(go); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index e6aa2654d5..bbdb223a0d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -24,6 +24,7 @@ #include "ulduar.h" #include "SpellInfo.h" #include "Player.h" +#include "GameObjectAI.h" enum Says { @@ -316,12 +317,22 @@ class go_razorscale_harpoon : public GameObjectScript public: go_razorscale_harpoon() : GameObjectScript("go_razorscale_harpoon") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_razorscale_harpoonAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetCreature(BOSS_RAZORSCALE)) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return false; + go_razorscale_harpoonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetCreature(BOSS_RAZORSCALE)) + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_razorscale_harpoonAI(go); } }; @@ -734,37 +745,37 @@ class npc_expedition_commander : public CreatureScript else AttackStartTimer -= Diff; } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + ClearGossipMenuFor(player); + switch (gossipListId) + { + case GOSSIP_ACTION_INFO_DEF: + CloseGossipMenuFor(player); + ENSURE_AI(npc_expedition_commanderAI, me->AI())->Phase = 1; + return true; + } + return false; + } + + bool GossipHello(Player* player) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) + { + player->PrepareGossipMenu(me); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 13853, me->GetGUID()); + } + else + SendGossipMenuFor(player, 13910, me->GetGUID()); + + return true; + } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - CloseGossipMenuFor(player); - ENSURE_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1; - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) - { - player->PrepareGossipMenu(creature); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 13853, creature->GetGUID()); - } - else - SendGossipMenuFor(player, 13910, creature->GetGUID()); - - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return GetUlduarAI(creature); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 7fbb84e35b..38979ecd66 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -1523,10 +1523,10 @@ class npc_observation_ring_keeper : public CreatureScript DoCast(SPELL_KEEPER_ACTIVE); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId != 10333) - return; + return true; me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->DespawnOrUnsummon(2000); @@ -1549,6 +1549,7 @@ class npc_observation_ring_keeper : public CreatureScript me->SummonCreature(NPC_MIMIRON_YS, YSKeepersPos[3]); break; } + return false; } void UpdateAI(uint32 /*diff*/) override { } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index d39608cb53..dead19a90a 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -20,6 +20,7 @@ #include "utgarde_pinnacle.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "GameObjectAI.h" enum Spells { @@ -555,19 +556,29 @@ class go_palehoof_sphere : public GameObjectScript public: go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_palehoof_sphereAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_palehoof_sphereAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override { - if (Creature* palehoof = instance->GetCreature(DATA_GORTOK_PALEHOOF)) - if (palehoof->IsAlive() && instance->GetBossState(DATA_GORTOK_PALEHOOF) != DONE) - { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); - palehoof->AI()->DoAction(ACTION_START_ENCOUNTER); - } + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (Creature* palehoof = instance->GetCreature(DATA_GORTOK_PALEHOOF)) + if (palehoof->IsAlive() && instance->GetBossState(DATA_GORTOK_PALEHOOF) != DONE) + { + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + palehoof->AI()->DoAction(ACTION_START_ENCOUNTER); + } + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_palehoof_sphereAI(go); } }; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index b2061ea636..f5e962117e 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -23,6 +23,7 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" #include "violet_hold.h" +#include "GameObjectAI.h" /* * TODO: @@ -317,30 +318,6 @@ class npc_sinclari_vh : public CreatureScript public: npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(DATA_MAIN_EVENT_STATE)) - { - case IN_PROGRESS: - player->PrepareGossipMenu(creature, GOSSIP_MENU_SEND_ME_IN, true); - player->SendPreparedGossip(creature); - return true; - case DONE: - return true; // NYI - case NOT_STARTED: - case FAIL: - default: - break; - } - } - - // load default gossip - return false; - } - struct npc_sinclariAI : public ScriptedAI { npc_sinclariAI(Creature* creature) : ScriptedAI(creature), _summons(creature) @@ -369,7 +346,31 @@ class npc_sinclari_vh : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (InstanceScript* instance = me->GetInstanceScript()) + { + switch (instance->GetData(DATA_MAIN_EVENT_STATE)) + { + case IN_PROGRESS: + player->PrepareGossipMenu(me, GOSSIP_MENU_SEND_ME_IN, true); + player->SendPreparedGossip(me); + return true; + case DONE: + return true; // NYI + case NOT_STARTED: + case FAIL: + default: + break; + } + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0) { @@ -383,6 +384,7 @@ class npc_sinclari_vh : public CreatureScript me->CastSpell(player, SPELL_TELEPORT_PLAYER, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void DoAction(int32 actionId) override @@ -1309,10 +1311,20 @@ class go_activation_crystal : public GameObjectScript public: go_activation_crystal() : GameObjectScript("go_activation_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_blackfathom_altarAI : public GameObjectAI { - player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); - return false; + go_blackfathom_altarAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blackfathom_altarAI(go); } }; diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index f7d3e77450..003f660a8a 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -241,31 +241,40 @@ class npc_corastrasza : public CreatureScript public: npc_corastrasza() : CreatureScript("npc_corastrasza") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_corastraszaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_corastraszaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + bool GossipHello(Player* player) override { - CloseGossipMenuFor(player); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); - player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - return true; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + + player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); + player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_corastraszaAI(creature); } }; @@ -284,31 +293,42 @@ enum Iruk class npc_iruk : public CreatureScript { -public: - npc_iruk() : CreatureScript("npc_iruk") { } + public: + npc_iruk() : CreatureScript("npc_iruk") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct npc_irukAI : public ScriptedAI { - case GOSSIP_ACTION_INFO_DEF+1: - player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); - CloseGossipMenuFor(player); - break; + npc_irukAI(Creature* creature) : ScriptedAI(creature) { } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); + CloseGossipMenuFor(player); + break; + + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_irukAI(creature); } - return true; - } }; /*###### @@ -544,136 +564,132 @@ enum Lurgglbr class npc_lurgglbr : public CreatureScript { -public: - npc_lurgglbr() : CreatureScript("npc_lurgglbr") { } + public: + npc_lurgglbr() : CreatureScript("npc_lurgglbr") { } - struct npc_lurgglbrAI : public npc_escortAI - { - npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature) + struct npc_lurgglbrAI : public npc_escortAI { - Initialize(); - } - - void Initialize() - { - IntroTimer = 0; - IntroPhase = 0; - } - - uint32 IntroTimer; - uint32 IntroPhase; - - void Reset() override - { - if (!HasEscortState(STATE_ESCORT_ESCORTING)) + npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature) + { Initialize(); - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) - { - case 0: - IntroPhase = 1; - IntroTimer = 2000; - break; - case 41: - SetEscortPaused(true); - IntroPhase = 4; - IntroTimer = 2000; - break; } - } - void UpdateAI(uint32 diff) override - { - if (IntroPhase) + void Initialize() { - if (IntroTimer <= diff) + IntroTimer = 0; + IntroPhase = 0; + } + + uint32 IntroTimer; + uint32 IntroPhase; + + void Reset() override + { + if (!HasEscortState(STATE_ESCORT_ESCORTING)) + Initialize(); + } + + void WaypointReached(uint32 waypointId) override + { + switch (waypointId) { - switch (IntroPhase) + case 0: + IntroPhase = 1; + IntroTimer = 2000; + break; + case 41: + SetEscortPaused(true); + IntroPhase = 4; + IntroTimer = 2000; + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (IntroPhase) + { + if (IntroTimer <= diff) { - case 1: - if (Player* player = GetPlayerForEscort()) - Talk(SAY_START_1, player); - IntroPhase = 2; - IntroTimer = 7500; + switch (IntroPhase) + { + case 1: + if (Player* player = GetPlayerForEscort()) + Talk(SAY_START_1, player); + IntroPhase = 2; + IntroTimer = 7500; + break; + case 2: + Talk(SAY_START_2); + IntroPhase = 3; + IntroTimer = 7500; + break; + case 3: + me->SetReactState(REACT_DEFENSIVE); + IntroPhase = 0; + IntroTimer = 0; + break; + case 4: + Talk(SAY_END_1); + IntroPhase = 5; + IntroTimer = 8000; + break; + case 5: + if (Player* player = GetPlayerForEscort()) + Talk(SAY_END_2, player); + IntroPhase = 6; + IntroTimer = 2500; + break; + case 6: + if (Player* player = GetPlayerForEscort()) + player->AreaExploredOrEventHappens(QUEST_ESCAPE_WINTERFIN_CAVERNS); + IntroPhase = 7; + IntroTimer = 2500; + break; + case 7: + me->DespawnOrUnsummon(); + IntroPhase = 0; + IntroTimer = 0; + break; + } + } else IntroTimer -= diff; + } + npc_escortAI::UpdateAI(diff); + + if (!UpdateVictim()) + return; + } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) + { + if (GameObject* go = me->FindNearestGameObject(GO_CAGE, 5.0f)) + { + go->SetRespawnTime(0); + go->UseDoorOrButton(20000); + } + + Start(true, false, player->GetGUID()); + + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A_PASSIVE); break; - case 2: - Talk(SAY_START_2); - IntroPhase = 3; - IntroTimer = 7500; - break; - case 3: - me->SetReactState(REACT_DEFENSIVE); - IntroPhase = 0; - IntroTimer = 0; - break; - case 4: - Talk(SAY_END_1); - IntroPhase = 5; - IntroTimer = 8000; - break; - case 5: - if (Player* player = GetPlayerForEscort()) - Talk(SAY_END_2, player); - IntroPhase = 6; - IntroTimer = 2500; - break; - case 6: - if (Player* player = GetPlayerForEscort()) - player->AreaExploredOrEventHappens(QUEST_ESCAPE_WINTERFIN_CAVERNS); - IntroPhase = 7; - IntroTimer = 2500; - break; - case 7: - me->DespawnOrUnsummon(); - IntroPhase = 0; - IntroTimer = 0; + default: + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); break; } - } else IntroTimer -= diff; + } } - npc_escortAI::UpdateAI(diff); + }; - if (!UpdateVictim()) - return; - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_lurgglbrAI(creature); - } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) + CreatureAI* GetAI(Creature* creature) const override { - if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f)) - { - go->SetRespawnTime(0); - go->UseDoorOrButton(20000); - } - - if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A_PASSIVE); - break; - default: - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H_PASSIVE); - break; - } - - return true; + return new npc_lurgglbrAI(creature); } - return false; - } }; enum red_dragonblood @@ -1041,33 +1057,34 @@ public: if (Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID)) arthas->RemoveFromWorld(); } - }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && creature->GetAreaId() == 4128) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipHello(Player* player) override { - case GOSSIP_ACTION_INFO_DEF+1: - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f); - break; + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && me->GetAreaId() == 4128) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; } - return true; - } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + Start(true, false, player->GetGUID()); + SetMaxPlayerDistance(200.0f); + break; + } + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1616,30 +1633,29 @@ class npc_mootoo_the_younger : public CreatureScript public: npc_mootoo_the_younger() : CreatureScript("npc_mootoo_the_younger") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST) - { - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A_PASSIVE); - break; - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H_PASSIVE); - break; - } - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_1, player); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - } - return true; - } - struct npc_mootoo_the_youngerAI : public npc_escortAI { npc_mootoo_the_youngerAI(Creature* creature) : npc_escortAI(creature) { } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST) + { + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A_PASSIVE); + break; + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); + break; + } + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_1, player); + Start(true, false, player->GetGUID()); + } + } + void Reset() override { SetDespawnAtFar(false); @@ -1706,17 +1722,6 @@ class npc_bonker_togglevolt : public CreatureScript public: npc_bonker_togglevolt() : CreatureScript("npc_bonker_togglevolt") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_BONKER_2, player); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID()); - } - return true; - } - struct npc_bonker_togglevoltAI : public npc_escortAI { npc_bonker_togglevoltAI(Creature* creature) : npc_escortAI(creature) @@ -1731,6 +1736,16 @@ public: uint32 Bonker_agro; + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_BONKER_2, player); + Start(true, true, player->GetGUID()); + } + } + void Reset() override { Initialize(); @@ -2204,7 +2219,7 @@ public: uiEventPhase = 1; } - void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override + void SetGUID(ObjectGuid uiGuid, int32 /*iId*/ = 0) override { uiPlayerGUID = uiGuid; } @@ -2275,65 +2290,65 @@ public: DoMeleeAttackIfReady(); } + + bool GossipHello(Player* player) override + { + uint32 uiGossipText = 0; + const char* charGossipItem; + + switch (me->GetEntry()) + { + case NPC_TOM_HEGGER: + uiGossipText = GOSSIP_TEXT_TOM_HEGGER; + charGossipItem = GOSSIP_ITEM_TOM_HEGGER; + break; + case NPC_SALTY_JOHN_THORPE: + uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; + charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; + break; + case NPC_GUARD_MITCHELLS: + uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; + charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; + break; + default: + charGossipItem = ""; + return false; + } + + if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + SendGossipMenuFor(player, uiGossipText, me->GetGUID()); + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + SetGUID(player->GetGUID()); + DoAction(1); + } + + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_hidden_cultistAI(creature); } - - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 uiGossipText = 0; - const char* charGossipItem; - - switch (creature->GetEntry()) - { - case NPC_TOM_HEGGER: - uiGossipText = GOSSIP_TEXT_TOM_HEGGER; - charGossipItem = GOSSIP_ITEM_TOM_HEGGER; - break; - case NPC_SALTY_JOHN_THORPE: - uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; - charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; - break; - case NPC_GUARD_MITCHELLS: - uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; - charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; - break; - default: - charGossipItem = ""; - return false; - } - - if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - SendGossipMenuFor(player, uiGossipText, creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - creature->AI()->SetGUID(player->GetGUID()); - creature->AI()->DoAction(1); - } - - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - }; enum WindsoulTotemAura diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 255d11361a..93fedc08f4 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -492,33 +492,6 @@ class npc_wyrmrest_defender : public CreatureScript public: npc_wyrmrest_defender() : CreatureScript("npc_wyrmrest_defender") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, creature->GetGUID()); - } - else - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, creature->GetGUID()); - // Makes player cast trigger spell for 49207 on self - player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); - // The gossip should not auto close - } - - return true; - } - struct npc_wyrmrest_defenderAI : public VehicleAI { npc_wyrmrest_defenderAI(Creature* creature) : VehicleAI(creature) @@ -539,6 +512,34 @@ class npc_wyrmrest_defender : public CreatureScript uint32 RenewRecoveryChecker; + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, me->GetGUID()); + } + else + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, me->GetGUID()); + // Makes player cast trigger spell for 49207 on self + player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); + // The gossip should not auto close + } + + return true; + } + void Reset() override { Initialize(); diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index b3a5cc7f4f..9eb66ad9f3 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -182,25 +182,23 @@ public: _RavenousworgGUID.Clear(); } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) + { + Talk(SAY_QUEST_ACCEPT); + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 180.0f)) + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + Start(true, false, player->GetGUID()); + } + } + private: ObjectGuid _RavenousworgGUID; ObjectGuid _mrfloppyGUID; }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) - { - creature->AI()->Talk(SAY_QUEST_ACCEPT); - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(creature, NPC_MRFLOPPY, 180.0f)) - Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI()))) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_emilyAI(creature); @@ -764,9 +762,10 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); + return false; } private: diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 64b2b8618e..29a87e32d6 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -78,15 +78,6 @@ class npc_apothecary_hanes : public CreatureScript public: npc_apothecary_hanes() : CreatureScript("npc_apothecary_hanes") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) - { - ENSURE_AI(npc_Apothecary_HanesAI, (creature->AI()))->StartEscort(player); - } - return true; - } - struct npc_Apothecary_HanesAI : public npc_escortAI { npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature) @@ -94,6 +85,12 @@ public: Initialize(); } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) + StartEscort(player); + } + void StartEscort(Player* player) { events.ScheduleEvent(EVENT_BEGIN, Seconds(2)); @@ -331,50 +328,61 @@ class npc_razael_and_lyana : public CreatureScript public: npc_razael_and_lyana() : CreatureScript("npc_razael_and_lyana") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_razael_and_lyanaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_razael_and_lyanaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) - switch (creature->GetEntry()) - { - case NPC_RAZAEL: - if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, creature->GetGUID()); - return true; - } - break; - case NPC_LYANA: - if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, creature->GetGUID()); - return true; - } - break; - } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipHello(Player* player) override { - case GOSSIP_ACTION_INFO_DEF + 1: - SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, creature->GetGUID()); - player->TalkedToCreature(NPC_RAZAEL, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, creature->GetGUID()); - player->TalkedToCreature(NPC_LYANA, creature->GetGUID()); - break; + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) + switch (me->GetEntry()) + { + case NPC_RAZAEL: + if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, me->GetGUID()); + return true; + } + break; + case NPC_LYANA: + if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, me->GetGUID()); + return true; + } + break; + } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - return true; + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, me->GetGUID()); + player->TalkedToCreature(NPC_RAZAEL, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, me->GetGUID()); + player->TalkedToCreature(NPC_LYANA, me->GetGUID()); + break; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_razael_and_lyanaAI(creature); } }; @@ -404,17 +412,6 @@ class npc_daegarn : public CreatureScript public: npc_daegarn() : CreatureScript("npc_daegarn") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) - { - if (npc_daegarnAI* pDaegarnAI = CAST_AI(npc_daegarn::npc_daegarnAI, creature->AI())) - pDaegarnAI->StartEvent(player->GetGUID()); - } - - return true; - } - /// @todo make prisoners help (unclear if summoned or using npc's from surrounding cages (summon inside small cages?)) struct npc_daegarnAI : public ScriptedAI { @@ -432,6 +429,12 @@ public: bool bEventInProgress; ObjectGuid uiPlayerGUID; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) + StartEvent(player->GetGUID()); + } + void Reset() override { Initialize(); diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 6bd5f0ba33..9bf9cf1017 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -150,28 +150,24 @@ public: m_uiChatTimer -= uiDiff; } } + + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_DISASTER) + { + me->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + + Start(false, false, player->GetGUID()); + Talk(SAY_WP_1); + } + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_engineer_heliceAI(creature); } - - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_DISASTER) - { - if (npc_engineer_heliceAI* pEscortAI = CAST_AI(npc_engineer_helice::npc_engineer_heliceAI, creature->AI())) - { - creature->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - - pEscortAI->Start(false, false, player->GetGUID()); - creature->AI()->Talk(SAY_WP_1); - } - } - return true; - } }; /*##### diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index 0754ec3fe2..ab3300c0db 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -42,72 +42,71 @@ enum InjuredGoblinMiner class npc_injured_goblin : public CreatureScript { -public: - npc_injured_goblin() : CreatureScript("npc_injured_goblin") { } + public: + npc_injured_goblin() : CreatureScript("npc_injured_goblin") { } - struct npc_injured_goblinAI : public npc_escortAI - { - npc_injured_goblinAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) override + struct npc_injured_goblinAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_injured_goblinAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void WaypointReached(uint32 waypointId) override { - case 26: - Talk(SAY_END_WP_REACHED, player); - break; - case 27: - player->GroupEventHappens(QUEST_BITTER_DEPARTURE, me); - break; + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 26: + Talk(SAY_END_WP_REACHED, player); + break; + case 27: + player->GroupEventHappens(QUEST_BITTER_DEPARTURE, me); + break; + } } - } - void EnterCombat(Unit* /*who*/) override { } + void EnterCombat(Unit* /*who*/) override { } - void Reset() override { } + void Reset() override { } - void JustDied(Unit* /*killer*/) override - { - Player* player = GetPlayerForEscort(); - if (HasEscortState(STATE_ESCORT_ESCORTING) && player) - player->FailQuest(QUEST_BITTER_DEPARTURE); - } - - void UpdateAI(uint32 uiDiff) override - { - npc_escortAI::UpdateAI(uiDiff); - if (!UpdateVictim()) - return; - DoMeleeAttackIfReady(); - } - - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override - { - if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) + void JustDied(Unit* /*killer*/) override { - CloseGossipMenuFor(player); - me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - Start(true, true, player->GetGUID()); + Player* player = GetPlayerForEscort(); + if (HasEscortState(STATE_ESCORT_ESCORTING) && player) + player->FailQuest(QUEST_BITTER_DEPARTURE); } + + void UpdateAI(uint32 uiDiff) override + { + npc_escortAI::UpdateAI(uiDiff); + if (!UpdateVictim()) + return; + DoMeleeAttackIfReady(); + } + + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) + { + CloseGossipMenuFor(player); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + Start(true, true, player->GetGUID()); + } + return false; + } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE) + Talk(SAY_QUEST_ACCEPT); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_injured_goblinAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_injured_goblinAI(creature); - } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE) - creature->AI()->Talk(SAY_QUEST_ACCEPT); - - return false; - } }; /*###### @@ -122,42 +121,53 @@ enum RoxiRamrocket class npc_roxi_ramrocket : public CreatureScript { -public: - npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { } + public: + npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - //Quest Menu - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - //Trainer Menu - if ( creature->IsTrainer() ) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - //Vendor Menu - if ( creature->IsVendor() ) - if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER)) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct npc_roxi_ramrocketAI : public ScriptedAI { - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; + npc_roxi_ramrocketAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + //Quest Menu + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + //Trainer Menu + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + //Vendor Menu + if (me->IsVendor()) + if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER)) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_roxi_ramrocketAI(creature); } - return true; - } }; /*###### @@ -457,151 +467,152 @@ enum BrannBronzebeard class npc_brann_bronzebeard_keystone : public CreatureScript { -public: - npc_brann_bronzebeard_keystone() : CreatureScript("npc_brann_bronzebeard_keystone") { } + public: + npc_brann_bronzebeard_keystone() : CreatureScript("npc_brann_bronzebeard_keystone") { } - struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI - { - npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) + struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI { - objectCounter = 0; - } - - void Reset() override - { - for (ObjectGuid& guid : objectGUID) - guid.Clear(); - - playerGUID.Clear(); - voiceGUID.Clear(); - objectCounter = 0; - } - - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - CloseGossipMenuFor(player); - playerGUID = player->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_1, 100); - } - - void UpdateAI(uint32 diff) override - { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) { - switch (eventId) + objectCounter = 0; + } + + void Reset() override + { + for (ObjectGuid& guid : objectGUID) + guid.Clear(); + + playerGUID.Clear(); + voiceGUID.Clear(); + objectCounter = 0; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + playerGUID = player->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_1, 100); + return false; + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_SCRIPT_1: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - Talk(SAY_BRANN_1, player); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49000)) - voiceGUID = voice->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_2, 4000); - break; - case EVENT_SCRIPT_2: - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false); - events.ScheduleEvent(EVENT_SCRIPT_3, 6000); - break; - case EVENT_SCRIPT_3: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_MINING); - events.ScheduleEvent(EVENT_SCRIPT_4, 6000); - break; - case EVENT_SCRIPT_4: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - { - voice->CastSpell(voice, SPELL_RESURRECTION); + switch (eventId) + { + case EVENT_SCRIPT_1: if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - voice->AI()->Talk(SAY_VOICE_1, player); - } - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, G3D::Quat(0.f, 0.f, -0.737277f, 0.6755905f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_5, 6000); - break; - case EVENT_SCRIPT_5: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + Talk(SAY_BRANN_1, player); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49000)) + voiceGUID = voice->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_2, 4000); + break; + case EVENT_SCRIPT_2: + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false); + events.ScheduleEvent(EVENT_SCRIPT_3, 6000); + break; + case EVENT_SCRIPT_3: + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_MINING); + events.ScheduleEvent(EVENT_SCRIPT_4, 6000); + break; + case EVENT_SCRIPT_4: + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_2, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, G3D::Quat(0.f, 0.f, -0.9271832f, 0.3746083f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_6, 6000); - break; - case EVENT_SCRIPT_6: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + { + voice->CastSpell(voice, SPELL_RESURRECTION); + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + voice->AI()->Talk(SAY_VOICE_1, player); + } + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, G3D::Quat(0.f, 0.f, -0.737277f, 0.6755905f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_5, 6000); + break; + case EVENT_SCRIPT_5: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_2, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, G3D::Quat(0.f, 0.f, -0.9271832f, 0.3746083f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_6, 6000); + break; + case EVENT_SCRIPT_6: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_3, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, G3D::Quat(0.f, 0.f, 0.9961939f, 0.08716504f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_7, 6000); + break; + case EVENT_SCRIPT_7: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_4, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, G3D::Quat(0.f, 0.f, 0.8703556f, 0.4924237f), 0)) + objectGUID[objectCounter++] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_8, 6000); + break; + case EVENT_SCRIPT_8: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) + voice->AI()->Talk(SAY_VOICE_5, player); + if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, G3D::Quat(0.f, 0.f, 0.5446386f, 0.8386708f), 0)) + objectGUID[objectCounter] = go->GetGUID(); + events.ScheduleEvent(EVENT_SCRIPT_9, 6000); + break; + case EVENT_SCRIPT_9: if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_3, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, G3D::Quat(0.f, 0.f, 0.9961939f, 0.08716504f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_7, 6000); - break; - case EVENT_SCRIPT_7: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_4, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, G3D::Quat(0.f, 0.f, 0.8703556f, 0.4924237f), 0)) - objectGUID[objectCounter++] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_8, 6000); - break; - case EVENT_SCRIPT_8: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->AI()->Talk(SAY_VOICE_5, player); - if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, G3D::Quat(0.f, 0.f, 0.5446386f, 0.8386708f), 0)) - objectGUID[objectCounter] = go->GetGUID(); - events.ScheduleEvent(EVENT_SCRIPT_9, 6000); - break; - case EVENT_SCRIPT_9: - if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID)) - voice->CastSpell(voice, SPELL_RESURRECTION); - events.ScheduleEvent(EVENT_SCRIPT_10, 6000); - break; - case EVENT_SCRIPT_10: - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - { - Talk(SAY_BRANN_2, player); - player->KilledMonsterCredit(me->GetEntry()); - } - events.ScheduleEvent(EVENT_SCRIPT_11, 6000); - break; - case EVENT_SCRIPT_11: - me->SetFacingTo(2.932153f); - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) - Talk(SAY_BRANN_3, player); + voice->CastSpell(voice, SPELL_RESURRECTION); + events.ScheduleEvent(EVENT_SCRIPT_10, 6000); + break; + case EVENT_SCRIPT_10: + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + { + Talk(SAY_BRANN_2, player); + player->KilledMonsterCredit(me->GetEntry()); + } + events.ScheduleEvent(EVENT_SCRIPT_11, 6000); + break; + case EVENT_SCRIPT_11: + me->SetFacingTo(2.932153f); + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) + Talk(SAY_BRANN_3, player); - for (uint8 i = 0; i < 5; ++i) - if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i])) - go->Delete(); + for (uint8 i = 0; i < 5; ++i) + if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i])) + go->Delete(); - events.ScheduleEvent(EVENT_SCRIPT_12, 6000); - break; - case EVENT_SCRIPT_12: - me->GetMotionMaster()->Clear(); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false); - events.ScheduleEvent(EVENT_SCRIPT_13, 10000); - break; - case EVENT_SCRIPT_13: - me->DisappearAndDie(); - break; + events.ScheduleEvent(EVENT_SCRIPT_12, 6000); + break; + case EVENT_SCRIPT_12: + me->GetMotionMaster()->Clear(); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false); + events.ScheduleEvent(EVENT_SCRIPT_13, 10000); + break; + case EVENT_SCRIPT_13: + me->DisappearAndDie(); + break; + } } } + + private: + EventMap events; + ObjectGuid playerGUID; + ObjectGuid objectGUID[5]; + ObjectGuid voiceGUID; + uint8 objectCounter; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_brann_bronzebeard_keystoneAI(creature); } - - private: - EventMap events; - ObjectGuid playerGUID; - ObjectGuid objectGUID[5]; - ObjectGuid voiceGUID; - uint8 objectCounter; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_brann_bronzebeard_keystoneAI(creature); - } }; /*##### diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 1be3ec6540..2a1238d5e4 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -115,69 +115,80 @@ class npc_wg_demolisher_engineer : public CreatureScript public: npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_wg_demolisher_engineerAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { } - if (CanBuild(creature)) + bool GossipHello(Player* player) override { - if (player->HasAura(SPELL_CORPORAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (player->HasAura(SPELL_LIEUTENANT)) + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (CanBuild()) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasAura(SPELL_CORPORAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + else if (player->HasAura(SPELL_LIEUTENANT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + } } + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); - - if (CanBuild(creature)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (action - GOSSIP_ACTION_INFO_DEF) + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); + + if (CanBuild()) { - case 0: - creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); - break; - case 1: - creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); - break; - case 2: - creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); - break; + switch (action - GOSSIP_ACTION_INFO_DEF) + { + case 0: + me->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + me->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + me->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); + break; + } + if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) + me->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); } - if (Creature* controlArms = creature->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) - creature->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); + return true; } - return true; - } - private: - bool CanBuild(Creature* creature) - { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return false; - - switch (creature->GetEntry()) + private: + bool CanBuild() const { - case NPC_GOBLIN_MECHANIC: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); - case NPC_GNOMISH_ENGINEER: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); - default: + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) return false; + + switch (me->GetEntry()) + { + case NPC_GOBLIN_MECHANIC: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); + case NPC_GNOMISH_ENGINEER: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); + default: + return false; + } } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_demolisher_engineerAI(creature); } }; @@ -186,40 +197,6 @@ class npc_wg_spirit_guide : public CreatureScript public: npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < graveyard.size(); i++) - if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp) - { - GraveyardVect gy = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < gy.size(); i++) - if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); - } - return true; - } - struct npc_wg_spirit_guideAI : public ScriptedAI { npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } @@ -229,6 +206,41 @@ class npc_wg_spirit_guide : public CreatureScript if (!me->HasUnitState(UNIT_STATE_CASTING)) DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < graveyard.size(); i++) + if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (wintergrasp) + { + GraveyardVect gy = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < gy.size(); i++) + if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) + if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override @@ -274,60 +286,60 @@ class npc_wg_queue : public CreatureScript DoMeleeAttackIfReady(); } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + if (wintergrasp->IsWarTime()) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID()); + } + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + player->SendUpdateWorldState(4354, time(NULL) + timer); + if (timer < 15 * MINUTE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID()); + } + else + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); + } + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; + + if (wintergrasp->IsWarTime()) + wintergrasp->InvitePlayerToWar(player); + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + if (timer < 15 * MINUTE) + wintergrasp->InvitePlayerToQueue(player); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_wg_queueAI(creature); } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); - } - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - player->SendUpdateWorldState(4354, time(NULL) + timer); - if (timer < 15 * MINUTE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID()); - } - else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID()); - } - return true; - } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - wintergrasp->InvitePlayerToWar(player); - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (timer < 15 * MINUTE) - wintergrasp->InvitePlayerToQueue(player); - } - return true; - } }; class go_wg_vehicle_teleporter : public GameObjectScript @@ -339,39 +351,41 @@ class go_wg_vehicle_teleporter : public GameObjectScript { go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { } - bool IsFriendly(Unit* passenger) - { - return ((go->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || - (go->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); - } - - Creature* GetValidVehicle(Creature* cVeh) - { - if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) - if (Vehicle* vehicle = cVeh->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - if (IsFriendly(passenger)) - if (Creature* teleportTrigger = passenger->SummonTrigger(go->GetPositionX()-60.0f, go->GetPositionY(), go->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000)) - return teleportTrigger; - - return nullptr; - } - - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { _checkTimer += diff; if (_checkTimer >= 1000) { for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) - if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true)) + if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true)) if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature)) teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); _checkTimer = 0; } } + private: uint32 _checkTimer; + + bool IsFriendly(Unit* passenger) const + { + return ((me->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || + (me->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); + } + + Creature* GetValidVehicle(Creature* cVeh) const + { + if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) + if (Vehicle* vehicle = cVeh->GetVehicleKit()) + if (Unit* passenger = vehicle->GetPassenger(0)) + if (IsFriendly(passenger)) + if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX() - 60.0f, me->GetPositionY(), me->GetPositionZ() + 1.0f, cVeh->GetOrientation(), 1000)) + return teleportTrigger; + + return nullptr; + } + }; GameObjectAI* GetAI(GameObject* go) const override diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 3335b20e42..21983384ab 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -25,6 +25,7 @@ #include "SpellAuras.h" #include "SpellAuraEffects.h" #include "Vehicle.h" +#include "GameObjectAI.h" /*#### ## npc_drakuru_shackles @@ -267,12 +268,13 @@ public: return; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { _events.ScheduleEvent(EVENT_RECRUIT_1, 100); CloseGossipMenuFor(player); me->CastSpell(player, SPELL_QUEST_CREDIT, true); me->SetFacingToObject(player); + return false; } private: @@ -300,25 +302,35 @@ enum ScourgeEnclosure class go_scourge_enclosure : public GameObjectScript { -public: - go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } + public: + go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) + struct go_scourge_enclosureAI : public GameObjectAI { - Creature* gymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); - if (gymerDummy) + go_scourge_enclosureAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); - gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); - gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) + { + Creature* gymerDummy = me->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); + if (gymerDummy) + { + player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); + gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); + gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + } + } + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_enclosureAI(go); } - return true; - } -}; + }; /*###### ## Quest: Troll Patrol: The Alchemist's Apprentice @@ -552,13 +564,14 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); _playerGUID = player->GetGUID(); _getingredienttry = 1; _events.ScheduleEvent(EVENT_EASY_123, 100); + return false; } private: @@ -575,14 +588,24 @@ public: class go_finklesteins_cauldron : public GameObjectScript { -public: - go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } + public: + go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - player->CastSpell(player, SPELL_POT_CHECK); - return true; - } + struct go_finklesteins_cauldronAI : public GameObjectAI + { + go_finklesteins_cauldronAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + player->CastSpell(player, SPELL_POT_CHECK); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_finklesteins_cauldronAI(go); + } }; uint32 const FetchIngredients[21][4] = diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 46a134886f..bf9bc77bf3 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -38,25 +38,22 @@ enum BTDataTypes // Additional Data DATA_AKAMA_SHADE = 9, - DATA_AKAMA = 10, DATA_MAIEV = 11, DATA_GO_ILLIDAN_GATE = 12, DATA_BLACK_TEMPLE_TRIGGER = 13, - DATA_GATHIOS_THE_SHATTERER = 14, DATA_HIGH_NETHERMANCER_ZEREVOR = 15, DATA_LADY_MALANDE = 16, DATA_VERAS_DARKSHADOW = 17, DATA_BLOOD_ELF_COUNCIL_VOICE = 18, - DATA_GO_DEN_OF_MORTAL_DOOR = 19, - DATA_ESSENCE_OF_SUFFERING = 20, DATA_ESSENCE_OF_DESIRE = 21, DATA_ESSENCE_OF_ANGER = 22, - DATA_ILLIDAN_MUSIC_CONTROLLER = 23, + DATA_TERON_GOREFIEND_INTRO = 24, + DATA_AKAMA_ILLIDAN_INTRO = 25 }; enum TriggerEmotes diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 5da2471c0f..485ed8ef49 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -449,7 +449,7 @@ public: struct boss_illidan_stormrageAI : public BossAI { boss_illidan_stormrageAI(Creature* creature) : BossAI(creature, DATA_ILLIDAN_STORMRAGE), - _intro(true), _minionsCount(0), _flameCount(0), _orientation(0.0f), _pillarIndex(0), _phase(0), _dead(false), _isDemon(false) { } + _minionsCount(0), _flameCount(0), _orientation(0.0f), _pillarIndex(0), _phase(0), _dead(false), _isDemon(false) { } void Reset() override { @@ -465,7 +465,7 @@ public: _flameCount = 0; _phase = PHASE_1; _isDemon = false; - if (_intro && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE) + if (instance->GetData(DATA_AKAMA_ILLIDAN_INTRO) && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE) if (Creature* akama = instance->GetCreature(DATA_AKAMA)) akama->AI()->DoAction(ACTION_ACTIVE_AKAMA_INTRO); } @@ -566,7 +566,7 @@ public: akama->AI()->DoAction(ACTION_FREE); break; case ACTION_INTRO_DONE: - _intro = false; + instance->SetData(DATA_AKAMA_ILLIDAN_INTRO, 0); break; case ACTION_START_MINIONS: Talk(SAY_ILLIDAN_MINION); @@ -1021,7 +1021,6 @@ public: } private: - bool _intro; uint8 _minionsCount; uint8 _flameCount; float _orientation; @@ -1055,7 +1054,7 @@ public: _isTeleportToMinions = false; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == GOSSIP_START_INTRO) { @@ -1065,7 +1064,6 @@ public: if (Creature* illidan = _instance->GetCreature(DATA_ILLIDAN_STORMRAGE)) illidan->AI()->DoAction(ACTION_INTRO_DONE); CloseGossipMenuFor(player); - } else if (gossipListId == GOSSIP_START_FIGHT) { @@ -1074,6 +1072,7 @@ public: me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); CloseGossipMenuFor(player); } + return false; } bool CanAIAttack(Unit const* who) const override diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index d67317586a..c2131a4669 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -545,13 +545,14 @@ public: shade->AI()->EnterEvadeMode(EVADE_REASON_OTHER); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { CloseGossipMenuFor(player); _events.ScheduleEvent(EVENT_SHADE_START, Milliseconds(500)); } + return false; } private: diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 0e5d5d26f7..6df3a3dd54 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -112,10 +112,16 @@ public: struct boss_teron_gorefiendAI : public BossAI { - boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND), _intro(false) + boss_teron_gorefiendAI(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND) { } + + void Reset() override { - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - creature->SetReactState(REACT_PASSIVE); + _Reset(); + if (instance->GetData(DATA_TERON_GOREFIEND_INTRO)) + { + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_PASSIVE); + } } void EnterCombat(Unit* /*who*/) override @@ -139,9 +145,9 @@ public: void DoAction(int32 action) override { - if (action == ACTION_START_INTRO && !_intro && me->IsAlive()) + if (action == ACTION_START_INTRO && me->IsAlive()) { - _intro = true; + instance->SetData(DATA_TERON_GOREFIEND_INTRO, 0); Talk(SAY_INTRO); events.SetPhase(PHASE_INTRO); events.ScheduleEvent(EVENT_FINISH_INTRO, Seconds(20)); @@ -213,9 +219,6 @@ public: DoMeleeAttackIfReady(); } - - private: - bool _intro; }; CreatureAI* GetAI(Creature* creature) const override @@ -361,12 +364,12 @@ public: } }; -class at_teron_gorefiend_entrance : public AreaTriggerScript +class at_teron_gorefiend_entrance : public OnlyOnceAreaTriggerScript { public: - at_teron_gorefiend_entrance() : AreaTriggerScript("at_teron_gorefiend_entrance") { } + at_teron_gorefiend_entrance() : OnlyOnceAreaTriggerScript("at_teron_gorefiend_entrance") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) if (Creature* teron = instance->GetCreature(DATA_TERON_GOREFIEND)) diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index bd389da60b..3805b0d1f1 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -22,6 +22,7 @@ #include "SpellInfo.h" #include "SpellScript.h" #include "GridNotifiers.h" +#include "GameObjectAI.h" enum Texts { @@ -169,20 +170,30 @@ public: class go_najentus_spine : public GameObjectScript { -public: - go_najentus_spine() : GameObjectScript("go_najentus_spine") { } + public: + go_najentus_spine() : GameObjectScript("go_najentus_spine") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (Creature* najentus = instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS)) - if (ENSURE_AI(boss_najentus::boss_najentusAI, najentus->AI())->RemoveImpalingSpine()) - { - go->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); - go->Delete(); - } - return true; - } + struct go_najentus_spineAI : public GameObjectAI + { + go_najentus_spineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (Creature* najentus = instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS)) + if (ENSURE_AI(boss_najentus::boss_najentusAI, najentus->AI())->RemoveImpalingSpine()) + { + me->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); + me->Delete(); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_najentus_spineAI(go); + } }; // 39992 - Needle Spine Targeting diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index a12d920736..6215bc47bb 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -96,7 +96,9 @@ class instance_black_temple : public InstanceMapScript LoadDoorData(doorData); LoadObjectData(creatureData, gameObjectData); LoadBossBoundaries(boundaries); - akamaState = AKAMA_INTRO; + AkamaState = AKAMA_INTRO; + TeronGorefiendIntro = 1; + AkamaIllidanIntro = 1; } void OnGameObjectCreate(GameObject* go) override @@ -121,7 +123,7 @@ class instance_black_temple : public InstanceMapScript case NPC_ASHTONGUE_STORMCALLER: case NPC_ASHTONGUE_FERAL_SPIRIT: case NPC_STORM_FURY: - AshtongueGUIDs.emplace_back(creature->GetGUID()); + AshtongueGUIDs.push_back(creature->GetGUID()); if (GetBossState(DATA_SHADE_OF_AKAMA) == DONE) creature->SetFaction(FACTION_ASHTONGUE_DEATHSWORN); break; @@ -130,25 +132,37 @@ class instance_black_temple : public InstanceMapScript } } - uint32 GetData(uint32 data) const override + uint32 GetData(uint32 type) const override { - if (data == DATA_AKAMA) - return akamaState; - - return 0; - } - - void SetData(uint32 data, uint32 value) override - { - switch (data) + switch (type) { case DATA_AKAMA: - akamaState = value; + return AkamaState; + case DATA_TERON_GOREFIEND_INTRO: + return TeronGorefiendIntro; + case DATA_AKAMA_ILLIDAN_INTRO: + return AkamaIllidanIntro; + default: + return 0; + } + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { + case DATA_AKAMA: + AkamaState = data; break; case ACTION_OPEN_DOOR: if (GameObject* illidanGate = GetGameObject(DATA_GO_ILLIDAN_GATE)) HandleGameObject(ObjectGuid::Empty, true, illidanGate); break; + case DATA_TERON_GOREFIEND_INTRO: + TeronGorefiendIntro = data; + break; + case DATA_AKAMA_ILLIDAN_INTRO: + AkamaIllidanIntro = data; default: break; } @@ -206,7 +220,9 @@ class instance_black_temple : public InstanceMapScript protected: GuidVector AshtongueGUIDs; - uint8 akamaState; + uint8 AkamaState; + uint8 TeronGorefiendIntro; + uint8 AkamaIllidanIntro; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index 0d76678562..f7a09e9b57 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "serpent_shrine.h" #include "Spell.h" #include "Player.h" +#include "GameObjectAI.h" enum Spells { @@ -434,21 +435,31 @@ class go_strange_pool : public GameObjectScript public: go_strange_pool() : GameObjectScript("go_strange_pool") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_strange_poolAI : public GameObjectAI { - // 25% - if (InstanceScript* instanceScript = go->GetInstanceScript()) - if (!urand(0, 3)) - { - if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED) - { - go->CastSpell(player, 54587); - instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS); - } - return true; - } + go_strange_poolAI(GameObject* go) : GameObjectAI(go) { } - return false; + bool GossipHello(Player* player) override + { + // 25% + if (InstanceScript* instanceScript = me->GetInstanceScript()) + if (!urand(0, 3)) + { + if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED) + { + me->CastSpell(player, 54587); + instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS); + } + return true; + } + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_strange_poolAI(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index 26d1a8233c..160bf15faa 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "serpent_shrine.h" #include "Player.h" #include "TemporarySummon.h" +#include "GameObjectAI.h" #define MAX_ENCOUNTER 6 @@ -64,17 +65,27 @@ class go_bridge_console : public GameObjectScript public: go_bridge_console() : GameObjectScript("go_bridge_console") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_bridge_consoleAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + go_bridge_consoleAI(GameObject* go) : GameObjectAI(go) { } - if (!instance) - return false; + bool GossipHello(Player* /*player*/) override + { + InstanceScript* instance = me->GetInstanceScript(); - if (instance) - instance->SetData(DATA_CONTROL_CONSOLE, DONE); + if (!instance) + return false; - return true; + if (instance) + instance->SetData(DATA_CONTROL_CONSOLE, DONE); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bridge_consoleAI(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp index 30ea7ab41f..08298b15ea 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp @@ -18,28 +18,39 @@ #include "ScriptMgr.h" #include "InstanceScript.h" #include "steam_vault.h" +#include "GameObjectAI.h" class go_main_chambers_access_panel : public GameObjectScript { public: go_main_chambers_access_panel() : GameObjectScript("go_main_chambers_access_panel") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_main_chambers_access_panelAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_main_chambers_access_panelAI(GameObject* go) : GameObjectAI(go) { } - if (go->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL)) - instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL); + bool GossipHello(Player* /*player*/) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; - if (go->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL)) - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL); + if (me->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL)) + instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + if (me->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL)) + instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL); - return true; + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_main_chambers_access_panelAI(go); } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp index 702496500e..d169a21f0d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -23,6 +23,7 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" #include "the_slave_pens.h" +#include "GameObjectAI.h" enum Spells { @@ -646,25 +647,34 @@ class go_ahune_ice_stone : public GameObjectScript public: go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) + struct go_ahune_ice_stoneAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_ahune_ice_stoneAI(GameObject* go) : GameObjectAI(go) { } - ClearGossipMenuFor(player); - - if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_AHUNE_BUNNY))) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { - ahuneBunny->AI()->DoAction(ACTION_START_EVENT); - ahuneBunny->SetInCombatWithZone(); - } - if (Creature* luma = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_LUMA_SKYMOTHER))) - luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true); - CloseGossipMenuFor(player); - go->Delete(); + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return false; - return true; + ClearGossipMenuFor(player); + + if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY))) + { + ahuneBunny->AI()->DoAction(ACTION_START_EVENT); + ahuneBunny->SetInCombatWithZone(); + } + if (Creature* luma = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LUMA_SKYMOTHER))) + luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true); + CloseGossipMenuFor(player); + me->Delete(); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ahune_ice_stoneAI(go); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 190b41134d..f99c85a4c5 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -20,6 +20,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "blood_furnace.h" +#include "GameObjectAI.h" enum Yells { @@ -127,18 +128,28 @@ class go_broggok_lever : public GameObjectScript public: go_broggok_lever() : GameObjectScript("go_broggok_lever") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_broggok_leverAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) - { - instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); - if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_BROGGOK))) - broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); - } + go_broggok_leverAI(GameObject* go) : GameObjectAI(go) { } - go->UseDoorOrButton(); - return false; + bool GossipHello(Player* /*player*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) + { + instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); + if (Creature* broggok = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BROGGOK))) + broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); + } + + me->UseDoorOrButton(); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_broggok_leverAI(go); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index fee3364564..1c20e4c41b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -23,6 +23,7 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "PassiveAI.h" +#include "GameObjectAI.h" enum Yells { @@ -460,20 +461,30 @@ public: class go_manticron_cube : public GameObjectScript { -public: - go_manticron_cube() : GameObjectScript("go_manticron_cube") { } + public: + go_manticron_cube() : GameObjectScript("go_manticron_cube") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) - return true; + struct go_manticron_cubeAI : public GameObjectAI + { + go_manticron_cubeAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) - trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL); + bool GossipHello(Player* player) override + { + if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) + return true; - player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true); - return true; - } + if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) + trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL); + + player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_manticron_cubeAI(go); + } }; // 30541 - Blaze diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 6948561501..42d5a806e9 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -40,6 +40,7 @@ EndContentData */ #include "SpellScript.h" #include "SpellAuras.h" #include "SpellAuraEffects.h" +#include "GameObjectAI.h" /*###### ## npc_nether_drake @@ -297,46 +298,56 @@ enum LegionObelisk class go_legion_obelisk : public GameObjectScript { -public: - go_legion_obelisk() : GameObjectScript("go_legion_obelisk") { } + public: + go_legion_obelisk() : GameObjectScript("go_legion_obelisk") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE) + struct go_legion_obeliskAI : public GameObjectAI { - switch (go->GetEntry()) - { - case GO_LEGION_OBELISK_ONE: - obelisk_one = true; - break; - case GO_LEGION_OBELISK_TWO: - obelisk_two = true; - break; - case GO_LEGION_OBELISK_THREE: - obelisk_three = true; - break; - case GO_LEGION_OBELISK_FOUR: - obelisk_four = true; - break; - case GO_LEGION_OBELISK_FIVE: - obelisk_five = true; - break; - } + go_legion_obeliskAI(GameObject* go) : GameObjectAI(go) { } - if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true) + bool GossipHello(Player* player) override { - go->SummonCreature(NPC_DOOMCRYER, 2943.40f, 4778.20f, 284.49f, 0.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); - //reset global var - obelisk_one = false; - obelisk_two = false; - obelisk_three = false; - obelisk_four = false; - obelisk_five = false; + if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE) + { + switch (me->GetEntry()) + { + case GO_LEGION_OBELISK_ONE: + obelisk_one = true; + break; + case GO_LEGION_OBELISK_TWO: + obelisk_two = true; + break; + case GO_LEGION_OBELISK_THREE: + obelisk_three = true; + break; + case GO_LEGION_OBELISK_FOUR: + obelisk_four = true; + break; + case GO_LEGION_OBELISK_FIVE: + obelisk_five = true; + break; + } + + if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true) + { + me->SummonCreature(NPC_DOOMCRYER, 2943.40f, 4778.20f, 284.49f, 0.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000); + //reset global var + obelisk_one = false; + obelisk_two = false; + obelisk_three = false; + obelisk_four = false; + obelisk_five = false; + } + } + + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_legion_obeliskAI(go); } - - return true; - } }; enum SimonGame @@ -877,14 +888,24 @@ class go_simon_cluster : public GameObjectScript public: go_simon_cluster() : GameObjectScript("go_simon_cluster") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_simon_clusterAI : public GameObjectAI { - if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true)) - bunny->AI()->SetData(go->GetEntry(), 0); + go_simon_clusterAI(GameObject* go) : GameObjectAI(go) { } - player->CastSpell(player, go->GetGOInfo()->goober.spellId, true); - go->AddUse(); - return true; + bool GossipHello(Player* player) override + { + if (Creature* bunny = me->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true)) + bunny->AI()->SetData(me->GetEntry(), 0); + + player->CastSpell(player, me->GetGOInfo()->goober.spellId, true); + me->AddUse(); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_simon_clusterAI(go); } }; @@ -903,27 +924,37 @@ class go_apexis_relic : public GameObjectScript public: go_apexis_relic() : GameObjectScript("go_apexis_relic") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_apexis_relicAI : public GameObjectAI { - player->PrepareGossipMenu(go, go->GetGOInfo()->questgiver.gossipID); - player->SendPreparedGossip(go); - return true; - } + go_apexis_relicAI(GameObject* go) : GameObjectAI(go) { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - - bool large = (go->GetEntry() == GO_APEXIS_MONUMENT); - if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) + bool GossipHello(Player* player) override { - player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); - - if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ())) - bunny->AI()->SetGUID(player->GetGUID(), large); + player->PrepareGossipMenu(me, me->GetGOInfo()->questgiver.gossipID); + player->SendPreparedGossip(me); + return true; } - return true; + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + + bool large = (me->GetEntry() == GO_APEXIS_MONUMENT); + if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1)) + { + player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false); + + if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())) + bunny->AI()->SetGUID(player->GetGUID(), large); + } + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_apexis_relicAI(go); } }; diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index d15e358376..55d28f3d6a 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -273,7 +273,7 @@ public: summoned->AI()->AttackStart(me); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH) { @@ -513,15 +513,6 @@ class npc_colonel_jules : public CreatureScript public: npc_colonel_jules() : CreatureScript("npc_colonel_jules") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (ENSURE_AI(npc_colonel_jules::npc_colonel_julesAI, creature->AI())->success) - player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - struct npc_colonel_julesAI : public ScriptedAI { npc_colonel_julesAI(Creature* creature) : ScriptedAI(creature), summons(me) @@ -546,6 +537,15 @@ public: bool success; + bool GossipHello(Player* player) override + { + if (success) + player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + void DoAction(int32 action) override { switch (action) @@ -682,19 +682,20 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); switch (gossipListId) { case 1: player->PlayerTalkClass->SendCloseGossip(); - me->AI()->Talk(SAY_BARADA_1); - me->AI()->DoAction(ACTION_START_EVENT); + Talk(SAY_BARADA_1); + DoAction(ACTION_START_EVENT); break; default: break; } + return false; } void DoAction(int32 action) override @@ -938,18 +939,18 @@ class npc_magister_aledis : public CreatureScript public: npc_magister_aledis() : CreatureScript("npc_magister_aledis") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - creature->StopMoving(); - ENSURE_AI(npc_magister_aledis::npc_magister_aledisAI, creature->AI())->StartFight(player); - return true; - } - struct npc_magister_aledisAI : public ScriptedAI { npc_magister_aledisAI(Creature* creature) : ScriptedAI(creature) { } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); + me->StopMoving(); + StartFight(player); + return true; + } + void StartFight(Player* player) { me->Dismount(); diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index fd53ec8ba0..d63081c71b 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedEscortAI.h" #include "Player.h" #include "SpellInfo.h" +#include "GameObjectAI.h" /*###### ## npc_maghar_captive @@ -69,25 +70,6 @@ class npc_maghar_captive : public CreatureScript public: npc_maghar_captive() : CreatureScript("npc_maghar_captive") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H) - { - if (npc_maghar_captiveAI* EscortAI = dynamic_cast(creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); - EscortAI->Start(true, false, player->GetGUID(), quest); - creature->AI()->Talk(SAY_MAG_START); - - creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0]+2.5f, m_afAmbushA[1]-2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0]-2.5f, m_afAmbushA[1]+2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - } - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_maghar_captiveAI(creature); @@ -101,6 +83,21 @@ public: uint32 HealTimer; uint32 FrostShockTimer; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); + Start(true, false, player->GetGUID(), quest); + Talk(SAY_MAG_START); + + me->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0] + 2.5f, m_afAmbushA[1] - 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0] - 2.5f, m_afAmbushA[1] + 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + } + } + void Reset() override { ChainLightningTimer = 1000; @@ -287,43 +284,53 @@ enum CorkiData class go_corkis_prison : public GameObjectScript { -public: - go_corkis_prison() : GameObjectScript("go_corkis_prison") { } + public: + go_corkis_prison() : GameObjectScript("go_corkis_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->SetGoState(GO_STATE_READY); - if (go->GetEntry() == GO_CORKIS_PRISON) + struct go_corkis_prisonAI : public GameObjectAI { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true)) - { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_CREDIT_1); - } - } + go_corkis_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (go->GetEntry() == GO_CORKIS_PRISON_2) - { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true)) + bool GossipHello(Player* player) override { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_2); - } - } + me->SetGoState(GO_STATE_READY); + if (me->GetEntry() == GO_CORKIS_PRISON) + { + if (Creature* corki = me->FindNearestCreature(NPC_CORKI, 25, true)) + { + corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ()); + if (player) + player->KilledMonsterCredit(NPC_CORKI_CREDIT_1); + } + } - if (go->GetEntry() == GO_CORKIS_PRISON_3) - { - if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true)) - { - corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ()); - if (player) - player->KilledMonsterCredit(NPC_CORKI_CREDIT_3); + if (me->GetEntry() == GO_CORKIS_PRISON_2) + { + if (Creature* corki = me->FindNearestCreature(NPC_CORKI_2, 25, true)) + { + corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() - 5, me->GetPositionY(), me->GetPositionZ()); + if (player) + player->KilledMonsterCredit(NPC_CORKI_2); + } + } + + if (me->GetEntry() == GO_CORKIS_PRISON_3) + { + if (Creature* corki = me->FindNearestCreature(NPC_CORKI_3, 25, true)) + { + corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 4, me->GetPositionY(), me->GetPositionZ()); + if (player) + player->KilledMonsterCredit(NPC_CORKI_CREDIT_3); + } + } + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_corkis_prisonAI(go); } - return true; - } }; class npc_corki : public CreatureScript @@ -423,25 +430,6 @@ class npc_kurenai_captive : public CreatureScript public: npc_kurenai_captive() : CreatureScript("npc_kurenai_captive") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A) - { - if (npc_kurenai_captiveAI* EscortAI = dynamic_cast(creature->AI())) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_ACTIVE); - EscortAI->Start(true, false, player->GetGUID(), quest); - creature->AI()->Talk(SAY_KUR_START); - - creature->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0]+2.5f, kurenaiAmbushA[1]-2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0]-2.5f, kurenaiAmbushA[1]+2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - creature->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - } - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_kurenai_captiveAI(creature); @@ -465,6 +453,21 @@ public: uint32 HealTimer; uint32 FrostShockTimer; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_ACTIVE); + Start(true, false, player->GetGUID(), quest); + Talk(SAY_KUR_START); + + me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0] + 2.5f, kurenaiAmbushA[1] - 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0] - 2.5f, kurenaiAmbushA[1] + 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + } + } + void Reset() override { Initialize(); @@ -602,20 +605,30 @@ class go_warmaul_prison : public GameObjectScript public: go_warmaul_prison() : GameObjectScript("go_warmaul_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_warmaul_prisonAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE) - return false; + go_warmaul_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* prisoner = go->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f)) + bool GossipHello(Player* player) override { - player->KilledMonsterCredit(NPC_MAGHAR_PRISONER); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE) + return false; - prisoner->AI()->Talk(SAY_FREE, player); - prisoner->DespawnOrUnsummon(6000); + if (Creature* prisoner = me->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f)) + { + player->KilledMonsterCredit(NPC_MAGHAR_PRISONER); + + prisoner->AI()->Talk(SAY_FREE, player); + prisoner->DespawnOrUnsummon(6000); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_warmaul_prisonAI(go); } }; diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index 4f2eccd751..fd7c47b5c5 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -35,6 +35,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" #include "Player.h" +#include "GameObjectAI.h" /*###### ## npc_commander_dawnforge @@ -489,74 +490,73 @@ enum BessyData class npc_bessy : public CreatureScript { -public: - npc_bessy() : CreatureScript("npc_bessy") { } + public: + npc_bessy() : CreatureScript("npc_bessy") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == Q_ALMABTRIEB) + CreatureAI* GetAI(Creature* creature) const override { - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_bessyAI(creature); - } - - struct npc_bessyAI : public npc_escortAI - { - npc_bessyAI(Creature* creature) : npc_escortAI(creature) { } - - void JustDied(Unit* /*killer*/) override - { - if (Player* player = GetPlayerForEscort()) - player->FailQuest(Q_ALMABTRIEB); + return new npc_bessyAI(creature); } - void WaypointReached(uint32 waypointId) override + struct npc_bessyAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_bessyAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void QuestAccept(Player* player, Quest const* quest) override { - case 3: //first spawn - me->SummonCreature(SPAWN_FIRST, 2449.67f, 2183.11f, 96.85f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_FIRST, 2449.53f, 2184.43f, 96.36f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_FIRST, 2449.85f, 2186.34f, 97.57f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 7: - me->SummonCreature(SPAWN_SECOND, 2309.64f, 2186.24f, 92.25f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(SPAWN_SECOND, 2309.25f, 2183.46f, 91.75f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 12: - player->GroupEventHappens(Q_ALMABTRIEB, me); - if (me->FindNearestCreature(N_THADELL, 30)) - Talk(SAY_THADELL_1); - break; - case 13: - if (me->FindNearestCreature(N_THADELL, 30)) - Talk(SAY_THADELL_2, player); - break; + if (quest->GetQuestId() == Q_ALMABTRIEB) + { + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + Start(true, false, player->GetGUID()); + } } - } - void JustSummoned(Creature* summoned) override - { - summoned->AI()->AttackStart(me); - } + void JustDied(Unit* /*killer*/) override + { + if (Player* player = GetPlayerForEscort()) + player->FailQuest(Q_ALMABTRIEB); + } - void Reset() override - { - me->RestoreFaction(); - } - }; + void WaypointReached(uint32 waypointId) override + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 3: //first spawn + me->SummonCreature(SPAWN_FIRST, 2449.67f, 2183.11f, 96.85f, 6.20f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_FIRST, 2449.53f, 2184.43f, 96.36f, 6.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_FIRST, 2449.85f, 2186.34f, 97.57f, 6.08f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 7: + me->SummonCreature(SPAWN_SECOND, 2309.64f, 2186.24f, 92.25f, 6.06f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(SPAWN_SECOND, 2309.25f, 2183.46f, 91.75f, 6.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 12: + player->GroupEventHappens(Q_ALMABTRIEB, me); + if (me->FindNearestCreature(N_THADELL, 30)) + Talk(SAY_THADELL_1); + break; + case 13: + if (me->FindNearestCreature(N_THADELL, 30)) + Talk(SAY_THADELL_2, player); + break; + } + } + + void JustSummoned(Creature* summoned) override + { + summoned->AI()->AttackStart(me); + } + + void Reset() override + { + me->RestoreFaction(); + } + }; }; /*###### @@ -654,20 +654,16 @@ public: } DoMeleeAttackIfReady(); } - }; - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE) + void QuestAccept(Player* player, const Quest* quest) override { - if (npc_maxx_a_million_escortAI* pEscortAI = CAST_AI(npc_maxx_a_million_escort::npc_maxx_a_million_escortAI, creature->AI())) + if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE) { - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - pEscortAI->Start(false, false, player->GetGUID()); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + Start(false, false, player->GetGUID()); } } - return true; - } + }; }; /*###### @@ -685,16 +681,26 @@ class go_captain_tyralius_prison : public GameObjectScript public: go_captain_tyralius_prison() : GameObjectScript("go_captain_tyralius_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_captain_tyralius_prisonAI : public GameObjectAI { - go->UseDoorOrButton(); - if (Creature* tyralius = go->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f)) + go_captain_tyralius_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS); - tyralius->AI()->Talk(SAY_FREE); - tyralius->DespawnOrUnsummon(8000); + me->UseDoorOrButton(); + if (Creature* tyralius = me->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f)) + { + player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS); + tyralius->AI()->Talk(SAY_FREE); + tyralius->DespawnOrUnsummon(8000); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_captain_tyralius_prisonAI(go); } }; diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index a7c4bf2829..0acc455a62 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -44,6 +44,7 @@ EndContentData */ #include "SpellScript.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" /*##### # npc_invis_infernal_caster @@ -591,19 +592,6 @@ class npc_earthmender_wilda : public CreatureScript public: npc_earthmender_wilda() : CreatureScript("npc_earthmender_wilda") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR) - { - creature->AI()->Talk(SAY_WIL_START, player); - creature->SetFaction(FACTION_EARTHEN_RING); - - if (npc_earthmender_wildaAI* pEscortAI = CAST_AI(npc_earthmender_wilda::npc_earthmender_wildaAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_earthmender_wildaAI(creature); @@ -623,6 +611,16 @@ public: uint32 m_uiHealingTimer; + void QuestAccept(Player* player, const Quest* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR) + { + Talk(SAY_WIL_START, player); + me->SetFaction(FACTION_EARTHEN_RING); + Start(false, false, player->GetGUID(), quest); + } + } + void Reset() override { Initialize(); @@ -1341,24 +1339,33 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave() class go_crystal_prison : public GameObjectScript { -public: - go_crystal_prison() : GameObjectScript("go_crystal_prison") { } + public: + go_crystal_prison() : GameObjectScript("go_crystal_prison") { } - bool OnQuestAccept(Player* player, GameObject* /*go*/, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH) + struct go_crystal_prisonAI : public GameObjectAI { - Creature* Illidan = player->FindNearestCreature(22083, 50); + go_crystal_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (Illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted) + void QuestAccept(Player* player, Quest const* quest) override { - ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID(); - ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0; - ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true; + if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH) + { + Creature* Illidan = player->FindNearestCreature(22083, 50); + + if (Illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted) + { + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0; + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true; + } + } } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_crystal_prisonAI(go); } - return true; - } }; /*#### diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index cce88ab584..9b4c738c78 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -39,6 +39,7 @@ EndContentData */ #include "Group.h" #include "Player.h" #include "WorldSession.h" +#include "GameObjectAI.h" /*###### ## npc_unkor_the_ruthless @@ -322,96 +323,97 @@ enum Floon class npc_floon : public CreatureScript { -public: - npc_floon() : CreatureScript("npc_floon") { } + public: + npc_floon() : CreatureScript("npc_floon") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) + CreatureAI* GetAI(Creature* creature) const override { - AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, creature->GetGUID()); - } - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_ARAKKOA); - creature->AI()->Talk(SAY_FLOON_ATTACK, player); - creature->AI()->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_floonAI(creature); - } - - struct npc_floonAI : public ScriptedAI - { - npc_floonAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - m_uiNormFaction = creature->GetFaction(); + return new npc_floonAI(creature); } - void Initialize() + struct npc_floonAI : public ScriptedAI { - Silence_Timer = 2000; - Frostbolt_Timer = 4000; - FrostNova_Timer = 9000; - } - - uint32 m_uiNormFaction; - uint32 Silence_Timer; - uint32 Frostbolt_Timer; - uint32 FrostNova_Timer; - - void Reset() override - { - Initialize(); - if (me->GetFaction() != m_uiNormFaction) - me->SetFaction(m_uiNormFaction); - } - - void EnterCombat(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (Silence_Timer <= diff) + npc_floonAI(Creature* creature) : ScriptedAI(creature) { - DoCastVictim(SPELL_SILENCE); - Silence_Timer = 30000; - } else Silence_Timer -= diff; + Initialize(); + m_uiNormFaction = creature->GetFaction(); + } - if (FrostNova_Timer <= diff) + void Initialize() { - DoCast(me, SPELL_FROST_NOVA); - FrostNova_Timer = 20000; - } else FrostNova_Timer -= diff; + Silence_Timer = 2000; + Frostbolt_Timer = 4000; + FrostNova_Timer = 9000; + } - if (Frostbolt_Timer <= diff) + uint32 m_uiNormFaction; + uint32 Silence_Timer; + uint32 Frostbolt_Timer; + uint32 FrostNova_Timer; + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - DoCastVictim(SPELL_FROSTBOLT); - Frostbolt_Timer = 5000; - } else Frostbolt_Timer -= diff; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, me->GetGUID()); + } + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + me->SetFaction(FACTION_ARAKKOA); + Talk(SAY_FLOON_ATTACK, player); + AttackStart(player); + } + return true; + } - DoMeleeAttackIfReady(); - } - }; + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + + SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, me->GetGUID()); + return true; + } + + void Reset() override + { + Initialize(); + if (me->GetFaction() != m_uiNormFaction) + me->SetFaction(m_uiNormFaction); + } + + void EnterCombat(Unit* /*who*/) override { } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (Silence_Timer <= diff) + { + DoCastVictim(SPELL_SILENCE); + Silence_Timer = 30000; + } else Silence_Timer -= diff; + + if (FrostNova_Timer <= diff) + { + DoCast(me, SPELL_FROST_NOVA); + FrostNova_Timer = 20000; + } else FrostNova_Timer -= diff; + + if (Frostbolt_Timer <= diff) + { + DoCastVictim(SPELL_FROSTBOLT); + Frostbolt_Timer = 5000; + } else Frostbolt_Timer -= diff; + + DoMeleeAttackIfReady(); + } + }; }; /*###### @@ -493,17 +495,16 @@ public: player->FailQuest(ESCAPE_FROM_FIREWING_POINT_H); } } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) + void QuestAccept(Player* player, Quest const* quest) override { - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) + { + Start(true, false, player->GetGUID()); + me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -531,51 +532,64 @@ enum SkullPile class go_skull_pile : public GameObjectScript { -public: - go_skull_pile() : GameObjectScript("go_skull_pile") { } + public: + go_skull_pile() : GameObjectScript("go_skull_pile") { } - bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + struct go_skull_pileAI : public GameObjectAI { - case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break; - } - return true; - } + go_skull_pileAI(GameObject* go) : GameObjectAI(go) { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + ClearGossipMenuFor(player); + switch (gossipListId) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, me, gossipListId); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) + { + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + } + + SendGossipMenuFor(player, me->GetGOInfo()->questgiver.gossipID, me->GetGUID()); + return true; + } + + private: + void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action) const + { + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + player->CastSpell(player, SUMMON_KARROG, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false); + break; + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + return new go_skull_pileAI(go); } - - SendGossipMenuFor(player, go->GetGOInfo()->questgiver.gossipID, go->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - player->CastSpell(player, SUMMON_KARROG, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false); - break; - } - } }; /*###### @@ -591,30 +605,40 @@ enum Slim class npc_slim : public CreatureScript { -public: - npc_slim() : CreatureScript("npc_slim") { } + public: + npc_slim() : CreatureScript("npc_slim") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) + struct npc_slimAI : public ScriptedAI { - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, creature->GetGUID()); - } - else - SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, creature->GetGUID()); + npc_slimAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + ClearGossipMenuFor(player); + if (gossipListId == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) + { + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, me->GetGUID()); + } + else + SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, me->GetGUID()); + + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_slimAI(creature); + } }; /*######## @@ -629,57 +653,55 @@ enum Akuno class npc_akuno : public CreatureScript { -public: - npc_akuno() : CreatureScript("npc_akuno") { } + public: + npc_akuno() : CreatureScript("npc_akuno") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB) + CreatureAI* GetAI(Creature* creature) const override { - if (npc_akunoAI* pEscortAI = CAST_AI(npc_akuno::npc_akunoAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); - - if (player->GetTeamId() == TEAM_ALLIANCE) - creature->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); - else - creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_PASSIVE); + return new npc_akunoAI(creature); } - return true; - } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_akunoAI(creature); - } - - struct npc_akunoAI : public npc_escortAI - { - npc_akunoAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) override + struct npc_akunoAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_akunoAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void QuestAccept(Player* player, Quest const* quest) override { - case 3: - me->SummonCreature(NPC_CABAL_SKRIMISHER, -2795.99f, 5420.33f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(NPC_CABAL_SKRIMISHER, -2793.55f, 5412.79f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 11: - if (player->GetTypeId() == TYPEID_PLAYER) - player->GroupEventHappens(QUEST_ESCAPING_THE_TOMB, me); - break; - } - } + if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB) + { + Start(false, false, player->GetGUID()); - void JustSummoned(Creature* summon) override - { - summon->AI()->AttackStart(me); - } - }; + if (player->GetTeamId() == TEAM_ALLIANCE) + me->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); + else + me->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_PASSIVE); + } + } + + void WaypointReached(uint32 waypointId) override + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 3: + me->SummonCreature(NPC_CABAL_SKRIMISHER, -2795.99f, 5420.33f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_CABAL_SKRIMISHER, -2793.55f, 5412.79f, -34.53f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 11: + if (player->GetTypeId() == TYPEID_PLAYER) + player->GroupEventHappens(QUEST_ESCAPING_THE_TOMB, me); + break; + } + } + + void JustSummoned(Creature* summon) override + { + summon->AI()->AttackStart(me); + } + }; }; void AddSC_terokkar_forest() diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp index 8baffeed08..e4d352f922 100644 --- a/src/server/scripts/Outland/zone_zangarmarsh.cpp +++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp @@ -60,91 +60,102 @@ enum AshyenAndKeleth class npcs_ashyen_and_keleth : public CreatureScript { -public: - npcs_ashyen_and_keleth() : CreatureScript("npcs_ashyen_and_keleth") { } + public: + npcs_ashyen_and_keleth() : CreatureScript("npcs_ashyen_and_keleth") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetReputationRank(942) > REP_NEUTRAL) + struct npcs_ashyen_and_kelethAI : public ScriptedAI { - if (creature->GetEntry() == NPC_ASHYEN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + npcs_ashyen_and_kelethAI(Creature* creature) : ScriptedAI(creature) { } - if (creature->GetEntry() == NPC_KELETH) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - creature->setPowerType(POWER_MANA); - creature->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case - creature->SetPower(POWER_MANA, 200); - - if (creature->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with + bool GossipHello(Player* player) override { - uint32 spell = 0; - switch (player->GetReputationRank(942)) - { //mark of lore - case REP_FRIENDLY: - spell = SPELL_BLESS_ASH_FRI; - break; - case REP_HONORED: - spell = SPELL_BLESS_ASH_HON; - break; - case REP_REVERED: - spell = SPELL_BLESS_ASH_REV; - break; - case REP_EXALTED: - spell = SPELL_BLESS_ASH_EXA; - break; - default: - break; - } - - if (spell) + if (player->GetReputationRank(942) > REP_NEUTRAL) { - creature->CastSpell(player, spell, true); + if (me->GetEntry() == NPC_ASHYEN) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + if (me->GetEntry() == NPC_KELETH) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; } - if (creature->GetEntry() == NPC_KELETH) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - uint32 spell = 0; - switch (player->GetReputationRank(942)) //mark of war + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) { - case REP_FRIENDLY: - spell = SPELL_BLESS_KEL_FRI; - break; - case REP_HONORED: - spell = SPELL_BLESS_KEL_HON; - break; - case REP_REVERED: - spell = SPELL_BLESS_KEL_REV; - break; - case REP_EXALTED: - spell = SPELL_BLESS_KEL_EXA; - break; - default: - break; - } + me->setPowerType(POWER_MANA); + me->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case + me->SetPower(POWER_MANA, 200); - if (spell) - { - creature->CastSpell(player, spell, true); + if (me->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with + { + uint32 spell = 0; + switch (player->GetReputationRank(942)) + { //mark of lore + case REP_FRIENDLY: + spell = SPELL_BLESS_ASH_FRI; + break; + case REP_HONORED: + spell = SPELL_BLESS_ASH_HON; + break; + case REP_REVERED: + spell = SPELL_BLESS_ASH_REV; + break; + case REP_EXALTED: + spell = SPELL_BLESS_ASH_EXA; + break; + default: + break; + } + + if (spell) + { + me->CastSpell(player, spell, true); + } + } + + if (me->GetEntry() == NPC_KELETH) + { + uint32 spell = 0; + switch (player->GetReputationRank(942)) //mark of war + { + case REP_FRIENDLY: + spell = SPELL_BLESS_KEL_FRI; + break; + case REP_HONORED: + spell = SPELL_BLESS_KEL_HON; + break; + case REP_REVERED: + spell = SPELL_BLESS_KEL_REV; + break; + case REP_EXALTED: + spell = SPELL_BLESS_KEL_EXA; + break; + default: + break; + } + + if (spell) + { + me->CastSpell(player, spell, true); + } + } + CloseGossipMenuFor(player); + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); } + return true; } - CloseGossipMenuFor(player); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npcs_ashyen_and_kelethAI(creature); } - return true; - } }; /*###### @@ -165,64 +176,61 @@ enum Kayra class npc_kayra_longmane : public CreatureScript { -public: - npc_kayra_longmane() : CreatureScript("npc_kayra_longmane") { } + public: + npc_kayra_longmane() : CreatureScript("npc_kayra_longmane") { } - struct npc_kayra_longmaneAI : public npc_escortAI - { - npc_kayra_longmaneAI(Creature* creature) : npc_escortAI(creature) { } - - void Reset() override { } - - void WaypointReached(uint32 waypointId) override + struct npc_kayra_longmaneAI : public npc_escortAI { - Player* player = GetPlayerForEscort(); - if (!player) - return; + npc_kayra_longmaneAI(Creature* creature) : npc_escortAI(creature) { } - switch (waypointId) + void Reset() override { } + + void WaypointReached(uint32 waypointId) override { - case 4: - Talk(SAY_AMBUSH1, player); - DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 5: - Talk(SAY_PROGRESS, player); - SetRun(); - break; - case 16: - Talk(SAY_AMBUSH2, player); - DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case 17: - SetRun(false); - break; - case 25: - Talk(SAY_END, player); - player->GroupEventHappens(QUEST_ESCAPE_FROM, me); - break; + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 4: + Talk(SAY_AMBUSH1, player); + DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 5: + Talk(SAY_PROGRESS, player); + SetRun(); + break; + case 16: + Talk(SAY_AMBUSH2, player); + DoSpawnCreature(NPC_SLAVEBINDER, -10.0f, -5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + DoSpawnCreature(NPC_SLAVEBINDER, -8.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + break; + case 17: + SetRun(false); + break; + case 25: + Talk(SAY_END, player); + player->GroupEventHappens(QUEST_ESCAPE_FROM, me); + break; + } } - } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_FROM) + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPE_FROM) + { + Talk(SAY_START, player); + Start(false, false, player->GetGUID()); + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - creature->AI()->Talk(SAY_START, player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_kayra_longmane::npc_kayra_longmaneAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); + return new npc_kayra_longmaneAI(creature); } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kayra_longmaneAI(creature); - } }; /*###### diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 0044fdea04..4d7193e8b6 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -38,6 +38,9 @@ enum HunterSpells SPELL_HUNTER_FIRE = 82926, SPELL_HUNTER_GENERIC_ENERGIZE_FOCUS = 91954, SPELL_HUNTER_IMPROVED_MEND_PET = 24406, + SPELL_HUNTER_IMPROVED_SERPENT_STING_DAMAGE = 83077, + SPELL_HUNTER_IMPROVED_SERPENT_STING_R1 = 19464, + SPELL_HUNTER_IMPROVED_SERPENT_STING_R2 = 82834, SPELL_HUNTER_INSANITY = 95809, SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398, SPELL_HUNTER_LOCK_AND_LOAD = 56453, @@ -1246,6 +1249,58 @@ class spell_hun_wild_quiver : public SpellScriptLoader } }; +// 1978 - Serpent Sting +class spell_hun_serpent_sting : public SpellScriptLoader +{ + public: + spell_hun_serpent_sting() : SpellScriptLoader("spell_hun_serpent_sting") { } + + class spell_hun_serpent_sting_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_serpent_sting_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_HUNTER_IMPROVED_SERPENT_STING_DAMAGE, + SPELL_HUNTER_IMPROVED_SERPENT_STING_R1, + SPELL_HUNTER_IMPROVED_SERPENT_STING_R2 + }); + } + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + { + uint32 spellId = 0; + + if (caster->HasAura(SPELL_HUNTER_IMPROVED_SERPENT_STING_R2)) + spellId = SPELL_HUNTER_IMPROVED_SERPENT_STING_R2; + else if (caster->HasAura(SPELL_HUNTER_IMPROVED_SERPENT_STING_R1)) + spellId = SPELL_HUNTER_IMPROVED_SERPENT_STING_R1; + + if (Aura* stingAura = caster->GetAura(spellId)) + { + uint32 periodicDamage = aurEff->GetAmount() * aurEff->GetTotalTicks(); + uint32 damage = CalculatePct(periodicDamage * stingAura->GetSpellInfo()->Effects[EFFECT_0].BasePoints, 1); + caster->CastCustomSpell(SPELL_HUNTER_IMPROVED_SERPENT_STING_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true); + } + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_hun_serpent_sting_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_serpent_sting_AuraScript(); + } +}; + void AddSC_hunter_spell_scripts() { new spell_hun_ancient_hysteria(); @@ -1267,6 +1322,7 @@ void AddSC_hunter_spell_scripts() new spell_hun_readiness(); new spell_hun_ready_set_aim(); new spell_hun_scatter_shot(); + new spell_hun_serpent_sting(); new spell_hun_sniper_training(); new spell_hun_steady_shot(); new spell_hun_improved_steady_shot(); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 4ed7919d0a..ff802462c7 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -56,8 +56,8 @@ enum MageSpells SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1 = 11210, SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1 = 83046, SPELL_MAGE_IMPROVED_POLYMORPH_MARKER = 87515, - SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413, + SPELL_MAGE_INCANTERS_ABSORBTION_KNOCKBACK = 86261, SPELL_MAGE_IGNITE = 12654, SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077, SPELL_MAGE_PERMAFROST = 91394, @@ -172,31 +172,6 @@ enum MageSpellIcons SPELL_ICON_MAGE_SHATTERED_BARRIER = 2945 }; -// Incanter's Absorbtion -class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript -{ - public: - bool Validate(SpellInfo const* /*spellInfo*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1)) - return false; - return true; - } - - void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) - { - Unit* target = GetTarget(); - - if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) - { - int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); - target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); - } - } -}; - // 11113 - Blast Wave class spell_mage_blast_wave : public SpellScriptLoader { @@ -499,7 +474,7 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader public: spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { } - class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript + class spell_mage_fire_frost_ward_AuraScript : public AuraScript { PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript); @@ -548,7 +523,6 @@ class spell_mage_fire_frost_ward : public SpellScriptLoader { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0); - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0); } }; @@ -929,6 +903,17 @@ class spell_mage_mage_ward : public SpellScriptLoader { PrepareAuraScript(spell_mage_mage_ward_AuraScript); + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + { + // 80,7% of the spellpower as bonus + float bonus = 0.807f * caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); + amount += int32(bonus); + } + } + void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) { if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) @@ -940,7 +925,8 @@ class spell_mage_mage_ward : public SpellScriptLoader void Register() override { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mage_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0); } }; @@ -961,6 +947,26 @@ class spell_mage_mana_shield : public SpellScriptLoader { PrepareAuraScript(spell_mage_mana_shield_AuraScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, + SPELL_MAGE_INCANTERS_ABSORBTION_KNOCKBACK + }); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + { + // 87% of the spellpower as bonus + float bonus = 0.807f * caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()); + amount += int32(bonus); + } + } + void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) { if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) @@ -972,12 +978,14 @@ class spell_mage_mana_shield : public SpellScriptLoader void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) - GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_R1, true); + if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0)) + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) + GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_KNOCKBACK, true); } void Register() override { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD); AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::HandleAbsorb, EFFECT_0); AfterEffectRemove += AuraEffectRemoveFn(spell_mage_mana_shield_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MANA_SHIELD, AURA_EFFECT_HANDLE_REAL); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index ab1a194351..3cef4f9182 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -928,7 +928,7 @@ class spell_q9874_liquid_fire : public SpellScriptLoader { Player* caster = GetCaster()->ToPlayer(); if (Creature* target = GetHitCreature()) - if (target && !target->HasAura(SPELL_FLAMES)) + if (!target->HasAura(SPELL_FLAMES)) { caster->KilledMonsterCredit(NPC_VILLAGER_KILL_CREDIT); target->CastSpell(target, SPELL_FLAMES, true); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 3d5369b45e..78f2c46899 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -65,14 +65,24 @@ enum CatFigurine class go_cat_figurine : public GameObjectScript { -public: - go_cat_figurine() : GameObjectScript("go_cat_figurine") { } + public: + go_cat_figurine() : GameObjectScript("go_cat_figurine") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); - return false; - } + struct go_cat_figurineAI : public GameObjectAI + { + go_cat_figurineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_cat_figurineAI(go); + } }; /*###### @@ -81,16 +91,26 @@ public: class go_barov_journal : public GameObjectScript { -public: - go_barov_journal() : GameObjectScript("go_barov_journal") { } + public: + go_barov_journal() : GameObjectScript("go_barov_journal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) - player->CastSpell(player, 26095, false); + struct go_barov_journalAI : public GameObjectAI + { + go_barov_journalAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) + player->CastSpell(player, 26095, false); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_barov_journalAI(go); + } }; /*###### @@ -105,21 +125,31 @@ enum GildedBrazier class go_gilded_brazier : public GameObjectScript { -public: - go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } + public: + go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + struct go_gilded_brazierAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + go_gilded_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) - Stillblade->AI()->AttackStart(player); + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + { + if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + { + if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) + Stillblade->AI()->AttackStart(player); + } + } + return true; } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gilded_brazierAI(go); } - return true; - } }; /*###### @@ -128,16 +158,26 @@ public: class go_orb_of_command : public GameObjectScript { -public: - go_orb_of_command() : GameObjectScript("go_orb_of_command") { } + public: + go_orb_of_command() : GameObjectScript("go_orb_of_command") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestRewardStatus(7761)) - player->CastSpell(player, 23460, true); + struct go_orb_of_commandAI : public GameObjectAI + { + go_orb_of_commandAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (player->GetQuestRewardStatus(7761)) + player->CastSpell(player, 23460, true); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_commandAI(go); + } }; /*###### @@ -146,16 +186,26 @@ public: class go_tablet_of_madness : public GameObjectScript { -public: - go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } + public: + go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) - player->CastSpell(player, 24267, false); + struct go_tablet_of_madnessAI : public GameObjectAI + { + go_tablet_of_madnessAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) + player->CastSpell(player, 24267, false); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_madnessAI(go); + } }; /*###### @@ -164,20 +214,30 @@ public: class go_tablet_of_the_seven : public GameObjectScript { -public: - go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { } + public: + go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { } - /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support. - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) - return true; + struct go_tablet_of_the_sevenAI : public GameObjectAI + { + go_tablet_of_the_sevenAI(GameObject* go) : GameObjectAI(go) { } - if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 15065, false); + /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support. + bool GossipHello(Player* player) override + { + if (me->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + return true; - return true; - } + if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 15065, false); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_the_sevenAI(go); + } }; /*##### @@ -186,16 +246,26 @@ public: class go_jump_a_tron : public GameObjectScript { -public: - go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } + public: + go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 33382, true); + struct go_jump_a_tronAI : public GameObjectAI + { + go_jump_a_tronAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 33382, true); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_jump_a_tronAI(go); + } }; /*###### @@ -220,43 +290,53 @@ const uint32 NpcPrisonEntry[] = class go_ethereum_prison : public GameObjectScript { -public: - go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } + public: + go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); - - if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + struct go_ethereum_prisonAI : public GameObjectAI { - if (!creature->IsHostileTo(player)) + go_ethereum_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) + me->UseDoorOrButton(); + int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); + + if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { - uint32 Spell = 0; - - switch (pFaction->faction) + if (!creature->IsHostileTo(player)) { - case 1011: Spell = SPELL_REP_LC; break; - case 935: Spell = SPELL_REP_SHAT; break; - case 942: Spell = SPELL_REP_CE; break; - case 933: Spell = SPELL_REP_CON; break; - case 989: Spell = SPELL_REP_KT; break; - case 970: Spell = SPELL_REP_SPOR; break; + if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) + { + uint32 Spell = 0; + + switch (pFaction->faction) + { + case 1011: Spell = SPELL_REP_LC; break; + case 935: Spell = SPELL_REP_SHAT; break; + case 942: Spell = SPELL_REP_CE; break; + case 933: Spell = SPELL_REP_CON; break; + case 989: Spell = SPELL_REP_KT; break; + case 970: Spell = SPELL_REP_SPOR; break; + } + + if (Spell) + creature->CastSpell(player, Spell, false); + else + TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction()); + } } - - if (Spell) - creature->CastSpell(player, Spell, false); - else - TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction()); } - } - } - return false; - } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_prisonAI(go); + } }; /*###### @@ -270,19 +350,29 @@ const uint32 NpcStasisEntry[] = class go_ethereum_stasis : public GameObjectScript { -public: - go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } + public: + go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); + struct go_ethereum_stasisAI : public GameObjectAI + { + go_ethereum_stasisAI(GameObject* go) : GameObjectAI(go) { } - player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + bool GossipHello(Player* player) override + { + me->UseDoorOrButton(); + int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); - return false; - } + player->SummonCreature(NpcStasisEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_stasisAI(go); + } }; /*###### @@ -296,16 +386,26 @@ enum ResoniteCask class go_resonite_cask : public GameObjectScript { -public: - go_resonite_cask() : GameObjectScript("go_resonite_cask") { } + public: + go_resonite_cask() : GameObjectScript("go_resonite_cask") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + struct go_resonite_caskAI : public GameObjectAI + { + go_resonite_caskAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* /*player*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + me->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_resonite_caskAI(go); + } }; /*###### @@ -319,16 +419,26 @@ enum SacredFireOfLife class go_sacred_fire_of_life : public GameObjectScript { -public: - go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } + public: + go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + struct go_sacred_fire_of_lifeAI : public GameObjectAI + { + go_sacred_fire_of_lifeAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_sacred_fire_of_lifeAI(go); + } }; /*###### @@ -347,34 +457,44 @@ enum ShrineOfTheBirds class go_shrine_of_the_birds : public GameObjectScript { -public: - go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } + public: + go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - uint32 BirdEntry = 0; - - float fX, fY, fZ; - go->GetClosePoint(fX, fY, fZ, go->GetObjectSize(), INTERACTION_DISTANCE); - - switch (go->GetEntry()) + struct go_shrine_of_the_birdsAI : public GameObjectAI { - case GO_SHRINE_HAWK: - BirdEntry = NPC_HAWK_GUARD; - break; - case GO_SHRINE_EAGLE: - BirdEntry = NPC_EAGLE_GUARD; - break; - case GO_SHRINE_FALCON: - BirdEntry = NPC_FALCON_GUARD; - break; + go_shrine_of_the_birdsAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + uint32 BirdEntry = 0; + + float fX, fY, fZ; + me->GetClosePoint(fX, fY, fZ, me->GetObjectSize(), INTERACTION_DISTANCE); + + switch (me->GetEntry()) + { + case GO_SHRINE_HAWK: + BirdEntry = NPC_HAWK_GUARD; + break; + case GO_SHRINE_EAGLE: + BirdEntry = NPC_EAGLE_GUARD; + break; + case GO_SHRINE_FALCON: + BirdEntry = NPC_FALCON_GUARD; + break; + } + + if (BirdEntry) + player->SummonCreature(BirdEntry, fX, fY, fZ, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shrine_of_the_birdsAI(go); } - - if (BirdEntry) - player->SummonCreature(BirdEntry, fX, fY, fZ, go->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - - return false; - } }; /*###### @@ -390,19 +510,29 @@ enum Southfury class go_southfury_moonstone : public GameObjectScript { -public: - go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } + public: + go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose - //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); + struct go_southfury_moonstoneAI : public GameObjectAI + { + go_southfury_moonstoneAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) - creature->CastSpell(player, SPELL_BLACKJACK, false); + bool GossipHello(Player* player) override + { + //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose + //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); - return false; - } + if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) + creature->CastSpell(player, SPELL_BLACKJACK, false); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_southfury_moonstoneAI(go); + } }; /*###### @@ -419,18 +549,28 @@ enum DalaranCrystal class go_tele_to_dalaran_crystal : public GameObjectScript { -public: - go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } + public: + go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) - return false; + struct go_tele_to_dalaran_crystalAI : public GameObjectAI + { + go_tele_to_dalaran_crystalAI(GameObject* go) : GameObjectAI(go) { } - player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + bool GossipHello(Player* player) override + { + if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) + return false; - return true; - } + player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_dalaran_crystalAI(go); + } }; /*###### @@ -439,16 +579,26 @@ public: class go_tele_to_violet_stand : public GameObjectScript { -public: - go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } + public: + go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) - return false; + struct go_tele_to_violet_standAI : public GameObjectAI + { + go_tele_to_violet_standAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) + return false; + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_violet_standAI(go); + } }; /*###### @@ -469,45 +619,56 @@ enum FelCrystalforge class go_fel_crystalforge : public GameObjectScript { -public: - go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } + public: + go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct go_fel_crystalforgeAI : public GameObjectAI { - case GOSSIP_ACTION_INFO_DEF: - player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: + go_fel_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); - break; + + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); + break; + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_fel_crystalforgeAI(go); } - return true; - } }; /*###### @@ -528,45 +689,56 @@ enum BashirCrystalforge class go_bashir_crystalforge : public GameObjectScript { -public: - go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } + public: + go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct go_bashir_crystalforgeAI : public GameObjectAI { - case GOSSIP_ACTION_INFO_DEF: - player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: + go_bashir_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); - break; + + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); + break; + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bashir_crystalforgeAI(go); } - return true; - } }; /*###### @@ -592,46 +764,56 @@ enum MatrixPunchograph class go_matrix_punchograph : public GameObjectScript { -public: - go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } + public: + go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - switch (go->GetEntry()) + struct go_matrix_punchographAI : public GameObjectAI { - case MATRIX_PUNCHOGRAPH_3005_A: - if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) + go_matrix_punchographAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + switch (me->GetEntry()) { - player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); + case MATRIX_PUNCHOGRAPH_3005_A: + if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_B: + if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_C: + if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_RED_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_D: + if (player->HasItemCount(ITEM_RED_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true); + } + break; + default: + break; } - break; - case MATRIX_PUNCHOGRAPH_3005_B: - if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_C: - if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_RED_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_D: - if (player->HasItemCount(ITEM_RED_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true); - } - break; - default: - break; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_matrix_punchographAI(go); } - return false; - } }; /*###### @@ -645,20 +827,30 @@ enum ScourgeCage class go_scourge_cage : public GameObjectScript { -public: - go_scourge_cage() : GameObjectScript("go_scourge_cage") { } + public: + go_scourge_cage() : GameObjectScript("go_scourge_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + struct go_scourge_cageAI : public GameObjectAI { - player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); - pNearestPrisoner->DisappearAndDie(); - } + go_scourge_cageAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + me->UseDoorOrButton(); + if (Creature* pNearestPrisoner = me->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + { + player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); + pNearestPrisoner->DisappearAndDie(); + } + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_cageAI(go); + } }; /*###### @@ -673,19 +865,29 @@ enum ArcanePrison class go_arcane_prison : public GameObjectScript { -public: - go_arcane_prison() : GameObjectScript("go_arcane_prison") { } + public: + go_arcane_prison() : GameObjectScript("go_arcane_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + struct go_arcane_prisonAI : public GameObjectAI { - go->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); - player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); - return true; + go_arcane_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + { + me->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); + player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); + return true; + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_arcane_prisonAI(go); } - return false; - } }; /*###### @@ -700,16 +902,26 @@ enum BloodFilledOrb class go_blood_filled_orb : public GameObjectScript { -public: - go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } + public: + go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + struct go_blood_filled_orbAI : public GameObjectAI + { + go_blood_filled_orbAI(GameObject* go) : GameObjectAI(go) { } - return true; - } + bool GossipHello(Player* player) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blood_filled_orbAI(go); + } }; /*###### @@ -731,45 +943,55 @@ enum JotunheimCage class go_jotunheim_cage : public GameObjectScript { -public: - go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } + public: + go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); - if (!pPrisoner) + struct go_jotunheim_cageAI : public GameObjectAI { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); - if (!pPrisoner) + go_jotunheim_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + me->UseDoorOrButton(); + Creature* pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); if (!pPrisoner) - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); - } - } - if (!pPrisoner || !pPrisoner->IsAlive()) - return false; + { + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); + if (!pPrisoner) + { + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); + } + } + if (!pPrisoner || !pPrisoner->IsAlive()) + return false; - pPrisoner->DisappearAndDie(); - player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); - switch (pPrisoner->GetEntry()) + pPrisoner->DisappearAndDie(); + player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); + switch (pPrisoner->GetEntry()) + { + case NPC_EBON_BLADE_PRISONER_HUMAN: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true); + break; + case NPC_EBON_BLADE_PRISONER_NE: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true); + break; + case NPC_EBON_BLADE_PRISONER_TROLL: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true); + break; + case NPC_EBON_BLADE_PRISONER_ORC: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true); + break; + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - case NPC_EBON_BLADE_PRISONER_HUMAN: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true); - break; - case NPC_EBON_BLADE_PRISONER_NE: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true); - break; - case NPC_EBON_BLADE_PRISONER_TROLL: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true); - break; - case NPC_EBON_BLADE_PRISONER_ORC: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true); - break; + return new go_jotunheim_cageAI(go); } - return true; - } }; enum TableTheka @@ -781,18 +1003,28 @@ enum TableTheka class go_table_theka : public GameObjectScript { -public: - go_table_theka() : GameObjectScript("go_table_theka") { } + public: + go_table_theka() : GameObjectScript("go_table_theka") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); + struct go_table_thekaAI : public GameObjectAI + { + go_table_thekaAI(GameObject* go) : GameObjectAI(go) { } - SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, go->GetGUID()); + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); - return true; - } + SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, me->GetGUID()); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_table_thekaAI(go); + } }; /*###### @@ -807,18 +1039,28 @@ enum InconspicuousLandmark class go_inconspicuous_landmark : public GameObjectScript { -public: - go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } + public: + go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->HasItemCount(ITEM_CUERGOS_KEY)) - return false; + struct go_inconspicuous_landmarkAI : public GameObjectAI + { + go_inconspicuous_landmarkAI(GameObject* go) : GameObjectAI(go) { } - player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + bool GossipHello(Player* player) override + { + if (player->HasItemCount(ITEM_CUERGOS_KEY)) + return false; - return true; - } + player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_inconspicuous_landmarkAI(go); + } }; /*###### @@ -840,9 +1082,9 @@ class go_soulwell : public GameObjectScript /// _and_ CMSG_GAMEOBJECT_REPORT_USE, this GossipHello hook is called /// twice. The script's handling is fine as it won't remove two charges /// on the well. We have to find how to segregate REPORT_USE and USE. - bool GossipHello(Player* player, bool /*reportUse*/) override + bool GossipHello(Player* player) override { - Unit* owner = go->GetOwner(); + Unit* owner = me->GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !player->IsInSameRaidWith(owner->ToPlayer())) return true; return false; @@ -871,39 +1113,49 @@ enum PrisonersOfWyrmskull class go_dragonflayer_cage : public GameObjectScript { -public: - go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } + public: + go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) - return true; - - Creature* pPrisoner = go->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); - if (!pPrisoner) + struct go_dragonflayer_cageAI : public GameObjectAI { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); - if (!pPrisoner) + go_dragonflayer_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) + return true; + + Creature* pPrisoner = me->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); if (!pPrisoner) - pPrisoner = go->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + { + pPrisoner = me->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); + if (!pPrisoner) + { + pPrisoner = me->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + } + } + + if (!pPrisoner || !pPrisoner->IsAlive()) + return true; + + Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL); + if (qInfo) + { + /// @todo prisoner should help player for a short period of time + player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); + pPrisoner->DisappearAndDie(); + } + return true; } - } + }; - if (!pPrisoner || !pPrisoner->IsAlive()) - return true; - - Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL); - if (qInfo) + GameObjectAI* GetAI(GameObject* go) const override { - /// @todo prisoner should help player for a short period of time - player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); - pPrisoner->DisappearAndDie(); + return new go_dragonflayer_cageAI(go); } - return true; - } }; /*###### @@ -927,47 +1179,58 @@ enum AmberpineOuthouse class go_amberpine_outhouse : public GameObjectScript { -public: - go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } + public: + go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); - if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) + struct go_amberpine_outhouseAI : public GameObjectAI { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, go->GetGUID()); - } - else - SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, go->GetGUID()); + go_amberpine_outhouseAI(GameObject* go) : GameObjectAI(go) { } - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF +1) - { - CloseGossipMenuFor(player); - Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); - if (target) + bool GossipHello(Player* player) override { - target->AI()->SetData(1, player->getGender()); - go->CastSpell(target, SPELL_INDISPOSED_III); + QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); + if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, me->GetGUID()); + } + else + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, me->GetGUID()); + + return true; } - go->CastSpell(player, SPELL_INDISPOSED); - if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) - go->CastSpell(player, SPELL_CREATE_AMBERSEEDS); - return true; - } - else + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); + if (target) + { + target->AI()->SetData(1, player->getGender()); + me->CastSpell(target, SPELL_INDISPOSED_III); + } + me->CastSpell(player, SPELL_INDISPOSED); + if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) + me->CastSpell(player, SPELL_CREATE_AMBERSEEDS); + return true; + } + else + { + CloseGossipMenuFor(player); + player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); + return false; + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - CloseGossipMenuFor(player); - player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); - return false; + return new go_amberpine_outhouseAI(go); } - } }; /*###### @@ -983,16 +1246,26 @@ enum Hives class go_hive_pod : public GameObjectScript { -public: - go_hive_pod() : GameObjectScript("go_hive_pod") { } + public: + go_hive_pod() : GameObjectScript("go_hive_pod") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - player->SendLoot(go->GetGUID(), LOOT_CORPSE); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - return true; - } + struct go_hive_podAI : public GameObjectAI + { + go_hive_podAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + player->SendLoot(me->GetGUID(), LOOT_CORPSE); + me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX() + 1, me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX(), me->GetPositionY() + 1, me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_hive_podAI(go); + } }; class go_massive_seaforium_charge : public GameObjectScript @@ -1000,10 +1273,20 @@ class go_massive_seaforium_charge : public GameObjectScript public: go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_massive_seaforium_chargeAI : public GameObjectAI { - go->SetLootState(GO_JUST_DEACTIVATED); - return true; + go_massive_seaforium_chargeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/) override + { + me->SetLootState(GO_JUST_DEACTIVATED); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_massive_seaforium_chargeAI(go); } }; @@ -1023,23 +1306,33 @@ class go_veil_skith_cage : public GameObjectScript public: go_veil_skith_cage() : GameObjectScript("go_veil_skith_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_veil_skith_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE) + go_veil_skith_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - std::list childrenList; - GetCreatureListWithEntryInGrid(childrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); - for (std::list::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE) { - player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); - (*itr)->DespawnOrUnsummon(5000); - (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); - (*itr)->AI()->Talk(SAY_FREE_0); - (*itr)->GetMotionMaster()->Clear(); + std::list childrenList; + GetCreatureListWithEntryInGrid(childrenList, me, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); + for (std::list::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr) + { + player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); + (*itr)->DespawnOrUnsummon(5000); + (*itr)->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ()); + (*itr)->AI()->Talk(SAY_FREE_0); + (*itr)->GetMotionMaster()->Clear(); + } } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_veil_skith_cageAI(go); } }; @@ -1057,20 +1350,30 @@ enum TheCleansing class go_frostblade_shrine : public GameObjectScript { -public: - go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } + public: + go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - go->UseDoorOrButton(10); - if (!player->HasAura(SPELL_RECENT_MEDITATION)) - if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) + struct go_frostblade_shrineAI : public GameObjectAI + { + go_frostblade_shrineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override { - player->CastSpell(player, SPELL_CLEANSING_SOUL); - player->SetStandState(UNIT_STAND_STATE_SIT); + me->UseDoorOrButton(10); + if (!player->HasAura(SPELL_RECENT_MEDITATION)) + if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) + { + player->CastSpell(player, SPELL_CLEANSING_SOUL); + player->SetStandState(UNIT_STAND_STATE_SIT); + } + return true; } - return true; - } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_frostblade_shrineAI(go); + } }; /*###### @@ -1084,15 +1387,25 @@ enum MidsummerBonfire class go_midsummer_bonfire : public GameObjectScript { -public: - go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { } + public: + go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { } - bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) override - { - player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); - CloseGossipMenuFor(player); - return false; - } + struct go_midsummer_bonfireAI : public GameObjectAI + { + go_midsummer_bonfireAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); + CloseGossipMenuFor(player); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_bonfireAI(go); + } }; enum MidsummerPoleRibbon @@ -1105,18 +1418,28 @@ enum MidsummerPoleRibbon class go_midsummer_ribbon_pole : public GameObjectScript { -public: - go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { } + public: + go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (Creature* creature = go->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + struct go_midsummer_ribbon_poleAI : public GameObjectAI { - creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); - player->CastSpell(creature, SPELL_POLE_DANCE, true); + go_midsummer_ribbon_poleAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player) override + { + if (Creature* creature = me->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + { + creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); + player->CastSpell(creature, SPELL_POLE_DANCE, true); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_ribbon_poleAI(go); } - return true; - } }; enum ToyTrainSpells @@ -1139,7 +1462,7 @@ class go_toy_train_set : public GameObjectScript _pulseTimer -= diff; else { - go->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true); + me->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true); _pulseTimer = 6 * IN_MILLISECONDS; } } @@ -1147,7 +1470,7 @@ class go_toy_train_set : public GameObjectScript // triggered on wrecker'd void DoAction(int32 /*action*/) override { - go->Delete(); + me->Delete(); } private: @@ -1239,39 +1562,39 @@ public: if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active break; // Check if gob is correct area, play music, set time of music - if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF || go->GetAreaId() == SHATTRATH) + if (me->GetAreaId() == SILVERMOON || me->GetAreaId() == UNDERCITY || me->GetAreaId() == ORGRIMMAR_1 || me->GetAreaId() == ORGRIMMAR_2 || me->GetAreaId() == THUNDERBLUFF || me->GetAreaId() == SHATTRATH) { if (rnd == 0) { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN01); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN01); musicTime = EVENT_BREWFESTGOBLIN01_TIME; } else if (rnd == 1) { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN02); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN02); musicTime = EVENT_BREWFESTGOBLIN02_TIME; } else { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN03); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN03); musicTime = EVENT_BREWFESTGOBLIN03_TIME; } } - if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS || go->GetAreaId() == SHATTRATH) + if (me->GetAreaId() == IRONFORGE_1 || me->GetAreaId() == IRONFORGE_2 || me->GetAreaId() == STORMWIND || me->GetAreaId() == EXODAR || me->GetAreaId() == DARNASSUS || me->GetAreaId() == SHATTRATH) { if (rnd == 0) { - go->PlayDirectMusic(EVENT_BREWFESTDWARF01); + me->PlayDirectMusic(EVENT_BREWFESTDWARF01); musicTime = EVENT_BREWFESTDWARF01_TIME; } else if (rnd == 1) { - go->PlayDirectMusic(EVENT_BREWFESTDWARF02); + me->PlayDirectMusic(EVENT_BREWFESTDWARF02); musicTime = EVENT_BREWFESTDWARF02_TIME; } else { - go->PlayDirectMusic(EVENT_BREWFESTDWARF03); + me->PlayDirectMusic(EVENT_BREWFESTDWARF03); musicTime = EVENT_BREWFESTDWARF03_TIME; } } @@ -1332,13 +1655,13 @@ public: break; std::vector playersNearby; - go->GetPlayerListInGrid(playersNearby, go->GetMap()->GetVisibilityRange()); + me->GetPlayerListInGrid(playersNearby, me->GetMap()->GetVisibilityRange()); for (Player* player : playersNearby) { if (player->GetTeamId() == TEAM_HORDE) - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); + me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); else - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); + me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); } _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; @@ -1394,7 +1717,7 @@ public: case EVENT_DFM_START_MUSIC: if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) break; - go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); + me->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: @@ -1448,7 +1771,7 @@ public: case EVENT_PDM_START_MUSIC: if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) break; - go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); + me->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: @@ -1514,16 +1837,16 @@ public: void InitializeAI() override { - switch (go->GetEntry()) + switch (me->GetEntry()) { case GO_HORDE_BELL: - _soundId = go->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL; + _soundId = me->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL; break; case GO_ALLIANCE_BELL: { - if (go->GetAreaId() == IRONFORGE_1_AREA || go->GetAreaId() == IRONFORGE_2_AREA) + if (me->GetAreaId() == IRONFORGE_1_AREA || me->GetAreaId() == IRONFORGE_2_AREA) _soundId = BELLTOLLDWARFGNOME; - else if (go->GetAreaId() == DARNASSUS_AREA || go->GetZoneId() == TELDRASSIL_ZONE) + else if (me->GetAreaId() == DARNASSUS_AREA || me->GetZoneId() == TELDRASSIL_ZONE) _soundId = BELLTOLLNIGHTELF; else _soundId = BELLTOLLALLIANCE; @@ -1559,7 +1882,7 @@ public: switch (eventId) { case EVENT_RING_BELL: - go->PlayDirectSound(_soundId); + me->PlayDirectSound(_soundId); break; default: break; diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp index 837ac0e9fe..3755217f15 100644 --- a/src/server/scripts/World/npc_innkeeper.cpp +++ b/src/server/scripts/World/npc_innkeeper.cpp @@ -53,102 +53,114 @@ enum Spells class npc_innkeeper : public CreatureScript { -public: - npc_innkeeper() : CreatureScript("npc_innkeeper") { } + public: + npc_innkeeper() : CreatureScript("npc_innkeeper") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + struct npc_innkeeperAI : public ScriptedAI { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) - { - case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break; - case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0; - } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - } + npc_innkeeperAI(Creature* creature) : ScriptedAI(creature) { } - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) + bool GossipHello(Player* player) override { - char const* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) + if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { - case LOCALE_frFR: localizedEntry = LOCALE_VENDOR_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_VENDOR_3; break; - case LOCALE_esES: localizedEntry = LOCALE_VENDOR_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_VENDOR_0; + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break; + case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0; + } + AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); } - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - } - if (creature->IsInnkeeper()) - { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) - { - case LOCALE_frFR: localizedEntry = LOCALE_INNKEEPER_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; - case LOCALE_esES: localizedEntry = LOCALE_INNKEEPER_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; - } - AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); - } + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) - { - player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); - - if (urand(0, 1)) - player->CastSpell(player, SPELL_TREAT, true); - else - { - uint32 trickspell = 0; - switch (urand(0, 13)) + if (me->IsVendor()) { - case 0: trickspell = 24753; break; // cannot cast, random 30sec - case 1: trickspell = 24713; break; // lepper gnome costume - case 2: trickspell = 24735; break; // male ghost costume - case 3: trickspell = 24736; break; // female ghostcostume - case 4: trickspell = 24710; break; // male ninja costume - case 5: trickspell = 24711; break; // female ninja costume - case 6: trickspell = 24708; break; // male pirate costume - case 7: trickspell = 24709; break; // female pirate costume - case 8: trickspell = 24723; break; // skeleton costume - case 9: trickspell = 24753; break; // Trick - case 10: trickspell = 24924; break; // Hallow's End Candy - case 11: trickspell = 24925; break; // Hallow's End Candy - case 12: trickspell = 24926; break; // Hallow's End Candy - case 13: trickspell = 24927; break; // Hallow's End Candy + char const* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_VENDOR_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_VENDOR_3; break; + case LOCALE_esES: localizedEntry = LOCALE_VENDOR_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_VENDOR_0; + } + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); } - player->CastSpell(player, trickspell, true); + + + if (me->IsInnkeeper()) + { + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_INNKEEPER_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; + case LOCALE_esES: localizedEntry = LOCALE_INNKEEPER_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; + } + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); + } + + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - CloseGossipMenuFor(player); - return true; - } - CloseGossipMenuFor(player); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + { + player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); - switch (action) + if (urand(0, 1)) + player->CastSpell(player, SPELL_TREAT, true); + else + { + uint32 trickspell = 0; + switch (urand(0, 13)) + { + case 0: trickspell = 24753; break; // cannot cast, random 30sec + case 1: trickspell = 24713; break; // lepper gnome costume + case 2: trickspell = 24735; break; // male ghost costume + case 3: trickspell = 24736; break; // female ghostcostume + case 4: trickspell = 24710; break; // male ninja costume + case 5: trickspell = 24711; break; // female ninja costume + case 6: trickspell = 24708; break; // male pirate costume + case 7: trickspell = 24709; break; // female pirate costume + case 8: trickspell = 24723; break; // skeleton costume + case 9: trickspell = 24753; break; // Trick + case 10: trickspell = 24924; break; // Hallow's End Candy + case 11: trickspell = 24925; break; // Hallow's End Candy + case 12: trickspell = 24926; break; // Hallow's End Candy + case 13: trickspell = 24927; break; // Hallow's End Candy + } + player->CastSpell(player, trickspell, true); + } + CloseGossipMenuFor(player); + return true; + } + + CloseGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(me->GetGUID()); break; + case GOSSIP_ACTION_INN: player->SetBindPoint(me->GetGUID()); break; + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break; - case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break; + return new npc_innkeeperAI(creature); } - return true; - } }; void AddSC_npc_innkeeper() diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 38fd29c5e5..c359c8d027 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -381,224 +381,237 @@ class npc_prof_blacksmith : public CreatureScript public: npc_prof_blacksmith() : CreatureScript("npc_prof_blacksmith") { } - inline bool HasWeaponSub(Player* player) + struct npc_prof_blacksmithAI : public ScriptedAI { - return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); - } + npc_prof_blacksmithAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - uint32 creatureId = creature->GetEntry(); - //WEAPONSMITH & ARMORSMITH - if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) + bool GossipHello(Player* player) override { - switch (creatureId) + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + uint32 creatureId = me->GetEntry(); + //WEAPONSMITH & ARMORSMITH + if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) { - case N_TRAINER_SMITHOMNI1: - case N_TRAINER_SMITHOMNI2: - if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - break; - case N_TRAINER_WEAPON1: - case N_TRAINER_WEAPON2: - if (player->HasSpell(S_WEAPON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); - break; - case N_TRAINER_ARMOR1: - case N_TRAINER_ARMOR2: - if (player->HasSpell(S_ARMOR)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); - break; - } - } - //WEAPONSMITH SPEC - if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) - { - switch (creatureId) - { - case N_TRAINER_HAMMER: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); - if (player->HasSpell(S_HAMMER)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); - break; - case N_TRAINER_AXE: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); - if (player->HasSpell(S_AXE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); - break; - case N_TRAINER_SWORD: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); - if (player->HasSpell(S_SWORD)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10); - break; - } - } - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Learn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 1: - if (!player->HasSpell(S_ARMOR)) + switch (creatureId) { - player->CastSpell(player, S_LEARN_ARMOR, true); - //_Creature->CastSpell(player, S_REP_ARMOR, true); + case N_TRAINER_SMITHOMNI1: + case N_TRAINER_SMITHOMNI2: + if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + if (player->HasSpell(S_WEAPON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + break; + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: + if (player->HasSpell(S_ARMOR)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; } - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - if (!player->HasSpell(S_WEAPON)) - { - player->CastSpell(player, S_LEARN_WEAPON, true); - //_Creature->CastSpell(player, S_REP_WEAPON, true); - } - CloseGossipMenuFor(player); - break; - //Unlearn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 3: - if (HasWeaponSub(player)) - { - //unknown textID (TALK_MUST_UNLEARN_WEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - else - ProcessUnlearnAction(player, creature, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessUnlearnAction(player, creature, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); - break; - //Learn Hammer/Axe/Sword - case GOSSIP_ACTION_INFO_DEF + 5: - player->CastSpell(player, S_LEARN_HAMMER, true); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - player->CastSpell(player, S_LEARN_AXE, true); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - player->CastSpell(player, S_LEARN_SWORD, true); - CloseGossipMenuFor(player); - break; - //Unlearn Hammer/Axe/Sword - case GOSSIP_ACTION_INFO_DEF + 8: - ProcessUnlearnAction(player, creature, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - ProcessUnlearnAction(player, creature, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - ProcessUnlearnAction(player, creature, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player)); - break; - } - } - - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) - { - switch (creature->GetEntry()) + } + //WEAPONSMITH SPEC + if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) { - case N_TRAINER_HAMMER: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_HAMMER_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + switch (creatureId) + { + case N_TRAINER_HAMMER: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); + if (player->HasSpell(S_HAMMER)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); + break; + case N_TRAINER_AXE: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); + if (player->HasSpell(S_AXE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); + break; + case N_TRAINER_SWORD: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); + if (player->HasSpell(S_SWORD)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10); + break; + } + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_AXE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_AXE_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); break; - case N_TRAINER_SWORD: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_SWORD_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); + break; + } + return true; + } + + private: + bool HasWeaponSub(Player* player) const + { + return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); + } + + void SendConfirmLearn(Player* player, uint32 action) const + { + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_HAMMER: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_HAMMER_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_AXE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_AXE_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SWORD: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_SWORD_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } + } + + void SendConfirmUnlearn(Player* player, uint32 action) const + { + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); + //unknown textID (TALK_UNLEARN_AXEORWEAPON) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + + case N_TRAINER_HAMMER: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_HAMMER_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_AXE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_AXE_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SWORD: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_SWORD_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } + } + + void SendActionMenu(Player* player, uint32 action) const + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + //Learn Armor/Weapon + case GOSSIP_ACTION_INFO_DEF + 1: + if (!player->HasSpell(S_ARMOR)) + { + player->CastSpell(player, S_LEARN_ARMOR, true); + //_Creature->CastSpell(player, S_REP_ARMOR, true); + } + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + if (!player->HasSpell(S_WEAPON)) + { + player->CastSpell(player, S_LEARN_WEAPON, true); + //_Creature->CastSpell(player, S_REP_WEAPON, true); + } + CloseGossipMenuFor(player); + break; + //Unlearn Armor/Weapon + case GOSSIP_ACTION_INFO_DEF + 3: + if (HasWeaponSub(player)) + { + //unknown textID (TALK_MUST_UNLEARN_WEAPON) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + else + ProcessUnlearnAction(player, me, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessUnlearnAction(player, me, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); + break; + //Learn Hammer/Axe/Sword + case GOSSIP_ACTION_INFO_DEF + 5: + player->CastSpell(player, S_LEARN_HAMMER, true); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + player->CastSpell(player, S_LEARN_AXE, true); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + player->CastSpell(player, S_LEARN_SWORD, true); + CloseGossipMenuFor(player); + break; + //Unlearn Hammer/Axe/Sword + case GOSSIP_ACTION_INFO_DEF + 8: + ProcessUnlearnAction(player, me, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 9: + ProcessUnlearnAction(player, me, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 10: + ProcessUnlearnAction(player, me, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player)); break; } } - } + }; - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) + CreatureAI* GetAI(Creature* creature) const override { - if (action) - { - switch (creature->GetEntry()) - { - case N_TRAINER_WEAPON1: - case N_TRAINER_WEAPON2: - case N_TRAINER_ARMOR1: - case N_TRAINER_ARMOR2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); - //unknown textID (TALK_UNLEARN_AXEORWEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - - case N_TRAINER_HAMMER: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_HAMMER_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_AXE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_AXE_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SWORD: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_SWORD_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - } - } - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_blacksmithAI(creature); } }; @@ -633,86 +646,100 @@ class npc_engineering_tele_trinket : public CreatureScript public: npc_engineering_tele_trinket() : CreatureScript("npc_engineering_tele_trinket") { } - bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) + struct npc_engineering_tele_trinketAI : public ScriptedAI { - bool res = false; - npcTextId = textId; - if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId)) + npc_engineering_tele_trinketAI(Creature* creature) : ScriptedAI(creature) { } + + + bool GossipHello(Player* player) override { - if (!player->HasSpell(spellId)) - res = true; - else - npcTextId = altTextId; + uint32 npcTextId = 0; + std::string gossipItem; + bool canLearn = false; + + if (player->HasSkill(SKILL_ENGINEERING)) + { + switch (me->GetEntry()) + { + case NPC_ZAP: + canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_ZAP; + break; + case NPC_JHORDY: + canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_JHORDY; + break; + case NPC_KABLAM: + canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_KABLAM; + break; + case NPC_SMILES: + canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_KABLAM; + break; + } + } + + if (canLearn) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, me->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(me), me->GetGUID()); + return true; } - return res; - } - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 npcTextId = 0; - std::string gossipItem; - bool canLearn = false; - - if (player->HasSkill(SKILL_ENGINEERING)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + CloseGossipMenuFor(player); + + if (sender != me->GetEntry()) + return true; + + switch (sender) { case NPC_ZAP: - canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_ZAP; + player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); break; case NPC_JHORDY: - canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_JHORDY; + player->CastSpell(player, SPELL_LEARN_TO_GADGET, false); break; case NPC_KABLAM: - canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_KABLAM; + player->CastSpell(player, SPELL_LEARN_TO_AREA52, false); break; case NPC_SMILES: - canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_KABLAM; + player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false); break; } - } - if (canLearn) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, creature->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - CloseGossipMenuFor(player); - - if (sender != creature->GetEntry()) return true; - - switch (sender) - { - case NPC_ZAP: - player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); - break; - case NPC_JHORDY: - player->CastSpell(player, SPELL_LEARN_TO_GADGET, false); - break; - case NPC_KABLAM: - player->CastSpell(player, SPELL_LEARN_TO_AREA52, false); - break; - case NPC_SMILES: - player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false); - break; } - return true; + private: + bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) const + { + bool res = false; + npcTextId = textId; + if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId)) + { + if (!player->HasSpell(spellId)) + res = true; + else + npcTextId = altTextId; + } + return res; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_engineering_tele_trinketAI(creature); } }; @@ -722,116 +749,129 @@ public: class npc_prof_leather : public CreatureScript { -public: - npc_prof_leather() : CreatureScript("npc_prof_leather") { } + public: + npc_prof_leather() : CreatureScript("npc_prof_leather") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + struct npc_prof_leatherAI : public ScriptedAI { - switch (creature->GetEntry()) + npc_prof_leatherAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - case N_TRAINER_DRAGON1: - case N_TRAINER_DRAGON2: - if (player->HasSpell(S_DRAGON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); - break; - case N_TRAINER_ELEMENTAL1: - case N_TRAINER_ELEMENTAL2: - if (player->HasSpell(S_ELEMENTAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); - break; - case N_TRAINER_TRIBAL1: - case N_TRAINER_TRIBAL2: - if (player->HasSpell(S_TRIBAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); - break; + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + { + switch (me->GetEntry()) + { + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: + if (player->HasSpell(S_DRAGON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); + break; + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: + if (player->HasSpell(S_ELEMENTAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: + if (player->HasSpell(S_TRIBAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + break; + } + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Unlearn Leather - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessUnlearnAction(player, creature, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessUnlearnAction(player, creature, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessUnlearnAction(player, creature, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); - break; - } - } - - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) - { - switch (creature->GetEntry()) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case N_TRAINER_DRAGON1: - case N_TRAINER_DRAGON2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_ELEMENTAL1: - case N_TRAINER_ELEMENTAL2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_TRIBAL1: - case N_TRAINER_TRIBAL2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, me, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, me, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, me, action); + break; + } + return true; } - } - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + private: + void SendActionMenu(Player* player, Creature* creature, uint32 action) const + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(creature->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(creature->GetGUID()); + break; + //Unlearn Leather + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessUnlearnAction(player, creature, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessUnlearnAction(player, creature, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessUnlearnAction(player, creature, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); + break; + } + } + + void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) const + { + if (action) + { + switch (creature->GetEntry()) + { + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + break; + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + break; + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + break; + } + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; + return new npc_prof_leatherAI(creature); } - return true; - } }; /*### @@ -840,164 +880,177 @@ public: class npc_prof_tailor : public CreatureScript { -public: - npc_prof_tailor() : CreatureScript("npc_prof_tailor") { } + public: + npc_prof_tailor() : CreatureScript("npc_prof_tailor") { } - inline bool HasTailorSpell(Player* player) - { - return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - //TAILORING SPEC - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) + struct npc_prof_tailorAI : public ScriptedAI { - if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + npc_prof_tailorAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - switch (creature->GetEntry()) + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + //TAILORING SPEC + if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) { - case N_TRAINER_SPELLFIRE: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->HasSpell(S_SPELLFIRE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + { + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->HasSpell(S_SPELLFIRE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + case N_TRAINER_MOONCLOTH: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasSpell(S_MOONCLOTH)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + break; + case N_TRAINER_SHADOWEAVE: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); + if (player->HasSpell(S_SHADOWEAVE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + break; + } + } + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_MOONCLOTH: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->HasSpell(S_MOONCLOTH)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); break; - case N_TRAINER_SHADOWEAVE: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->HasSpell(S_SHADOWEAVE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); + break; + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); + break; + } + return true; + } + + private: + bool HasTailorSpell(Player* player) const + { + return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); + } + + void SendActionMenu(Player* player, uint32 action) + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + //Learn Tailor + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessCastaction(player, me, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessCastaction(player, me, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessCastaction(player, me, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); + break; + //Unlearn Tailor + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessUnlearnAction(player, me, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + ProcessUnlearnAction(player, me, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + ProcessUnlearnAction(player, me, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player)); break; } } - } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Learn Tailor - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastaction(player, creature, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); - break; - //Unlearn Tailor - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessUnlearnAction(player, creature, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - ProcessUnlearnAction(player, creature, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - ProcessUnlearnAction(player, creature, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player)); - break; - } - } - - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) - { - switch (creature->GetEntry()) + void SendConfirmLearn(Player* player, uint32 action) { - case N_TRAINER_SPELLFIRE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_MOONCLOTH: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SHADOWEAVE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_MOONCLOTH: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SHADOWEAVE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } } - } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) - { - switch (creature->GetEntry()) + void SendConfirmUnlearn(Player* player, uint32 action) { - case N_TRAINER_SPELLFIRE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_MOONCLOTH: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SHADOWEAVE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_MOONCLOTH: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SHADOWEAVE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } } - } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; + return new npc_prof_tailorAI(creature); } - return true; - } }; enum MultiProfessionTrainer @@ -1041,7 +1094,7 @@ public: { npc_multi_profession_trainerAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { switch (gossipListId) { @@ -1102,6 +1155,7 @@ public: default: break; } + return true; } void SendTrainerList(Player* player, uint32 Index) diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 04d939503a..c632eca016 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -327,28 +327,24 @@ public: break; } } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_CLUCK) + Reset(); + } + + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_CLUCK) + Reset(); + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_chicken_cluckAI(creature); } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_CLUCK) - ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); - - return true; - } - - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override - { - if (quest->GetQuestId() == QUEST_CLUCK) - ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); - - return true; - } }; /*###### @@ -811,16 +807,14 @@ public: void UpdateAI(uint32 diff) override; void EnterCombat(Unit* /*who*/) override { } + + void QuestAccept(Player* player, Quest const* quest) override + { + if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) + BeginEvent(player); + } }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) - ENSURE_AI(npc_doctor::npc_doctorAI, creature->AI())->BeginEvent(player); - - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_doctorAI(creature); @@ -1271,121 +1265,134 @@ enum Sayge class npc_sayge : public CreatureScript { -public: - npc_sayge() : CreatureScript("npc_sayge") { } + public: + npc_sayge() : CreatureScript("npc_sayge") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) || - player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) || - player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) || - player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) || - player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) || - player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) || - player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) || - player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE)) - SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, creature->GetGUID()); - else + struct npc_saygeAI : public ScriptedAI { - AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, creature->GetGUID()); - } + npc_saygeAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - void SendAction(Player* player, Creature* creature, uint32 action) - { - switch (action) + if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) || + player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) || + player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) || + player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) || + player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) || + player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) || + player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) || + player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE)) + SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, me->GetGUID()); + else + { + AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, me->GetGUID()); + } + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + uint32 spellId = 0; + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendAction(player, action); + break; + case GOSSIP_SENDER_MAIN + 1: + spellId = SPELL_DAMAGE; + break; + case GOSSIP_SENDER_MAIN + 2: + spellId = SPELL_RESISTANCE; + break; + case GOSSIP_SENDER_MAIN + 3: + spellId = SPELL_ARMOR; + break; + case GOSSIP_SENDER_MAIN + 4: + spellId = SPELL_SPIRIT; + break; + case GOSSIP_SENDER_MAIN + 5: + spellId = SPELL_INTELLECT; + break; + case GOSSIP_SENDER_MAIN + 6: + spellId = SPELL_STAMINA; + break; + case GOSSIP_SENDER_MAIN + 7: + spellId = SPELL_STRENGTH; + break; + case GOSSIP_SENDER_MAIN + 8: + spellId = SPELL_AGILITY; + break; + } + + if (spellId) + { + me->CastSpell(player, spellId, false); + player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); + SendAction(player, action); + } + return true; + } + + private: + void SendAction(Player* player, uint32 action) const + { + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + me->CastSpell(player, SPELL_FORTUNE, false); + SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, me->GetGUID()); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_ACTION_INFO_DEF + 1: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10,GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - creature->CastSpell(player, SPELL_FORTUNE, false); - SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, creature->GetGUID()); - break; + return new npc_saygeAI(creature); } - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - uint32 spellId = 0; - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendAction(player, creature, action); - break; - case GOSSIP_SENDER_MAIN + 1: - spellId = SPELL_DAMAGE; - break; - case GOSSIP_SENDER_MAIN + 2: - spellId = SPELL_RESISTANCE; - break; - case GOSSIP_SENDER_MAIN + 3: - spellId = SPELL_ARMOR; - break; - case GOSSIP_SENDER_MAIN + 4: - spellId = SPELL_SPIRIT; - break; - case GOSSIP_SENDER_MAIN + 5: - spellId = SPELL_INTELLECT; - break; - case GOSSIP_SENDER_MAIN + 6: - spellId = SPELL_STAMINA; - break; - case GOSSIP_SENDER_MAIN + 7: - spellId = SPELL_STRENGTH; - break; - case GOSSIP_SENDER_MAIN + 8: - spellId = SPELL_AGILITY; - break; - } - - if (spellId) - { - creature->CastSpell(player, spellId, false); - player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); - SendAction(player, creature, action); - } - return true; - } }; class npc_steam_tonk : public CreatureScript @@ -1934,67 +1941,68 @@ class npc_wormhole : public CreatureScript return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; } + bool GossipHello(Player* player) override + { + if (me->IsSummon()) + { + if (player == me->ToTempSummon()->GetSummoner()) + { + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + + if (GetData(DATA_SHOW_UNDERGROUND)) + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + + SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, me->GetGUID()); + } + } + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_BOREAN_TUNDRA, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_HOWLING_FJORD, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_ICECROWN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_STORM_PEAKS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 6: // Underground + CloseGossipMenuFor(player); + me->CastSpell(player, SPELL_UNDERGROUND, false); + break; + } + + return true; + } + private: bool _showUnderground; }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsSummon()) - { - if (player == creature->ToTempSummon()->GetSummoner()) - { - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - - if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND)) - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - - SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, creature->GetGUID()); - } - } - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_HOWLING_FJORD, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_ICECROWN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_STORM_PEAKS, false); - break; - case GOSSIP_ACTION_INFO_DEF + 6: // Underground - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_UNDERGROUND, false); - break; - } - - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_wormholeAI(creature); @@ -2013,27 +2021,28 @@ enum PetTrainer class npc_pet_trainer : public CreatureScript { -public: - npc_pet_trainer() : CreatureScript("npc_pet_trainer") { } + public: + npc_pet_trainer() : CreatureScript("npc_pet_trainer") { } - struct npc_pet_trainerAI : public ScriptedAI - { - npc_pet_trainerAI(Creature* creature) : ScriptedAI(creature) { } - - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + struct npc_pet_trainerAI : public ScriptedAI { - if (menuId == MENU_ID_PET_UNLEARN && gossipListId == OPTION_ID_PLEASE_DO) - { - player->ResetPetTalents(); - CloseGossipMenuFor(player); - } - } - }; + npc_pet_trainerAI(Creature* creature) : ScriptedAI(creature) { } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_pet_trainerAI(creature); - } + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == MENU_ID_PET_UNLEARN && gossipListId == OPTION_ID_PLEASE_DO) + { + player->ResetPetTalents(); + CloseGossipMenuFor(player); + } + return false; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_pet_trainerAI(creature); + } }; /*###### @@ -2050,40 +2059,51 @@ enum BehstenSlahtz class npc_experience : public CreatureScript { -public: - npc_experience() : CreatureScript("npc_experience") { } + public: + npc_experience() : CreatureScript("npc_experience") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + struct npc_experienceAI : public ScriptedAI { - AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID()); - } - else // currently gaining XP - { - AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID()); - } - return true; - } + npc_experienceAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - switch (action) + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected + player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain + break; + case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain + break; + } + CloseGossipMenuFor(player); + return true; + } + + bool GossipHello(Player* player) override + { + if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + { + AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID()); + } + else // currently gaining XP + { + AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID()); + } + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected - player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain - break; - case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain - break; + return new npc_experienceAI(creature); } - CloseGossipMenuFor(player); - return true; - } }; enum Fireworks @@ -2543,11 +2563,11 @@ class npc_stable_master : public CreatureScript { npc_stable_masterAI(Creature* creature) : SmartAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { - SmartAI::sGossipSelect(player, menuId, gossipListId); + SmartAI::GossipSelect(player, menuId, gossipListId); if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU) - return; + return true; switch (gossipListId) { @@ -2573,10 +2593,11 @@ class npc_stable_master : public CreatureScript player->CastSpell(player, SPELL_WOLPERTINGER, false); break; default: - return; + return false; } player->PlayerTalkClass->SendCloseGossip(); + return false; } }; @@ -2797,7 +2818,7 @@ public: }); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { switch (gossipListId) { @@ -2848,6 +2869,7 @@ public: break; } player->PlayerTalkClass->SendCloseGossip(); + return false; } void UpdateAI(uint32 diff) override diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index 002f2a8e52..94ab5e480f 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -77,7 +77,7 @@ if (WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES) endif() if( WIN32 ) - if ( MSVC ) + if ( "${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild" ) add_custom_command(TARGET worldserver POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/ diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 61b6c01b28..45473f9ad8 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -232,7 +232,7 @@ extern int main(int argc, char** argv) std::shared_ptr sMetricHandle(nullptr, [](void*) { TC_METRIC_EVENT("events", "Worldserver shutdown", ""); - sMetric->ForceSend(); + sMetric->Unload(); }); sScriptMgr->SetScriptLoader(AddScripts);