*Merged Scriptdev2 783

--HG--
branch : trunk
This commit is contained in:
Blaymoira
2008-12-13 19:56:53 +01:00
parent 8b4f5b6290
commit ed7a4d9831
131 changed files with 5742 additions and 4736 deletions
+2 -2
View File
@@ -69,6 +69,7 @@ scripts/npc/npc_innkeeper.cpp \
scripts/npc/npc_professions.cpp \
scripts/npc/npcs_special.cpp \
scripts/zone/alterac_mountains/alterac_mountains.cpp \
scripts/zone/ashenvale_forest/ashenvale.cpp\
scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp \
scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp \
scripts/zone/aunchindoun/mana_tombs/boss_pandemonius.cpp \
@@ -280,12 +281,11 @@ scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp \
scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp \
scripts/zone/scarlet_monastery/boss_herod.cpp \
scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp \
scripts/zone/scarlet_monastery/boss_high_inquisitor_whitemane.cpp \
scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp \
scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp \
scripts/zone/scarlet_monastery/boss_scarlet_commander_mograine.cpp \
scripts/zone/scarlet_monastery/boss_scorn.cpp \
scripts/zone/scarlet_monastery/boss_headless_horseman.cpp \
scripts/zone/scarlet_monastery/boss_mograine_and_whitemane.cpp \
scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp \
scripts/zone/scarlet_monastery/def_scarlet_monastery.h \
scripts/zone/scholomance/boss_darkmaster_gandling.cpp \
+8 -6
View File
@@ -110,6 +110,8 @@ extern void AddSC_alterac_mountains();
//Arathi Highlands
//Ashenvale Forest
extern void AddSC_ashenvale();
//Aunchindoun
//--Auchenai Crypts
extern void AddSC_boss_exarch_maladaar();
@@ -414,12 +416,11 @@ extern void AddSC_boss_bloodmage_thalnos();
extern void AddSC_boss_headless_horseman();
extern void AddSC_boss_herod();
extern void AddSC_boss_high_inquisitor_fairbanks();
extern void AddSC_boss_high_inquisitor_whitemane();
extern void AddSC_boss_houndmaster_loksey();
extern void AddSC_boss_interrogator_vishas();
extern void AddSC_boss_scarlet_commander_mograine();
extern void AddSC_boss_scorn();
extern void AddSC_instance_scarlet_monastery();
extern void AddSC_boss_mograine_and_whitemane();
//Scholomance
extern void AddSC_boss_darkmaster_gandling();
@@ -1139,8 +1140,8 @@ void LoadDatabase()
break;
case ACTION_T_SET_INST_DATA:
if (temp.action[j].param2 > 3)
error_db_log("TSCR: Event %u Action %u attempts to set instance data above encounter state 3. Custom case?", i, j+1);
if (temp.action[j].param2 > SPECIAL)
error_db_log("TSCR2: Event %u Action %u attempts to set instance data above encounter state 4. Custom case?", i, j+1);
break;
case ACTION_T_YELL:
@@ -1304,6 +1305,8 @@ void ScriptsInit()
//Arathi Highlands
//Ashenvale Forest
AddSC_ashenvale();
//Aunchindoun
//--Auchenai Crypts
AddSC_boss_exarch_maladaar();
@@ -1608,12 +1611,11 @@ void ScriptsInit()
AddSC_boss_headless_horseman();
AddSC_boss_herod();
AddSC_boss_high_inquisitor_fairbanks();
AddSC_boss_high_inquisitor_whitemane();
AddSC_boss_houndmaster_loksey();
AddSC_boss_interrogator_vishas();
AddSC_boss_scarlet_commander_mograine();
AddSC_boss_scorn();
AddSC_instance_scarlet_monastery();
AddSC_boss_mograine_and_whitemane();
//Scholomance
AddSC_boss_darkmaster_gandling();
+126 -59
View File
@@ -1,116 +1,183 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Version="9,00"
Name="TrinityScript"
ProjectGUID="{4295C8A9-79B7-4354-8064-F05FB9CA0C96}"
RootNamespace="ScriptDev2"
Keyword="Win32Proj">
Keyword="Win32Proj"
TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
Name="Win32"/>
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\ScriptDev2__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="2">
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\dep\include\;..\..\..\shared\;..\..\..\framework\;..\..\..\game\;..\include\;..\..\..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_WINDOWS;_USRDLL;SCRIPT"
MinimalRebuild="TRUE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCCustomBuildTool"/>
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="trinitycore.lib zthread.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
AdditionalLibraryDirectories="..\..\..\..\win\VC71\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC71\trinitycore__$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="TRUE"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/MaNGOSScript.pdb"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="1"/>
TargetMachine="1"
/>
<Tool
Name="VCMIDLTool"/>
Name="VCALinkTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
Name="VCManifestTool"
/>
<Tool
Name="VCPreLinkEventTool"/>
Name="VCXDCMakeTool"
/>
<Tool
Name="VCResourceCompilerTool"/>
Name="VCBscMakeTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
Name="VCFxCopTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"/>
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\ScriptDev2__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="2">
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\..\..\dep\include\;..\..\..\shared\;..\..\..\framework\;..\..\..\game\;..\include\;..\..\..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SCRIPT"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
UsePrecompiledHeader="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCCustomBuildTool"/>
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="trinitycore.lib zthread.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\win\VC71\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC71\trinitycore__$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="FALSE"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="1"/>
TargetMachine="1"
/>
<Tool
Name="VCMIDLTool"/>
Name="VCALinkTool"
/>
<Tool
Name="VCPreBuildEventTool"/>
Name="VCManifestTool"
/>
<Tool
Name="VCPreLinkEventTool"/>
Name="VCXDCMakeTool"
/>
<Tool
Name="VCResourceCompilerTool"/>
Name="VCBscMakeTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
Name="VCFxCopTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"/>
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
@@ -269,6 +336,10 @@
<Filter
Name="Ashenvale Forest"
>
<File
RelativePath="..\scripts\zone\ashenvale_forest\ashenvale.cpp"
>
</File>
</Filter>
<Filter
Name="Azshara"
@@ -312,7 +383,7 @@
<File
RelativePath="..\scripts\zone\deadmines\def_deadmines.h"
>
</File>
</File>
</Filter>
<Filter
Name="Deadwind Pass"
@@ -525,10 +596,6 @@
RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_fairbanks.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_whitemane.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_houndmaster_loksey.cpp"
>
@@ -538,7 +605,7 @@
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_scarlet_commander_mograine.cpp"
RelativePath="..\scripts\zone\scarlet_monastery\boss_mograine_and_whitemane.cpp"
>
</File>
<File
@@ -1153,18 +1220,18 @@
<Filter
Name="Uldaman"
>
<File
<File
RelativePath="..\scripts\zone\uldaman\boss_archaedas.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
>
</File>
</File>
<File
RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\uldaman.cpp"
>
@@ -1555,7 +1622,7 @@
<File
RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_alar.cpp"
>
</File>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_astromancer.cpp"
>
@@ -1601,11 +1668,11 @@
>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\instance_mechanar.cpp"
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\def_mechanar.h"
>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\def_mechanar.h"
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\instance_mechanar.cpp"
>
</File>
</Filter>
@@ -1700,10 +1767,6 @@
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_hydross_the_unstable.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lurker_below.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lady_vashj.cpp"
>
@@ -1712,6 +1775,10 @@
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_leotheras_the_blind.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lurker_below.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_morogrim_tidewalker.cpp"
>
+106 -107
View File
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Version="9,00"
Name="TrinityScript"
ProjectGUID="{4295C8A9-79B7-4354-8064-F05FB9CA0C96}"
RootNamespace="ScriptDev2"
Keyword="Win32Proj"
TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -74,6 +75,8 @@
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/MaNGOSScript.pdb"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="1"
/>
@@ -96,7 +99,88 @@
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\ScriptDev2__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
AdditionalIncludeDirectories="..\..\..\..\dep\include\;..\..\..\shared\;..\..\..\framework\;..\..\..\game\;..\include\;..\..\..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SCRIPT"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
FloatingPointModel="2"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="TrinityCore.lib zthread.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\win\VC80\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
@@ -187,91 +271,6 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\ScriptDev2__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
AdditionalIncludeDirectories="..\..\..\..\dep\include\;..\..\..\shared\;..\..\..\framework\;..\..\..\game\;..\include\;..\..\..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SCRIPT"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="1"
FloatingPointModel="2"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="TrinityCore.lib zthread.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\win\VC80\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
@@ -514,6 +513,10 @@
<Filter
Name="Ashenvale Forest"
>
<File
RelativePath="..\scripts\zone\ashenvale_forest\ashenvale.cpp"
>
</File>
</Filter>
<Filter
Name="Azshara"
@@ -557,7 +560,7 @@
<File
RelativePath="..\scripts\zone\deadmines\def_deadmines.h"
>
</File>
</File>
</Filter>
<Filter
Name="Deadwind Pass"
@@ -770,10 +773,6 @@
RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_fairbanks.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_whitemane.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_houndmaster_loksey.cpp"
>
@@ -783,7 +782,7 @@
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_scarlet_commander_mograine.cpp"
RelativePath="..\scripts\zone\scarlet_monastery\boss_mograine_and_whitemane.cpp"
>
</File>
<File
@@ -1398,18 +1397,18 @@
<Filter
Name="Uldaman"
>
<File
<File
RelativePath="..\scripts\zone\uldaman\boss_archaedas.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
>
</File>
</File>
<File
RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\uldaman.cpp"
>
@@ -1846,11 +1845,11 @@
>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\instance_mechanar.cpp"
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\def_mechanar.h"
>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\def_mechanar.h"
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\instance_mechanar.cpp"
>
</File>
</Filter>
@@ -1945,10 +1944,6 @@
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_hydross_the_unstable.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lurker_below.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lady_vashj.cpp"
>
@@ -1957,6 +1952,10 @@
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_leotheras_the_blind.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lurker_below.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_morogrim_tidewalker.cpp"
>
@@ -2340,7 +2339,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
@@ -2348,7 +2347,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
+105 -99
View File
@@ -98,86 +98,8 @@
<Tool
Name="VCAppVerifierTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\ScriptDev2__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\dep\include\;..\..\..\shared\;..\..\..\framework\;..\..\..\game\;..\include\;..\..\..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_WINDOWS;_USRDLL;SCRIPT"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="trinitycore.lib zthread.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
AdditionalLibraryDirectories="..\..\..\..\win\VC90\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/MaNGOSScript.pdb"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
@@ -261,6 +183,90 @@
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="..\..\..\..\bin\$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\ScriptDev2__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="2"
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\dep\include\;..\..\..\shared\;..\..\..\framework\;..\..\..\game\;..\include\;..\..\..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_WINDOWS;_USRDLL;SCRIPT"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompiled.h"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="trinitycore.lib zthread.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
AdditionalLibraryDirectories="..\..\..\..\win\VC90\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/MaNGOSScript.pdb"
SubSystem="2"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary="$(OutDir)/TrinityScript.lib"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
@@ -500,6 +506,10 @@
<Filter
Name="Ashenvale Forest"
>
<File
RelativePath="..\scripts\zone\ashenvale_forest\ashenvale.cpp"
>
</File>
</Filter>
<Filter
Name="Azshara"
@@ -756,10 +766,6 @@
RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_fairbanks.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_high_inquisitor_whitemane.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_houndmaster_loksey.cpp"
>
@@ -769,7 +775,7 @@
>
</File>
<File
RelativePath="..\scripts\zone\scarlet_monastery\boss_scarlet_commander_mograine.cpp"
RelativePath="..\scripts\zone\scarlet_monastery\boss_mograine_and_whitemane.cpp"
>
</File>
<File
@@ -1384,18 +1390,18 @@
<Filter
Name="Uldaman"
>
<File
<File
RelativePath="..\scripts\zone\uldaman\boss_archaedas.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
>
</File>
</File>
<File
RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\uldaman\uldaman.cpp"
>
@@ -1786,7 +1792,7 @@
<File
RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_alar.cpp"
>
</File>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_eye\boss_astromancer.cpp"
>
@@ -1832,11 +1838,11 @@
>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\instance_mechanar.cpp"
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\def_mechanar.h"
>
</File>
<File
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\def_mechanar.h"
RelativePath="..\scripts\zone\tempest_keep\the_mechanar\instance_mechanar.cpp"
>
</File>
</Filter>
@@ -1932,10 +1938,6 @@
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lurker_below.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lady_vashj.cpp"
>
</File>
@@ -1943,6 +1945,10 @@
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_leotheras_the_blind.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_lurker_below.cpp"
>
</File>
<File
RelativePath="..\scripts\zone\coilfang_resevoir\serpent_shrine\boss_morogrim_tidewalker.cpp"
>
@@ -2326,7 +2332,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|x64"
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
@@ -2334,7 +2340,7 @@
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
Name="Debug|x64"
>
<Tool
Name="VCCLCompilerTool"
+4 -3
View File
@@ -13,7 +13,8 @@ enum EncounterState
NOT_STARTED = 0,
IN_PROGRESS = 1,
FAIL = 2,
DONE = 3
DONE = 3,
SPECIAL = 4
};
#define OUT_SAVE_INST_DATA debug_log("SD2: Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
@@ -30,8 +31,8 @@ class TRINITY_DLL_DECL ScriptedInstance : public InstanceData
~ScriptedInstance() {}
//All-purpose data storage 64 bit
virtual uint64 GetData64(uint32) {return 0; }
virtual void SetData64(uint32, uint64) { }
virtual uint64 GetData64(uint32 Data) { return 0; }
virtual void SetData64(uint32 Data, uint64 Value) { }
// Called every instance update
virtual void Update(uint32) {}
@@ -36,18 +36,31 @@ void guardAI::Reset()
void guardAI::Aggro(Unit *who)
{
if (m_creature->GetEntry() == 15184)
{
switch(rand()%3)
{
case 0:
DoSay("Taste blade, mongrel!", LANG_UNIVERSAL,NULL);
break;
case 1:
DoSay("Please tell me that you didn't just do what I think you just did. Please tell me that I'm not going to have to hurt you...", LANG_UNIVERSAL,NULL);
break;
case 2:
DoSay("As if we don't have enough problems, you go and create more!", LANG_UNIVERSAL,NULL);
break;
}
}
if (SpellEntry const *spell = m_creature->reachWithSpellAttack(who))
DoCastSpell(who, spell);
}
void guardAI::JustDied(Unit *Killer)
{
//Send Zone Under Attack message to the LocalDefense and WorldDefense Channels
if( Killer->GetTypeId() == TYPEID_PLAYER )
m_creature->SendZoneUnderAttackMessage((Player*)Killer);
else if( Unit *owner = Killer->GetOwner() )
{
if( owner->GetTypeId() == TYPEID_PLAYER )
m_creature->SendZoneUnderAttackMessage((Player*)owner);
}
if (Player* pKiller = Killer->GetCharmerOrOwnerPlayerOrPlayerItself())
m_creature->SendZoneUnderAttackMessage(pKiller);
}
void guardAI::UpdateAI(const uint32 diff)
+3 -47
View File
@@ -491,58 +491,14 @@ CreatureAI* GetAI_guard_bluffwatcher(Creature *_Creature)
* guard_contested start
*******************************************************/
struct TRINITY_DLL_DECL guard_contested : public guardAI
CreatureAI* GetAI_guard_contested(Creature *_Creature)
{
guard_contested(Creature *c) : guardAI(c) {}
void MoveInLineOfSight(Unit *who)
{
if ( who->isAttackingPlayer() )
{
if(who->GetTypeId() == TYPEID_PLAYER || who->GetOwnerGUID() && GUID_HIPART(who->GetOwnerGUID())==HIGHGUID_PLAYER)
{
m_creature->AddThreat(who, 0.0f);
if(Unit* owner = who->GetOwner())
m_creature->AddThreat(owner, 0.0f);
if(!m_creature->isInCombat())
{
if (m_creature->GetEntry() == 15184) //Cenarion Hold Infantry
{
srand (time(NULL));
if (rand()%100 <= 30)
{
DoSay("Taste blade, mongrel!", LANG_UNIVERSAL,NULL);
}
else if (rand()%100 > 30 && rand()%100 < 50)
{
DoSay("Please tell me that you didn`t just do what I think you just did. Please tell me that I`m not going to have to hurt you...", LANG_UNIVERSAL,NULL);
}
else if (rand()%100 >= 50)
{
DoSay("As if we don`t have enough problems, you go and create more!", LANG_UNIVERSAL,NULL);
}
}
else
{
SpellEntry const *spell = m_creature->reachWithSpellAttack(who);
DoCastSpell(who, spell);
}
}
AttackStart(who);
}
}
}
};
return new guardAI (_Creature);
}
/*******************************************************
* guard_contested end
*******************************************************/
CreatureAI* GetAI_guard_contested(Creature *_Creature)
{
return new guard_contested (_Creature);
}
/*******************************************************
* guard_darnassus start
*******************************************************/
@@ -31,27 +31,30 @@ void npc_escortAI::AttackStart(Unit *who)
if (IsBeingEscorted && !Defend)
return;
if (who->isTargetableForAttack())
{
//Begin attack
if ( m_creature->Attack(who, true) )
{
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MoveChase(who);
m_creature->AddThreat(who, 0.0f);
}
m_creature->SetInCombatWith(who);
who->SetInCombatWith(m_creature);
if (!InCombat)
{
InCombat = true;
if (IsBeingEscorted)
{
//Store last position
m_creature->GetPosition(LastPos.x, LastPos.y, LastPos.z);
debug_log("SD2: EscortAI has entered combat via Attack and stored last location");
debug_log("SD2: EscortAI has entered combat and stored last location.");
}
Aggro(who);
}
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MoveChase(who);
}
}
@@ -63,24 +66,7 @@ void npc_escortAI::MoveInLineOfSight(Unit *who)
if(m_creature->getVictim() || !m_creature->canStartAttack(who))
return;
//Begin attack
if ( m_creature->Attack(who, true) )
{
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MoveChase(who);
m_creature->AddThreat(who, 0.0f);
}
if (!InCombat)
{
InCombat = true;
//Store last position
m_creature->GetPosition(LastPos.x, LastPos.y, LastPos.z);
debug_log("SD2: EscortAI has entered combat via LOS and stored last location");
Aggro(who);
}
AttackStart(who);
}
void npc_escortAI::JustRespawned()
@@ -106,7 +92,7 @@ void npc_escortAI::EnterEvadeMode()
if (IsBeingEscorted)
{
debug_log("SD2: EscortAI has left combat and is now returning to last point");
debug_log("SD2: EscortAI has left combat and is now returning to last point.");
Returning = true;
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MovePoint(WP_LAST_POINT, LastPos.x, LastPos.y, LastPos.z);
@@ -124,6 +110,7 @@ void npc_escortAI::UpdateAI(const uint32 diff)
{
//Waypoint Updating
if (IsBeingEscorted && !InCombat && WaitTimer && !Returning)
{
if (WaitTimer <= diff)
{
if (ReconnectWP)
@@ -137,7 +124,7 @@ void npc_escortAI::UpdateAI(const uint32 diff)
if( !IsOnHold )
{
m_creature->GetMotionMaster()->MovePoint(CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z );
debug_log("SD2: EscortAI Reconnect WP is: %d, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z);
debug_log("SD2: EscortAI Reconnect WP is: %u, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z);
WaitTimer = 0;
ReconnectWP = false;
return;
@@ -167,13 +154,15 @@ void npc_escortAI::UpdateAI(const uint32 diff)
if( !IsOnHold )
{
m_creature->GetMotionMaster()->MovePoint(CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z );
debug_log("SD2: EscortAI Next WP is: %d, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z);
debug_log("SD2: EscortAI Next WP is: %u, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z);
WaitTimer = 0;
}
}else WaitTimer -= diff;
}
//Check if player is within range
if (IsBeingEscorted && !InCombat && PlayerGUID)
{
if (PlayerTimer < diff)
{
Unit* p = Unit::GetUnit(*m_creature, PlayerGUID);
@@ -198,6 +187,7 @@ void npc_escortAI::UpdateAI(const uint32 diff)
PlayerTimer = 1000;
}else PlayerTimer -= diff;
}
//Check if we have a current target
if( m_creature->isAlive() && m_creature->SelectHostilTarget() && m_creature->getVictim())
@@ -0,0 +1,187 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Ashenvale
SD%Complete: 70
SDComment: Quest support: 6544
SDCategory: Ashenvale Forest
EndScriptData */
/* ContentData
npc_torek
EndContentData */
#include "precompiled.h"
#include "../../npc/npc_escortAI.h"
/*####
# npc_torek
####*/
#define SAY_READY -1000106
#define SAY_MOVE -1000107
#define SAY_PREPARE -1000108
#define SAY_WIN -1000109
#define SAY_END -1000110
#define SPELL_REND 11977
#define SPELL_THUNDERCLAP 8078
#define QUEST_TOREK_ASSULT 6544
#define ENTRY_SPLINTERTREE_RAIDER 12859
#define ENTRY_DURIEL 12860
#define ENTRY_SILVERWING_SENTINEL 12896
#define ENTRY_SILVERWING_WARRIOR 12897
struct TRINITY_DLL_DECL npc_torekAI : public npc_escortAI
{
npc_torekAI(Creature *c) : npc_escortAI(c) {Reset();}
uint32 Rend_Timer;
uint32 Thunderclap_Timer;
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
return;
switch (i)
{
case 1:
DoScriptText(SAY_MOVE, m_creature, player);
break;
case 8:
DoScriptText(SAY_PREPARE, m_creature, player);
break;
case 19:
//TODO: verify location and creatures amount.
m_creature->SummonCreature(ENTRY_DURIEL,1776.73,-2049.06,109.83,1.54,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
m_creature->SummonCreature(ENTRY_SILVERWING_SENTINEL,1774.64,-2049.41,109.83,1.40,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
m_creature->SummonCreature(ENTRY_SILVERWING_WARRIOR,1778.73,-2049.50,109.83,1.67,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
break;
case 20:
DoScriptText(SAY_WIN, m_creature, player);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_TOREK_ASSULT,m_creature);
break;
case 21:
DoScriptText(SAY_END, m_creature, player);
break;
}
}
void Reset()
{
Rend_Timer = 5000;
Thunderclap_Timer = 8000;
}
void Aggro(Unit* who)
{
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
if (Unit* player = Unit::GetUnit((*m_creature), PlayerGUID))
((Player*)player)->FailQuest(QUEST_TOREK_ASSULT);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
if (Rend_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_REND);
Rend_Timer = 20000;
}else Rend_Timer -= diff;
if (Thunderclap_Timer < diff)
{
DoCast(m_creature,SPELL_THUNDERCLAP);
Thunderclap_Timer = 30000;
}else Thunderclap_Timer -= diff;
}
};
bool QuestAccept_npc_torek(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_TOREK_ASSULT)
{
//TODO: find companions, make them follow Torek, at any time (possibly done by mangos/database in future?)
((npc_escortAI*)(creature->AI()))->Start(true, true, true, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
}
return true;
}
CreatureAI* GetAI_npc_torek(Creature *_Creature)
{
npc_torekAI* thisAI = new npc_torekAI(_Creature);
thisAI->AddWaypoint(0, 1782.63, -2241.11, 109.73, 5000);
thisAI->AddWaypoint(1, 1788.88, -2240.17, 111.71);
thisAI->AddWaypoint(2, 1797.49, -2238.11, 112.31);
thisAI->AddWaypoint(3, 1803.83, -2232.77, 111.22);
thisAI->AddWaypoint(4, 1806.65, -2217.83, 107.36);
thisAI->AddWaypoint(5, 1811.81, -2208.01, 107.45);
thisAI->AddWaypoint(6, 1820.85, -2190.82, 100.49);
thisAI->AddWaypoint(7, 1829.60, -2177.49, 96.44);
thisAI->AddWaypoint(8, 1837.98, -2164.19, 96.71); //prepare
thisAI->AddWaypoint(9, 1839.99, -2149.29, 96.78);
thisAI->AddWaypoint(10, 1835.14, -2134.98, 96.80);
thisAI->AddWaypoint(11, 1823.57, -2118.27, 97.43);
thisAI->AddWaypoint(12, 1814.99, -2110.35, 98.38);
thisAI->AddWaypoint(13, 1806.60, -2103.09, 99.19);
thisAI->AddWaypoint(14, 1798.27, -2095.77, 100.04);
thisAI->AddWaypoint(15, 1783.59, -2079.92, 100.81);
thisAI->AddWaypoint(16, 1776.79, -2069.48, 101.77);
thisAI->AddWaypoint(17, 1776.82, -2054.59, 109.82);
thisAI->AddWaypoint(18, 1776.88, -2047.56, 109.83);
thisAI->AddWaypoint(19, 1776.86, -2036.55, 109.83);
thisAI->AddWaypoint(20, 1776.90, -2024.56, 109.83); //win
thisAI->AddWaypoint(21, 1776.87, -2028.31, 109.83,60000);//stay
thisAI->AddWaypoint(22, 1776.90, -2028.30, 109.83);
return (CreatureAI*)thisAI;
}
void AddSC_ashenvale()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_torek";
newscript->GetAI = &GetAI_npc_torek;
newscript->pQuestAccept = &QuestAccept_npc_torek;
newscript->RegisterSelf();
}
@@ -32,10 +32,8 @@ EndScriptData */
#define SAY_SLAY_1 -1556011
#define SAY_SLAY_2 -1556012
#define SAY_DEATH -15560013
#define EMOTE_ARCANE_EXP -15560014
#define SAY_DEATH -1556013
#define EMOTE_ARCANE_EXP -1556015
#define SPELL_BLINK 38194
#define SPELL_BLINK_TELEPORT 38203
@@ -28,7 +28,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_sethekk_halls : public ScriptedInstance
{
instance_sethekk_halls(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_sethekk_halls(Map *map) : ScriptedInstance(map) {Initialize();};
GameObject *IkissDoor;
@@ -38,7 +38,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
{
instance_shadow_labyrinth(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_shadow_labyrinth(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
@@ -23,11 +23,13 @@ EndScriptData */
#include "precompiled.h"
#define SAY_TELEPORT -1000100
#define SPELL_MARKOFFROST 23182
#define SPELL_MANASTORM 21097
#define SPELL_CHILL 21098
#define SPELL_FROSTBREATH 21099
#define SPELL_REFLECT 22067 //Old one was 30969
#define SPELL_REFLECT 22067
#define SPELL_CLEAVE 8255 //Perhaps not right ID
#define SPELL_ENRAGE 23537
@@ -68,6 +70,7 @@ struct TRINITY_DLL_DECL boss_azuregosAI : public ScriptedAI
if(Teleport_Timer < diff)
{
DoScriptText(SAY_TELEPORT, m_creature);
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
std::list<HostilReference*>::iterator i = m_threatlist.begin();
for (i = m_threatlist.begin(); i!= m_threatlist.end();++i)
@@ -107,9 +110,7 @@ struct TRINITY_DLL_DECL boss_azuregosAI : public ScriptedAI
//ManaStorm_Timer
if (ManaStorm_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_MANASTORM);
ManaStorm_Timer = 7500 + rand()%5000;
}else ManaStorm_Timer -= diff;
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Azuremyst_Isle
SD%Complete: 75
SDComment: Quest support: 9283, 9537, 9554(special flight path, proper model for mount missing). Injured Draenei cosmetic only
SDComment: Quest support: 9283, 9537, 9582, 9554(special flight path, proper model for mount missing). Injured Draenei cosmetic only
SDCategory: Azuremyst Isle
EndScriptData */
@@ -25,10 +25,12 @@ EndScriptData */
npc_draenei_survivor
npc_engineer_spark_overgrind
npc_injured_draenei
npc_magwin
npc_susurrus
EndContentData */
#include "precompiled.h"
#include "../../npc/npc_escortAI.h"
#include <cmath>
/*######
@@ -305,6 +307,127 @@ CreatureAI* GetAI_npc_injured_draenei(Creature *_Creature)
return new npc_injured_draeneiAI (_Creature);
}
/*######
## npc_magwin
######*/
#define SAY_START -1000111
#define SAY_AGGRO -1000112
#define SAY_PROGRESS -1000113
#define SAY_END1 -1000114
#define SAY_END2 -1000115
#define EMOTE_HUG -1000116
#define QUEST_A_CRY_FOR_HELP 9528
struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI
{
npc_magwinAI(Creature *c) : npc_escortAI(c) {Reset();}
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
return;
switch(i)
{
case 0:
DoScriptText(SAY_START, m_creature, player);
break;
case 17:
DoScriptText(SAY_PROGRESS, m_creature, player);
break;
case 28:
DoScriptText(SAY_END1, m_creature, player);
break;
case 29:
DoScriptText(EMOTE_HUG, m_creature, player);
DoScriptText(SAY_END2, m_creature, player);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_A_CRY_FOR_HELP,m_creature);
break;
}
}
void Aggro(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature, who);
}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(80);
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_A_CRY_FOR_HELP);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
bool QuestAccept_npc_magwin(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP)
{
creature->setFaction(10);
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
}
return true;
}
CreatureAI* GetAI_npc_magwinAI(Creature *_Creature)
{
npc_magwinAI* magwinAI = new npc_magwinAI(_Creature);
magwinAI->AddWaypoint(0, -4784.532227, -11051.060547, 3.484263);
magwinAI->AddWaypoint(1, -4805.509277, -11037.293945, 3.043942);
magwinAI->AddWaypoint(2, -4827.826172, -11034.398438, 1.741959);
magwinAI->AddWaypoint(3, -4852.630859, -11033.695313, 2.208656);
magwinAI->AddWaypoint(4, -4876.791992, -11034.517578, 3.175228);
magwinAI->AddWaypoint(5, -4895.486816, -11038.306641, 9.390890);
magwinAI->AddWaypoint(6, -4915.464844, -11048.402344, 12.369793);
magwinAI->AddWaypoint(7, -4937.288086, -11067.041992, 13.857983);
magwinAI->AddWaypoint(8, -4966.577637, -11067.507813, 15.754786);
magwinAI->AddWaypoint(9, -4993.799805, -11056.544922, 19.175295);
magwinAI->AddWaypoint(10, -5017.836426, -11052.569336, 22.476587);
magwinAI->AddWaypoint(11, -5039.706543, -11058.459961, 25.831593);
magwinAI->AddWaypoint(12, -5057.289063, -11045.474609, 26.972496);
magwinAI->AddWaypoint(13, -5078.828125, -11037.601563, 29.053417);
magwinAI->AddWaypoint(14, -5104.158691, -11039.195313, 29.440195);
magwinAI->AddWaypoint(15, -5120.780273, -11039.518555, 30.142139);
magwinAI->AddWaypoint(16, -5140.833008, -11039.810547, 28.788074);
magwinAI->AddWaypoint(17, -5161.201660, -11040.050781, 27.879545, 4000);
magwinAI->AddWaypoint(18, -5171.842285, -11046.803711, 27.183821);
magwinAI->AddWaypoint(19, -5185.995117, -11056.359375, 20.234867);
magwinAI->AddWaypoint(20, -5198.485840, -11065.065430, 18.872593);
magwinAI->AddWaypoint(21, -5214.062500, -11074.653320, 19.215731);
magwinAI->AddWaypoint(22, -5220.157227, -11088.377930, 19.818476);
magwinAI->AddWaypoint(23, -5233.652832, -11098.846680, 18.349432);
magwinAI->AddWaypoint(24, -5250.163086, -11111.653320, 16.438959);
magwinAI->AddWaypoint(25, -5268.194336, -11125.639648, 12.668313);
magwinAI->AddWaypoint(26, -5286.270508, -11130.669922, 6.912246);
magwinAI->AddWaypoint(27, -5317.449707, -11137.392578, 4.963446);
magwinAI->AddWaypoint(28, -5334.854492, -11154.384766, 6.742664);
magwinAI->AddWaypoint(29, -5353.874512, -11171.595703, 6.903912, 20000);
magwinAI->AddWaypoint(30, -5354.240000, -11171.940000, 6.890000);
return (CreatureAI*)magwinAI;
}
/*######
## npc_susurrus
######*/
@@ -364,6 +487,12 @@ void AddSC_azuremyst_isle()
newscript->GetAI = GetAI_npc_injured_draenei;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_magwin";
newscript->GetAI = &GetAI_npc_magwinAI;
newscript->pQuestAccept = &QuestAccept_npc_magwin;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_susurrus";
newscript->pGossipHello = &GossipHello_npc_susurrus;
@@ -24,6 +24,16 @@ EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
//Speech'n'Sound
#define SAY_AGGRO -1564029
#define SAY_SLAY1 -1564030
#define SAY_SLAY2 -1564031
#define SAY_SPECIAL1 -1564032
#define SAY_SPECIAL2 -1564033
#define SAY_ENRAGE1 -1564034
#define SAY_ENRAGE2 -1564035
#define SAY_DEATH -1564036
//Spells
#define SPELL_ACID_GEYSER 40630
#define SPELL_ACIDIC_WOUND 40481
@@ -41,27 +51,6 @@ EndScriptData */
#define SPELL_INSIGNIFIGANCE 40618
#define SPELL_BERSERK 45078
//Speech'n'Sound
#define SAY_AGGRO "Horde will crush you!"
#define SOUND_AGGRO 11432
#define SAY_SLAY1 "Time to feast!"
#define SOUND_SLAY1 11433
#define SAY_SLAY2 "More! I want more!"
#define SOUND_SLAY2 11434
#define SAY_SPECIAL1 "Drink your blood! Eat your flesh!"
#define SOUND_SPECIAL1 11435
#define SAY_SPECIAL2 "I hunger!"
#define SOUND_SPECIAL2 11436
#define SAY_ENRAGE "I'll rip the meat from your bones!"
#define SOUND_ENRAGE 11437
#define SOUND_DEATH 11439
//This is used to sort the players by distance in preparation for the Bloodboil cast.
struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool>
{
@@ -127,8 +116,7 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
void Aggro(Unit *who)
{
DoZoneInCombat();
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_GURTOGGBLOODBOILEVENT, IN_PROGRESS);
}
@@ -137,14 +125,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -153,7 +135,7 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_GURTOGGBLOODBOILEVENT, DONE);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
// Note: This seems like a very complicated fix. The fix needs to be handled by the core, as implementation of limited-target AoE spells are still not limited.
@@ -162,7 +144,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
// Get the Threat List
std::list<HostilReference *> m_threatlist = m_creature->getThreatManager().getThreatList();
if(!m_threatlist.size()) return; // He doesn't have anyone in his threatlist, useless to continue
if(!m_threatlist.size()) // He doesn't have anyone in his threatlist, useless to continue
return;
std::list<Unit *> targets;
std::list<HostilReference *>::iterator itr = m_threatlist.begin();
@@ -231,12 +214,17 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
}else FelAcidTimer -= diff;
if(!m_creature->HasAura(SPELL_BERSERK, 0))
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
DoYell(SAY_ENRAGE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
}else EnrageTimer -= diff;
{
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
switch(rand()%2)
{
case 0: DoScriptText(SAY_ENRAGE1, m_creature); break;
case 1: DoScriptText(SAY_ENRAGE2, m_creature); break;
}
}else EnrageTimer -= diff;
}
if(Phase1)
{
@@ -244,8 +232,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
{
DoCast(m_creature->getVictim(), SPELL_BEWILDERING_STRIKE);
float mt_threat = m_creature->getThreatManager().getThreat(m_creature->getVictim());
Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);
m_creature->AddThreat(target, mt_threat);
if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1))
m_creature->AddThreat(target, mt_threat);
BewilderingStrikeTimer = 20000;
}else BewilderingStrikeTimer -= diff;
@@ -317,14 +305,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_SPECIAL1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL1);
break;
case 1:
DoYell(SAY_SPECIAL2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL2);
break;
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
}
AcidGeyserTimer = 1000;
@@ -24,6 +24,19 @@ EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
//Speech'n'Sounds
#define SAY_TAUNT1 -1564018
#define SAY_TAUNT2 -1564019
#define SAY_TAUNT3 -1564020
#define SAY_AGGRO -1564021
#define SAY_SPELL1 -1564022
#define SAY_SPELL2 -1564023
#define SAY_SPELL3 -1564024
#define SAY_SLAY1 -1564025
#define SAY_SLAY2 -1564026
#define SAY_ENRAGE -1564027
#define SAY_DEATH -1564028
//Spells
#define SPELL_BEAM_SINISTER 40859
#define SPELL_BEAM_VILE 40860
@@ -47,40 +60,6 @@ uint32 PrismaticAuras[]=
40897, // Holy
};
//Speech'n'Sounds
#define SAY_TAUNT1 "You play, you pay."
#define SOUND_TAUNT1 11501
#define SAY_TAUNT2 "I'm not impressed."
#define SOUND_TAUNT2 11502
#define SAY_TAUNT3 "Enjoying yourselves?"
#define SOUND_TAUNT3 11503
#define SAY_AGGRO "So, business... Or pleasure?"
#define SOUND_AGGRO 11504
#define SAY_SPELL1 "You seem a little tense."
#define SOUND_SPELL1 11505
#define SAY_SPELL2 "Don't be shy."
#define SOUND_SPELL2 11506
#define SAY_SPELL3 "I'm all... yours."
#define SOUND_SPELL3 11507
#define SAY_SLAY1 "Easy come, easy go."
#define SOUND_SLAY1 11508
#define SAY_SLAY2 "So much for a happy ending."
#define SOUND_SLAY2 11509
#define SAY_ENRAGE "Stop toying with my emotions!"
#define SOUND_ENRAGE 11510
#define SAY_DEATH "I wasn't... finished."
#define SOUND_DEATH 11511
struct Locations
{
float x,y,z;
@@ -151,22 +130,15 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
pInstance->SetData(DATA_MOTHERSHAHRAZEVENT, IN_PROGRESS);
DoZoneInCombat();
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
}
void KilledUnit(Unit *victim)
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -175,8 +147,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_MOTHERSHAHRAZEVENT, DONE);
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
void TeleportPlayers()
@@ -206,8 +177,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
{
Enraged = true;
DoCast(m_creature, SPELL_ENRAGE, true);
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}
//Randomly cast one beam.
@@ -260,14 +230,8 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_SPELL2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPELL2);
break;
case 1:
DoYell(SAY_SPELL3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPELL3);
break;
case 0: DoScriptText(SAY_SPELL2, m_creature); break;
case 1: DoScriptText(SAY_SPELL3, m_creature); break;
}
FatalAttractionExplodeTimer = 2000;
FatalAttractionTimer = 40000 + rand()%31 * 1000;
@@ -317,8 +281,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
DoYell(SAY_ENRAGE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}else EnrageTimer -= diff;
//Random taunts
@@ -326,18 +289,9 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
{
switch(rand()%3)
{
case 0:
DoYell(SAY_TAUNT1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_TAUNT1);
break;
case 1:
DoYell(SAY_TAUNT2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_TAUNT2);
break;
case 2:
DoYell(SAY_TAUNT3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_TAUNT3);
break;
case 0: DoScriptText(SAY_TAUNT1, m_creature); break;
case 1: DoScriptText(SAY_TAUNT2, m_creature); break;
case 2: DoScriptText(SAY_TAUNT3, m_creature); break;
}
RandomYellTimer = 60000 + rand()%91 * 1000;
}else RandomYellTimer -= diff;
@@ -27,51 +27,32 @@ EndScriptData */
//Sound'n'speech
//Suffering
#define SUFF_SAY_FREED "Pain and suffering are all that await you!"
#define SUFF_SOUND_FREED 11415
#define SUFF_SAY_AGGRO "Don't leave me alone!"
#define SUFF_SOUND_AGGRO 11416
#define SUFF_SAY_SLAY1 "Look at what you make me do!"
#define SUFF_SOUND_SLAY1 11417
#define SUFF_SAY_SLAY2 "I didn't ask for this!"
#define SUFF_SOUND_SLAY2 11418
#define SUFF_SAY_ENRAGE "The pain is only beginning!"
#define SUFF_SOUND_ENRAGE 11419
#define SUFF_SAY_RECAP "I don't want to go back!"
#define SUFF_SOUND_RECAP 11420
#define SUFF_SAY_AFTER "Now what do I do?"
#define SUFF_SOUND_AFTER 11421
#define SUFF_SAY_FREED -1564047
#define SUFF_SAY_AGGRO -1564048
#define SUFF_SAY_SLAY1 -1564049
#define SUFF_SAY_SLAY2 -1564050
#define SUFF_SAY_SLAY3 -1564051
#define SUFF_SAY_RECAP -1564052
#define SUFF_SAY_AFTER -1564053
#define SUFF_EMOTE_ENRAGE -1564054
//Desire
#define DESI_SAY_FREED "You can have anything you desire... for a price."
#define DESI_SOUND_FREED 11408
#define DESI_SAY_SLAY1 "Fulfilment is at hand!"
#define DESI_SOUND_SLAY1 11409
#define DESI_SAY_SLAY2 "Yes... you'll stay with us now..."
#define DESI_SOUND_SLAY2 11410
#define DESI_SAY_SLAY3 "Your reach exceeds your grasp."
#define DESI_SOUND_SLAY3 11412
#define DESI_SAY_SPEC "Be careful what you wish for..."
#define DESI_SOUND_SPEC 11411
#define DESI_SAY_RECAP "I'll be waiting..."
#define DESI_SOUND_RECAP 11413
#define DESI_SAY_AFTER "I won't be far..."
#define DESI_SOUND_AFTER 11414
#define DESI_SAY_FREED -1564055
#define DESI_SAY_SLAY1 -1564056
#define DESI_SAY_SLAY2 -1564057
#define DESI_SAY_SLAY3 -1564058
#define DESI_SAY_SPEC -1564059
#define DESI_SAY_RECAP -1564060
#define DESI_SAY_AFTER -1564061
//Anger
#define ANGER_SAY_FREED "Beware... I live."
#define ANGER_SOUND_FREED 11399
#define ANGER_SAY_SCREAM "So... foolish."
#define ANGER_SOUND_SCREAM 11400
#define ANGER_SOUND_SLAY1 11401
#define ANGER_SAY_SLAY2 "Enough. No more."
#define ANGER_SOUND_SLAY2 11402
#define ANGER_SAY_SPEC "On your knees!"
#define ANGER_SOUND_SPEC 11403
#define ANGER_SAY_BEFORE "Beware, coward."
#define ANGER_SOUND_BEFORE 11405
#define ANGER_SAY_DEATH "I won't... be... ignored."
#define ANGER_SOUND_DEATH 11404
#define ANGER_SAY_FREED -1564062
#define ANGER_SAY_FREED2 -1564063
#define ANGER_SAY_SLAY1 -1564064
#define ANGER_SAY_SLAY2 -1564065
#define ANGER_SAY_SPEC -1564066
#define ANGER_SAY_BEFORE -1564067
#define ANGER_SAY_DEATH -1564068
//Spells
#define AURA_OF_SUFFERING 41292
@@ -289,13 +270,11 @@ struct TRINITY_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI
case 5:
if(Phase == 1)
{
Essence->Yell(SUFF_SAY_AFTER,LANG_UNIVERSAL,0);
DoPlaySoundToSet(Essence, SUFF_SOUND_AFTER);
DoScriptText(SUFF_SAY_AFTER, Essence);
}
else
{
Essence->Yell(DESI_SAY_AFTER,LANG_UNIVERSAL,0);
DoPlaySoundToSet(Essence, DESI_SOUND_AFTER);
DoScriptText(DESI_SAY_AFTER, Essence);
}
Essence->SetVisibility(VISIBILITY_OFF);
Essence->setDeathState(DEAD);
@@ -370,16 +349,14 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
{
damage = 0;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetReactState(REACT_PASSIVE);
m_creature->Yell(SUFF_SAY_RECAP,LANG_UNIVERSAL,0);
DoPlaySoundToSet(m_creature, SUFF_SOUND_RECAP);
DoScriptText(SUFF_SAY_RECAP, m_creature);
}
}
void Aggro(Unit *who)
{
m_creature->Yell(SUFF_SAY_FREED, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(m_creature, SUFF_SOUND_FREED);
DoScriptText(SUFF_SAY_FREED, m_creature);
DoZoneInCombat();
m_creature->CastSpell(m_creature, AURA_OF_SUFFERING, true); // linked aura need core support
m_creature->CastSpell(m_creature, ESSENCE_OF_SUFFERING_PASSIVE, true);
@@ -390,14 +367,9 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SUFF_SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SUFF_SOUND_SLAY1);
break;
case 1:
DoYell(SUFF_SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SUFF_SOUND_SLAY2);
break;
case 0: DoScriptText(SUFF_SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SUFF_SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SUFF_SAY_SLAY3, m_creature); break;
}
}
@@ -435,8 +407,7 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
FixateTimer = 5000;
if(!(rand()%16))
{
DoYell(SUFF_SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SUFF_SOUND_AGGRO);
DoScriptText(SUFF_SAY_AGGRO, m_creature);
}
}else FixateTimer -= diff;
@@ -444,8 +415,7 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
{
DoCast(m_creature, SPELL_ENRAGE);
EnrageTimer = 60000;
DoYell(SUFF_SAY_ENRAGE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SUFF_SOUND_ENRAGE);
DoScriptText(SUFF_EMOTE_ENRAGE, m_creature);
}else EnrageTimer -= diff;
if(SoulDrainTimer < diff)
@@ -483,9 +453,7 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
{
damage = 0;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetReactState(REACT_PASSIVE);
m_creature->Yell(DESI_SAY_RECAP,LANG_UNIVERSAL,0);
DoPlaySoundToSet(m_creature, DESI_SOUND_RECAP);
DoScriptText(SUFF_SAY_RECAP, m_creature);
}
else
{
@@ -506,8 +474,7 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
void Aggro(Unit *who)
{
m_creature->Yell(DESI_SAY_FREED, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(m_creature, DESI_SOUND_FREED);
DoScriptText(DESI_SAY_FREED, m_creature);
DoZoneInCombat();
DoCast(m_creature, AURA_OF_DESIRE, true);
}
@@ -516,18 +483,9 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
{
switch(rand()%3)
{
case 0:
DoYell(DESI_SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, DESI_SOUND_SLAY1);
break;
case 1:
DoYell(DESI_SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, DESI_SOUND_SLAY2);
break;
case 2:
DoYell(DESI_SAY_SLAY3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, DESI_SOUND_SLAY3);
break;
case 0: DoScriptText(DESI_SAY_SLAY1, m_creature); break;
case 1: DoScriptText(DESI_SAY_SLAY2, m_creature); break;
case 2: DoScriptText(DESI_SAY_SLAY3, m_creature); break;
}
}
@@ -558,8 +516,7 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
DeadenTimer = 25000 + rand()%10000;
if(!(rand()%2))
{
DoYell(DESI_SAY_SPEC,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, DESI_SOUND_SPEC);
DoScriptText(DESI_SAY_SPEC, m_creature);
}
}else DeadenTimer -= diff;
@@ -596,29 +553,27 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
void Aggro(Unit *who)
{
m_creature->Yell(ANGER_SAY_FREED, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(m_creature, ANGER_SOUND_FREED);
switch(rand()%2)
{
case 0: DoScriptText(ANGER_SAY_FREED, m_creature); break;
case 1: DoScriptText(ANGER_SAY_FREED2, m_creature); break;
}
DoZoneInCombat();
DoCast(m_creature, AURA_OF_ANGER, true);
}
void JustDied(Unit *victim)
{
DoYell(ANGER_SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,ANGER_SOUND_DEATH);
DoScriptText(ANGER_SAY_DEATH, m_creature);
}
void KilledUnit(Unit *victim)
{
switch(rand()%2)
{
case 0:
DoPlaySoundToSet(m_creature, ANGER_SOUND_SLAY1);
break;
case 1:
DoYell(ANGER_SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, ANGER_SOUND_SLAY2);
break;
case 0: DoScriptText(ANGER_SAY_SLAY1, m_creature); break;
case 1: DoScriptText(ANGER_SAY_SLAY2, m_creature); break;
}
}
@@ -638,8 +593,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
{
if(m_creature->getVictim()->GetGUID() != AggroTargetGUID)
{
DoYell(ANGER_SAY_BEFORE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, ANGER_SOUND_BEFORE);
DoScriptText(ANGER_SAY_BEFORE, m_creature);
DoCast(m_creature, SPELL_SELF_SEETHE, true);
AggroTargetGUID = m_creature->getVictim()->GetGUID();
}
@@ -652,8 +606,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
SoulScreamTimer = 9000 + rand()%2000;
if(!(rand()%3))
{
DoYell(ANGER_SAY_SCREAM,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, ANGER_SOUND_SCREAM);
DoScriptText(ANGER_SAY_SPEC, m_creature);
}
}else SoulScreamTimer -= diff;
@@ -661,8 +614,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
{
DoCast(m_creature, SPELL_SPITE_TARGET);
SpiteTimer = 30000;
DoYell(ANGER_SAY_SPEC,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, ANGER_SOUND_SPEC);
DoScriptText(ANGER_SAY_SPEC, m_creature);
}else SpiteTimer -= diff;
DoMeleeAttackIfReady();
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -16,7 +16,7 @@
/* ScriptData
SDName: Boss_Shade_of_Akama
SD%Complete: 99
SD%Complete: 90
SDComment: Seems to be complete.
SDCategory: Black Temple
EndScriptData */
@@ -24,6 +24,15 @@ EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
#define SAY_DEATH -1564013
#define SAY_LOW_HEALTH -1564014
// Ending cinematic text
#define SAY_FREE -1564015
#define SAY_BROKEN_FREE_01 -1564016
#define SAY_BROKEN_FREE_02 -1564017
#define GOSSIP_ITEM "We are ready to fight alongside you, Akama"
struct Location
{
float x, y, o, z;
@@ -78,20 +87,6 @@ static Location BrokenWP[]=
#define AKAMA_Y 400.601013
#define AKAMA_Z 112.783997
// Texts
#define SOUND_DEATH 11386
#define SAY_DEATH "No! Not yet..."
#define SOUND_LOW_HEALTH 11385
#define SAY_LOW_HEALTH "I will not last much longer..."
// Ending cinematic text
#define SAY_FREE "Come out from the shadows! I've returned to lead you against our true enemy! Shed your chains and raise your weapons against your Illidari masters!"
#define SAY_BROKEN_FREE_01 "Hail our leader! Hail Akama!"
#define SAY_BROKEN_FREE_02 "Hail Akama!"
// Gossips
#define GOSSIP_ITEM "We are ready to fight alongside you, Akama"
// Spells
#define SPELL_VERTEX_SHADE_BLACK 39833
#define SPELL_SHADE_SOUL_CHANNEL 40401
@@ -200,6 +195,7 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
FindChannelers();
if(!Channelers.empty())
{
for(std::list<uint64>::iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
{
Creature* Channeler = NULL;
@@ -217,11 +213,13 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL_2, true);
Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
}
}
else error_log("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly");
}else error_log("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly");
}
}
if(!Sorcerers.empty())
{
for(std::list<uint64>::iterator itr = Sorcerers.begin(); itr != Sorcerers.end(); ++itr)
if(Creature* Sorcerer = ((Creature*)Unit::GetUnit(*m_creature, *itr)))
if(Sorcerer->isAlive())
@@ -231,7 +229,7 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
}
Sorcerers.clear();
}
if(Unit* Akama = Unit::GetUnit(*m_creature, AkamaGUID))
Akama->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
@@ -590,8 +588,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -601,8 +598,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 15 && !HasYelledOnce)
{
DoYell(SAY_LOW_HEALTH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_LOW_HEALTH);
DoScriptText(SAY_LOW_HEALTH, m_creature);
HasYelledOnce = true;
}
@@ -654,6 +650,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
}
if(SummonBrokenTimer && BrokenSummonIndex < 4)
{
if(SummonBrokenTimer <= diff)
{
for(uint8 i = 0; i < 4; ++i)
@@ -676,6 +673,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
++BrokenSummonIndex;
SummonBrokenTimer = 1000;
}else SummonBrokenTimer -= diff;
}
if(SoulRetrieveTimer)
if(SoulRetrieveTimer <= diff)
@@ -687,8 +685,9 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
++EndingTalkCount;
SoulRetrieveTimer = 2000;
SummonBrokenTimer = 1;
break;
case 1:
DoYell(SAY_FREE, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_FREE, m_creature);
++EndingTalkCount;
SoulRetrieveTimer = 25000;
break;
@@ -701,7 +700,7 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
{
if(!Yelled)
{
pUnit->MonsterYell(SAY_BROKEN_FREE_01, LANG_UNIVERSAL, 0);
DoScriptText(SAY_BROKEN_FREE_01, pUnit);
Yelled = true;
}
pUnit->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
@@ -712,17 +711,22 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
break;
case 3:
if(!BrokenList.empty())
{
for(std::list<uint64>::iterator itr = BrokenList.begin(); itr != BrokenList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
// This is the incorrect spell, but can't seem to find the right one.
pUnit->CastSpell(pUnit, 39656, true);
}
++EndingTalkCount;
SoulRetrieveTimer = 5000;
break;
case 4:
if(!BrokenList.empty())
{
for(std::list<uint64>::iterator itr = BrokenList.begin(); itr != BrokenList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit((*m_creature), *itr))
pUnit->MonsterYell(SAY_BROKEN_FREE_02, LANG_UNIVERSAL, 0);
}
SoulRetrieveTimer = 0;
break;
}
@@ -733,8 +737,9 @@ struct TRINITY_DLL_DECL npc_akamaAI : public ScriptedAI
if(DestructivePoisonTimer < diff)
{
// SPELL_DESTRUCTIVE_POISON is self-cast only for some reason so we make our target cast it on itself
m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_DESTRUCTIVE_POISON, true);
Unit* Shade = Unit::GetUnit((*m_creature), ShadeGUID);
if (Shade && Shade->isAlive())
DoCast(Shade, SPELL_DESTRUCTIVE_POISON);
DestructivePoisonTimer = 15000;
}else DestructivePoisonTimer -= diff;
@@ -17,13 +17,17 @@
/* ScriptData
SDName: Boss_Supremus
SD%Complete: 95
SDComment: Need to implement doors.
SDComment: Need to implement molten punch
SDCategory: Black Temple
EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
#define EMOTE_NEW_TARGET -1564010
#define EMOTE_PUNCH_GROUND -1564011 //DoScriptText(EMOTE_PUNCH_GROUND, m_creature);
#define EMOTE_GROUND_CRACK -1564012
//Spells
#define SPELL_MOLTEN_PUNCH 40126
#define SPELL_HURTFUL_STRIKE 41926
@@ -148,9 +152,11 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
return;
if(!m_creature->HasAura(SPELL_BERSERK, 0))
{
if(BerserkTimer < diff)
DoCast(m_creature, SPELL_BERSERK);
else BerserkTimer -= diff;
}
if(SummonFlameTimer < diff)
{
@@ -178,7 +184,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
{
DoResetThreat();
m_creature->AddThreat(target, 5000000.0f);
DoTextEmote("acquires a new target!", NULL);
DoScriptText(EMOTE_NEW_TARGET, m_creature);
SwitchTargetTimer = 10000;
}
}else SwitchTargetTimer -= diff;
@@ -188,7 +194,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true))
{
DoCast(target, SPELL_VOLCANIC_SUMMON);
DoTextEmote("roars and the ground begins to crack open!", NULL);
DoScriptText(EMOTE_GROUND_CRACK, m_creature);
SummonVolcanoTimer = 10000;
}
}else SummonVolcanoTimer -= diff;
@@ -24,6 +24,18 @@ EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
//Speech'n'sound
#define SAY_INTRO -1564037
#define SAY_AGGRO -1564038
#define SAY_SLAY1 -1564039
#define SAY_SLAY2 -1564040
#define SAY_SPELL1 -1564041
#define SAY_SPELL2 -1564042
#define SAY_SPECIAL1 -1564043
#define SAY_SPECIAL2 -1564044
#define SAY_ENRAGE -1564045
#define SAY_DEATH -1564046
//Spells
#define SPELL_INCINERATE 40239
#define SPELL_CRUSHING_SHADOWS 40243
@@ -34,37 +46,6 @@ EndScriptData */
#define SPELL_ATROPHY 40327 // Shadowy Constructs use this when they get within melee range of a player
//Speech'n'sound
#define SAY_INTRO "I was the first, you know. For me, the wheel of death has spun many times. So much time has passed. I have a lot of catching up to do..."
#define SOUND_INTRO 11512
#define SAY_AGGRO "Vengeance is mine!"
#define SOUND_AGGRO 11513
#define SAY_SLAY1 "I have use for you!"
#define SOUND_SLAY1 11514
#define SAY_SLAY2 "It gets worse..."
#define SOUND_SLAY2 11515
#define SAY_SPELL1 "What are you afraid of?"
#define SOUND_SPELL1 11517
#define SAY_SPELL2 "Death... really isn't so bad."
#define SOUND_SPELL2 11516
#define SAY_SPECIAL1 "Give in!"
#define SOUND_SPECIAL1 11518
#define SAY_SPECIAL2 "I have something for you..."
#define SOUND_SPECIAL2 11519
#define SAY_ENRAGE "YOU WILL SHOW THE PROPER RESPECT!"
#define SOUND_ENRAGE 11520
#define SAY_DEATH "The wheel...spins...again...."
#define SOUND_DEATH 11521
#define CREATURE_DOOM_BLOSSOM 23123
#define CREATURE_SHADOWY_CONSTRUCT 23111
@@ -161,19 +142,8 @@ struct TRINITY_DLL_DECL mob_shadowy_constructAI : public ScriptedAI
{
if(!who || (!who->isAlive()) || (who->GetGUID() == GhostGUID))
return;
if(who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who))
{
//if(who->HasStealthAura())
// who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
m_creature->AddThreat(who, 1.0f);
}
}
ScriptedAI::MoveInLineOfSight(who);
}
/* Comment it out for now. NOTE TO FUTURE DEV: UNCOMMENT THIS OUT ONLY AFTER MIND CONTROL IS IMPLEMENTED
@@ -295,8 +265,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
DoYell(SAY_INTRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_INTRO);
DoScriptText(SAY_INTRO, m_creature);
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK);
AggroTargetGUID = who->GetGUID();
Intro = true;
@@ -308,14 +277,8 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -324,8 +287,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_TERONGOREFIENDEVENT, DONE);
DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
float CalculateRandomLocation(float Loc, uint32 radius)
@@ -413,18 +375,15 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
Intro = false;
if(AggroTargetGUID)
{
Unit* pUnit = Unit::GetUnit((*m_creature), AggroTargetGUID);
if(pUnit)
{
m_creature->GetMotionMaster()->MoveChase(pUnit);
if(pUnit)
AttackStart(pUnit);
}
DoZoneInCombat();
}else EnterEvadeMode();
@@ -458,8 +417,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
if(SummonDoomBlossomTimer < diff)
{
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
float X = CalculateRandomLocation(target->GetPositionX(), 20);
float Y = CalculateRandomLocation(target->GetPositionY(), 20);
@@ -487,14 +445,8 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SPECIAL1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL1);
break;
case 1:
DoYell(SAY_SPECIAL2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL2);
break;
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
}
DoCast(target, SPELL_INCINERATE);
IncinerateTimer = 20000 + rand()%31 * 1000;
@@ -530,25 +482,20 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SPELL1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPELL1);
break;
case 1:
DoYell(SAY_SPELL2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SPELL2);
break;
case 0: DoScriptText(SAY_SPELL1, m_creature); break;
case 1: DoScriptText(SAY_SPELL2, m_creature); break;
}
RandomYellTimer = 50000 + rand()%51 * 1000;
}else RandomYellTimer -= diff;
if(!m_creature->HasAura(SPELL_BERSERK, 0))
{
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
DoYell(SAY_ENRAGE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}else EnrageTimer -= diff;
}
DoMeleeAttackIfReady();
}
@@ -24,38 +24,16 @@ EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
//Aggro
#define SAY_AGGRO "You will die, in the name of Lady Vashj!"
#define SOUND_AGGRO 11450
//Needle (Random)
#define SAY_NEEDLE1 "Stick around!"
#define SOUND_NEEDLE1 11451
#define SAY_NEEDLE2 "I'll deal with you later!"
#define SOUND_NEEDLE2 11452
//Slay
#define SAY_SLAY1 "Your success was short lived!"
#define SOUND_SLAY1 11455
#define SAY_SLAY2 "Time for you to go!"
#define SOUND_SLAY2 11456
//Special
#define SAY_SPECIAL1 "Bel'anen dal'lorei!"
#define SOUND_SPECIAL1 11453
#define SAY_SPECIAL2 "Blood will flow!"
#define SOUND_SPECIAL2 11454
//Enrage
#define SAY_ENRAGE "My patience has ran out! Die, DIE!"
#define SOUND_ENRAGE 11458
//Death
#define SAY_DEATH "Lord Illidan will... crush you."
#define SOUND_DEATH 11459
#define SAY_AGGRO -1564000
#define SAY_NEEDLE1 -1564001
#define SAY_NEEDLE2 -1564002
#define SAY_SLAY1 -1564003
#define SAY_SLAY2 -1564004
#define SAY_SPECIAL1 -1564005
#define SAY_SPECIAL2 -1564006
#define SAY_ENRAGE1 -1564007 //is this text actually in use?
#define SAY_ENRAGE2 -1564008
#define SAY_DEATH -1564009
//Spells
#define SPELL_NEEDLE_SPINE 39992
@@ -103,14 +81,8 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -119,8 +91,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, DONE);
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
void SpellHit(Unit *caster, const SpellEntry *spell)
@@ -138,8 +109,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, IN_PROGRESS);
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
}
@@ -173,8 +143,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
if(EnrageTimer < diff)
{
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE2, m_creature);
m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
EnrageTimer = 600000;
}else EnrageTimer -= diff;
@@ -193,13 +162,8 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoPlaySoundToSet(m_creature, SOUND_SPECIAL1);
break;
case 1:
DoYell(SAY_SPECIAL2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL2);
break;
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
}
SpecialYellTimer = 25000 + (rand()%76)*1000;
}else SpecialYellTimer -= diff;
@@ -217,14 +181,8 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_NEEDLE1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_NEEDLE1);
break;
case 1:
DoYell(SAY_NEEDLE2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_NEEDLE2);
break;
case 0: DoScriptText(SAY_NEEDLE1, m_creature); break;
case 1: DoScriptText(SAY_NEEDLE2, m_creature); break;
}
ImpalingSpineTimer = 21000;
}
@@ -24,6 +24,56 @@ EndScriptData */
#include "precompiled.h"
#include "def_black_temple.h"
//Speech'n'Sounds
#define SAY_GATH_SLAY -1564085
#define SAY_GATH_SLAY_COMNT -1564089
#define SAY_GATH_DEATH -1564093
#define SAY_GATH_SPECIAL1 -1564077
#define SAY_GATH_SPECIAL2 -1564081
#define SAY_VERA_SLAY -1564086
#define SAY_VERA_COMNT -1564089
#define SAY_VERA_DEATH -1564094
#define SAY_VERA_SPECIAL1 -1564078
#define SAY_VERA_SPECIAL2 -1564082
#define SAY_MALA_SLAY -1564087
#define SAY_MALA_COMNT -1564090
#define SAY_MALA_DEATH -1564095
#define SAY_MALA_SPECIAL1 -1564079
#define SAY_MALA_SPECIAL2 -1564083
#define SAY_ZERE_SLAY -1564088
#define SAY_ZERE_COMNT -1564091
#define SAY_ZERE_DEATH -1564096
#define SAY_ZERE_SPECIAL1 -1564080
#define SAY_ZERE_SPECIAL2 -1564084
#define ERROR_INST_DATA "SD2 ERROR: Instance Data for Black Temple not set properly; Illidari Council event will not function properly."
struct CouncilYells
{
int32 entry;
uint32 timer;
};
static CouncilYells CouncilAggro[]=
{
{-1564069, 5000}, // Gathios
{-1564070, 5500}, // Veras
{-1564071, 5000}, // Malande
{-1564072, 0}, // Zerevor
};
// Need to get proper timers for this later
static CouncilYells CouncilEnrage[]=
{
{-1564073, 2000}, // Gathios
{-1564074, 6000}, // Veras
{-1564075, 5000}, // Malande
{-1564076, 0}, // Zerevor
};
// High Nethermancer Zerevor's spells
#define SPELL_FLAMESTRIKE 41481
#define SPELL_BLIZZARD 41482
@@ -55,84 +105,6 @@ EndScriptData */
#define SPELL_BERSERK 45078
//Speech'n'Sounds
#define SAY_GATH_AGGRO "I have better things to do!"
#define SOUND_GATH_AGGRO 11422
#define SAY_GATH_SLAY "Selama am'oronor!"
#define SOUND_GATH_SLAY 11423
#define SAY_GATH_COMNT "Well done!"
#define SOUND_GATH_COMNT 11424
#define SAY_GATH_DEATH "Lord Illidan... I..."
#define SOUND_GATH_DEATH 11425
#define SAY_GATH_SPECIAL1 "Enjoy your final moments!"
#define SOUND_GATH_SPECIAL1 11426
#define SAY_GATH_SPECIAL2 "You are mine!"
#define SOUND_GATH_SPECIAL2 11427
#define SAY_MALA_AGGRO "Flee, or die!"
#define SOUND_MALA_AGGRO 11482
#define SAY_MALA_SLAY "My work is done."
#define SOUND_MALA_SLAY 11483
#define SAY_MALA_COMNT "As it should be!"
#define SOUND_MALA_COMNT 11484
#define SAY_MALA_DEATH "Destiny... awaits."
#define SOUND_MALA_DEATH 11485
#define SAY_MALA_SPECIAL1 "No second chances!"
#define SOUND_MALA_SPECIAL1 11486
#define SAY_MALA_SPECIAL2 "I'm full of surprises!"
#define SOUND_MALA_SPECIAL2 11487
#define SAY_ZERE_AGGRO "Common... such a crude language. Bandal!"
#define SOUND_ZERE_AGGRO 11440
#define SAY_ZERE_SLAY "Shorel'aran."
#define SOUND_ZERE_SLAY 11441
#define SAY_ZERE_COMNT "Belesa menoor!"
#define SOUND_ZERE_COMNT 11442
#define SAY_ZERE_DEATH "Diel ma'ahn... oreindel'o"
#define SOUND_ZERE_DEATH 11443
#define SAY_ZERE_SPECIAL1 "Diel fin'al"
#define SOUND_ZERE_SPECIAL1 11444
#define SAY_ZERE_SPECIAL2 "Sha'amoor ara mashal?"
#define SOUND_ZERE_SPECIAL2 11445
#define SAY_VERA_AGGRO "You wish to test me?"
#define SOUND_VERA_AGGRO 11524
#define SAY_VERA_SLAY "Valiant effort!"
#define SOUND_VERA_SLAY 11525
#define SAY_VERA_COMNT "A glorious kill!"
#define SOUND_VERA_COMNT 11526
#define SAY_VERA_DEATH "You got lucky!"
#define SOUND_VERA_DEATH 11527
#define SAY_VERA_SPECIAL1 "You're not caught up for this!"
#define SOUND_VERA_SPECIAL1 11528
#define SAY_VERA_SPECIAL2 "Anar'alah belore!"
#define SOUND_VERA_SPECIAL2 11529
#define ERROR_INST_DATA "SD2 ERROR: Instance Data for Black Temple not set properly; Illidari Council event will not function properly."
struct CouncilYells
{
char* text;
uint32 soundId, timer;
};
static CouncilYells CouncilAggro[]=
{
{"I have better things to do!", 11422, 5000}, // Gathios
{"You wish to test me?", 11524, 5500}, // Veras
{"Flee, or die!", 11482, 5000}, // Malande
{"Common... such a crude language. Bandal!", 11440, 0}, // Zerevor
};
// Need to get proper timers for this later
static CouncilYells CouncilEnrage[]=
{
{"Enough games!", 11428, 2000}, // Gathios
{"You wish to kill me? Hahaha, you first!", 11530, 6000},//Veras
{"For Quel'Thalas! For the Sunwell!", 11488, 5000}, // Malande
{"Sha'amoor sine menoor!", 11446, 0}, // Zerevor
};
struct TRINITY_DLL_DECL mob_blood_elf_council_voice_triggerAI : public ScriptedAI
{
mob_blood_elf_council_voice_triggerAI(Creature* c) : ScriptedAI(c)
@@ -170,8 +142,7 @@ struct TRINITY_DLL_DECL mob_blood_elf_council_voice_triggerAI : public ScriptedA
Council[1] = pInstance->GetData64(DATA_VERASDARKSHADOW);
Council[2] = pInstance->GetData64(DATA_LADYMALANDE);
Council[3] = pInstance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
}
else error_log(ERROR_INST_DATA);
}else error_log(ERROR_INST_DATA);
}
void Aggro(Unit* who) {}
@@ -188,31 +159,33 @@ struct TRINITY_DLL_DECL mob_blood_elf_council_voice_triggerAI : public ScriptedA
return;
if(AggroYellTimer)
{
if(AggroYellTimer <= diff)
{
if(Unit* pMember = Unit::GetUnit(*m_creature, Council[YellCounter]))
{
pMember->MonsterYell(CouncilAggro[YellCounter].text, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(pMember, CouncilAggro[YellCounter].soundId);
DoScriptText(CouncilAggro[YellCounter].entry, pMember);
AggroYellTimer = CouncilAggro[YellCounter].timer;
}
++YellCounter;
if(YellCounter > 3)
YellCounter = 0; // Reuse for Enrage Yells
}else AggroYellTimer -= diff;
}
if(EnrageTimer)
{
if(EnrageTimer <= diff)
{
if(Unit* pMember = Unit::GetUnit(*m_creature, Council[YellCounter]))
{
pMember->CastSpell(pMember, SPELL_BERSERK, true);
pMember->MonsterYell(CouncilEnrage[YellCounter].text, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(pMember, CouncilEnrage[YellCounter].soundId);
DoScriptText(CouncilEnrage[YellCounter].entry, pMember);
EnrageTimer = CouncilEnrage[YellCounter].timer;
}
++YellCounter;
}else EnrageTimer -= diff;
}
}
};
@@ -302,7 +275,7 @@ struct TRINITY_DLL_DECL mob_illidari_councilAI : public ScriptedAI
{
Member = Unit::GetUnit((*m_creature), Council[i]);
if(Member && Member->isAlive())
Member->AddThreat(target, 1.0f);
((Creature*)Member)->AI()->AttackStart(target);
}
}
@@ -317,6 +290,7 @@ struct TRINITY_DLL_DECL mob_illidari_councilAI : public ScriptedAI
if(!EventBegun) return;
if(EndEventTimer)
{
if(EndEventTimer <= diff)
{
if(DeathCount > 3)
@@ -337,8 +311,10 @@ struct TRINITY_DLL_DECL mob_illidari_councilAI : public ScriptedAI
++DeathCount;
EndEventTimer = 1500;
}else EndEventTimer -= diff;
}
if(CheckTimer)
{
if(CheckTimer <= diff)
{
uint8 EvadeCheck = 0;
@@ -366,6 +342,7 @@ struct TRINITY_DLL_DECL mob_illidari_councilAI : public ScriptedAI
CheckTimer = 2000;
}else CheckTimer -= diff;
}
}
};
@@ -460,14 +437,12 @@ struct TRINITY_DLL_DECL boss_gathios_the_shattererAI : public boss_illidari_coun
void KilledUnit(Unit *victim)
{
DoYell(SAY_GATH_SLAY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_GATH_SLAY);
DoScriptText(SAY_GATH_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoYell(SAY_GATH_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_GATH_DEATH);
DoScriptText(SAY_GATH_DEATH, m_creature);
}
Unit* SelectCouncilMember()
@@ -579,14 +554,12 @@ struct TRINITY_DLL_DECL boss_high_nethermancer_zerevorAI : public boss_illidari_
void KilledUnit(Unit *victim)
{
DoYell(SAY_ZERE_SLAY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_ZERE_SLAY);
DoScriptText(SAY_ZERE_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoYell(SAY_ZERE_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_ZERE_DEATH);
DoScriptText(SAY_ZERE_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -669,14 +642,12 @@ struct TRINITY_DLL_DECL boss_lady_malandeAI : public boss_illidari_councilAI
void KilledUnit(Unit *victim)
{
DoYell(SAY_MALA_SLAY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_MALA_SLAY);
DoScriptText(SAY_MALA_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoYell(SAY_MALA_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_MALA_DEATH);
DoScriptText(SAY_MALA_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -745,14 +716,12 @@ struct TRINITY_DLL_DECL boss_veras_darkshadowAI : public boss_illidari_councilAI
void KilledUnit(Unit *victim)
{
DoYell(SAY_VERA_SLAY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_VERA_SLAY);
DoScriptText(SAY_VERA_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoYell(SAY_VERA_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_VERA_DEATH);
DoScriptText(SAY_VERA_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -40,7 +40,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
{
instance_black_temple(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_black_temple(Map *map) : ScriptedInstance(map) {Initialize();};
uint64 Najentus;
uint64 Akama; // This is the Akama that starts the Illidan encounter.
@@ -23,6 +23,8 @@ EndScriptData */
#include "precompiled.h"
#define EMOTE_FRENZY -1469031
#define SPELL_SHADOWFLAME 22539
#define SPELL_WINGBUFFET 23339
#define SPELL_FRENZY 23342 //This spell periodically triggers fire nova
@@ -72,6 +74,7 @@ struct TRINITY_DLL_DECL boss_flamegorAI : public ScriptedAI
//Frenzy_Timer
if (Frenzy_Timer < diff)
{
DoScriptText(EMOTE_FRENZY, m_creature);
DoCast(m_creature,SPELL_FRENZY);
Frenzy_Timer = 8000 + (rand()%2000);
}else Frenzy_Timer -= diff;
@@ -1,3 +1,19 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Instance_Blackwing_Lair
SD%Complete: 0
@@ -16,8 +16,8 @@
/* ScriptData
SDName: Boss_Archimonde
SD%Complete: 95
SDComment: Doomfires not completely offlike due to core limitations for random moving.
SD%Complete: 85
SDComment: Doomfires not completely offlike due to core limitations for random moving. Tyrande and second phase not fully implemented.
SDCategory: Caverns of Time, Mount Hyjal
EndScriptData */
@@ -25,6 +25,20 @@ EndScriptData */
#include "def_hyjal.h"
#include "SpellAuras.h"
//text id -1534018 are the text used when previous events complete. Not part of this script.
#define SAY_AGGRO -1534019
#define SAY_DOOMFIRE1 -1534020
#define SAY_DOOMFIRE2 -1534021
#define SAY_AIR_BURST1 -1534022
#define SAY_AIR_BURST2 -1534023
#define SAY_SLAY1 -1534024
#define SAY_SLAY2 -1534025
#define SAY_SLAY3 -1534026
#define SAY_ENRAGE -1534027
#define SAY_DEATH -1534028
#define SAY_SOUL_CHARGE1 -1534029
#define SAY_SOUL_CHARGE2 -1534030
#define SPELL_DENOUEMENT_WISP 32124
#define SPELL_ANCIENT_SPARK 39349
#define SPELL_PROTECTION_OF_ELUNE 38528
@@ -36,6 +50,7 @@ EndScriptData */
#define SPELL_HAND_OF_DEATH 35354
#define SPELL_AIR_BURST 32014
#define SPELL_GRIP_OF_THE_LEGION 31972
#define SPELL_DOOMFIRE_STRIKE 31903 //summons two creatures
#define SPELL_DOOMFIRE_SPAWN 32074
#define SPELL_DOOMFIRE_VISUAL 42344 // This is actually a Zul'Aman spell, but the proper Doomfire spell sometimes freezes the server if a player stands in it for too long
#define SPELL_DOOMFIRE_DAMAGE 31944
@@ -47,42 +62,6 @@ EndScriptData */
#define SPELL_UNLEASH_SOUL_RED 32053
#define SPELL_FEAR 31970
#define SAY_AGGRO "Your resistance is insignificant!"
#define SOUND_AGGRO 10987
#define SAY_DOOMFIRE1 "This world will burn!"
#define SOUND_DOOMFIRE1 10990
#define SAY_DOOMFIRE2 "Manach sheek-thrish!"
#define SOUND_DOOMFIRE2 11041
#define SAY_AIR_BURST "A-kreesh!"
#define SOUND_AIR_BURST 10989
#define SAY_AIR_BURST2 "Away vermin!"
#define SOUND_AIR_BURST2 11043
#define SAY_SLAY1 "All creation will be devoured!"
#define SOUND_SLAY1 11044
#define SAY_SLAY2 "Your soul will languish for eternity."
#define SOUND_SLAY2 10991
#define SAY_SLAY3 "I am the coming of the end!"
#define SOUND_SLAY3 11045
#define SAY_UNK1 "You are mine now."
#define SOUND_UNK1 10988
#define SAY_UNK2 "Bow to my will."
#define SOUND_UNK2 11042
#define SAY_ENRAGE "At last it is here. Mourn and lament the passing of all you have ever known and all that would have been! Akmin-kurai!"
#define SOUND_ENRAGE 10993
#define SAY_DEATH "No, it cannot be! Nooo!"
#define SOUND_DEATH 10992
#define CREATURE_ARCHIMONDE 17968
#define CREATURE_DOOMFIRE 18095
#define CREATURE_DOOMFIRE_TARGETING 18104
@@ -270,7 +249,7 @@ struct TRINITY_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI
|| who->GetEntry() == CREATURE_DOOMFIRE || who->GetEntry() == CREATURE_DOOMFIRE_TARGETING || !who->isTargetableForAttack())
return;
m_creature->AddThreat(who, 1.0f);
m_creature->AddThreat(who, 0.0f);
}
void DamageTaken(Unit *done_by, uint32 &damage) { damage = 0; }
@@ -386,7 +365,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
pInstance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED);
DrainNordrassilTimer = 0;
FearTimer = 40000;
FearTimer = 42000;
AirBurstTimer = 30000;
GripOfTheLegionTimer = 5000 + rand()%20000;
DoomfireTimer = 20000;
@@ -407,8 +386,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
void Aggro(Unit *who)
{
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
if(pInstance)
@@ -419,18 +397,9 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 2:
DoYell(SAY_SLAY3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY3);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
if(victim && (victim->GetTypeId() == TYPEID_PLAYER))
@@ -464,8 +433,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
void JustDied(Unit *victim)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_ARCHIMONDEEVENT, DONE);
@@ -524,15 +492,10 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
if(target)
Doomfire->AI()->AttackStart(target);
if(rand()%2 == 0)
{
DoYell(SAY_DOOMFIRE1, LANG_UNIVERSAL, m_creature);
DoPlaySoundToSet(m_creature, SOUND_DOOMFIRE1);
}else
{
DoYell(SAY_DOOMFIRE2, LANG_UNIVERSAL, m_creature);
DoPlaySoundToSet(m_creature, SOUND_DOOMFIRE2);
}
if(rand()%2 == 0)
DoScriptText(SAY_DOOMFIRE1, m_creature);
else
DoScriptText(SAY_DOOMFIRE2, m_creature);
}
}
@@ -626,13 +589,13 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
Enraged = true;
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}
}else EnrageTimer -= diff;
if(CheckDistanceTimer < diff)
{ // To simplify the check, we simply summon a creature in the location and then check how far we are from the creature
{
// To simplify the check, we simply summon a creature in the location and then check how far we are from the creature
Creature* Check = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000);
if(Check)
{
@@ -642,8 +605,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
Enraged = true;
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}
}
CheckDistanceTimer = 5000;
@@ -656,6 +618,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
//all members of raid must get this buff
DoCast(m_creature->getVictim(), SPELL_PROTECTION_OF_ELUNE);
HasProtected = true;
Enraged = true;
@@ -703,14 +666,10 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
if(AirBurstTimer < diff)
{
if(rand()%2 == 0)
{
DoYell(SAY_AIR_BURST, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AIR_BURST);
}else
{
DoYell(SAY_AIR_BURST2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AIR_BURST2);
}
DoScriptText(SAY_AIR_BURST1, m_creature);
else
DoScriptText(SAY_AIR_BURST2, m_creature);
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_AIR_BURST);
AirBurstTimer = 25000 + rand()%15000;
@@ -719,7 +678,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
if(FearTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_FEAR);
FearTimer = 40000;
FearTimer = 42000;
}else FearTimer -= diff;
if(DoomfireTimer < diff)
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -16,8 +16,8 @@
/* ScriptData
SDName: Hyjal
SD%Complete: 100
SDComment:
SD%Complete: 80
SDComment: gossip text id's unknown
SDCategory: Caverns of Time, Mount Hyjal
EndScriptData */
@@ -30,12 +30,17 @@ EndContentData */
#include "precompiled.h"
#include "hyjalAI.h"
#define GOSSIP_ITEM_BEGIN_ALLY "We are ready to defend the Alliance base."
#define GOSSIP_ITEM_ANETHERON "The defenses are holding up; we can continue."
#define GOSSIP_ITEM_RETREAT "We can't keep this up. Let's retreat!"
#define GOSSIP_ITEM_BEGIN_ALLY "My companions and I are with you, Lady Proudmoore."
#define GOSSIP_ITEM_ANETHERON "We are ready for whatever Archimonde might send our way, Lady Proudmoore."
#define GOSSIP_ITEM_BEGIN_HORDE "I am with you, Thrall."
#define GOSSIP_ITEM_AZGALOR "We have nothing to fear."
#define GOSSIP_ITEM_RETREAT "We can't keep this up. Let's retreat!"
#define GOSSIP_ITEM_TYRANDE "Aid us in defending Nordrassil"
#define ITEM_TEAR_OF_GODDESS 24494
#define GOSSIP_ITEM_BEGIN_HORDE "We're here to help! The Alliance are overrun."
#define GOSSIP_ITEM_AZGALOR "We're okay so far. Let's do this!"
CreatureAI* GetAI_npc_jaina_proudmoore(Creature *_Creature)
{
@@ -72,10 +77,10 @@ bool GossipHello_npc_jaina_proudmoore(Player *player, Creature *_Creature)
else if(RageEncounter == DONE && AnetheronEncounter == NOT_STARTED)
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
else if(RageEncounter == DONE && AnetheronEncounter == DONE)
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
if(player->isGameMaster())
player->ADD_GOSSIP_ITEM(2, "[GM] Toggle Debug Timers", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM(2, "[GM] Toggle Debug Timers", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
@@ -84,7 +89,6 @@ bool GossipHello_npc_jaina_proudmoore(Player *player, Creature *_Creature)
bool GossipSelect_npc_jaina_proudmoore(Player *player, Creature *_Creature, uint32 sender, uint32 action)
{
player->PlayerTalkClass->GetGossipMenu();
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
switch(action)
{
@@ -99,9 +103,9 @@ bool GossipSelect_npc_jaina_proudmoore(Player *player, Creature *_Creature, uint
case GOSSIP_ACTION_INFO_DEF + 3:
ai->Retreat();
break;
case GOSSIP_ACTION_INFO_DEF + 4:
case GOSSIP_ACTION_INFO_DEF:
ai->Debug = !ai->Debug;
outstring_log("SD2 : HyjalAI - Debug mode has been toggled");
debug_log("SD2: HyjalAI - Debug mode has been toggled");
break;
}
@@ -129,8 +133,14 @@ CreatureAI* GetAI_npc_thrall(Creature *_Creature)
bool GossipHello_npc_thrall(Player *player, Creature *_Creature)
{
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
if (ai->EventBegun)
return false;
uint32 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT);
if(AnetheronEvent >= DONE && !ai->EventBegun) // Only let them start the Horde phase if Anetheron is dead.
// Only let them start the Horde phases if Anetheron is dead.
if (AnetheronEvent == DONE)
{
uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT);
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
@@ -143,7 +153,7 @@ bool GossipHello_npc_thrall(Player *player, Creature *_Creature)
}
if(player->isGameMaster())
player->ADD_GOSSIP_ITEM(2, "[GM] Toggle Debug Timers", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM(2, "[GM] Toggle Debug Timers", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
@@ -152,7 +162,6 @@ bool GossipHello_npc_thrall(Player *player, Creature *_Creature)
bool GossipSelect_npc_thrall(Player *player, Creature *_Creature, uint32 sender, uint32 action)
{
player->PlayerTalkClass->GetGossipMenu();
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
switch(action)
{
@@ -167,26 +176,48 @@ bool GossipSelect_npc_thrall(Player *player, Creature *_Creature, uint32 sender,
case GOSSIP_ACTION_INFO_DEF + 3:
ai->Retreat();
break;
case GOSSIP_ACTION_INFO_DEF + 4:
case GOSSIP_ACTION_INFO_DEF:
ai->Debug = !ai->Debug;
outstring_log("SD2 : HyjalAI - Debug mode has been toggled");
debug_log("SD2: HyjalAI - Debug mode has been toggled");
break;
}
return true;
}
CreatureAI* GetAI_npc_tyrande_whisperwind(Creature *_Creature)
{
hyjalAI* ai = new hyjalAI(_Creature);
ai->Reset();
ai->EnterEvadeMode();
return ai;
}
bool GossipHello_npc_tyrande_whisperwind(Player* player, Creature* _Creature)
{
player->ADD_GOSSIP_ITEM(1, "Aid us in defending Nordrassil", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
return true;
hyjalAI* 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,1))
player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
return true;
}
bool GossipSelect_npc_tyrande_whisperwind(Player *player, Creature *_Creature, uint32 sender, uint32 action)
{
if(action == GOSSIP_ACTION_TRADE)
player->SEND_VENDORLIST( _Creature->GetGUID() );
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)
{
player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true);
}
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
}
return true;
}
@@ -213,5 +244,6 @@ void AddSC_hyjal()
newscript->Name = "npc_tyrande_whisperwind";
newscript->pGossipHello = &GossipHello_npc_tyrande_whisperwind;
newscript->pGossipSelect = &GossipSelect_npc_tyrande_whisperwind;
newscript->GetAI = &GetAI_npc_tyrande_whisperwind;
newscript->RegisterSelf();
}
@@ -16,7 +16,7 @@
/* ScriptData
SDName: HyjalAI
SD%Complete: 99
SD%Complete: 90
SDComment: World Packet workaround for World States
SDCategory: Caverns of Time, Mount Hyjal
EndScriptData */
@@ -25,7 +25,8 @@ EndScriptData */
#include "hyjalAI.h"
#include "WorldPacket.h"
float AllianceBase[4][3]= // Locations for summoning waves in Alliance base
// Locations for summoning waves in Alliance base
float AllianceBase[4][3]=
{
{4979.010, -1709.134, 1339.674},
{4969.123, -1705.904, 1341.363},
@@ -33,7 +34,8 @@ float AllianceBase[4][3]= // Locations for sum
{4975.262, -1698.239, 1341.427}
};
float HordeBase[4][3]= // Locations for summoning waves in Horde base
// Locations for summoning waves in Horde base
float HordeBase[4][3]=
{
{5554.399, -2581.419, 1480.820},
{5538.996, -2577.742, 1479.790},
@@ -41,14 +43,11 @@ float HordeBase[4][3]= // Locations for sum
{5547.218, -2574.589, 1479.194}
};
float AttackArea[2][3]= // used to inform the wave where to move and attack to
// used to inform the wave where to move and attack to
float AttackArea[2][3]=
{
{ // Alliance
5042.9189, -1776.2562, 1323.0621
},
{ // Horde
5510.4815, -2676.7112, 1480.4314
}
{5042.9189, -1776.2562, 1323.0621}, // Alliance
{5510.4815, -2676.7112, 1480.4314} // Horde
};
hyjalAI::hyjalAI(Creature *c) : ScriptedAI(c)
@@ -59,20 +58,20 @@ hyjalAI::hyjalAI(Creature *c) : ScriptedAI(c)
void hyjalAI::Reset()
{
/** GUIDs **/
// GUIDs
PlayerGUID = 0;
BossGUID[0] = 0;
BossGUID[1] = 0;
/** Timers **/
// Timers
NextWaveTimer = 10000;
CheckTimer = 0;
RetreatTimer = 1000;
/** Misc **/
// Misc
WaveCount = 0;
/** Set faction properly based on creature entry**/
// Set faction properly based on creature entry
switch(m_creature->GetEntry())
{
case 17772:
@@ -80,36 +79,39 @@ void hyjalAI::Reset()
DoCast(m_creature, SPELL_BRILLIANCE_AURA, true);
break;
case 17852: Faction = 1; break;
case 17852:
Faction = 1;
break;
}
/** Bools **/
//Bools
EventBegun = false;
FirstBossDead = false;
SecondBossDead = false;
Summon = false;
bRetreat = false;
Debug = false;
/** Flags **/
//Flags
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
/** Initialize spells **/
//Initialize spells
memset(Spell, 0, sizeof(Spell));
/** Reset World States **/
//Reset World States
UpdateWorldState(WORLDSTATE_WAVES, 0);
UpdateWorldState(WORLDSTATE_ENEMY, 0);
UpdateWorldState(WORLDSTATE_ENEMYCOUNT, 0);
/** Reset Instance Data for trash count **/
//Reset Instance Data for trash count
if(pInstance)
pInstance->SetData(DATA_RESET_TRASH_COUNT, 0);
else error_log(ERROR_INST_DATA);
/*** Visibility ***/
//Visibility
m_creature->SetVisibility(VISIBILITY_ON);
/** If Jaina evades, reset the visibility of all other creatures in the grid. **/
//If Jaina evades, reset the visibility of all other creatures in the grid.
if(CreatureList.empty())
return;
@@ -130,6 +132,8 @@ void hyjalAI::EnterEvadeMode()
if(m_creature->isAlive())
m_creature->GetMotionMaster()->MoveTargetedHome();
m_creature->SetLootRecipient(NULL);
InCombat = false;
}
@@ -158,15 +162,16 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
Creature* pCreature = m_creature->SummonCreature(entry, SpawnLoc[0], SpawnLoc[1], SpawnLoc[2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
if(pCreature)
{
++EnemyCount; // Increment Enemy Count to be used in World States and instance script
// Increment Enemy Count to be used in World States and instance script
++EnemyCount;
pCreature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
pCreature->GetMotionMaster()->MovePoint(0, AttackLoc[0],AttackLoc[1],AttackLoc[2]);
pCreature->AddThreat(m_creature, 1.0f);
pCreature->AddThreat(m_creature, 0.0f);
DoZoneInCombat(pCreature);
// Check if creature is a boss.
if(pCreature->GetCreatureInfo()->rank == 3)
if (pCreature->isWorldBoss())
{
if(!FirstBossDead) BossGUID[0] = pCreature->GetGUID();
else BossGUID[1] = pCreature->GetGUID();
@@ -177,8 +182,9 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3])
{
if(rand()%4 == 0) // 1 in 4 chance we give a rally yell. Not sure if the chance is Blizzlike.
Talk(RALLY);
// 1 in 4 chance we give a rally yell. Not sure if the chance is offilike.
if (rand()%4 == 0)
Talk(RALLY);
if(!pInstance)
{
@@ -271,23 +277,18 @@ void hyjalAI::Talk(uint32 id)
uint8 ind = *(index.begin()) + rand()%index.size();
char* Yell = NULL;
uint32 Sound = 0;
int32 YellId = 0;
if(Faction == 0) // Alliance
{
Yell = JainaQuotes[ind].text;
Sound = JainaQuotes[ind].sound;
YellId = JainaQuotes[ind].textid;
}
else if(Faction == 1) // Horde
{
Yell = ThrallQuotes[ind].text;
Sound = ThrallQuotes[ind].sound;
YellId = ThrallQuotes[ind].textid;
}
if(Yell)
DoYell(Yell, LANG_UNIVERSAL, NULL);
if(Sound)
DoPlaySoundToSet(m_creature, Sound);
if (YellId)
DoScriptText(YellId, m_creature);
}
// Slight workaround for now
@@ -359,18 +360,20 @@ void hyjalAI::Retreat()
void hyjalAI::UpdateAI(const uint32 diff)
{
if(bRetreat)
{
if(RetreatTimer < diff)
{
bRetreat = false;
if(CreatureList.empty())
return;
{
bRetreat = false;
if(CreatureList.empty())
return;
for(std::list<uint64>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
pUnit->SetVisibility(VISIBILITY_OFF);
for(std::list<uint64>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
pUnit->SetVisibility(VISIBILITY_OFF);
m_creature->SetVisibility(VISIBILITY_OFF);
}else RetreatTimer -= diff;
m_creature->SetVisibility(VISIBILITY_OFF);
}else RetreatTimer -= diff;
}
if(!EventBegun)
return;
@@ -31,13 +31,13 @@
#define WORLDSTATE_ENEMY 2453
#define WORLDSTATE_ENEMYCOUNT 2454
/*** Spells for Jaina ***/
//Spells for Jaina
#define SPELL_BRILLIANCE_AURA 31260 // The database must handle this spell via creature_addon
#define SPELL_BLIZZARD 31266
#define SPELL_PYROBLAST 31263
#define SPELL_SUMMON_ELEMENTALS 31264
/** Thrall spells **/
//Thrall spells
#define SPELL_CHAIN_LIGHTNING 31330
#define SPELL_SUMMON_DIRE_WOLF 31331
@@ -49,119 +49,53 @@ struct Wave
};
static Wave AllianceWaves[]= // Waves that will be summoned in the Alliance Base
{
{ // Wave 1
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 2
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 3
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 4
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 5
GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 6
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 7
GHOUL, GHOUL, GHOUL, GHOUL, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 8
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false
},
{ // All 8 Waves are summoned, summon Rage Winterchill, next few waves are for Anetheron
RAGE_WINTERCHILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true
},
{ // Wave 1
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 2
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 3
GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 4
GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 5
CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 6
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 7
CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 8
GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false
},
{ // All 8 Waves are summoned, summon Anatheron
ANETHERON, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true
}
{ // Rage Winterchill Wave 1-8
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
// All 8 Waves are summoned, summon Rage Winterchill, next few waves are for Anetheron
{RAGE_WINTERCHILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true},
// Anetheron Wave 1-8
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false},
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
// All 8 Waves are summoned, summon Anatheron
{ANETHERON, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true}
};
static Wave HordeWaves[]= // Waves that are summoned in the Horde base
{
{ // Wave 1
GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 2
GHOUL, GHOUL, GHOUL, GHOUL, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 120000, false
},
{ // Wave 3
GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false
},
{ // Wave 4
CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, NECROMANCER, NECROMANCER , 0, 0, 0, 0, 120000, false
},
{ // Wave 5
GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 6
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, FROST_WYRM, 0, 0, 120000, false
},
{ // Wave 7
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, FROST_WYRM, 0, 0, 120000, false
},
{ // Wave 8
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, 180000, false
},
{ // All 8 Waves are summoned, summon Kaz'Rogal, next few waves are for Azgalor
KAZROGAL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true
},
{ // Wave 1
ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 2
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, FROST_WYRM, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 120000, false
},
{ // Wave 3
GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 120000, false
},
{ // Wave 4
GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, 0, 0, 0, 0, 120000, false
},
{ // Wave 5
FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false
},
{ // Wave 6
NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 120000, false
},
{ // Wave 7
GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 0, 0, 120000, false
},
{ // Wave 8
CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 180000, false
},
{ // All 8 Waves are summoned, summon Azgalor
AZGALOR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true
}
{ // Kaz'Rogal Wave 1-8
{GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false},
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, FROST_WYRM, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, FROST_WYRM, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, 180000, false},
// All 8 Waves are summoned, summon Kaz'Rogal, next few waves are for Azgalor
{KAZROGAL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true},
// Azgalor Wave 1-8
{ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, FROST_WYRM, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 120000, false},
{GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, 0, 0, 0, 0, 120000, false},
{FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false},
{NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 120000, false},
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 0, 0, 120000, false},
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 180000, false},
// All 8 Waves are summoned, summon Azgalor
{AZGALOR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true}
};
enum TargetType // Used in the spell cast system for the AI
@@ -174,8 +108,7 @@ enum TargetType // Used in the spell
struct Yells
{
uint32 id; // Used to determine the type of yell (attack, rally, etc)
char* text; // The text to be yelled
uint32 sound; // Sound that corresponds to the text
int32 textid; // The text id to be yelled
};
enum YellId
@@ -191,29 +124,28 @@ enum YellId
static Yells JainaQuotes[]=
{
{ATTACKED, "I'm in jeopardy, help me if you can!", 11007},
{ATTACKED, "They've broken through!", 11049},
{INCOMING, "Stay alert! Another wave approaches.", 11008},
{BEGIN, "Hold them back as long as possible", 11050},
{RALLY, "Don't give up! We must prevail!", 11006},
{RALLY, "We must hold strong!", 11051},
{FAILURE, "We are lost. Fall back!", 11009},
{SUCCESS, "We have won valuable time. Now we must pull back!", 11011},
{DEATH, "I did... my best.", 11010},
{ATTACKED, -1534000},
{ATTACKED, -1534001},
{INCOMING, -1534002},
{BEGIN, -1534003},
{RALLY, -1534004},
{RALLY, -1534005},
{FAILURE, -1534006},
{SUCCESS, -1534007},
{DEATH, -1534008},
};
static Yells ThrallQuotes[]=
{
{ATTACKED, "I will lie down for no one!", 11031},
{ATTACKED, "Bring the fight to me and pay with your lives!", 11061},
{INCOMING, "Make ready for another wave! LOK-TAR OGAR!", 11032},
{BEGIN, "Do not give an inch of ground!", 11060},
{RALLY, "Hold them back! Do not falter!", 11030},
{RALLY, "Victory or death!", 11059},
{RALLY, "Do not give an inch of ground!", 11060},
{FAILURE, "It is over. Withdraw! We have failed.", 11033},
{SUCCESS, "We have played our part and done well. It is up to the others now.", 11035},
{DEATH, "Uraaa...", 11034},
{ATTACKED, -1534009},
{ATTACKED, -1534010},
{INCOMING, -1534011},
{BEGIN, -1534012},
{RALLY, -1534013},
{RALLY, -1534014},
{FAILURE, -1534015},
{SUCCESS, -1534016},
{DEATH, -1534017},
};
struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -37,7 +37,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
{
instance_mount_hyjal(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_mount_hyjal(Map *map) : ScriptedInstance(map) {Initialize();};
uint64 RageWinterchill;
uint64 Anetheron;
@@ -125,6 +125,8 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
break;
}
debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)",type,data);
if(data == DONE)
SaveToDB();
}
@@ -156,9 +158,8 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
stream << Encounters[0] << " " << Encounters[1] << " "
<< Encounters[2] << " " << Encounters[3] << " "
<< Encounters[4];
stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
<< Encounters[3] << " " << Encounters[4];
char* out = new char[stream.str().length() + 1];
strcpy(out, stream.str().c_str());
if(out)
@@ -170,18 +171,19 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
return NULL;
}
void Load(const char* load)
void Load(const char* in)
{
if(!load)
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(load);
std::istringstream stream;
stream >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream;
loadStream.str(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if(Encounters[i] == IN_PROGRESS) // Do not load an encounter as IN_PROGRESS - reset it instead.
Encounters[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Boss_Luetenant_Drake
SD%Complete: 70
SDComment: Missing proper code for patrolling area after being spawned. Also script for GO (barrels)(missing Trinity support)
SDComment: Missing proper code for patrolling area after being spawned. Script for GO (barrels) quest 10283
SDCategory: Caverns of Time, Old Hillsbrad Foothills
EndScriptData */
@@ -29,26 +29,18 @@ EndScriptData */
## go_barrel_old_hillsbrad
######*/
#define QUEST_ENTRY_DIVERSION 10283
#define LODGE_QUEST_TRIGGER 20155
bool GOHello_go_barrel_old_hillsbrad(Player *player, GameObject* _GO)
{
ScriptedInstance* pInstance = ((ScriptedInstance*)_GO->GetInstanceData());
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
if( pInstance )
{
if( pInstance->GetData(TYPE_BARREL_DIVERSION) != DONE )
{
pInstance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS);
}
else if( pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE )
{
player->SummonCreature(17848,2128.43,71.01,64.42,1.74,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1200000);
if( player->GetQuestStatus(QUEST_ENTRY_DIVERSION) == QUEST_STATUS_INCOMPLETE )
player->KilledMonster(LODGE_QUEST_TRIGGER,0);
}
}
if (!pInstance)
return false;
if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE)
return false;
pInstance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS);
return false;
}
@@ -13,4 +13,5 @@
#define TYPE_THRALL_PART4 6
#define DATA_THRALL 7
#define DATA_TARETHA 8
#define WORLD_STATE_OH 2436
#endif
@@ -16,15 +16,11 @@
/* ScriptData
SDName: Instance_Old_Hillsbrad
SD%Complete: 60
SD%Complete: 75
SDComment: If thrall escort fail, all parts will reset. In future, save sub-parts and continue from last known.
SDCategory: Caverns of Time, Old Hillsbrad Foothills
EndScriptData */
/*
-- UPDATE `gameobject_template` SET `ScriptName`='go_barrel_old_hillsbrad' WHERE `entry`=182589;
*/
#include "precompiled.h"
#include "def_old_hillsbrad.h"
@@ -33,9 +29,14 @@ EndScriptData */
#define THRALL_ENTRY 17876
#define TARETHA_ENTRY 18887
#define DRAKE_ENTRY 17848
#define QUEST_ENTRY_DIVERSION 10283
#define LODGE_QUEST_TRIGGER 20155
struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
{
instance_old_hillsbrad(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_old_hillsbrad(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
uint32 mBarrelCount;
@@ -55,6 +56,43 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
Encounter[i] = NOT_STARTED;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Old Hillsbrad: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void UpdateOHWorldState()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* player = itr->getSource())
{
player->SendUpdateWorldState(WORLD_STATE_OH,mBarrelCount);
if (mBarrelCount == 5)
player->KilledMonster(LODGE_QUEST_TRIGGER,0);
}
}
}else
debug_log("SD2: Instance Old Hillsbrad: UpdateOHWorldState, but PlayerList is empty!");
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature_entry)
@@ -70,17 +108,36 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
if (!player)
{
debug_log("SD2: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
switch(type)
{
case TYPE_BARREL_DIVERSION:
{
if( mBarrelCount < 5 )
{
mBarrelCount++;
debug_log("SD2: go_barrel_old_hillsbrad count %u",mBarrelCount);
}
else if( mBarrelCount >= 5 )
Encounter[0] = DONE;
if (data == IN_PROGRESS)
{
if (mBarrelCount >= 5)
return;
++mBarrelCount;
UpdateOHWorldState();
debug_log("SD2: Instance Old Hillsbrad: go_barrel_old_hillsbrad count %u",mBarrelCount);
if (mBarrelCount == 5)
SetData(TYPE_BARREL_DIVERSION,DONE);
}
if (data == DONE)
{
player->SummonCreature(DRAKE_ENTRY,2128.43,71.01,64.42,1.74,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
}
Encounter[0] = data;
break;
}
case TYPE_THRALL_EVENT:
@@ -91,7 +148,7 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
{
mThrallEventCount++;
Encounter[1] = NOT_STARTED;
debug_log("SD2: Thrall event failed %u times. Resetting all sub-events.",mThrallEventCount);
debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times. Resetting all sub-events.",mThrallEventCount);
Encounter[2] = NOT_STARTED;
Encounter[3] = NOT_STARTED;
Encounter[4] = NOT_STARTED;
@@ -104,29 +161,29 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
Encounter[3] = data;
Encounter[4] = data;
Encounter[5] = data;
debug_log("SD2: Thrall event failed %u times. Reset instance required.",mThrallEventCount);
debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times. Resetting all sub-events.",mThrallEventCount);
}
}
else
Encounter[1] = data;
debug_log("SD2: Thrall escort event adjusted to data %u.",data);
debug_log("SD2: Instance Old Hillsbrad: Thrall escort event adjusted to data %u.",data);
break;
}
case TYPE_THRALL_PART1:
Encounter[2] = data;
debug_log("SD2: Thrall event part I adjusted to data %u.",data);
debug_log("SD2: Instance Old Hillsbrad: Thrall event part I adjusted to data %u.",data);
break;
case TYPE_THRALL_PART2:
Encounter[3] = data;
debug_log("SD2: Thrall event part II adjusted to data %u.",data);
debug_log("SD2: Instance Old Hillsbrad: Thrall event part II adjusted to data %u.",data);
break;
case TYPE_THRALL_PART3:
Encounter[4] = data;
debug_log("SD2: Thrall event part III adjusted to data %u.",data);
debug_log("SD2: Instance Old Hillsbrad: Thrall event part III adjusted to data %u.",data);
break;
case TYPE_THRALL_PART4:
Encounter[5] = data;
debug_log("SD2: Thrall event part IV adjusted to data %u.",data);
debug_log("SD2: Instance Old Hillsbrad: Thrall event part IV adjusted to data %u.",data);
break;
}
}
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Old_Hillsbrad
SD%Complete: 40
SDComment: All friendly NPC's. Thrall waypoints fairly complete, missing many details, but possible to complete escort.
SDComment: Quest support: 10283, 10284. All friendly NPC's. Thrall waypoints fairly complete, missing many details, but possible to complete escort.
SDCategory: Caverns of Time, Old Hillsbrad Foothills
EndScriptData */
@@ -96,10 +96,10 @@ bool GossipSelect_npc_erozion(Player *player, Creature *_Creature, uint32 sender
if( action == GOSSIP_ACTION_INFO_DEF+1 )
{
ItemPosCountVec dest;
uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1, false);
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1);
if( msg == EQUIP_ERR_OK )
{
player->StoreNewItem( dest, ITEM_ENTRY_BOMBS, 1, true);
player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true);
}
player->SEND_GOSSIP_MENU(9515, _Creature->GetGUID());
}
@@ -114,6 +114,47 @@ bool GossipSelect_npc_erozion(Player *player, Creature *_Creature, uint32 sender
## npc_thrall_old_hillsbrad
######*/
//Thrall texts
#define SAY_TH_START_EVENT_PART1 -1560023
#define SAY_TH_ARMORY -1560024
#define SAY_TH_SKARLOC_MEET -1560025
#define SAY_TH_SKARLOC_TAUNT -1560026
#define SAY_TH_START_EVENT_PART2 -1560027
#define SAY_TH_MOUNTS_UP -1560028
#define SAY_TH_CHURCH_END -1560029
#define SAY_TH_MEET_TARETHA -1560030
#define SAY_TH_EPOCH_WONDER -1560031
#define SAY_TH_EPOCH_KILL_TARETHA -1560032
#define SAY_TH_EVENT_COMPLETE -1560033
#define SAY_TH_RANDOM_LOW_HP1 -1560034
#define SAY_TH_RANDOM_LOW_HP2 -1560035
#define SAY_TH_RANDOM_DIE1 -1560036
#define SAY_TH_RANDOM_DIE2 -1560037
#define SAY_TH_RANDOM_AGGRO1 -1560038
#define SAY_TH_RANDOM_AGGRO2 -1560039
#define SAY_TH_RANDOM_AGGRO3 -1560040
#define SAY_TH_RANDOM_AGGRO4 -1560041
#define SAY_TH_RANDOM_KILL1 -1560042
#define SAY_TH_RANDOM_KILL2 -1560043
#define SAY_TH_RANDOM_KILL3 -1560044
#define SAY_TH_LEAVE_COMBAT1 -1560045
#define SAY_TH_LEAVE_COMBAT2 -1560046
#define SAY_TH_LEAVE_COMBAT3 -1560047
//Taretha texts
#define SAY_TA_FREE -1560048
#define SAY_TA_ESCAPED -1560049
//Misc for Thrall
#define SPELL_STRIKE 14516
#define SPELL_SHIELD_BLOCK 12169
#define SPELL_SUMMON_EROZION_IMAGE 33954 //if thrall dies during escort?
#define SPEED_WALK (0.5f)
#define SPEED_RUN (1.0f)
#define SPEED_MOUNT (1.6f)
@@ -125,6 +166,10 @@ bool GossipSelect_npc_erozion(Player *player, Creature *_Creature, uint32 sender
#define THRALL_MODEL_UNEQUIPPED 17292
#define THRALL_MODEL_EQUIPPED 18165
//Misc creature entries
#define ENTRY_ARMORER 18764
#define ENTRY_SCARLOC 17862
#define MOB_ENTRY_RIFLE 17820
#define MOB_ENTRY_WARDEN 17833
#define MOB_ENTRY_VETERAN 17860
@@ -146,7 +191,9 @@ bool GossipSelect_npc_erozion(Player *player, Creature *_Creature, uint32 sender
#define SKARLOC_MOUNT 18798
#define SKARLOC_MOUNT_MODEL 18223
#define EROZION_ENTRY 18723
#define ENTRY_EPOCH 18096
//gossip items
#define GOSSIP_ID_START 9568
#define GOSSIP_ID_SKARLOC1 9614 //I'm glad Taretha is alive. We now must find a way to free her...
#define GOSSIP_ITEM_SKARLOC1 "Taretha cannot see you, Thrall."
@@ -159,65 +206,6 @@ bool GossipSelect_npc_erozion(Player *player, Creature *_Creature, uint32 sender
#define GOSSIP_ID_COMPLETE 9578 //Thank you friends, I owe my freedom to you. Where is Taretha? I hoped to see her
#define THRALL_START_EVENT_PART1 "Very well then. Let's go!"
#define SOUND_START_EVENT 10465
#define THRALL_SAY_ARMOR "As long as we're going with a new plan, I may aswell pick up a weapon and some armor."
#define THRALL_SKARLOC_MEET "A rider approaches!"
#define SOUND_SKARLOC_MEET 10466
#define THRALL_SKARLOC_TAUNT "I'll never be chained again!"
#define SOUND_SKARLOC_TAUNT 10467
#define THRALL_START_EVENT_PART2 "Very well. Tarren Mill lies just west of here. Since time is of the essence..."
#define SOUND_START_EVENT_PART2 10468
#define THRALL_MOUNTS_UP "Let's ride!"
#define SOUND_MOUNTS_UP 10469
#define THRALL_CHURCH_END "Taretha must be in the inn. Let's go."
#define THRALL_MEET_TARETHA "Taretha! What foul magic is this?"
#define THRALL_EPOCH_WONDER "Who or what was that?"
#define SOUND_EPOCH_WONDER 10470
#define THRALL_EPOCH_KILL_TARETHA "No!"
#define SOUND_EPOCH_KILL_TARETHA 10471
#define THRALL_EVENT_COMPLETE "Goodbye, Taretha. I will never forget your kindness."
#define SOUND_EVENT_COMPLETE 10472
#define THRALL_RANDOM_LOW_HP1 "Things are looking grim..."
#define SOUND_RANDOM_LOW_HP1 10458
#define THRALL_RANDOM_LOW_HP2 "I will fight to the last!"
#define SOUND_RANDOM_LOW_HP2 10459
#define THRALL_RANDOM_DIE1 "Taretha..."
#define SOUND_RANDOM_DIE1 10460
#define THRALL_RANDOM_DIE2 "A good day...to die..."
#define SOUND_RANDOM_DIE2 10461
#define THRALL_RANDOM_AGGRO1 "I have earned my freedom!"
#define SOUND_RANDOM_AGGRO1 10448
#define THRALL_RANDOM_AGGRO2 "This day is long overdue. Out of my way!"
#define SOUND_RANDOM_AGGRO2 10449
#define THRALL_RANDOM_AGGRO3 "I am a slave no longer!"
#define SOUND_RANDOM_AGGRO3 10450
#define THRALL_RANDOM_AGGRO4 "Blackmoore has much to answer for!"
#define SOUND_RANDOM_AGGRO4 10451
#define THRALL_RANDOM_KILL1 "You have forced my hand!"
#define SOUND_RANDOM_KILL1 10452
#define THRALL_RANDOM_KILL2 "It should not have come to this!"
#define SOUND_RANDOM_KILL2 10453
#define THRALL_RANDOM_KILL3 "I did not ask for this!"
#define SOUND_RANDOM_KILL3 10454
#define THRALL_LEAVE_COMBAT1 "I am truly in your debt, strangers."
#define SOUND_LEAVE_COMBAT1 10455
#define THRALL_LEAVE_COMBAT2 "Thank you, strangers. You have given me hope."
#define SOUND_LEAVE_COMBAT2 10456
#define THRALL_LEAVE_COMBAT3 "I will not waste this chance. I will seek out my destiny."
#define SOUND_LEAVE_COMBAT3 10457
struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
npc_thrall_old_hillsbradAI(Creature *c) : npc_escortAI(c)
@@ -226,24 +214,27 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
Reset();
}
ScriptedInstance *pInstance;
Creature* sum;
ScriptedInstance *pInstance;
uint64 TarethaGUID;
bool LowHp;
bool HadMount;
void WaypointReached(uint32 i)
{
switch( i )
if (!pInstance)
return;
switch( i )
{
case 8:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
sum = m_creature->SummonCreature(18764,2181.87,112.46,89.45,0.26,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(18764,2181.87,112.46,89.45,0.26,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
break;
case 9:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
DoSay(THRALL_SAY_ARMOR, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_TH_ARMORY, m_creature);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, THRALL_WEAPON_MODEL);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781);
@@ -258,41 +249,27 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 15:
sum = m_creature->SummonCreature(MOB_ENTRY_RIFLE,2200.28,137.37,87.93,5.07,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_WARDEN,2197.44,131.83,87.93,0.78,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_VETERAN,2203.62,135.40,87.93,3.70,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_VETERAN,2200.75,130.13,87.93,1.48,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(MOB_ENTRY_RIFLE,2200.28,137.37,87.93,5.07,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_WARDEN,2197.44,131.83,87.93,0.78,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_VETERAN,2203.62,135.40,87.93,3.70,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_VETERAN,2200.75,130.13,87.93,1.48,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
break;
case 21:
sum = m_creature->SummonCreature(MOB_ENTRY_RIFLE,2135.80,154.01,67.45,4.98,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_WARDEN,2144.36,151.87,67.74,4.46,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_VETERAN,2142.12,154.41,67.12,4.56,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_VETERAN,2138.08,155.38,67.24,4.60,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(MOB_ENTRY_RIFLE,2135.80,154.01,67.45,4.98,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_WARDEN,2144.36,151.87,67.74,4.46,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_VETERAN,2142.12,154.41,67.12,4.56,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_VETERAN,2138.08,155.38,67.24,4.60,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
break;
case 25:
sum = m_creature->SummonCreature(MOB_ENTRY_RIFLE,2102.98,192.17,65.24,6.02,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_WARDEN,2108.48,198.75,65.18,5.15,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_VETERAN,2106.11,197.29,65.18,5.63,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_VETERAN,2104.18,194.82,65.18,5.75,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(MOB_ENTRY_RIFLE,2102.98,192.17,65.24,6.02,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_WARDEN,2108.48,198.75,65.18,5.15,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_VETERAN,2106.11,197.29,65.18,5.63,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_VETERAN,2104.18,194.82,65.18,5.75,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
break;
case 29:
DoSay(THRALL_SKARLOC_MEET, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_SKARLOC_MEET);
sum = m_creature->SummonCreature(17862,2036.48,271.22,63.43,5.27,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
//temporary,skarloc should rather be triggered to walk up to thrall
if( sum ) sum->AI()->AttackStart(m_creature);
DoScriptText(SAY_TH_SKARLOC_MEET, m_creature);
m_creature->SummonCreature(17862,2036.48,271.22,63.43,5.27,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
//temporary,skarloc should rather be triggered to walk up to thrall
break;
case 30:
IsOnHold = true;
@@ -300,19 +277,15 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 31:
DoSay(THRALL_MOUNTS_UP, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_MOUNTS_UP);
DoScriptText(SAY_TH_MOUNTS_UP, m_creature);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
DoMount();
break;
case 37:
//possibly regular patrollers? If so, remove this and let database handle them
sum = m_creature->SummonCreature(MOB_ENTRY_WATCHMAN,2124.26,522.16,56.87,3.99,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_WATCHMAN,2121.69,525.37,57.11,4.01,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_SENTRY,2124.65,524.55,56.63,3.98,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(MOB_ENTRY_WATCHMAN,2124.26,522.16,56.87,3.99,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_WATCHMAN,2121.69,525.37,57.11,4.01,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_SENTRY,2124.65,524.55,56.63,3.98,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
break;
case 59:
m_creature->SummonCreature(SKARLOC_MOUNT,2488.64,625.77,58.26,4.71,TEMPSUMMON_TIMED_DESPAWN,10000);
@@ -324,8 +297,7 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
//make horsie run off
IsOnHold = true;
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
if( pInstance )
pInstance->SetData(TYPE_THRALL_PART2, DONE);
pInstance->SetData(TYPE_THRALL_PART2, DONE);
break;
case 64:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
@@ -343,83 +315,81 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 83:
sum = m_creature->SummonCreature(MOB_ENTRY_CHURCH_PROTECTOR,2627.33,646.82,56.03,4.28,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_CHURCH_LOOKOUT,2624.14,648.03,56.03,4.50,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_CHURCH_GUARDSMAN,2625.32,649.60,56.03,4.38,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_CHURCH_GUARDSMAN,2627.22,649.00,56.03,4.34,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(MOB_ENTRY_CHURCH_PROTECTOR,2627.33,646.82,56.03,4.28,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
m_creature->SummonCreature(MOB_ENTRY_CHURCH_LOOKOUT,2624.14,648.03,56.03,4.50,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
m_creature->SummonCreature(MOB_ENTRY_CHURCH_GUARDSMAN,2625.32,649.60,56.03,4.38,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
m_creature->SummonCreature(MOB_ENTRY_CHURCH_GUARDSMAN,2627.22,649.00,56.03,4.34,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,5000);
break;
case 84:
DoSay(THRALL_CHURCH_END, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_TH_CHURCH_END, m_creature);
break;
case 91:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 93:
sum = m_creature->SummonCreature(MOB_ENTRY_INN_PROTECTOR,2652.71,660.31,61.93,1.67,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_INN_LOOKOUT,2648.96,662.59,61.93,0.79,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_INN_GUARDSMAN,2657.36,662.34,61.93,2.68,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
sum = m_creature->SummonCreature(MOB_ENTRY_INN_GUARDSMAN,2656.39,659.77,61.93,2.61,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
if( sum ) sum->AI()->AttackStart(m_creature);
m_creature->SummonCreature(MOB_ENTRY_INN_PROTECTOR,2652.71,660.31,61.93,1.67,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_INN_LOOKOUT,2648.96,662.59,61.93,0.79,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_INN_GUARDSMAN,2657.36,662.34,61.93,2.68,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_INN_GUARDSMAN,2656.39,659.77,61.93,2.61,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
break;
case 94:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
//trigger taretha Say("Thrall, you escaped!")
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Unit* Taretha = Unit::GetUnit((*m_creature), TarethaGUID))
DoScriptText(SAY_TA_ESCAPED, Taretha, m_creature);
}
break;
case 95:
DoSay(THRALL_MEET_TARETHA, LANG_UNIVERSAL, NULL);
if( pInstance )
pInstance->SetData(TYPE_THRALL_PART3,DONE);
DoScriptText(SAY_TH_MEET_TARETHA, m_creature);
pInstance->SetData(TYPE_THRALL_PART3,DONE);
IsOnHold = true;
break;
case 96:
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
DoYell(THRALL_EPOCH_WONDER, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_EPOCH_WONDER);
DoScriptText(SAY_TH_EPOCH_WONDER, m_creature);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
break;
case 97:
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
DoYell(THRALL_EPOCH_KILL_TARETHA, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_EPOCH_KILL_TARETHA);
DoScriptText(SAY_TH_EPOCH_KILL_TARETHA, m_creature);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 98:
//trigger epoch Yell("Thrall! Come outside and face your fate! ....")
//from here, thrall should not never be allowed to move to point 106 which he currently does.
break;
case 106:
{
//trigger taretha to run down outside
/*if( pInstance )
uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA);
if( TarethaGUID )
{
Creature* Taretha = ((Creature*)Unit::GetUnit((*m_creature), TarethaGUID));
if( Taretha )
((npc_escortAI*)(Taretha->AI()))->Start(false, false, true, 0);
}*/
if (!PlayerGUID)
break;
if( PlayerGUID )
{
Unit* player = ((Creature*)Unit::GetUnit((*m_creature), PlayerGUID));
if( player && player->GetTypeId() == TYPEID_PLAYER )
((Player*)player)->KilledMonster(20156,m_creature->GetGUID());
}
//trigger taretha to run down outside
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Creature* Taretha = ((Creature*)Unit::GetUnit(*m_creature, TarethaGUID)))
((npc_escortAI*)(Taretha->AI()))->Start(false, false, true, PlayerGUID);
}
//alot will happen here, thrall and taretha talk, erozion appear at spot to explain
m_creature->SummonCreature(EROZION_ENTRY,2646.47,680.416,55.38,4.16,TEMPSUMMON_TIMED_DESPAWN,120000);
}
break;
}
}
//kill credit creature for quest
Map *map = m_creature->GetMap();
Map::PlayerList const& players = map->GetPlayers();
if (!players.isEmpty() && map->IsDungeon())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* pPlayer = itr->getSource())
pPlayer->KilledMonster(20156,m_creature->GetGUID());
}
}
//alot will happen here, thrall and taretha talk, erozion appear at spot to explain
m_creature->SummonCreature(EROZION_ENTRY,2646.47,680.416,55.38,4.16,TEMPSUMMON_TIMED_DESPAWN,120000);
break;
}
}
void Reset()
{
sum = NULL;
LowHp = false;
if( HadMount )
@@ -441,18 +411,9 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
switch(rand()%3)
{
case 0:
DoYell(THRALL_LEAVE_COMBAT1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_LEAVE_COMBAT1);
break;
case 1:
DoYell(THRALL_LEAVE_COMBAT2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_LEAVE_COMBAT2);
break;
case 2:
DoYell(THRALL_LEAVE_COMBAT3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_LEAVE_COMBAT3);
break;
case 0: DoScriptText(SAY_TH_LEAVE_COMBAT1, m_creature); break;
case 1: DoScriptText(SAY_TH_LEAVE_COMBAT2, m_creature); break;
case 2: DoScriptText(SAY_TH_LEAVE_COMBAT3, m_creature); break;
}
}
}
@@ -476,22 +437,10 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
switch(rand()%4)
{
case 0:
DoYell(THRALL_RANDOM_AGGRO1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_AGGRO1);
break;
case 1:
DoYell(THRALL_RANDOM_AGGRO2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_AGGRO2);
break;
case 2:
DoYell(THRALL_RANDOM_AGGRO3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_AGGRO3);
break;
case 3:
DoYell(THRALL_RANDOM_AGGRO4,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_AGGRO4);
break;
case 0: DoScriptText(SAY_TH_RANDOM_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_TH_RANDOM_AGGRO3, m_creature); break;
case 3: DoScriptText(SAY_TH_RANDOM_AGGRO4, m_creature); break;
}
if( m_creature->IsMounted() )
{
@@ -499,39 +448,43 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
HadMount = true;
}
}
void JustSummoned(Creature* summoned)
{
switch(summoned->GetEntry())
{
//TODO: make Scarloc start into event instead, and not start attack directly
case MOB_ENTRY_BARN_GUARDSMAN:
case MOB_ENTRY_BARN_PROTECTOR:
case MOB_ENTRY_BARN_LOOKOUT:
case SKARLOC_MOUNT:
case EROZION_ENTRY:
break;
default:
summoned->AI()->AttackStart(m_creature);
break;
}
}
void KilledUnit(Unit *victim)
{
switch(rand()%3)
{
case 0:
DoYell(THRALL_RANDOM_KILL1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_KILL1);
break;
case 1:
DoYell(THRALL_RANDOM_KILL2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_KILL2);
break;
case 2:
DoYell(THRALL_RANDOM_KILL3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_KILL3);
break;
case 0: DoScriptText(SAY_TH_RANDOM_KILL1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_KILL2, m_creature); break;
case 2: DoScriptText(SAY_TH_RANDOM_KILL3, m_creature); break;
}
}
void JustDied(Unit *slayer)
{
if(slayer == m_creature) // Don't do a yell if he kills self (if player goes too far or at the end).
// Don't do a yell if he kills self (if player goes too far or at the end).
if(slayer == m_creature)
return;
switch(rand()%2)
{
case 0:
DoYell(THRALL_RANDOM_DIE1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_DIE1);
break;
case 1:
DoYell(THRALL_RANDOM_DIE2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_DIE2);
break;
case 0: DoScriptText(SAY_TH_RANDOM_DIE1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_DIE2, m_creature); break;
}
if( pInstance )
pInstance->SetData(TYPE_THRALL_EVENT,FAIL);
@@ -540,26 +493,19 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
npc_escortAI::UpdateAI(diff);
if( InCombat && m_creature->getVictim() )
{
//add his abilities'n-crap here
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//TODO: add his abilities'n-crap here
if( !LowHp && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 20) )
{
switch(rand()%2)
{
case 0:
DoYell(THRALL_RANDOM_LOW_HP1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_LOW_HP1);
break;
case 1:
DoYell(THRALL_RANDOM_LOW_HP2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RANDOM_LOW_HP2);
break;
case 0: DoScriptText(SAY_TH_RANDOM_LOW_HP1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_LOW_HP2, m_creature); break;
}
LowHp = true;
}
}
}
};
@@ -727,17 +673,18 @@ bool GossipHello_npc_thrall_old_hillsbrad(Player *player, Creature *_Creature)
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
if( pInstance )
{
//if( pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE && pInstance->GetData(TYPE_THRALL_EVENT) == NOT_STARTED )
if( pInstance->GetData(TYPE_THRALL_EVENT) == NOT_STARTED )
if( pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE && pInstance->GetData(TYPE_THRALL_EVENT) == NOT_STARTED )
{
player->ADD_GOSSIP_ITEM( 0, "[PH] Start walking.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(GOSSIP_ID_START, _Creature->GetGUID());
}
if( pInstance->GetData(TYPE_THRALL_PART1) == DONE && !pInstance->GetData(TYPE_THRALL_PART2) )
{
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
player->SEND_GOSSIP_MENU(GOSSIP_ID_SKARLOC1, _Creature->GetGUID());
}
if( pInstance->GetData(TYPE_THRALL_PART2) == DONE && !pInstance->GetData(TYPE_THRALL_PART3) )
{
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
@@ -757,8 +704,7 @@ bool GossipSelect_npc_thrall_old_hillsbrad(Player *player, Creature *_Creature,
pInstance->SetData(TYPE_THRALL_EVENT,IN_PROGRESS);
pInstance->SetData(TYPE_THRALL_PART1,IN_PROGRESS);
_Creature->Say(THRALL_START_EVENT_PART1, LANG_UNIVERSAL, 0);
((npc_thrall_old_hillsbradAI*)_Creature->AI())->DoPlaySoundToSet(_Creature,SOUND_START_EVENT);
DoScriptText(SAY_TH_START_EVENT_PART1, _Creature);
((npc_escortAI*)(_Creature->AI()))->Start(true, true, true, player->GetGUID());
break;
@@ -773,8 +719,7 @@ bool GossipSelect_npc_thrall_old_hillsbrad(Player *player, Creature *_Creature,
_Creature->SummonCreature(SKARLOC_MOUNT,2038.81,270.26,63.20,5.41,TEMPSUMMON_TIMED_DESPAWN,12000);
pInstance->SetData(TYPE_THRALL_PART2,IN_PROGRESS);
_Creature->Say(THRALL_START_EVENT_PART2, LANG_UNIVERSAL, 0);
((npc_thrall_old_hillsbradAI*)_Creature->AI())->DoPlaySoundToSet(_Creature,SOUND_START_EVENT_PART2);
DoScriptText(SAY_TH_START_EVENT_PART2, _Creature);
((npc_thrall_old_hillsbradAI*)_Creature->AI())->StartWP();
break;
@@ -797,8 +742,6 @@ bool GossipSelect_npc_thrall_old_hillsbrad(Player *player, Creature *_Creature,
#define GOSSIP_ID_EPOCH2 9613 //Yes, friends. This man was no wizard of
#define GOSSIP_ITEM_EPOCH2 "We'll get you out. Taretha. Don't worry. I doubt the wizard would wander too far away."
#define TARETHA_FREE "I'm free! Thank you all!"
struct TRINITY_DLL_DECL npc_tarethaAI : public npc_escortAI
{
npc_tarethaAI(Creature *c) : npc_escortAI(c)
@@ -814,7 +757,7 @@ struct TRINITY_DLL_DECL npc_tarethaAI : public npc_escortAI
switch( i )
{
case 6:
m_creature->Say(TARETHA_FREE, LANG_UNIVERSAL, 0);
DoScriptText(SAY_TA_FREE, m_creature);
break;
case 7:
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
@@ -824,6 +767,10 @@ struct TRINITY_DLL_DECL npc_tarethaAI : public npc_escortAI
void Reset() {}
void Aggro(Unit* who) {}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
CreatureAI* GetAI_npc_taretha(Creature *_Creature)
{
@@ -867,18 +814,17 @@ bool GossipSelect_npc_taretha(Player *player, Creature *_Creature, uint32 sender
if( pInstance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS )
{
pInstance->SetData(TYPE_THRALL_PART4,IN_PROGRESS);
_Creature->SummonCreature(18096,2639.13,698.55,65.43,4.59,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000);
_Creature->SummonCreature(ENTRY_EPOCH,2639.13,698.55,65.43,4.59,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000);
uint64 ThrallGUID = pInstance->GetData64(DATA_THRALL);
if(ThrallGUID)
{
Creature* Thrall = ((Creature*)Unit::GetUnit((*_Creature), ThrallGUID));
if(Thrall)
((npc_thrall_old_hillsbradAI*)Thrall->AI())->StartWP();
}
}
}
return true;
if (uint64 ThrallGUID = pInstance->GetData64(DATA_THRALL))
{
Creature* Thrall = ((Creature*)Unit::GetUnit((*_Creature), ThrallGUID));
if(Thrall)
((npc_thrall_old_hillsbradAI*)Thrall->AI())->StartWP();
}
}
}
return true;
}
/*######
@@ -912,5 +858,6 @@ void AddSC_old_hillsbrad()
newscript->Name="npc_taretha";
newscript->pGossipHello = &GossipHello_npc_taretha;
newscript->pGossipSelect = &GossipSelect_npc_taretha;
newscript->GetAI = &GetAI_npc_taretha;
newscript->RegisterSelf();
}
@@ -16,7 +16,7 @@
/* ScriptData
SDName: boss_the_lurker_below
SD%Complete: 10
SD%Complete: 80
SDComment:
SDCategory: The Lurker Below
EndScriptData */
@@ -27,7 +27,8 @@ EndScriptData */
#include "Spell.h"
#define SPELL_SPOUT 37433
#define SPELL_SPOUT_2 42835
#define SPELL_SPOUT_ANIM 42835
#define SPELL_SPOUT_BREATH 37431
#define SPELL_KNOCKBACK 19813
#define SPELL_GEYSER 37478
#define SPELL_WHIRL 37660
@@ -37,6 +38,8 @@ EndScriptData */
#define EMOTE_SPOUT "takes a deep breath."
#define SPOUT_DIST 100
#define MOB_COILFANG_GUARDIAN 21873
#define MOB_COILFANG_AMBUSHER 21865
@@ -48,30 +51,297 @@ EndScriptData */
#define SPELL_ARCINGSMASH 38761 // Wrong SpellId. Can't find the right one.
#define SPELL_HAMSTRING 26211
struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public ScriptedAI
float AddPos[9][3] =
{
boss_the_lurker_belowAI(Creature *c) : ScriptedAI(c) {Reset();}
void Reset()
{
}
void MoveInLineOfSight(Unit *who)
{
}
void Aggro(Unit *who)
{
}
void UpdateAI(const uint32 diff)
{
}
{2.8553810, -459.823914, -19.182686}, //MOVE_AMBUSHER_1 X, Y, Z
{12.400000, -466.042267, -19.182686}, //MOVE_AMBUSHER_2 X, Y, Z
{51.366653, -460.836060, -19.182686}, //MOVE_AMBUSHER_3 X, Y, Z
{62.597980, -457.433044, -19.182686}, //MOVE_AMBUSHER_4 X, Y, Z
{77.607452, -384.302765, -19.182686}, //MOVE_AMBUSHER_5 X, Y, Z
{63.897900, -378.984924, -19.182686}, //MOVE_AMBUSHER_6 X, Y, Z
{34.447250, -387.333618, -19.182686}, //MOVE_GUARDIAN_1 X, Y, Z
{14.388216, -423.468018, -19.625271}, //MOVE_GUARDIAN_2 X, Y, Z
{42.471519, -445.115295, -19.769423} //MOVE_GUARDIAN_3 X, Y, Z
};
enum RotationType
{
NOROTATE = 0,
CLOCKWISE = 1,
COUNTERCLOCKWISE = 2,
};
struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
{
boss_the_lurker_belowAI(Creature *c) : Scripted_NoMovementAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SPOUT_ANIM);
if(TempSpell)
{
TempSpell->Effect[0] = 0;//remove all spell effect, only anim is needed
TempSpell->Effect[1] = 0;
TempSpell->Effect[2] = 0;
}
}
ScriptedInstance* pInstance;
bool Spawned;
uint32 RotTimer;
uint8 RotType;
double SpoutAngle;
uint32 SpoutAnimTimer;
bool Submerged;
uint32 WaterboltTimer;
uint32 SpoutTimer;
uint32 WhirlTimer;//after avery spout
uint32 PhaseTimer;
uint32 GeyserTimer;
void Reset()
{
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING + MOVEMENTFLAG_LEVITATING);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetCorpseDelay(1000*60*60);
SpoutAngle = 0;
RotType = NOROTATE;
SpoutAnimTimer = 1000;
RotTimer = 20000;
Submerged = false;
Spawned = false;
WaterboltTimer = 3000;
SpoutTimer = 15000;
WhirlTimer = 18000;//after avery spout
PhaseTimer = 120000;
GeyserTimer = rand()%5000 + 15000;
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, NOT_STARTED);
}
void MoveInLineOfSight(Unit *who)
{
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
AttackStart(who);
}
}
void Aggro(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS);
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
AttackStart(who);
}
}
void JustDied(Unit* Killer)
{
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, DONE);
}
void Rotate(const uint32 diff)
{
bool Spout = false;
switch (RotType)
{
case NOROTATE:
return;
case CLOCKWISE://20secs for 360turn
//no target if rotating!
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
SpoutAngle += (double)diff/20000*(double)M_PI*2;
if (SpoutAngle >= M_PI*2)SpoutAngle = 0;
m_creature->SetOrientation(SpoutAngle);
m_creature->StopMoving();
Spout = true;
break;
case COUNTERCLOCKWISE://20secs for 360turn
//no target if rotating!
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
SpoutAngle -= (double)diff/20000*(double)M_PI*2;
if (SpoutAngle <= 0)SpoutAngle = M_PI*2;
m_creature->SetOrientation(SpoutAngle);
m_creature->StopMoving();
Spout = true;
break;
}
if(!Spout)
return;
if(RotTimer<diff)//end rotate
{
RotType = NOROTATE;//set norotate state
RotTimer=20000;
m_creature->InterruptNonMeleeSpells(false);
WhirlTimer = 4000; //whirl directly after spout ends
return;
}else RotTimer-=diff;
if(SpoutAnimTimer<diff)
{
DoCast(m_creature,SPELL_SPOUT_ANIM,true);
SpoutAnimTimer = 1000;
}else SpoutAnimTimer-=diff;
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
{
Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
if(target && target->GetTypeId() == TYPEID_PLAYER && m_creature->HasInArc((double)diff/20000*(double)M_PI*2,target) && m_creature->GetDistance(target) <= SPOUT_DIST && !target->IsInWater())
DoCast(target,SPELL_SPOUT,true);//only knock back palyers in arc, in 100yards, not in water
}
}
void StartRotate(Unit* victim)
{
switch (rand()%2)
{
case 0:
RotType = CLOCKWISE;
break;
case 1:
RotType = COUNTERCLOCKWISE;
break;
}
RotTimer=20000;
if(victim)
SpoutAngle = m_creature->GetAngle(victim);
m_creature->MonsterTextEmote(EMOTE_SPOUT,0,true);
//DoCast(m_creature,SPELL_SPOUT_BREATH);//take breath anim
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!m_creature->SelectHostilTarget() /*|| !m_creature->getVictim()*/ )//rotate resets target
return;
Rotate(diff);//always check rotate things
if(!Submerged)
{
if(PhaseTimer < diff)
{
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature,SPELL_SUBMERGE);
PhaseTimer = 60000;//60secs submerged
Submerged = true;
}else PhaseTimer-=diff;
}
if(!Submerged && RotType == NOROTATE)//is not spouting and not submerged
{
if(SpoutTimer < diff)
{
if(m_creature->getVictim() && RotType == NOROTATE)
StartRotate(m_creature->getVictim());//start spout and random rotate
SpoutTimer= 35000;
return;
}else SpoutTimer -= diff;
//Whirl directly after a Spout and at random times
if(WhirlTimer < diff)
{
WhirlTimer = rand()%5000 + 15000;
DoCast(m_creature,SPELL_WHIRL);
WaterboltTimer += 5000;//add 5secs to waterbolt timer, to add some time to run back to boss
}else WhirlTimer -= diff;
if(GeyserTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(target)
DoCast(target,SPELL_GEYSER,true);
else
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
DoCast(target,SPELL_GEYSER,true);
GeyserTimer = rand()%5000 + 15000;
}else GeyserTimer -= diff;
if(WaterboltTimer < diff)
{
Unit* target = SelectUnit(SELECT_TARGET_NEAREST,0,14,true);
if(!target)
{
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
DoCast(target,SPELL_WATERBOLT);
}
WaterboltTimer = 3000;
}else WaterboltTimer -= diff;
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )
return;
DoMeleeAttackIfReady();
}else if(!Submerged)
return;
else if(Submerged)//phase 2, submerged
{
if(PhaseTimer < diff)
{
Submerged = false;
m_creature->InterruptNonMeleeSpells(false);//shouldn't be any
m_creature->RemoveAllAuras();
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
m_creature->RemoveFlag(UNIT_FIELD_BYTES_1,9);
DoCast(m_creature,SPELL_EMERGE);
Spawned = false;
SpoutTimer = 4000; // directly cast Spout after emerging!
WhirlTimer = 26000;
PhaseTimer = 120000;
return;
}else PhaseTimer-=diff;
if(!m_creature->isInCombat())
m_creature->SetInCombatState(false);
if(!Spawned)
{
m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//spawn adds
m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[0][0],AddPos[0][1],AddPos[0][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[1][0],AddPos[1][1],AddPos[1][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[2][0],AddPos[2][1],AddPos[2][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[3][0],AddPos[3][1],AddPos[3][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[4][0],AddPos[4][1],AddPos[4][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[5][0],AddPos[5][1],AddPos[5][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_GUARDIAN,AddPos[6][0],AddPos[6][1],AddPos[6][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_GUARDIAN,AddPos[7][0],AddPos[7][1],AddPos[7][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
m_creature->SummonCreature(MOB_COILFANG_GUARDIAN,AddPos[8][0],AddPos[8][1],AddPos[8][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
Spawned = true;
}
}
}
};
CreatureAI* GetAI_mob_coilfang_guardian(Creature *_Creature)
{
@@ -63,7 +63,7 @@ struct TRINITY_DLL_DECL boss_thespiaAI : public ScriptedAI
LungBurst_Timer = 7000;
EnvelopingWinds_Timer = 9000;
if (pInstance)
if (pInstance && m_creature->isAlive())
pInstance->SetData(TYPE_HYDROMANCER_THESPIA, NOT_STARTED);
}
@@ -75,7 +75,7 @@ struct TRINITY_DLL_DECL boss_mekgineer_steamriggerAI : public ScriptedAI
Summon50 = false;
Summon25 = false;
if (pInstance)
if (pInstance && m_creature->isAlive())
pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER, NOT_STARTED);
}
@@ -1,4 +1,4 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
tet/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -16,8 +16,8 @@
/* ScriptData
SDName: Instance_Steam_Vault
SD%Complete: 60
SDComment: Workaround for opening of Main Chamber door. Trinity does not support scripting of Gameobject as this instance require.
SD%Complete: 80
SDComment: Instance script and access panel GO
SDCategory: Coilfang Resevoir, The Steamvault
EndScriptData */
@@ -26,7 +26,7 @@ EndScriptData */
#define ENCOUNTERS 4
#define MAIN_CHAMBERS_DOOR 183049 //door opened when hydromancer and mekgineer are died
#define MAIN_CHAMBERS_DOOR 183049
#define ACCESS_PANEL_HYDRO 184125
#define ACCESS_PANEL_MEK 184126
@@ -36,50 +36,82 @@ EndScriptData */
3 - Warlord Kalithresh Event
*/
bool GOHello_go_main_chambers_access_panel(Player *player, GameObject* _GO)
{
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
if (!pInstance)
return false;
if (_GO->GetEntry() == ACCESS_PANEL_HYDRO && pInstance->GetData(TYPE_HYDROMANCER_THESPIA) == DONE)
pInstance->SetData(TYPE_HYDROMANCER_THESPIA,SPECIAL);
if (_GO->GetEntry() == ACCESS_PANEL_MEK && pInstance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE)
pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER,SPECIAL);
return true;
}
struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
{
instance_steam_vault(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_steam_vault(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
uint64 ThespiaGUID;
uint64 MekgineerGUID;
uint64 KalithreshGUID;
uint32 Encounter[ENCOUNTERS];
bool IsHydromancerDead, IsMekgineerDead;
GameObject *MainChambersDoor;
GameObject *AccessPanelHydro;
GameObject *AccessPanelMek;
uint64 MainChambersDoor;
uint64 AccessPanelHydro;
uint64 AccessPanelMek;
void Initialize()
{
ThespiaGUID = 0;
MekgineerGUID = 0;
KalithreshGUID = 0;
IsHydromancerDead = false;
IsMekgineerDead = false;
MainChambersDoor = NULL;
AccessPanelHydro = NULL;
AccessPanelMek = NULL;
MainChambersDoor = 0;
AccessPanelHydro = 0;
AccessPanelMek = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = false;
Encounter[i] = NOT_STARTED;
}
bool IsEncounterInProgress() const
{
for(uint8 i = 0; i < ENCOUNTERS; i++)
if( Encounter[i] ) return true;
if (Encounter[i] == IN_PROGRESS)
return true;
return false;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Steamvault: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature_entry)
switch(creature->GetEntry())
{
case 17797: ThespiaGUID = creature->GetGUID(); break;
case 17796: MekgineerGUID = creature->GetGUID(); break;
case 17798: KalithreshGUID = creature->GetGUID(); break;
case 17797: ThespiaGUID = creature->GetGUID(); break;
case 17796: MekgineerGUID = creature->GetGUID(); break;
case 17798: KalithreshGUID = creature->GetGUID(); break;
}
}
@@ -87,31 +119,51 @@ struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
{
switch(go->GetEntry())
{
case MAIN_CHAMBERS_DOOR: MainChambersDoor = go; break;
case ACCESS_PANEL_HYDRO: AccessPanelHydro = go; break;
case ACCESS_PANEL_MEK: AccessPanelMek = go; break;
case MAIN_CHAMBERS_DOOR: MainChambersDoor = go->GetGUID(); break;
case ACCESS_PANEL_HYDRO: AccessPanelHydro = go->GetGUID(); break;
case ACCESS_PANEL_MEK: AccessPanelMek = go->GetGUID(); break;
}
}
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
if (!player)
{
debug_log("SD2: Instance Steamvault: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
switch(type)
{
case TYPE_HYDROMANCER_THESPIA:
if(data == DONE)
{
IsHydromancerDead = true;
if( IsMekgineerDead && MainChambersDoor )
MainChambersDoor->SetGoState(0);
}
Encounter[0] = data;
break;
if (data == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,AccessPanelHydro))
_go->SetGoState(0);
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,MainChambersDoor))
_go->SetGoState(0);
}
debug_log("SD2: Instance Steamvault: Access panel used.");
}
Encounter[0] = data;
break;
case TYPE_MEKGINEER_STEAMRIGGER:
if(data == DONE)
{
IsMekgineerDead = true;
if( IsHydromancerDead && MainChambersDoor )
MainChambersDoor->SetGoState(0);
if (data == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,AccessPanelMek))
_go->SetGoState(0);
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,MainChambersDoor))
_go->SetGoState(0);
}
debug_log("SD2: Instance Steamvault: Access panel used.");
}
Encounter[1] = data;
break;
@@ -163,6 +215,12 @@ InstanceData* GetInstanceData_instance_steam_vault(Map* map)
void AddSC_instance_steam_vault()
{
Script *newscript;
newscript = new Script;
newscript->Name = "go_main_chambers_access_panel";
newscript->pGOHello = &GOHello_go_main_chambers_access_panel;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "instance_steam_vault";
newscript->GetInstanceData = GetInstanceData_instance_steam_vault;
@@ -24,24 +24,38 @@ EndScriptData */
#include "precompiled.h"
#include "def_gruuls_lair.h"
/* Yells & Quotes */
#define SAY_AGGRO -1565010
#define SAY_SLAM1 -1565011
#define SAY_SLAM2 -1565012
#define SAY_SHATTER1 -1565013
#define SAY_SHATTER2 -1565014
#define SAY_SLAY1 -1565015
#define SAY_SLAY2 -1565016
#define SAY_SLAY3 -1565017
#define SAY_DEATH -1565018
#define EMOTE_GROW -1565019
/* Spells */
#define SPELL_GROWTH 36300
#define SPELL_CAVE_IN 36240
#define SPELL_GROUND_SLAM 33525 // AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback)
#define SPELL_SHATTER_EFFECT 33671
#define SPELL_HURTFUL_STRIKE 33813
#define SPELL_REVERBERATION 36297 //AoE Silence
#define SPELL_GRONN_LORDS_GRASP 33572 //Already handled in GroundSlam
#define SPELL_STONED 33652 //-- Spell is self cast
#define SPELL_SHATTER 33654
#define SPELL_MAGNETIC_PULL 28337
#define SPELL_KNOCK_BACK 24199 //Knockback spell until correct implementation is made
#define EMOTE_GROW "grows in size!"
#define SAY_AGGRO "Come.... and die."
#define SPELL_SHATTER_EFFECT 33671
#define SPELL_HURTFUL_STRIKE 33813
#define SPELL_STONED 33652 //Spell is self cast
#define SPELL_GRONN_LORDS_GRASP 33572 //Triggered by Ground Slam
struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
{
boss_gruulAI(Creature *c) : ScriptedAI(c) { Reset(); }
boss_gruulAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
@@ -55,8 +69,6 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
void Reset()
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Growth_Timer= 30000;
CaveIn_Timer= 40000;
GroundSlamTimer= 35000;
@@ -65,36 +77,36 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
HurtfulStrike_Timer= 8000;
Reverberation_Timer= 60000+45000;
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, NOT_STARTED);
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, NOT_STARTED);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
void JustDied(Unit* Killer)
{
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, DONE);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
DoScriptText(SAY_DEATH, m_creature);
}
}
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, DONE);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoZoneInCombat();
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
if(pInstance)
{
@@ -107,6 +119,16 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
}
}
void KilledUnit()
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
@@ -118,7 +140,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
if (Growth_Timer < diff)
{
DoCast(m_creature,SPELL_GROWTH);
DoTextEmote(EMOTE_GROW,NULL);
DoScriptText(EMOTE_GROW, m_creature);
Growth_Timer = 30000;
}else Growth_Timer -= diff;
@@ -161,7 +183,8 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
}
GroundSlamTimer = 7000;
} break;
break;
}
case 1:
{
@@ -181,7 +204,8 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
GroundSlamTimer = 5000;
} break;
break;
}
case 2:
{
@@ -190,7 +214,8 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
GroundSlamTimer = 1000;
} break;
break;
}
case 3:
{
@@ -227,7 +252,8 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
if(Reverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter
Reverberation_Timer += 10000;
} break;
break;
}
}
GroundSlamStage++;
@@ -254,18 +280,14 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
// Reverberation
if (Reverberation_Timer < diff)
{
m_creature->CastSpell(m_creature->getVictim(), SPELL_REVERBERATION, true);
Reverberation_Timer = 30000;
DoCast(m_creature->getVictim(), SPELL_REVERBERATION, true);
Reverberation_Timer = 30000;
}else Reverberation_Timer -= diff;
// Cave In
if (CaveIn_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_CAVE_IN);
CaveIn_Timer = 20000;
@@ -24,29 +24,16 @@ EndScriptData */
#include "precompiled.h"
#include "def_gruuls_lair.h"
//Sounds
#define SOUND_AGGRO 11367
#define SOUND_ENRAGE 11368
#define SOUND_OGRE_DEATH1 11369
#define SOUND_OGRE_DEATH2 11370
#define SOUND_OGRE_DEATH3 11371
#define SOUND_OGRE_DEATH4 11372
#define SOUND_SLAY1 11373
#define SOUND_SLAY2 11374
#define SOUND_SLAY3 11375
#define SOUND_DEATH 11376
//Yells
#define SAY_AGGRO "Gronn are the real power in Outland!"
#define SAY_ENRAGE "You will not defeat the Hand of Gruul!"
#define SAY_OGRE_DEATH1 "You not kill next one so easy!"
#define SAY_OGRE_DEATH2 "Does not mean anything!"
#define SAY_OGRE_DEATH3 "I'm not afraid of you!"
#define SAY_OGRE_DEATH4 "Good, now you fight me!"
#define SAY_SLAY1 "You not so tough after all!"
#define SAY_SLAY2 "Ahahahaha!"
#define SAY_SLAY3 "Maulgar is king!"
#define SAY_DEATH "Gruul will... crush you!"
#define SAY_AGGRO -1565000
#define SAY_ENRAGE -1565001
#define SAY_OGRE_DEATH1 -1565002
#define SAY_OGRE_DEATH2 -1565003
#define SAY_OGRE_DEATH3 -1565004
#define SAY_OGRE_DEATH4 -1565005
#define SAY_SLAY1 -1565006
#define SAY_SLAY2 -1565007
#define SAY_SLAY3 -1565008
#define SAY_DEATH -1565009
// High King Maulgar
#define SPELL_ARCING_SMASH 39144
@@ -55,6 +42,7 @@ EndScriptData */
#define SPELL_BERSERKER_C 26561
#define SPELL_ROAR 16508
#define SPELL_FLURRY 33232
#define SPELL_DUAL_WIELD 29651 //used in phase
// Olm the Summoner
#define SPELL_DARK_DECAY 33129
@@ -106,7 +94,9 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
MightyBlow_Timer = 40000;
Whirlwind_Timer = 30000;
Charging_Timer = 0;
Roar_Timer = 0;
Roar_Timer = 0;
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, false);
Phase2 = false;
@@ -133,57 +123,35 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
{
switch(rand()%3)
{
case 0:
DoYell(SAY_SLAY1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 2:
DoYell(SAY_SLAY3, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY3);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
void JustDied(Unit* Killer)
{
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
{
pInstance->SetData(DATA_MAULGAREVENT, DONE);
{
pInstance->SetData(DATA_MAULGAREVENT, DONE);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_MAULGARDOOR));
if(Door)
Door->SetGoState(0);
}
}
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_MAULGARDOOR));
if(Door)
Door->SetGoState(0);
}
}
void AddDeath()
{
switch(rand()%4)
{
case 0:
DoYell(SAY_OGRE_DEATH1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH1);
break;
case 1:
DoYell(SAY_OGRE_DEATH2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH2);
break;
case 2:
DoYell(SAY_OGRE_DEATH3, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH3);
break;
case 3:
DoYell(SAY_OGRE_DEATH4, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH4);
break;
case 0: DoScriptText(SAY_OGRE_DEATH1, m_creature);break;
case 1: DoScriptText(SAY_OGRE_DEATH2, m_creature);break;
case 2: DoScriptText(SAY_OGRE_DEATH3, m_creature);break;
case 3: DoScriptText(SAY_OGRE_DEATH4, m_creature);break;
}
}
@@ -209,13 +177,12 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
GetCouncil();
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_AGGRO, m_creature);
pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
DoZoneInCombat();
DoZoneInCombat();
}
void UpdateAI(const uint32 diff)
@@ -267,11 +234,10 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
//Entering Phase 2
if(!Phase2 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 50)
{
Phase2 = true;
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoCast(m_creature, SPELL_FLURRY);
Phase2 = true;
DoScriptText(SAY_ENRAGE, m_creature);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
}
@@ -33,7 +33,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_gruuls_lair : public ScriptedInstance
{
instance_gruuls_lair(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_gruuls_lair(Map *map) : ScriptedInstance(map) {Initialize();};
bool Encounters[ENCOUNTERS];
@@ -30,7 +30,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_shattered_halls : public ScriptedInstance
{
instance_shattered_halls(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_shattered_halls(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
uint64 nethekurseGUID;
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Hellfire_Peninsula
SD%Complete: 100
SDComment: Quest support: 9375, 10129, 10146, 10162, 10163, 10340, 10346, 10347, 10382 (Special flight paths)
SDComment: Quest support: 9375, 10129, 10146, 10162, 10163, 10340, 10346, 10347, 10382 (Special flight paths)
SDCategory: Hellfire Peninsula
EndScriptData */
@@ -143,167 +143,163 @@ bool GossipHello_npc_wing_commander_brack(Player *player, Creature *_Creature)
bool GossipSelect_npc_wing_commander_brack(Player *player, Creature *_Creature, uint32 sender, uint32 action )
{
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33659,true); //TaxiPath 584 (Gateways Murket and Shaadraz)
}
if (action == GOSSIP_ACTION_INFO_DEF + 2)
{
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33825,true); //TaxiPath 587 (Aerial Assault Flight (Horde))
}
if (action == GOSSIP_ACTION_INFO_DEF + 3)
{
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,34578,true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
}
return true;
switch(action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33659,true); //TaxiPath 584 (Gateways Murket and Shaadraz)
break;
case GOSSIP_ACTION_INFO_DEF + 2:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33825,true); //TaxiPath 587 (Aerial Assault Flight (Horde))
break;
case GOSSIP_ACTION_INFO_DEF + 3:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,34578,true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
break;
}
return true;
}
/*######
## npc_wounded_blood_elf
######*/
#define SAY_ELF_START -1000117
#define SAY_ELF_SUMMON1 -1000118
#define SAY_ELF_RESTING -1000119
#define SAY_ELF_SUMMON2 -1000120
#define SAY_ELF_COMPLETE -1000121
#define SAY_ELF_AGGRO -1000122
#define QUEST_THE_ROAD_TO_FALCON_WATCH 9375
#define SAY1 "Thank you for agreeing to help. Now, let's get out of here $N."
#define SAY2 "Over there! They're following us!"
#define SAY3 "Allow me a moment to rest. The journey taxes what little strength I have."
#define SAY4 "Did you hear something?"
#define SAY5 "Falcon Watch, at last! Now, where's my... Oh no! My pack, it's missing! Where has -"
#define SAYAGGRO "You won't keep me from getting to Falcon Watch!"
#define QUEST_ROAD_TO_FALCON_WATCH 9375
struct TRINITY_DLL_DECL npc_wounded_blood_elfAI : public npc_escortAI
{
npc_wounded_blood_elfAI(Creature *c) : npc_escortAI(c) {Reset();}
npc_wounded_blood_elfAI(Creature *c) : npc_escortAI(c) {Reset();}
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
return;
if (!player)
return;
switch (i)
{
case 0:
DoScriptText(SAY_ELF_START, m_creature, player);
break;
case 9:
DoScriptText(SAY_ELF_SUMMON1, m_creature, player);
// Spawn two Haal'eshi Talonguard
DoSpawnCreature(16967, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
DoSpawnCreature(16967, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
break;
case 13:
DoScriptText(SAY_ELF_RESTING, m_creature, player);
// make the NPC kneel
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
break;
case 14:
DoScriptText(SAY_ELF_SUMMON2, m_creature, player);
// Spawn two Haal'eshi Windwalker
DoSpawnCreature(16966, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
DoSpawnCreature(16966, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
break;
case 27:
DoScriptText(SAY_ELF_COMPLETE, m_creature, player);
// Award quest credit
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_ROAD_TO_FALCON_WATCH,m_creature);
break;
}
}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(1604);
}
switch (i)
{
void Aggro(Unit* who)
{
if (IsBeingEscorted)
DoScriptText(SAY_ELF_AGGRO, m_creature);
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
case 0:
DoSay(SAY1, LANG_UNIVERSAL, player);
// Change faction, so mobs can attack
m_creature->setFaction(1610);
break;
void JustDied(Unit* killer)
{
if (!IsBeingEscorted)
return;
case 9:
DoSay(SAY2, LANG_UNIVERSAL, player);
// Spawn two Haal'eshi Talonguard
{
Creature* temp1 = m_creature->SummonCreature(16967, m_creature->GetPositionX()-15, m_creature->GetPositionY()-15, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
if (temp1) temp1->AI()->AttackStart(m_creature);
Creature* temp2 = m_creature->SummonCreature(16967, m_creature->GetPositionX()-17, m_creature->GetPositionY()-17, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
if (temp2) temp2->AI()->AttackStart(m_creature);
}
break;
case 13:
DoSay(SAY3, LANG_UNIVERSAL, player);
// NPC "should" kneel
m_creature->HandleEmoteCommand(EMOTE_STATE_KNEEL);
break;
case 14:
DoSay(SAY4, LANG_UNIVERSAL, player);
// Spawn two Haal'eshi Windwalker
{
Creature* temp3 = m_creature->SummonCreature(16966, m_creature->GetPositionX()-15, m_creature->GetPositionY()-15, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
if (temp3) temp3->AI()->AttackStart(m_creature);
Creature* temp4 = m_creature->SummonCreature(16966, m_creature->GetPositionX()-17, m_creature->GetPositionY()-17, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
if (temp4) temp4->AI()->AttackStart(m_creature);
}
break;
case 27:
DoSay(SAY5, LANG_UNIVERSAL, player);
// Set faction back to normal
m_creature->setFaction(1604);
// Award quest credit
if( PlayerGUID )
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if( player && player->GetTypeId() == TYPEID_PLAYER )
((Player*)player)->GroupEventHappens(9375,m_creature);
}
break;
}
}
void Aggro(Unit* who)
{
DoSay(SAYAGGRO, LANG_UNIVERSAL, who);
}
void Reset() { }
void JustDied(Unit* killer)
// If NPC dies, Quest fail
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_THE_ROAD_TO_FALCON_WATCH);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
if (PlayerGUID)
{
// If NPC dies, player fails the quest
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->FailQuest(QUEST_ROAD_TO_FALCON_WATCH);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
bool QuestAccept_wounded_blood_elf(Player* player, Creature* creature, Quest const* quest)
// Begin the escort quest
{
if (quest->GetQuestId() == QUEST_THE_ROAD_TO_FALCON_WATCH)
{
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
}
return true;
}
CreatureAI* GetAI_npc_wounded_blood_elf(Creature *_Creature)
{
npc_wounded_blood_elfAI* thisAI = new npc_wounded_blood_elfAI(_Creature);
npc_wounded_blood_elfAI* welfAI = new npc_wounded_blood_elfAI(_Creature);
thisAI->AddWaypoint(0, -1137.72, 4272.10, 14.04, 3000);
thisAI->AddWaypoint(1, -1141.34, 4232.42, 14.63);
thisAI->AddWaypoint(2, -1133.47, 4220.88, 11.78);
thisAI->AddWaypoint(3, -1126.18, 4213.26, 13.51);
thisAI->AddWaypoint(4, -1100.12, 4204.32, 16.41);
thisAI->AddWaypoint(5, -1063.68, 4197.92, 15.51);
thisAI->AddWaypoint(6, -1027.28, 4194.36, 15.52);
thisAI->AddWaypoint(7, -995.68, 4189.59, 19.84);
thisAI->AddWaypoint(8, -970.90, 4188.60, 24.61);
thisAI->AddWaypoint(9, -961.93, 4193.34, 26.11, 80000); // Summon 1
thisAI->AddWaypoint(10, -935.52, 4210.99, 31.98);
thisAI->AddWaypoint(11, -913.42, 4218.27, 37.29);
thisAI->AddWaypoint(12, -896.53, 4207.73, 43.23);
thisAI->AddWaypoint(13, -868.49, 4194.77, 46.75, 17000); // Kneel and Rest Here
thisAI->AddWaypoint(14, -852.83, 4198.29, 47.28, 80000); // Summon 2
thisAI->AddWaypoint(15, -819.85, 4200.50, 46.37);
thisAI->AddWaypoint(16, -791.92, 4201.96, 44.19);
thisAI->AddWaypoint(17, -774.42, 4202.46, 47.41);
thisAI->AddWaypoint(18, -762.90, 4202.17, 48.81);
thisAI->AddWaypoint(19, -728.25, 4195.35, 50.68);
thisAI->AddWaypoint(20, -713.58, 4192.07, 53.98);
thisAI->AddWaypoint(21, -703.09, 4189.74, 56.96);
thisAI->AddWaypoint(22, -693.70, 4185.43, 57.06);
thisAI->AddWaypoint(23, -686.38, 4159.81, 60.26);
thisAI->AddWaypoint(24, -679.88, 4147.04, 64.20);
thisAI->AddWaypoint(25, -656.74, 4147.72, 64.11);
thisAI->AddWaypoint(26, -652.22, 4137.50, 64.58);
thisAI->AddWaypoint(27, -649.99, 4136.38, 64.63, 20000); // Award Quest Credit
return (CreatureAI*)thisAI;
welfAI->AddWaypoint(0, -1137.72, 4272.10, 14.04, 5000);
welfAI->AddWaypoint(1, -1141.34, 4232.42, 14.63);
welfAI->AddWaypoint(2, -1133.47, 4220.88, 11.78);
welfAI->AddWaypoint(3, -1126.18, 4213.26, 13.51);
welfAI->AddWaypoint(4, -1100.12, 4204.32, 16.41);
welfAI->AddWaypoint(5, -1063.68, 4197.92, 15.51);
welfAI->AddWaypoint(6, -1027.28, 4194.36, 15.52);
welfAI->AddWaypoint(7, -995.68, 4189.59, 19.84);
welfAI->AddWaypoint(8, -970.90, 4188.60, 24.61);
welfAI->AddWaypoint(9, -961.93, 4193.34, 26.11, 15000); // Summon 1
welfAI->AddWaypoint(10, -935.52, 4210.99, 31.98);
welfAI->AddWaypoint(11, -913.42, 4218.27, 37.29);
welfAI->AddWaypoint(12, -896.53, 4207.73, 43.23);
welfAI->AddWaypoint(13, -868.49, 4194.77, 46.75, 30000);// Kneel and Rest Here
welfAI->AddWaypoint(14, -852.83, 4198.29, 47.28, 15000);// Summon 2
welfAI->AddWaypoint(15, -819.85, 4200.50, 46.37);
welfAI->AddWaypoint(16, -791.92, 4201.96, 44.19);
welfAI->AddWaypoint(17, -774.42, 4202.46, 47.41);
welfAI->AddWaypoint(18, -762.90, 4202.17, 48.81);
welfAI->AddWaypoint(19, -728.25, 4195.35, 50.68);
welfAI->AddWaypoint(20, -713.58, 4192.07, 53.98);
welfAI->AddWaypoint(21, -703.09, 4189.74, 56.96);
welfAI->AddWaypoint(22, -693.70, 4185.43, 57.06);
welfAI->AddWaypoint(23, -686.38, 4159.81, 60.26);
welfAI->AddWaypoint(24, -679.88, 4147.04, 64.20);
welfAI->AddWaypoint(25, -656.74, 4147.72, 64.11);
welfAI->AddWaypoint(26, -652.22, 4137.50, 64.58);
welfAI->AddWaypoint(27, -649.99, 4136.38, 64.63, 30000);// Award Quest Credit
return (CreatureAI*)welfAI;
}
bool QuestAccept_npc_wounded_blood_elf(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH)
{
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
// Change faction so mobs attack
creature->setFaction(775);
}
return true;
}
/*######
@@ -335,6 +331,6 @@ void AddSC_hellfire_peninsula()
newscript = new Script;
newscript->Name="npc_wounded_blood_elf";
newscript->GetAI = &GetAI_npc_wounded_blood_elf;
newscript->pQuestAccept = &QuestAccept_wounded_blood_elf;
newscript->pQuestAccept = &QuestAccept_npc_wounded_blood_elf;
newscript->RegisterSelf();
}
@@ -23,29 +23,14 @@ EndScriptData */
#include "precompiled.h"
#define SAY_AGGRO "The Menagerie is for guests only."
#define SOUND_AGGRO 9183
#define SAY_SUMMON1 "Gallery rules will be strictly enforced."
#define SOUND_SUMMON1 9188
#define SAY_SUMMON2 "This curator is equipped for gallery protection."
#define SOUND_SUMMON2 9309
#define SAY_EVOCATE "Your request cannot be processed."
#define SOUND_EVOCATE 9186
#define SAY_ENRAGE "Failure to comply will result in offensive action."
#define SOUND_ENRAGE 9185
#define SAY_KILL1 "Do not touch the displays."
#define SOUND_KILL1 9187
#define SAY_KILL2 "You are not a guest."
#define SOUND_KILL2 9308
#define SAY_DEATH "This Curator is no longer op... er... ation... al."
#define SOUND_DEATH 9184
#define SAY_AGGRO -1532057
#define SAY_SUMMON1 -1532058
#define SAY_SUMMON2 -1532059
#define SAY_EVOCATE -1532060
#define SAY_ENRAGE -1532061
#define SAY_KILL1 -1532062
#define SAY_KILL2 -1532063
#define SAY_DEATH -1532064
//Flare spell info
#define SPELL_ASTRAL_FLARE_PASSIVE 30234 //Visual effect + Flare damage
@@ -84,27 +69,19 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_KILL1);
break;
case 1:
DoYell(SAY_KILL2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_KILL2);
break;
}
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -117,8 +94,7 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
if (m_creature->GetPower(POWER_MANA) <= 1000 && !Evocating)
{
DoYell(SAY_EVOCATE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_EVOCATE);
DoScriptText(SAY_EVOCATE, m_creature);
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature, SPELL_EVOCATION);
Evocating = true;
@@ -144,14 +120,8 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
m_creature->ModifyPower(POWER_MANA, -mana);
switch(rand()%4)
{
case 0:
DoYell(SAY_SUMMON1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SUMMON1);
break;
case 1:
DoYell(SAY_SUMMON2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SUMMON2);
break;
case 0: DoScriptText(SAY_SUMMON1, m_creature);break;
case 1: DoScriptText(SAY_SUMMON2, m_creature);break;
}
AddTimer = 10000;
}else AddTimer -= diff;
@@ -169,16 +139,14 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
{
Enraged = true;
DoCast(m_creature, SPELL_ENRAGE);
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}
}
if (BerserkTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
DoScriptText(SAY_ENRAGE, m_creature);
}else BerserkTimer -= diff;
DoMeleeAttackIfReady();
@@ -23,28 +23,20 @@ EndScriptData */
#include "precompiled.h"
#define SAY_AGGRO -1532018
#define SAY_SLAY1 -1532019
#define SAY_SLAY2 -1532020
#define SAY_SLAY3 -1532021
#define SAY_REPENTANCE1 -1532022
#define SAY_REPENTANCE2 -1532023
#define SAY_DEATH -1532024
#define SPELL_REPENTANCE 29511
#define SPELL_HOLYFIRE 29522
#define SPELL_HOLYWRATH 32445
#define SPELL_HOLYGROUND 29512
#define SPELL_BERSERK 26662
#define SAY_AGGRO "Your behavior will not be tolerated!"
#define SAY_SLAY1 "Ah ah ah..."
#define SAY_SLAY2 "This is for the best."
#define SAY_SLAY3 "Impure thoughts lead to profane actions."
#define SAY_REPENTANCE1 "Cast out your corrupt thoughts."
#define SAY_REPENTANCE2 "Your impurity must be cleansed."
#define SAY_DEATH "Death comes. Will your conscience be clear?"
#define SOUND_AGGRO 9204
#define SOUND_SLAY1 9207
#define SOUND_SLAY2 9312
#define SOUND_SLAY3 9311
#define SOUND_REPENTANCE1 9313
#define SOUND_REPENTANCE2 9208
#define SOUND_DEATH 9206
struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
{
boss_maiden_of_virtueAI(Creature *c) : ScriptedAI(c) {Reset();}
@@ -73,35 +65,25 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
void KilledUnit(Unit* Victim)
{
if(rand()%2) return;
if(rand()%2)
return;
switch(rand()%3)
{
case 0:
DoYell(SAY_SLAY1,LANG_UNIVERSAL,Victim);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2,LANG_UNIVERSAL,Victim);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 2:
DoYell(SAY_SLAY3,LANG_UNIVERSAL,Victim);
DoPlaySoundToSet(m_creature, SOUND_SLAY3);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature);break;
case 1: DoScriptText(SAY_SLAY2, m_creature);break;
case 2: DoScriptText(SAY_SLAY3, m_creature);break;
}
}
void JustDied(Unit* Killer)
{
DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
}
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -127,40 +109,27 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_REPENTANCE1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_REPENTANCE1);
break;
case 1:
DoYell(SAY_REPENTANCE2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_REPENTANCE2);
break;
case 0: DoScriptText(SAY_REPENTANCE1, m_creature);break;
case 1: DoScriptText(SAY_REPENTANCE2, m_creature);break;
}
Repentance_Timer = 30000 + rand()%15000; //A little randomness on that spell
}else Repentance_Timer -= diff;
if (Holyfire_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYFIRE);
Holyfire_Timer = 8000 + rand()%17000; //Anywhere from 8 to 25 seconds, good luck having several of those in a row!
}
Holyfire_Timer = 8000 + rand()%17000; //Anywhere from 8 to 25 seconds, good luck having several of those in a row!
}else Holyfire_Timer -= diff;
if (Holywrath_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target)
{
DoCast(target,SPELL_HOLYWRATH);
Holywrath_Timer = 20000+(rand()%10000); //20-30 secs sounds nice
}
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYWRATH);
Holywrath_Timer = 20000+(rand()%10000); //20-30 secs sounds nice
}else Holywrath_Timer -= diff;
DoMeleeAttackIfReady();
@@ -23,34 +23,17 @@ EndScriptData */
#include "precompiled.h"
#define SAY_MIDNIGHT_KILL "Well done Midnight!"
#define SOUND_MIDNIGHT_KILL 9173
#define SAY_APPEAR1 "Cowards! Wretches!"
#define SOUND_APPEAR1 9167
#define SAY_APPEAR2 "Who dares attack the steed of the Huntsman?"
#define SOUND_APPEAR2 9298
#define SAY_APPEAR3 "Perhaps you would rather test yourselves against a more formidable opponent?! "
#define SOUND_APPEAR3 9299
#define SAY_MOUNT "Come, Midnight, let\'s disperse this petty rabble! "
#define SOUND_MOUNT 9168
#define SAY_KILL1 "It was... inevitable."
#define SOUND_KILL1 9169
#define SAY_KILL2 "Another trophy to add to my collection!"
#define SOUND_KILL2 9300
#define SAY_DISARMED "Weapons are merely a convenience for a warrior of my skill!"
#define SOUND_DISARMED 9166
#define SAY_DEATH "I always knew... someday I would become... the hunted."
#define SOUND_DEATH 9165
#define SAY_RANDOM1 "Such easy sport."
#define SOUND_RANDOM1 9170
#define SAY_RANDOM2 "Amateurs! Do not think you can best me! I kill for a living."
#define SOUND_RANDOM2 9304
#define SAY_MIDNIGHT_KILL -1532000
#define SAY_APPEAR1 -1532001
#define SAY_APPEAR2 -1532002
#define SAY_APPEAR3 -1532003
#define SAY_MOUNT -1532004
#define SAY_KILL1 -1532005
#define SAY_KILL2 -1532006
#define SAY_DISARMED -1532007
#define SAY_DEATH -1532008
#define SAY_RANDOM1 -1532009
#define SAY_RANDOM2 -1532010
#define SPELL_SHADOWCLEAVE 29832
#define SPELL_INTANGIBLE_PRESENCE 29833
@@ -84,12 +67,8 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
{
if(Phase == 2)
{
Unit *pUnit = Unit::GetUnit(*m_creature, Attumen);
if(pUnit)
{
pUnit->MonsterYell(SAY_MIDNIGHT_KILL, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(pUnit, SOUND_MIDNIGHT_KILL);
}
if (Unit *pUnit = Unit::GetUnit(*m_creature, Attumen))
DoScriptText(SAY_MIDNIGHT_KILL, pUnit);
}
}
@@ -101,7 +80,7 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
if(Phase == 1 && (m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 95)
{
Phase = 2;
Creature *pAttumen = DoSpawnCreature(SUMMON_ATTUMEN, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 45000);
Creature *pAttumen = DoSpawnCreature(SUMMON_ATTUMEN, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
if(pAttumen)
{
Attumen = pAttumen->GetGUID();
@@ -109,25 +88,15 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
SetMidnight(pAttumen, m_creature->GetGUID());
switch(rand()%3)
{
case 0:
pAttumen->Yell(SAY_APPEAR1, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(m_creature, SOUND_APPEAR1);
break;
case 1:
pAttumen->Yell(SAY_APPEAR2, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(m_creature, SOUND_APPEAR2);
break;
case 2:
pAttumen->Yell(SAY_APPEAR3, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(m_creature, SOUND_APPEAR3);
break;
case 0: DoScriptText(SAY_APPEAR1, pAttumen); break;
case 1: DoScriptText(SAY_APPEAR2, pAttumen); break;
case 2: DoScriptText(SAY_APPEAR3, pAttumen); break;
}
}
}
else if(Phase == 2 && (m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 25)
{
Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen);
if(pAttumen)
if (Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen))
Mount(pAttumen);
}
else if(Phase ==3)
@@ -138,8 +107,7 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
Mount_Timer = 0;
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->GetMotionMaster()->MoveIdle();
Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen);
if(pAttumen)
if (Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen))
{
pAttumen->SetUInt32Value(UNIT_FIELD_DISPLAYID, MOUNTED_DISPLAYID);
pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -149,9 +117,10 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
pAttumen->SetUInt64Value(UNIT_FIELD_TARGET, pAttumen->getVictim()->GetGUID());
}
pAttumen->SetFloatValue(OBJECT_FIELD_SCALE_X,1);
}
} else Mount_Timer -= diff;
}
} else Mount_Timer -= diff;
}
}
if(Phase != 3)
DoMeleeAttackIfReady();
@@ -159,8 +128,7 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
void Mount(Unit *pAttumen)
{
DoPlaySoundToSet(pAttumen, SOUND_MOUNT);
pAttumen->MonsterYell(SAY_MOUNT, LANG_UNIVERSAL, 0);
DoScriptText(SAY_MOUNT, pAttumen);
Phase = 3;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pAttumen->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -224,21 +192,15 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL1);
case 1:
DoYell(SAY_KILL2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL2);
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight);
if(pMidnight)
DoScriptText(SAY_DEATH, m_creature);
if (Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight))
{
pMidnight->DealDamage(pMidnight, pMidnight->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
@@ -272,8 +234,7 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
if(CleaveTimer < diff)
{
Unit *target = m_creature->getVictim();
DoCast(target, SPELL_SHADOWCLEAVE);
DoCast(m_creature->getVictim(), SPELL_SHADOWCLEAVE);
CleaveTimer = 10000 + (rand()%6)*1000;
} else CleaveTimer -= diff;
@@ -287,14 +248,8 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_RANDOM1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_RANDOM1);
break;
case 1:
DoYell(SAY_RANDOM2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_RANDOM2);
break;
case 0: DoScriptText(SAY_RANDOM1, m_creature); break;
case 1: DoScriptText(SAY_RANDOM2, m_creature); break;
}
RandomYellTimer = 30000 + (rand()%31)*1000;
} else RandomYellTimer -= diff;
@@ -340,8 +295,7 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
{
if(spell->Mechanic == MECHANIC_DISARM)
{
DoYell(SAY_DISARMED, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DISARMED);
DoScriptText(SAY_DISARMED, m_creature);
}
}
};
@@ -24,26 +24,13 @@ EndScriptData */
#include "precompiled.h"
#include "def_karazhan.h"
#define SAY_AGGRO "Hmm, unannounced visitors? Preparations must be made."
#define SOUND_AGGRO 9211
#define SAY_SPECIAL_1 "Now, where was I? Oh yes..."
#define SOUND_SPECIAL_1 9215
#define SAY_SPECIAL_2 "You rang?"
#define SOUND_SPECIAL_2 9316
#define SAY_KILL_1 "One more for dinner this evening"
#define SOUND_KILL_1 9214
#define SAY_KILL_2 "Time... Never enough time."
#define SOUND_KILL_2 9314
#define SAY_KILL_3 "I've gone and made a mess."
#define SOUND_KILL_3 9315
#define SAY_DEATH "How terribly clumsy of me..."
#define SOUND_DEATH 9213
#define SAY_AGGRO -1532011
#define SAY_SPECIAL_1 -1532012
#define SAY_SPECIAL_2 -1532013
#define SAY_KILL_1 -1532014
#define SAY_KILL_2 -1532015
#define SAY_KILL_3 -1532016
#define SAY_DEATH -1532017
#define SPELL_VANISH 29448
#define SPELL_GARROTE 37066
@@ -129,8 +116,7 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
StartEvent();
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
AddsAttack();
}
@@ -138,31 +124,37 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
switch (rand()%3)
{
case 0:
DoYell(SAY_KILL_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL_1);
break;
case 1:
DoYell(SAY_KILL_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL_2);
break;
case 2:
DoYell(SAY_KILL_3, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL_3);
break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
case 2: DoScriptText(SAY_KILL_3, m_creature); break;
}
}
void JustDied(Unit* victim)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_MOROES_EVENT, DONE);
DeSpawnAdds();
}
//remove aura from spell Garrote when Moroes dies
Map *map = m_creature->GetMap();
if (map->IsDungeon())
{
Map::PlayerList const &PlayerList = map->GetPlayers();
if (PlayerList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->getSource()->isAlive() && i->getSource()->HasAura(SPELL_GARROTE,0))
i->getSource()->RemoveAurasDueToSpell(SPELL_GARROTE);
}
}
}
uint8 CheckAdd(uint64 guid)
{
@@ -209,7 +201,7 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
}
else
{
for(uint8 i = 0; i < 5; ++i)
for(uint8 i = 0; i < 4; ++i)
{
switch(CheckAdd(AddGUID[i]))
{
@@ -316,18 +308,11 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SPECIAL_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL_1);
break;
case 1:
DoYell(SAY_SPECIAL_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SPECIAL_2);
break;
case 0: DoScriptText(SAY_SPECIAL_1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL_2, m_creature); break;
}
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
target->CastSpell(target, SPELL_GARROTE,true);
m_creature->setFaction(16);
@@ -23,6 +23,9 @@ EndScriptData */
#include "precompiled.h"
#define EMOTE_PHASE_PORTAL -1532089
#define EMOTE_PHASE_BANISH -1532090
#define SPELL_NETHERBURN_AURA 30522
#define SPELL_VOIDZONE 37014 //Probably won't work
#define SPELL_BERSERK 26662
@@ -24,24 +24,18 @@ EndScriptData */
#include "precompiled.h"
#include "def_karazhan.h"
#define SAY_AGGRO "Madness has brought you here to me. I shall be your undoing!"
#define SOUND_AGGRO 9218
#define SAY_SUMMON1 "You face not Malchezaar alone, but the legions I command!"
#define SOUND_SUMMON1 9322
#define SAY_SUMMON2 "All realities, all dimensions are open to me!"
#define SOUND_SUMMON2 9224
#define SAY_PHASE2 "Simple fools! Time is the fire in which you'll burn!"
#define SOUND_PHASE2 9220
#define SAY_PHASE3 "How can you hope to withstand against such overwhelming power?"
#define SOUND_PHASE3 9321
#define SAY_PDEATH1 "You are, but a plaything, unfit even to amuse."
#define SOUND_PDEATH1 9319
#define SAY_PDEATH2 "Your greed, your foolishness has brought you to this end."
#define SOUND_PDEATH2 9318
#define SAY_PDEATH3 "Surely you did not think you could win."
#define SOUND_PDEATH3 9222
#define SAY_DEATH "I refuse to concede defeat. I am a prince of the Eredar! I am..."
#define SOUND_DEATH 9221
#define SAY_AGGRO -1532091
#define SAY_AXE_TOSS1 -1532092
#define SAY_AXE_TOSS2 -1532093
#define SAY_SPECIAL1 -1532094
#define SAY_SPECIAL2 -1532095
#define SAY_SPECIAL3 -1532096
#define SAY_SLAY1 -1532097
#define SAY_SLAY2 -1532098
#define SAY_SLAY3 -1532099
#define SAY_SUMMON1 -1532100
#define SAY_SUMMON2 -1532101
#define SAY_DEATH -1532102
// 19 Coordinates for Infernal spawns
struct InfernalPoint
@@ -225,25 +219,15 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
{
switch(rand()%3)
{
case 0:
DoYell(SAY_PDEATH1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_PDEATH1);
break;
case 1:
DoYell(SAY_PDEATH2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_PDEATH2);
break;
case 2:
DoYell(SAY_PDEATH3, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_PDEATH3);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
AxesCleanup();
ClearWeapons();
@@ -265,8 +249,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
{
@@ -409,14 +392,8 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_SUMMON1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SUMMON1);
break;
case 1:
DoYell(SAY_SUMMON2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SUMMON2);
break;
case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
}
}
@@ -450,8 +427,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
DoCast(m_creature, SPELL_EQUIP_AXES);
//text
DoYell(SAY_PHASE2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_PHASE2);
DoScriptText(SAY_AXE_TOSS1, m_creature);
//passive thrash aura
m_creature->CastSpell(m_creature, SPELL_THRASH_AURA, true);
@@ -491,8 +467,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
//remove thrash
m_creature->RemoveAurasDueToSpell(SPELL_THRASH_AURA);
DoYell(SAY_PHASE3, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_PHASE3);
DoScriptText(SAY_AXE_TOSS2, m_creature);
Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);
for(uint32 i=0; i<2; ++i)
@@ -582,14 +557,16 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
{
if(SWPainTimer < diff)
{
Unit *target;
Unit* target = NULL;
if(phase == 1)
target = m_creature->getVictim(); // the tank
else //anyone but the tank
target = SelectUnit(SELECT_TARGET_RANDOM, 1);
DoCast(target, SPELL_SW_PAIN);
SWPainTimer = 20000;
if (target)
DoCast(target, SPELL_SW_PAIN);
SWPainTimer = 20000;
}else SWPainTimer -= diff;
}
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Boss_Shade_of_Aran
SD%Complete: 95
SDComment: Flame wreath missing cast animation, mods won't triggere. Drinking may cause client crash (core related)
SDComment: Flame wreath missing cast animation, mods won't triggere.
SDCategory: Karazhan
EndScriptData */
@@ -26,60 +26,22 @@ EndScriptData */
#include "def_karazhan.h"
#include "GameObject.h"
//Aggro
#define SAY_AGGRO1 "Please, no more. My son... he's gone mad!"
#define SOUND_AGGRO1 9241
#define SAY_AGGRO2 "I'll not be tortured again!"
#define SOUND_AGGRO2 9323
#define SAY_AGGRO3 "Who are you? What do you want? Stay away from me!"
#define SOUND_AGGRO3 9324
//Flame Wreath
#define SAY_FLAMEWREATH1 "I'll show you this beaten dog still has some teeth!"
#define SOUND_FLAMEWREATH1 9245
#define SAY_FLAMEWREATH2 "Burn you hellish fiends!"
#define SOUND_FLAMEWREATH2 9326
//Blizzard
#define SAY_BLIZZARD1 "I'll freeze you all!"
#define SOUND_BLIZZARD1 9246
#define SAY_BLIZZARD2 "Back to the cold dark with you!"
#define SOUND_BLIZZARD2 9327
//Arcane Explosion
#define SAY_EXPLOSION1 "Yes, yes, my son is quite powerful... but I have powers of my own!"
#define SOUND_EXPLOSION1 9242
#define SAY_EXPLOSION2 "I am not some simple jester! I am Nielas Aran!"
#define SOUND_EXPLOSION2 9325
//Low Mana / AoE Pyroblast
#define SAY_DRINK "Surely you would not deny an old man a replenishing drink? No, no I thought not."
#define SOUND_DRINK 9248
//Summon Water Elementals
#define SAY_ELEMENTALS "I'm not finished yet! No, I have a few more tricks up me sleeve."
#define SOUND_ELEMENTALS 9251
//Player Death
#define SAY_KILL1 "I want this nightmare to be over!"
#define SOUND_KILL1 9250
#define SAY_KILL2 "Torment me no more!"
#define SOUND_KILL2 9328
//Time over
#define SAY_TIMEOVER "You've wasted enough of my time. Let these games be finished!"
#define SOUND_TIMEOVER 9247
//Aran's death
#define SAY_DEATH "At last... The nightmare is.. over..."
#define SOUND_DEATH 9244
//Atiesh is equipped by a raid member
#define SAY_ATIESH "Where did you get that?! Did HE send you?!"
#define SOUND_ATIESH 9249
#define SAY_AGGRO1 -1532073
#define SAY_AGGRO2 -1532074
#define SAY_AGGRO3 -1532075
#define SAY_FLAMEWREATH1 -1532076
#define SAY_FLAMEWREATH2 -1532077
#define SAY_BLIZZARD1 -1532078
#define SAY_BLIZZARD2 -1532079
#define SAY_EXPLOSION1 -1532080
#define SAY_EXPLOSION2 -1532081
#define SAY_DRINK -1532082 //Low Mana / AoE Pyroblast
#define SAY_ELEMENTALS -1532083
#define SAY_KILL1 -1532084
#define SAY_KILL2 -1532085
#define SAY_TIMEOVER -1532086
#define SAY_DEATH -1532087
#define SAY_ATIESH -1532088 //Atiesh is equipped by a raid member
//Spells
#define SPELL_FROSTBOLT 29954
@@ -190,21 +152,14 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_KILL1);
break;
case 1:
DoYell(SAY_KILL2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_KILL2);
break;
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(NULL, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
{
@@ -218,18 +173,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
{
switch(rand()%3)
{
case 0:
DoYell(SAY_AGGRO1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO1);
break;
case 1:
DoYell(SAY_AGGRO2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO2);
break;
case 2:
DoYell(SAY_AGGRO3, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO3);
break;
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
}
if(pInstance)
@@ -277,38 +223,46 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
return;
if(CloseDoorTimer)
if(CloseDoorTimer <= diff)
{
if(pInstance)
if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR)))
Door->SetGoState(1);
CloseDoorTimer = 0;
}
else CloseDoorTimer -= diff;
{
if(CloseDoorTimer <= diff)
{
if(pInstance)
{
if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR)))
Door->SetGoState(1);
CloseDoorTimer = 0;
}
}else CloseDoorTimer -= diff;
}
//Cooldowns for casts
if (ArcaneCooldown)
{
if (ArcaneCooldown >= diff)
ArcaneCooldown -= diff;
else ArcaneCooldown = 0;
}
if (FireCooldown)
{
if (FireCooldown >= diff)
FireCooldown -= diff;
else FireCooldown = 0;
}
if (FrostCooldown)
if (FrostCooldown >= diff)
{
if (FrostCooldown >= diff)
FrostCooldown -= diff;
else FrostCooldown = 0;
}
if(!Drinking && m_creature->GetMaxPower(POWER_MANA) && (m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA)) < 20)
{
Drinking = true;
m_creature->InterruptNonMeleeSpells(false);
DoYell(SAY_DRINK, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DRINK);
DoScriptText(SAY_DRINK, m_creature);
if (!DrinkInturrupted)
{
@@ -397,10 +351,8 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
DoCast(m_creature, SPELL_AOE_CS);
break;
case 1:
Unit* pUnit;
pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (pUnit)
DoCast(pUnit, SPELL_CHAINSOFICE);
if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pUnit, SPELL_CHAINSOFICE);
break;
}
SecondarySpellTimer = 5000 + (rand()%15000);
@@ -433,14 +385,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
case SUPER_AE:
if (rand()%2)
{
DoYell(SAY_EXPLOSION1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_EXPLOSION1);
}else
{
DoYell(SAY_EXPLOSION2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_EXPLOSION2);
}
DoScriptText(SAY_EXPLOSION1, m_creature);
else
DoScriptText(SAY_EXPLOSION2, m_creature);
m_creature->CastSpell(m_creature, SPELL_BLINK_CENTER, true);
m_creature->CastSpell(m_creature, SPELL_PLAYERPULL, true);
@@ -450,14 +397,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
case SUPER_FLAME:
if (rand()%2)
{
DoYell(SAY_FLAMEWREATH1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_FLAMEWREATH1);
}else
{
DoYell(SAY_FLAMEWREATH2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_FLAMEWREATH2);
}
DoScriptText(SAY_FLAMEWREATH1, m_creature);
else
DoScriptText(SAY_FLAMEWREATH2, m_creature);
FlameWreathTimer = 20000;
FlameWreathCheckTime = 500;
@@ -472,14 +414,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
case SUPER_BLIZZARD:
if (rand()%2)
{
DoYell(SAY_BLIZZARD1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_BLIZZARD1);
}else
{
DoYell(SAY_BLIZZARD2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_BLIZZARD2);
}
DoScriptText(SAY_BLIZZARD1, m_creature);
else
DoScriptText(SAY_BLIZZARD2, m_creature);
Creature* Spawn = NULL;
Spawn = DoSpawnCreature(CREATURE_ARAN_BLIZZARD, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 25000);
@@ -508,8 +445,7 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
}
}
DoYell(SAY_ELEMENTALS, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ELEMENTALS);
DoScriptText(SAY_ELEMENTALS, m_creature);
}
if(BerserkTimer < diff)
@@ -524,8 +460,7 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
}
}
DoYell(SAY_TIMEOVER, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_TIMEOVER);
DoScriptText(SAY_TIMEOVER, m_creature);
BerserkTimer = 60000;
}else BerserkTimer -= diff;
@@ -582,15 +517,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
switch (CurrentNormalSpell)
{
case SPELL_ARCMISSLE:
ArcaneCooldown = 5000;
break;
case SPELL_FIREBALL:
FireCooldown = 5000;
break;
case SPELL_FROSTBOLT:
FrostCooldown = 5000;
break;
case SPELL_ARCMISSLE: ArcaneCooldown = 5000; break;
case SPELL_FIREBALL: FireCooldown = 5000; break;
case SPELL_FROSTBOLT: FrostCooldown = 5000; break;
}
}
};
@@ -24,6 +24,15 @@ EndScriptData */
#include "precompiled.h"
#include "def_karazhan.h"
#define SAY_SLAY1 -1532065
#define SAY_SLAY2 -1532066
#define SAY_DEATH -1532067
#define SAY_AGGRO -1532068
#define SAY_SACRIFICE1 -1532069
#define SAY_SACRIFICE2 -1532070
#define SAY_SUMMON1 -1532071
#define SAY_SUMMON2 -1532072
#define SPELL_SUMMON_DEMONCHAINS 30120 // Summons demonic chains that maintain the ritual of sacrifice.
#define SPELL_DEMON_CHAINS 30206 // Instant - Visual Effect
#define SPELL_ENRAGE 23537 // Increases the caster's attack speed by 50% and the Physical damage it deals by 219 to 281 for 10 min.
@@ -42,27 +51,6 @@ EndScriptData */
#define SPELL_AMPLIFY_FLAMES 30053 // Increases the Fire damage taken by an enemy by 500 for 25 sec.
#define SPELL_FIREBOLT 18086 // Blasts a target for 150 Fire damage.
#define SAY_SLAY1 "Your blood will anoint my circle."
#define SOUND_SLAY1 9264
#define SAY_SLAY2 "The great one will be pleased."
#define SOUND_SLAY2 9329
#define SAY_DEATH "My life, is yours. Oh great one."
#define SOUND_DEATH 9262
#define SAY_AGGRO "Ah, you're just in time. The rituals are about to begin."
#define SOUND_AGGRO 9260
#define SAY_SACRIFICE1 "Please, accept this humble offering, oh great one."
#define SOUND_SACRIFICE1 9263
#define SAY_SACRIFICE2 "Let the sacrifice serve his testament to my fealty."
#define SOUND_SACRIFICE2 9330
#define SAY_SUMMON1 "Come, you dwellers in the dark. Rally to my call!"
#define SOUND_SUMMON1 9265
#define SAY_SUMMON2 "Gather, my pets. There is plenty for all."
#define SOUND_SUMMON2 9331
#define CREATURE_DEMONCHAINS 17248
#define CREATURE_FIENDISHIMP 17267
#define CREATURE_PORTAL 17265
@@ -225,8 +213,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
{
@@ -243,14 +230,8 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_SLAY1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY1);
break;
case 1:
DoYell(SAY_SLAY2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SLAY2);
break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -268,8 +249,7 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
}
}
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_TERESTIAN_EVENT, DONE);
@@ -317,14 +297,8 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
Chains->CastSpell(Chains, SPELL_DEMON_CHAINS, true);
switch(rand()%2)
{
case 0:
DoYell(SAY_SACRIFICE1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SACRIFICE1);
break;
case 1:
DoYell(SAY_SACRIFICE2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SACRIFICE2);
break;
case 0: DoScriptText(SAY_SACRIFICE1, m_creature); break;
case 1: DoScriptText(SAY_SACRIFICE2, m_creature); break;
}
SacrificeTimer = 30000;
}
@@ -350,14 +324,8 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
SummonedPortals = true;
switch(rand()%2)
{
case 0:
DoYell(SAY_SUMMON1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SUMMON1);
break;
case 1:
DoYell(SAY_SUMMON2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_SUMMON2);
break;
case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
}
}
uint32 random = rand()%2;
@@ -371,11 +339,13 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
}else SummonTimer -= diff;
if(!Berserk)
if(BerserkTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
Berserk = true;
}else BerserkTimer -= diff;
{
if(BerserkTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
Berserk = true;
}else BerserkTimer -= diff;
}
DoMeleeAttackIfReady();
}
@@ -28,6 +28,29 @@ EndScriptData */
/*** OPERA WIZARD OF OZ EVENT *****/
/*********************************/
#define SAY_DOROTHEE_DEATH -1532025
#define SAY_DOROTHEE_SUMMON -1532026
#define SAY_DOROTHEE_TITO_DEATH -1532027
#define SAY_DOROTHEE_AGGRO -1532028
#define SAY_ROAR_AGGRO -1532029
#define SAY_ROAR_DEATH -1532030
#define SAY_ROAR_SLAY -1532031
#define SAY_STRAWMAN_AGGRO -1532032
#define SAY_STRAWMAN_DEATH -1532033
#define SAY_STRAWMAN_SLAY -1532034
#define SAY_TINHEAD_AGGRO -1532035
#define SAY_TINHEAD_DEATH -1532036
#define SAY_TINHEAD_SLAY -1532037
#define EMOTE_RUST -1532038
#define SAY_CRONE_AGGRO -1532039
#define SAY_CRONE_AGGRO2 -1532040
#define SAY_CRONE_DEATH -1532041
#define SAY_CRONE_SLAY -1532042
/**** Spells ****/
// Dorothee
#define SPELL_WATERBOLT 31012
@@ -63,46 +86,6 @@ EndScriptData */
#define CREATURE_CYCLONE 18412
#define CREATURE_CRONE 18168
/***** Speech and Sound *****/
#define SAY_DOROTHEE_DEATH "Oh at last, at last. I can go home."
#define SOUND_DOROTHEE_DEATH 9190
#define SAY_DOROTHEE_SUMMON "Don't let them hurt us, Tito! Oh, you won't, will you?"
#define SOUND_DOROTHEE_SUMMON 9191
#define SAY_DOROTHEE_TITO_DEATH "Tito, oh Tito, no!"
#define SOUND_DOROTHEE_TITO_DEATH 9192
#define SAY_DOROTHEE_AGGRO "Oh dear, we simply must find a way home! The old wizard could be our only hope! Strawman, Roar, Tinhead, will you... wait! Oh golly, look! We have visitors!"
#define SOUND_DOROTHEE_AGGRO 9195
#define SAY_ROAR_AGGRO "Wanna fight? Huh? Do ya? C'mon, I'll fight you with both claws behind my back!"
#define SOUND_ROAR_AGGRO 9227
#define SAY_ROAR_DEATH "You didn't have to go and do that."
#define SOUND_ROAR_DEATH 9229
#define SAY_ROAR_SLAY "I think I'm going to go take fourty winks"
#define SOUND_ROAR_SLAY 9230
#define SAY_STRAWMAN_AGGRO "Now what should I do with you? I simply can't make up my mind."
#define SOUND_STRAWMAN_AGGRO 9254
#define SAY_STRAWMAN_DEATH "Don't let them make a mattress... out of me."
#define SOUND_STRAWMAN_DEATH 9256
#define SAY_STRAWMAN_SLAY "I guess I'm not a failure after all."
#define SOUND_STRAWMAN_SLAY 9257
#define SAY_TINHEAD_AGGRO "I could really use a heart. Say, can I have yours?"
#define SOUND_TINHEAD_AGGRO 9268
#define SAY_TINHEAD_DEATH "Back to being an old rustbucket."
#define SOUND_TINHEAD_DEATH 9270
#define SAY_TINHEAD_SLAY "Guess I'm not so rusty, after all."
#define SOUND_TINHEAD_SLAY 9271
#define SAY_CRONE_AGGRO "Woe to each and every one of you my pretties!"
#define SOUND_CRONE_AGGRO 9179
#define SAY_CRONE_AGGRO2 "It will all be over soon!"
#define SOUND_CRONE_AGGRO2 9307
#define SAY_CRONE_DEATH "How could you? What a cruel, cruel world!"
#define SOUND_CRONE_DEATH 9178
#define SAY_CRONE_SLAY "Fixed you, didn't I?"
#define SOUND_CRONE_SLAY 9180
void SummonCroneIfReady(ScriptedInstance* pInstance, Creature *_Creature)
{
pInstance->SetData(DATA_OPERA_OZ_DEATHCOUNT, 0); // Increment DeathCount
@@ -113,8 +96,6 @@ void SummonCroneIfReady(ScriptedInstance* pInstance, Creature *_Creature)
{
if(_Creature->getVictim())
Crone->AI()->AttackStart(_Creature->getVictim());
Crone->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
};
@@ -154,16 +135,14 @@ struct TRINITY_DLL_DECL boss_dorotheeAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_DOROTHEE_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DOROTHEE_AGGRO);
DoScriptText(SAY_DOROTHEE_AGGRO, m_creature);
}
void SummonTito(); // See below
void JustDied(Unit* killer)
{
DoYell(SAY_DOROTHEE_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DOROTHEE_DEATH);
DoScriptText(SAY_DOROTHEE_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -188,11 +167,13 @@ struct TRINITY_DLL_DECL boss_dorotheeAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
@@ -248,8 +229,7 @@ struct TRINITY_DLL_DECL mob_titoAI : public ScriptedAI
if(Dorothee && Dorothee->isAlive())
{
((boss_dorotheeAI*)Dorothee->AI())->TitoDied = true;
Dorothee->MonsterYell(SAY_DOROTHEE_TITO_DEATH, LANG_UNIVERSAL, 0);
DoPlaySoundToSet(Dorothee, SOUND_DOROTHEE_TITO_DEATH);
DoScriptText(SAY_DOROTHEE_TITO_DEATH, Dorothee);
}
}
}
@@ -274,8 +254,7 @@ void boss_dorotheeAI::SummonTito()
Creature* Tito = DoSpawnCreature(CREATURE_TITO, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
if(Tito)
{
DoYell(SAY_DOROTHEE_SUMMON, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DOROTHEE_SUMMON);
DoScriptText(SAY_DOROTHEE_SUMMON, m_creature);
((mob_titoAI*)Tito->AI())->DorotheeGUID = m_creature->GetGUID();
Tito->AI()->AttackStart(m_creature->getVictim());
SummonedTito = true;
@@ -322,8 +301,7 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_STRAWMAN_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_STRAWMAN_AGGRO);
DoScriptText(SAY_STRAWMAN_AGGRO, m_creature);
}
void SpellHit(Unit* caster, const SpellEntry *Spell)
@@ -334,8 +312,7 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_STRAWMAN_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_STRAWMAN_DEATH);
DoScriptText(SAY_STRAWMAN_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -343,18 +320,19 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoYell(SAY_STRAWMAN_SLAY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_STRAWMAN_SLAY);
DoScriptText(SAY_STRAWMAN_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
@@ -402,8 +380,7 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_TINHEAD_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_TINHEAD_AGGRO);
DoScriptText(SAY_TINHEAD_AGGRO, m_creature);
}
void AttackStart(Unit* who)
@@ -424,8 +401,7 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_TINHEAD_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_TINHEAD_DEATH);
DoScriptText(SAY_TINHEAD_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -433,18 +409,19 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoYell(SAY_TINHEAD_SLAY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_TINHEAD_SLAY);
DoScriptText(SAY_TINHEAD_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
{
if(AggroTimer < diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
@@ -460,7 +437,7 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
if(RustTimer < diff)
{
RustCount++;
DoTextEmote("begins to rust", NULL);
DoScriptText(EMOTE_RUST, m_creature);
DoCast(m_creature, SPELL_RUST);
RustTimer = 6000;
}else RustTimer -= diff;
@@ -511,14 +488,12 @@ struct TRINITY_DLL_DECL boss_roarAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_ROAR_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROAR_AGGRO);
DoScriptText(SAY_ROAR_AGGRO, m_creature);
}
void JustDied(Unit* killer)
{
DoYell(SAY_ROAR_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROAR_DEATH);
DoScriptText(SAY_ROAR_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -526,18 +501,19 @@ struct TRINITY_DLL_DECL boss_roarAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoYell(SAY_ROAR_SLAY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROAR_SLAY);
DoScriptText(SAY_ROAR_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
@@ -587,22 +563,16 @@ struct TRINITY_DLL_DECL boss_croneAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_CRONE_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_CRONE_AGGRO);
break;
case 1:
DoYell(SAY_CRONE_AGGRO2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_CRONE_AGGRO2);
break;
case 0: DoScriptText(SAY_CRONE_AGGRO, m_creature); break;
case 1: DoScriptText(SAY_CRONE_AGGRO2, m_creature); break;
}
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
}
void JustDied(Unit* killer)
{
DoYell(SAY_CRONE_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_CRONE_DEATH);
DoScriptText(SAY_CRONE_DEATH, m_creature);
if(pInstance)
{
@@ -715,21 +685,18 @@ CreatureAI* GetAI_mob_cyclone(Creature* _Creature)
/**** Opera Red Riding Hood Event ****/
/************************************/
#define GOSSIP_GRANDMA "What phat lewtz you have grandmother?"
/**** Yells for the Wolf ****/
#define SAY_WOLF_AGGRO -1532043
#define SAY_WOLF_SLAY -1532044
#define SAY_WOLF_HOOD -1532045
#define SOUND_WOLF_DEATH 9275 //Only sound on death, no text.
/**** Spells For The Wolf ****/
#define SPELL_LITTLE_RED_RIDING_HOOD 30768
#define SPELL_TERRIFYING_HOWL 30752
#define SPELL_WIDE_SWIPE 30761
/**** Yells for the Wolf ****/
#define SAY_WOLF_AGGRO "All the better to own you with!"
#define SOUND_WOLF_AGGRO 9276
#define SOUND_WOLF_DEATH 9275 // No speech
#define SAY_WOLF_SLAY "Mmmm... delicious."
#define SOUND_WOLF_SLAY 9277
#define SAY_WOLF_HOOD "Run away little girl, run away!"
#define SOUND_WOLF_HOOD 9278
#define GOSSIP_GRANDMA "What phat lewtz you have grandmother?"
/**** The Wolf's Entry ****/
#define CREATURE_BIG_BAD_WOLF 17521
@@ -795,8 +762,7 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_WOLF_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_WOLF_AGGRO);
DoScriptText(SAY_WOLF_AGGRO, m_creature);
}
void JustDied(Unit* killer)
@@ -826,8 +792,7 @@ struct TRINITY_DLL_DECL boss_bigbadwolfAI : public ScriptedAI
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target && target->GetTypeId() == TYPEID_PLAYER)
{
DoYell(SAY_WOLF_HOOD, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_WOLF_HOOD);
DoScriptText(SAY_WOLF_HOOD, m_creature);
DoCast(target, SPELL_LITTLE_RED_RIDING_HOOD, true);
TempThreat = m_creature->getThreatManager().getThreat(target);
@@ -883,6 +848,20 @@ CreatureAI* GetAI_boss_bigbadwolf(Creature* _Creature)
/******** Opera Romeo and Juliet Event *******/
/********************************************/
/**** Speech *****/
#define SAY_JULIANNE_AGGRO -1532046
#define SAY_JULIANNE_ENTER -1532047
#define SAY_JULIANNE_DEATH01 -1532048
#define SAY_JULIANNE_DEATH02 -1532049
#define SAY_JULIANNE_RESURRECT -1532050
#define SAY_JULIANNE_SLAY -1532051
#define SAY_ROMULO_AGGRO -1532052
#define SAY_ROMULO_DEATH -1532053
#define SAY_ROMULO_ENTER -1532054
#define SAY_ROMULO_RESURRECT -1532055
#define SAY_ROMULO_SLAY -1532056
/***** Spells For Julianne *****/
#define SPELL_BLINDING_PASSION 30890
#define SPELL_DEVOTION 30887
@@ -900,33 +879,6 @@ CreatureAI* GetAI_boss_bigbadwolf(Creature* _Creature)
#define SPELL_UNDYING_LOVE 30951
#define SPELL_RES_VISUAL 24171
/**** Speech and Text *****/
/****** Julianne *******/
#define SAY_JULIANNE_AGGRO "What devil art thou, that dost torment me thus?"
#define SOUND_JULIANNE_AGGRO 9196
#define SAY_JULIANNE_ENTER "Where is my lord? Where is my Romulo?"
#define SOUND_JULIANNE_ENTER 9199
#define SAY_JULIANNE_DEATH01 "Romulo, I come! Oh... this do I drink to thee!"
#define SOUND_JULIANNE_DEATH01 9198
#define SAY_JULIANNE_DEATH02 "Where is my Lord? Where is my Romulo? Ohh, happy dagger! This is thy sheath! There rust, and let me die!"
#define SOUND_JULIANNE_DEATH02 9310
#define SAY_JULIANNE_RESURRECT "Come, gentle night; and give me back my Romulo!"
#define SOUND_JULIANNE_RESURRECT 9200
#define SAY_JULIANNE_SLAY "Parting is such sweet sorrow."
#define SOUND_JULIANNE_SLAY 9201
/****** Romulo *******/
#define SAY_ROMULO_AGGRO "Wilt thou provoke me? Then have at thee, boy!"
#define SOUND_ROMULO_AGGRO 9233
#define SAY_ROMULO_DEATH "Thou smilest... upon the stroke that... murders me."
#define SOUND_ROMULO_DEATH 9235
#define SAY_ROMULO_ENTER "This day's black fate on more days doth depend. This but begins the woe. Others must end."
#define SOUND_ROMULO_ENTER 9236
#define SAY_ROMULO_RESURRECT "Thou detestable maw, thou womb of death; I enforce thy rotten jaws to open!"
#define SOUND_ROMULO_RESURRECT 9237
#define SAY_ROMULO_SLAY "How well my comfort is revived by this!"
#define SOUND_ROMULO_SLAY 9238
/*** Misc. Information ****/
#define CREATURE_ROMULO 17533
#define ROMULO_X -10900
@@ -1049,8 +1001,7 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_JULIANNE_DEATH02, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_JULIANNE_DEATH02);
DoScriptText(SAY_JULIANNE_DEATH02, m_creature);
if(pInstance)
{
@@ -1063,8 +1014,7 @@ struct TRINITY_DLL_DECL boss_julianneAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoYell(SAY_JULIANNE_SLAY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_JULIANNE_SLAY);
DoScriptText(SAY_JULIANNE_SLAY, m_creature);
}
void UpdateAI(const uint32 diff);
@@ -1116,8 +1066,7 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_ROMULO_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROMULO_AGGRO);
DoScriptText(SAY_ROMULO_AGGRO, m_creature);
if(JulianneGUID)
{
Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
@@ -1139,14 +1088,12 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_ROMULO_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROMULO_DEATH);
DoScriptText(SAY_ROMULO_DEATH, m_creature);
}
void KilledUnit(Unit* victim)
{
DoYell(SAY_ROMULO_SLAY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROMULO_SLAY);
DoScriptText(SAY_ROMULO_SLAY, m_creature);
}
void UpdateAI(const uint32 diff);
@@ -1159,8 +1106,7 @@ void boss_julianneAI::DamageTaken(Unit* done_by, uint32 &damage)
if(Phase == PHASE_JULIANNE)
{
DoYell(SAY_JULIANNE_DEATH01, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_JULIANNE_DEATH01);
DoScriptText(SAY_JULIANNE_DEATH01, m_creature);
m_creature->InterruptNonMeleeSpells(true);
DoCast(m_creature, SPELL_DRINK_POISON);
PretendToDie(m_creature);
@@ -1254,21 +1200,23 @@ void boss_romuloAI::DamageTaken(Unit* done_by, uint32 &damage)
void boss_julianneAI::UpdateAI(const uint32 diff)
{
if(EntryYellTimer)
if(EntryYellTimer < diff)
{
DoYell(SAY_JULIANNE_ENTER, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_JULIANNE_ENTER);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
EntryYellTimer = 0;
}else EntryYellTimer -= diff;
{
if(EntryYellTimer < diff)
{
DoScriptText(SAY_JULIANNE_ENTER, m_creature);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
EntryYellTimer = 0;
}else EntryYellTimer -= diff;
}
if(AggroYellTimer)
if(AggroYellTimer < diff)
{
DoYell(SAY_JULIANNE_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_JULIANNE_AGGRO);
AggroYellTimer = 0;
}else AggroYellTimer -= diff;
{
if(AggroYellTimer < diff)
{
DoScriptText(SAY_JULIANNE_AGGRO, m_creature);
AggroYellTimer = 0;
}else AggroYellTimer -= diff;
}
if(Phase == PHASE_ROMULO && !SummonedRomulo)
{
@@ -1295,19 +1243,20 @@ void boss_julianneAI::UpdateAI(const uint32 diff)
return;
if(RomuloDead)
{
if(ResurrectTimer < diff)
{
Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID));
if(Romulo && ((boss_romuloAI*)Romulo->AI())->IsFakingDeath)
{
DoYell(SAY_JULIANNE_RESURRECT, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_JULIANNE_RESURRECT);
Resurrect(Romulo);
((boss_romuloAI*)Romulo->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
RomuloDead = false;
}else ResurrectTimer -= diff;
{
Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID));
if(Romulo && ((boss_romuloAI*)Romulo->AI())->IsFakingDeath)
{
DoScriptText(SAY_JULIANNE_RESURRECT, m_creature);
Resurrect(Romulo);
((boss_romuloAI*)Romulo->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
RomuloDead = false;
}else ResurrectTimer -= diff;
}
if(BlindingPassionTimer < diff)
{
@@ -1336,8 +1285,7 @@ void boss_julianneAI::UpdateAI(const uint32 diff)
DoCast(Romulo, SPELL_ETERNAL_AFFECTION);
else
return;
}
else DoCast(m_creature, SPELL_ETERNAL_AFFECTION);
}else DoCast(m_creature, SPELL_ETERNAL_AFFECTION);
EternalAffectionTimer = 45000 + rand()%15000;
}else EternalAffectionTimer -= diff;
@@ -1351,19 +1299,20 @@ void boss_romuloAI::UpdateAI(const uint32 diff)
return;
if(JulianneDead)
{
if(ResurrectTimer < diff)
{
Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
if(Julianne && ((boss_julianneAI*)Julianne->AI())->IsFakingDeath)
{
DoYell(SAY_ROMULO_RESURRECT, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ROMULO_RESURRECT);
Resurrect(Julianne);
((boss_julianneAI*)Julianne->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
JulianneDead = false;
}else ResurrectTimer -= diff;
{
Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
if(Julianne && ((boss_julianneAI*)Julianne->AI())->IsFakingDeath)
{
DoScriptText(SAY_ROMULO_RESURRECT, m_creature);
Resurrect(Julianne);
((boss_julianneAI*)Julianne->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
JulianneDead = false;
}else ResurrectTimer -= diff;
}
if(BackwardLungeTimer < diff)
{
@@ -16,7 +16,7 @@
#define DATA_NETHERSPITE_EVENT 9
#define DATA_CHESS_EVENT 10
#define DATA_MALCHEZZAR_EVENT 11
#define DATA_NETHERBANE_EVENT 12
#define DATA_NIGHTBANE_EVENT 12
#define DATA_OPERA_PERFORMANCE 13
#define DATA_OPERA_OZ_DEATHCOUNT 14
#define DATA_KILREK 15
@@ -38,18 +38,15 @@ EndScriptData */
8 - Netherspite (optional)
9 - Chess Event
10 - Prince Malchezzar
11 - Netherbane
11 - Nightbane
*/
struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
{
instance_karazhan(Map* map) : ScriptedInstance(map)
{
Initialize();
}
instance_karazhan(Map* map) : ScriptedInstance(map) {Initialize();}
uint32 Encounters[ENCOUNTERS];
uint32 OperaEvent; // 0 - OZ, 1 - HOOD, 2 - RAJ
uint32 OperaEvent;
uint32 OzDeathCount;
uint64 CurtainGUID;
@@ -69,7 +66,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
for (uint8 i = 0; i < ENCOUNTERS; ++i)
Encounters[i] = NOT_STARTED;
OperaEvent = rand()%3; // This never gets altered.
OperaEvent = urand(1,3); // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
OzDeathCount = 0;
CurtainGUID = 0;
@@ -90,7 +87,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounters[i] == IN_PROGRESS) return true;
if (Encounters[i] == IN_PROGRESS)
return true;
return false;
}
@@ -110,7 +108,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
case DATA_NETHERSPITE_EVENT: return Encounters[8];
case DATA_CHESS_EVENT: return Encounters[9];
case DATA_MALCHEZZAR_EVENT: return Encounters[10];
case DATA_NETHERBANE_EVENT: return Encounters[11];
case DATA_NIGHTBANE_EVENT: return Encounters[11];
case DATA_OPERA_PERFORMANCE: return OperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT: return OzDeathCount;
}
@@ -120,7 +118,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
void OnCreatureCreate(Creature *creature, uint32 entry)
{
switch (entry)
switch (creature->GetEntry())
{
case 17229: KilrekGUID = creature->GetGUID(); break;
case 15688: TerestianGUID = creature->GetGUID(); break;
@@ -128,9 +126,9 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
}
}
uint64 GetData64(uint32 identifier)
uint64 GetData64(uint32 data)
{
switch (identifier)
switch (data)
{
case DATA_KILREK: return KilrekGUID;
case DATA_TERESTIAN: return TerestianGUID;
@@ -148,12 +146,16 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
return 0;
}
void SetData(uint32 identifier, uint32 data)
void SetData(uint32 type, uint32 data)
{
switch (identifier)
switch (type)
{
case DATA_ATTUMEN_EVENT: Encounters[0] = data; break;
case DATA_MOROES_EVENT: Encounters[1] = data; break;
case DATA_MOROES_EVENT:
if (Encounters[1] == DONE)
break;
Encounters[1] = data;
break;
case DATA_MAIDENOFVIRTUE_EVENT: Encounters[2] = data; break;
case DATA_OPTIONAL_BOSS_EVENT: Encounters[3] = data; break;
case DATA_OPERA_EVENT: Encounters[4] = data; break;
@@ -163,7 +165,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
case DATA_NETHERSPITE_EVENT: Encounters[8] = data; break;
case DATA_CHESS_EVENT: Encounters[9] = data; break;
case DATA_MALCHEZZAR_EVENT: Encounters[10] = data; break;
case DATA_NETHERBANE_EVENT: Encounters[11] = data; break;
case DATA_NIGHTBANE_EVENT: Encounters[11] = data; break;
case DATA_OPERA_OZ_DEATHCOUNT: ++OzDeathCount; break;
}
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -47,32 +47,32 @@ EndContentData */
struct Dialogue
{
char* text;
uint32 soundid, timer;
int32 textid;
uint32 timer;
};
static Dialogue OzDialogue[]=
{
{"Welcome Ladies and Gentlemen, to this evening's presentation!", 9174, 6000},
{"Tonight we plumb the depths of the human soul as we join a lost, lonely girl trying desperately -- with the help of her loyal companions -- to find her way home!", 9338, 18000},
{"But she is pursued... by a wicked malevolent crone!", 9339, 9000},
{"Will she survive? Will she prevail? Only time will tell. And now ... on with the show!", 9340, 15000}
{-1532103, 6000},
{-1532104, 18000},
{-1532105, 9000},
{-1532106, 15000}
};
static Dialogue HoodDialogue[]=
{
{"Good evening, Ladies and Gentlemen! Welcome to this evening's presentation!", 9175, 6000},
{"Tonight, things are not what they seem. For tonight, your eyes may not be trusted", 9335, 10000},
{"Take for instance, this quiet, elderly woman, waiting for a visit from her granddaughter. Surely there is nothing to fear from this sweet, grey-haired, old lady.", 9336, 14000},
{"But don't let me pull the wool over your eyes. See for yourself what lies beneath those covers! And now... on with the show!", 9337, 15000}
{-1532107, 6000},
{-1532108, 10000},
{-1532109, 14000},
{-1532110, 15000}
};
static Dialogue RAJDialogue[]=
{
{"Welcome, Ladies and Gentlemen, to this evening's presentation!", 9176, 5000},
{"Tonight, we explore a tale of forbidden love!", 9341, 7000},
{"But beware, for not all love stories end happily, as you may find out. Sometimes, love pricks like a thorn.", 9342, 14000},
{"But don't take it from me, see for yourself what tragedy lies ahead when the paths of star-crossed lovers meet. And now...on with the show!", 9343, 14000}
{-1532111, 5000},
{-1532112, 7000},
{-1532113, 14000},
{-1532114, 14000}
};
// Entries and spawn locations for creatures in Oz event
@@ -144,12 +144,10 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
Event = pInstance->GetData(DATA_OPERA_PERFORMANCE);
GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT));
if(Door)
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
Door->SetGoState(1);
GameObject* Curtain = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS));
if(Curtain)
if (GameObject* Curtain = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS)))
Curtain->SetGoState(1);
}
}
@@ -167,9 +165,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
float x,y,z;
m_creature->GetPosition(x, y, z);
Creature* Spotlight;
Spotlight = m_creature->SummonCreature(CREATURE_SPOTLIGHT, x, y, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 50000);
if(Spotlight)
if (Creature* Spotlight = m_creature->SummonCreature(CREATURE_SPOTLIGHT, x, y, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 50000))
{
Spotlight->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Spotlight->CastSpell(Spotlight, SPELL_SPOTLIGHT, false);
@@ -180,8 +176,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
case 5:
if(pInstance)
{
GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT));
if(Door)
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
Door->SetGoState(1);
}
IsBeingEscorted = false;
@@ -192,43 +187,34 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
void Talk(uint32 count)
{
char* text = NULL;
uint32 sound = 0;
int32 text = 0;
switch(Event)
{
case EVENT_OZ:
if(OzDialogue[count].text)
text = OzDialogue[count].text;
if(OzDialogue[count].soundid)
sound = OzDialogue[count].soundid;
if (OzDialogue[count].textid)
text = OzDialogue[count].textid;
if(OzDialogue[count].timer)
TalkTimer = OzDialogue[count].timer;
break;
case EVENT_HOOD:
if(HoodDialogue[count].text)
text = HoodDialogue[count].text;
if(HoodDialogue[count].soundid)
sound = HoodDialogue[count].soundid;
if (HoodDialogue[count].textid)
text = HoodDialogue[count].textid;
if(HoodDialogue[count].timer)
TalkTimer = HoodDialogue[count].timer;
break;
case EVENT_RAJ:
if(RAJDialogue[count].text)
text = RAJDialogue[count].text;
if(RAJDialogue[count].soundid)
sound = RAJDialogue[count].soundid;
if (RAJDialogue[count].textid)
text = RAJDialogue[count].textid;
if(RAJDialogue[count].timer)
TalkTimer = RAJDialogue[count].timer;
break;
}
if(text)
DoYell(text, LANG_UNIVERSAL, 0);
if(sound)
DoPlaySoundToSet(m_creature, sound);
DoScriptText(text, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -241,8 +227,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
{
if(TalkCount > 3)
{
Unit* Spotlight = Unit::GetUnit((*m_creature), SpotlightGUID);
if(Spotlight)
if (Unit* Spotlight = Unit::GetUnit((*m_creature), SpotlightGUID))
{
Spotlight->RemoveAllAuras();
Spotlight->SetVisibility(VISIBILITY_OFF);
@@ -257,13 +242,13 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK);
Talk(TalkCount);
++TalkCount;
}
else TalkTimer -= diff;
}else TalkTimer -= diff;
}
if(PerformanceReady)
{
if(CurtainTimer)
{
if(CurtainTimer <= diff)
{
PrepareEncounter();
@@ -271,12 +256,12 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
if(!pInstance)
return;
GameObject* Curtain = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS));
if(Curtain)
if (GameObject* Curtain = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS)))
Curtain->SetGoState(0);
CurtainTimer = 0;
}else CurtainTimer -= diff;
}
if(!RaidWiped)
{
@@ -324,8 +309,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
pInstance->SetData(DATA_OPERA_EVENT, IN_PROGRESS);
GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT));
if(Door)
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
Door->SetGoState(0);
m_creature->CastSpell(m_creature, SPELL_TUXEDO, true);
@@ -361,8 +345,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
{
uint32 entry = ((uint32)Spawns[index][0]);
float PosX = Spawns[index][1];
Creature* pCreature = m_creature->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
if(pCreature)
if (Creature* pCreature = m_creature->SummonCreature(entry, PosX, SPAWN_Y, SPAWN_Z, SPAWN_O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000))
{
// In case database has bad flags
pCreature->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
@@ -398,9 +381,7 @@ bool GossipHello_npc_barnes(Player* player, Creature* _Creature)
player->SEND_GOSSIP_MENU(8970, _Creature->GetGUID());
else
player->SEND_GOSSIP_MENU(8975, _Creature->GetGUID());
}
else
player->SEND_GOSSIP_MENU(8978, _Creature->GetGUID());
}else player->SEND_GOSSIP_MENU(8978, _Creature->GetGUID());
return true;
}
@@ -15,7 +15,7 @@
*/
/* ScriptData
SDName: boss_felblood_kaelthas
SDName: Boss_Felblood_Kaelthas
SD%Complete: 80
SDComment: Normal and Heroic Support. Issues: Arcane Spheres do not initially follow targets. TODO: Convert Phoenix to ACID.
SDCategory: Magisters' Terrace
@@ -26,6 +26,14 @@ EndScriptData */
#include "WorldPacket.h"
#include "ObjectMgr.h"
#define SAY_AGGRO -1585023 //This yell should be done when the room is cleared. For now, set it as aggro yell.
#define SAY_PHOENIX -1585024
#define SAY_FLAMESTRIKE -1585025
#define SAY_GRAVITY_LAPSE -1585026
#define SAY_TIRED -1585027
#define SAY_RECAST_GRAVITY -1585028
#define SAY_DEATH -1585029
/*** Spells ***/
// Phase 1 spells
@@ -60,28 +68,6 @@ EndScriptData */
#define CREATURE_PHOENIX_EGG 24675
#define CREATURE_ARCANE_SPHERE 24708
/*** Dialogues ***/
#define SAY_AGGRO "Don't look so smug! I know what you're thinking, but Tempest Keep was merely a set back. Did you honestly believe I would trust the future to some blind, half-night elf mongrel? Oh no, he was merely an instrument, a stepping stone to a much larger plan! It has all led to this, and this time, you will not interfere!"
#define SOUND_AGGRO 12413 // This yell should be done when the room is cleared. For now, set it as aggro yell.
#define SAY_PHOENIX "Vengeance burns!"
#define SOUND_PHOENIX 12415
#define SAY_FLAMESTRIKE "Felomin ashal!"
#define SOUND_FLAMESTRIKE 12417
#define SAY_GRAVITY_LAPSE "I'll turn your world... upside... down..."
#define SOUND_GRAVITY_LAPSE 12418
#define SAY_TIRED "Master... grant me strength."
#define SOUND_TIRED 12419
#define SAY_RECAST_GRAVITY "Do not... get too comfortable."
#define SOUND_RECAST_GRAVITY 12420
#define SAY_DEATH "My demise accomplishes nothing! The Master will have you! You will drown in your own blood! This world shall burn! Aaaghh!"
#define SOUND_DEATH 12421
/** Locations **/
float KaelLocations[6][2]=
{
@@ -100,7 +86,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
Heroic = c->GetMap()->IsHeroic() ? true : false;
Heroic = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
@@ -171,8 +157,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
void JustDied(Unit *killer)
{
RemoveGravityLapse();
DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
}
@@ -185,15 +170,15 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS);
}
void SetThreatList(Creature* SummonedUnit)
{
if(!SummonedUnit) return;
if(!SummonedUnit)
return;
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
std::list<HostilReference*>::iterator i = m_threatlist.begin();
@@ -316,18 +301,18 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
// *Heroic mode only:
if(Heroic)
{
if(PyroblastTimer < diff)
{
DoCast(m_creature, SPELL_SHOCK_BARRIER, true);
DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
PyroblastTimer = 60000;
}else PyroblastTimer -= diff;
{
DoCast(m_creature, SPELL_SHOCK_BARRIER, true);
DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
PyroblastTimer = 60000;
}else PyroblastTimer -= diff;
}
if(FireballTimer < diff)
{
// *Normal/Heroic mode support
if(Heroic) DoCast(m_creature->getVictim(), SPELL_FIREBALL_HEROIC);
else DoCast(m_creature->getVictim(), SPELL_FIREBALL_NORMAL);
DoCast(m_creature->getVictim(), Heroic ? SPELL_FIREBALL_HEROIC : SPELL_FIREBALL_NORMAL);
FireballTimer = 2000 + rand()%4000;
}else FireballTimer -= diff;
@@ -356,23 +341,20 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
}
}
DoYell(SAY_PHOENIX, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_PHOENIX);
DoScriptText(SAY_PHOENIX, m_creature);
PhoenixTimer = 40000;
}else PhoenixTimer -= diff;
if(FlameStrikeTimer < diff)
{
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
m_creature->InterruptNonMeleeSpells(false);
DoCast(target, SPELL_FLAMESTRIKE3, true);
FlameStrikeTimer = 20000 + rand()%5000;
DoScriptText(SAY_FLAMESTRIKE, m_creature);
DoYell(SAY_FLAMESTRIKE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_FLAMESTRIKE);
FlameStrikeTimer = 20000 + rand()%5000;
}
}else FlameStrikeTimer -= diff;
@@ -401,8 +383,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
case 0:
if(FirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse
{
DoYell(SAY_GRAVITY_LAPSE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_GRAVITY_LAPSE);
DoScriptText(SAY_GRAVITY_LAPSE, m_creature);
FirstGravityLapse = false;
if(pInstance)
{
@@ -413,8 +394,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
}
}else
{
DoYell(SAY_RECAST_GRAVITY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RECAST_GRAVITY);
DoScriptText(SAY_RECAST_GRAVITY, m_creature);
}
m_creature->StopMoving();
DoCast(m_creature, SPELL_GRAVITY_LAPSE_INITIAL);
@@ -468,8 +448,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
case 4:
m_creature->InterruptNonMeleeSpells(false);
DoYell(SAY_TIRED,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_TIRED);
DoScriptText(SAY_TIRED, m_creature);
DoCast(m_creature, SPELL_POWER_FEEDBACK);
RemoveGravityLapse();
GravityLapseTimer = 10000;
@@ -488,7 +467,7 @@ struct TRINITY_DLL_DECL mob_felkael_flamestrikeAI : public ScriptedAI
mob_felkael_flamestrikeAI(Creature *c) : ScriptedAI(c)
{
Reset();
Heroic = c->GetMap()->IsHeroic() ? true : false;
Heroic = c->GetMap()->IsHeroic();
}
uint32 FlameStrikeTimer;
@@ -510,9 +489,7 @@ struct TRINITY_DLL_DECL mob_felkael_flamestrikeAI : public ScriptedAI
{
if(FlameStrikeTimer < diff)
{
// *Normal/Heroic mode support
if(Heroic) DoCast(m_creature, SPELL_FLAMESTRIKE1_HEROIC, true);
else DoCast(m_creature, SPELL_FLAMESTRIKE1_NORMAL, true);
DoCast(m_creature, Heroic ? SPELL_FLAMESTRIKE1_HEROIC : SPELL_FLAMESTRIKE1_NORMAL, true);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}else FlameStrikeTimer -= diff;
}
@@ -24,34 +24,30 @@ EndScriptData */
#include "precompiled.h"
#include "def_magisters_terrace.h"
#define SAY_AGGRO "Annihilate them!"
#define SOUND_AGGRO 12395
struct Speech
{
const char* text;
uint32 sound;
int32 id;
};
static Speech LackeyDeath[]=
{
{"Oh, the horror.", 12398},
{"Well, aren't you lucky?", 12400},
{"Now I'm getting annoyed.", 12401},
{"Lackies be damned! I'll finish you myself!", 12403},
{-1585013},
{-1585014},
{-1585015},
{-1585016},
};
static Speech PlayerDeath[]=
{
{"I call that a good start.", 12405},
{"I could have sworn there were more of you.", 12407},
{"Not really much of a group, anymore, is it?", 12409},
{"One is such a lonely number", 12410},
{"It's been a kick, really", 12411},
{-1585017},
{-1585018},
{-1585019},
{-1585020},
{-1585021},
};
#define SAY_DEATH "Not what I had... planned..."
#define SOUND_DEATH 12397
#define SAY_AGGRO -1585012
#define SAY_DEATH -1585022
#define SPELL_DISPEL_MAGIC 27609
#define SPELL_FLASH_HEAL 17843
@@ -146,14 +142,12 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
if (m_creature->isDead())
pInstance->SetData(DATA_DELRISSA_EVENT, DONE);
else pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED);
}
else error_log(ERROR_INST_DATA);
}else error_log(ERROR_INST_DATA);
}
void Aggro(Unit* who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
for(uint8 i = 0; i < Adds.size(); ++i)
if(Unit* pAdd = Unit::GetUnit(*m_creature, Adds[i]->guid))
@@ -215,8 +209,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
if(victim->GetTypeId() != TYPEID_PLAYER || m_creature->isDead())
return;
DoYell(PlayerDeath[PlayersKilled].text, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, PlayerDeath[PlayersKilled].sound);
DoScriptText(PlayerDeath[PlayersKilled].id, m_creature);
if( PlayersKilled < 4 )
++PlayersKilled;
}
@@ -225,8 +218,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
{
if(m_creature->isDead())//no sense to talk if dead..
return;
DoYell(LackeyDeath[LackeysKilled].text, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, LackeyDeath[LackeysKilled].sound);
DoScriptText(LackeyDeath[LackeysKilled].id, m_creature);
if( LackeysKilled < 3 )
++LackeysKilled;
@@ -235,8 +227,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
CheckLootable();
@@ -764,8 +755,7 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
if(Polymorph_Timer < diff)
{
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_POLYMORPH);
m_creature->getThreatManager().modifyThreatPercent(target,-100);
@@ -1132,15 +1122,9 @@ struct TRINITY_DLL_DECL boss_apokoAI : public boss_priestess_guestAI
{
switch(rand()%3)
{
case 0:
DoCast(m_creature, SPELL_WINDFURY_TOTEM);
break;
case 1:
DoCast(m_creature, SPELL_FIRE_NOVA_TOTEM);
break;
case 2:
DoCast(m_creature, SPELL_EARTHBIND_TOTEM);
break;
case 0: DoCast(m_creature, SPELL_WINDFURY_TOTEM); break;
case 1: DoCast(m_creature, SPELL_FIRE_NOVA_TOTEM); break;
case 2: DoCast(m_creature, SPELL_EARTHBIND_TOTEM); break;
}
++Totem_Amount;
Totem_Timer = Totem_Amount*2000;
@@ -24,23 +24,13 @@ EndScriptData */
#include "precompiled.h"
#include "def_magisters_terrace.h"
#define SAY_AGGRO "You only waste my time!"
#define SOUND_AGGRO 12378
#define SAY_ENERGY "My hunger knows no bounds! "
#define SOUND_ENERGY 12381
#define SAY_EMPOWERED "Yes! I am a god!"
#define SOUND_EMPOWERED 12382
#define SAY_KILL_1 "Enough distractions!"
#define SOUND_KILL_1 12388
#define SAY_KILL_2 "I am invincible!"
#define SOUND_KILL_2 12385
#define SAY_DEATH "No! More... I must have more!"
#define SOUND_DEATH 12383
#define SAY_AGGRO -1585000
#define SAY_ENERGY -1585001
#define SAY_EMPOWERED -1585002
#define SAY_KILL_1 -1585003
#define SAY_KILL_2 -1585004
#define SAY_DEATH -1585005
#define EMOTE_CRYSTAL -1585006
//Crystal efect spells
#define SPELL_FEL_CRYSTAL_COSMETIC 44374
@@ -78,7 +68,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
}
}
Reset();
Heroic = c->GetMap()->IsHeroic() ? true : false;
Heroic = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
@@ -163,8 +153,8 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
}
if( CrystalChosen )
{
DoYell(SAY_ENERGY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENERGY);
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_CRYSTAL, m_creature);
CrystalChosen->CastSpell(CrystalChosen, SPELL_FEL_CRYSTAL_COSMETIC, true);
@@ -195,8 +185,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
void Aggro(Unit* who)
{
m_creature->SetPower(POWER_MANA, 0);
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if( pInstance )
{
@@ -210,14 +199,8 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL_1);
break;
case 1:
DoYell(SAY_KILL_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL_2);
break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
}
}
@@ -245,8 +228,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if(!pInstance)
{
@@ -330,8 +312,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
IsDraining = false;
DrainingCrystal = false;
DoYell(SAY_EMPOWERED, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_EMPOWERED);
DoScriptText(SAY_EMPOWERED, m_creature);
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
if( CrystalChosen && CrystalChosen->isAlive() )
@@ -24,19 +24,13 @@ EndScriptData */
#include "precompiled.h"
#include "def_magisters_terrace.h"
#define SAY_AGGRO "Drain...life..."
#define SOUND_AGGRO 12389
#define SAY_ENERGY "Un...con...tainable."
#define SOUND_ENERGY 12392
#define SAY_OVERLOAD "Un...leash..."
#define SOUND_OVERLOAD 12390
#define SAY_KILL "Con...sume."
#define SOUND_KILL 12393
#define SAY_DEATH "What...happen...ed."
#define SAY_AGGRO -1585007
#define SAY_ENERGY -1585008
#define SAY_OVERLOAD -1585009
#define SAY_KILL -1585010
#define EMOTE_DISCHARGE_ENERGY -1585011
//is this text for real?
#define SAY_DEATH "What...happen...ed."
//Pure energy spell info
#define SPELL_ENERGY_BOLT 44342
@@ -58,7 +52,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
Heroic = c->GetMap()->IsHeroic() ? true : false;
Heroic = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
@@ -91,8 +85,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
void KilledUnit(Unit *victim)
{
DoYell(SAY_KILL, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(victim, SOUND_KILL);
DoScriptText(SAY_KILL, m_creature);
}
void JustDied(Unit *victim)
@@ -111,8 +104,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if (pInstance)
pInstance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS);
}
@@ -132,8 +124,8 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
//used for check, when Vexallus cast adds 85%, 70%, 55%, 40%, 25%
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < (100-(SpawnAddInterval*(AlreadySpawnedAmount+1))))
{
DoYell(SAY_ENERGY, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_ENERGY);
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_DISCHARGE_ENERGY, m_creature);
Creature* PureEnergyCreature = NULL;
PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, 10, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
Unit* target = NULL;
@@ -154,8 +146,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
if(ChainLightningTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CHAIN_LIGHTNING);
ChainLightningTimer = 10000;
}else ChainLightningTimer -= diff;
@@ -171,8 +162,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
{
if(OverloadTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_OVERLOAD);
OverloadTimer = 2200;
}else OverloadTimer -= diff;
@@ -35,10 +35,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
{
instance_magisters_terrace(Map* map) : ScriptedInstance(map)
{
Initialize();
}
instance_magisters_terrace(Map* map) : ScriptedInstance(map) {Initialize();}
uint32 DoorState[3];//0seline, 1vexallus, 2derlissa
uint32 Encounters[NUMBER_OF_ENCOUNTERS];
@@ -23,6 +23,8 @@ EndScriptData */
#include "precompiled.h"
#define EMOTE_SERVICE -1409000
#define SPELL_INFERNO 19695
#define SPELL_IGNITEMANA 19659
#define SPELL_LIVINGBOMB 20475
@@ -53,10 +55,11 @@ struct TRINITY_DLL_DECL boss_baron_geddonAI : public ScriptedAI
return;
//If we are <2% hp cast Armageddom
if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 2 && !m_creature->IsNonMeleeSpellCasted(false))
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 2)
{
m_creature->InterruptNonMeleeSpells(true);
DoCast(m_creature,SPELL_ARMAGEDDOM);
DoTextEmote("performs one last service for Ragnaros.",NULL);
DoScriptText(EMOTE_SERVICE, m_creature);
return;
}
@@ -70,9 +73,8 @@ struct TRINITY_DLL_DECL boss_baron_geddonAI : public ScriptedAI
//IgniteMana_Timer
if (IgniteMana_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target) DoCast(target,SPELL_IGNITEMANA);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_IGNITEMANA);
IgniteMana_Timer = 30000;
}else IgniteMana_Timer -= diff;
@@ -80,9 +82,8 @@ struct TRINITY_DLL_DECL boss_baron_geddonAI : public ScriptedAI
//LivingBomb_Timer
if (LivingBomb_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target) DoCast(target,SPELL_LIVINGBOMB);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIVINGBOMB);
LivingBomb_Timer = 35000;
}else LivingBomb_Timer -= diff;
@@ -85,11 +85,6 @@ struct TRINITY_DLL_DECL mob_fireswornAI : public ScriptedAI
void Reset()
{
Immolate_Timer = 4000; //These times are probably wrong
//m_creature->RemoveAllAuras();
//m_creature->DeleteThreatList();
//m_creature->CombatStop();
//DoGoHome();
}
void Aggro(Unit *who)
@@ -104,9 +99,7 @@ struct TRINITY_DLL_DECL mob_fireswornAI : public ScriptedAI
//Immolate_Timer
if (Immolate_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target)
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_IMMOLATE);
Immolate_Timer = 5000 + rand()%5000;
@@ -24,6 +24,8 @@ EndScriptData */
#include "precompiled.h"
#include "def_molten_core.h"
#define EMOTE_AEGIS -1409002
#define SPELL_MAGMASPLASH 13879
#define SPELL_PYROBLAST 20228
#define SPELL_EARTHQUAKE 19798
@@ -34,21 +36,19 @@ EndScriptData */
#define SPELL_MANGLE 19820
#define SPELL_AEGIS 20620 //This is self casted whenever we are below 50%
#define EMOTE_AEGIS "refuses to die while its master is in trouble"
struct TRINITY_DLL_DECL boss_golemaggAI : public ScriptedAI
{
boss_golemaggAI(Creature *c) : ScriptedAI(c)
{
pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL;
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
uint32 Pyroblast_Timer;
uint32 EarthQuake_Timer;
uint32 Enrage_Timer;
uint32 Buff_Timer;
ScriptedInstance *pInstance;
void Reset()
{
@@ -66,7 +66,7 @@ struct TRINITY_DLL_DECL boss_golemaggAI : public ScriptedAI
void JustDied(Unit* Killer)
{
ScriptedInstance *pInstance = (m_creature->GetInstanceData()) ? ((ScriptedInstance*)m_creature->GetInstanceData()) : NULL;
if(pInstance)
pInstance->SetData(DATA_GOLEMAGG_DEATH, 0);
}
@@ -78,9 +78,8 @@ struct TRINITY_DLL_DECL boss_golemaggAI : public ScriptedAI
//Pyroblast_Timer
if (Pyroblast_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target) DoCast(target,SPELL_PYROBLAST);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_PYROBLAST);
Pyroblast_Timer = 7000;
}else Pyroblast_Timer -= diff;
@@ -154,7 +153,7 @@ struct TRINITY_DLL_DECL mob_core_ragerAI : public ScriptedAI
if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 50 )
{
DoCast(m_creature,SPELL_AEGIS);
DoTextEmote(EMOTE_AEGIS, NULL);
DoScriptText(EMOTE_AEGIS, m_creature);
}
//Check_Timer
@@ -23,6 +23,8 @@ EndScriptData */
#include "precompiled.h"
#define EMOTE_FRENZY -1409001
#define SPELL_FRENZY 19451
#define SPELL_MAGMASPIT 19449 //This is actually a buff he gives himself
#define SPELL_PANIC 19408
@@ -58,7 +60,7 @@ struct TRINITY_DLL_DECL boss_magmadarAI : public ScriptedAI
//Frenzy_Timer
if (Frenzy_Timer < diff)
{
DoTextEmote("goes into a killing frenzy!",NULL);
DoScriptText(EMOTE_FRENZY, m_creature);
DoCast(m_creature,SPELL_FRENZY);
Frenzy_Timer = 15000;
}else Frenzy_Timer -= diff;
@@ -15,7 +15,7 @@
*/
/* ScriptData
SDName: Boss_MajorDomo_Executus
SDName: Boss_Majordomo_Executus
SD%Complete: 30
SDComment: Correct spawning and Event NYI
SDCategory: Molten Core
@@ -23,35 +23,43 @@ EndScriptData */
#include "precompiled.h"
#define SPELL_MAGICREFLECTION 20619
#define SPELL_DAMAGEREFLECTION 21075
#define SAY_AGGRO -1409003
#define SAY_SPAWN -1409004
#define SAY_SLAY -1409005
#define SAY_SPECIAL -1409006
#define SAY_DEFEAT -1409007
#define SAY_SUMMON_MAJ -1409008
#define SAY_ARRIVAL1_RAG -1409009
#define SAY_ARRIVAL2_MAJ -1409010
#define SAY_ARRIVAL3_RAG -1409011
#define SAY_ARRIVAL5_RAG -1409012
#define SPAWN_RAG_X 838.51
#define SPAWN_RAG_Y -829.84
#define SPAWN_RAG_Z -232.00
#define SPAWN_RAG_O 1.70
#define SPELL_MAGIC_REFLECTION 20619
#define SPELL_DAMAGE_REFLECTION 21075
#define SPELL_BLASTWAVE 20229
#define SPELL_AEGIS 20620 //This is self casted whenever we are below 50%
#define SPELL_TELEPORT 20618
#define SPELL_SUMMON_RAGNAROS 19774
#define SAY_AGGRO "Reckless mortals, none may challenge the sons of the living flame!"
#define SOUND_AGGRO 8035
#define SAY_SPAWN "The runes of warding have been destroyed! Hunt down the infedels my bretheren."
#define SOUND_SPAWN 8039
#define SAY_DEFEAT "Impossible! Stay your attack mortals! I submitt! I submitt! Brashly you have come to rest the secrets of the living flame. You will soon regret the recklessness of your quest. I go now to summon the lord whos house this is. Should you seek an audiance with him your paltry lives will surly be forfit. Nevertheless seek out his lair if you dare!"
#define SOUND_DEFEAT 8038
#define SAY_KILL "Ashes to Ashes!"
#define SOUND_KILL 8037
#define SAY_SPECIAL "Burn mortals! Burn for this transgression!"
#define SOUND_SPECIAL 8036
#define SAY_SUMMON "Behold Ragnaros, the Firelord! He who was ancient when this world was young! Bow before him, mortals! Bow before your ending!"
#define SOUND_SUMMON 8040
#define SAY_ARRIVAL1 "These mortal infidels, my lord! They have invaded your sanctum, and seek to steal your secrets!"
#define SOUND_ARRIVAL1 8041
#define ENTRY_FLAMEWALKER_HEALER 11663
#define ENTRY_FLAMEWALKER_ELITE 11664
struct TRINITY_DLL_DECL boss_majordomoAI : public ScriptedAI
{
boss_majordomoAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_majordomoAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance* pInstance;
uint32 MagicReflection_Timer;
uint32 DamageReflection_Timer;
@@ -69,14 +77,12 @@ struct TRINITY_DLL_DECL boss_majordomoAI : public ScriptedAI
if (rand()%5)
return;
DoYell(SAY_KILL,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL);
DoScriptText(SAY_SLAY, m_creature);
}
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -23,6 +23,13 @@ EndScriptData */
#include "precompiled.h"
#define SAY_REINFORCEMENTS1 -1409013
#define SAY_REINFORCEMENTS2 -1409014
#define SAY_HAND -1409015
#define SAY_WRATH -1409016
#define SAY_KILL -1409017
#define SAY_MAGMABURST -1409018
#define SPELL_HANDOFRAGNAROS 19780
#define SPELL_WRATHOFRAGNAROS 20566
#define SPELL_LAVABURST 21158
@@ -36,26 +43,6 @@ EndScriptData */
#define SPELL_ELEMENTALFIRE 20564
#define SPELL_ERRUPTION 17731
#define SAY_ARRIVAL_1 "TOO SOON! YOU HAVE AWAKENED ME TOO SOON, EXECUTUS! WHAT IS THE MEANING OF THIS INTRUSION?"
#define SAY_ARRIVAL_3 "FOOL! YOU ALLOWED THESE INSECTS TO RUN RAMPANT THROUGH THE HALLOWED CORE, AND NOW YOU LEAD THEM TO MY VERY LAIR? YOU HAVE FAILED ME, EXECUTUS! JUSTICE SHALL BE MET, INDEED!"
#define SAY_ARRIVAL_5 "NOW FOR YOU, INSECTS. BOLDLY YOU SAUGHT THE POWER OF RAGNAROS NOW YOU SHALL SEE IT FIRST HAND."
#define SAY_REINFORCEMENTS1 "COME FORTH, MY SERVANTS! DEFEND YOUR MASTER!"
#define SAY_REINFORCEMENTS2 "YOU CANNOT DEFEAT THE LIVING FLAME! COME YOU MINIONS OF FIRE! COME FORTH YOU CREATURES OF HATE! YOUR MASTER CALLS!"
#define SAY_HAND "BY FIRE BE PURGED!"
#define SAY_WRATH "TASTE THE FLAMES OF SULFURON!"
#define SAY_KILL "DIE INSECT!"
#define SAY_MAGMABURST "MY PATIENCE IS DWINDILING! COME NATS TO YOUR DEATH!"
#define SOUND_ARRIVAL_1 8043
#define SOUND_ARRIVAL_3 8044
#define SOUND_ARRIVAL_5 8045
#define SOUND_REINFORCEMENTS1 8049
#define SOUND_REINFORCEMENTS2 8050
#define SOUND_HAND 8046
#define SOUND_WRATH 8047
#define SOUND_KILL 8051
#define SOUND_MAGMABURST 8048
#define ADD_1X 848.740356
#define ADD_1Y -816.103455
#define ADD_1Z -229.74327
@@ -137,14 +124,11 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (rand()%5)
return;
DoYell(SAY_KILL, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL);
DoScriptText(SAY_KILL, m_creature);
}
void Aggro(Unit *who)
{
DoYell(SAY_ARRIVAL_5,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_ARRIVAL_5);
}
void UpdateAI(const uint32 diff)
@@ -174,8 +158,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (rand()%2 == 0)
{
DoYell(SAY_WRATH,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_WRATH);
DoScriptText(SAY_WRATH, m_creature);
}
WrathOfRagnaros_Timer = 30000;
@@ -188,8 +171,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (rand()%2==0)
{
DoYell(SAY_HAND,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_HAND);
DoScriptText(SAY_HAND, m_creature);
}
HandOfRagnaros_Timer = 25000;
@@ -235,8 +217,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (!HasSubmergedOnce)
{
DoYell(SAY_REINFORCEMENTS1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_REINFORCEMENTS1);
DoScriptText(SAY_REINFORCEMENTS1, m_creature);
// summon 10 elementals
Unit* target = NULL;
@@ -254,8 +235,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
}else
{
DoYell(SAY_REINFORCEMENTS2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_REINFORCEMENTS2);
DoScriptText(SAY_REINFORCEMENTS2, m_creature);
Unit* target = NULL;
for(int i = 0; i < 9;i++)
@@ -292,8 +272,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (!HasYelledMagmaBurst)
{
//Say our dialog
DoYell(SAY_MAGMABURST,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_MAGMABURST);
DoScriptText(SAY_MAGMABURST, m_creature);
HasYelledMagmaBurst = true;
}
@@ -24,6 +24,8 @@ EndScriptData */
#include "precompiled.h"
#include "def_molten_core.h"
#define ENCOUNTERS 9
#define ID_LUCIFRON 12118
#define ID_MAGMADAR 11982
#define ID_GEHENNAS 12259
@@ -36,24 +38,20 @@ EndScriptData */
#define ID_RAGNAROS 11502
#define ID_FLAMEWAKERPRIEST 11662
class TRINITY_DLL_SPEC instance_molten_core : public ScriptedInstance
struct TRINITY_DLL_DECL instance_molten_core : public ScriptedInstance
{
public:
instance_molten_core(Map *map) : ScriptedInstance(map) {}
instance_molten_core(Map *map) : ScriptedInstance(map) {Initialize();};
uint64 Lucifron, Magmadar, Gehennas, Garr, Geddon, Shazzrah, Sulfuron, Golemagg, Domo, Ragnaros, FlamewakerPriest;
uint64 RuneGUID[8];
uint64 RuneKoro, RuneZeth, RuneMazj, RuneTheri, RuneBlaz, RuneKress, RuneMohn;
//If all Bosses are dead.
bool IsBossDied[9];
uint32 CheckTimer;
uint32 Encounter[ENCOUNTERS];
//On creation, NOT load.
void Initialize()
{
//Clear all GUIDs
Lucifron = 0;
Magmadar = 0;
Gehennas = 0;
@@ -66,14 +64,13 @@ class TRINITY_DLL_SPEC instance_molten_core : public ScriptedInstance
Ragnaros = 0;
FlamewakerPriest = 0;
RuneGUID[0] = 0;
RuneGUID[1] = 0;
RuneGUID[2] = 0;
RuneGUID[3] = 0;
RuneGUID[4] = 0;
RuneGUID[5] = 0;
RuneGUID[6] = 0;
RuneGUID[7] = 0;
RuneKoro = 0;
RuneZeth = 0;
RuneMazj = 0;
RuneTheri = 0;
RuneBlaz = 0;
RuneKress = 0;
RuneMohn = 0;
IsBossDied[0] = false;
IsBossDied[1] = false;
@@ -86,38 +83,49 @@ class TRINITY_DLL_SPEC instance_molten_core : public ScriptedInstance
IsBossDied[7] = false;
IsBossDied[8] = false;
CheckTimer = 10000;
}
//Called every map update
void Update(uint32 diff)
{
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
if (CheckTimer < diff)
{
//Check if all bosses are dead and activate Major Domo
}else CheckTimer -= diff;
}
//Used by the map's CanEnter function.
//This is to prevent players from entering during boss encounters.
bool IsEncounterInProgress() const
{
return false;
};
//Called when a gameobject is created
void OnObjectCreate(GameObject *obj)
void OnObjectCreate(GameObject *go)
{
//Still searching for the individual rune ids.
//Currently they don't exist within most databases and are hard to find on websites
switch(go->GetEntry())
{
case 176951: //Sulfuron
RuneKoro = go->GetGUID();
break;
case 176952: //Geddon
RuneZeth = go->GetGUID();
break;
case 176953: //Shazzrah
RuneMazj = go->GetGUID();
break;
case 176954: //Golemagg
RuneTheri = go->GetGUID();
break;
case 176955: //Garr
RuneBlaz = go->GetGUID();
break;
case 176956: //Magmadar
RuneKress = go->GetGUID();
break;
case 176957: //Gehennas
RuneMohn = go->GetGUID();
break;
}
}
//called on creature creation
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
//Store specific creatures based on entry id
switch (creature_entry)
{
case ID_LUCIFRON:
@@ -180,7 +188,7 @@ class TRINITY_DLL_SPEC instance_molten_core : public ScriptedInstance
}
return 0;
} // end GetData64
}
uint32 GetData(uint32 type)
{
@@ -235,16 +243,16 @@ class TRINITY_DLL_SPEC instance_molten_core : public ScriptedInstance
return 0;
}
void SetData(uint32 type, uint32 data)
{
if(type == DATA_GOLEMAGG_DEATH)
IsBossDied[7] = true;
}
void SetData(uint32 type, uint32 data)
{
if (type == DATA_GOLEMAGG_DEATH)
IsBossDied[7] = true;
}
};
InstanceData* GetInstance_instance_molten_core(Map *_Map)
InstanceData* GetInstance_instance_molten_core(Map *map)
{
return new instance_molten_core (_Map);
return new instance_molten_core (map);
}
void AddSC_instance_molten_core()
@@ -23,6 +23,12 @@ EndScriptData */
#include "precompiled.h"
#define SAY_AGGRO -1249000
#define SAY_KILL -1249001
#define SAY_PHASE_2_TRANS -1249002
#define SAY_PHASE_3_TRANS -1249003
#define EMOTE_BREATH -1249004
#define SPELL_WINGBUFFET 18500
#define SPELL_FLAMEBREATH 18435
#define SPELL_CLEAVE 19983
@@ -38,12 +44,6 @@ EndScriptData */
#define SPELL_SUMMONWHELP 17646
#define SAY_AGGRO "How fortuitous. Usually, I must leave my lair to feed."
#define SAY_KILL "Learn your place mortal!"
#define SAY_PHASE_2_TRANS "This meaningless exertion bores me. I'll incinerate you from above!"
#define SAY_PHASE_3_TRANS "It seems you'll need another lesson!"
#define EMOTE_BREATH "takes a deep breath..."
static float MovementLocations[7][3]=
{
{-65.8444, -213.809, -60.2985},
@@ -99,13 +99,13 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
void Aggro(Unit* who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
}
void KilledUnit(Unit *victim)
{
DoYell(SAY_KILL, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_KILL, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -120,7 +120,7 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
DoYell(SAY_PHASE_2_TRANS, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_PHASE_2_TRANS, m_creature);
}
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (Phase == 2))
@@ -128,7 +128,7 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
Phase = 3;
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
DoYell(SAY_PHASE_3_TRANS, LANG_UNIVERSAL, NULL);
DoScriptText(SAY_PHASE_3_TRANS, m_creature);
}
if(Phase == 1 || Phase == 3)
@@ -181,7 +181,7 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
m_creature->GetMotionMaster()->MovePoint(0, MovementLocations[random][0], MovementLocations[random][1], MovementLocations[random][2]);
else
{
DoTextEmote(EMOTE_BREATH, NULL);
DoScriptText(EMOTE_BREATH, m_creature);
DoCast(m_creature->getVictim(), SPELL_DEEPBREATH);
}
MovementTimer = 25000;
@@ -22,3 +22,5 @@ SDCategory: Ruins of Ahn'Qiraj
EndScriptData */
#include "precompiled.h"
#define EMOTE_TARGET -1509002
@@ -23,14 +23,15 @@ EndScriptData */
#include "precompiled.h"
#define EMOTE_AGGRO -1509000
#define EMOTE_MANA_FULL -1509001
#define SPELL_TRAMPLE 15550
#define SPELL_DRAINMANA 27256
#define SPELL_ARCANEERUPTION 25672
#define SPELL_SUMMONMANA 25681
#define SPELL_GRDRSLEEP 24360 //Greater Dreamless Sleep
#define SAY_MANA "moam bristles with energy!"
struct TRINITY_DLL_DECL boss_moamAI : public ScriptedAI
{
boss_moamAI(Creature *c) : ScriptedAI(c) {Reset();}
@@ -53,6 +54,7 @@ struct TRINITY_DLL_DECL boss_moamAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(EMOTE_AGGRO, m_creature);
pTarget = who;
}
@@ -65,7 +67,7 @@ struct TRINITY_DLL_DECL boss_moamAI : public ScriptedAI
//if (j==1 && m_creature->GetMana()*100 / m_creature->GetMaxMana() == 100 && !m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature->getVictim(),SPELL_ARCANEERUPTION);
DoYell(SAY_MANA,LANG_UNIVERSAL,NULL);
DoScriptText(EMOTE_MANA_FULL, m_creature);
}
//If we are <50%HP cast MANA FIEND (Summon Mana) and Sleep
@@ -23,14 +23,15 @@ EndScriptData */
#include "precompiled.h"
//Ossirian
//8593 I am rejuvinated!
//8594 I have... failed
//8595 My powers are renewed!
//8596 My powers return!
//8597 Protect the city at all costs!
//8598 Sands of the desert rise and block out the sun!
//8599 The walls have been breached!
//8600 To your posts. Defend the city.
//8601 Tresspassers will be terminated.
//8602 You are terminated.
#define SAY_SURPREME2 -1509019
#define SAY_SURPREME3 -1509020
#define SAY_RAND_INTRO1 -1509021
#define SAY_RAND_INTRO2 -1509022
#define SAY_RAND_INTRO3 -1509023
#define SAY_RAND_INTRO4 -1509024 //possibly old?
#define SAY_AGGRO -1509025
#define SAY_SLAY -1509026
#define SAY_DEATH -1509027
@@ -23,20 +23,22 @@ EndScriptData */
#include "precompiled.h"
//Rajaxx
//8603 Attack and make them pay dearly!
//8604 Breath your last!
//8605 Crush them! Drive them out!
//8606 Do not hesitate! Destroy them!
//8613 Warriors! Captians! Continue the fight...
//8614 You are not worth my time $N!
//8612 The time of our retribution is at hand! Let darkness reign in the hearts of our enemies!
//8610 No longer will we wait behind barred doors and walls of stone! No longer will our vengeance be denied! The dragons themselves will tremble before our wrath!
//8608 Fear is for the enemy! Fear and death!
//8611 Staghelm will whimper and beg for his life, just as his whelp of a son did! One thousand years of injustice will end this day!
//8607 Fandral! Your time has come! Go and hide in the Emerald Dream and pray we never find you!
//8609 Impudent fool! I will kill you myself!
//Andorov - no sound
//"Remember, Rajaxx, when I said I'd kill you last? I lied..."
//"They come now. Try not to get yourself killed, young blood."
#define SAY_ANDOROV_INTRO -1509003
#define SAY_ANDOROV_ATTACK -1509004
#define SAY_WAVE3 -1509005
#define SAY_WAVE4 -1509006
#define SAY_WAVE5 -1509007
#define SAY_WAVE6 -1509008
#define SAY_WAVE7 -1509009
#define SAY_INTRO -1509010
#define SAY_UNK1 -1509011
#define SAY_UNK2 -1509012
#define SAY_UNK3 -1509013
#define SAY_UNK4 -1509014
#define SAY_DEAGGRO -1509015
#define SAY_KILLS_ANDOROV -1509016
#define SAY_COMPLETE_QUEST -1509017 //Yell when realm complete quest 8743 for world event
@@ -16,168 +16,91 @@
/* ScriptData
SDName: Boss_Herod
SD%Complete: 90
SDComment: Missing adds spawn at death
SD%Complete: 95
SDComment: Should in addition spawn Myrmidons in the hallway outside
SDCategory: Scarlet Monastery
EndScriptData */
#include "precompiled.h"
#include "../../npc/npc_escortAI.h"
#define SPELL_RUSHINGCHARGE 32021
#define SPELL_RUSHINGCHARGE1 6268
#define SAY_AGGRO -1189000
#define SAY_WHIRLWIND -1189001
#define SAY_ENRAGE -1189002
#define SAY_KILL -1189003
#define EMOTE_ENRAGE -1189004
#define SPELL_CLEAVE 11608
#define SPELL_RUSHINGCHARGE 8260
#define SPELL_CLEAVE 15496
#define SPELL_WHIRLWIND 8989
#define SPELL_SUNDERARMOR 16145
#define SPELL_REND 21949
#define SPELL_THUNDERCLAP 15588
#define SPELL_SLAM 11430
#define SPELL_BERSERKERSTANCE 2458
#define SPELL_ENRAGE 28747
#define SPELL_FIREBALL11 10151
#define SPELL_CONEOFCOLD5 10161
#define SPELL_FRENZY 8269
#define SAY_AGGRO "Ah, I have been waiting for a real challenge!"
#define SAY_WHIRLWIND "Blades of Light!"
#define SAY_ENRAGE "Light, give me strength!"
#define SAY_DEATH "Hah, is that all?"
#define SOUND_AGGRO 5830
#define SOUND_WHIRLWIND 5832
#define SOUND_ENRAGE 5833
#define SOUND_DEATH 5831
#define ENTRY_SCARLET_TRAINEE 6575
#define ENTRY_SCARLET_MYRMIDON 4295
struct TRINITY_DLL_DECL boss_herodAI : public ScriptedAI
{
boss_herodAI(Creature *c) : ScriptedAI(c) {Reset();}
uint32 Yell_Timer;
uint32 Enrage_Timer;
bool Enrage;
uint32 Cleave_Timer;
uint32 Whirlwind_Timer;
uint32 SunderArmor_Timer;
uint32 Rend_Timer;
uint32 ThunderClap_Timer;
uint32 Slam_Timer;
uint32 Fireball11_Timer;
uint32 ConeOfCold5_Timer;
void Reset()
{
Yell_Timer = 58000;
Enrage = false;
Cleave_Timer = 12000;
Whirlwind_Timer = 60000;
Enrage_Timer = 0;
Cleave_Timer = 15000;
SunderArmor_Timer = 40000;
Rend_Timer = 25000;
ThunderClap_Timer = 25000;
Slam_Timer = 20000;
Fireball11_Timer = 30000;
ConeOfCold5_Timer = 40000;
}
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
//Activate Berserker Stance
DoCast(m_creature,SPELL_BERSERKERSTANCE);
//Switch between 2 different charge methods
switch (rand()%2)
{
case 0:
DoCast(m_creature,SPELL_RUSHINGCHARGE);
break;
case 1:
DoCast(m_creature,SPELL_RUSHINGCHARGE1);
break;
}
DoScriptText(SAY_AGGRO, m_creature);
DoCast(m_creature,SPELL_RUSHINGCHARGE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
}
void JustDied(Unit* killer)
{
for(uint8 i = 0; i < 20; ++i)
m_creature->SummonCreature(ENTRY_SCARLET_TRAINEE, 1939.18, -431.58, 17.09, 6.22, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
}
void UpdateAI(const uint32 diff)
{
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//If we are <10% hp goes Enraged
if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10 && !m_creature->IsNonMeleeSpellCasted(false) && Enrage_Timer < diff)
{
DoYell(SAY_ENRAGE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_ENRAGE);
DoCast(m_creature,SPELL_ENRAGE);
//Shouldn't cast this agian
Enrage_Timer = diff;
//If we are <30% hp goes Enraged
if (!Enrage && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->IsNonMeleeSpellCasted(false))
{
DoScriptText(EMOTE_ENRAGE, m_creature);
DoScriptText(SAY_ENRAGE, m_creature);
DoCast(m_creature,SPELL_FRENZY);
Enrage = true;
}
//Cleave_Timer
if (Cleave_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CLEAVE);
Cleave_Timer = 15000;
Cleave_Timer = 12000;
}else Cleave_Timer -= diff;
//Yelling and Whirlwind casting
if (Yell_Timer < diff)
{
//Say Whirlwind monologe
DoYell(SAY_WHIRLWIND,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_WHIRLWIND);
Yell_Timer = 30000;
}else Yell_Timer -= diff;
// Whirlwind_Timer
if (Whirlwind_Timer < diff)
{
DoScriptText(SAY_WHIRLWIND, m_creature);
DoCast(m_creature->getVictim(),SPELL_WHIRLWIND);
Whirlwind_Timer = 30000;
}else Whirlwind_Timer -= diff;
//SunderArmor_Timer
if (SunderArmor_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SUNDERARMOR);
SunderArmor_Timer = 40000;
}else SunderArmor_Timer -= diff;
//Rend_Timer
if (Rend_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_REND);
Rend_Timer = 25000;
}else Rend_Timer -= diff;
//ThunderClap_Timer
if (ThunderClap_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_THUNDERCLAP);
ThunderClap_Timer = 20000;
}else ThunderClap_Timer -= diff;
//Slam_Timer
if (Slam_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SLAM);
Slam_Timer = 20000;
}else Slam_Timer -= diff;
//Fireball11_Timer
if (Fireball11_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FIREBALL11);
Fireball11_Timer = 30000;
}else Fireball11_Timer -= diff;
//ConeOfCold5_Timer
if (ConeOfCold5_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CONEOFCOLD5);
ConeOfCold5_Timer = 40000;
}else ConeOfCold5_Timer -= diff;
DoMeleeAttackIfReady();
}
};
@@ -187,11 +110,77 @@ CreatureAI* GetAI_boss_herod(Creature *_Creature)
return new boss_herodAI (_Creature);
}
float Location[12][3]=
{
{1945.81, -431.54, 16.36},
{1946.21, -436.41, 16.36},
{1950.01, -444.11, 14.63},
{1956.08, -449.34, 13.12},
{1966.59, -450.55, 11.27},
{1976.09, -447.51, 11.27},
{1983.42, -435.85, 11.27},
{1978.17, -428.81, 11.27},
{1973.97, -422.08, 9.04},
{1963.84, -418.90, 6.17},
{1961.22, -422.74, 6.17},
{1964.80, -431.26, 6.17}
};
uint32 Wait[12][1]=
{
{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{600000}
};
struct TRINITY_DLL_DECL mob_scarlet_traineeAI : public npc_escortAI
{
mob_scarlet_traineeAI(Creature *c) : npc_escortAI(c) {Reset();}
uint32 Start_Timer;
void WaypointReached(uint32 i) { }
void Reset()
{
Start_Timer = urand(1500,4500);
}
void Aggro(Unit* who) { }
void UpdateAI(const uint32 diff)
{
if (Start_Timer)
{
if (Start_Timer < diff)
{
Start(true,true,true);
Start_Timer = 0;
}else Start_Timer -= diff;
}
npc_escortAI::UpdateAI(diff);
}
};
CreatureAI* GetAI_mob_scarlet_trainee(Creature* _Creature)
{
mob_scarlet_traineeAI* thisAI = new mob_scarlet_traineeAI(_Creature);
for(uint32 i = 0; i < 12; ++i)
thisAI->AddWaypoint(i, Location[i][0], Location[i][1], Location[i][2], Wait[i][0]);
return ((CreatureAI*)thisAI);
}
void AddSC_boss_herod()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_herod";
newscript->GetAI = GetAI_boss_herod;
newscript->GetAI = &GetAI_boss_herod;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_scarlet_trainee";
newscript->GetAI = &GetAI_mob_scarlet_trainee;
newscript->RegisterSelf();
}
@@ -6,12 +6,12 @@
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
@@ -126,7 +126,7 @@ void AddSC_boss_high_inquisitor_fairbanks()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_high_inquisitor_fairbanks";
newscript->GetAI = GetAI_boss_high_inquisitor_fairbanks;
newscript->Name = "boss_high_inquisitor_fairbanks";
newscript->GetAI = &GetAI_boss_high_inquisitor_fairbanks;
newscript->RegisterSelf();
}
@@ -0,0 +1,323 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Boss_Mograine_And_Whitemane
SD%Complete: 75
SDComment: Event not implemented
SDCategory: Scarlet Monastery
EndScriptData */
#include "precompiled.h"
#include "def_scarlet_monastery.h"
#define SAY_MO_AGGRO -1189005
#define SAY_MO_KILL -1189006
#define SAY_MO_RESSURECTED -1189007
#define SAY_WH_INTRO -1189008
#define SAY_WH_KILL -1189009
#define SAY_WH_RESSURECT -1189010
#define SPELL_DIVINESHIELD2 1020
#define SPELL_CRUSADERSTRIKE5 35395
#define SPELL_HAMMEROFJUSTICE3 5589
#define SPELL_HOLYLIGHT6 3472
#define SPELL_CONSECRATION3 20922
#define SPELL_BLESSINGOFWISDOM 1044
#define SPELL_RETRIBUTIONAURA3 10299
#define SPELL_BLESSINGOFPROTECTION3 10278
#define SPELL_FLASHHEAL6 10916
struct TRINITY_DLL_DECL boss_scarlet_commander_mograineAI : public ScriptedAI
{
boss_scarlet_commander_mograineAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 Heal_Timer;
uint32 DivineShield2_Timer;
uint32 CrusaderStrike5_Timer;
uint32 HammerOfJustice3_Timer;
uint32 Consecration3_Timer;
uint32 BlessingOfWisdom_Timer;
uint32 BlessingOfProtection3_Timer;
void Reset()
{
Heal_Timer = 80000;
DivineShield2_Timer = 60000;
CrusaderStrike5_Timer = 20000;
HammerOfJustice3_Timer = 80000;
Consecration3_Timer = 30000;
BlessingOfWisdom_Timer = 45000;
BlessingOfProtection3_Timer = 45000;
}
void Aggro(Unit *who)
{
DoScriptText(SAY_MO_AGGRO, m_creature);
DoCast(m_creature,SPELL_RETRIBUTIONAURA3);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_MO_KILL, m_creature);
}
void UpdateAI(const uint32 diff)
{
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//If we are <50% hp cast Arcane Bubble and start casting SPECIAL Arcane Explosion
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->IsNonMeleeSpellCasted(false))
{
//heal_Timer
if (Heal_Timer < diff)
{
//Switch between 2 different charge methods
switch (rand()%2)
{
case 0:
DoCast(m_creature,SPELL_HOLYLIGHT6);
break;
case 1:
DoCast(m_creature,SPELL_FLASHHEAL6);
break;
}
return;
//60 seconds until we should cast this agian
Heal_Timer = 60000;
}else Heal_Timer -= diff;
}
//DivineShield2_Timer
if (DivineShield2_Timer < diff)
{
DoCast(m_creature,SPELL_DIVINESHIELD2);
DivineShield2_Timer = 60000;
}else DivineShield2_Timer -= diff;
//CrusaderStrike5_Timer
if (CrusaderStrike5_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CRUSADERSTRIKE5);
CrusaderStrike5_Timer = 20000;
}else CrusaderStrike5_Timer -= diff;
//HammerOfJustice3_Timer
if (HammerOfJustice3_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_HAMMEROFJUSTICE3);
HammerOfJustice3_Timer = 30000;
}else HammerOfJustice3_Timer -= diff;
//Consecration3_Timer
if (Consecration3_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CONSECRATION3);
Consecration3_Timer = 20000;
}else Consecration3_Timer -= diff;
//BlessingOfWisdom_Timer
if (BlessingOfWisdom_Timer < diff)
{
DoCast(m_creature,SPELL_BLESSINGOFWISDOM);
BlessingOfWisdom_Timer = 45000;
}else BlessingOfWisdom_Timer -= diff;
//BlessingOfProtection3_Timer
if (BlessingOfProtection3_Timer < diff)
{
DoCast(m_creature,SPELL_BLESSINGOFPROTECTION3);
BlessingOfProtection3_Timer = 50000;
}else BlessingOfProtection3_Timer -= diff;
DoMeleeAttackIfReady();
}
};
#define SPELL_DEEPSLEEP 9256
#define SPELL_SCARLETRESURRECTION 9232
#define SPELL_CRUSADERSTRIKE 17281
#define SPELL_HAMMEROFJUSTICE 13005
#define SPELL_HOLYSMITE6 9481
#define SPELL_HOLYFIRE5 15265
#define SPELL_MINDBLAST6 8106
#define SPELL_POWERWORDSHIELD 6065
#define SPELL_RENEW 6078
#define SPELL_FLASHHEAL6 10916
struct TRINITY_DLL_DECL boss_high_inquisitor_whitemaneAI : public ScriptedAI
{
boss_high_inquisitor_whitemaneAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 Healing_Timer;
uint32 Renew_Timer;
uint32 PowerWordShield_Timer;
uint32 CrusaderStrike_Timer;
uint32 HammerOfJustice_Timer;
uint32 HolySmite6_Timer;
uint32 HolyFire5_Timer;
uint32 MindBlast6_Timer;
void Reset()
{
Healing_Timer = 0;
Renew_Timer= 0;
PowerWordShield_Timer = 2000;
CrusaderStrike_Timer = 12000;
HammerOfJustice_Timer = 18000;
HolySmite6_Timer = 10000;
HolyFire5_Timer = 20000;
MindBlast6_Timer = 6000;
}
void Aggro(Unit *who)
{
DoScriptText(SAY_WH_INTRO, m_creature);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_WH_KILL, m_creature);
}
void UpdateAI(const uint32 diff)
{
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
/*
//This is going to be a routine to make the resurrection event...
if (m_creature->isAlive && m_creature->isAlive)
{
m_creature->Relocate(1163.113370,1398.856812,32.527786,3.171014);
DoScriptText(SAY_WH_RESSURECT, m_creature);
DoCast(m_creature->getVictim(),SPELL_DEEPSLEEP);
DoCast(m-creature->GetGUID(51117),SPELL_SCARLETRESURRECTION)
}
*/
//If we are <75% hp cast healing spells at self and Mograine
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 75 )
{
if (Healing_Timer < diff)
{
DoCast(m_creature,SPELL_FLASHHEAL6);
return;
//22-32 seconds until we should cast this agian
Healing_Timer = 22000 + rand()%10000;
}else Healing_Timer -= diff;
}
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30)
{
if (Renew_Timer < diff)
{
DoCast(m_creature,SPELL_RENEW);
Renew_Timer = 30000;
}else Renew_Timer -= diff;
}
//PowerWordShield_Timer
if (PowerWordShield_Timer < diff)
{
DoCast(m_creature,SPELL_POWERWORDSHIELD);
PowerWordShield_Timer = 25000;
}else PowerWordShield_Timer -= diff;
//CrusaderStrike_Timer
if (CrusaderStrike_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CRUSADERSTRIKE);
CrusaderStrike_Timer = 15000;
}else CrusaderStrike_Timer -= diff;
//HammerOfJustice_Timer
if (HammerOfJustice_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_HAMMEROFJUSTICE);
HammerOfJustice_Timer = 12000;
}else HammerOfJustice_Timer -= diff;
//HolySmite6_Timer
if (HolySmite6_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_HOLYSMITE6);
HolySmite6_Timer = 10000;
}else HolySmite6_Timer -= diff;
//HolyFire5_Timer
if (HolyFire5_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_HOLYFIRE5);
HolyFire5_Timer = 15000;
}else HolyFire5_Timer -= diff;
//MindBlast6_Timer
if (MindBlast6_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_MINDBLAST6);
MindBlast6_Timer = 8000;
}else MindBlast6_Timer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_scarlet_commander_mograine(Creature *_Creature)
{
return new boss_scarlet_commander_mograineAI (_Creature);
}
CreatureAI* GetAI_boss_high_inquisitor_whitemane(Creature *_Creature)
{
return new boss_high_inquisitor_whitemaneAI (_Creature);
}
void AddSC_boss_mograine_and_whitemane()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_scarlet_commander_mograine";
newscript->GetAI = &GetAI_boss_scarlet_commander_mograine;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "boss_high_inquisitor_whitemane";
newscript->GetAI = &GetAI_boss_high_inquisitor_whitemane;
newscript->RegisterSelf();
}
@@ -5,6 +5,11 @@
#ifndef DEF_SCARLET_M
#define DEF_SCARLET_M
#define DATA_HORSEMAN_EVENT 1
#define GAMEOBJECT_PUMPKIN_SHRINE 2
#define TYPE_MOGRAINE_AND_WHITE_EVENT 1
#define DATA_MOGRAINE 2
#define DATA_WHITEMANE 3
#define DATA_DOOR_WHITEMANE 4
#define DATA_HORSEMAN_EVENT 5
#define GAMEOBJECT_PUMPKIN_SHRINE 6
#endif
@@ -1,3 +1,25 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Instance_Scarlet_Monastery
SD%Complete: 50
SDComment:
SDCategory: Scarlet Monastery
EndScriptData */
#include "precompiled.h"
#include "def_scarlet_monastery.h"
@@ -8,6 +30,8 @@
#define ENTRY_HEAD 23775
#define ENTRY_PUMPKIN 23694
#define ENCOUNTERS 1
struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
{
instance_scarlet_monastery(Map *Map) : ScriptedInstance(Map) {Initialize();};
@@ -17,20 +41,33 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
uint64 HeadGUID;
std::set<uint64> HorsemanAdds;
uint64 MograineGUID;
uint64 WhitemaneGUID;
uint64 DoorHighInquisitorGUID;
uint32 Encounter[ENCOUNTERS];
void Initialize()
{
PumpkinShrineGUID = 0;
HorsemanGUID = 0;
HeadGUID = 0;
HorsemanAdds.clear();
MograineGUID = 0;
WhitemaneGUID = 0;
DoorHighInquisitorGUID = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
}
void OnObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
case ENTRY_PUMPKIN_SHRINE:
PumpkinShrineGUID = go->GetGUID();break;
case ENTRY_PUMPKIN_SHRINE: PumpkinShrineGUID = go->GetGUID();break;
case 104600: DoorHighInquisitorGUID = go->GetGUID(); break;
}
}
@@ -41,6 +78,8 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
case ENTRY_HORSEMAN: HorsemanGUID = creature->GetGUID(); break;
case ENTRY_HEAD: HeadGUID = creature->GetGUID(); break;
case ENTRY_PUMPKIN: HorsemanAdds.insert(creature->GetGUID());break;
case 3976: MograineGUID = creature->GetGUID(); break;
case 3977: WhitemaneGUID = creature->GetGUID(); break;
}
}
@@ -48,6 +87,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
{
switch(type)
{
case TYPE_MOGRAINE_AND_WHITE_EVENT: Encounter[0] = data; break;
case GAMEOBJECT_PUMPKIN_SHRINE:
{
GameObject *Shrine = instance->GetGameObjectInMap(PumpkinShrineGUID);
@@ -72,16 +112,27 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
}
}
/* uint64 GetData64(uint32 type)
uint64 GetData64(uint32 type)
{
switch(type)
{
case GAMEOBJECT_PUMPKIN_SHRINE: return PumpkinShrineGUID;
case DATA_HORSEMAN: return HorsemanGUID;
case DATA_HEAD: return HeadGUID;
//case GAMEOBJECT_PUMPKIN_SHRINE: return PumpkinShrineGUID;
//case DATA_HORSEMAN: return HorsemanGUID;
//case DATA_HEAD: return HeadGUID;
case DATA_MOGRAINE: return MograineGUID;
case DATA_WHITEMANE: return WhitemaneGUID;
case DATA_DOOR_WHITEMANE: return DoorHighInquisitorGUID;
}
return 0;
}*/
}
uint32 GetData(uint32 type)
{
if (type == TYPE_MOGRAINE_AND_WHITE_EVENT)
return Encounter[0];
return 0;
}
};
InstanceData* GetInstanceData_instance_scarlet_monastery(Map* map)
@@ -26,7 +26,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_scholomance : public ScriptedInstance
{
instance_scholomance(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_scholomance(Map *map) : ScriptedInstance(map) {Initialize();};
//Lord Alexei Barov, Doctor Theolen Krastinov, The Ravenian, Lorekeeper Polkelt, Instructor Malicia and the Lady Illucia Barov.
bool IsBossDied[6];
@@ -28,7 +28,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
{
instance_shadowfang_keep(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_shadowfang_keep(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -33,6 +33,9 @@ EndContentData */
## npc_shadowfang_prisoner
######*/
#define SAY_FREE -1033000
#define GOSSIP_ITEM_DOOR "Thanks, I'll follow you to the door."
struct TRINITY_DLL_DECL npc_shadowfang_prisonerAI : public npc_escortAI
{
npc_shadowfang_prisonerAI(Creature *c) : npc_escortAI(c)
@@ -48,7 +51,7 @@ struct TRINITY_DLL_DECL npc_shadowfang_prisonerAI : public npc_escortAI
if( pInstance && i == 6)
{
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
m_creature->Say("Thanks for freeing me, I'll open this door for you, then I will get out of here.", LANG_UNIVERSAL, 0);
DoScriptText(SAY_FREE, m_creature);
pInstance->SetData(TYPE_FREE_NPC, DONE);
}
}
@@ -82,8 +85,7 @@ bool GossipHello_npc_shadowfang_prisoner(Player *player, Creature *_Creature)
{
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
if( pInstance && !pInstance->GetData(TYPE_FREE_NPC) && pInstance->GetData(TYPE_RETHILGORE) == DONE )
player->ADD_GOSSIP_ITEM( 0, "Thanks, I'll follow you to the door.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
@@ -17,16 +17,82 @@
/* ScriptData
SDName: Silithus
SD%Complete: 100
SDComment: Quest support: 8304.
SDComment: Quest support: 7785, 8304.
SDCategory: Silithus
EndScriptData */
/* ContentData
npc_highlord_demitrian
npcs_rutgar_and_frankal
EndContentData */
#include "precompiled.h"
/*###
## npc_highlord_demitrian
###*/
#define GOSSIP_DEMITRIAN1 "What do you know of it?"
#define GOSSIP_DEMITRIAN2 "I am listening , Demitrian."
#define GOSSIP_DEMITRIAN3 "Continue, please."
#define GOSSIP_DEMITRIAN4 "A battle?"
#define GOSSIP_DEMITRIAN5 "<Nod>"
#define GOSSIP_DEMITRIAN6 "Caught unaware? How?"
#define GOSSIP_DEMITRIAN7 "So what did Ragnaros do next?"
bool GossipHello_npc_highlord_demitrian(Player *player, Creature *_Creature)
{
if (_Creature->isQuestGiver())
player->PrepareQuestMenu(_Creature->GetGUID());
if (player->GetQuestStatus(7785) == QUEST_STATUS_NONE &&
(player->HasItemCount(18563,1,false) || player->HasItemCount(18564,1,false)))
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(6812, _Creature->GetGUID());
return true;
}
bool GossipSelect_npc_highlord_demitrian(Player *player, Creature *_Creature, uint32 sender, uint32 action)
{
switch (action)
{
case GOSSIP_ACTION_INFO_DEF:
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(6842, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+1:
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
player->SEND_GOSSIP_MENU(6843, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
player->SEND_GOSSIP_MENU(6844, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
player->SEND_GOSSIP_MENU(6867, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
player->SEND_GOSSIP_MENU(6868, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+5:
player->ADD_GOSSIP_ITEM(0, GOSSIP_DEMITRIAN7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
player->SEND_GOSSIP_MENU(6869, _Creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+6:
player->SEND_GOSSIP_MENU(6870, _Creature->GetGUID());
ItemPosCountVec dest;
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 19016, 1);
if (msg == EQUIP_ERR_OK)
player->StoreNewItem(dest, 19016, true);
break;
}
return true;
}
/*###
## npcs_rutgar_and_frankal
###*/
@@ -141,7 +207,14 @@ bool GossipSelect_npcs_rutgar_and_frankal(Player *player, Creature *_Creature, u
void AddSC_silithus()
{
Script *newscript;
newscript = new Script;
newscript = new Script;
newscript->Name = "npc_highlord_demitrian";
newscript->pGossipHello = &GossipHello_npc_highlord_demitrian;
newscript->pGossipSelect = &GossipSelect_npc_highlord_demitrian;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npcs_rutgar_and_frankal";
newscript->pGossipHello = &GossipHello_npcs_rutgar_and_frankal;
newscript->pGossipSelect = &GossipSelect_npcs_rutgar_and_frankal;
@@ -1,4 +1,4 @@
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -15,13 +15,14 @@
*/
/* ScriptData
SDName: boss_baron_rivendare
SD%Complete: 100
SDName: Boss_Baron_Rivendare
SD%Complete: 70
SDComment: aura applied/defined in database
SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define SAY_0 "Intruders! More pawns of the Argent Dawn, no doubt. I already count one of their number among my prisoners. Withdraw from my domain before she is executed!"
#define SAY_1 "You're still here? Your foolishness is amusing! The Argent Dawn wench needn't suffer in vain. Leave at once and she shall be spared!"
@@ -60,19 +61,29 @@ EndScriptData */
#define ADD_6Z 115.055222
#define ADD_6O 2.457497
#define SPELL_SHADOWBOLT 18164
#define SPELL_CLEAVE 15584
#define SPELL_MORTALSTRIKE 13737
#define SPELL_SHADOWBOLT 17393
#define SPELL_CLEAVE 15284
#define SPELL_MORTALSTRIKE 15708
// spell 17473 should trigger -> 17471
//#define SPELL_RAISEDEAD 17475
//#define SPELL_DEATHPACT 17698
//#define SPELL_SUMMONSKELETONS 17274
#define SPELL_UNHOLY_AURA 17467
#define SPELL_RAISEDEAD 17473 //triggers death pact (17471)
#define SPELL_RAISE_DEAD1 17475
#define SPELL_RAISE_DEAD2 17476
#define SPELL_RAISE_DEAD3 17477
#define SPELL_RAISE_DEAD4 17478
#define SPELL_RAISE_DEAD5 17479
#define SPELL_RAISE_DEAD6 17480
struct TRINITY_DLL_DECL boss_baron_rivendareAI : public ScriptedAI
{
boss_baron_rivendareAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_baron_rivendareAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 ShadowBolt_Timer;
uint32 Cleave_Timer;
@@ -88,108 +99,71 @@ struct TRINITY_DLL_DECL boss_baron_rivendareAI : public ScriptedAI
MortalStrike_Timer = 12000;
// RaiseDead_Timer = 30000;
SummonSkeletons_Timer = 34000;
m_creature->LoadCreaturesAddon();
}
void Aggro(Unit *who)
{
switch (rand()%6)
{
case 0:
DoYell(SAY_0,LANG_UNIVERSAL,NULL);
break;
case 1:
DoYell(SAY_1,LANG_UNIVERSAL,NULL);
break;
case 2:
DoYell(SAY_2,LANG_UNIVERSAL,NULL);
break;
case 3:
DoYell(SAY_3,LANG_UNIVERSAL,NULL);
break;
case 4:
DoYell(SAY_4,LANG_UNIVERSAL,NULL);
break;
case 5:
DoYell(SAY_5,LANG_UNIVERSAL,NULL);
break;
}
if (pInstance)
pInstance->SetData(TYPE_BARON,IN_PROGRESS);
}
void JustSummoned(Creature* summoned)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
summoned->AI()->AttackStart(target);
}
void JustDied(Unit* Killer)
{
if (pInstance)
pInstance->SetData(TYPE_BARON,DONE);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//ShadowBolt
if (ShadowBolt_Timer < diff)
{
//Cast
if (rand()%100 < 70) //70% chance to cast
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(m_creature->getVictim(),SPELL_SHADOWBOLT);
}
//10 seconds until we should cast this again
ShadowBolt_Timer = 10000;
}else ShadowBolt_Timer -= diff;
//Cleave
if (Cleave_Timer < diff)
{
//Cast
if (rand()%100 < 55) //55% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_CLEAVE);
}
DoCast(m_creature->getVictim(),SPELL_CLEAVE);
//13 seconds until we should cast this again
Cleave_Timer = 12000;
Cleave_Timer = 7000 + (rand()%10000);
}else Cleave_Timer -= diff;
//MortalStrike
if (MortalStrike_Timer < diff)
{
//Cast
if (rand()%100 < 30) //30% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_MORTALSTRIKE);
}
//16 seconds until we should cast this again
MortalStrike_Timer = 16000;
DoCast(m_creature->getVictim(),SPELL_MORTALSTRIKE);
MortalStrike_Timer = 10000 + (rand()%15000);
}else MortalStrike_Timer -= diff;
//RaiseDead
// if (RaiseDead_Timer < diff)
// {
//Cast
// DoCast(m_creature,SPELL_RAISEDEAD);
// DoSay("summon triggered",LANG_UNIVERSAL,NULL); //just a checkpoint
//45 seconds until we should cast this again
// {
// DoCast(m_creature,SPELL_RAISEDEAD);
// RaiseDead_Timer = 45000;
// }else RaiseDead_Timer -= diff;
//SummonSkeletons
//Creature* Unit::SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime);
if (SummonSkeletons_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
//Cast
Summoned = m_creature->SummonCreature(11197,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,29000);
((CreatureAI*)Summoned->AI())->AttackStart(target);
Summoned = m_creature->SummonCreature(11197,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,29000);
((CreatureAI*)Summoned->AI())->AttackStart(target);
Summoned = m_creature->SummonCreature(11197,ADD_3X,ADD_3Y,ADD_3Z,ADD_3O,TEMPSUMMON_TIMED_DESPAWN,29000);
((CreatureAI*)Summoned->AI())->AttackStart(target);
Summoned = m_creature->SummonCreature(11197,ADD_4X,ADD_4Y,ADD_4Z,ADD_4O,TEMPSUMMON_TIMED_DESPAWN,29000);
((CreatureAI*)Summoned->AI())->AttackStart(target);
Summoned = m_creature->SummonCreature(11197,ADD_5X,ADD_5Y,ADD_5Z,ADD_5O,TEMPSUMMON_TIMED_DESPAWN,29000);
((CreatureAI*)Summoned->AI())->AttackStart(target);
Summoned = m_creature->SummonCreature(11197,ADD_6X,ADD_6Y,ADD_6Z,ADD_6O,TEMPSUMMON_TIMED_DESPAWN,29000);
((CreatureAI*)Summoned->AI())->AttackStart(target);
m_creature->SummonCreature(11197,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,29000);
m_creature->SummonCreature(11197,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,29000);
m_creature->SummonCreature(11197,ADD_3X,ADD_3Y,ADD_3Z,ADD_3O,TEMPSUMMON_TIMED_DESPAWN,29000);
m_creature->SummonCreature(11197,ADD_4X,ADD_4Y,ADD_4Z,ADD_4O,TEMPSUMMON_TIMED_DESPAWN,29000);
m_creature->SummonCreature(11197,ADD_5X,ADD_5Y,ADD_5Z,ADD_5O,TEMPSUMMON_TIMED_DESPAWN,29000);
m_creature->SummonCreature(11197,ADD_6X,ADD_6Y,ADD_6Z,ADD_6O,TEMPSUMMON_TIMED_DESPAWN,29000);
//34 seconds until we should cast this again
SummonSkeletons_Timer = 40000;
@@ -15,13 +15,14 @@
*/
/* ScriptData
SDName: boss_baroness_anastari
SDName: Boss_Baroness_Anastari
SD%Complete: 90
SDComment: MC disabled
SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define SPELL_BANSHEEWAIL 16565
#define SPELL_BANSHEECURSE 16867
@@ -30,7 +31,13 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_baroness_anastariAI : public ScriptedAI
{
boss_baroness_anastariAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_baroness_anastariAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 BansheeWail_Timer;
uint32 BansheeCurse_Timer;
@@ -48,20 +55,23 @@ struct TRINITY_DLL_DECL boss_baroness_anastariAI : public ScriptedAI
void Aggro(Unit *who)
{
}
void JustDied(Unit* Killer)
{
if (pInstance)
pInstance->SetData(TYPE_BARONESS,IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//BansheeWail
if (BansheeWail_Timer < diff)
{
//Cast
if (rand()%100 < 95) //95% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_BANSHEEWAIL);
}
if (rand()%100 < 95)
DoCast(m_creature->getVictim(),SPELL_BANSHEEWAIL);
//4 seconds until we should cast this again
BansheeWail_Timer = 4000;
}else BansheeWail_Timer -= diff;
@@ -69,11 +79,8 @@ struct TRINITY_DLL_DECL boss_baroness_anastariAI : public ScriptedAI
//BansheeCurse
if (BansheeCurse_Timer < diff)
{
//Cast
if (rand()%100 < 75) //75% chance to cast
{
if (rand()%100 < 75)
DoCast(m_creature->getVictim(),SPELL_BANSHEECURSE);
}
//18 seconds until we should cast this again
BansheeCurse_Timer = 18000;
}else BansheeCurse_Timer -= diff;
@@ -81,11 +88,8 @@ struct TRINITY_DLL_DECL boss_baroness_anastariAI : public ScriptedAI
//Silence
if (Silence_Timer < diff)
{
//Cast
if (rand()%100 < 80) //80% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_SILENCE);
}
if (rand()%100 < 80)
DoCast(m_creature->getVictim(),SPELL_SILENCE);
//13 seconds until we should cast this again
Silence_Timer = 13000;
}else Silence_Timer -= diff;
@@ -94,7 +98,7 @@ struct TRINITY_DLL_DECL boss_baroness_anastariAI : public ScriptedAI
/* if (Possess_Timer < diff)
{
//Cast
if (rand()%100 < 65) //65% chance to cast
if (rand()%100 < 65)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
@@ -15,35 +15,64 @@
*/
/* ScriptData
SDName: boss_magistrate_barthilas
SD%Complete: 100
SDName: Boss_Magistrate_Barthilas
SD%Complete: 70
SDComment:
SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define SPELL_DRAININGBLOW 16793
#define SPELL_CROWDPUMMEL 10887
#define SPELL_MIGHTYBLOW 14099
#define SPELL_DAZED 1604
#define SPELL_FURIOUS_ANGER 16791
#define MODEL_NORMAL 10433
#define MODEL_HUMAN 3637
struct TRINITY_DLL_DECL boss_magistrate_barthilasAI : public ScriptedAI
{
boss_magistrate_barthilasAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_magistrate_barthilasAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 DrainingBlow_Timer;
uint32 CrowdPummel_Timer;
uint32 MightyBlow_Timer;
uint32 Dazed_Timer;
uint32 FuriousAnger_Timer;
uint32 AngerCount;
void Reset()
{
DrainingBlow_Timer = 4000;
CrowdPummel_Timer = 13000;
MightyBlow_Timer = 11000;
Dazed_Timer = 7000;
}
DrainingBlow_Timer = 20000;
CrowdPummel_Timer = 15000;
MightyBlow_Timer = 10000;
FuriousAnger_Timer = 5000;
AngerCount = 0;
if (m_creature->isAlive())
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NORMAL);
else
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_HUMAN);
}
void MoveInLineOfSight(Unit *who)
{
//nothing to see here yet
ScriptedAI::MoveInLineOfSight(who);
}
void JustDied(Unit* Killer)
{
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_HUMAN);
}
void Aggro(Unit *who)
{
@@ -55,46 +84,37 @@ struct TRINITY_DLL_DECL boss_magistrate_barthilasAI : public ScriptedAI
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
if (FuriousAnger_Timer < diff)
{
FuriousAnger_Timer = 4000;
if (AngerCount > 25)
return;
++AngerCount;
m_creature->CastSpell(m_creature,SPELL_FURIOUS_ANGER,false);
}else FuriousAnger_Timer -= diff;
//DrainingBlow
if (DrainingBlow_Timer < diff)
{
//Cast
DoCast(m_creature->getVictim(),SPELL_DRAININGBLOW);
//4 seconds until we should cast this again
DrainingBlow_Timer = 4000;
DrainingBlow_Timer = 15000;
}else DrainingBlow_Timer -= diff;
//CrowdPummel
if (CrowdPummel_Timer < diff)
{
//Cast
DoCast(m_creature->getVictim(),SPELL_CROWDPUMMEL);
//13 seconds until we should cast this agian
CrowdPummel_Timer = 13000;
DoCast(m_creature->getVictim(),SPELL_CROWDPUMMEL);
CrowdPummel_Timer = 15000;
}else CrowdPummel_Timer -= diff;
//MightyBlow
if (MightyBlow_Timer < diff)
{
//Cast
{
DoCast(m_creature->getVictim(),SPELL_MIGHTYBLOW);
//11 seconds until we should cast this again
MightyBlow_Timer = 11000;
MightyBlow_Timer = 20000;
}else MightyBlow_Timer -= diff;
//Dazed
if (Dazed_Timer < diff)
{
//Cast
DoCast(m_creature->getVictim(),SPELL_DAZED);
//20 seconds until we should cast this again
Dazed_Timer = 20000;
}else Dazed_Timer -= diff;
DoMeleeAttackIfReady();
}
};
@@ -22,24 +22,29 @@ SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define SPELL_FROSTNOVA 22645
#define SPELL_FROSTBOLT 17503
#define SPELL_DRAINLIFE 20743
#define SPELL_DRAIN_MANA 17243
#define SPELL_ICETOMB 16869
struct TRINITY_DLL_DECL boss_maleki_the_pallidAI : public ScriptedAI
{
boss_maleki_the_pallidAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_maleki_the_pallidAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 FrostNova_Timer;
uint32 Frostbolt_Timer;
uint32 IceTomb_Timer;
uint32 DrainLife_Timer;
void Reset()
{
FrostNova_Timer = 11000;
Frostbolt_Timer = 1000;
IceTomb_Timer = 16000;
DrainLife_Timer = 31000;
@@ -49,54 +54,39 @@ struct TRINITY_DLL_DECL boss_maleki_the_pallidAI : public ScriptedAI
{
}
void JustDied(Unit* Killer)
{
if (pInstance)
pInstance->SetData(TYPE_PALLID,IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//FrostNova
if (FrostNova_Timer < diff)
{
//Cast
DoCast(m_creature->getVictim(),SPELL_FROSTNOVA);
//23 seconds until we should cast this again
FrostNova_Timer = 23000;
}else FrostNova_Timer -= diff;
//Frostbolt
if (Frostbolt_Timer < diff)
{
//Cast
if (rand()%100 < 90) //90% chance to cast
{
if (rand()%100 < 90)
DoCast(m_creature->getVictim(),SPELL_FROSTBOLT);
}
//3.5 seconds until we should cast this again
Frostbolt_Timer = 3500;
}else Frostbolt_Timer -= diff;
//IceTomb
if (IceTomb_Timer < diff)
{
//Cast
if (rand()%100 < 65) //65% chance to cast
{
if (rand()%100 < 65)
DoCast(m_creature->getVictim(),SPELL_ICETOMB);
}
//28 seconds until we should cast this again
IceTomb_Timer = 28000;
}else IceTomb_Timer -= diff;
//DrainLife
if (DrainLife_Timer < diff)
{
//Cast
if (rand()%100 < 55) //55% chance to cast
{
if (rand()%100 < 55)
DoCast(m_creature->getVictim(),SPELL_DRAINLIFE);
}
//31 seconds until we should cast this again
DrainLife_Timer = 31000;
}else DrainLife_Timer -= diff;
@@ -15,26 +15,33 @@
*/
/* ScriptData
SDName: boss_nerubenkan
SD%Complete: 100
SDName: Boss_Nerubenkan
SD%Complete: 70
SDComment:
SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define SPELL_ENCASINGWEBS 4962
#define SPELL_PIERCEARMOR 6016
#define SPELL_VIRULENTPOISON 16427
//#define SPELL_RAISEUNDEADSCARAB 17235
#define SPELL_CRYPT_SCARABS 31602
#define SPELL_RAISEUNDEADSCARAB 17235
struct TRINITY_DLL_DECL boss_nerubenkanAI : public ScriptedAI
{
boss_nerubenkanAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_nerubenkanAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 EncasingWebs_Timer;
uint32 PierceArmor_Timer;
uint32 VirulentPoison_Timer;
uint32 CryptScarabs_Timer;
uint32 RaiseUndeadScarab_Timer;
int Rand;
int RandX;
@@ -43,16 +50,22 @@ struct TRINITY_DLL_DECL boss_nerubenkanAI : public ScriptedAI
void Reset()
{
VirulentPoison_Timer = 3000;
CryptScarabs_Timer = 3000;
EncasingWebs_Timer = 7000;
PierceArmor_Timer = 19000;
RaiseUndeadScarab_Timer = 11000;
RaiseUndeadScarab_Timer = 3000;
}
void Aggro(Unit *who)
{
}
void JustDied(Unit* Killer)
{
if (pInstance)
pInstance->SetData(TYPE_NERUB,IN_PROGRESS);
}
void RaiseUndeadScarab(Unit* victim)
{
Rand = rand()%10;
@@ -76,46 +89,38 @@ struct TRINITY_DLL_DECL boss_nerubenkanAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
//EncasingWebs
if (EncasingWebs_Timer < diff)
{
//Cast
DoCast(m_creature->getVictim(),SPELL_ENCASINGWEBS);
//30 seconds until we should cast this again
EncasingWebs_Timer = 30000;
}else EncasingWebs_Timer -= diff;
//PierceArmor
if (PierceArmor_Timer < diff)
{
//Cast
if (rand()%100 < 75) //75% chance to cast
{
if (rand()%100 < 75)
DoCast(m_creature->getVictim(),SPELL_PIERCEARMOR);
}
//35 seconds until we should cast this again
PierceArmor_Timer = 35000;
}else PierceArmor_Timer -= diff;
//VirulentPoison
if (VirulentPoison_Timer < diff)
{
//Cast
DoCast(m_creature->getVictim(),SPELL_VIRULENTPOISON);
//20 seconds until we should cast this again
VirulentPoison_Timer = 20000;
}else VirulentPoison_Timer -= diff;
//CryptScarabs_Timer
if (CryptScarabs_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CRYPT_SCARABS);
CryptScarabs_Timer = 20000;
}else CryptScarabs_Timer -= diff;
//RaiseUndeadScarab
if (RaiseUndeadScarab_Timer < diff)
{
//Cast
RaiseUndeadScarab(m_creature->getVictim());
//16 seconds until we should cast this again
{
RaiseUndeadScarab(m_creature->getVictim());
RaiseUndeadScarab_Timer = 16000;
}else RaiseUndeadScarab_Timer -= diff;
@@ -15,20 +15,29 @@
*/
/* ScriptData
SDName: boss_ramstein_the_gorger
SD%Complete: 100
SDName: Boss_Ramstein_The_Gorger
SD%Complete: 70
SDComment:
SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define SPELL_TRAMPLE 15550
#define SPELL_TRAMPLE 5568
#define SPELL_KNOCKOUT 17307
#define C_MINDLESS_UNDEAD 11030
struct TRINITY_DLL_DECL boss_ramstein_the_gorgerAI : public ScriptedAI
{
boss_ramstein_the_gorgerAI(Creature *c) : ScriptedAI(c) {Reset();}
boss_ramstein_the_gorgerAI(Creature *c) : ScriptedAI(c)
{
pInstance = (ScriptedInstance*)m_creature->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
uint32 Trample_Timer;
uint32 Knockout_Timer;
@@ -43,6 +52,15 @@ struct TRINITY_DLL_DECL boss_ramstein_the_gorgerAI : public ScriptedAI
{
}
void JustDied(Unit* Killer)
{
for(uint8 i = 0; i < 30; i++)
m_creature->SummonCreature(C_MINDLESS_UNDEAD,3969.35,-3391.87,119.11,5.91,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
if (pInstance)
pInstance->SetData(TYPE_RAMSTEIN,DONE);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
@@ -52,24 +70,14 @@ struct TRINITY_DLL_DECL boss_ramstein_the_gorgerAI : public ScriptedAI
//Trample
if (Trample_Timer < diff)
{
//Cast
if (rand()%100 < 75) //75% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_TRAMPLE);
}
//7 seconds until we should cast this again
DoCast(m_creature,SPELL_TRAMPLE);
Trample_Timer = 7000;
}else Trample_Timer -= diff;
//Knockout
if (Knockout_Timer < diff)
{
//Cast
if (rand()%100 < 70) //70% chance to cast
{
DoCast(m_creature->getVictim(),SPELL_KNOCKOUT);
}
//10 seconds until we should cast this again
DoCast(m_creature->getVictim(),SPELL_KNOCKOUT);
Knockout_Timer = 10000;
}else Knockout_Timer -= diff;
@@ -5,10 +5,23 @@
#ifndef DEF_STRATHOLME_H
#define DEF_STRATHOLME_H
#define TYPE_SH_AELMAR 1
#define TYPE_SH_CATHELA 2
#define TYPE_SH_GREGOR 3
#define TYPE_SH_NEMAS 4
#define TYPE_SH_VICAR 5
#define TYPE_SH_QUEST 6
#define TYPE_BARON_RUN 1
#define TYPE_BARONESS 2
#define TYPE_NERUB 3
#define TYPE_PALLID 4
#define TYPE_RAMSTEIN 5
#define TYPE_BARON 6
#define DATA_BARON 10
#define DATA_YSIDA_TRIGGER 11
#define TYPE_SH_QUEST 20
#define TYPE_SH_CATHELA 21
#define TYPE_SH_GREGOR 22
#define TYPE_SH_NEMAS 23
#define TYPE_SH_VICAR 24
#define TYPE_SH_AELMAR 25
#define QUEST_DEAD_MAN_PLEA 8945
#define SPELL_BARON_ULTIMATUM 27861
#endif
@@ -16,49 +16,367 @@
/* ScriptData
SDName: instance_stratholme
SD%Complete: 100
SDComment:
SD%Complete: 50
SDComment: In progress. Undead side 75% implemented. Save/load not implemented.
SDCategory: Stratholme
EndScriptData */
#include "precompiled.h"
#include "def_stratholme.h"
#define GO_SERVICE_ENTRANCE 175368
#define GO_GAUNTLET_GATE1 175357
#define GO_ZIGGURAT1 175380 //baroness
#define GO_ZIGGURAT2 175379 //nerub'enkan
#define GO_ZIGGURAT3 175381 //maleki
#define GO_ZIGGURAT4 175405 //rammstein
#define GO_ZIGGURAT5 175796 //baron
#define GO_PORT_GAUNTLET 175374 //port from gauntlet to slaugther
#define GO_PORT_SLAUGTHER 175373 //port at slaugther
#define GO_PORT_ELDERS 175377 //port at elders square
#define C_CRYSTAL 10415 //three ziggurat crystals
#define C_BARON 10440
#define C_YSIDA_TRIGGER 16100
#define C_RAMSTEIN 10439
#define C_ABOM_BILE 10416
#define C_ABOM_VENOM 10417
#define C_BLACK_GUARD 10394
#define C_YSIDA 16031
#define ENCOUNTERS 6
struct TRINITY_DLL_DECL instance_stratholme : public ScriptedInstance
{
instance_stratholme(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_stratholme(Map *map) : ScriptedInstance(map) {Initialize();};
bool IsSilverHandDead[5];
uint32 Encounter[ENCOUNTERS];
void SetData(uint32 type, uint32 data)
bool IsSilverHandDead[5];
uint32 BaronRun_Timer;
uint32 SlaugtherSquare_Timer;
uint64 serviceEntranceGUID;
uint64 gauntletGate1GUID;
uint64 ziggurat1GUID;
uint64 ziggurat2GUID;
uint64 ziggurat3GUID;
uint64 ziggurat4GUID;
uint64 ziggurat5GUID;
uint64 portGauntletGUID;
uint64 portSlaugtherGUID;
uint64 portElderGUID;
uint64 baronGUID;
uint64 ysidaTriggerGUID;
std::set<uint64> crystalsGUID;
std::set<uint64> abomnationGUID;
void Initialize()
{
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
for(uint8 i = 0; i < 5; i++)
IsSilverHandDead[5] = false;
BaronRun_Timer = 0;
SlaugtherSquare_Timer = 0;
serviceEntranceGUID = 0;
gauntletGate1GUID = 0;
ziggurat1GUID = 0;
ziggurat2GUID = 0;
ziggurat3GUID = 0;
ziggurat4GUID = 0;
ziggurat5GUID = 0;
portGauntletGUID = 0;
portSlaugtherGUID = 0;
portElderGUID = 0;
baronGUID = 0;
ysidaTriggerGUID = 0;
crystalsGUID.clear();
abomnationGUID.clear();
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Stratholme: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
bool StartSlaugtherSquare()
{
//change to DONE when crystals implemented
if (Encounter[1] == IN_PROGRESS && Encounter[2] == IN_PROGRESS && Encounter[3] == IN_PROGRESS)
{
UpdateGoState(portGauntletGUID,0,false);
UpdateGoState(portSlaugtherGUID,0,false);
return true;
}
debug_log("SD2: Instance Stratholme: Cannot open slaugther square yet.");
return false;
}
//if withRestoreTime true, then newState will be ignored and GO should be restored to original state after 10 seconds
void UpdateGoState(uint64 goGuid, uint32 newState, bool withRestoreTime)
{
Player *player = GetPlayerInMap();
if (!player || !goGuid)
return;
if (GameObject *go = GameObject::GetGameObject(*player, goGuid))
{
if (withRestoreTime)
go->UseDoorOrButton(10);
else
go->SetGoState(newState);
}
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature->GetEntry())
{
case C_BARON: baronGUID = creature->GetGUID(); break;
case C_YSIDA_TRIGGER: ysidaTriggerGUID = creature->GetGUID(); break;
case C_CRYSTAL: crystalsGUID.insert(creature->GetGUID()); break;
case C_ABOM_BILE:
case C_ABOM_VENOM: abomnationGUID.insert(creature->GetGUID()); break;
}
}
void OnObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
case GO_SERVICE_ENTRANCE: serviceEntranceGUID = go->GetGUID(); break;
case GO_GAUNTLET_GATE1:
//weird, but unless flag is set, client will not respond as expected. DB bug?
go->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_LOCKED);
gauntletGate1GUID = go->GetGUID();
break;
case GO_ZIGGURAT1: ziggurat1GUID = go->GetGUID(); break;
case GO_ZIGGURAT2: ziggurat2GUID = go->GetGUID(); break;
case GO_ZIGGURAT3: ziggurat3GUID = go->GetGUID(); break;
case GO_ZIGGURAT4: ziggurat4GUID = go->GetGUID(); break;
case GO_ZIGGURAT5: ziggurat5GUID = go->GetGUID(); break;
case GO_PORT_GAUNTLET: portGauntletGUID = go->GetGUID(); break;
case GO_PORT_SLAUGTHER: portSlaugtherGUID = go->GetGUID(); break;
case GO_PORT_ELDERS: portElderGUID = go->GetGUID(); break;
}
}
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
if (!player)
{
debug_log("SD2: Instance Stratholme: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
switch(type)
{
case TYPE_SH_AELMAR:
IsSilverHandDead[0] = (data) ? true : false;
break;
case TYPE_SH_CATHELA:
IsSilverHandDead[1] = (data) ? true : false;
break;
case TYPE_SH_GREGOR:
IsSilverHandDead[2] = (data) ? true : false;
break;
case TYPE_SH_NEMAS:
IsSilverHandDead[3] = (data) ? true : false;
break;
case TYPE_SH_VICAR:
IsSilverHandDead[4] = (data) ? true : false;
break;
}
}
case TYPE_BARON_RUN:
switch(data)
{
case IN_PROGRESS:
if (Encounter[0] == IN_PROGRESS || Encounter[0] == FAIL)
break;
BaronRun_Timer = 2700000;
debug_log("SD2: Instance Stratholme: Baron run in progress.");
break;
case FAIL:
//may add code to remove aura from players, but in theory the time should be up already and removed.
break;
case DONE:
if (Unit *t = Unit::GetUnit(*player, ysidaTriggerGUID))
t->SummonCreature(C_YSIDA,t->GetPositionX(),t->GetPositionY(),t->GetPositionZ(),t->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,1800000);
BaronRun_Timer = 0;
break;
}
Encounter[0] = data;
break;
case TYPE_BARONESS:
Encounter[1] = data;
if (data == IN_PROGRESS)
UpdateGoState(ziggurat1GUID,0,false);
if (data == IN_PROGRESS) //change to DONE when crystals implemented
StartSlaugtherSquare();
break;
case TYPE_NERUB:
Encounter[2] = data;
if (data == IN_PROGRESS)
UpdateGoState(ziggurat2GUID,0,false);
if (data == IN_PROGRESS) //change to DONE when crystals implemented
StartSlaugtherSquare();
break;
case TYPE_PALLID:
Encounter[3] = data;
if (data == IN_PROGRESS)
UpdateGoState(ziggurat3GUID,0,false);
if (data == IN_PROGRESS) //change to DONE when crystals implemented
StartSlaugtherSquare();
break;
case TYPE_RAMSTEIN:
if (data == IN_PROGRESS)
{
if (Encounter[4] != IN_PROGRESS)
UpdateGoState(portGauntletGUID,1,false);
uint32 count = abomnationGUID.size();
for(std::set<uint64>::iterator i = abomnationGUID.begin(); i != abomnationGUID.end(); ++i)
{
if (Unit* abom = Unit::GetUnit(*player, *i))
{
if (!abom->isAlive())
--count;
}
}
if (!count)
{
//a bit itchy, it should close the door after 10 secs, but it doesn't. skipping it for now.
//UpdateGoState(ziggurat4GUID,0,true);
player->SummonCreature(C_RAMSTEIN,4032.84,-3390.24,119.73,4.71,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
debug_log("SD2: Instance Stratholme: Ramstein spawned.");
} else debug_log("SD2: Instance Stratholme: %u Abomnation left to kill.",count);
}
if (data == DONE)
{
SlaugtherSquare_Timer = 300000;
debug_log("SD2: Instance Stratholme: Slaugther event will continue in 5 minutes.");
}
Encounter[4] = data;
break;
case TYPE_BARON:
if (data == IN_PROGRESS)
{
if (GetData(TYPE_BARON_RUN) == IN_PROGRESS)
{
if (Group *pGroup = player->GetGroup())
{
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* pGroupie = itr->getSource();
if (!pGroupie)
continue;
if (pGroupie->HasAura(SPELL_BARON_ULTIMATUM,0))
pGroupie->RemoveAurasDueToSpell(SPELL_BARON_ULTIMATUM);
}
} else if (player->HasAura(SPELL_BARON_ULTIMATUM,0))
player->RemoveAurasDueToSpell(SPELL_BARON_ULTIMATUM);
if (Unit *temp = Unit::GetUnit(*player,GetData64(DATA_BARON)))
player->GroupEventHappens(QUEST_DEAD_MAN_PLEA,temp);
SetData(TYPE_BARON_RUN,DONE);
}
}
Encounter[5] = data;
break;
case TYPE_SH_AELMAR:
IsSilverHandDead[0] = (data) ? true : false;
break;
case TYPE_SH_CATHELA:
IsSilverHandDead[1] = (data) ? true : false;
break;
case TYPE_SH_GREGOR:
IsSilverHandDead[2] = (data) ? true : false;
break;
case TYPE_SH_NEMAS:
IsSilverHandDead[3] = (data) ? true : false;
break;
case TYPE_SH_VICAR:
IsSilverHandDead[4] = (data) ? true : false;
break;
}
}
uint32 GetData(uint32 type)
{
if(type == TYPE_SH_QUEST)
if(IsSilverHandDead[0] && IsSilverHandDead[1] && IsSilverHandDead[2] && IsSilverHandDead[3] && IsSilverHandDead[4])
return true;
switch(type)
{
case TYPE_SH_QUEST:
if(IsSilverHandDead[0] && IsSilverHandDead[1] && IsSilverHandDead[2] && IsSilverHandDead[3] && IsSilverHandDead[4])
return 1;
return 0;
case TYPE_BARON_RUN:
return Encounter[0];
case TYPE_BARONESS:
return Encounter[1];
case TYPE_NERUB:
return Encounter[2];
case TYPE_PALLID:
return Encounter[3];
case TYPE_RAMSTEIN:
return Encounter[4];
case TYPE_BARON:
return Encounter[5];
}
return 0;
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case DATA_BARON:
return baronGUID;
case DATA_YSIDA_TRIGGER:
return ysidaTriggerGUID;
}
return 0;
}
void Update(uint32 diff)
{
if (BaronRun_Timer)
{
if (BaronRun_Timer <= diff)
{
if (GetData(TYPE_BARON_RUN) != DONE)
SetData(TYPE_BARON_RUN, FAIL);
BaronRun_Timer = 0;
debug_log("SD2: Instance Stratholme: Baron run event reached end. Event has state %u.",GetData(TYPE_BARON_RUN));
}else BaronRun_Timer -= diff;
}
return false;
if (SlaugtherSquare_Timer)
{
if (SlaugtherSquare_Timer <= diff)
{
if (Player *p = GetPlayerInMap())
{
for(uint8 i = 0; i < 4; i++)
p->SummonCreature(C_BLACK_GUARD,4032.84,-3390.24,119.73,4.71,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
UpdateGoState(ziggurat4GUID,0,false);
UpdateGoState(ziggurat5GUID,0,false);
debug_log("SD2: Instance Stratholme: Black guard sentries spawned. Opening gates to baron.");
}
SlaugtherSquare_Timer = 0;
}else SlaugtherSquare_Timer -= diff;
}
}
};
@@ -1,28 +1,71 @@
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Stratholme
SD%Complete: 100
SDComment: trash mobs for strat. Simple AI mobs converted to EAI (except Mindless Skeleton and Thuzadin Acolyte)
SDComment: Misc mobs for instance. GO-script to apply aura and start event for quest 8945
SDCategory: Stratholme
EndScriptData */
/* ContentData
go_gauntlet_gate
mob_freed_soul
mob_restless_soul
mobs_spectral_ghostly_citizen
EndContentData */
#include "precompiled.h"
#include "../../creature/simple_ai.h"
#include "def_stratholme.h"
/*######
## go_gauntlet_gate (this is the _first_ of the gauntlet gates, two exist)
######*/
bool GOHello_go_gauntlet_gate(Player *player, GameObject* _GO)
{
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
if (!pInstance)
return false;
if (pInstance->GetData(TYPE_BARON_RUN) != NOT_STARTED)
return false;
if (Group *pGroup = player->GetGroup())
{
for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* pGroupie = itr->getSource();
if (!pGroupie)
continue;
if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
!pGroupie->HasAura(SPELL_BARON_ULTIMATUM,0) &&
pGroupie->GetMap() == _GO->GetMap())
pGroupie->CastSpell(pGroupie,SPELL_BARON_ULTIMATUM,true);
}
} else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
!player->HasAura(SPELL_BARON_ULTIMATUM,0) &&
player->GetMap() == _GO->GetMap())
player->CastSpell(player,SPELL_BARON_ULTIMATUM,true);
pInstance->SetData(TYPE_BARON_RUN,IN_PROGRESS);
return false;
}
/*######
## mob_freed_soul
@@ -40,116 +83,86 @@ struct TRINITY_DLL_DECL mob_freed_soulAI : public ScriptedAI
void Reset()
{
switch (rand()%4)
{
case 0:
DoSay(SAY_ZAPPED0,LANG_UNIVERSAL,NULL);
break;
case 1:
DoSay(SAY_ZAPPED1,LANG_UNIVERSAL,NULL);
break;
case 2:
DoSay(SAY_ZAPPED2,LANG_UNIVERSAL,NULL);
break;
case 3:
DoSay(SAY_ZAPPED3,LANG_UNIVERSAL,NULL);
break;
case 0: DoSay(SAY_ZAPPED0,LANG_UNIVERSAL,NULL); break;
case 1: DoSay(SAY_ZAPPED1,LANG_UNIVERSAL,NULL); break;
case 2: DoSay(SAY_ZAPPED2,LANG_UNIVERSAL,NULL); break;
case 3: DoSay(SAY_ZAPPED3,LANG_UNIVERSAL,NULL); break;
}
}
void Aggro(Unit* who)
{
}
void Aggro(Unit* who) { }
};
CreatureAI* GetAI_mob_freed_soul(Creature *_Creature)
{
return new mob_freed_soulAI (_Creature);
}
/*######
## mob_restless_soul
######*/
#define SPELL_EGAN_BLASTER 17368
#define SPELL_SOUL_FREED 17370
#define QUEST_RESTLESS_SOUL 5282
#define ENTRY_RESTLESS 11122
#define ENTRY_FREED 11136
struct TRINITY_DLL_DECL mob_restless_soulAI : public ScriptedAI
{
mob_restless_soulAI(Creature *c) : ScriptedAI(c) {Reset();}
Unit* PlayerHolder;
uint64 Tagger;
uint32 Die_Timer;
bool OkToDie;
bool Tagged;
void Reset()
{
Die_Timer = 10000;
OkToDie = false;
PlayerHolder = NULL;
Tagger = 0;
Die_Timer = 5000;
Tagged = false;
}
void Aggro(Unit* who)
{
}
void SummonFreedSoul(Unit* victim)
{
int Rand;
int RandX;
int RandY;
Rand = rand()%1;
switch (rand()%2)
{
case 0: RandX = 0 - Rand; break;
case 1: RandX = 0 + Rand; break;
}
Rand = 0;
Rand = rand()%1;
switch (rand()%2)
{
case 0: RandY = 0 - Rand; break;
case 1: RandY = 0 + Rand; break;
}
Rand = 0;
DoSpawnCreature(11136, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 300000);
}
void Aggro(Unit* who) { }
void SpellHit(Unit *caster, const SpellEntry *spell)
{
if (caster->GetTypeId() == TYPEID_PLAYER)
{
if(!PlayerHolder && !OkToDie && spell->Id == 17368 && ((Player*)caster)->GetQuestStatus(5282) == QUEST_STATUS_INCOMPLETE)
if (!Tagged && spell->Id == SPELL_EGAN_BLASTER && ((Player*)caster)->GetQuestStatus(QUEST_RESTLESS_SOUL) == QUEST_STATUS_INCOMPLETE)
{
PlayerHolder = caster;
OkToDie = true;
Die_Timer = 5000;
Tagged = true;
Tagger = caster->GetGUID();
}
}
return;
}
void JustSummoned(Creature *summoned)
{
summoned->CastSpell(summoned,SPELL_SOUL_FREED,false);
}
void JustDied(Unit* Killer)
{
if (Killer->GetTypeId() == TYPEID_PLAYER)
{
//check quest status
if(PlayerHolder == ((Player*)Killer) && ((Player*)Killer)->GetQuestStatus(5282) == QUEST_STATUS_INCOMPLETE)
{
SummonFreedSoul(m_creature->getVictim());
}
}
if (Tagged)
DoSpawnCreature(ENTRY_FREED, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 300000);
}
void UpdateAI(const uint32 diff)
{
if (PlayerHolder && OkToDie && Die_Timer < diff)
if (Tagged)
{
PlayerHolder->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
if (Die_Timer < diff)
{
if (Unit* temp = Unit::GetUnit(*m_creature,Tagger))
temp->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}else Die_Timer -= diff;
}
else Die_Timer -= diff;
return;
}
};
CreatureAI* GetAI_mob_restless_soul(Creature *_Creature)
{
return new mob_restless_soulAI (_Creature);
@@ -159,177 +172,117 @@ CreatureAI* GetAI_mob_restless_soul(Creature *_Creature)
## mobs_spectral_ghostly_citizen
######*/
#define SPELL_HAUNTING_PHANTOM 16336
struct TRINITY_DLL_DECL mobs_spectral_ghostly_citizenAI : public ScriptedAI
{
mobs_spectral_ghostly_citizenAI(Creature *c) : ScriptedAI(c) {Reset();}
Unit* PlayerHolder;
uint32 Die_Timer;
bool OkToDie;
bool Tagged;
void Reset()
{
Die_Timer = 5000;
OkToDie = false;
PlayerHolder = NULL;
Tagged = false;
}
void Aggro(Unit* who)
{
}
void SummonRestlessSoul(Unit* victim)
{
int Rand;
int RandX;
int RandY;
Rand = rand()%7;
switch (rand()%2)
{
case 0: RandX = 0 - Rand; break;
case 1: RandX = 0 + Rand; break;
}
Rand = 0;
Rand = rand()%7;
switch (rand()%2)
{
case 0: RandY = 0 - Rand; break;
case 1: RandY = 0 + Rand; break;
}
Rand = 0;
DoSpawnCreature(11122, RandX, RandY, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 600000);
}
void Aggro(Unit* who) { }
void SpellHit(Unit *caster, const SpellEntry *spell)
{
if (caster->GetTypeId() == TYPEID_PLAYER)
{
if(!PlayerHolder && !OkToDie && spell->Id == 17368 && ((Player*)caster)->GetQuestStatus(5282) == QUEST_STATUS_INCOMPLETE)
{
PlayerHolder = caster;
OkToDie = true;
Die_Timer = 5000;
}
}
return;
if (!Tagged && spell->Id == SPELL_EGAN_BLASTER)
Tagged = true;
}
void JustDied(Unit* Killer)
{
if (Killer->GetTypeId() == TYPEID_PLAYER)
if (Tagged)
{
//check quest status
if(PlayerHolder == ((Player*)Killer) && ((Player*)Killer)->GetQuestStatus(5282) == QUEST_STATUS_INCOMPLETE)
for(uint8 i = 0; i < 4; i++)
{
SummonRestlessSoul(m_creature->getVictim()); //always one
if (rand()%100 < 90) SummonRestlessSoul(m_creature->getVictim()); //90% a second
if (rand()%100 < 50) SummonRestlessSoul(m_creature->getVictim()); //50% a third
if (rand()%100 < 30) SummonRestlessSoul(m_creature->getVictim()); //30% a fourth
float x,y,z;
m_creature->GetRandomPoint(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),25.0f,x,y,z);
int j = rand()%i;
if (!j)
m_creature->SummonCreature(ENTRY_RESTLESS,x,y,z,0,TEMPSUMMON_CORPSE_DESPAWN,600000);
}
}
}
void UpdateAI(const uint32 diff)
{
if (PlayerHolder && OkToDie && Die_Timer < diff)
if (Tagged)
{
PlayerHolder->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
if (Die_Timer < diff)
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}else Die_Timer -= diff;
}
else Die_Timer -= diff;
//Return since we have no target
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_mobs_spectral_ghostly_citizen(Creature *_Creature)
{
return new mobs_spectral_ghostly_citizenAI (_Creature);
}
bool ReciveEmote_mobs_spectral_ghostly_citizen(Player *player, Creature *_Creature, uint32 emote)
{
_Creature->HandleEmoteCommand(emote);
if (emote == TEXTEMOTE_DANCE)
((mobs_spectral_ghostly_citizenAI*)_Creature->AI())->EnterEvadeMode();
switch(emote)
{
case TEXTEMOTE_DANCE:
((mobs_spectral_ghostly_citizenAI*)_Creature->AI())->EnterEvadeMode();
break;
case TEXTEMOTE_RUDE:
//Should instead cast spell, kicking player back. Spell not found.
if (_Creature->IsWithinDistInMap(player, 5))
_Creature->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);
else
_Creature->HandleEmoteCommand(EMOTE_ONESHOT_RUDE);
break;
case TEXTEMOTE_WAVE:
_Creature->HandleEmoteCommand(EMOTE_ONESHOT_WAVE);
break;
case TEXTEMOTE_BOW:
_Creature->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
break;
case TEXTEMOTE_KISS:
_Creature->HandleEmoteCommand(EMOTE_ONESHOT_FLEX);
break;
}
return true;
}
/*######
## mob_mindless_skeleton
######*/
CreatureAI* GetAI_mob_mindless_skeleton(Creature *_Creature)
{
SimpleAI* ai = new SimpleAI (_Creature);
//dazed
ai->Spell[0].Enabled = true;
ai->Spell[0].Spell_Id = 13496;
ai->Spell[0].Cooldown = 15000;
ai->Spell[0].First_Cast = 3000;
ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_TARGET;
ai->EnterEvadeMode();
return ai;
}
/*######
## mob_thuzadin_acolyte
######*/
CreatureAI* GetAI_mob_thuzadin_acolyte(Creature *_Creature)
{
SimpleAI* ai = new SimpleAI (_Creature);
//dazed
ai->Spell[0].Enabled = true;
ai->Spell[0].Spell_Id = 13496;
ai->Spell[0].Cooldown = 15000;
ai->Spell[0].First_Cast = 1000;
ai->Spell[0].Cast_Target_Type = CAST_HOSTILE_TARGET;
ai->EnterEvadeMode();
return ai;
}
/*######
##
######*/
void AddSC_stratholme()
{
Script *newscript;
newscript = new Script;
newscript->Name="mob_freed_soul";
newscript->GetAI = GetAI_mob_freed_soul;
newscript->Name = "go_gauntlet_gate";
newscript->pGOHello = &GOHello_go_gauntlet_gate;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_restless_soul";
newscript->GetAI = GetAI_mob_restless_soul;
newscript->Name = "mob_freed_soul";
newscript->GetAI = &GetAI_mob_freed_soul;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mobs_spectral_ghostly_citizen";
newscript->GetAI = GetAI_mobs_spectral_ghostly_citizen;
newscript->Name = "mob_restless_soul";
newscript->GetAI = &GetAI_mob_restless_soul;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mobs_spectral_ghostly_citizen";
newscript->GetAI = &GetAI_mobs_spectral_ghostly_citizen;
newscript->pReceiveEmote = &ReciveEmote_mobs_spectral_ghostly_citizen;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_mindless_skeleton";
newscript->GetAI = GetAI_mob_mindless_skeleton;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_thuzadin_acolyte";
newscript->GetAI = GetAI_mob_thuzadin_acolyte;
newscript->RegisterSelf();
}
@@ -1,4 +1,4 @@
/* Copyright ?2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -16,54 +16,50 @@
/* ScriptData
SDName: Boss_Brutallus
SD%Complete: 90
SDComment: Burn gets casted on himself and intro is missing.
SD%Complete: 50
SDComment: Intro not made. Script for Madrigosa to be added here.
EndScriptData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
// Yells and Sounds used by boss.
#define YELL_AGGRO "Ahh! More lambs to the slaughter!"
#define SOUND_AGGRO 12463
#define YELL_INTRO -1580017
#define YELL_INTRO_BREAK_ICE -1580018
#define YELL_INTRO_CHARGE -1580019
#define YELL_INTRO_KILL_MADRIGOSA -1580020
#define YELL_INTRO_TAUNT -1580021
#define YELL_BERSERK "So much for a real challenge... Die!"
#define SOUND_BERSERK 12470
#define YELL_KILL1 "Perish, insect!"
#define SOUND_KILL1 12464
#define YELL_KILL2 "You are meat!"
#define SOUND_KILL2 12465
#define YELL_KILL3 "Too easy!"
#define SOUND_KILL3 12466
#define YELL_CHARGE "I will crush you!"
#define SOUND_CHARGE 12460
#define YELL_DEATH "Gah! Well done... Now... this gets... interesting..."
#define SOUND_DEATH 12471
#define YELL_LOVE1 "Bring the fight to me!"
#define SOUND_LOVE1 12467
#define YELL_LOVE2 "Another day, another glorious battle!"
#define SOUND_LOVE2 12468
#define YELL_LOVE3 "I live for this!"
#define SOUND_LOVE3 12469
// Boss spells.
#define SPELL_METEOR_SLASH 45150
#define SPELL_BURN 46394
#define SPELL_STOMP 45185
#define SPELL_BERSERK 26662
#define YELL_MADR_ICE_BARRIER -1580031
#define YELL_MADR_INTRO -1580032
#define YELL_MADR_ICE_BLOCK -1580033
#define YELL_MADR_TRAP -1580034
#define YELL_MADR_DEATH -1580035
#define YELL_AGGRO -1580022
#define YELL_KILL1 -1580023
#define YELL_KILL2 -1580024
#define YELL_KILL3 -1580025
#define YELL_LOVE1 -1580026
#define YELL_LOVE2 -1580027
#define YELL_LOVE3 -1580028
#define YELL_BERSERK -1580029
#define YELL_DEATH -1580030
#define SPELL_METEOR_SLASH 45150
#define SPELL_BURN 45141
#define SPELL_STOMP 45185
#define SPELL_BERSERK 26662
#define SPELL_DUAL_WIELD 42459
struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
{
boss_brutallusAI(Creature *c) : ScriptedAI(c) { Reset(); }
boss_brutallusAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance* pInstance;
uint32 SlashTimer;
uint32 BurnTimer;
@@ -81,33 +77,22 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
void Aggro(Unit *who)
{
DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_AGGRO);
DoScriptText(YELL_AGGRO, m_creature);
}
void KilledUnit(Unit* victim)
{
switch(rand()%3)
{
case 0:
DoYell(YELL_KILL1,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL1);
break;
case 1:
DoYell(YELL_KILL2,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL2);
break;
case 2:
DoYell(YELL_KILL3,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL3);
break;
case 0: DoScriptText(YELL_KILL1, m_creature); break;
case 1: DoScriptText(YELL_KILL2, m_creature); break;
case 2: DoScriptText(YELL_KILL3, m_creature); break;
}
}
void JustDied(Unit* Killer)
{
DoYell(YELL_DEATH,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(YELL_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -117,7 +102,7 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
if(SlashTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_METEOR_SLASH);
DoCast(m_creature->getVictim(),SPELL_METEOR_SLASH);
SlashTimer = 11000;
}else SlashTimer -= diff;
@@ -125,18 +110,9 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
{
switch(rand()%3)
{
case 0:
DoYell(YELL_LOVE1,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_LOVE1);
break;
case 1:
DoYell(YELL_LOVE2,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_LOVE2);
break;
case 2:
DoYell(YELL_LOVE3,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_LOVE3);
break;
case 0: DoScriptText(YELL_LOVE1, m_creature); break;
case 1: DoScriptText(YELL_LOVE2, m_creature); break;
case 2: DoScriptText(YELL_LOVE3, m_creature); break;
}
Unit *Target = m_creature->getVictim();
@@ -153,16 +129,15 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
}
else BurnTimer -= diff;
DoMeleeAttackIfReady();
if(BerserkTimer < diff)
{
DoYell(YELL_BERSERK,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_BERSERK);
DoScriptText(YELL_BERSERK, m_creature);
DoCast(m_creature,SPELL_BERSERK);
BerserkTimer = 20000;
}
else BerserkTimer -= diff;
DoMeleeAttackIfReady();
}
};
@@ -1,4 +1,4 @@
/* Copyright ?2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -23,42 +23,26 @@ EndScriptData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
#define KALECGOS_SAY_AGGRO "No longer will I be a slave to Malygos! Challenge me and you will be destroyed!"
#define KALECGOS_SOUND_AGGRO 12422
#define KALECGOS_SAY_SPELL_1 "I will purge you!"
#define KALECGOS_SOUND_SPELL_1 12423
#define KALECGOS_SAY_SPELL_2 "Your pain has only begun!"
#define KALECGOS_SOUND_SPELL_2 12424
#define KALECGOS_SAY_KILL_1 "In the name of Kil'jaeden!"
#define KALECGOS_SOUND_KILL_1 12425
#define KALECGOS_SAY_KILL_2 "You were warned!"
#define KALECGOS_SOUND_KILL_2 12426
#define KALECGOS_SAY_FLY_AWAY "My awakening is complete! You shall all perish!"
#define KALECGOS_SOUND_FLY_AWAY 12427
#define KALECGOS_SAY_WIN "I am forever in your debt. Once we have triumphed over Kil'jaeden, this entire world will be in your debt as well."
#define KALECGOS_SOUND_WIN 12431
//kalecgos dragon form
#define SAY_EVIL_AGGRO -1580000
#define SAY_EVIL_SPELL1 -1580001
#define SAY_EVIL_SPELL2 -1580002
#define SAY_EVIL_SLAY1 -1580003
#define SAY_EVIL_SLAY2 -1580004
#define SAY_EVIL_ENRAGE -1580005
//kalecgos humanoid form
#define SAY_GOOD_AGGRO -1580006
#define SAY_GOOD_NEAR_DEATH -1580007
#define SAY_GOOD_NEAR_DEATH2 -1580008
#define SAY_GOOD_PLRWIN -1580009
#define SATH_SAY_AGGRO "Gyahaha... There will be no reprieve. My work here is nearly finished."
#define SATH_SOUND_AGGRO 12451
#define SATH_SAY_DIE "I'm... never on... the losing... side..."
#define SATH_SOUND_DIE 12452
#define SATH_SAY_SPELL_1 "Your misery is my delight!"
#define SATH_SOUND_SPELL_1 12453
#define SATH_SAY_SPELL_2 "I will watch you bleed!"
#define SATH_SOUND_SPELL_2 12454
#define SATH_SAY_KILL_1 "Pitious mortal!"
#define SATH_SOUND_KILL_1 12455
#define SATH_SAY_KILL_2 "Haven't you heard? I always win!"
#define SATH_SOUND_KILL_2 12456
#define SATH_SAY_ENRAGE "I have toyed with you long enough!"
#define SATH_SOUND_ENRAGE 12457
#define KALEC_SAY_AGGRO "I need... your help... Cannot... resist him... much longer..."
#define KALEC_SOUND_AGGRO 12428
#define KALEC_SAY_LOSING1 "Aaahhh! Help me, before I lose my mind!"
#define KALEC_SOUND_LOSING1 12429
#define KALEC_SAY_LOSING2 "Hurry! There is not much of me left!" //???
#define KALEC_SOUND_LOSING2 12430
#define SAY_SATH_AGGRO -1580010
#define SAY_SATH_DEATH -1580011
#define SAY_SATH_SPELL1 -1580012
#define SAY_SATH_SPELL2 -1580013
#define SAY_SATH_SLAY1 -1580014
#define SAY_SATH_SLAY2 -1580015
#define SAY_SATH_ENRAGE -1580016
#define GO_FAILED "You are unable to use this currently."
@@ -175,8 +159,7 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
void Aggro(Unit* who)
{
m_creature->SetStandState(PLAYER_STATE_NONE);
DoYell(KALECGOS_SAY_AGGRO, LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, KALECGOS_SOUND_AGGRO);
DoScriptText(SAY_EVIL_AGGRO, m_creature);
GameObject *Door = GameObject::GetGameObject(*m_creature, DoorGUID);
if(Door) Door->SetLootState(GO_ACTIVATED);
DoZoneInCombat();
@@ -186,14 +169,8 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(KALECGOS_SAY_KILL_1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,KALECGOS_SOUND_KILL_1);
break;
case 1:
DoYell(KALECGOS_SAY_KILL_2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,KALECGOS_SOUND_KILL_2);
break;
case 0: DoScriptText(SAY_EVIL_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_EVIL_SLAY2, m_creature); break;
}
}
@@ -219,8 +196,7 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
TalkTimer = 1000;
break;
case 2:
DoSay(KALECGOS_SAY_WIN, LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature, KALECGOS_SOUND_WIN);
DoScriptText(SAY_GOOD_PLRWIN, m_creature);
TalkTimer = 10000;
break;
case 3:
@@ -239,8 +215,7 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
switch(TalkSequence)
{
case 1:
DoYell(KALECGOS_SAY_FLY_AWAY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,KALECGOS_SOUND_FLY_AWAY);
DoScriptText(SAY_EVIL_ENRAGE, m_creature);
TalkTimer = 3000;
break;
case 2:
@@ -315,8 +290,7 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI
m_creature->CombatStart(Kalec);
m_creature->AddThreat(Kalec, 100.0f);
}
DoYell(SATH_SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SATH_SOUND_AGGRO);
DoScriptText(SAY_SATH_AGGRO, m_creature);
}
void DamageTaken(Unit *done_by, uint32 &damage)
@@ -340,21 +314,14 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI
}
switch(rand()%2)
{
case 0:
DoYell(SATH_SAY_KILL_1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SATH_SOUND_KILL_1);
break;
case 1:
DoYell(SATH_SAY_KILL_2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SATH_SOUND_KILL_2);
break;
case 0: DoScriptText(SAY_SATH_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SATH_SLAY2, m_creature); break;
}
}
void JustDied(Unit *killer)
{
DoYell(SATH_SAY_DIE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SATH_SOUND_DIE);
DoScriptText(SAY_SATH_DEATH, m_creature);
m_creature->Relocate(m_creature->GetPositionX(), m_creature->GetPositionY(), DRAGON_REALM_Z, m_creature->GetOrientation());
TeleportAllPlayersBack();
if(Unit *Kalecgos = Unit::GetUnit(*m_creature, KalecgosGUID))
@@ -414,6 +381,7 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI
if(ShadowBoltTimer < diff)
{
DoScriptText(SAY_SATH_SPELL1, m_creature);
DoCast(m_creature, SPELL_SHADOW_BOLT);
ShadowBoltTimer = 7000+(rand()%3000);
}else ShadowBoltTimer -= diff;
@@ -428,6 +396,7 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI
if(CorruptionStrikeTimer < diff)
{
DoScriptText(SAY_SATH_SPELL2, m_creature);
DoCast(m_creature->getVictim(), SPELL_CORRUPTION_STRIKE);
CorruptionStrikeTimer = 13000;
}else CorruptionStrikeTimer -= diff;
@@ -494,23 +463,20 @@ struct TRINITY_DLL_DECL boss_kalecAI : public ScriptedAI
switch(YellSequence)
{
case 0:
DoYell(KALEC_SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, KALEC_SOUND_AGGRO);
DoScriptText(SAY_GOOD_AGGRO, m_creature);
YellSequence++;
break;
case 1:
if((m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 50)
{
DoYell(KALEC_SAY_LOSING1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, KALEC_SOUND_LOSING1);
DoScriptText(SAY_GOOD_NEAR_DEATH, m_creature);
YellSequence++;
}
break;
case 2:
if((m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 10)
{
DoYell(KALEC_SAY_LOSING2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, KALEC_SOUND_LOSING2);
DoScriptText(SAY_GOOD_NEAR_DEATH2, m_creature);
YellSequence++;
}
break;
@@ -645,7 +611,7 @@ void boss_sathrovarrAI::Enrage()
error_log("SD2 ERROR: unable to find Kalec");
return;
}
DoYell(SATH_SAY_ENRAGE,LANG_UNIVERSAL,NULL);
DoScriptText(SAY_SATH_ENRAGE, m_creature);
m_creature->CastSpell(m_creature, SPELL_ENRAGE, true);
Kalecgos->CastSpell(Kalecgos, SPELL_ENRAGE, true);
isEnraged = true;
@@ -3,7 +3,7 @@
* Please see the included DOCS/LICENSE.TXT for more information */
/* ScriptData
SDName: instance_sunwell_plateau
SDName: Instance_Sunwell_Plateau
SD%Complete: 0
SDComment: VERIFY SCRIPT
SDCategory: Sunwell_Plateau
@@ -25,7 +25,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
{
instance_sunwell_plateau(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_sunwell_plateau(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounters[ENCOUNTERS];
@@ -34,42 +34,19 @@ EndContentData */
# npc_millhouse_manastorm
#####*/
#define SAY_INTRO_1 "Where in Bonzo's brass buttons am I? And who are-- yaaghh, that's one mother of a headache!"
#define SOUND_INTRO_1 11171
#define SAY_INTRO_2 "\"Lowly\"? I don't care who you are friend, no one refers to the mighty Millhouse Manastorm as \"Lowly\"! I have no idea what goes on here, but I will gladly join your fight against this impudent imbecile! Prepare to defend yourself, cretin!"
#define SOUND_INTRO_2 11172
#define SAY_WATER "I just need to get some things ready first. You guys go ahead and get started. I need to summon up some water..."
#define SOUND_WATER 11173
#define SAY_BUFFS "Fantastic! Next, some protective spells. Yes! Now we're cookin'"
#define SOUND_BUFFS 11174
#define SAY_DRINK "And of course i'll need some mana. You guys are gonna love this, just wait."
#define SOUND_DRINK 11175
#define SAY_READY "Aaalllriiiight!! Who ordered up an extra large can of whoop-ass?"
#define SOUND_READY 11176
#define SAY_KILL_1 "I didn't even break a sweat on that one."
#define SOUND_KILL_1 11177
#define SAY_KILL_2 "You guys, feel free to jump in anytime."
#define SOUND_KILL_2 11178
#define SAY_PYRO "I'm gonna light you up, sweet cheeks!"
#define SOUND_PYRO 11179
#define SAY_ICEBLOCK "Ice, ice, baby!"
#define SOUND_ICEBLOCK 11180
#define SAY_LOWHP "Heal me! Oh, for the love of all that is holy, HEAL me! I'm dying!"
#define SOUND_LOWHP 11181
#define SAY_DEATH "You'll be hearing from my lawyer..."
#define SOUND_DEATH 11182
#define SAY_COMPLETE "Who's bad? Who's bad? That's right: we bad!"
#define SOUND_COMPLETE 11183
#define SAY_INTRO_1 -1552010
#define SAY_INTRO_2 -1552011
#define SAY_WATER -1552012
#define SAY_BUFFS -1552013
#define SAY_DRINK -1552014
#define SAY_READY -1552015
#define SAY_KILL_1 -1552016
#define SAY_KILL_2 -1552017
#define SAY_PYRO -1552018
#define SAY_ICEBLOCK -1552019
#define SAY_LOWHP -1552020
#define SAY_DEATH -1552021
#define SAY_COMPLETE -1552022
#define SPELL_CONJURE_WATER 36879
#define SPELL_ARCANE_INTELLECT 36880
@@ -117,8 +94,7 @@ struct TRINITY_DLL_DECL npc_millhouse_manastormAI : public ScriptedAI
if( pInstance->GetData(TYPE_HARBINGERSKYRISS) == DONE )
{
DoYell(SAY_COMPLETE,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_COMPLETE);
DoScriptText(SAY_COMPLETE, m_creature);
}
}
}
@@ -150,21 +126,14 @@ struct TRINITY_DLL_DECL npc_millhouse_manastormAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL_1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL_1);
break;
case 1:
DoYell(SAY_KILL_2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL_2);
break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoYell(SAY_DEATH,LANG_UNIVERSAL,0);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
/*for questId 10886 (heroic mode only)
if( pInstance && pInstance->GetData(TYPE_HARBINGERSKYRISS) != DONE )
@@ -182,36 +151,30 @@ struct TRINITY_DLL_DECL npc_millhouse_manastormAI : public ScriptedAI
switch( Phase )
{
case 1:
DoYell(SAY_INTRO_1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_INTRO_1);
DoScriptText(SAY_INTRO_1, m_creature);
EventProgress_Timer = 18000;
break;
case 2:
DoYell(SAY_INTRO_2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_INTRO_2);
DoScriptText(SAY_INTRO_2, m_creature);
EventProgress_Timer = 18000;
break;
case 3:
DoYell(SAY_WATER,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_WATER);
DoScriptText(SAY_WATER, m_creature);
DoCast(m_creature,SPELL_CONJURE_WATER);
EventProgress_Timer = 7000;
break;
case 4:
DoYell(SAY_BUFFS,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_BUFFS);
DoScriptText(SAY_BUFFS, m_creature);
DoCast(m_creature,SPELL_ICE_ARMOR);
EventProgress_Timer = 7000;
break;
case 5:
DoYell(SAY_DRINK,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_DRINK);
DoScriptText(SAY_DRINK, m_creature);
DoCast(m_creature,SPELL_ARCANE_INTELLECT);
EventProgress_Timer = 7000;
break;
case 6:
DoYell(SAY_READY,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_READY);
DoScriptText(SAY_READY, m_creature);
EventProgress_Timer = 6000;
break;
case 7:
@@ -230,8 +193,7 @@ struct TRINITY_DLL_DECL npc_millhouse_manastormAI : public ScriptedAI
if( !LowHp && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 20) )
{
DoYell(SAY_LOWHP,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_LOWHP);
DoScriptText(SAY_LOWHP, m_creature);
LowHp = true;
}
@@ -240,8 +202,7 @@ struct TRINITY_DLL_DECL npc_millhouse_manastormAI : public ScriptedAI
if( m_creature->IsNonMeleeSpellCasted(false) )
return;
DoYell(SAY_PYRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_PYRO);
DoScriptText(SAY_PYRO, m_creature);
DoCast(m_creature->getVictim(),SPELL_PYROBLAST);
Pyroblast_Timer = 40000;
@@ -266,28 +227,14 @@ CreatureAI* GetAI_npc_millhouse_manastorm(Creature *_Creature)
# npc_warden_mellichar
#####*/
#define YELL_INTRO1 "I knew the prince would be angry but, I... I have not been myself. I had to let them out! The great one speaks to me, you see. Wait--outsiders. Kael'thas did not send you! Good... I'll just tell the prince you released the prisoners!"
#define SOUND_INTRO1 11222
#define YELL_INTRO2 "The naaru kept some of the most dangerous beings in existence here in these cells. Let me introduce you to another...."
#define SOUND_INTRO2 11223
#define YELL_RELEASE1 "Yes, yes... another! Your will is mine!"
#define SOUND_RELEASE1 11224
#define YELL_RELEASE2A "Behold another terrifying creature of incomprehensible power!"
#define SOUND_RELEASE2A 11225
#define YELL_RELEASE2B "What is this? A lowly gnome? I will do better, O'great one."
#define SOUND_RELEASE2B 11226
#define YELL_RELEASE3 "Anarchy! Bedlam! Oh, you are so wise! Yes, I see it now, of course!"
#define SOUND_RELEASE3 11227
#define YELL_RELEASE4 "One final cell remains. Yes, O'great one, right away!"
#define SOUND_RELEASE4 11228
#define YELL_WELCOME "Welcome, O'great one. I am your humble servant."
#define SOUND_WELCOME 11229
#define YELL_INTRO1 -1552023
#define YELL_INTRO2 -1552024
#define YELL_RELEASE1 -1552025
#define YELL_RELEASE2A -1552026
#define YELL_RELEASE2B -1552027
#define YELL_RELEASE3 -1552028
#define YELL_RELEASE4 -1552029
#define YELL_WELCOME -1552030
//phase 2(acid mobs)
#define ENTRY_TRICKSTER 20905
@@ -366,19 +313,19 @@ struct TRINITY_DLL_DECL npc_warden_mellicharAI : public ScriptedAI
void Aggro(Unit *who)
{
DoYell(YELL_INTRO1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_INTRO1);
//possibly wrong spell OR should also cast second spell to make bubble appear (visual for this spell appear to be the correct)
DoScriptText(YELL_INTRO1, m_creature);
DoCast(m_creature,SPELL_BUBBLE_VISUAL);
if( pInstance )
{
pInstance->SetData(TYPE_HARBINGERSKYRISS,IN_PROGRESS);
if (GameObject* Sphere = GameObject::GetGameObject(*m_creature,pInstance->GetData64(DATA_SPHERE_SHIELD)))
Sphere->SetGoState(1);
IsRunning = true;
}
}
uint32 CanProgress()
bool CanProgress()
{
if( pInstance )
{
@@ -467,8 +414,7 @@ struct TRINITY_DLL_DECL npc_warden_mellicharAI : public ScriptedAI
m_creature->SummonCreature(ENTRY_MILLHOUSE,413.292,-148.378,42.56,6.27,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000);
break;
case 4:
DoYell(YELL_RELEASE2B,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RELEASE2B);
DoScriptText(YELL_RELEASE2B, m_creature);
break;
case 5:
switch( rand()%2 )
@@ -486,8 +432,7 @@ struct TRINITY_DLL_DECL npc_warden_mellicharAI : public ScriptedAI
break;
case 7:
m_creature->SummonCreature(ENTRY_SKYRISS,445.763,-191.639,44.64,1.60,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000);
DoYell(YELL_WELCOME,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_WELCOME);
DoScriptText(YELL_WELCOME, m_creature);
break;
}
CanSpawn = false;
@@ -498,20 +443,17 @@ struct TRINITY_DLL_DECL npc_warden_mellicharAI : public ScriptedAI
switch( Phase )
{
case 1:
DoYell(YELL_INTRO2,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_INTRO2);
DoScriptText(YELL_INTRO2, m_creature);
EventProgress_Timer = 10000;
++Phase;
break;
case 2:
DoYell(YELL_RELEASE1,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RELEASE1);
DoScriptText(YELL_RELEASE1, m_creature);
DoPrepareForPhase();
EventProgress_Timer = 7000;
break;
case 3:
DoYell(YELL_RELEASE2A,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RELEASE2A);
DoScriptText(YELL_RELEASE2A, m_creature);
DoPrepareForPhase();
EventProgress_Timer = 10000;
break;
@@ -520,14 +462,12 @@ struct TRINITY_DLL_DECL npc_warden_mellicharAI : public ScriptedAI
EventProgress_Timer = 15000;
break;
case 5:
DoYell(YELL_RELEASE3,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RELEASE3);
DoScriptText(YELL_RELEASE3, m_creature);
DoPrepareForPhase();
EventProgress_Timer = 15000;
break;
case 6:
DoYell(YELL_RELEASE4,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_RELEASE4);
DoScriptText(YELL_RELEASE4, m_creature);
DoPrepareForPhase();
EventProgress_Timer = 15000;
break;
@@ -17,7 +17,7 @@
/* ScriptData
SDName: Boss_Harbinger_Skyriss
SD%Complete: 45
SDComment: CombatAI not fully implemented. Timers will need adjustments. Need better method to "kill" the warden. Need more docs on how event fully work. Reset all event and force start over if fail at one point?
SDComment: CombatAI not fully implemented. Timers will need adjustments. Need more docs on how event fully work. Reset all event and force start over if fail at one point?
SDCategory: Tempest Keep, The Arcatraz
EndScriptData */
@@ -29,32 +29,16 @@ EndContentData */
#include "precompiled.h"
#include "def_arcatraz.h"
#define SAY_INTRO "It is a small matter to control the mind of the weak... for I bear allegiance to powers untouched by time, unmoved by fate. No force on this world or beyond harbors the strength to bend our knee... not even the mighty Legion!"
#define SOUND_INTRO 11122
#define SAY_AGGRO "Bear witness to the agent of your demise!"
#define SOUND_AGGRO 11123
#define SAY_KILL_1 "Your fate is written!"
#define SOUND_KILL_1 11124
#define SAY_KILL_2 "The chaos I have sown here is but a taste...."
#define SOUND_KILL_2 11125
#define SAY_MIND_1 "You will do my bidding, weakling."
#define SOUND_MIND_1 11127
#define SAY_MIND_2 "Your will is no longer your own."
#define SOUND_MIND_2 11128
#define SAY_FEAR_1 "Flee in terror!"
#define SOUND_FEAR_1 11129
#define SAY_FEAR_2 "I will show you horrors undreamed of!"
#define SOUND_FEAR_2 11130
#define SAY_IMAGE "We span the universe, as countless as the stars!"
#define SOUND_IMAGE 11131
#define SAY_DEATH "I am merely one of... infinite multitudes."
#define SOUND_DEATH 11126
#define SAY_INTRO -1552000
#define SAY_AGGRO -1552001
#define SAY_KILL_1 -1552002
#define SAY_KILL_2 -1552003
#define SAY_MIND_1 -1552004
#define SAY_MIND_2 -1552005
#define SAY_FEAR_1 -1552006
#define SAY_FEAR_2 -1552007
#define SAY_IMAGE -1552008
#define SAY_DEATH -1552009
#define SPELL_FEAR 39415
@@ -75,6 +59,7 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Intro = false;
Reset();
}
@@ -96,11 +81,6 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
{
m_creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_ATTACKABLE_2);
if( Intro )
Intro = true;
else
Intro = false;
IsImage33 = false;
IsImage66 = false;
@@ -114,7 +94,7 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
void MoveInLineOfSight(Unit *who)
{
if(Intro)
if(!Intro)
ScriptedAI::MoveInLineOfSight(who);
}
@@ -131,27 +111,21 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
void JustDied(Unit* Killer)
{
DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_DEATH);
DoScriptText(SAY_DEATH, m_creature);
if( pInstance )
pInstance->SetData(TYPE_HARBINGERSKYRISS,DONE);
}
void KilledUnit(Unit* victim)
{
/*if( victim->GetEntry() == 21436 )
return;*/
//won't yell killing pet/other unit
if( victim->GetEntry() == 21436 )
return;
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL_1);
break;
case 1:
DoYell(SAY_KILL_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL_2);
break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
}
}
@@ -165,8 +139,7 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
if( m_creature->IsNonMeleeSpellCasted(false) )
m_creature->InterruptNonMeleeSpells(false);
DoYell(SAY_IMAGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_IMAGE);
DoScriptText(SAY_IMAGE, m_creature);
if( val == 66 )
DoCast(m_creature, SPELL_66_ILLUSION);
@@ -186,14 +159,14 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
switch( Intro_Phase )
{
case 1:
DoYell(SAY_INTRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_INTRO);
DoScriptText(SAY_INTRO, m_creature);
if (GameObject* Sphere = GameObject::GetGameObject(*m_creature,pInstance->GetData64(DATA_SPHERE_SHIELD)))
Sphere->SetGoState(0);
++Intro_Phase;
Intro_Timer = 25000;
break;
case 2:
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
if( Unit *mellic = Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_MELLICHAR)) )
{
//should have a better way to do this. possibly spell exist.
@@ -242,14 +215,8 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_FEAR_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_FEAR_1);
break;
case 1:
DoYell(SAY_FEAR_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_FEAR_2);
break;
case 0: DoScriptText(SAY_FEAR_1, m_creature); break;
case 1: DoScriptText(SAY_FEAR_2, m_creature); break;
}
if( Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1) )
@@ -267,14 +234,8 @@ struct TRINITY_DLL_DECL boss_harbinger_skyrissAI : public ScriptedAI
switch(rand()%2)
{
case 0:
DoYell(SAY_MIND_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_MIND_1);
break;
case 1:
DoYell(SAY_MIND_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_MIND_2);
break;
case 0: DoScriptText(SAY_MIND_1, m_creature); break;
case 1: DoScriptText(SAY_MIND_2, m_creature); break;
}
if( Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1) )
@@ -16,4 +16,5 @@
#define TYPE_WARDEN_5 9
#define DATA_MELLICHAR 10
#define TYPE_SHIELD_OPEN 11
#define DATA_SPHERE_SHIELD 12
#endif
@@ -34,9 +34,11 @@ EndScriptData */
#define POD_GAMMA 183962 //pod fourth boss wave
#define POD_OMEGA 183965 //pod fifth boss wave
#define WARDENS_SHIELD 184802 // warden shield
#define SEAL_SPHERE 184802 //shield 'protecting' mellichar
#define MELLICHAR 20904 //skyriss will kill this unit
/* Arcatraz encounters:
1 - Zereketh the Unbound event
2 - Dalliah the Doomsayer event
@@ -46,7 +48,7 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
{
instance_arcatraz(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_arcatraz(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
@@ -59,7 +61,8 @@ struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
GameObject *Pod_Omega;
GameObject *Wardens_Shield;
uint64 Mellichar;
uint64 GoSphereGUID;
uint64 MellicharGUID;
void Initialize()
{
@@ -72,7 +75,8 @@ struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
Pod_Omega = NULL;
Wardens_Shield = NULL;
Mellichar = 0;
GoSphereGUID = 0;
MellicharGUID = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
@@ -81,7 +85,8 @@ struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
bool IsEncounterInProgress() const
{
for(uint8 i = 0; i < ENCOUNTERS; i++)
if(Encounter[i]) return true;
if(Encounter[i])
return true;
return false;
}
@@ -92,23 +97,20 @@ struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
{
case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_Alpha = go; break;
case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_Beta = go; break;
case SEAL_SPHERE: GoSphereGUID = go->GetGUID(); break;
case POD_ALPHA: Pod_Alpha = go; break;
case POD_BETA: Pod_Beta = go; break;
case POD_DELTA: Pod_Delta = go; break;
case POD_GAMMA: Pod_Gamma = go; break;
case POD_OMEGA: Pod_Omega = go; break;
case WARDENS_SHIELD: Wardens_Shield = go; break;
//case WARDENS_SHIELD: Wardens_Shield = go; break;
}
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature_entry)
{
case MELLICHAR:
Mellichar = creature->GetGUID();
break;
}
if (creature->GetEntry() == MELLICHAR)
MellicharGUID = creature->GetGUID();
}
void SetData(uint32 type, uint32 data)
@@ -188,9 +190,9 @@ struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
}
}
uint32 GetData(uint32 data)
uint32 GetData(uint32 type)
{
switch(data)
switch(type)
{
case TYPE_HARBINGERSKYRISS:
return Encounter[3];
@@ -208,12 +210,14 @@ struct TRINITY_DLL_DECL instance_arcatraz : public ScriptedInstance
return 0;
}
uint64 GetData64(uint32 identifier)
uint64 GetData64(uint32 data)
{
switch(identifier)
switch(data)
{
case DATA_MELLICHAR:
return Mellichar;
return MellicharGUID;
case DATA_SPHERE_SHIELD:
return GoSphereGUID;
}
return 0;
}
@@ -23,21 +23,12 @@ EndScriptData */
#include "precompiled.h"
#define SAY_AGGRO "What are you doing? These specimens are very delicate!"
#define SOUND_AGGRO 11144
#define SAY_KILL_1 "Your life cycle is now concluded!"
#define SOUND_KILL_1 11145
#define SAY_KILL_2 "You will feed the worms."
#define SOUND_KILL_2 11146
#define SAY_TREE_1 "Endorel aluminor!"
#define SOUND_TREE_1 11147
#define SAY_TREE_2 "Nature bends to my will!"
#define SOUND_TREE_2 11148
#define SAY_DEATH "The specimens...must be preserved."
#define SOUND_DEATH 11149
#define SAY_AGGRO -1553000
#define SAY_KILL_1 -1553001
#define SAY_KILL_2 -1553002
#define SAY_TREE_1 -1553003
#define SAY_TREE_2 -1553004
#define SAY_DEATH -1553005
#define SPELL_TRANQUILITY 34550
#define SPELL_TREE_FORM 34551
@@ -75,8 +66,7 @@ struct TRINITY_DLL_DECL boss_high_botanist_freywinnAI : public ScriptedAI
void Aggro(Unit *who)
{
DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
DoScriptText(SAY_AGGRO, m_creature);
}
void JustSummoned(Creature *summoned)
@@ -100,17 +90,16 @@ struct TRINITY_DLL_DECL boss_high_botanist_freywinnAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_KILL_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL_1);
break;
case 1:
DoYell(SAY_KILL_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_KILL_2);
break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
}
}
void JustDied(Unit* Killer)
{
DoScriptText(SAY_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
{
if( !m_creature->SelectHostilTarget() || !m_creature->getVictim() )
@@ -120,14 +109,8 @@ struct TRINITY_DLL_DECL boss_high_botanist_freywinnAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(SAY_TREE_1, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_TREE_1);
break;
case 1:
DoYell(SAY_TREE_2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature,SOUND_TREE_2);
break;
case 0: DoScriptText(SAY_TREE_1, m_creature); break;
case 1: DoScriptText(SAY_TREE_2, m_creature); break;
}
if( m_creature->IsNonMeleeSpellCasted(false) )

Some files were not shown because too many files have changed in this diff Show More