aboutsummaryrefslogtreecommitdiff
path: root/src/bindings/scripts
diff options
context:
space:
mode:
authorQAston <none@none>2009-05-15 18:00:50 +0200
committerQAston <none@none>2009-05-15 18:00:50 +0200
commita796012723dd2410a150264a4f32f00bc570ef76 (patch)
treed55cada7db3c9c752815c79d9d164069acd99edc /src/bindings/scripts
parentae461a4158d6376e28e7bc53d3f7ad5690a5064e (diff)
parentad92f5e210b7a2c0584cdabd30560fe723d160be (diff)
*Merge some fixes from tc1
--HG-- branch : trunk
Diffstat (limited to 'src/bindings/scripts')
-rw-r--r--src/bindings/scripts/ScriptMgr.cpp4
-rw-r--r--src/bindings/scripts/VC80/80ScriptDev2.vcproj16
-rw-r--r--src/bindings/scripts/VC90/90ScriptDev2.vcproj16
-rw-r--r--src/bindings/scripts/include/precompiled.h3
-rw-r--r--src/bindings/scripts/include/sc_creature.cpp285
-rw-r--r--src/bindings/scripts/include/sc_creature.h122
-rw-r--r--src/bindings/scripts/include/sc_instance.h13
-rw-r--r--src/bindings/scripts/scripts/creature/mob_generic_creature.cpp35
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp168
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp38
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp129
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp374
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp29
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp29
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp142
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp38
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp150
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp401
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/def_naxxramas.h19
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp87
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp10
-rw-r--r--src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp5
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/utgarde_keep.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp2
59 files changed, 1291 insertions, 949 deletions
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp
index 18465bfacf7..849c4d64be5 100644
--- a/src/bindings/scripts/ScriptMgr.cpp
+++ b/src/bindings/scripts/ScriptMgr.cpp
@@ -389,6 +389,7 @@ extern void AddSC_boss_sapphiron();
extern void AddSC_boss_four_horsemen();
extern void AddSC_boss_faerlina();
extern void AddSC_boss_heigan();
+extern void AddSC_boss_gothik();
extern void AddSC_instance_naxxramas();
//Netherstorm
@@ -1327,6 +1328,7 @@ void ScriptsInit(char const* cfg_file = "trinitycore.conf")
AddSC_boss_sapphiron();
AddSC_boss_four_horsemen();
AddSC_boss_heigan();
+ AddSC_boss_gothik();
AddSC_instance_naxxramas();
//Netherstorm
@@ -1657,7 +1659,7 @@ void Script::RegisterSelf()
m_scripts[id] = this;
++num_sc_scripts;
}
- else
+ else if(Name.find("example") == std::string::npos)
{
error_db_log("CRASH ALERT! TrinityScript: RegisterSelf, but script named %s does not have ScriptName assigned in database.",(this)->Name.c_str());
delete this;
diff --git a/src/bindings/scripts/VC80/80ScriptDev2.vcproj b/src/bindings/scripts/VC80/80ScriptDev2.vcproj
index c442ae52a2d..28875c526ab 100644
--- a/src/bindings/scripts/VC80/80ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC80/80ScriptDev2.vcproj
@@ -68,10 +68,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="TrinityCore.lib zthread.lib"
+ AdditionalDependencies="TrinityCore.lib aced.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
- AdditionalLibraryDirectories="..\..\..\..\win\VC80\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/TrinityScript.pdb"
SubSystem="2"
@@ -151,10 +151,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="TrinityCore.lib zthread.lib"
+ AdditionalDependencies="TrinityCore.lib ace.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
- AdditionalLibraryDirectories="..\..\..\..\win\VC80\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
@@ -236,10 +236,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="TrinityCore.lib zthread.lib"
+ AdditionalDependencies="TrinityCore.lib aced.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
- AdditionalLibraryDirectories="..\..\..\..\win\VC80\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/TrinityScript.pdb"
SubSystem="2"
@@ -320,10 +320,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="TrinityCore.lib zthread.lib"
+ AdditionalDependencies="TrinityCore.lib ace.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
- AdditionalLibraryDirectories="..\..\..\..\win\VC80\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC80\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
diff --git a/src/bindings/scripts/VC90/90ScriptDev2.vcproj b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
index 398e54d6ec4..8f8330db453 100644
--- a/src/bindings/scripts/VC90/90ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
@@ -68,10 +68,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="trinitycore.lib zthread.lib"
+ AdditionalDependencies="trinitycore.lib aced.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
- AdditionalLibraryDirectories="..\..\..\..\win\VC90\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/TrinityScript.pdb"
SubSystem="2"
@@ -152,10 +152,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="trinitycore.lib zthread.lib"
+ AdditionalDependencies="trinitycore.lib ace.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
- AdditionalLibraryDirectories="..\..\..\..\win\VC90\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
@@ -237,10 +237,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="trinitycore.lib zthread.lib"
+ AdditionalDependencies="trinitycore.lib aced.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="2"
- AdditionalLibraryDirectories="..\..\..\..\win\VC90\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)/TrinityScript.pdb"
SubSystem="2"
@@ -320,10 +320,10 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="trinitycore.lib zthread.lib"
+ AdditionalDependencies="trinitycore.lib ace.lib"
OutputFile="$(OutDir)/TrinityScript.dll"
LinkIncremental="1"
- AdditionalLibraryDirectories="..\..\..\..\win\VC90\zthread__$(PlatformName)_$(ConfigurationName);..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ AdditionalLibraryDirectories="..\..\..\..\win\VC90\trinitycore__$(PlatformName)_$(ConfigurationName);..\..\..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
diff --git a/src/bindings/scripts/include/precompiled.h b/src/bindings/scripts/include/precompiled.h
index 2c36cc924e0..fa676f460ef 100644
--- a/src/bindings/scripts/include/precompiled.h
+++ b/src/bindings/scripts/include/precompiled.h
@@ -12,10 +12,11 @@
#include "GridNotifiersImpl.h"
#include "Unit.h"
#include "GameObject.h"
-#include "TemporarySummon.h"
#include "sc_creature.h"
#include "sc_gossip.h"
#include "sc_instance.h"
+#include "AggressorAI.h"
+#include "NullCreatureAI.h"
#ifdef WIN32
#include <windows.h>
diff --git a/src/bindings/scripts/include/sc_creature.cpp b/src/bindings/scripts/include/sc_creature.cpp
index 258c7627dce..e575e40fac1 100644
--- a/src/bindings/scripts/include/sc_creature.cpp
+++ b/src/bindings/scripts/include/sc_creature.cpp
@@ -9,6 +9,7 @@
#include "Item.h"
#include "Spell.h"
#include "ObjectMgr.h"
+#include "TemporarySummon.h"
// Spell summary for ScriptedAI::SelectSpell
struct TSpellSummary {
@@ -16,13 +17,26 @@ struct TSpellSummary {
uint8 Effects; // set of enum SelectEffect
} *SpellSummary;
+void SummonList::DoZoneInCombat(uint32 entry)
+{
+ for(iterator i = begin(); i != end();)
+ {
+ Creature *summon = Unit::GetCreature(*m_creature, *i);
+ ++i;
+ if(summon && summon->IsAIEnabled
+ && (!entry || summon->GetEntry() == entry))
+ summon->AI()->DoZoneInCombat();
+ }
+}
+
void SummonList::DoAction(uint32 entry, uint32 info)
{
for(iterator i = begin(); i != end();)
{
Creature *summon = Unit::GetCreature(*m_creature, *i);
++i;
- if(summon && summon->IsAIEnabled)
+ if(summon && summon->IsAIEnabled
+ && (!entry || summon->GetEntry() == entry))
summon->AI()->DoAction(info);
}
}
@@ -55,7 +69,11 @@ void SummonList::DespawnAll()
else
{
erase(begin());
- summon->setDeathState(JUST_DIED);
+ summon->SetVisibility(VISIBILITY_OFF);
+ if(summon->HasSummonMask(SUMMON_MASK_SUMMON) && !summon->isPet())
+ ((TempSummon*)summon)->UnSummon();
+ else
+ summon->setDeathState(JUST_DIED);
summon->RemoveCorpse();
}
}
@@ -108,26 +126,6 @@ void ScriptedAI::UpdateAI(const uint32 diff)
}
}
-void ScriptedAI::EnterEvadeMode()
-{
- //m_creature->InterruptNonMeleeSpells(true);
- m_creature->RemoveAllAuras();
- m_creature->DeleteThreatList();
- m_creature->CombatStop();
- m_creature->LoadCreaturesAddon();
- m_creature->SetLootRecipient(NULL);
-
- if(m_creature->isAlive())
- m_creature->GetMotionMaster()->MoveTargetedHome();
-
- Reset();
-}
-
-void ScriptedAI::JustRespawned()
-{
- Reset();
-}
-
void ScriptedAI::DoStartMovement(Unit* victim, float distance, float angle)
{
if (!victim)
@@ -228,6 +226,19 @@ Creature* ScriptedAI::DoSpawnCreature(uint32 id, float x, float y, float z, floa
return m_creature->SummonCreature(id,m_creature->GetPositionX() + x,m_creature->GetPositionY() + y,m_creature->GetPositionZ() + z, angle, (TempSummonType)type, despawntime);
}
+Creature *ScriptedAI::DoSummon(uint32 entry, const float pos[4], uint32 despawntime, TempSummonType type)
+{
+ return me->SummonCreature(entry, pos[0], pos[1], pos[2], pos[3], type, despawntime);
+}
+
+Creature *ScriptedAI::DoSummon(uint32 entry, WorldObject *obj, float radius, uint32 despawntime, TempSummonType type)
+{
+ float x, y, z;
+ obj->GetGroundPointAroundUnit(x, y, z, radius * rand_norm(), rand_norm()*2*M_PI);
+ return me->SummonCreature(entry, x, y, z, me->GetOrientation(), type, despawntime);
+}
+
+
Unit* ScriptedAI::SelectUnit(SelectAggroTarget target, uint32 position)
{
//ThreatList m_threatlist;
@@ -259,147 +270,7 @@ Unit* ScriptedAI::SelectUnit(SelectAggroTarget target, uint32 position)
return NULL;
}
-struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool>
-{
- const Unit* me;
- TargetDistanceOrder(const Unit* Target) : me(Target) {};
- // functor for operator ">"
- bool operator()(const Unit* _Left, const Unit* _Right) const
- {
- return (me->GetDistance(_Left) < me->GetDistance(_Right));
- }
-};
-
-Unit* ScriptedAI::SelectUnit(SelectAggroTarget targetType, uint32 position, float dist, bool playerOnly)
-{
- if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
- {
- std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
- if(m_threatlist.empty()) return NULL;
- std::list<Unit*> targetList;
- std::list<HostilReference*>::iterator itr = m_threatlist.begin();
- for(; itr!= m_threatlist.end(); ++itr)
- {
- Unit *target = (*itr)->getTarget();
- if(!target
- || playerOnly && target->GetTypeId() != TYPEID_PLAYER
- || dist && !m_creature->IsWithinCombatRange(target, dist))
- {
- continue;
- }
- targetList.push_back(target);
- }
- if(position >= targetList.size())
- return NULL;
- targetList.sort(TargetDistanceOrder(m_creature));
- if(targetType == SELECT_TARGET_NEAREST)
- {
- std::list<Unit*>::iterator i = targetList.begin();
- advance(i, position);
- return *i;
- }
- else
- {
- std::list<Unit*>::reverse_iterator i = targetList.rbegin();
- advance(i, position);
- return *i;
- }
- }
- else
- {
- std::list<HostilReference*> m_threatlist = m_creature->getThreatManager().getThreatList();
- std::list<HostilReference*>::iterator i;
- Unit *target;
- while(position < m_threatlist.size())
- {
- if(targetType == SELECT_TARGET_BOTTOMAGGRO)
- {
- i = m_threatlist.end();
- advance(i, - (int32)position - 1);
- }
- else
- {
- i = m_threatlist.begin();
- if(targetType == SELECT_TARGET_TOPAGGRO)
- advance(i, position);
- else // random
- advance(i, position + rand()%(m_threatlist.size() - position));
- }
-
- target = (*i)->getTarget();
- if(!target
- || playerOnly && target->GetTypeId() != TYPEID_PLAYER
- || dist && !m_creature->IsWithinCombatRange(target, dist))
- {
- m_threatlist.erase(i);
- }
- else
- {
- return target;
- }
- }
- }
-
- return NULL;
-}
-
-void ScriptedAI::SelectUnitList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly)
-{
- if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
- {
- std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
- if(m_threatlist.empty()) return;
- std::list<HostilReference*>::iterator itr = m_threatlist.begin();
- for(; itr!= m_threatlist.end(); ++itr)
- {
- Unit *target = (*itr)->getTarget();
- if(!target
- || playerOnly && target->GetTypeId() != TYPEID_PLAYER
- || dist && !m_creature->IsWithinCombatRange(target, dist))
- {
- continue;
- }
- targetList.push_back(target);
- }
- targetList.sort(TargetDistanceOrder(m_creature));
- targetList.resize(num);
- if(targetType == SELECT_TARGET_FARTHEST)
- targetList.reverse();
- }
- else
- {
- std::list<HostilReference*> m_threatlist = m_creature->getThreatManager().getThreatList();
- std::list<HostilReference*>::iterator i;
- Unit *target;
- while(m_threatlist.size() && num)
- {
- if(targetType == SELECT_TARGET_BOTTOMAGGRO)
- {
- i = m_threatlist.end();
- --i;
- }
- else
- {
- i = m_threatlist.begin();
- if(targetType == SELECT_TARGET_RANDOM)
- advance(i, rand()%m_threatlist.size());
- }
-
- target = (*i)->getTarget();
- m_threatlist.erase(i);
- if(!target
- || playerOnly && target->GetTypeId() != TYPEID_PLAYER
- || dist && !m_creature->IsWithinCombatRange(target, dist))
- {
- continue;
- }
- targetList.push_back(target);
- --num;
- }
- }
-}
-
-SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTarget Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effects)
+SpellEntry const* ScriptedAI::SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTargetType Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effects)
{
//No target so we can't cast
if (!Target)
@@ -515,7 +386,6 @@ bool ScriptedAI::CanCast(Unit* Target, SpellEntry const *Spell, bool Triggered)
return true;
}
-
float GetSpellMaxRangeForHostile(uint32 id)
{
SpellEntry const *spellInfo = GetSpellStore()->LookupEntry(id);
@@ -531,7 +401,7 @@ void FillSpellSummary()
SpellEntry const* TempSpell;
- for (int i=0; i < GetSpellStore()->GetNumRows(); i++ )
+ for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
{
SpellSummary[i].Effects = 0;
SpellSummary[i].Targets = 0;
@@ -541,7 +411,7 @@ void FillSpellSummary()
if (!TempSpell)
continue;
- for (int j=0; j<3; j++)
+ for(uint32 j = 0; j < 3; ++j)
{
//Spell targets self
if ( TempSpell->EffectImplicitTargetA[j] == TARGET_UNIT_CASTER )
@@ -649,6 +519,11 @@ void ScriptedAI::DoTeleportTo(float x, float y, float z, uint32 time)
m_creature->SendMonsterMove(x, y, z, time);
}
+void ScriptedAI::DoTeleportTo(const float pos[4])
+{
+ me->NearTeleportTo(pos[0], pos[1], pos[2], pos[3]);
+}
+
void ScriptedAI::DoTeleportPlayer(Unit* pUnit, float x, float y, float z, float o)
{
if(!pUnit || pUnit->GetTypeId() != TYPEID_PLAYER)
@@ -775,23 +650,85 @@ void Scripted_NoMovementAI::AttackStart(Unit* who)
}
}
+void BossAI::_Reset()
+{
+ events.Reset();
+ summons.DespawnAll();
+ instance->SetBossState(bossId, NOT_STARTED);
+}
+
+void BossAI::_JustDied()
+{
+ events.Reset();
+ summons.DespawnAll();
+ instance->SetBossState(bossId, DONE);
+}
+
+void BossAI::_EnterCombat()
+{
+ DoZoneInCombat();
+ instance->SetBossState(bossId, IN_PROGRESS);
+}
+
+void BossAI::JustSummoned(Creature *summon)
+{
+ summons.Summon(summon);
+ if(me->isInCombat())
+ DoZoneInCombat(summon);
+}
+
+void BossAI::SummonedCreatureDespawn(Creature *summon)
+{
+ summons.Despawn(summon);
+}
+
+#define GOBJECT(x) (const_cast<GameObjectInfo*>(GetGameObjectInfo(x)))
+
void LoadOverridenSQLData()
{
GameObjectInfo *goInfo;
// Sunwell Plateau : Kalecgos : Spectral Rift
- goInfo = const_cast<GameObjectInfo*>(GetGameObjectInfo(187055));
- if(goInfo && goInfo->type == GAMEOBJECT_TYPE_GOOBER)
- goInfo->goober.lockId = 57; // need LOCKTYPE_QUICK_OPEN
+ if(goInfo = GOBJECT(187055))
+ if(goInfo->type == GAMEOBJECT_TYPE_GOOBER)
+ goInfo->goober.lockId = 57; // need LOCKTYPE_QUICK_OPEN
+
+ // Naxxramas : Sapphiron Birth
+ if(goInfo = GOBJECT(181356))
+ if(goInfo->type == GAMEOBJECT_TYPE_TRAP)
+ goInfo->trap.radius = 50;
}
void LoadOverridenDBCData()
{
SpellEntry *spellInfo;
+ for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
+ {
+ spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(i);
+ if(!spellInfo)
+ continue;
- // Black Temple : Illidan : Parasitic Shadowfiend Passive
- spellInfo = const_cast<SpellEntry*>(GetSpellStore()->LookupEntry(41913));
- if(spellInfo)
- spellInfo->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
+ switch(i)
+ {
+ // Black Temple : Illidan : Parasitic Shadowfiend Passive
+ case 41013:
+ spellInfo->EffectApplyAuraName[0] = 4; // proc debuff, and summon infinite fiends
+ break;
+ //temp, not needed in 310
+ case 28531:
+ case 55799:
+ spellInfo->DurationIndex = 21;
+ spellInfo->Effect[0] = SPELL_EFFECT_APPLY_AREA_AURA_ENEMY;
+ break;
+ // Naxxramas: Gothik : Inform Inf range
+ case 27892:
+ case 27928:
+ case 27935:
+ case 27915:
+ case 27931:
+ case 27937:
+ spellInfo->rangeIndex = 13;
+ break;
+ }
+ }
}
-
diff --git a/src/bindings/scripts/include/sc_creature.h b/src/bindings/scripts/include/sc_creature.h
index 638b6926a27..80016619e8b 100644
--- a/src/bindings/scripts/include/sc_creature.h
+++ b/src/bindings/scripts/include/sc_creature.h
@@ -8,75 +8,28 @@
#ifndef SC_CREATURE_H
#define SC_CREATURE_H
-#include "CreatureAI.h"
#include "Creature.h"
+#include "CreatureAI.h"
+#include "CreatureAIImpl.h"
-#define HEROIC(n,h) (HeroicMode ? h : n)
-
-template<class T>
-inline
-const T& RAND(const T& v1, const T& v2)
-{
- return rand()%2 ? v1 : v2;
-}
-
-template<class T>
-inline
-const T& RAND(const T& v1, const T& v2, const T& v3)
-{
- switch(rand()%3)
- {
- default:
- case 0: return v1;
- case 1: return v2;
- case 2: return v3;
- }
-}
-
-template<class T>
-inline
-const T& RAND(const T& v1, const T& v2, const T& v3, const T& v4)
-{
- switch(rand()%4)
- {
- default:
- case 0: return v1;
- case 1: return v2;
- case 2: return v3;
- case 3: return v4;
- }
-}
-
-template<class T>
-inline
-const T& RAND(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5)
-{
- switch(rand()%4)
- {
- default:
- case 0: return v1;
- case 1: return v2;
- case 2: return v3;
- case 3: return v4;
- case 4: return v5;
- }
-}
-
-float GetSpellMaxRangeForHostile(uint32 id);
+class ScriptedInstance;
class SummonList : private std::list<uint64>
{
-public:
- explicit SummonList(Creature* creature) : m_creature(creature) {}
- void Summon(Creature *summon) { push_back(summon->GetGUID()); }
- void Despawn(Creature *summon) { remove(summon->GetGUID()); }
- void DespawnEntry(uint32 entry);
- void DespawnAll();
- void DoAction(uint32 entry, uint32 info);
-private:
- Creature *m_creature;
+ public:
+ explicit SummonList(Creature* creature) : m_creature(creature) {}
+ void Summon(Creature *summon) { push_back(summon->GetGUID()); }
+ void Despawn(Creature *summon) { remove(summon->GetGUID()); }
+ void DespawnEntry(uint32 entry);
+ void DespawnAll();
+ void DoAction(uint32 entry, uint32 info);
+ void DoZoneInCombat(uint32 entry = 0);
+ private:
+ Creature *m_creature;
};
+float GetSpellMaxRangeForHostile(uint32 id);
+
//Get a single creature of given entry
Unit* FindCreature(uint32 entry, float range, Unit* Finder);
@@ -106,9 +59,6 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
void AttackStart(Unit *);
void AttackStart(Unit *, bool melee);
- //Called at stoping attack by any attacker
- void EnterEvadeMode();
-
// Called at any Damage from any attacker (before damage apply)
void DamageTaken(Unit *done_by, uint32 &damage) {}
@@ -133,11 +83,8 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
// Called when spell hits a target
void SpellHitTarget(Unit* target, const SpellEntry*) {}
- // Called when creature is spawned or respawned (for reseting variables)
- void JustRespawned();
-
//Called at waypoint reached or PointMovement end
- void MovementInform(uint32, uint32){}
+ void MovementInform(uint32 type, uint32 id){}
// Called when AI is temporarily replaced or put back when possess is applied or removed
void OnPossess(bool apply) {}
@@ -206,6 +153,7 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
void DoModifyThreatPercent(Unit *pUnit, int32 pct);
void DoTeleportTo(float x, float y, float z, uint32 time = 0);
+ void DoTeleportTo(const float pos[4]);
void DoAction(const int32 param) {}
@@ -224,16 +172,16 @@ struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
//Spawns a creature relative to m_creature
Creature* DoSpawnCreature(uint32 id, float x, float y, float z, float angle, uint32 type, uint32 despawntime);
+ Creature *DoSummon(uint32 entry, const float pos[4], uint32 despawntime = 30000, TempSummonType type = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
+ Creature *DoSummon(uint32 entry, WorldObject *obj, float radius = 5.0f, uint32 despawntime = 30000, TempSummonType type = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
//Selects a unit from the creature's current aggro list
Unit* SelectUnit(SelectAggroTarget target, uint32 position);
- Unit* SelectUnit(SelectAggroTarget target, uint32 position, float dist, bool playerOnly);
- void SelectUnitList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget target, float dist, bool playerOnly);
bool HealthBelowPct(uint32 pct) const { return me->GetHealth() * 100 < m_creature->GetMaxHealth() * pct; }
//Returns spells that meet the specified criteria from the creatures spell list
- SpellEntry const* SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTarget Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effect);
+ SpellEntry const* SelectSpell(Unit* Target, int32 School, int32 Mechanic, SelectTargetType Targets, uint32 PowerCostMin, uint32 PowerCostMax, float RangeMin, float RangeMax, SelectEffect Effect);
//Checks if you can cast the specified spell
bool CanCast(Unit* Target, SpellEntry const *Spell, bool Triggered = false);
@@ -254,19 +202,29 @@ struct TRINITY_DLL_DECL Scripted_NoMovementAI : public ScriptedAI
void AttackStart(Unit *);
};
-struct TRINITY_DLL_DECL NullCreatureAI : public ScriptedAI
+struct TRINITY_DLL_DECL BossAI : public ScriptedAI
{
- NullCreatureAI(Creature* c) : ScriptedAI(c) {}
- ~NullCreatureAI() {}
+ BossAI(Creature *c, uint32 id) : ScriptedAI(c), bossId(id)
+ , summons(me), instance(c->GetInstanceData())
+ {}
- void Reset() {}
- void EnterCombat(Unit*) {}
- void MoveInLineOfSight(Unit *) {}
- void AttackStart(Unit *) {}
- void EnterEvadeMode() {}
- bool IsVisible(Unit *) const { return false; }
+ uint32 bossId;
+ EventMap events;
+ SummonList summons;
+ InstanceData *instance;
+
+ void JustSummoned(Creature *summon);
+ void SummonedCreatureDespawn(Creature *summon);
+
+ void UpdateAI(const uint32 diff) = 0;
+
+ void _Reset();
+ void _EnterCombat();
+ void _JustDied();
- void UpdateAI(const uint32) {}
+ void Reset() { _Reset(); }
+ void EnterCombat(Unit *who) { _EnterCombat(); }
+ void JustDied(Unit *killer) { _JustDied(); }
};
#endif
diff --git a/src/bindings/scripts/include/sc_instance.h b/src/bindings/scripts/include/sc_instance.h
index cdf0e03aa37..0620e89af07 100644
--- a/src/bindings/scripts/include/sc_instance.h
+++ b/src/bindings/scripts/include/sc_instance.h
@@ -17,20 +17,7 @@
class TRINITY_DLL_DECL ScriptedInstance : public InstanceData
{
public:
-
ScriptedInstance(Map *map) : InstanceData(map) {}
- ~ScriptedInstance() {}
-
- //All-purpose data storage 64 bit
- virtual uint64 GetData64(uint32 Data) { return 0; }
- virtual void SetData64(uint32 Data, uint64 Value) { }
-
- // Called every instance update
- virtual void Update(uint32) {}
-
- // Save and Load instance data to the database
- const char* Save() { return NULL; }
- void Load(const char* in) { }
};
#endif
diff --git a/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp b/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp
index 2f2d5349f2a..ec987e31c0e 100644
--- a/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp
+++ b/src/bindings/scripts/scripts/creature/mob_generic_creature.cpp
@@ -156,11 +156,41 @@ struct TRINITY_DLL_DECL generic_creatureAI : public ScriptedAI
}
}
};
+
CreatureAI* GetAI_generic_creature(Creature *_Creature)
{
return new generic_creatureAI (_Creature);
}
+struct TRINITY_DLL_DECL trigger_periodicAI : public NullCreatureAI
+{
+ trigger_periodicAI(Creature* c) : NullCreatureAI(c)
+ {
+ spell = me->m_spells[0] ? GetSpellStore()->LookupEntry(me->m_spells[0]) : NULL;
+ interval = me->m_spells[1] ? me->m_spells[1] : 1000;
+ timer = interval;
+ }
+
+ uint32 timer, interval;
+ const SpellEntry * spell;
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(timer < diff)
+ {
+ if(spell)
+ me->CastSpell(me, spell, true);
+ timer = interval;
+ }
+ else
+ timer -= diff;
+ }
+};
+
+CreatureAI* GetAI_trigger_periodic(Creature *_Creature)
+{
+ return new trigger_periodicAI (_Creature);
+}
void AddSC_generic_creature()
{
@@ -169,5 +199,10 @@ void AddSC_generic_creature()
newscript->Name="generic_creature";
newscript->GetAI = &GetAI_generic_creature;
newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="trigger_periodic";
+ newscript->GetAI = &GetAI_trigger_periodic;
+ newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
index 89fd75b9bc8..52e5a3e8915 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
@@ -262,7 +262,7 @@ struct TRINITY_DLL_DECL boss_grandmaster_vorpilAI : public ScriptedAI
if (HeroicMode && banish_Timer < diff)
{
- Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0,30,false);
+ Unit *target = SelectTarget(SELECT_TARGET_RANDOM,0,30,false);
if (target)
{
DoCast(target,SPELL_BANISH);
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
index 99bce54be62..599767b591f 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
@@ -118,7 +118,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
// Murmur's Touch
if (MurmursTouch_Timer < diff)
{
- if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,80,true))
+ if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,80,true))
DoCast(target, SPELL_MURMURS_TOUCH);
MurmursTouch_Timer = 25000 + rand()%10000;
}else MurmursTouch_Timer -= diff;
@@ -162,7 +162,7 @@ struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
// Sonic Shock
if(SonicShock_Timer < diff)
{
- if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,20,false))
+ if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,20,false))
if(target->isAlive())
DoCast(target, SPELL_SONIC_SHOCK);
SonicShock_Timer = 10000+rand()%10000;
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
index 3cfb0af2fa1..37194a89b21 100644
--- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
+++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp
@@ -191,7 +191,7 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp b/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
index 41cb91f86b7..595a05a727f 100644
--- a/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
+++ b/src/bindings/scripts/scripts/zone/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_ahnkahet : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
diff --git a/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp b/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
index bd3fccd98d9..7e0252f2009 100644
--- a/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
+++ b/src/bindings/scripts/scripts/zone/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
@@ -117,7 +117,7 @@ struct TRINITY_DLL_DECL instance_azjol_nerub : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
diff --git a/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp b/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp
index 1a3c40273af..104ef575de5 100644
--- a/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp
+++ b/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp
@@ -416,7 +416,8 @@ bool GossipSelect_npc_susurrus(Player *player, Creature *_Creature, uint32 sende
nodes.resize(2);
nodes[0] = 92; //from susurrus
nodes[1] = 91; //end at exodar
- player->ActivateTaxiPathTo(nodes,11686); //TaxiPath 506. Using invisible model, possible Trinity must allow 0(from dbc) for cases like this.
+// player->ActivateTaxiPathTo(nodes,11686); //TaxiPath 506. Using invisible model, possible Trinity must allow 0(from dbc) for cases like this.
+ player->ActivateTaxiPathTo(nodes);
}
return true;
}
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index 60c51f0be33..68431cb81ee 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -785,7 +785,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
case EVENT_PARASITIC_SHADOWFIEND:
{
- if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 200, true))
+ if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true))
m_creature->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true);
Timer[EVENT_PARASITIC_SHADOWFIEND] = 35000 + rand()%10000;
}break;
@@ -907,7 +907,7 @@ struct TRINITY_DLL_DECL flame_of_azzinothAI : public ScriptedAI
void ChargeCheck()
{
- Unit* target = SelectUnit(SELECT_TARGET_FARTHEST, 0, 200, false);
+ Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 200, false);
if(target && (!m_creature->IsWithinCombatRange(target, FLAME_CHARGE_DISTANCE)))
{
m_creature->AddThreat(target, 5000000.0f);
@@ -1765,7 +1765,7 @@ struct TRINITY_DLL_DECL mob_parasitic_shadowfiendAI : public ScriptedAI
{
if(!m_creature->getVictim())
{
- if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true))
+ if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true))
AttackStart(target);
else
{
@@ -1862,15 +1862,15 @@ void boss_illidan_stormrageAI::JustSummoned(Creature* summon)
summon->setDeathState(JUST_DIED);
return;
}
- Unit *target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0, 999, true);
+ Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 999, true);
if(!target || target->HasAura(SPELL_PARASITIC_SHADOWFIEND)
|| target->HasAura(SPELL_PARASITIC_SHADOWFIEND2))
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
if(target)
summon->AI()->AttackStart(target);
}break;
case SHADOW_DEMON:
- if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true)) // only on players.
+ if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true)) // only on players.
{
summon->AddThreat(target, 5000000.0f);
summon->AI()->AttackStart(target);
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
index c01db75bd58..ff90f7e6a81 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
@@ -53,7 +53,9 @@ EndScriptData */
struct TRINITY_DLL_DECL molten_flameAI : public NullCreatureAI
{
- molten_flameAI(Creature *c) : NullCreatureAI(c)
+ molten_flameAI(Creature *c) : NullCreatureAI(c) {}
+
+ void InitializeAI()
{
float x, y, z;
me->GetNearPoint(me, x, y, z, 1, 50, M_PI*2*rand_norm());
@@ -198,7 +200,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
break;
case EVENT_SWITCH_TARGET:
- if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 100, true))
+ if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
{
DoResetThreat();
m_creature->AddThreat(target, 5000000.0f);
@@ -208,7 +210,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
break;
case EVENT_VOLCANO:
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
if(!target) target = m_creature->getVictim();
if(target)
{
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
index 7d6b7140a9d..032bccc57ed 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
@@ -171,7 +171,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
{
//m_creature->CastSpell(m_creature, SPELL_NEEDLE_SPINE, true);
std::list<Unit*> target;
- SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 80, true);
+ SelectTargetList(target, 3, SELECT_TARGET_RANDOM, 80, true);
for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
m_creature->CastSpell(*i, 39835, true);
events.ScheduleEvent(EVENT_NEEDLE, 15000+rand()%10000, GCD_CAST);
diff --git a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
index 43646746505..bf5d62a7b86 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
@@ -303,7 +303,7 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
index 6e26f3a0c03..d9f3ecd808a 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
@@ -265,7 +265,7 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
index 21b39fa378b..13b0c78ebc1 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
@@ -148,7 +148,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
if(SwarmTimer < diff)
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,100,true);
if(target)
DoCast(target,SPELL_CARRION_SWARM);
@@ -170,7 +170,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
{
for(uint8 i=0;i<3;++i)
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,100,true);
if(target)
target->CastSpell(target,SPELL_SLEEP,true);
}
@@ -194,7 +194,7 @@ struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
}else AuraTimer -= diff;
if(InfernoTimer < diff)
{
- DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,100,true), SPELL_INFERNO);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,100,true), SPELL_INFERNO);
InfernoTimer = 45000;
switch(rand()%2)
{
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
index 15085963b20..33e3d344da2 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
@@ -140,13 +140,13 @@ struct TRINITY_DLL_DECL boss_azgalorAI : public hyjal_trashAI
if(RainTimer < diff)
{
- DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,30,true), SPELL_RAIN_OF_FIRE);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,30,true), SPELL_RAIN_OF_FIRE);
RainTimer = 20000+rand()%15000;
}else RainTimer -= diff;
if(DoomTimer < diff)
{
- DoCast(SelectUnit(SELECT_TARGET_RANDOM,1,100,true), SPELL_DOOM);//never on tank
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,1,100,true), SPELL_DOOM);//never on tank
DoomTimer = 45000+rand()%5000;
}else DoomTimer -= diff;
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL mob_lesser_doomguardAI : public hyjal_trashAI
if(CrippleTimer < diff)
{
- DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,100,true), SPELL_CRIPPLE);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,100,true), SPELL_CRIPPLE);
CrippleTimer = 25000+rand()%5000;
}else CrippleTimer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
index addbddab5b8..3e6b2bc8e98 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
@@ -169,7 +169,7 @@ struct TRINITY_DLL_DECL boss_rage_winterchillAI : public hyjal_trashAI
}else NovaTimer -= diff;
if(IceboltTimer < diff)
{
- DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,40,true), SPELL_ICEBOLT);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,0,40,true), SPELL_ICEBOLT);
IceboltTimer = 11000+rand()%20000;
}else IceboltTimer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
index 583c7831af5..30f0c14caaf 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
@@ -724,7 +724,7 @@ struct mob_necromancerAI : public hyjal_trashAI
void JustSummoned(Creature* summon)
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,30,true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0,30,true);
if(target && summon)
summon->Attack(target,false);
summons.Summon(summon);
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
index 0dfa99198ac..cdcd6cb6b66 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
@@ -279,7 +279,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
}else debug_log("TSCR: Instance Hyjal: UpdateWorldState, but PlayerList is empty!");
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
index eb35a3c74b4..254a4d1d899 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
@@ -322,7 +322,7 @@ struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
if(WaterboltTimer < diff)
{
- Unit* target = SelectUnit(SELECT_TARGET_NEAREST,0,14,true);
+ Unit* target = SelectTarget(SELECT_TARGET_NEAREST,0,14,true);
if(!target)
{
target = SelectUnit(SELECT_TARGET_RANDOM,0);
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
index cea591182d5..f8d27df5bb0 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
@@ -235,7 +235,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
for(uint8 i = 0; i < 4; i++)
{
counter = 0;
- do{target = SelectUnit(SELECT_TARGET_RANDOM, 1, 50, true); //target players only
+ do{target = SelectTarget(SELECT_TARGET_RANDOM, 1, 50, true); //target players only
if(counter < Playercount)
break;
if(target) itr = list.find(target->GetGUID());
@@ -272,7 +272,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
for (int8 g = 0; g < 4; g++) //one unit cant cast more than one spell per update, so some players have to cast for us XD
{
counter = 0;
- do {globuletarget = SelectUnit(SELECT_TARGET_RANDOM, 0,50,true);
+ do {globuletarget = SelectTarget(SELECT_TARGET_RANDOM, 0,50,true);
if(globuletarget) itr = globulelist.find(globuletarget->GetGUID());
if (counter > Playercount)
break;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
index 6c4ae72aec1..8aa759a87c8 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
@@ -236,7 +236,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
}
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
index 6d01da7f625..d375d073c35 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
@@ -209,7 +209,7 @@ struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
index 370b07c8adc..72c7992e109 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
@@ -165,7 +165,7 @@ struct TRINITY_DLL_DECL boss_the_black_stalkerAI : public ScriptedAI
// Static Charge
if(StaticCharge_Timer < diff)
{
- if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0,30,true))
+ if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM,0,30,true))
DoCast(target, SPELL_STATIC_CHARGE);
StaticCharge_Timer = 10000;
}else StaticCharge_Timer -= diff;
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
index 34943449b1e..4c90fdf49a8 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
@@ -144,7 +144,7 @@ struct TRINITY_DLL_DECL instance_gruuls_lair : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
index 115dfeab269..52e6f2e363c 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 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
@@ -62,7 +62,10 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
boss_moroesAI(Creature *c) : ScriptedAI(c)
{
- FirstTime = true;
+ for(int i = 0; i < 4; i++)
+ {
+ AddId[i] = 0;
+ }
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
@@ -77,7 +80,6 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
uint32 CheckAdds_Timer;
uint32 AddId[4];
- bool FirstTime;
bool InVanish;
bool Enrage;
@@ -91,12 +93,10 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
Enrage = false;
InVanish = false;
-
- SpawnAdds();
-
- m_creature->setFaction(16);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ if(m_creature->GetHealth() > 0)
+ {
+ SpawnAdds();
+ }
if(pInstance)
pInstance->SetData(DATA_MOROES_EVENT, NOT_STARTED);
@@ -106,9 +106,11 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
if(pInstance)
pInstance->SetData(DATA_MOROES_EVENT, IN_PROGRESS);
+
+ DoZoneInCombat();
}
- void EnterCombat(Unit* who)
+ void Aggro(Unit* who)
{
StartEvent();
@@ -129,7 +131,7 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
void JustDied(Unit* victim)
{
- DoScriptText(SAY_DEATH, m_creature);
+ DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_MOROES_EVENT, DONE);
@@ -147,33 +149,21 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
- if (i->getSource()->isAlive() && i->getSource()->HasAura(SPELL_GARROTE))
+ if (i->getSource()->isAlive() && i->getSource()->HasAura(SPELL_GARROTE,0))
i->getSource()->RemoveAurasDueToSpell(SPELL_GARROTE);
}
}
}
- uint8 CheckAdd(uint64 guid)
- {
- Unit* pUnit = Unit::GetUnit((*m_creature), guid);
- if (pUnit)
- {
- if (!pUnit->isAlive())
- return 1; // Exists but is dead
- else
- return 2; // Exists and is alive
- }
- return 0; // Does not exist
- }
-
void SpawnAdds()
{
- Creature *pCreature = NULL;
-
- if (FirstTime)
+ DeSpawnAdds();
+ if(isAddlistEmpty())
{
+ Creature *pCreature = NULL;
std::vector<uint32> AddList;
+
for(uint8 i = 0; i < 6; ++i)
AddList.push_back(Adds[i]);
@@ -193,48 +183,44 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
}
++i;
}
-
- FirstTime = false;
- }
- else
+ }else
{
- for(uint8 i = 0; i < 4; ++i)
+ for(int i = 0; i < 4; i++)
{
- switch(CheckAdd(AddGUID[i]))
+ Creature *pCreature = m_creature->SummonCreature(AddId[i], Locations[i][0], Locations[i][1], POS_Z, Locations[i][2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
+ if (pCreature)
{
- case 0:
- pCreature = m_creature->SummonCreature(AddId[i], Locations[i][0], Locations[i][1], POS_Z, Locations[i][2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
- if (pCreature)
- AddGUID[i] = pCreature->GetGUID();
- break;
- case 1:
- pCreature = (Unit::GetCreature((*m_creature), AddGUID[i]));
- if (pCreature)
- {
- pCreature->Respawn();
- pCreature->AI()->EnterEvadeMode();
- }
- break;
- case 2:
- pCreature = (Unit::GetCreature((*m_creature), AddGUID[i]));
- if (!pCreature->IsInEvadeMode())
- pCreature->AI()->EnterEvadeMode();
- break;
+ AddGUID[i] = pCreature->GetGUID();
}
}
}
}
+ bool isAddlistEmpty()
+ {
+ for(int i = 0; i < 4; i++)
+ {
+ if(AddId[i] == 0)
+ return true;
+ }
+ return false;
+ }
+
void DeSpawnAdds()
{
for(uint8 i = 0; i < 4 ; ++i)
{
- Unit* Temp = NULL;
+ Creature* Temp = NULL;
if (AddGUID[i])
{
- Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
+ Temp = Creature::GetCreature((*m_creature),AddGUID[i]);
if (Temp && Temp->isAlive())
+ {
+ (*Temp).GetMotionMaster()->Clear(true);
Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ Temp->RemoveCorpse();
+ }
+
}
}
}
@@ -246,7 +232,7 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
Creature* Temp = NULL;
if (AddGUID[i])
{
- Temp = Unit::GetCreature(*m_creature, AddGUID[i]);
+ Temp = Creature::GetCreature((*m_creature),AddGUID[i]);
if (Temp && Temp->isAlive())
{
Temp->AI()->AttackStart(m_creature->getVictim());
@@ -295,39 +281,12 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
//Cast Vanish, then Garrote random victim
if (Vanish_Timer < diff)
{
- m_creature->setFaction(35);
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoCast(m_creature, SPELL_VANISH);
InVanish = true;
Vanish_Timer = 30000;
Wait_Timer = 5000;
}else Vanish_Timer -= diff;
- if (InVanish)
- {
- if (Wait_Timer < diff)
- {
- switch(rand()%2)
- {
- case 0: DoScriptText(SAY_SPECIAL_1, m_creature); break;
- case 1: DoScriptText(SAY_SPECIAL_2, m_creature); break;
- }
-
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
- target->CastSpell(target, SPELL_GARROTE,true);
-
- m_creature->setFaction(16);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
- m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
- m_creature->AI()->AttackStart(m_creature->getVictim());
- InVanish = false;
- }else Wait_Timer -= diff;
- }
-
- //Gouge highest aggro, and attack second highest
if (Gouge_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_GOUGE);
@@ -336,27 +295,32 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
if (Blind_Timer < diff)
{
- Unit* target = NULL;
- std::list<HostilReference*> t_list = m_creature->getThreatManager().getThreatList();
-
- if (t_list.empty())
- return;
+ Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ if (target && target->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinMeleeRange(target))
+ {
+ DoCast(target, SPELL_BLIND);
+ Blind_Timer = 40000;
+ }
+ else
+ Blind_Timer = 1000;
+ }else Blind_Timer -= diff;
+ }
- std::vector<Unit*> target_list;
- for (std::list<HostilReference*>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+ if (InVanish)
+ {
+ if (Wait_Timer < diff)
+ {
+ switch(rand()%2)
{
- target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
- if (target && target->GetDistance2d(m_creature) < 5)
- target_list.push_back(target);
+ case 0: DoScriptText(SAY_SPECIAL_1, m_creature); break;
+ case 1: DoScriptText(SAY_SPECIAL_2, m_creature); break;
}
- if (target_list.size())
- target = *(target_list.begin()+rand()%target_list.size());
- if (target)
- DoCast(target, SPELL_BLIND);
+ if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ target->CastSpell(target, SPELL_GARROTE,true);
- Blind_Timer = 40000;
- }else Blind_Timer -= diff;
+ InVanish = false;
+ }else Wait_Timer -= diff;
}
if (!InVanish)
@@ -384,7 +348,7 @@ struct TRINITY_DLL_DECL boss_moroes_guestAI : public ScriptedAI
pInstance->SetData(DATA_MOROES_EVENT, NOT_STARTED);
}
- void EnterCombat(Unit* who) {}
+ void Aggro(Unit* who) {}
void AcquireGUID()
{
@@ -542,7 +506,7 @@ struct TRINITY_DLL_DECL boss_baron_rafe_dreugerAI : public boss_moroes_guestAI
struct TRINITY_DLL_DECL boss_lady_catriona_von_indiAI : public boss_moroes_guestAI
{
//Holy Priest
- boss_lady_catriona_von_indiAI(Creature *c) : boss_moroes_guestAI(c) {Reset();}
+ boss_lady_catriona_von_indiAI(Creature *c) : boss_moroes_guestAI(c) {}
uint32 DispelMagic_Timer;
uint32 GreaterHeal_Timer;
@@ -612,7 +576,7 @@ struct TRINITY_DLL_DECL boss_lady_catriona_von_indiAI : public boss_moroes_guest
struct TRINITY_DLL_DECL boss_lady_keira_berrybuckAI : public boss_moroes_guestAI
{
//Holy Pally
- boss_lady_keira_berrybuckAI(Creature *c) : boss_moroes_guestAI(c) {Reset();}
+ boss_lady_keira_berrybuckAI(Creature *c) : boss_moroes_guestAI(c) {}
uint32 Cleanse_Timer;
uint32 GreaterBless_Timer;
@@ -729,7 +693,7 @@ struct TRINITY_DLL_DECL boss_lord_robin_darisAI : public boss_moroes_guestAI
struct TRINITY_DLL_DECL boss_lord_crispin_ferenceAI : public boss_moroes_guestAI
{
//Arms Warr
- boss_lord_crispin_ferenceAI(Creature *c) : boss_moroes_guestAI(c) {Reset();}
+ boss_lord_crispin_ferenceAI(Creature *c) : boss_moroes_guestAI(c) {}
uint32 Disarm_Timer;
uint32 HeroicStrike_Timer;
diff --git a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
index e8dccdd62a4..62ad6fcf42c 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp
@@ -247,7 +247,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
}
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
index 0a0fb17cce4..c675c8d7c27 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,14 +14,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Anubrekhan
-SD%Complete: 100
-SDComment:
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
+#include "def_naxxramas.h"
#define SAY_GREET RAND(-1533000,-1533004,-1533005,-1533006,-1533007)
#define SAY_AGGRO RAND(-1533001,-1533002,-1533003)
@@ -31,46 +25,29 @@ EndScriptData */
#define SPELL_LOCUSTSWARM HEROIC(28785,54021)
#define SPELL_SELF_SPAWN_5 29105 //This spawns 5 corpse scarabs ontop of us (most likely the player casts this on death)
-#define SPELL_SELF_SPAWN_10 28864 //This is used by the crypt guards when they die
#define EVENT_IMPALE 1
#define EVENT_LOCUST 2
#define MOB_CRYPT_GUARD 16573
-struct TRINITY_DLL_DECL boss_anubrekhanAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_anubrekhanAI : public BossAI
{
- boss_anubrekhanAI(Creature *c) : ScriptedAI(c), summons(me) {}
+ boss_anubrekhanAI(Creature *c) : BossAI(c, BOSS_ANUBREKHAN) {}
bool HasTaunted;
- EventMap events;
- SummonList summons;
void Prepare()
{
HasTaunted = false;
- DoSpawnCreature(MOB_CRYPT_GUARD, 0, 10, 0, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ DoSpawnCreature(MOB_CRYPT_GUARD, 0, 10, 0, me->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
if(HeroicMode)
- DoSpawnCreature(MOB_CRYPT_GUARD, 0, -10, 0, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ DoSpawnCreature(MOB_CRYPT_GUARD, 0, -10, 0, me->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
}
void InitializeAI() { Prepare(); }
void JustReachedHome() { Prepare(); }
- void Reset()
- {
- events.Reset();
- summons.DespawnAll();
- }
-
- void JustSummoned(Creature *summon)
- {
- summons.Summon(summon);
- DoZoneInCombat(summon);
- }
-
- void SummonedCreatureDespawn(Creature *summon) {summons.Despawn(summon);}
-
void KilledUnit(Unit* victim)
{
//Force the player to spawn corpse scarabs via spell
@@ -82,9 +59,8 @@ struct TRINITY_DLL_DECL boss_anubrekhanAI : public ScriptedAI
void EnterCombat(Unit *who)
{
+ _EnterCombat();
DoScriptText(SAY_AGGRO, me);
- DoZoneInCombat();
-
events.ScheduleEvent(EVENT_IMPALE, 15000, 1);
events.ScheduleEvent(EVENT_LOCUST, 80000 + rand()%40000, 1);
}
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
index 5ec67a8920b..9ee594b02b5 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
@@ -1,4 +1,6 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/*
+ * Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,83 +16,63 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Faerlina
-SD%Complete: 50
-SDComment:
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
+#include "def_naxxramas.h"
-#define SAY_GREET -1533009
-#define SAY_AGGRO1 -1533010
-#define SAY_AGGRO2 -1533011
-#define SAY_AGGRO3 -1533012
-#define SAY_AGGRO4 -1533013
-#define SAY_SLAY1 -1533014
-#define SAY_SLAY2 -1533015
-#define SAY_DEATH -1533016
+#define SAY_GREET -1533009
+#define SAY_AGGRO RAND(-1533010,-1533011,-1533012,-1533013)
+#define SAY_SLAY RAND(-1533014,-1533015)
+#define SAY_DEATH -1533016
//#define SOUND_RANDOM_AGGRO 8955 //soundId containing the 4 aggro sounds, we not using this
-#define SPELL_POSIONBOLT_VOLLEY 28796
-#define H_SPELL_POSIONBOLT_VOLLEY 54098
-#define SPELL_ENRAGE 28798
-#define H_SPELL_ENRAGE 54100
-#define SPELL_RAINOFFIRE 28794 //Not sure if targeted AoEs work if casted directly upon a player
+#define SPELL_POSION_BOLT_VOLLEY HEROIC(28796,54098)
+#define SPELL_RAIN_OF_FIRE HEROIC(28794,54099)
+#define SPELL_FRENZY HEROIC(28798,54100)
+#define SPELL_WIDOWS_EMBRACE HEROIC(28732,54097)
-struct TRINITY_DLL_DECL boss_faerlinaAI : public ScriptedAI
+enum Events
{
- boss_faerlinaAI(Creature *c) : ScriptedAI(c) {}
+ EVENT_POSION = 1,
+ EVENT_FIRE,
+ EVENT_FRENZY,
+};
- uint32 PoisonBoltVolley_Timer;
- uint32 RainOfFire_Timer;
- uint32 Enrage_Timer;
- bool HasTaunted;
+struct TRINITY_DLL_DECL boss_faerlinaAI : public BossAI
+{
+ boss_faerlinaAI(Creature *c) : BossAI(c, BOSS_FAERLINA), greet(false) {}
- void Reset()
- {
- PoisonBoltVolley_Timer = 8000;
- RainOfFire_Timer = 16000;
- Enrage_Timer = 60000;
- HasTaunted = false;
- }
+ bool greet;
void EnterCombat(Unit *who)
{
- switch (rand()%4)
- {
- case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
- case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
- case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
- case 3: DoScriptText(SAY_AGGRO4, m_creature); break;
- }
+ _EnterCombat();
+ DoScriptText(SAY_AGGRO, me);
+ events.ScheduleEvent(EVENT_POSION, 10000 + rand()%15000);
+ events.ScheduleEvent(EVENT_FIRE, 5000 + rand()%15000);
+ events.ScheduleEvent(EVENT_FRENZY, 60000 + rand()%20000);
}
void MoveInLineOfSight(Unit *who)
{
- if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
- {
- DoScriptText(SAY_GREET, m_creature);
- HasTaunted = true;
-
+ if(!greet)
+ {
+ DoScriptText(SAY_GREET, me);
+ greet = true;
}
- ScriptedAI::MoveInLineOfSight(who);
+ BossAI::MoveInLineOfSight(who);
}
void KilledUnit(Unit* victim)
{
- switch (rand()%2)
- {
- case 0: DoScriptText(SAY_SLAY1, m_creature); break;
- case 1: DoScriptText(SAY_SLAY2, m_creature); break;
- }
+ if(!(rand()%3))
+ DoScriptText(SAY_SLAY, me);
}
void JustDied(Unit* Killer)
{
- DoScriptText(SAY_DEATH, m_creature);
+ _JustDied();
+ DoScriptText(SAY_DEATH, me);
}
void UpdateAI(const uint32 diff)
@@ -98,31 +80,33 @@ struct TRINITY_DLL_DECL boss_faerlinaAI : public ScriptedAI
if (!UpdateVictim())
return;
- //PoisonBoltVolley_Timer
- if (PoisonBoltVolley_Timer < diff)
- {
- DoCast(m_creature->getVictim(),SPELL_POSIONBOLT_VOLLEY);
- PoisonBoltVolley_Timer = 11000;
- }else PoisonBoltVolley_Timer -= diff;
+ events.Update(diff);
- //RainOfFire_Timer
- if (RainOfFire_Timer < diff)
+ while(uint32 eventId = events.ExecuteEvent())
{
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
- DoCast(target,SPELL_RAINOFFIRE);
- RainOfFire_Timer = 16000;
- }else RainOfFire_Timer -= diff;
-
- //Enrage_Timer
- if (Enrage_Timer < diff)
- {
- DoCast(m_creature,SPELL_ENRAGE);
- Enrage_Timer = 61000;
- }else Enrage_Timer -= diff;
+ switch(eventId)
+ {
+ case EVENT_POSION:
+ if(!me->HasAura(SPELL_WIDOWS_EMBRACE))
+ DoCastAOE(SPELL_POSION_BOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_POSION, 10000 + rand()%15000);
+ return;
+ case EVENT_FIRE:
+ if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_RAIN_OF_FIRE);
+ events.ScheduleEvent(EVENT_FIRE, 5000 + rand()%15000);
+ return;
+ case EVENT_FRENZY:
+ DoCast(me,SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, 60000 + rand()%20000);
+ return;
+ }
+ }
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_boss_faerlina(Creature *_Creature)
{
return new boss_faerlinaAI (_Creature);
@@ -136,4 +120,3 @@ void AddSC_boss_faerlina()
newscript->GetAI = &GetAI_boss_faerlina;
newscript->RegisterSelf();
}
-
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
index 0becff399da..7def6c370f4 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,14 +14,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Gothik
-SD%Complete: 0
-SDComment: Placeholder
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
+#include "def_naxxramas.h"
#define SAY_SPEECH -1533040
#define SAY_KILL -1533041
@@ -29,36 +23,336 @@ EndScriptData */
#define SAY_TELEPORT -1533043
//Gothik
-#define SPELL_HARVESTSOUL 28679
-#define SPELL_SHADOWBOLT 29317
-#define H_SPELL_SHADOWBOLT 56405
-//Unrelenting Trainee
-#define SPELL_EAGLECLAW 30285
-#define SPELL_KNOCKDOWN_PASSIVE 6961
-
-//Unrelenting Deathknight
-#define SPELL_CHARGE 22120
-#define SPELL_SHADOW_MARK 27825
-
-//Unrelenting Rider
-#define SPELL_UNHOLY_AURA 55606
-#define H_SPELL_UNHOLY_AURA 55608
-#define SPELL_SHADOWBOLT_VOLLEY 27831 //Search thru targets and find those who have the SHADOW_MARK to cast this on
-#define H_SPELL_SHADOWBOLT_VOLLEY 55638
-
-//Spectral Trainee
-#define SPELL_ARCANE_EXPLOSION 27989
-
-//Spectral Deathknight
-#define SPELL_WHIRLWIND 28334
-#define SPELL_SUNDER_ARMOR 25051 //cannot find sunder that reduces armor by 2950
-#define SPELL_CLEAVE 20677
-#define SPELL_MANA_BURN 17631
-
-//Spectral Rider
-#define SPELL_LIFEDRAIN 24300
-//USES SAME UNHOLY AURA AS UNRELENTING RIDER
-
-//Spectral Horse
-#define SPELL_STOMP 27993
+#define SPELL_HARVEST_SOUL 28679
+#define SPELL_SHADOW_BOLT HEROIC(29317,56405)
+
+#define SPELL_INFORM_LIVE_TRAINEE 27892
+#define SPELL_INFORM_LIVE_KNIGHT 27928
+#define SPELL_INFORM_LIVE_RIDER 27935
+#define SPELL_INFORM_DEAD_TRAINEE 27915
+#define SPELL_INFORM_DEAD_KNIGHT 27931
+#define SPELL_INFORM_DEAD_RIDER 27937
+
+#define MOB_LIVE_TRAINEE 16124
+#define MOB_LIVE_KNIGHT 16125
+#define MOB_LIVE_RIDER 16126
+#define MOB_DEAD_TRAINEE 16127
+#define MOB_DEAD_KNIGHT 16148
+#define MOB_DEAD_RIDER 16150
+#define MOB_DEAD_HORSE 16149
+
+const struct Waves { uint32 entry, number, time; }
+waves[] =
+{
+ {MOB_LIVE_TRAINEE, 2, 20000},
+ {MOB_LIVE_TRAINEE, 2, 20000},
+ {MOB_LIVE_TRAINEE, 2, 10000},
+ {MOB_LIVE_KNIGHT, 1, 10000},
+ {MOB_LIVE_TRAINEE, 2, 15000},
+ {MOB_LIVE_KNIGHT, 1, 10000},
+ {MOB_LIVE_TRAINEE, 2, 15000},
+ {MOB_LIVE_TRAINEE, 2, 0},
+ {MOB_LIVE_KNIGHT, 1, 10000},
+ {MOB_LIVE_RIDER, 1, 10000},
+ {MOB_LIVE_TRAINEE, 2, 5000},
+ {MOB_LIVE_KNIGHT, 1, 15000},
+ {MOB_LIVE_TRAINEE, 2, 0},
+ {MOB_LIVE_RIDER, 1, 10000},
+ {MOB_LIVE_KNIGHT, 2, 10000},
+ {MOB_LIVE_TRAINEE, 2, 10000},
+ {MOB_LIVE_RIDER, 1, 5000},
+ {MOB_LIVE_KNIGHT, 1, 5000},
+ {MOB_LIVE_TRAINEE, 2, 20000},
+ {MOB_LIVE_TRAINEE, 2, 0},
+ {MOB_LIVE_KNIGHT, 1, 0},
+ {MOB_LIVE_RIDER, 1, 15000},
+ {MOB_LIVE_TRAINEE, 2, 29000},
+ {0, 0, 0},
+};
+
+#define POS_Y_GATE -3360.78f
+
+enum Events
+{
+ EVENT_SUMMON = 1,
+ EVENT_HARVEST,
+ EVENT_BOLT,
+};
+
+#define POS_LIVE 3
+#define POS_DEAD 5
+
+const float PosSummonLive[POS_LIVE][4] =
+{
+ {2669.7, -3430.9, 268.56, 1.6},
+ {2692.0, -3430.9, 268.56, 1.6},
+ {2714.1, -3430.9, 268.56, 1.6},
+};
+
+const float PosSummonDead[POS_DEAD][4] =
+{
+ {2725.1, -3310.0, 268.85, 3.4},
+ {2699.3, -3322.8, 268.60, 3.3},
+ {2733.1, -3348.5, 268.84, 3.1},
+ {2682.8, -3304.2, 268.85, 3.9},
+ {2664.8, -3340.7, 268.23, 3.7},
+};
+
+const float PosGround[4] = {2691.2, -3362.7, 267.68, 1.7};
+const float PosPlatform[4] = {2640.5, -3360.6, 285.26, 0};
+
+struct TRINITY_DLL_DECL boss_gothikAI : public BossAI
+{
+ boss_gothikAI(Creature *c) : BossAI(c, BOSS_GOTHIK) {}
+
+ uint32 waveCount;
+ std::vector<Creature*> liveTrigger;
+ std::vector<Creature*> deadTrigger;
+
+ void Reset()
+ {
+ liveTrigger.clear();
+ deadTrigger.clear();
+ me->setActive(false);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
+ me->SetReactState(REACT_PASSIVE);
+ _Reset();
+ }
+
+ void EnterCombat(Unit *who)
+ {
+ for(uint32 i = 0; i < POS_LIVE; ++i)
+ if(Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonLive[i]))
+ liveTrigger.push_back(trigger);
+ for(uint32 i = 0; i < POS_DEAD; ++i)
+ if(Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonDead[i]))
+ deadTrigger.push_back(trigger);
+
+ if(liveTrigger.size() < POS_LIVE || deadTrigger.size() < POS_DEAD)
+ {
+ error_log("Script Gothik: cannot summon triggers!");
+ EnterEvadeMode();
+ return;
+ }
+
+ _EnterCombat();
+ me->setActive(true);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
+ waveCount = 0;
+ events.ScheduleEvent(EVENT_SUMMON, 30000);
+ DoTeleportTo(PosPlatform);
+ DoScriptText(SAY_SPEECH, me);
+ if(instance)
+ instance->SetData(DATA_GOTHIK_GATE, 1);
+ }
+
+ void JustSummoned(Creature *summon)
+ {
+ if(summon->GetEntry() == WORLD_TRIGGER)
+ summon->setActive(true);
+ else
+ {
+ summon->AI()->DoAction(me->HasReactState(REACT_PASSIVE) ? 1 : 0);
+ summon->AI()->EnterEvadeMode();
+ }
+ summons.Summon(summon);
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ if(!(rand()%5))
+ DoScriptText(SAY_KILL, me);
+ }
+
+ void JustDied(Unit* Killer)
+ {
+ _JustDied();
+ DoScriptText(SAY_DEATH, me);
+ }
+
+ void SpellHit(Unit *caster, const SpellEntry *spell)
+ {
+ uint32 spellId = 0;
+ switch(spell->Id)
+ {
+ case SPELL_INFORM_LIVE_TRAINEE: spellId = SPELL_INFORM_DEAD_TRAINEE; break;
+ case SPELL_INFORM_LIVE_KNIGHT: spellId = SPELL_INFORM_DEAD_KNIGHT; break;
+ case SPELL_INFORM_LIVE_RIDER: spellId = SPELL_INFORM_DEAD_RIDER; break;
+ }
+ if(spellId && me->isInCombat())
+ {
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST);
+ me->CastSpell(deadTrigger[rand()%POS_DEAD], spellId, true);
+ }
+ }
+
+ void SpellHitTarget(Unit *target, const SpellEntry *spell)
+ {
+ if(!me->isInCombat())
+ return;
+
+ switch(spell->Id)
+ {
+ case SPELL_INFORM_DEAD_TRAINEE: DoSummon(MOB_DEAD_TRAINEE, target, 0); break;
+ case SPELL_INFORM_DEAD_KNIGHT: DoSummon(MOB_DEAD_KNIGHT, target, 0); break;
+ case SPELL_INFORM_DEAD_RIDER: DoSummon(MOB_DEAD_RIDER, target, 1.0f);
+ DoSummon(MOB_DEAD_HORSE, target, 1.0f); break;
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(!me->isInCombat())
+ return;
+
+ if(me->getThreatManager().isThreatListEmpty())
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ if(me->HasReactState(REACT_AGGRESSIVE) && !UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if(me->hasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while(uint32 eventId = events.ExecuteEvent())
+ {
+ switch(eventId)
+ {
+ case EVENT_SUMMON:
+ if(waves[waveCount].entry)
+ {
+ for(uint32 i = 0; i < waves[waveCount].number; ++i)
+ DoSummon(waves[waveCount].entry, liveTrigger[rand()%POS_LIVE], 1.0f);
+ events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time);
+ ++waveCount;
+ }
+ else
+ {
+ DoScriptText(SAY_TELEPORT, me);
+ DoTeleportTo(PosGround);
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
+ if(instance)
+ instance->SetData(DATA_GOTHIK_GATE, 0);
+ summons.DoAction(0, 0);
+ summons.DoZoneInCombat();
+ events.ScheduleEvent(EVENT_BOLT, 1000);
+ events.ScheduleEvent(EVENT_HARVEST, 15000);
+ }
+ break;
+ case EVENT_BOLT:
+ DoCast(me->getVictim(), SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_BOLT, 1000);
+ return;
+ case EVENT_HARVEST:
+ DoCast(me->getVictim(), SPELL_HARVEST_SOUL);
+ events.ScheduleEvent(EVENT_HARVEST, 15000);
+ return;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+struct TRINITY_DLL_DECL mob_gothik_minionAI : public SpellAI
+{
+ mob_gothik_minionAI(Creature *c) : SpellAI(c)
+ {
+ liveSide = me->GetPositionY() < POS_Y_GATE;
+ }
+
+ bool liveSide;
+ bool gateClose;
+
+#define SIDE_CHECK(who) (liveSide == (who->GetPositionY() < POS_Y_GATE))
+
+ void DoAction(const int32 param)
+ {
+ gateClose = param;
+ }
+
+ void DamageTaken(Unit *attacker, uint32 &damage)
+ {
+ if(gateClose && !SIDE_CHECK(attacker))
+ damage = 0;
+ }
+
+ void JustDied(Unit *killer)
+ {
+ if(me->isSummon())
+ {
+ if(Unit *owner = ((TempSummon*)me)->GetSummoner())
+ SpellAI::JustDied(owner);
+ }
+ }
+
+ void EnterEvadeMode()
+ {
+ if(!gateClose)
+ {
+ SpellAI::EnterEvadeMode();
+ return;
+ }
+
+ if(!_EnterEvadeMode())
+ return;
+
+ Map *map = me->GetMap();
+ if(map->IsDungeon())
+ {
+ Map::PlayerList const &PlayerList = map->GetPlayers();
+ for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ {
+ if(i->getSource()->isAlive() && SIDE_CHECK(i->getSource()))
+ {
+ AttackStart(i->getSource());
+ return;
+ }
+ }
+ }
+
+ me->GetMotionMaster()->MoveIdle();
+ Reset();
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if(gateClose && (!SIDE_CHECK(me) || me->getVictim() && !SIDE_CHECK(me->getVictim())))
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ SpellAI::UpdateAI(diff);
+ }
+};
+
+CreatureAI* GetAI_boss_gothik(Creature *_Creature)
+{
+ return new boss_gothikAI (_Creature);
+}
+
+CreatureAI* GetAI_mob_gothik_minion(Creature *_Creature)
+{
+ return new mob_gothik_minionAI (_Creature);
+}
+
+void AddSC_boss_gothik()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name="boss_gothik";
+ newscript->GetAI = &GetAI_boss_gothik;
+ newscript->RegisterSelf();
+ newscript = new Script;
+ newscript->Name="mob_gothik_minion";
+ newscript->GetAI = &GetAI_mob_gothik_minion;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp
index f18cd81064a..45f54611ae3 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_grobbulus.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,20 +14,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Grobbulus
-SD%Complete: 0
-SDComment: Place holder
-SDCategory: Naxxramas
-EndScriptData */
-
-/*Poison Cloud 26590
-Slime Spray 28157
-Fallout slime 28218
-Mutating Injection 28169
-Enrages 26527*/
-
#include "precompiled.h"
+#include "def_naxxramas.h"
#define SPELL_BOMBARD_SLIME 28280
@@ -43,20 +31,13 @@ Enrages 26527*/
#define MOB_FALLOUT_SLIME 16290
-struct TRINITY_DLL_DECL boss_grobbulusAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_grobbulusAI : public BossAI
{
- boss_grobbulusAI(Creature *c) : ScriptedAI(c) {}
-
- EventMap events;
-
- void Reset()
- {
- events.Reset();
- }
+ boss_grobbulusAI(Creature *c) : BossAI(c, BOSS_GROBBULUS) {}
void EnterCombat(Unit *who)
{
- DoZoneInCombat();
+ _EnterCombat();
events.ScheduleEvent(EVENT_CLOUD, 15000);
events.ScheduleEvent(EVENT_INJECT, 20000);
events.ScheduleEvent(EVENT_SPRAY, 15000+rand()%15000); //not sure
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
index 9207b2c09a2..0302a93c488 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_heigan.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,13 +14,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Heigan
-SD%Complete: 0
-SDComment: Place Holder
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
#include "def_naxxramas.h"
@@ -50,25 +43,14 @@ enum Phases
//Spell by eye stalks
#define SPELL_MIND_FLAY 26143
-struct TRINITY_DLL_DECL boss_heiganAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_heiganAI : public BossAI
{
- boss_heiganAI(Creature *c) : ScriptedAI(c)
- {
- instance = ((ScriptedInstance*)c->GetInstanceData());
- }
+ boss_heiganAI(Creature *c) : BossAI(c, BOSS_HEIGAN) {}
- EventMap events;
- ScriptedInstance *instance;
uint32 eruptSection;
bool eruptDirection;
Phases phase;
- void Reset()
- {
- events.Reset();
- instance->SetBossState(BOSS_HEIGAN, NOT_STARTED);
- }
-
void KilledUnit(Unit* Victim)
{
if(!(rand()%5))
@@ -77,16 +59,15 @@ struct TRINITY_DLL_DECL boss_heiganAI : public ScriptedAI
void JustDied(Unit* Killer)
{
+ _JustDied();
DoScriptText(SAY_DEATH, me);
- instance->SetBossState(BOSS_HEIGAN, DONE);
}
void EnterCombat(Unit *who)
{
+ _EnterCombat();
DoScriptText(SAY_AGGRO, me);
- DoZoneInCombat();
EnterPhase(PHASE_FIGHT);
- instance->SetBossState(BOSS_HEIGAN, IN_PROGRESS);
}
void EnterPhase(Phases newPhase)
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
index 087bc8dc12c..1f7b1a55daa 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,13 +14,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Noth
-SD%Complete: 40
-SDComment: Missing Balcony stage
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
#include "def_naxxramas.h"
@@ -34,6 +27,7 @@ EndScriptData */
#define SPELL_CURSE_PLAGUEBRINGER HEROIC(29213,54835)
#define SPELL_BLINK RAND(29208,29209,29210,29211)
#define SPELL_CRIPPLE HEROIC(29212,54814)
+#define SPELL_TELEPORT 29216
#define MOB_WARRIOR 16984
#define MOB_CHAMPION 16983
@@ -45,8 +39,16 @@ EndScriptData */
#define TELE_Z 274.040
#define TELE_O 6.277
-// IMPORTANT: BALCONY TELEPORT NOT ADDED YET! WILL BE ADDED SOON!
-// Dev note 26.12.2008: When is soon? :)
+#define MAX_SUMMON_POS 5
+
+const float SummonPos[MAX_SUMMON_POS][4] =
+{
+ {2728.12, -3544.43, 261.91, 6.04},
+ {2729.05, -3544.47, 261.91, 5.58},
+ {2728.24, -3465.08, 264.20, 3.56},
+ {2704.11, -3456.81, 265.53, 4.51},
+ {2663.56, -3464.43, 262.66, 5.20},
+};
enum Events
{
@@ -54,62 +56,91 @@ enum Events
EVENT_CURSE,
EVENT_BLINK,
EVENT_WARRIOR,
+ EVENT_BALCONY,
+ EVENT_WAVE,
+ EVENT_GROUND,
};
-struct TRINITY_DLL_DECL boss_nothAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_nothAI : public BossAI
{
- boss_nothAI(Creature *c) : ScriptedAI(c), summons(me)
- {
- instance = ((ScriptedInstance*)c->GetInstanceData());
- }
+ boss_nothAI(Creature *c) : BossAI(c, BOSS_NOTH) {}
- EventMap events;
- SummonList summons;
- ScriptedInstance *instance;
+ uint32 waveCount, balconyCount;
void Reset()
{
- events.Reset();
- summons.DespawnAll();
- instance->SetBossState(BOSS_NOTH, NOT_STARTED);
+ _Reset();
+ me->setActive(false);
}
void EnterCombat(Unit *who)
{
+ _EnterCombat();
DoScriptText(SAY_AGGRO, me);
- DoZoneInCombat();
-
- events.ScheduleEvent(EVENT_CURSE, 20000+rand()%10000);
- events.ScheduleEvent(EVENT_WARRIOR, 30000);
- if(HeroicMode)
- events.ScheduleEvent(EVENT_BLINK, 20000+rand()%10000);
+ me->setActive(true);
+ balconyCount = 0;
+ EnterPhaseGround();
+ }
- instance->SetBossState(BOSS_NOTH, IN_PROGRESS);
+ void EnterPhaseGround()
+ {
+ DoZoneInCombat();
+ if(me->getThreatManager().isThreatListEmpty())
+ EnterEvadeMode();
+ else
+ {
+ events.ScheduleEvent(EVENT_BALCONY, 110000);
+ events.ScheduleEvent(EVENT_CURSE, 20000+rand()%10000);
+ events.ScheduleEvent(EVENT_WARRIOR, 30000);
+ if(HeroicMode)
+ events.ScheduleEvent(EVENT_BLINK, 20000+rand()%10000);
+ }
}
void KilledUnit(Unit* victim)
{
- DoScriptText(SAY_SLAY, me);
+ if(!(rand()%5))
+ DoScriptText(SAY_SLAY, me);
}
void JustSummoned(Creature *summon)
{
summons.Summon(summon);
- DoZoneInCombat(summon);
+ summon->setActive(true);
+ summon->AI()->DoZoneInCombat();
}
- void SummonedCreatureDespawn(Creature *summon) { summons.Despawn(summon); }
-
void JustDied(Unit* Killer)
{
+ _JustDied();
DoScriptText(SAY_DEATH, me);
- instance->SetBossState(BOSS_NOTH, DONE);
+ }
+
+ void SummonUndead(uint32 entry, uint32 num)
+ {
+ for(uint32 i = 0; i < num; ++i)
+ {
+ uint32 pos = rand()%MAX_SUMMON_POS;
+ me->SummonCreature(entry, SummonPos[pos][0], SummonPos[pos][1], SummonPos[pos][2],
+ SummonPos[pos][3], TEMPSUMMON_CORPSE_DESPAWN, 60000);
+ }
}
void UpdateAI(const uint32 diff)
{
- if(!UpdateVictim())
- return;
+ if(me->HasReactState(REACT_AGGRESSIVE)) // ground
+ {
+ if(!UpdateVictim())
+ return;
+ }
+ else // balcony
+ {
+ if(me->getThreatManager().isThreatListEmpty()) // if no enemy, go back at once
+ {
+ events.Reset();
+ events.ScheduleEvent(EVENT_GROUND, 0);
+ }
+ }
events.Update(diff);
@@ -123,8 +154,7 @@ struct TRINITY_DLL_DECL boss_nothAI : public ScriptedAI
return;
case EVENT_WARRIOR:
DoScriptText(SAY_SUMMON, me);
- for(uint8 i = 0; i < 6; i++)
- m_creature->SummonCreature(MOB_WARRIOR,2684.804,-3502.517,261.313,0,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,80000);
+ SummonUndead(MOB_WARRIOR, HEROIC(2,3));
events.ScheduleEvent(EVENT_WARRIOR, 30000);
return;
case EVENT_BLINK:
@@ -133,10 +163,46 @@ struct TRINITY_DLL_DECL boss_nothAI : public ScriptedAI
DoResetThreat();
events.ScheduleEvent(EVENT_BLINK, 20000+rand()%10000);
return;
+ case EVENT_BALCONY:
+ me->SetReactState(REACT_PASSIVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->AttackStop();
+ me->RemoveAllAuras();
+ me->NearTeleportTo(TELE_X, TELE_Y, TELE_Z, TELE_O);
+ events.Reset();
+ events.ScheduleEvent(EVENT_WAVE, 2000);
+ waveCount = 0;
+ return;
+ case EVENT_WAVE:
+ DoScriptText(SAY_SUMMON, me);
+ switch(balconyCount)
+ {
+ case 0: SummonUndead(MOB_CHAMPION, HEROIC(2,4)); break;
+ case 1: SummonUndead(MOB_CHAMPION, HEROIC(1,2));
+ SummonUndead(MOB_GUARDIAN, HEROIC(1,2)); break;
+ case 2: SummonUndead(MOB_GUARDIAN, HEROIC(2,4)); break;
+ default:SummonUndead(MOB_CHAMPION, HEROIC(5,10));
+ SummonUndead(MOB_GUARDIAN, HEROIC(5,10));break;
+ }
+ ++waveCount;
+ events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, 34000);
+ return;
+ case EVENT_GROUND:
+ {
+ ++balconyCount;
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ float x, y, z, o;
+ me->GetHomePosition(x, y, z, o);
+ me->NearTeleportTo(x, y, z, o);
+ EnterPhaseGround();
+ return;
+ }
}
}
- DoMeleeAttackIfReady();
+ if(me->HasReactState(REACT_AGGRESSIVE))
+ DoMeleeAttackIfReady();
}
};
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp
index 3f51fc08ee4..7886fad94cc 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_patchwerk.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,14 +14,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Patchwerk
-SD%Complete: 80
-SDComment: Some issues with hateful strike inturrupting the melee swing timer.
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
+#include "def_naxxramas.h"
#define SAY_AGGRO RAND(-1533017,-1533018)
#define SAY_SLAY -1533019
@@ -39,18 +33,11 @@ EndScriptData */
#define EVENT_HATEFUL 2
#define EVENT_SLIME 3
-struct TRINITY_DLL_DECL boss_patchwerkAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_patchwerkAI : public BossAI
{
- boss_patchwerkAI(Creature *c) : ScriptedAI(c) {}
+ boss_patchwerkAI(Creature *c) : BossAI(c, BOSS_PATCHWERK) {}
bool Enraged;
- EventMap events;
-
- void Reset()
- {
- events.Reset();
- Enraged = false;
- }
void KilledUnit(Unit* Victim)
{
@@ -60,13 +47,15 @@ struct TRINITY_DLL_DECL boss_patchwerkAI : public ScriptedAI
void JustDied(Unit* Killer)
{
+ _JustDied();
DoScriptText(SAY_DEATH, me);
}
void EnterCombat(Unit *who)
{
+ _EnterCombat();
+ Enraged = false;
DoScriptText(SAY_AGGRO, me);
- DoZoneInCombat();
events.ScheduleEvent(EVENT_HATEFUL, 1200);
events.ScheduleEvent(EVENT_BERSERK, 360000);
}
@@ -88,15 +77,14 @@ struct TRINITY_DLL_DECL boss_patchwerkAI : public ScriptedAI
//amount of HP within melee distance
uint32 MostHP = 0;
Unit* pMostHPTarget = NULL;
- std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin();
- for(; i != m_creature->getThreatManager().getThreatList().end();)
+ std::list<HostilReference*>::iterator i = me->getThreatManager().getThreatList().begin();
+ for(; i != me->getThreatManager().getThreatList().end(); ++i)
{
- Unit* pTemp = Unit::GetUnit(*m_creature, (*i)->getUnitGuid());
- ++i;
- if (pTemp && pTemp->isAlive() && pTemp->GetHealth() > MostHP && m_creature->IsWithinMeleeRange(pTemp))
+ Unit* target = (*i)->getTarget();
+ if (target->isAlive() && target->GetHealth() > MostHP && me->IsWithinMeleeRange(target))
{
- MostHP = pTemp->GetHealth();
- pMostHPTarget = pTemp;
+ MostHP = target->GetHealth();
+ pMostHPTarget = target;
}
}
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp
index 64147eaea8a..67fcaee7de3 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_razuvious.cpp
@@ -1,4 +1,6 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/*
+ * Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,14 +16,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Razuvious
-SD%Complete: 50
-SDComment: Missing adds and event is impossible without Mind Control
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
+#include "def_naxxramas.h"
//Razuvious - NO TEXT sound only
//8852 aggro01 - Hah hah, I'm just getting warmed up!
@@ -37,121 +33,86 @@ EndScriptData */
//8860 death - An honorable... death...
//8947 - Aggro Mixed? - ?
-#define SOUND_AGGRO1 8852
-#define SOUND_AGGRO2 8853
-#define SOUND_AGGRO3 8854
-#define SOUND_SLAY1 8861
-#define SOUND_SLAY2 8863
-#define SOUND_COMMND1 8855
-#define SOUND_COMMND2 8856
-#define SOUND_COMMND3 8858
-#define SOUND_COMMND4 8859
-#define SOUND_COMMND5 8861
+#define SOUND_AGGRO RAND(8852,8853,8854)
+#define SOUND_SLAY RAND(8861,8863)
+#define SOUND_COMMND RAND(8855,8856,8858,8859,8861)
#define SOUND_DEATH 8860
#define SOUND_AGGROMIX 8847
-#define SPELL_UNBALANCINGSTRIKE 26613
-#define SPELL_DISRUPTINGSHOUT 29107
+#define SPELL_UNBALANCING_STRIKE 26613
+#define SPELL_DISRUPTING_SHOUT HEROIC(29107,55543)
+#define SPELL_JAGGED_KNIFE 55550
+#define SPELL_HOPELESS 29125
-struct TRINITY_DLL_DECL boss_razuviousAI : public ScriptedAI
+enum Events
{
- boss_razuviousAI(Creature *c) : ScriptedAI(c) {}
-
- uint32 UnbalancingStrike_Timer;
- uint32 DisruptingShout_Timer;
- uint32 CommandSound_Timer;
+ EVENT_STRIKE,
+ EVENT_SHOUT,
+ EVENT_KNIFE,
+ EVENT_COMMAND,
+};
- void Reset()
- {
- UnbalancingStrike_Timer = 30000; //30 seconds
- DisruptingShout_Timer = 25000; //25 seconds
- CommandSound_Timer = 40000; //40 seconds
- }
+struct TRINITY_DLL_DECL boss_razuviousAI : public BossAI
+{
+ boss_razuviousAI(Creature *c) : BossAI(c, BOSS_RAZUVIOUS) {}
- void KilledUnit(Unit* Victim)
+ void KilledUnit(Unit* victim)
{
- if (rand()%3)
- return;
-
- switch (rand()%2)
- {
- case 0:
- DoPlaySoundToSet(m_creature, SOUND_SLAY1);
- break;
- case 1:
- DoPlaySoundToSet(m_creature, SOUND_SLAY2);
- break;
- }
+ if(!(rand()%3))
+ DoPlaySoundToSet(me, SOUND_SLAY);
}
- void JustDied(Unit* Killer)
+ void JustDied(Unit* killer)
{
- DoPlaySoundToSet(m_creature, SOUND_DEATH);
+ _JustDied();
+ DoPlaySoundToSet(me, SOUND_DEATH);
+ me->CastSpell(me, SPELL_HOPELESS, true); // TODO: this may affect other creatures
}
void EnterCombat(Unit *who)
{
- switch (rand()%3)
- {
- case 0:
- DoPlaySoundToSet(m_creature, SOUND_AGGRO1);
- break;
- case 1:
- DoPlaySoundToSet(m_creature, SOUND_AGGRO2);
- break;
- case 2:
- DoPlaySoundToSet(m_creature, SOUND_AGGRO3);
- break;
- }
+ _EnterCombat();
+ DoPlaySoundToSet(m_creature, SOUND_AGGRO);
+ events.ScheduleEvent(EVENT_STRIKE, 30000);
+ events.ScheduleEvent(EVENT_SHOUT, 25000);
+ events.ScheduleEvent(EVENT_COMMAND, 40000);
}
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim())
+ if(!UpdateVictim())
return;
- //UnbalancingStrike_Timer
- if (UnbalancingStrike_Timer < diff)
- {
- DoCast(m_creature->getVictim(),SPELL_UNBALANCINGSTRIKE);
- UnbalancingStrike_Timer = 30000;
- }else UnbalancingStrike_Timer -= diff;
-
- //DisruptingShout_Timer
- if (DisruptingShout_Timer < diff)
- {
- DoCast(m_creature->getVictim(), SPELL_DISRUPTINGSHOUT);
- DisruptingShout_Timer = 25000;
- }else DisruptingShout_Timer -= diff;
+ events.Update(diff);
- //CommandSound_Timer
- if (CommandSound_Timer < diff)
+ while(uint32 eventId = events.ExecuteEvent())
{
- switch (rand()%5)
+ switch(eventId)
{
- case 0:
- DoPlaySoundToSet(m_creature, SOUND_COMMND1);
- break;
- case 1:
- DoPlaySoundToSet(m_creature, SOUND_COMMND2);
- break;
- case 2:
- DoPlaySoundToSet(m_creature, SOUND_COMMND3);
- break;
- case 3:
- DoPlaySoundToSet(m_creature, SOUND_COMMND4);
- break;
- case 4:
- DoPlaySoundToSet(m_creature, SOUND_COMMND5);
- break;
+ case EVENT_STRIKE:
+ DoCast(me->getVictim(), SPELL_UNBALANCING_STRIKE);
+ events.ScheduleEvent(EVENT_STRIKE, 30000);
+ return;
+ case EVENT_SHOUT:
+ DoCastAOE(SPELL_DISRUPTING_SHOUT);
+ events.ScheduleEvent(EVENT_SHOUT, 25000);
+ return;
+ case EVENT_KNIFE:
+ if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45))
+ DoCast(target, SPELL_JAGGED_KNIFE);
+ events.ScheduleEvent(EVENT_KNIFE, 25000);
+ return;
+ case EVENT_COMMAND:
+ DoPlaySoundToSet(me, SOUND_COMMND);
+ events.ScheduleEvent(EVENT_COMMAND, 40000);
+ return;
}
-
- CommandSound_Timer = 40000;
- }else CommandSound_Timer -= diff;
+ }
DoMeleeAttackIfReady();
}
};
+
CreatureAI* GetAI_boss_razuvious(Creature *_Creature)
{
return new boss_razuviousAI (_Creature);
@@ -165,4 +126,3 @@ void AddSC_boss_razuvious()
newscript->GetAI = &GetAI_boss_razuvious;
newscript->RegisterSelf();
}
-
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
index a0cfb77c06c..71259df7824 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_sapphiron.cpp
@@ -1,4 +1,6 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/*
+ * Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,171 +16,324 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Boss_Sapphiron
-SD%Complete: 0
-SDComment: Place Holder
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
+#include "def_naxxramas.h"
#define EMOTE_BREATH -1533082
#define EMOTE_ENRAGE -1533083
-#define SPELL_ICEBOLT 28522
-#define SPELL_FROST_BREATH 29318
#define SPELL_FROST_AURA HEROIC(28531,55799)
-#define SPELL_LIFE_DRAIN HEROIC(28542,55665)
-//#define SPELL_CHILL 28560
-#define SPELL_BLIZZARD 28547
-#define SPELL_BESERK 26662
#define SPELL_CLEAVE 19983
-#define SPELL_TAIL_SWEEP 55697
+#define SPELL_TAIL_SWEEP HEROIC(55697,55696)
+#define SPELL_SUMMON_BLIZZARD 28560
+#define SPELL_LIFE_DRAIN HEROIC(28542,55665)
+#define SPELL_ICEBOLT 28522
+#define SPELL_FROST_BREATH 29318
+#define SPELL_FROST_EXPLOSION 28524
+#define SPELL_FROST_MISSILE 30101
+#define SPELL_BERSERK 26662
+#define SPELL_DIES 29357
+#define SPELL_CHILL HEROIC(28547,55699)
-struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
+#define MOB_BLIZZARD 16474
+#define GO_ICEBLOCK 181247
+
+enum Phases
{
- boss_sapphironAI(Creature* c) : ScriptedAI(c) {}
-
- uint32 Icebolt_Count;
- uint32 Icebolt_Timer;
- uint32 FrostBreath_Timer;
- uint32 FrostAura_Timer;
- uint32 LifeDrain_Timer;
- uint32 Blizzard_Timer;
- uint32 Tail_Sweep_Timer;
- uint32 Cleave_Timer;
- uint32 Fly_Timer;
- uint32 Fly2_Timer;
- uint32 Beserk_Timer;
- uint32 phase;
- bool IsInFly;
- uint32 land_Timer;
+ PHASE_NULL = 0,
+ PHASE_BIRTH,
+ PHASE_GROUND,
+ PHASE_FLIGHT,
+};
+
+enum Events
+{
+ EVENT_BERSERK = 1,
+ EVENT_CLEAVE,
+ EVENT_TAIL,
+ EVENT_DRAIN,
+ EVENT_BLIZZARD,
+ EVENT_FLIGHT,
+ EVENT_LIFTOFF,
+ EVENT_ICEBOLT,
+ EVENT_BREATH,
+ EVENT_EXPLOSION,
+ EVENT_LAND,
+ EVENT_GROUND,
+ EVENT_BIRTH,
+};
+
+typedef std::map<uint64, uint64> IceBlockMap;
+
+struct TRINITY_DLL_DECL boss_sapphironAI : public BossAI
+{
+ boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
+ , phase(PHASE_NULL)
+ {}
+
+ Phases phase;
+ uint32 iceboltCount;
+ IceBlockMap iceblocks;
+
+ void InitializeAI()
+ {
+ float x, y, z;
+ me->GetPosition(x, y, z);
+ me->SummonGameObject(GO_BIRTH, x, y, z, 0, 0, 0, 0, 0, 0);
+ me->SetVisibility(VISIBILITY_OFF);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->SetReactState(REACT_PASSIVE);
+
+ Reset();
+ }
void Reset()
{
- FrostAura_Timer = 2000;
- LifeDrain_Timer = 24000;
- Blizzard_Timer = 20000;
- Tail_Sweep_Timer=(rand()%2+9)*1000;
- Cleave_Timer=10000;
- Fly_Timer = 45000;
- Icebolt_Timer = 4000;
- land_Timer = 0;
- Beserk_Timer = 15*60000;
- phase = 1;
- Icebolt_Count = 0;
- IsInFly = false;
-
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ _Reset();
+
+ if(phase = PHASE_FLIGHT)
+ ClearIceBlock();
+
+ phase = PHASE_NULL;
}
void EnterCombat(Unit *who)
{
- DoZoneInCombat();
+ _EnterCombat();
+
me->CastSpell(me, SPELL_FROST_AURA, true);
+
+ events.ScheduleEvent(EVENT_BERSERK, 15*60000);
+ EnterPhaseGround();
+ }
+
+ void SpellHitTarget(Unit *target, const SpellEntry *spell)
+ {
+ if(spell->Id == SPELL_ICEBOLT)
+ {
+ IceBlockMap::iterator itr = iceblocks.find(target->GetGUID());
+ if(itr != iceblocks.end() && !itr->second)
+ {
+ if(GameObject *iceblock = me->SummonGameObject(GO_ICEBLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, 0, 0, 0, 0, 25000))
+ itr->second = iceblock->GetGUID();
+ }
+ }
+ }
+
+ void JustDied(Unit*)
+ {
+ _JustDied();
+ me->CastSpell(me, SPELL_DIES, true);
+ }
+
+ void MovementInform(uint32, uint32 id)
+ {
+ if(id == 1)
+ events.ScheduleEvent(EVENT_LIFTOFF, 0);
+ }
+
+ void DoAction(const int32 param)
+ {
+ if(param == DATA_SAPPHIRON_BIRTH)
+ {
+ phase = PHASE_BIRTH;
+ events.ScheduleEvent(EVENT_BIRTH, 23000);
+ }
+ }
+
+ void EnterPhaseGround()
+ {
+ phase = PHASE_GROUND;
+ me->SetReactState(REACT_AGGRESSIVE);
+ events.SetPhase(PHASE_GROUND);
+ events.ScheduleEvent(EVENT_CLEAVE, 5000+rand()%10000, 0, PHASE_GROUND);
+ events.ScheduleEvent(EVENT_TAIL, 5000+rand()%10000, 0, PHASE_GROUND);
+ events.ScheduleEvent(EVENT_DRAIN, 24000, 0, PHASE_GROUND);
+ events.ScheduleEvent(EVENT_BLIZZARD, 5000+rand()%5000, 0, PHASE_GROUND);
+ events.ScheduleEvent(EVENT_FLIGHT, 45000);
+ }
+
+ void ClearIceBlock()
+ {
+ for(IceBlockMap::iterator itr = iceblocks.begin(); itr != iceblocks.end(); ++itr)
+ {
+ if(Player *player = Unit::GetPlayer(itr->first))
+ player->RemoveAura(SPELL_ICEBOLT);
+ if(GameObject *go = GameObject::GetGameObject(*me, itr->second))
+ go->Delete();
+ }
+ iceblocks.clear();
}
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim())
+ if(!phase)
return;
- if(phase == 1)
+ events.Update(diff);
+
+ if(phase == PHASE_GROUND)
{
- if(LifeDrain_Timer < diff)
- {
- DoCastAOE(SPELL_LIFE_DRAIN);
- LifeDrain_Timer = 24000;
- }else LifeDrain_Timer -= diff;
+ if(!UpdateVictim())
+ return;
- if(Blizzard_Timer < diff)
+ while(uint32 eventId = events.ExecuteEvent())
{
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
+ switch(eventId)
{
- DoCast(target,SPELL_BLIZZARD);
- //It seems NO damage?
+ case EVENT_BERSERK:
+ DoScriptText(EMOTE_ENRAGE, m_creature);
+ DoCast(me, SPELL_BERSERK);
+ return;
+ case EVENT_CLEAVE:
+ DoCast(me->getVictim(), SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, 5000+rand()%10000, 0, PHASE_GROUND);
+ return;
+ case EVENT_TAIL:
+ DoCastAOE(SPELL_TAIL_SWEEP);
+ events.ScheduleEvent(EVENT_TAIL, 5000+rand()%10000, 0, PHASE_GROUND);
+ return;
+ case EVENT_DRAIN:
+ DoCastAOE(SPELL_LIFE_DRAIN);
+ events.ScheduleEvent(EVENT_DRAIN, 24000, 0, PHASE_GROUND);
+ return;
+ case EVENT_BLIZZARD:
+ {
+ //DoCastAOE(SPELL_SUMMON_BLIZZARD);
+ float x, y, z;
+ me->GetGroundPointAroundUnit(x, y, z, rand_norm()*20, rand_norm()*2*M_PI);
+ if(Creature *summon = me->SummonCreature(MOB_BLIZZARD, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 25000+rand()%5000))
+ summon->GetMotionMaster()->MoveRandom(40);
+ events.ScheduleEvent(EVENT_BLIZZARD, HEROIC(20000,7000), 0, PHASE_GROUND);
+ break;
+ }
+ case EVENT_FLIGHT:
+ phase = PHASE_FLIGHT;
+ events.SetPhase(PHASE_FLIGHT);
+ me->SetReactState(REACT_PASSIVE);
+ me->AttackStop();
+ float x, y, z, o;
+ me->GetHomePosition(x, y, z, o);
+ me->GetMotionMaster()->MovePoint(1, x, y, z);
+ return;
}
- Blizzard_Timer = 20000;
- }else Blizzard_Timer -= diff;
+ }
- //SPELL_CLEAVE
- if(Cleave_Timer < diff)
+ DoMeleeAttackIfReady();
+ }
+ else
+ {
+ /*if(me->getThreatManager().isThreatListEmpty())
{
- DoCast(m_creature->getVictim(),SPELL_CLEAVE);
- Cleave_Timer = 10000;
- }else Cleave_Timer -= diff;
+ EnterEvadeMode();
+ return;
+ }*/
- //Tail Sweep_Timer,
- if(Tail_Sweep_Timer < diff)
+ if(uint32 eventId = events.ExecuteEvent())
{
- DoCast(m_creature,SPELL_TAIL_SWEEP);
- Tail_Sweep_Timer=(rand()%2+9)*1000;
- }else Tail_Sweep_Timer -= diff;
+ switch(eventId)
+ {
+ case EVENT_LIFTOFF:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ me->SendMovementFlagUpdate();
+ events.ScheduleEvent(EVENT_ICEBOLT, 1500);
+ iceboltCount = HEROIC(2,3);
+ return;
+ case EVENT_ICEBOLT:
+ {
+ std::vector<Unit*> targets;
+ std::list<HostilReference*>::iterator i = me->getThreatManager().getThreatList().begin();
+ for(; i != me->getThreatManager().getThreatList().end(); ++i)
+ if((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER && !(*i)->getTarget()->HasAura(SPELL_ICEBOLT))
+ targets.push_back((*i)->getTarget());
+
+ if(targets.empty())
+ iceboltCount = 0;
+ else
+ {
+ std::vector<Unit*>::iterator itr = targets.begin();
+ advance(itr, rand()%targets.size());
+ iceblocks.insert(std::make_pair((*itr)->GetGUID(), 0));
+ DoCast(*itr, SPELL_ICEBOLT);
+ --iceboltCount;
+ }
+
+ if(iceboltCount)
+ events.ScheduleEvent(EVENT_ICEBOLT, 1000);
+ else
+ events.ScheduleEvent(EVENT_BREATH, 1000);
+ return;
+ }
+ case EVENT_BREATH:
+ {
+ DoScriptText(EMOTE_BREATH, me);
+ DoCastAOE(SPELL_FROST_MISSILE);
+ events.ScheduleEvent(EVENT_EXPLOSION, 8000);
+ return;
+ }
+ case EVENT_EXPLOSION:
+ CastExplosion();
+ ClearIceBlock();
+ events.ScheduleEvent(EVENT_LAND, 3000);
+ return;
+ case EVENT_LAND:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ me->SendMovementFlagUpdate();
+ events.ScheduleEvent(EVENT_GROUND, 1500);
+ return;
+ case EVENT_GROUND:
+ EnterPhaseGround();
+ return;
+ case EVENT_BIRTH:
+ me->SetVisibility(VISIBILITY_ON);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->SetReactState(REACT_AGGRESSIVE);
+ return;
+ }
+ }//if(uint32 eventId = events.ExecuteEvent())
+ }//if(phase == PHASE_GROUND)
+ }
+
+ void CastExplosion()
+ {
+ DoZoneInCombat(); // make sure everyone is in threatlist
+ std::vector<Unit*> targets;
+ std::list<HostilReference*>::iterator i = me->getThreatManager().getThreatList().begin();
+ for(; i != me->getThreatManager().getThreatList().end(); ++i)
+ {
+ Unit *target = (*i)->getTarget();
+ if(target->GetTypeId() != TYPEID_PLAYER)
+ continue;
- if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 10)
+ if(target->HasAura(SPELL_ICEBOLT))
{
- if(Fly_Timer < diff)
- {
- phase = 2;
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
- m_creature->GetMotionMaster()->Clear(false);
- m_creature->GetMotionMaster()->MoveIdle();
- m_creature->SetHover(true);
- Icebolt_Timer = 4000;
- Icebolt_Count = 0;
- IsInFly = true;
- }else Fly_Timer -= diff;
+ target->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, true);
+ targets.push_back(target);
+ continue;
}
- }
- if (phase == 2)
- {
- if(Icebolt_Timer < diff && Icebolt_Count < 5)
+ for(IceBlockMap::iterator itr = iceblocks.begin(); itr != iceblocks.end(); ++itr)
{
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
+ if(GameObject *go = GameObject::GetGameObject(*me, itr->second))
{
- DoCast(target,SPELL_ICEBOLT);
- ++Icebolt_Count;
- error_log("Count incremented");
+ if(go->IsInBetween(me, target, 2.0f)
+ && me->GetExactDistance2d(target->GetPositionX(), target->GetPositionY()) - me->GetExactDistance2d(go->GetPositionX(), go->GetPositionY()) < 5.0f)
+ {
+ target->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, true);
+ targets.push_back(target);
+ break;
+ }
}
- FrostBreath_Timer = 6000;
- Icebolt_Timer = 4000;
- }else Icebolt_Timer -= diff;
-
- if(Icebolt_Count == 5 && IsInFly && FrostBreath_Timer < diff )
- {
- DoScriptText(EMOTE_BREATH, m_creature);
- DoCast(m_creature->getVictim(),SPELL_FROST_BREATH);
- land_Timer = 2000;
- IsInFly = false;
- FrostBreath_Timer = 6000;
- }else FrostBreath_Timer -= diff;
-
- if(!IsInFly && land_Timer < diff)
- {
- phase = 1;
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
- m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
- m_creature->GetMotionMaster()->Clear(false);
- m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
- m_creature->SetHover(true);
- land_Timer = 0;
- Fly_Timer = 67000;
- }else land_Timer -= diff;
+ }
}
- if (Beserk_Timer < diff)
- {
- DoScriptText(EMOTE_ENRAGE, m_creature);
- DoCast(m_creature,SPELL_BESERK);
- Beserk_Timer = 300000;
- }else Beserk_Timer -= diff;
+ me->CastSpell(me, SPELL_FROST_EXPLOSION, true);
- if (phase!=2)
- DoMeleeAttackIfReady();
+ for(std::vector<Unit*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
+ (*itr)->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, false);
}
};
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/def_naxxramas.h b/src/bindings/scripts/scripts/zone/naxxramas/def_naxxramas.h
index b0931c556fe..383200d4600 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/def_naxxramas.h
+++ b/src/bindings/scripts/scripts/zone/naxxramas/def_naxxramas.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Trinity <http://www.trinitycore.org/>
+ * Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,15 +21,32 @@
enum Encounter
{
+ BOSS_ANUBREKHAN,
+ BOSS_FAERLINA,
+ BOSS_MAEXXNA,
BOSS_NOTH,
BOSS_HEIGAN,
BOSS_LOATHEB,
+ BOSS_PATCHWERK,
+ BOSS_GROBBULUS,
+ BOSS_GLUTH,
+ BOSS_THADDIUS,
+ BOSS_RAZUVIOUS,
+ BOSS_GOTHIK,
+ BOSS_HORSEMEN,
+ BOSS_SAPPHIRON,
+ BOSS_KELTHUZAD,
+ MAX_BOSS_NUMBER
};
enum Data
{
DATA_HEIGAN_ERUPT,
+ DATA_GOTHIK_GATE,
+ DATA_SAPPHIRON_BIRTH,
};
+#define GO_BIRTH 181356
+
#endif
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
index dfa085f39be..e5913660c3f 100644
--- a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
+++ b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -14,16 +14,38 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* ScriptData
-SDName: Instance_Naxxramas
-SD%Complete: 0
-SDComment: Place holder
-SDCategory: Naxxramas
-EndScriptData */
-
#include "precompiled.h"
#include "def_naxxramas.h"
+const DoorData doorData[] =
+{
+ {181126, BOSS_ANUBREKHAN,DOOR_TYPE_ROOM},
+ {181195, BOSS_ANUBREKHAN,DOOR_TYPE_PASSAGE},
+ {194022, BOSS_FAERLINA, DOOR_TYPE_PASSAGE},
+ {181209, BOSS_FAERLINA, DOOR_TYPE_PASSAGE},
+ {181209, BOSS_MAEXXNA, DOOR_TYPE_ROOM},
+ {181200, BOSS_NOTH, DOOR_TYPE_ROOM},
+ {181201, BOSS_NOTH, DOOR_TYPE_PASSAGE},
+ {181202, BOSS_NOTH, DOOR_TYPE_PASSAGE},
+ {181202, BOSS_HEIGAN, DOOR_TYPE_ROOM},
+ {181203, BOSS_HEIGAN, DOOR_TYPE_PASSAGE},
+ {181241, BOSS_HEIGAN, DOOR_TYPE_PASSAGE},
+ {181241, BOSS_LOATHEB, DOOR_TYPE_ROOM},
+ {181123, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE},
+ {181123, BOSS_GROBBULUS, DOOR_TYPE_ROOM},
+ {181120, BOSS_GLUTH, DOOR_TYPE_PASSAGE},
+ {181121, BOSS_GLUTH, DOOR_TYPE_PASSAGE},
+ {181121, BOSS_THADDIUS, DOOR_TYPE_ROOM},
+ {181124, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE},
+ {181124, BOSS_GOTHIK, DOOR_TYPE_ROOM},
+ {181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE},
+ {181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE},
+ {181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM},
+ {0, 0, DOOR_TYPE_ROOM}, // EOF
+};
+
+#define GO_GOTHIK_GATE 181170
+
#define SPELL_ERUPTION 29371
const float HeiganPos[2] = {2796, -3707};
@@ -55,14 +77,28 @@ inline uint32 GetEruptionSection(float x, float y)
return 3;
}
-struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance
+struct TRINITY_DLL_DECL instance_naxxramas : public InstanceData
{
- instance_naxxramas(Map *map) : ScriptedInstance(map)
+ instance_naxxramas(Map *map) : InstanceData(map)
+ , Sapphiron(NULL)
{
- SetBossNumber(15);
+ SetBossNumber(MAX_BOSS_NUMBER);
+ LoadDoorData(doorData);
}
+ std::set<Creature*> Worshipper;
std::set<GameObject*> HeiganEruption[4];
+ GameObject *GothikGate;
+ Creature *Sapphiron;
+
+ void OnCreatureCreate(Creature *creature, bool add)
+ {
+ switch(creature->GetEntry())
+ {
+ case 15989: Sapphiron = add ? creature : NULL; break;
+ case 16506: if(add) Worshipper.insert(creature); else Worshipper.erase(creature); break;
+ }
+ }
void OnObjectCreate(GameObject* go, bool add)
{
@@ -78,11 +114,24 @@ struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance
switch(go->GetEntry())
{
- case 181200: SetBossRoomDoor(BOSS_NOTH, go, add); break;
- case 181201: SetBossPassageDoor(BOSS_NOTH, go, add); break;
- case 181202: SetBossRoomDoor(BOSS_HEIGAN, go, add); break;
- case 181203: SetBossPassageDoor(BOSS_HEIGAN, go, add); break;
- case 181241: SetBossRoomDoor(BOSS_LOATHEB, go, add); break;
+ case GO_BIRTH: if(!add && Sapphiron) Sapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH); return;
+ case GO_GOTHIK_GATE: GothikGate = add ? go : NULL; break;
+ }
+
+ AddDoor(go, add);
+ }
+
+ void SetBossState(uint32 id, EncounterState state)
+ {
+ InstanceData::SetBossState(id, state);
+ switch(id)
+ {
+ case BOSS_FAERLINA:
+ if(state == NOT_STARTED)
+ for(std::set<Creature*>::iterator itr = Worshipper.begin(); itr != Worshipper.end(); ++itr)
+ if(!(*itr)->isAlive())
+ (*itr)->Respawn();
+ break;
}
}
@@ -93,6 +142,10 @@ struct TRINITY_DLL_DECL instance_naxxramas : public ScriptedInstance
case DATA_HEIGAN_ERUPT:
HeiganErupt(value);
break;
+ case DATA_GOTHIK_GATE:
+ if(GothikGate)
+ GothikGate->SetGoState(GOState(value));
+ break;
}
}
@@ -122,6 +175,6 @@ void AddSC_instance_naxxramas()
Script *newscript;
newscript = new Script;
newscript->Name = "instance_naxxramas";
- newscript->GetInstanceData = GetInstanceData_instance_naxxramas;
+ newscript->GetInstanceData = &GetInstanceData_instance_naxxramas;
newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
index caf18778abb..30f843badb0 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
@@ -185,7 +185,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
return str_data.c_str();
}
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
index 8e42d074f88..e753d0b6047 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
@@ -306,7 +306,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
case 2:{
error_log("Summon Vapor case 2");
Unit* target;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
if(target)
{
@@ -331,7 +331,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
error_log("Summon Vapor case3");
//m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
Unit* target;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
if(target)
{
@@ -358,7 +358,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
break;
case 5:{
Unit* target;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
if(target)
{
@@ -471,7 +471,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
Timer[EVENT_GAS_NOVA] = 20000 + rand()%5 * 1000;
break;
case EVENT_ENCAPSULATE:
- if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true))
+ if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true))
{
m_creature->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
target->CastSpell(target, SPELL_ENCAPSULATE_EFFECT, true);// linked aura, need core patch to remove this hack
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
index 98cbfda7a7f..a0bd75cb156 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp
@@ -540,7 +540,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
float x,y,z;
Unit* target;
for(uint8 z = 0; z < 6; ++z){
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
}
target->GetPosition(x,y,z);
@@ -584,7 +584,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
if(!m_creature->IsNonMeleeSpellCasted(false)){
m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY);
for(uint8 z = 0; z < 6; ++z){
- randomPlayer = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
+ randomPlayer = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (!randomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
}
if(randomPlayer)DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false);
@@ -658,7 +658,7 @@ struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI
case TIMER_ARMAGEDDON: //Phase 4
Unit* target;
for(uint8 z = 0; z < 6; ++z){
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break;
}
if(target){
@@ -1199,7 +1199,7 @@ struct TRINITY_DLL_DECL mob_sinster_reflectionAI : public ScriptedAI
Timer[1] = 4000;
}
if(Timer[2] < diff){
- DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SR_CURSE_OF_AGONY, true);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SR_CURSE_OF_AGONY, true);
Timer[2] = 3000;
}
DoMeleeAttackIfReady();
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp
index 6000ee474e0..b38607e1a7f 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp
@@ -155,7 +155,7 @@ struct TRINITY_DLL_DECL boss_entropiusAI : public ScriptedAI
m_creature->SummonCreature(CREATURE_DARK_FIENDS, x,y,z,o, TEMPSUMMON_CORPSE_DESPAWN, 0);
break;
}
- summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
+ summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM,0, 50, true));
Summons.Summon(summoned);
}
@@ -180,10 +180,10 @@ struct TRINITY_DLL_DECL boss_entropiusAI : public ScriptedAI
}else EnrageTimer -= diff;
if(BlackHoleSummonTimer < diff){
- Unit* random = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
+ Unit* random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if(!random)return;
DoCast(random, SPELL_DARKNESS_E, false);
- random = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
+ random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if(!random)return;
random->CastSpell(random, SPELL_BLACKHOLE, false);
BlackHoleSummonTimer = 15000;
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL boss_muruAI : public Scripted_NoMovementAI
summoned->CastSpell(summoned,SPELL_DARKFIEND_VISUAL,false);
break;
}
- summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
+ summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM,0, 50, true));
Summons.Summon(summoned);
}
@@ -441,7 +441,7 @@ struct TRINITY_DLL_DECL npc_dark_fiendAI : public ScriptedAI
if(!InAction){
m_creature->clearUnitState(UNIT_STAT_STUNNED);
DoCastAOE(SPELL_DARKFIEND_SKIN, false);
- AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true));
+ AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true));
InAction = true;
WaitTimer = 500;
}else{
diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
index f8bba5acf21..597103b62cf 100644
--- a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
+++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp
@@ -236,7 +236,7 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
{
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
index 168f0f48e3a..dfeb7fea3e6 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
@@ -352,7 +352,7 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
if(Charge_Timer < diff)
{
- Unit *target= SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_CHARGE), true);
+ Unit *target= SelectTarget(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_CHARGE), true);
if(target)
DoCast(target, SPELL_CHARGE);
Charge_Timer = 30000;
@@ -410,7 +410,8 @@ struct TRINITY_DLL_DECL boss_alarAI : public ScriptedAI
else
{
Unit *target = NULL;
- if(Phase1 && target && (target = m_creature->SelectNearestTarget(5)))
+ target = m_creature->SelectNearestTarget(5);
+ if(Phase1 && target)
m_creature->AI()->AttackStart(target);
else
{
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
index 83cb789b189..6af14eceeed 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
@@ -230,7 +230,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI
if( Wrath_Timer < diff)
{
m_creature->InterruptNonMeleeSpells(false);
- DoCast(SelectUnit(SELECT_TARGET_RANDOM,1,100,true), SPELL_WRATH_OF_THE_ASTROMANCER, true);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,1,100,true), SPELL_WRATH_OF_THE_ASTROMANCER, true);
Wrath_Timer = 20000+rand()%5000;
}else Wrath_Timer -= diff;
@@ -260,7 +260,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI
if (MarkOfTheAstromancer_Timer < diff) //A debuff that lasts for 5 seconds, cast several times each phase on a random raid member, but not the main tank
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 100, true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
if(target)
DoCast(target, SPELL_MARK_OF_THE_ASTROMANCER);
else DoCast(m_creature->getVictim(), SPELL_MARK_OF_THE_ASTROMANCER);
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
index 6745c4fd9ec..7557e03f8e5 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
@@ -804,7 +804,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
if (FlameStrike_Timer < diff)
{
- if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0, 70, true))
+ if (Unit* pUnit = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true))
DoCast(pUnit, SPELL_FLAME_STRIKE);
FlameStrike_Timer = 30000;
@@ -816,7 +816,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
for (uint32 i = 0; i < 3; i++)
{
- Unit* target =SelectUnit(SELECT_TARGET_RANDOM, 1, 70, true);
+ Unit* target =SelectTarget(SELECT_TARGET_RANDOM, 1, 70, true);
if(!target) target = m_creature->getVictim();
debug_log("TSCR: Kael'Thas mind control not supported.");
if(target)
@@ -1080,7 +1080,7 @@ struct TRINITY_DLL_DECL boss_thaladred_the_darkenerAI : public advisorbase_ai
//Gaze_Timer
if(Gaze_Timer < diff)
{
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoResetThreat();
if(target)
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
index 66e595ab729..55ef8c60bbd 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
diff --git a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
index c3d4d0f35eb..d2fff0e569f 100644
--- a/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
+++ b/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_twinemperors.cpp
@@ -465,7 +465,7 @@ struct TRINITY_DLL_DECL boss_veknilashAI : public boss_twinemperorsAI
if (UpperCut_Timer < diff)
{
- Unit* randomMelee = SelectUnit(SELECT_TARGET_RANDOM, 0, NOMINAL_MELEE_RANGE, true);
+ Unit* randomMelee = SelectTarget(SELECT_TARGET_RANDOM, 0, NOMINAL_MELEE_RANGE, true);
if (randomMelee)
DoCast(randomMelee,SPELL_UPPERCUT);
UpperCut_Timer = 15000+rand()%15000;
@@ -560,7 +560,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI
if (Blizzard_Timer < diff)
{
Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0, 45, true);
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45, true);
if (target)
DoCast(target,SPELL_BLIZZARD);
Blizzard_Timer = 15000+rand()%15000;
@@ -569,7 +569,7 @@ struct TRINITY_DLL_DECL boss_veklorAI : public boss_twinemperorsAI
if (ArcaneBurst_Timer < diff)
{
Unit *mvic;
- if ((mvic=SelectUnit(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true))!=NULL)
+ if ((mvic=SelectTarget(SELECT_TARGET_NEAREST, 0, NOMINAL_MELEE_RANGE, true))!=NULL)
{
DoCast(mvic,SPELL_ARCANEBURST);
ArcaneBurst_Timer = 5000;
diff --git a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
index d6f5828d295..d483006642d 100644
--- a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
@@ -231,7 +231,7 @@ struct TRINITY_DLL_DECL instance_utgarde_keep : public ScriptedInstance
return 0;
}
- const char* Save()
+ std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
diff --git a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/utgarde_keep.cpp b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/utgarde_keep.cpp
index 3c2b898653d..923328627e4 100644
--- a/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/utgarde_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/utgarde_keep/utgarde_keep/utgarde_keep.cpp
@@ -155,6 +155,6 @@ void AddSC_utgarde_keep()
newscript = new Script;
newscript->Name="npc_dragonflayer_forge_master";
- newscript->GetAI = GetAI_npc_dragonflayer_forge_master;
+ newscript->GetAI = &GetAI_npc_dragonflayer_forge_master;
newscript->RegisterSelf();
-} \ No newline at end of file
+}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
index f31f944a3d4..85ba26ef20d 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_akilzon.cpp
@@ -297,7 +297,7 @@ struct TRINITY_DLL_DECL boss_akilzonAI : public ScriptedAI
}
if (ElectricalStorm_Timer < diff) {
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 50, true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true);
if(!target)
{
EnterEvadeMode();
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
index 7fb8dc9b321..26229261905 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
@@ -383,7 +383,7 @@ struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
if(SiphonSoul_Timer < diff)
{
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 70, true);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 70, true);
Unit *trigger = DoSpawnCreature(MOB_TEMP_TRIGGER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
if(!target || !trigger)
{
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
index 9fc50e621ac..68b92590025 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
@@ -406,7 +406,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
{
DoYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_SURGE);
- Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_SURGE), true);
+ Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, GetSpellMaxRangeForHostile(SPELL_SURGE), true);
if(target)
DoCast(target, SPELL_SURGE);
Surge_Timer = 15000 + rand()%5000;
diff --git a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
index 4ebf541515b..8ff01927908 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
@@ -179,7 +179,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
instance->SendToPlayers(&data);
}
- const char* Save()
+ std::string GetSaveData()
{
std::ostringstream ss;
ss << "S " << BossKilled << " " << ChestLooted << " " << QuestMinute;