aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/authserver/Server/AuthSocket.cpp2
-rw-r--r--src/server/collision/Models/WorldModel.h6
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.cpp2
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.h8
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h5
-rw-r--r--src/server/game/AI/CreatureAIFactory.h1
-rw-r--r--src/server/game/AI/CreatureAISelector.cpp1
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp19
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp20
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.h20
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp20
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h20
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedGossip.h19
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp6
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp59
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h4
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h20
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp2
-rw-r--r--src/server/game/Accounts/RBAC.h6
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp6
-rw-r--r--src/server/game/Chat/ChatLink.h10
-rw-r--r--src/server/game/Combat/UnitEvents.h8
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.h8
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp3
-rw-r--r--src/server/game/Entities/Object/Object.h5
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp33
-rw-r--r--src/server/game/Entities/Player/Player.cpp141
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp7
-rw-r--r--src/server/game/Entities/Transport/Transport.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp18
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp40
-rw-r--r--src/server/game/Globals/ObjectMgr.h8
-rw-r--r--src/server/game/Guilds/Guild.cpp11
-rw-r--r--src/server/game/Guilds/Guild.h5
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp7
-rw-r--r--src/server/game/Handlers/PetHandler.cpp10
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp2
-rw-r--r--src/server/game/Maps/Map.cpp2
-rw-r--r--src/server/game/Maps/TransportMgr.cpp6
-rw-r--r--src/server/game/Maps/TransportMgr.h4
-rw-r--r--src/server/game/Movement/PathGenerator.cpp2
-rw-r--r--src/server/game/Movement/Spline/MovementUtil.cpp2
-rw-r--r--src/server/game/Scripting/MapScripts.cpp4
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp74
-rw-r--r--src/server/game/Spells/SpellEffects.cpp55
-rw-r--r--src/server/game/Spells/SpellMgr.cpp4
-rw-r--r--src/server/game/World/World.cpp10
-rw-r--r--src/server/game/World/World.h6
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp39
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp54
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp386
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp305
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp166
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp126
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp142
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp452
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h134
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp124
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp3
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt5
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp1
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp115
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp95
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp136
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp107
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp270
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp344
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h51
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp1
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp2
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp17
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp47
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp17
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp25
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp202
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp285
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp392
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp167
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp558
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp855
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.h76
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp322
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp6
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp625
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp49
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp383
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h84
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp8
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp101
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp40
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp88
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp52
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp47
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp1001
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp2
-rw-r--r--src/server/scripts/Outland/CMakeLists.txt9
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp141
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp124
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp127
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp3
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h32
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp4
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp112
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h64
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp194
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp34
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp283
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp125
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp364
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp101
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp4
-rw-r--r--src/server/scripts/World/npcs_special.cpp4
-rw-r--r--src/server/shared/Cryptography/HMACSHA1.cpp1
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.cpp2
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp10
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp2
-rw-r--r--src/server/shared/Logging/Appender.h2
-rw-r--r--src/server/shared/Logging/AppenderConsole.cpp6
-rw-r--r--src/server/shared/Logging/AppenderFile.cpp7
-rw-r--r--src/server/shared/Logging/Log.cpp84
-rw-r--r--src/server/shared/Logging/Log.h55
-rw-r--r--src/server/shared/Logging/Logger.cpp16
-rw-r--r--src/server/shared/Logging/Logger.h1
-rw-r--r--src/server/worldserver/Master.cpp7
137 files changed, 6173 insertions, 5023 deletions
diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp
index 15077dc920d..6595b6238b2 100644
--- a/src/server/authserver/Server/AuthSocket.cpp
+++ b/src/server/authserver/Server/AuthSocket.cpp
@@ -663,7 +663,7 @@ bool AuthSocket::_HandleLogonProof()
stmt->setUInt32(2, GetLocaleByName(_localizationName));
stmt->setString(3, _os);
stmt->setString(4, _login);
- LoginDatabase.Execute(stmt);
+ LoginDatabase.DirectExecute(stmt);
OPENSSL_free((void*)K_hex);
diff --git a/src/server/collision/Models/WorldModel.h b/src/server/collision/Models/WorldModel.h
index 23fb1cdb7b6..309b6d8051c 100644
--- a/src/server/collision/Models/WorldModel.h
+++ b/src/server/collision/Models/WorldModel.h
@@ -36,7 +36,7 @@ namespace VMAP
class MeshTriangle
{
public:
- MeshTriangle(){ }
+ MeshTriangle() : idx0(0), idx1(0), idx2(0) { }
MeshTriangle(uint32 na, uint32 nb, uint32 nc): idx0(na), idx1(nb), idx2(nc) { }
uint32 idx0;
@@ -59,7 +59,7 @@ namespace VMAP
bool writeToFile(FILE* wf);
static bool readFromFile(FILE* rf, WmoLiquid* &liquid);
private:
- WmoLiquid(): iHeight(0), iFlags(0) { }
+ WmoLiquid(): iTilesX(0), iTilesY(0), iType(0), iHeight(0), iFlags(0) { }
uint32 iTilesX; //!< number of tiles in x direction, each
uint32 iTilesY;
G3D::Vector3 iCorner; //!< the lower corner
@@ -74,7 +74,7 @@ namespace VMAP
class GroupModel
{
public:
- GroupModel(): iLiquid(0) { }
+ GroupModel(): iMogpFlags(0), iGroupWMOID(0), iLiquid(0) { }
GroupModel(const GroupModel &other);
GroupModel(uint32 mogpFlags, uint32 groupWMOID, const G3D::AABox &bound):
iBound(bound), iMogpFlags(mogpFlags), iGroupWMOID(groupWMOID), iLiquid(0) { }
diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp
index 723f8262181..4f015e3f016 100644
--- a/src/server/game/AI/CoreAI/CombatAI.cpp
+++ b/src/server/game/AI/CoreAI/CombatAI.cpp
@@ -330,7 +330,7 @@ void VehicleAI::CheckConditions(const uint32 diff)
{
if (!conditions.empty())
{
- if( Vehicle* vehicleKit = me->GetVehicleKit())
+ if (Vehicle* vehicleKit = me->GetVehicleKit())
for (SeatMap::iterator itr = vehicleKit->Seats.begin(); itr != vehicleKit->Seats.end(); ++itr)
if (Unit* passenger = ObjectAccessor::GetUnit(*me, itr->second.Passenger.Guid))
{
diff --git a/src/server/game/AI/CoreAI/CombatAI.h b/src/server/game/AI/CoreAI/CombatAI.h
index 16167d1be59..3fac2c78962 100644
--- a/src/server/game/AI/CoreAI/CombatAI.h
+++ b/src/server/game/AI/CoreAI/CombatAI.h
@@ -72,7 +72,7 @@ struct ArcherAI : public CreatureAI
void AttackStart(Unit* who);
void UpdateAI(uint32 diff);
- static int Permissible(const Creature*);
+ static int Permissible(Creature const*);
protected:
float m_minRange;
};
@@ -81,11 +81,11 @@ struct TurretAI : public CreatureAI
{
public:
explicit TurretAI(Creature* c);
- bool CanAIAttack(const Unit* who) const;
+ bool CanAIAttack(Unit const* who) const;
void AttackStart(Unit* who);
void UpdateAI(uint32 diff);
- static int Permissible(const Creature*);
+ static int Permissible(Creature const*);
protected:
float m_minRange;
};
@@ -98,7 +98,7 @@ struct VehicleAI : public CreatureAI
explicit VehicleAI(Creature* c);
void UpdateAI(uint32 diff);
- static int Permissible(const Creature*);
+ static int Permissible(Creature const*);
void Reset();
void MoveInLineOfSight(Unit*) { }
void AttackStart(Unit*) { }
diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h
index 71fc86f112b..33a09fd03b0 100644
--- a/src/server/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
@@ -26,7 +26,6 @@
class Player;
class Quest;
-class Unit;
struct AISpellInfoType;
//Selection method used by SelectTarget
@@ -142,9 +141,9 @@ class UnitAI
virtual uint64 GetGUID(int32 /*id*/ = 0) const { return 0; }
Unit* SelectTarget(SelectAggroTarget targetType, uint32 position = 0, float dist = 0.0f, bool playerOnly = false, int32 aura = 0);
- // Select the targets satifying the predicate.
+ // Select the targets satisfying the predicate.
// predicate shall extend std::unary_function<Unit*, bool>
- template <class PREDICATE> Unit* SelectTarget(SelectAggroTarget targetType, uint32 position, PREDICATE const& predicate)
+ template<class PREDICATE> Unit* SelectTarget(SelectAggroTarget targetType, uint32 position, PREDICATE const& predicate)
{
ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList();
if (position >= threatlist.size())
diff --git a/src/server/game/AI/CreatureAIFactory.h b/src/server/game/AI/CreatureAIFactory.h
index 30576cf28bd..809c17cadb8 100644
--- a/src/server/game/AI/CreatureAIFactory.h
+++ b/src/server/game/AI/CreatureAIFactory.h
@@ -15,6 +15,7 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
#ifndef TRINITY_CREATUREAIFACTORY_H
#define TRINITY_CREATUREAIFACTORY_H
diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp
index ec2d3687f5f..597ad24d4e1 100644
--- a/src/server/game/AI/CreatureAISelector.cpp
+++ b/src/server/game/AI/CreatureAISelector.cpp
@@ -147,4 +147,3 @@ namespace FactorySelector
return (ai_factory == NULL ? new NullGameObjectAI(go) : ai_factory->Create(go));
}
}
-
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 9fa7ea2f870..c70fc45be33 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -1,9 +1,20 @@
-/* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
- * Thanks to the original authors: ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
*
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#include "ScriptedCreature.h"
#include "Item.h"
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index ca4b06742ef..dbc8989c530 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -1,6 +1,20 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
/* ScriptData
SDName: Npc_EscortAI
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
index 4b0f4e97a1c..280990fd648 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
@@ -1,6 +1,20 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#ifndef SC_ESCORTAI_H
#define SC_ESCORTAI_H
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
index 41b6c962471..5cc128fda5f 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
@@ -1,6 +1,20 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
/* ScriptData
SDName: FollowerAI
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
index cdd6d31c0b4..c1fa3275bb8 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
@@ -1,6 +1,20 @@
-/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#ifndef SC_FOLLOWERAI_H
#define SC_FOLLOWERAI_H
diff --git a/src/server/game/AI/ScriptedAI/ScriptedGossip.h b/src/server/game/AI/ScriptedAI/ScriptedGossip.h
index 93add2ae652..5e76c1f83f4 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedGossip.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.h
@@ -1,9 +1,20 @@
-/* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
- * Thanks to the original authors: ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
*
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#ifndef SC_GOSSIP_H
#define SC_GOSSIP_H
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index ae3f7078f5c..c367ba0a5ed 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -460,7 +460,6 @@ void SmartAI::EnterEvadeMode()
me->LoadCreaturesAddon();
me->SetLootRecipient(NULL);
me->ResetPlayerDamageReq();
-
GetScript()->ProcessEventsFor(SMART_EVENT_EVADE);//must be after aura clear so we can cast spells from db
SetRun(mRun);
@@ -588,6 +587,9 @@ int SmartAI::Permissible(const Creature* creature)
void SmartAI::JustReachedHome()
{
GetScript()->ProcessEventsFor(SMART_EVENT_REACHED_HOME);
+
+ if (!UpdateVictim() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE && me->GetWaypointPath())
+ me->ToCreature()->GetMotionMaster()->MovePath(me->GetWaypointPath(), true);
}
void SmartAI::EnterCombat(Unit* enemy)
@@ -787,6 +789,8 @@ void SmartAI::SetCombatMove(bool on)
}
else
{
+ me->GetMotionMaster()->MovementExpired();
+ me->GetMotionMaster()->Clear(true);
me->StopMoving();
me->GetMotionMaster()->MoveIdle();
}
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index ae6719aa8f3..92637b17f25 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -56,7 +56,7 @@ class SmartAI : public CreatureAI
void EndPath(bool fail = false);
void ResumePath();
WayPoint* GetNextWayPoint();
- bool HasEscortState(uint32 uiEscortState) { return (mEscortState & uiEscortState); }
+ bool HasEscortState(uint32 uiEscortState) const { return (mEscortState & uiEscortState) != 0; }
void AddEscortState(uint32 uiEscortState) { mEscortState |= uiEscortState; }
void RemoveEscortState(uint32 uiEscortState) { mEscortState &= ~uiEscortState; }
void SetAutoAttack(bool on) { mCanAutoAttack = on; }
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 0cb68e2fd05..e98c196d6e3 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -168,12 +168,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (IsCreature((*itr)) && !(*itr)->ToCreature()->IsPet()) // Prevented sending text to pets.
+ if (IsCreature(*itr) && !(*itr)->ToCreature()->IsPet()) // Prevented sending text to pets.
{
talker = (*itr)->ToCreature();
break;
}
- else if (IsPlayer((*itr)))
+ else if (IsPlayer(*itr))
{
targetPlayer = (*itr)->ToPlayer();
break;
@@ -516,7 +516,26 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
me->InterruptNonMeleeSpells(false);
+ if (e.action.cast.flags & SMARTCAST_COMBAT_MOVE)
+ {
+ // If cast flag SMARTCAST_COMBAT_MOVE is set combat movement will not be allowed
+ // unless target is outside spell range, out of mana, or LOS.
+
+ bool _allowMove = false;
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(e.action.cast.spell);
+ int32 mana = me->GetPower(POWER_MANA);
+
+ if (me->GetDistance((*itr)->ToUnit()) > spellInfo->GetMaxRange(true) ||
+ me->GetDistance((*itr)->ToUnit()) < spellInfo->GetMinRange(true) ||
+ !me->ToUnit()->IsWithinLOSInMap((*itr)->ToUnit()) ||
+ mana < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()))
+ _allowMove = true;
+
+ CAST_AI(SmartAI, me->AI())->SetCombatMove(_allowMove);
+ }
+
me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED));
+
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_CAST:: Creature %u casts spell %u on target %u with castflags %u",
me->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
}
@@ -542,17 +561,17 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!IsUnit(*itr))
continue;
- if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell))
- {
- if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
- tempLastInvoker->InterruptNonMeleeSpells(false);
+ if (!(e.action.cast.flags & SMARTCAST_AURA_NOT_PRESENT) || !(*itr)->ToUnit()->HasAura(e.action.cast.spell))
+ {
+ if (e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
+ tempLastInvoker->InterruptNonMeleeSpells(false);
- tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED));
- TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell %u on target %u with castflags %u",
- tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
- }
- else
- TC_LOG_DEBUG("scripts.ai", "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId()));
+ tempLastInvoker->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED));
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker %u casts spell %u on target %u with castflags %u",
+ tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags);
+ }
+ else
+ TC_LOG_DEBUG("scripts.ai", "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId()));
}
delete targets;
@@ -784,13 +803,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (!IsUnit((*itr)))
+ if (!IsUnit(*itr))
continue;
- if (e.action.removeAura.spell == 0)
- (*itr)->ToUnit()->RemoveAllAuras();
- else
+ if (e.action.removeAura.spell)
(*itr)->ToUnit()->RemoveAurasDueToSpell(e.action.removeAura.spell);
+ else
+ (*itr)->ToUnit()->RemoveAllAuras();
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_REMOVEAURASFROMSPELL: Unit %u, spell %u",
(*itr)->GetGUIDLow(), e.action.removeAura.spell);
@@ -810,7 +829,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (IsUnit((*itr)))
+ if (IsUnit(*itr))
{
CAST_AI(SmartAI, me->AI())->SetFollow((*itr)->ToUnit(), (float)e.action.follow.dist, (float)e.action.follow.angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_FOLLOW: Creature %u following target %u",
@@ -1673,6 +1692,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!IsUnit(*itr))
continue;
+ Unit* unit = (*itr)->ToUnit();
+
bool interruptedSpell = false;
for (ObjectList::const_iterator it = targets->begin(); it != targets->end(); ++it)
@@ -1684,11 +1705,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (!interruptedSpell && e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)
{
- (*itr)->ToUnit()->InterruptNonMeleeSpells(false);
+ unit->InterruptNonMeleeSpells(false);
interruptedSpell = true;
}
- (*itr)->ToUnit()->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED));
+ unit->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED));
}
else
TC_LOG_DEBUG("scripts.ai", "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId()));
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index e320e122d0f..f9eff2ec96e 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -244,7 +244,7 @@ class SmartScript
SMARTAI_TEMPLATE mTemplate;
void InstallEvents();
- void RemoveStoredEvent (uint32 id)
+ void RemoveStoredEvent(uint32 id)
{
if (!mStoredEvents.empty())
{
@@ -258,7 +258,7 @@ class SmartScript
}
}
}
- SmartScriptHolder FindLinkedEvent (uint32 link)
+ SmartScriptHolder FindLinkedEvent(uint32 link)
{
if (!mEvents.empty())
{
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 27adb44f452..74d2d5c49a1 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -441,7 +441,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_EVENT_VICTIM_CASTING:
if (e.event.targetCasting.spellId > 0 && !sSpellMgr->GetSpellInfo(e.event.targetCasting.spellId))
{
- sLog->outError("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Spell entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell);
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Spell entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell);
return false;
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 07e700ddb46..093f71ad1bd 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -736,7 +736,7 @@ struct SmartAction
} summonGO;
struct
- {
+ {
uint32 state;
} active;
@@ -1281,10 +1281,11 @@ enum SmartCastFlags
{
SMARTCAST_INTERRUPT_PREVIOUS = 0x01, //Interrupt any spell casting
SMARTCAST_TRIGGERED = 0x02, //Triggered (this makes spell cost zero mana and have no cast time)
- //CAST_FORCE_CAST = 0x04, //Forces cast even if creature is out of mana or out of range
- //CAST_NO_MELEE_IF_OOM = 0x08, //Prevents creature from entering melee if out of mana or out of range
- //CAST_FORCE_TARGET_SELF = 0x10, //Forces the target to cast this spell on itself
- SMARTCAST_AURA_NOT_PRESENT = 0x20 //Only casts the spell if the target does not have an aura from the spell
+ //SMARTCAST_FORCE_CAST = 0x04, //Forces cast even if creature is out of mana or out of range
+ //SMARTCAST_NO_MELEE_IF_OOM = 0x08, //Prevents creature from entering melee if out of mana or out of range
+ //SMARTCAST_FORCE_TARGET_SELF = 0x10, //Forces the target to cast this spell on itself
+ SMARTCAST_AURA_NOT_PRESENT = 0x20, //Only casts the spell if the target does not have an aura from the spell
+ SMARTCAST_COMBAT_MOVE = 0x40 //Prevents combat movement if cast successful. Allows movement on range, OOM, LOS
};
// one line in DB is one event
@@ -1303,11 +1304,10 @@ struct SmartScriptHolder
SmartAction action;
SmartTarget target;
- public:
- uint32 GetScriptType() const { return (uint32)source_type; }
- uint32 GetEventType() const { return (uint32)event.type; }
- uint32 GetActionType() const { return (uint32)action.type; }
- uint32 GetTargetType() const { return (uint32)target.type; }
+ uint32 GetScriptType() const { return (uint32)source_type; }
+ uint32 GetEventType() const { return (uint32)event.type; }
+ uint32 GetActionType() const { return (uint32)action.type; }
+ uint32 GetTargetType() const { return (uint32)target.type; }
uint32 timer;
bool active;
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index b80df5018e4..4c71a044488 100644
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -459,7 +459,7 @@ void AccountMgr::LoadRBAC()
{
Field* field = result->Fetch();
uint32 newId = field[0].GetUInt32();
- if (secId != newId)
+ if (secId != newId || permissions == NULL)
{
secId = newId;
permissions = &_defaultPermissions[secId];
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 1f55ebd4996..bdc1d39713f 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -517,7 +517,7 @@ enum RBACPermissions
RBAC_PERM_COMMAND_RELOAD_ALL = 611,
RBAC_PERM_COMMAND_RELOAD_ALL_ACHIEVEMENT = 612,
RBAC_PERM_COMMAND_RELOAD_ALL_AREA = 613,
- RBAC_PERM_COMMAND_RELOAD_ALL_EVENTAI = 614,
+ RBAC_PERM_UNUSED_614 = 614, // unused
RBAC_PERM_COMMAND_RELOAD_ALL_GOSSIP = 615,
RBAC_PERM_COMMAND_RELOAD_ALL_ITEM = 616,
RBAC_PERM_COMMAND_RELOAD_ALL_LOCALES = 617,
@@ -534,8 +534,8 @@ enum RBACPermissions
RBAC_PERM_COMMAND_RELOAD_COMMAND = 628,
RBAC_PERM_COMMAND_RELOAD_CONDITIONS = 629,
RBAC_PERM_COMMAND_RELOAD_CONFIG = 630,
- RBAC_PERM_COMMAND_RELOAD_CREATURE_AI_SCRIPTS = 631,
- RBAC_PERM_COMMAND_RELOAD_CREATURE_AI_TEXTS = 632,
+ RBAC_PERM_UNUSED_631 = 631, // unused
+ RBAC_PERM_UNUSED_632 = 632, // unused
RBAC_PERM_COMMAND_RELOAD_CREATURE_LINKED_RESPAWN = 633,
RBAC_PERM_COMMAND_RELOAD_CREATURE_LOOT_TEMPLATE = 634,
RBAC_PERM_COMMAND_RELOAD_CREATURE_ONKILL_REPUTATION = 635,
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index c4e8ba49ba9..aa3568a62d5 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -558,8 +558,12 @@ void BattlegroundIC::UpdateNodeWorldState(ICNodePoint* nodePoint)
uint32 worldstate = nodePoint->worldStates[nodePoint->nodeState];
// with this we are sure we dont bug the client
- for (uint8 i = 0; i < 4; ++i)
+ for (uint8 i = 0; i < 5; ++i)
+ {
+ if (nodePoint->worldStates[i] == worldstate)
+ continue;
UpdateWorldState(nodePoint->worldStates[i], 0);
+ }
UpdateWorldState(worldstate, 1);
}
diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h
index 76ce4662d6f..29704396b88 100644
--- a/src/server/game/Chat/ChatLink.h
+++ b/src/server/game/Chat/ChatLink.h
@@ -56,7 +56,10 @@ protected:
class ItemChatLink : public ChatLink
{
public:
- ItemChatLink() : ChatLink(), _item(NULL), _suffix(NULL), _property(NULL) { }
+ ItemChatLink() : ChatLink(), _item(NULL), _suffix(NULL), _property(NULL)
+ {
+ memset(_data, 0, sizeof(_data));
+ }
virtual bool Initialize(std::istringstream& iss);
virtual bool ValidateName(char* buffer, const char* context);
@@ -98,7 +101,10 @@ protected:
class AchievementChatLink : public ChatLink
{
public:
- AchievementChatLink() : ChatLink(), _guid(0), _achievement(NULL) { }
+ AchievementChatLink() : ChatLink(), _guid(0), _achievement(NULL)
+ {
+ memset(_data, 0, sizeof(_data));
+ }
virtual bool Initialize(std::istringstream& iss);
virtual bool ValidateName(char* buffer, const char* context);
diff --git a/src/server/game/Combat/UnitEvents.h b/src/server/game/Combat/UnitEvents.h
index 0e568d139a8..8bb7d95a384 100644
--- a/src/server/game/Combat/UnitEvents.h
+++ b/src/server/game/Combat/UnitEvents.h
@@ -93,13 +93,13 @@ class ThreatRefStatusChangeEvent : public UnitBaseEvent
};
ThreatManager* iThreatManager;
public:
- ThreatRefStatusChangeEvent(uint32 pType) : UnitBaseEvent(pType) { iHostileReference = NULL; }
+ ThreatRefStatusChangeEvent(uint32 pType) : UnitBaseEvent(pType), iThreatManager(NULL) { iHostileReference = NULL; }
- ThreatRefStatusChangeEvent(uint32 pType, HostileReference* pHostileReference) : UnitBaseEvent(pType) { iHostileReference = pHostileReference; }
+ ThreatRefStatusChangeEvent(uint32 pType, HostileReference* pHostileReference) : UnitBaseEvent(pType), iThreatManager(NULL) { iHostileReference = pHostileReference; }
- ThreatRefStatusChangeEvent(uint32 pType, HostileReference* pHostileReference, float pValue) : UnitBaseEvent(pType) { iHostileReference = pHostileReference; iFValue = pValue; }
+ ThreatRefStatusChangeEvent(uint32 pType, HostileReference* pHostileReference, float pValue) : UnitBaseEvent(pType), iThreatManager(NULL) { iHostileReference = pHostileReference; iFValue = pValue; }
- ThreatRefStatusChangeEvent(uint32 pType, HostileReference* pHostileReference, bool pValue) : UnitBaseEvent(pType) { iHostileReference = pHostileReference; iBValue = pValue; }
+ ThreatRefStatusChangeEvent(uint32 pType, HostileReference* pHostileReference, bool pValue) : UnitBaseEvent(pType), iThreatManager(NULL) { iHostileReference = pHostileReference; iBValue = pValue; }
int32 getIValue() const { return iIValue; }
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 0d1a427d223..08e6412e2c2 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -64,7 +64,7 @@ bool AreaTrigger::CreateAreaTrigger(uint32 guidlow, uint32 triggerEntry, Unit* c
Relocate(pos);
if (!IsPositionValid())
{
- sLog->outError("misc", "AreaTrigger (spell %u) not created. Invalid coordinates (X: %f Y: %f)", spell->Id, GetPositionX(), GetPositionY());
+ TC_LOG_ERROR("misc", "AreaTrigger (spell %u) not created. Invalid coordinates (X: %f Y: %f)", spell->Id, GetPositionX(), GetPositionY());
return false;
}
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index a40d0646121..23ff89f383a 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -630,15 +630,15 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) { m_transportHomePosition.GetPosition(x, y, z, ori); }
Position GetTransportHomePosition() { return m_transportHomePosition; }
- uint32 GetWaypointPath(){return m_path_id;}
+ uint32 GetWaypointPath() const { return m_path_id; }
void LoadPath(uint32 pathid) { m_path_id = pathid; }
uint32 GetCurrentWaypointID() const { return m_waypointID; }
void UpdateWaypointID(uint32 wpID) { m_waypointID = wpID; }
void SearchFormation();
- CreatureGroup* GetFormation() {return m_formation;}
- void SetFormation(CreatureGroup* formation) {m_formation = formation;}
+ CreatureGroup* GetFormation() { return m_formation; }
+ void SetFormation(CreatureGroup* formation) { m_formation = formation; }
Unit* SelectVictim();
@@ -710,10 +710,10 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
CreatureData const* m_creatureData;
uint16 m_LootMode; // Bitmask (default: LOOT_MODE_DEFAULT) that determines what loot will be lootable
- uint32 guid_transport;
bool IsInvisibleDueToDespawn() const;
bool CanAlwaysSee(WorldObject const* obj) const;
+
private:
void ForcedDespawn(uint32 timeMSToDespawn = 0);
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 3c939b2a1f3..97287aabe3c 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -64,6 +64,7 @@ GameObject::GameObject() : WorldObject(false), MapObject(),
lootingGroupLowGUID = 0;
ResetLootMode(); // restore default loot mode
+ m_stationaryPosition.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
}
GameObject::~GameObject()
@@ -341,7 +342,7 @@ void GameObject::Update(uint32 diff)
G3D::Vector3 src(GetPositionX(), GetPositionY(), GetPositionZ());
- sLog->outInfo("misc", "Src: %s Dest: %s", src.toString().c_str(), pos.toString().c_str());
+ TC_LOG_INFO("misc", "Src: %s Dest: %s", src.toString().c_str(), pos.toString().c_str());
GetMap()->GameObjectRelocation(this, pos.x, pos.y, pos.z, GetOrientation());
}
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 9da5e1e034c..6254989d8ce 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -610,7 +610,10 @@ class MapObject
friend class ObjectGridLoader; //grid loader for loading creatures
protected:
- MapObject() : _moveState(MAP_OBJECT_CELL_MOVE_NONE) { }
+ MapObject() : _moveState(MAP_OBJECT_CELL_MOVE_NONE)
+ {
+ _newPosition.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
+ }
private:
Cell _currentCell;
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 2106cab78fb..5f48649db17 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -179,17 +179,6 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c
if (!Create(guid, map, owner->GetPhaseMask(), petEntry, petId))
return false;
- float px, py, pz;
- owner->GetClosePoint(px, py, pz, GetObjectSize(), PET_FOLLOW_DIST, GetFollowAngle());
- Relocate(px, py, pz, owner->GetOrientation());
-
- if (!IsPositionValid())
- {
- TC_LOG_ERROR("entities.pet", "Pet (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",
- GetGUIDLow(), GetEntry(), GetPositionX(), GetPositionY());
- return false;
- }
-
setPetType(petType);
setFaction(owner->getFaction());
SetUInt32Value(UNIT_CREATED_BY_SPELL, summonSpellId);
@@ -197,6 +186,17 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c
CreatureTemplate const* cinfo = GetCreatureTemplate();
if (cinfo->type == CREATURE_TYPE_CRITTER)
{
+ float px, py, pz;
+ owner->GetClosePoint(px, py, pz, GetObjectSize(), PET_FOLLOW_DIST, GetFollowAngle());
+ Relocate(px, py, pz, owner->GetOrientation());
+
+ if (!IsPositionValid())
+ {
+ TC_LOG_ERROR("entities.pet", "Pet (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",
+ GetGUIDLow(), GetEntry(), GetPositionX(), GetPositionY());
+ return false;
+ }
+
map->AddToMap(this->ToCreature());
return true;
}
@@ -241,6 +241,17 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c
SynchronizeLevelWithOwner();
+ // Set pet's position after setting level, its size depends on it
+ float px, py, pz;
+ owner->GetClosePoint(px, py, pz, GetObjectSize(), PET_FOLLOW_DIST, GetFollowAngle());
+ Relocate(px, py, pz, owner->GetOrientation());
+ if (!IsPositionValid())
+ {
+ TC_LOG_ERROR("entities.pet", "Pet (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",
+ GetGUIDLow(), GetEntry(), GetPositionX(), GetPositionY());
+ return false;
+ }
+
SetReactState(ReactStates(fields[6].GetUInt8()));
SetCanModifyStats(true);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 09121846096..d0d287237d5 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2209,6 +2209,8 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
{
Position oldPos;
GetPosition(&oldPos);
+ if (HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
+ z += GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
Relocate(x, y, z, orientation);
SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
}
@@ -9820,6 +9822,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW
}
break;
+ // The Oculus
+ case 4228:
+ if (instance && mapid == 578)
+ instance->FillInitialWorldStates(data);
+ else
+ {
+ data << uint32(3524) << uint32(0); // 9 WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW
+ data << uint32(3486) << uint32(0); // 10 WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT
+ }
+ break;
// Ulduar
case 4273:
if (instance && mapid == 603)
@@ -9868,6 +9880,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
bf->FillInitialWorldStates(data);
break;
}
+ // Halls of Refection
case 4820:
if (instance && mapid == 668)
instance->FillInitialWorldStates(data);
@@ -9877,7 +9890,6 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
}
break;
-
// No break here, intended.
default:
data << uint32(0x914) << uint32(0x0); // 7
@@ -15389,9 +15401,27 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
// cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
if (quest->GetRewSpellCast() > 0)
- CastSpell(this, quest->GetRewSpellCast(), true);
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
+ if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
+ {
+ if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
+ creature->CastSpell(this, quest->GetRewSpellCast(), true);
+ }
+ else
+ CastSpell(this, quest->GetRewSpellCast(), true);
+ }
else if (quest->GetRewSpell() > 0)
- CastSpell(this, quest->GetRewSpell(), true);
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
+ if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
+ {
+ if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
+ creature->CastSpell(this, quest->GetRewSpell(), true);
+ }
+ else
+ CastSpell(this, quest->GetRewSpell(), true);
+ }
if (quest->GetZoneOrSort() > 0)
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, quest->GetZoneOrSort());
@@ -17137,8 +17167,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
InitPrimaryProfessions(); // to max set before any spell loaded
// init saved position, and fix it later if problematic
- uint32 transGUID = uint32(fields[31].GetUInt32());
-
+ uint32 transLowGUID = uint32(fields[31].GetUInt32());
+
Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat());
uint32 mapId = fields[15].GetUInt16();
@@ -17241,41 +17271,49 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
}
}
// currently we do not support transport in bg
- else if (transGUID)
+ else if (transLowGUID)
{
- m_movementInfo.transport.guid = MAKE_NEW_GUID(transGUID, 0, HIGHGUID_MO_TRANSPORT);
- m_movementInfo.transport.pos.Relocate(fields[27].GetFloat(), fields[28].GetFloat(), fields[29].GetFloat(), fields[30].GetFloat());
+ uint64 transGUID = MAKE_NEW_GUID(transLowGUID, 0, HIGHGUID_MO_TRANSPORT);
- if (!Trinity::IsValidMapCoord(
- GetPositionX()+m_movementInfo.transport.pos.GetPositionX(), GetPositionY()+m_movementInfo.transport.pos.GetPositionY(),
- GetPositionZ()+m_movementInfo.transport.pos.GetPositionZ(), GetOrientation()+m_movementInfo.transport.pos.GetOrientation()) ||
- // transport size limited
- m_movementInfo.transport.pos.m_positionX > 250 || m_movementInfo.transport.pos.m_positionY > 250 || m_movementInfo.transport.pos.m_positionZ > 250)
- {
- TC_LOG_ERROR("entities.player", "Player (guidlow %d) have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.",
- guid, GetPositionX()+m_movementInfo.transport.pos.GetPositionX(), GetPositionY()+m_movementInfo.transport.pos.GetPositionY(),
- GetPositionZ()+m_movementInfo.transport.pos.GetPositionZ(), GetOrientation()+m_movementInfo.transport.pos.GetOrientation());
+ if (GameObject* go = HashMapHolder<GameObject>::Find(transGUID))
+ m_transport = go->ToTransport();
- RelocateToHomebind();
- }
- else
+ if (m_transport)
{
- if (GameObject* go = HashMapHolder<GameObject>::Find(m_movementInfo.transport.guid))
- m_transport = go->ToTransport();
+ m_movementInfo.transport.guid = transGUID;
+ float x = fields[27].GetFloat(), y = fields[28].GetFloat(), z = fields[29].GetFloat(), o = fields[30].GetFloat();
+ m_movementInfo.transport.pos.Relocate(x, y, z, o);
+ m_transport->CalculatePassengerPosition(x, y, z, &o);
- if (m_transport)
+ if (!Trinity::IsValidMapCoord(x, y, z, o) ||
+ // transport size limited
+ std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 250.0f ||
+ std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 250.0f ||
+ std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 250.0f)
{
- m_transport->AddPassenger(this);
- mapId = m_transport->GetMapId();
+ TC_LOG_ERROR("entities.player", "Player (guidlow %d) have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.",
+ guid, x, y, z, o);
+
+ m_transport = NULL;
+ m_movementInfo.transport.Reset();
+
+ RelocateToHomebind();
}
else
{
- TC_LOG_ERROR("entities.player", "Player (guidlow %d) have problems with transport guid (%u). Teleport to bind location.",
- guid, transGUID);
+ Relocate(x, y, z, o);
+ mapId = m_transport->GetMapId();
- RelocateToHomebind();
+ m_transport->AddPassenger(this);
}
}
+ else
+ {
+ TC_LOG_ERROR("entities.player", "Player (guidlow %d) have problems with transport guid (%u). Teleport to bind location.",
+ guid, transLowGUID);
+
+ RelocateToHomebind();
+ }
}
// currently we do not support taxi in instance
else if (!taxi_nodes.empty())
@@ -19159,6 +19197,14 @@ void Player::SaveToDB(bool create /*=false*/)
stmt->setFloat(index++, finiteAlways(GetPositionY()));
stmt->setFloat(index++, finiteAlways(GetPositionZ()));
stmt->setFloat(index++, finiteAlways(GetOrientation()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetX()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetY()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetZ()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetO()));
+ uint32 transLowGUID = 0;
+ if (GetTransport())
+ transLowGUID = GetTransport()->GetGUIDLow();
+ stmt->setUInt32(index++, transLowGUID);
std::ostringstream ss;
ss << m_taxi;
@@ -19280,6 +19326,15 @@ void Player::SaveToDB(bool create /*=false*/)
stmt->setFloat(index++, finiteAlways(GetTeleportDest().GetOrientation()));
}
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetX()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetY()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetZ()));
+ stmt->setFloat(index++, finiteAlways(GetTransOffsetO()));
+ uint32 transLowGUID = 0;
+ if (GetTransport())
+ transLowGUID = GetTransport()->GetGUIDLow();
+ stmt->setUInt32(index++, transLowGUID);
+
std::ostringstream ss;
ss << m_taxi;
stmt->setString(index++, ss.str());
@@ -20165,7 +20220,7 @@ void Player::UpdateSpeakTime()
}
}
else
- m_speakCount = 0;
+ m_speakCount = 1;
m_speakTime = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY);
}
@@ -21001,13 +21056,15 @@ void Player::RestoreSpellMods(Spell* spell, uint32 ownerAuraId, Aura* aura)
if (!spell || spell->m_appliedMods.empty())
return;
+ std::list<Aura*> aurasQueue;
+
for (uint8 i=0; i<MAX_SPELLMOD; ++i)
{
for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
{
SpellModifier* mod = *itr;
- // spellmods without aura set cannot be charged
+ // Spellmods without aura set cannot be charged
if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
continue;
@@ -21018,17 +21075,20 @@ void Player::RestoreSpellMods(Spell* spell, uint32 ownerAuraId, Aura* aura)
if (aura && mod->ownerAura != aura)
continue;
- // check if mod affected this spell
- // first, check if the mod aura applied at least one spellmod to this spell
+ // Check if mod affected this spell
+ // First, check if the mod aura applied at least one spellmod to this spell
Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
if (iterMod == spell->m_appliedMods.end())
continue;
- // secondly, check if the current mod is one of the spellmods applied by the mod aura
+ // Second, check if the current mod is one of those applied by the mod aura
if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
continue;
- // remove from list
- spell->m_appliedMods.erase(iterMod);
+ // remove from list - This will be done after all mods have been gone through
+ // to ensure we iterate over all mods of an aura before removing said aura
+ // from applied mods (Else, an aura with two mods on the current spell would
+ // only see the first of its modifier restored)
+ aurasQueue.push_back(mod->ownerAura);
// add mod charges back to mod
if (mod->charges == -1)
@@ -21036,15 +21096,22 @@ void Player::RestoreSpellMods(Spell* spell, uint32 ownerAuraId, Aura* aura)
else
mod->charges++;
- // Do not set more spellmods than avalible
+ // Do not set more spellmods than available
if (mod->ownerAura->GetCharges() < mod->charges)
mod->charges = mod->ownerAura->GetCharges();
// Skip this check for now - aura charges may change due to various reason
- /// @todo trac these changes correctly
+ /// @todo track these changes correctly
//ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
}
}
+
+ for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
+ {
+ Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
+ if (iterMod != spell->m_appliedMods.end())
+ spell->m_appliedMods.erase(iterMod);
+ }
}
void Player::RestoreAllSpellMods(uint32 ownerAuraId, Aura* aura)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 62d7f1fc5a4..a96c6fd281d 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -388,7 +388,7 @@ typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions;
struct PlayerInfo
{
// existence checked by displayId != 0
- PlayerInfo() : displayId_m(0), displayId_f(0), levelInfo(NULL) { }
+ PlayerInfo() : mapId(0), areaId(0), positionX(0.0f), positionY(0.0f), positionZ(0.0f), orientation(0.0f), displayId_m(0), displayId_f(0), levelInfo(NULL) { }
uint32 mapId;
uint32 areaId;
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index e3b4bbc5b56..9026f4c0e46 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -33,7 +33,8 @@
#include "CellImpl.h"
Transport::Transport() : GameObject(),
- _transportInfo(NULL), _isMoving(true), _pendingStop(false)
+ _transportInfo(NULL), _isMoving(true), _pendingStop(false),
+ _triggeredArrivalEvent(false), _triggeredDepartureEvent(false)
{
m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION;
}
@@ -529,7 +530,9 @@ void Transport::UpdatePassengerPositions(std::set<WorldObject*>& passengers)
break;
}
case TYPEID_PLAYER:
- GetMap()->PlayerRelocation(passenger->ToPlayer(), x, y, z, o);
+ //relocate only passengers in world and skip any player that might be still logging in/teleporting
+ if (passenger->IsInWorld())
+ GetMap()->PlayerRelocation(passenger->ToPlayer(), x, y, z, o);
break;
case TYPEID_GAMEOBJECT:
GetMap()->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false);
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index 0145ec608ae..e290a5d5e00 100644
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -90,7 +90,6 @@ class Transport : public GameObject, public TransportBase
KeyFrameVec::const_iterator _currentFrame;
KeyFrameVec::const_iterator _nextFrame;
- uint32 _moveTimer;
TimeTrackerSmall _positionChangeTimer;
bool _isMoving;
bool _pendingStop;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 84ab938a443..849c1c9af49 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -240,8 +240,6 @@ Unit::Unit(bool isWorldObject) :
for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
m_threatModifier[i] = 1.0f;
- m_isSorted = true;
-
for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
m_speed_rate[i] = 1.0f;
@@ -11889,9 +11887,19 @@ void CharmInfo::InitEmptyActionBar(bool withAttack)
void CharmInfo::InitPossessCreateSpells()
{
- InitEmptyActionBar();
if (_unit->GetTypeId() == TYPEID_UNIT)
{
+ // Adding switch until better way is found. Malcrom
+ // Adding entrys to this switch will prevent COMMAND_ATTACK being added to pet bar.
+ switch (_unit->GetEntry())
+ {
+ case 23575: // Mindless Abomination
+ break;
+ default:
+ InitEmptyActionBar();
+ break;
+ }
+
for (uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i)
{
uint32 spellId = _unit->ToCreature()->m_spells[i];
@@ -11905,6 +11913,8 @@ void CharmInfo::InitPossessCreateSpells()
}
}
}
+ else
+ InitEmptyActionBar();
}
void CharmInfo::InitCharmCreateSpells()
@@ -12700,6 +12710,8 @@ void Unit::StopMoving()
if (!IsInWorld() || movespline->Finalized())
return;
+ // Update position now since Stop does not start a new movement that can be updated later
+ UpdateSplinePosition();
Movement::MoveSplineInit init(this);
init.Stop();
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 9ba93c38569..cb228bd135d 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2168,7 +2168,7 @@ class Unit : public WorldObject
typedef std::list<GameObject*> GameObjectList;
GameObjectList m_gameObj;
- bool m_isSorted;
+
uint32 m_transform;
Spell* m_currentSpells[CURRENT_MAX_SPELL];
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index e7bc1d75bfb..e6303a5d5b6 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -102,7 +102,7 @@ void Vehicle::Install()
if (!spellInfo)
continue;
- if (spellInfo->PowerType == POWER_ENERGY)
+ if (spellInfo->PowerType == POWER_ENERGY && spellInfo->CalcPowerCost(_me, spellInfo->GetSchoolMask()) > 0)
{
_me->setPowerType(POWER_ENERGY);
_me->SetMaxPower(POWER_ENERGY, 100);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index f1bbb1d6839..9987019d75d 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -240,7 +240,8 @@ ObjectMgr::ObjectMgr():
_hiDoGuid(1),
_hiCorpseGuid(1),
_hiAreaTriggerGuid(1),
- _hiMoTransGuid(1)
+ _hiMoTransGuid(1),
+ DBCLocaleIndex(LOCALE_enUS)
{
for (uint8 i = 0; i < MAX_CLASSES; ++i)
for (uint8 j = 0; j < MAX_RACES; ++j)
@@ -1266,7 +1267,7 @@ void ObjectMgr::LoadLinkedRespawn()
const CreatureData* slave = GetCreatureData(guidLow);
if (!slave)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get creature data for GUIDLow %u", guidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) '%u' not found in creature table", guidLow);
error = true;
break;
}
@@ -1274,7 +1275,7 @@ void ObjectMgr::LoadLinkedRespawn()
const CreatureData* master = GetCreatureData(linkedGuidLow);
if (!master)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get creature data for GUIDLow %u", linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) '%u' not found in creature table", linkedGuidLow);
error = true;
break;
}
@@ -1282,14 +1283,14 @@ void ObjectMgr::LoadLinkedRespawn()
const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
- TC_LOG_ERROR("sql.sql", "Creature '%u' linking to '%u' on an unpermitted map.", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to Creature '%u' on an unpermitted map.", guidLow, linkedGuidLow);
error = true;
break;
}
if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
{
- TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to Creature '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
error = true;
break;
}
@@ -1303,7 +1304,7 @@ void ObjectMgr::LoadLinkedRespawn()
const CreatureData* slave = GetCreatureData(guidLow);
if (!slave)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get creature data for GUIDLow %u", guidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) '%u' not found in creature table", guidLow);
error = true;
break;
}
@@ -1311,7 +1312,7 @@ void ObjectMgr::LoadLinkedRespawn()
const GameObjectData* master = GetGOData(linkedGuidLow);
if (!master)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get gameobject data for GUIDLow %u", linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) '%u' not found in gameobject table", linkedGuidLow);
error = true;
break;
}
@@ -1319,14 +1320,14 @@ void ObjectMgr::LoadLinkedRespawn()
const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
- TC_LOG_ERROR("sql.sql", "Creature '%u' linking to '%u' on an unpermitted map.", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to Gameobject '%u' on an unpermitted map.", guidLow, linkedGuidLow);
error = true;
break;
}
if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
{
- TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to Gameobject '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
error = true;
break;
}
@@ -1340,7 +1341,7 @@ void ObjectMgr::LoadLinkedRespawn()
const GameObjectData* slave = GetGOData(guidLow);
if (!slave)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get gameobject data for GUIDLow %u", guidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) '%u' not found in gameobject table", guidLow);
error = true;
break;
}
@@ -1348,7 +1349,7 @@ void ObjectMgr::LoadLinkedRespawn()
const GameObjectData* master = GetGOData(linkedGuidLow);
if (!master)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get gameobject data for GUIDLow %u", linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) '%u' not found in gameobject table", linkedGuidLow);
error = true;
break;
}
@@ -1356,14 +1357,14 @@ void ObjectMgr::LoadLinkedRespawn()
const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
- TC_LOG_ERROR("sql.sql", "Creature '%u' linking to '%u' on an unpermitted map.", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '%u' linking to Gameobject '%u' on an unpermitted map.", guidLow, linkedGuidLow);
error = true;
break;
}
if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
{
- TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '%u' linking to Gameobject '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
error = true;
break;
}
@@ -1377,7 +1378,7 @@ void ObjectMgr::LoadLinkedRespawn()
const GameObjectData* slave = GetGOData(guidLow);
if (!slave)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get gameobject data for GUIDLow %u", guidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) '%u' not found in gameobject table", guidLow);
error = true;
break;
}
@@ -1385,7 +1386,7 @@ void ObjectMgr::LoadLinkedRespawn()
const CreatureData* master = GetCreatureData(linkedGuidLow);
if (!master)
{
- TC_LOG_ERROR("sql.sql", "Couldn't get creature data for GUIDLow %u", linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) '%u' not found in creature table", linkedGuidLow);
error = true;
break;
}
@@ -1393,14 +1394,14 @@ void ObjectMgr::LoadLinkedRespawn()
const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
- TC_LOG_ERROR("sql.sql", "Creature '%u' linking to '%u' on an unpermitted map.", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '%u' linking to Creature '%u' on an unpermitted map.", guidLow, linkedGuidLow);
error = true;
break;
}
if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
{
- TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
+ TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '%u' linking to Creature '%u' with not corresponding spawnMask", guidLow, linkedGuidLow);
error = true;
break;
}
@@ -1437,6 +1438,11 @@ bool ObjectMgr::SetCreatureLinkedRespawn(uint32 guidLow, uint32 linkedGuidLow)
}
const CreatureData* slave = GetCreatureData(linkedGuidLow);
+ if (!slave)
+ {
+ TC_LOG_ERROR("sql.sql", "Creature '%u' linking to non-existent creature '%u'.", guidLow, linkedGuidLow);
+ return false;
+ }
const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 22fc83b1e7f..fb106884bba 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -457,7 +457,7 @@ typedef std::pair<QuestRelations::const_iterator, QuestRelations::const_iterator
struct PetLevelInfo
{
- PetLevelInfo() : health(0), mana(0) { for (uint8 i=0; i < MAX_STATS; ++i) stats[i] = 0; }
+ PetLevelInfo() : health(0), mana(0), armor(0) { for (uint8 i=0; i < MAX_STATS; ++i) stats[i] = 0; }
uint16 stats[MAX_STATS];
uint16 health;
@@ -566,13 +566,13 @@ struct QuestPOI
int32 ObjectiveIndex;
uint32 MapId;
uint32 AreaId;
- uint32 Unk2;
+ uint32 FloorId;
uint32 Unk3;
uint32 Unk4;
std::vector<QuestPOIPoint> points;
- QuestPOI() : Id(0), ObjectiveIndex(0), MapId(0), AreaId(0), Unk2(0), Unk3(0), Unk4(0) { }
- QuestPOI(uint32 id, int32 objIndex, uint32 mapId, uint32 areaId, uint32 unk2, uint32 unk3, uint32 unk4) : Id(id), ObjectiveIndex(objIndex), MapId(mapId), AreaId(areaId), Unk2(unk2), Unk3(unk3), Unk4(unk4) { }
+ QuestPOI() : Id(0), ObjectiveIndex(0), MapId(0), AreaId(0), FloorId(0), Unk3(0), Unk4(0) { }
+ QuestPOI(uint32 id, int32 objIndex, uint32 mapId, uint32 areaId, uint32 floorId, uint32 unk3, uint32 unk4) : Id(id), ObjectiveIndex(objIndex), MapId(mapId), AreaId(areaId), FloorId(floorId), Unk3(unk3), Unk4(unk4) { }
};
typedef std::vector<QuestPOI> QuestPOIVector;
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 2b3654d1da1..1c9fc2f04ba 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -73,7 +73,7 @@ std::string _GetGuildEventString(GuildEvents event)
return "Bank tab updated";
case GE_BANK_MONEY_SET:
return "Bank money set";
- case GE_BANK_MONEY_CHANGED:
+ case GE_BANK_TAB_AND_MONEY_UPDATED:
return "Bank money changed";
case GE_BANK_TEXT_CHANGED:
return "Bank tab text changed";
@@ -386,6 +386,7 @@ void Guild::RankInfo::SaveToDB(SQLTransaction& trans) const
stmt->setUInt8 (1, m_rankId);
stmt->setString(2, m_name);
stmt->setUInt32(3, m_rights);
+ stmt->setUInt32(4, m_bankMoneyPerDay);
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
@@ -2059,8 +2060,8 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool
_LogBankEvent(trans, cashFlow ? GUILD_BANK_LOG_CASH_FLOW_DEPOSIT : GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUIDLow(), amount);
CharacterDatabase.CommitTransaction(trans);
- std::string aux = ByteArrayToHexStr(reinterpret_cast<uint8*>(&amount), 8, true);
- _BroadcastEvent(GE_BANK_MONEY_CHANGED, 0, aux.c_str());
+ std::string aux = ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
+ _BroadcastEvent(GE_BANK_MONEY_SET, 0, aux.c_str());
if (player->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE))
{
@@ -2109,8 +2110,8 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool
_LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUIDLow(), amount);
CharacterDatabase.CommitTransaction(trans);
- std::string aux = ByteArrayToHexStr(reinterpret_cast<uint8*>(&amount), 8, true);
- _BroadcastEvent(GE_BANK_MONEY_CHANGED, 0, aux.c_str());
+ std::string aux = ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
+ _BroadcastEvent(GE_BANK_MONEY_SET, 0, aux.c_str());
return true;
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index cd4b3fe5252..256c876931d 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -165,7 +165,7 @@ enum GuildEvents
GE_BANK_TAB_PURCHASED = 19,
GE_BANK_TAB_UPDATED = 20,
GE_BANK_MONEY_SET = 21,
- GE_BANK_MONEY_CHANGED = 22,
+ GE_BANK_TAB_AND_MONEY_UPDATED = 22,
GE_BANK_TEXT_CHANGED = 23,
// 24 - error 795
GE_SIGNED_ON_MOBILE = 25,
@@ -576,7 +576,8 @@ private:
RankInfo(): m_guildId(0), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
RankInfo(uint32 guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
RankInfo(uint32 guildId, uint8 rankId, std::string const& name, uint32 rights, uint32 money) :
- m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { }
+ m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights),
+ m_bankMoneyPerDay(rankId != GR_GUILDMASTER ? money : GUILD_WITHDRAW_MONEY_UNLIMITED) { }
void LoadFromDB(Field* fields);
void SaveToDB(SQLTransaction& trans) const;
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index fd845efff3a..cd5a26272eb 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -84,8 +84,11 @@ void WorldSession::HandleMoveWorldportAckOpcode()
GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation());
return;
}
- else
- GetPlayer()->Relocate(&loc);
+
+ float z = loc.GetPositionZ();
+ if (GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
+ z += GetPlayer()->GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+ GetPlayer()->Relocate(loc.GetPositionX(), loc.GetPositionY(), z, loc.GetOrientation());
GetPlayer()->ResetMap();
GetPlayer()->SetMap(newMap);
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index b87840a74ec..3570822751c 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -149,8 +149,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint32 spellid
CharmInfo* charmInfo = pet->GetCharmInfo();
if (!charmInfo)
{
- TC_LOG_ERROR("network", "WorldSession::HandlePetAction(petGuid: " UI64FMTD ", tagGuid: " UI64FMTD ", spellId: %u, flag: %u): object (entry: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!",
- guid1, guid2, spellid, flag, pet->GetGUIDLow(), pet->GetTypeId());
+ TC_LOG_ERROR("network", "WorldSession::HandlePetAction(petGuid: " UI64FMTD ", tagGuid: " UI64FMTD ", spellId: %u, flag: %u): object (GUID: %u Entry: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!",
+ guid1, guid2, spellid, flag, pet->GetGUIDLow(), pet->GetEntry(), pet->GetTypeId());
return;
}
@@ -727,6 +727,12 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
}
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
+ if (!spellInfo)
+ {
+ TC_LOG_ERROR("network", "WORLD: unknown PET spell id %u", spellid);
+ return;
+ }
+
// do not add not learned spells/ passive spells
if (!pet->HasSpell(spellid) || !spellInfo->IsAutocastable())
return;
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 43bb843f0f1..7516bcc80cd 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -443,7 +443,7 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData)
data << int32(itr->ObjectiveIndex); // objective index
data << uint32(itr->MapId); // mapid
data << uint32(itr->AreaId); // areaid
- data << uint32(itr->Unk2); // unknown
+ data << uint32(itr->FloorId); // floorid
data << uint32(itr->Unk3); // unknown
data << uint32(itr->Unk4); // unknown
data << uint32(itr->points.size()); // POI points count
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index e08ccfab31d..85d80f3a420 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -1066,7 +1066,7 @@ void Map::MoveAllGameObjectsInMoveList()
{
// ... or unload (if respawn grid also not loaded)
#ifdef TRINITY_DEBUG
- sLog->outDebug("maps", "GameObject (GUID: %u Entry: %u) cannot be move to unloaded respawn grid.", go->GetGUIDLow(), go->GetEntry());
+ TC_LOG_DEBUG("maps", "GameObject (GUID: %u Entry: %u) cannot be move to unloaded respawn grid.", go->GetGUIDLow(), go->GetEntry());
#endif
AddObjectToRemoveList(go);
}
diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp
index b84a8ddb217..11798201397 100644
--- a/src/server/game/Maps/TransportMgr.cpp
+++ b/src/server/game/Maps/TransportMgr.cpp
@@ -60,6 +60,12 @@ void TransportMgr::LoadTransportTemplates()
Field* fields = result->Fetch();
uint32 entry = fields[0].GetUInt32();
GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(entry);
+ if (goInfo == NULL)
+ {
+ TC_LOG_ERROR("sql.sql", "Transport %u has no associated GameObjectTemplate from `gameobject_template` , skipped.", entry);
+ continue;
+ }
+
if (goInfo->moTransport.taxiPathId >= sTaxiPathNodesByPath.size())
{
TC_LOG_ERROR("sql.sql", "Transport %u (name: %s) has an invalid path specified in `gameobject_template`.`data0` (%u) field, skipped.", entry, goInfo->name.c_str(), goInfo->moTransport.taxiPathId);
diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h
index 250a2c50bb1..205a614eabb 100644
--- a/src/server/game/Maps/TransportMgr.h
+++ b/src/server/game/Maps/TransportMgr.h
@@ -38,7 +38,7 @@ typedef UNORDERED_MAP<uint32, std::set<uint32> > TransportInstanceMap;
struct KeyFrame
{
- explicit KeyFrame(TaxiPathNodeEntry const& _node) : Node(&_node),
+ explicit KeyFrame(TaxiPathNodeEntry const& _node) : Index(0), Node(&_node),
DistSinceStop(-1.0f), DistUntilStop(-1.0f), DistFromPrev(-1.0f), TimeFrom(0.0f), TimeTo(0.0f),
Teleport(false), ArriveTime(0), DepartureTime(0), Spline(NULL), NextDistFromPrev(0.0f), NextArriveTime(0)
{
@@ -66,7 +66,7 @@ struct KeyFrame
struct TransportTemplate
{
- TransportTemplate() : pathTime(0), accelTime(0.0f), accelDist(0.0f) { }
+ TransportTemplate() : inInstance(false), pathTime(0), accelTime(0.0f), accelDist(0.0f), entry(0) { }
~TransportTemplate();
std::set<uint32> mapsUsed;
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index 85a08e49fd3..91ad6d2b676 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -33,6 +33,8 @@ PathGenerator::PathGenerator(const Unit* owner) :
_endPosition(G3D::Vector3::zero()), _sourceUnit(owner), _navMesh(NULL),
_navMeshQuery(NULL)
{
+ memset(_pathPolyRefs, 0, sizeof(_pathPolyRefs));
+
TC_LOG_DEBUG("maps", "++ PathGenerator::PathGenerator for %u \n", _sourceUnit->GetGUIDLow());
uint32 mapId = _sourceUnit->GetMapId();
diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp
index ee47a5ebedc..f5bdba378d1 100644
--- a/src/server/game/Movement/Spline/MovementUtil.cpp
+++ b/src/server/game/Movement/Spline/MovementUtil.cpp
@@ -77,7 +77,7 @@ namespace Movement
{
result = termVel * (t_passed - terminal_time) +
start_velocity * terminal_time +
- gravity * terminal_time * terminal_time*0.5f;
+ gravity * terminal_time * terminal_time * 0.5f;
}
else
result = t_passed * (start_velocity + t_passed * gravity * 0.5f);
diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp
index e70c88d2181..41c18b850a1 100644
--- a/src/server/game/Scripting/MapScripts.cpp
+++ b/src/server/game/Scripting/MapScripts.cpp
@@ -499,7 +499,7 @@ void Map::ScriptsProcess()
if (step.script->FlagToggle.FieldID <= OBJECT_FIELD_ENTRY || step.script->FlagToggle.FieldID >= cSource->GetValuesCount())
TC_LOG_ERROR("scripts", "%s wrong field %u (max count: %u) in object (TypeId: %u, Entry: %u, GUID: %u) specified, skipping.",
step.script->GetDebugInfo().c_str(), step.script->FlagToggle.FieldID,
- source->GetValuesCount(), source->GetTypeId(), source->GetEntry(), source->GetGUIDLow());
+ cSource->GetValuesCount(), cSource->GetTypeId(), cSource->GetEntry(), cSource->GetGUIDLow());
else
cSource->SetFlag(step.script->FlagToggle.FieldID, step.script->FlagToggle.FieldValue);
}
@@ -513,7 +513,7 @@ void Map::ScriptsProcess()
if (step.script->FlagToggle.FieldID <= OBJECT_FIELD_ENTRY || step.script->FlagToggle.FieldID >= cSource->GetValuesCount())
TC_LOG_ERROR("scripts", "%s wrong field %u (max count: %u) in object (TypeId: %u, Entry: %u, GUID: %u) specified, skipping.",
step.script->GetDebugInfo().c_str(), step.script->FlagToggle.FieldID,
- source->GetValuesCount(), source->GetTypeId(), source->GetEntry(), source->GetGUIDLow());
+ cSource->GetValuesCount(), cSource->GetTypeId(), cSource->GetEntry(), cSource->GetGUIDLow());
else
cSource->RemoveFlag(step.script->FlagToggle.FieldID, step.script->FlagToggle.FieldValue);
}
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index b014ff85562..976a3e6fb7a 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -319,7 +319,10 @@ void AddSC_boss_ptheradras();
void AddSC_instance_maraudon();
void AddSC_boss_onyxia(); //Onyxia's Lair
void AddSC_instance_onyxias_lair();
-void AddSC_boss_amnennar_the_coldbringer(); //Razorfen Downs
+void AddSC_boss_tuten_kash(); //Razorfen Downs
+void AddSC_boss_mordresh_fire_eye();
+void AddSC_boss_glutton();
+void AddSC_boss_amnennar_the_coldbringer();
void AddSC_razorfen_downs();
void AddSC_instance_razorfen_downs();
void AddSC_razorfen_kraul(); //Razorfen Kraul
@@ -578,7 +581,8 @@ void AddSC_boss_grandmaster_vorpil();
void AddSC_boss_murmur();
void AddSC_instance_shadow_labyrinth();
-void AddSC_black_temple(); //Black Temple
+// Black Temple
+void AddSC_black_temple();
void AddSC_boss_illidan();
void AddSC_boss_shade_of_akama();
void AddSC_boss_supremus();
@@ -589,22 +593,35 @@ void AddSC_boss_teron_gorefiend();
void AddSC_boss_najentus();
void AddSC_boss_illidari_council();
void AddSC_instance_black_temple();
-void AddSC_boss_fathomlord_karathress(); //CR Serpent Shrine Cavern
+
+// Coilfang Reservoir - Serpent Shrine Cavern
+void AddSC_boss_fathomlord_karathress();
void AddSC_boss_hydross_the_unstable();
void AddSC_boss_lady_vashj();
void AddSC_boss_leotheras_the_blind();
void AddSC_boss_morogrim_tidewalker();
void AddSC_instance_serpentshrine_cavern();
void AddSC_boss_the_lurker_below();
-void AddSC_boss_hydromancer_thespia(); //CR Steam Vault
+
+// Coilfang Reservoir - The Steam Vault
+void AddSC_boss_hydromancer_thespia();
void AddSC_boss_mekgineer_steamrigger();
void AddSC_boss_warlord_kalithresh();
void AddSC_instance_steam_vault();
-void AddSC_instance_the_slave_pens(); //The Slave Pens
-void AddSC_boss_hungarfen(); //CR Underbog
-void AddSC_boss_the_black_stalker();
+
+// Coilfang Reservoir - The Slave Pens
+void AddSC_instance_the_slave_pens();
+void AddSC_boss_mennu_the_betrayer();
+void AddSC_boss_rokmar_the_crackler();
+void AddSC_boss_quagmirran();
+
+// Coilfang Reservoir - The Underbog
void AddSC_instance_the_underbog();
-void AddSC_boss_gruul(); //Gruul's Lair
+void AddSC_boss_hungarfen();
+void AddSC_boss_the_black_stalker();
+
+// Gruul's Lair
+void AddSC_boss_gruul();
void AddSC_boss_high_king_maulgar();
void AddSC_instance_gruuls_lair();
void AddSC_boss_broggok(); //HC Blood Furnace
@@ -622,6 +639,9 @@ void AddSC_boss_omor_the_unscarred();
void AddSC_boss_vazruden_the_herald();
void AddSC_instance_ramparts();
void AddSC_arcatraz(); //TK Arcatraz
+void AddSC_boss_zereketh_the_unbound();
+void AddSC_boss_dalliah_the_doomsayer();
+void AddSC_boss_wrath_scryer_soccothrates();
void AddSC_boss_harbinger_skyriss();
void AddSC_instance_arcatraz();
void AddSC_boss_high_botanist_freywinn(); //TK Botanica
@@ -1020,7 +1040,10 @@ void AddKalimdorScripts()
AddSC_instance_maraudon();
AddSC_boss_onyxia(); //Onyxia's Lair
AddSC_instance_onyxias_lair();
- AddSC_boss_amnennar_the_coldbringer(); //Razorfen Downs
+ AddSC_boss_tuten_kash(); //Razorfen Downs
+ AddSC_boss_mordresh_fire_eye();
+ AddSC_boss_glutton();
+ AddSC_boss_amnennar_the_coldbringer();
AddSC_razorfen_downs();
AddSC_instance_razorfen_downs();
AddSC_razorfen_kraul(); //Razorfen Kraul
@@ -1108,7 +1131,8 @@ void AddOutlandScripts()
AddSC_boss_murmur();
AddSC_instance_shadow_labyrinth();
- AddSC_black_temple(); //Black Temple
+ // Black Temple
+ AddSC_black_temple();
AddSC_boss_illidan();
AddSC_boss_shade_of_akama();
AddSC_boss_supremus();
@@ -1119,22 +1143,35 @@ void AddOutlandScripts()
AddSC_boss_najentus();
AddSC_boss_illidari_council();
AddSC_instance_black_temple();
- AddSC_boss_fathomlord_karathress(); //CR Serpent Shrine Cavern
+
+ // Coilfang Reservoir - Serpent Shrine Cavern
+ AddSC_boss_fathomlord_karathress();
AddSC_boss_hydross_the_unstable();
AddSC_boss_lady_vashj();
AddSC_boss_leotheras_the_blind();
AddSC_boss_morogrim_tidewalker();
AddSC_instance_serpentshrine_cavern();
AddSC_boss_the_lurker_below();
- AddSC_boss_hydromancer_thespia(); //CR Steam Vault
+
+ // Coilfang Reservoir - The Steam Vault
+ AddSC_instance_steam_vault();
+ AddSC_boss_hydromancer_thespia();
AddSC_boss_mekgineer_steamrigger();
AddSC_boss_warlord_kalithresh();
- AddSC_instance_steam_vault();
- AddSC_instance_the_slave_pens(); //The Slave Pens
- AddSC_boss_hungarfen(); //CR Underbog
- AddSC_boss_the_black_stalker();
+
+ // Coilfang Reservoir - The Slave Pens
+ AddSC_instance_the_slave_pens();
+ AddSC_boss_mennu_the_betrayer();
+ AddSC_boss_rokmar_the_crackler();
+ AddSC_boss_quagmirran();
+
+ // Coilfang Reservoir - The Underbog
AddSC_instance_the_underbog();
- AddSC_boss_gruul(); //Gruul's Lair
+ AddSC_boss_hungarfen();
+ AddSC_boss_the_black_stalker();
+
+ // Gruul's Lair
+ AddSC_boss_gruul();
AddSC_boss_high_king_maulgar();
AddSC_instance_gruuls_lair();
AddSC_boss_broggok(); //HC Blood Furnace
@@ -1152,6 +1189,9 @@ void AddOutlandScripts()
AddSC_boss_vazruden_the_herald();
AddSC_instance_ramparts();
AddSC_arcatraz(); //TK Arcatraz
+ AddSC_boss_zereketh_the_unbound();
+ AddSC_boss_dalliah_the_doomsayer();
+ AddSC_boss_wrath_scryer_soccothrates();
AddSC_boss_harbinger_skyriss();
AddSC_instance_arcatraz();
AddSC_boss_high_botanist_freywinn(); //TK Botanica
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 51fd45f9880..621c4e2bce0 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4768,28 +4768,43 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
return;
- Player* player = m_caster->ToPlayer();
- if (!player)
+ if (damage < 0)
return;
- Pet* pet = player->GetPet();
- if (pet && pet->IsAlive())
+ Player* player = m_caster->ToPlayer();
+ if (!player)
return;
- if (damage < 0)
- return;
- float x, y, z;
- player->GetPosition(x, y, z);
- if (!pet)
+ // Maybe player dismissed dead pet or pet despawned?
+ bool hadPet = true;
+ if (!player->GetPet())
{
- player->SummonPet(0, x, y, z, player->GetOrientation(), SUMMON_PET, 0);
- pet = player->GetPet();
+ // Position passed to SummonPet is irrelevant with current implementation,
+ // pet will be relocated without using these coords in Pet::LoadPetFromDB
+ player->SummonPet(0, 0.0f, 0.0f, 0.0f, 0.0f, SUMMON_PET, 0);
+ hadPet = false;
}
+
+ // TODO: Better to fail Hunter's "Revive Pet" at cast instead of here when casting ends
+ Pet* pet = player->GetPet(); // Attempt to get current pet
if (!pet)
return;
- player->GetMap()->CreatureRelocation(pet, x, y, z, player->GetOrientation());
+ // TODO: Better to fail Hunter's "Revive Pet" at cast instead of here when casting ends
+ if (pet->IsAlive())
+ return;
+
+ // If player did have a pet before reviving, teleport it
+ if (hadPet)
+ {
+ // Reposition the pet's corpse before reviving so as not to grab aggro
+ // We can use a different, more accurate version of GetClosePoint() since we have a pet
+ float x, y, z; // Will be used later to reposition the pet if we have one
+ player->GetClosePoint(x, y, z, pet->GetObjectSize(), PET_FOLLOW_DIST, pet->GetFollowAngle());
+ pet->NearTeleportTo(x, y, z, player->GetOrientation());
+ pet->Relocate(x, y, z, player->GetOrientation()); // This is needed so SaveStayPosition() will get the proper coords.
+ }
pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE);
pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
@@ -4797,8 +4812,20 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
pet->ClearUnitState(uint32(UNIT_STATE_ALL_STATE));
pet->SetHealth(pet->CountPctFromMaxHealth(damage));
- //pet->AIM_Initialize();
- //player->PetSpellInitialize();
+ // Reset things for when the AI to takes over
+ CharmInfo *ci = pet->GetCharmInfo();
+ if (ci)
+ {
+ // In case the pet was at stay, we don't want it running back
+ ci->SaveStayPosition();
+ ci->SetIsAtStay(ci->HasCommandState(COMMAND_STAY));
+
+ ci->SetIsFollowing(false);
+ ci->SetIsCommandAttack(false);
+ ci->SetIsCommandFollow(false);
+ ci->SetIsReturning(false);
+ }
+
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 3e9c564e874..9a01b86af00 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3185,6 +3185,7 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS_2);
break;
case 31347: // Doom
+ case 36327: // Shoot Arcane Explosion Arrow
case 39365: // Thundering Storm
case 41071: // Raise Dead (HACK)
case 42442: // Vengeance Landing Cannonfire
@@ -3285,6 +3286,9 @@ void SpellMgr::LoadSpellInfoCorrections()
// add corruption to affected spells
spellInfo->Effects[EFFECT_1].SpellClassMask[0] |= 2;
break;
+ case 37408: // Oscillation Field
+ spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS;
+ break;
case 51852: // The Eye of Acherus (no spawn in phase 2 in db)
spellInfo->Effects[EFFECT_0].MiscValue |= 1;
break;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 68fe06f5f9f..701fb144165 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -3103,16 +3103,6 @@ void World::LoadDBVersion()
m_DBVersion = "Unknown world database.";
}
-void World::ProcessStartEvent()
-{
- isEventKillStart = true;
-}
-
-void World::ProcessStopEvent()
-{
- isEventKillStart = false;
-}
-
void World::UpdateAreaDependentAuras()
{
SessionMap::const_iterator itr;
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index a649791546f..10d5d4ef36c 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -751,12 +751,6 @@ class World
void UpdateAreaDependentAuras();
- void ProcessStartEvent();
- void ProcessStopEvent();
- bool GetEventKill() const { return isEventKillStart; }
-
- bool isEventKillStart;
-
CharacterNameData const* GetCharacterNameData(uint32 guid) const;
void AddCharacterNameData(uint32 guid, std::string const& name, uint8 gender, uint8 race, uint8 playerClass, uint8 level);
void UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 gender = GENDER_NONE, uint8 race = RACE_NONE);
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
index 9b250cc169a..a1bbad7ee1c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
@@ -73,6 +73,8 @@ public:
go_blackrockaltar = 0;
go_portcullis_active = 0;
go_portcullis_tobossrooms = 0;
+ memset(go_roomrunes, 0, sizeof(go_roomrunes));
+ memset(go_emberseerrunes, 0, sizeof(go_emberseerrunes));
}
void OnCreatureCreate(Creature* creature) OVERRIDE
@@ -270,7 +272,7 @@ public:
return true;
}
- void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId) OVERRIDE
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) OVERRIDE
{
switch (eventId)
{
@@ -313,102 +315,71 @@ public:
{
case DATA_HIGHLORD_OMOKK:
return HighlordOmokk;
- break;
case DATA_SHADOW_HUNTER_VOSHGAJIN:
return ShadowHunterVoshgajin;
- break;
case DATA_WARMASTER_VOONE:
return WarMasterVoone;
- break;
case DATA_MOTHER_SMOLDERWEB:
return MotherSmolderweb;
- break;
case DATA_UROK_DOOMHOWL:
return UrokDoomhowl;
- break;
case DATA_QUARTERMASTER_ZIGRIS:
return QuartermasterZigris;
- break;
case DATA_GIZRUL_THE_SLAVENER:
return GizrultheSlavener;
- break;
case DATA_HALYCON:
return Halycon;
- break;
case DATA_OVERLORD_WYRMTHALAK:
return OverlordWyrmthalak;
- break;
case DATA_PYROGAURD_EMBERSEER:
return PyroguardEmberseer;
- break;
case DATA_WARCHIEF_REND_BLACKHAND:
return WarchiefRendBlackhand;
- break;
case DATA_GYTH:
return Gyth;
- break;
case DATA_THE_BEAST:
return TheBeast;
- break;
case DATA_GENERAL_DRAKKISATH:
return GeneralDrakkisath;
- break;
case GO_EMBERSEER_IN:
return go_emberseerin;
- break;
case GO_DOORS:
return go_doors;
- break;
case GO_EMBERSEER_OUT:
return go_emberseerout;
- break;
case GO_HALL_RUNE_1:
return go_roomrunes[0];
- break;
case GO_HALL_RUNE_2:
return go_roomrunes[1];
- break;
case GO_HALL_RUNE_3:
return go_roomrunes[2];
- break;
case GO_HALL_RUNE_4:
return go_roomrunes[3];
- break;
case GO_HALL_RUNE_5:
return go_roomrunes[4];
- break;
case GO_HALL_RUNE_6:
return go_roomrunes[5];
- break;
case GO_HALL_RUNE_7:
return go_roomrunes[6];
- break;
case GO_EMBERSEER_RUNE_1:
return go_emberseerrunes[0];
- break;
case GO_EMBERSEER_RUNE_2:
return go_emberseerrunes[1];
- break;
case GO_EMBERSEER_RUNE_3:
return go_emberseerrunes[2];
- break;
case GO_EMBERSEER_RUNE_4:
return go_emberseerrunes[3];
- break;
case GO_EMBERSEER_RUNE_5:
return go_emberseerrunes[4];
- break;
case GO_EMBERSEER_RUNE_6:
return go_emberseerrunes[5];
- break;
case GO_EMBERSEER_RUNE_7:
return go_emberseerrunes[6];
- break;
case GO_PORTCULLIS_ACTIVE:
return go_portcullis_active;
- break;
case GO_PORTCULLIS_TOBOSSROOMS:
return go_portcullis_tobossrooms;
+ default:
break;
}
return 0;
@@ -577,8 +548,6 @@ public:
protected:
EventMap Events;
- uint32 encounter[EncounterCount];
- std::string m_strInstData;
uint64 HighlordOmokk;
uint64 ShadowHunterVoshgajin;
uint64 WarMasterVoone;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 8efcbf29d30..91127f2db0d 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -614,7 +614,8 @@ public:
}
return 50000;
case 15:
- arca->DealDamage(arca, arca->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ if (arca)
+ arca->DealDamage(arca, arca->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
return 5000;
default : return 9999999;
}
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
index f1aa47df8f8..3fd346d6816 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
@@ -44,7 +44,7 @@ enum Quotes
YELL_MADR_INTRO = 1,
YELL_MADR_ICE_BLOCK = 2,
YELL_MADR_TRAP = 3,
- YELL_MADR_DEATH = 4,
+ YELL_MADR_DEATH = 4
};
enum Spells
@@ -61,18 +61,11 @@ enum Spells
SPELL_INTRO_ENCAPSULATE_CHANELLING = 45661
};
-#define FELMYST 25038
-
class boss_brutallus : public CreatureScript
{
public:
boss_brutallus() : CreatureScript("boss_brutallus") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_brutallusAI(creature);
- }
-
struct boss_brutallusAI : public ScriptedAI
{
boss_brutallusAI(Creature* creature) : ScriptedAI(creature)
@@ -112,16 +105,14 @@ public:
DoCast(me, SPELL_DUAL_WIELD, true);
- if (instance)
- instance->SetData(DATA_BRUTALLUS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_BRUTALLUS, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
Talk(YELL_AGGRO);
- if (instance)
- instance->SetData(DATA_BRUTALLUS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_BRUTALLUS, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -133,13 +124,10 @@ public:
{
Talk(YELL_DEATH);
- if (instance)
- {
- instance->SetData(DATA_BRUTALLUS_EVENT, DONE);
- float x, y, z;
- me->GetPosition(x, y, z);
- me->SummonCreature(FELMYST, x, y, z+30, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
- }
+ instance->SetBossState(DATA_BRUTALLUS, DONE);
+ float x, y, z;
+ me->GetPosition(x, y, z);
+ me->SummonCreature(NPC_FELMYST, x, y, z + 30, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
}
void EnterEvadeMode() OVERRIDE
@@ -152,8 +140,8 @@ public:
{
if (!Intro || IsIntro)
return;
- Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
- if (Madrigosa)
+
+ if (Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MADRIGOSA)))
{
Madrigosa->Respawn();
Madrigosa->setActive(true);
@@ -166,7 +154,7 @@ public:
}
else
{
- //Madrigosa not found, end intro
+ // Madrigosa not found, end intro
TC_LOG_ERROR("scripts", "Madrigosa was not found");
EndIntro();
}
@@ -188,7 +176,7 @@ public:
void DoIntro()
{
- Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
+ Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0);
if (!Madrigosa)
return;
@@ -265,15 +253,16 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!me->IsValidAttackTarget(who))
return;
- if (instance && Intro)
- instance->SetData(DATA_BRUTALLUS_EVENT, SPECIAL);
+
+ if (Intro)
+ instance->SetBossState(DATA_BRUTALLUS, SPECIAL);
if (Intro && !IsIntro)
StartIntro();
+
if (!Intro)
ScriptedAI::MoveInLineOfSight(who);
}
@@ -290,15 +279,19 @@ public:
{
if (IntroFrostBoltTimer <= diff)
{
- if (Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0))
+ if (Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MADRIGOSA)))
{
Madrigosa->CastSpell(me, SPELL_INTRO_FROSTBOLT, true);
IntroFrostBoltTimer = 2000;
}
- } else IntroFrostBoltTimer -= diff;
+ }
+ else
+ IntroFrostBoltTimer -= diff;
}
+
if (!UpdateVictim())
return;
+
DoMeleeAttackIfReady();
}
@@ -341,6 +334,11 @@ public:
DoMeleeAttackIfReady();
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_brutallusAI>(creature);
+ }
};
void AddSC_boss_brutallus()
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index 692f9ae5440..e68d834b20d 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
@@ -15,12 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Eredar_Twins
-SD%Complete: 100
-SDComment:
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "sunwell_plateau.h"
@@ -48,35 +42,35 @@ enum Quotes
YELL_ALY_DEAD = 6,
YELL_SISTER_SACROLASH_DEAD = 7,
YELL_CANFLAGRATION = 8,
- YELL_BERSERK = 9,
+ YELL_BERSERK = 9
};
enum Spells
{
//Lady Sacrolash spells
- SPELL_DARK_TOUCHED = 45347,
- SPELL_SHADOW_BLADES = 45248, //10 secs
- SPELL_DARK_STRIKE = 45271,
- SPELL_SHADOW_NOVA = 45329, //30-35 secs
- SPELL_CONFOUNDING_BLOW = 45256, //25 secs
+ SPELL_DARK_TOUCHED = 45347,
+ SPELL_SHADOW_BLADES = 45248, //10 secs
+ SPELL_DARK_STRIKE = 45271,
+ SPELL_SHADOW_NOVA = 45329, //30-35 secs
+ SPELL_CONFOUNDING_BLOW = 45256, //25 secs
//Shadow Image spells
- SPELL_SHADOW_FURY = 45270,
- SPELL_IMAGE_VISUAL = 45263,
+ SPELL_SHADOW_FURY = 45270,
+ SPELL_IMAGE_VISUAL = 45263,
//Misc spells
- SPELL_ENRAGE = 46587,
- SPELL_EMPOWER = 45366,
- SPELL_DARK_FLAME = 45345,
+ SPELL_ENRAGE = 46587,
+ SPELL_EMPOWER = 45366,
+ SPELL_DARK_FLAME = 45345,
//Grand Warlock Alythess spells
- SPELL_PYROGENICS = 45230, //15secs
- SPELL_FLAME_TOUCHED = 45348,
- SPELL_CONFLAGRATION = 45342, //30-35 secs
- SPELL_BLAZE = 45235, //on main target every 3 secs
- SPELL_FLAME_SEAR = 46771,
- SPELL_BLAZE_SUMMON = 45236, //187366 GO
- SPELL_BLAZE_BURN = 45246
+ SPELL_PYROGENICS = 45230, //15secs
+ SPELL_FLAME_TOUCHED = 45348,
+ SPELL_CONFLAGRATION = 45342, //30-35 secs
+ SPELL_BLAZE = 45235, //on main target every 3 secs
+ SPELL_FLAME_SEAR = 46771,
+ SPELL_BLAZE_SUMMON = 45236, //187366 GO
+ SPELL_BLAZE_BURN = 45246
};
class boss_sacrolash : public CreatureScript
@@ -84,11 +78,6 @@ class boss_sacrolash : public CreatureScript
public:
boss_sacrolash() : CreatureScript("boss_sacrolash") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_sacrolashAI(creature);
- };
-
struct boss_sacrolashAI : public ScriptedAI
{
boss_sacrolashAI(Creature* creature) : ScriptedAI(creature)
@@ -112,15 +101,12 @@ public:
{
Enraged = false;
- if (instance)
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALYTHESS)))
{
- if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS)))
- {
- if (temp->isDead())
- temp->Respawn();
- else if (temp->GetVictim())
- me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
- }
+ if (temp->isDead())
+ temp->Respawn();
+ else if (temp->GetVictim())
+ me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
}
if (!me->IsInCombat())
@@ -131,27 +117,21 @@ public:
ShadowimageTimer = 20000;
ConflagrationTimer = 30000;
EnrageTimer = 360000;
-
SisterDeath = false;
}
- if (instance)
- instance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_EREDAR_TWINS, NOT_STARTED);
}
void EnterCombat(Unit* who) OVERRIDE
{
DoZoneInCombat();
- if (instance)
- {
- Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS));
- if (temp && temp->IsAlive() && !temp->GetVictim())
- temp->AI()->AttackStart(who);
- }
+ Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALYTHESS));
+ if (temp && temp->IsAlive() && !temp->GetVictim())
+ temp->AI()->AttackStart(who);
- if (instance)
- instance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_EREDAR_TWINS, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -167,8 +147,7 @@ public:
{
Talk(YELL_SAC_DEAD);
- if (instance)
- instance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
+ instance->SetBossState(DATA_EREDAR_TWINS, DONE);
}
else
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
@@ -178,15 +157,15 @@ public:
{
switch (spell->Id)
{
- case SPELL_SHADOW_BLADES:
- case SPELL_SHADOW_NOVA:
- case SPELL_CONFOUNDING_BLOW:
- case SPELL_SHADOW_FURY:
- HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
- break;
- case SPELL_CONFLAGRATION:
- HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
- break;
+ case SPELL_SHADOW_BLADES:
+ case SPELL_SHADOW_NOVA:
+ case SPELL_CONFOUNDING_BLOW:
+ case SPELL_SHADOW_FURY:
+ HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
+ break;
+ case SPELL_CONFLAGRATION:
+ HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
+ break;
}
}
@@ -194,26 +173,26 @@ public:
{
switch (TouchedType)
{
- case SPELL_FLAME_TOUCHED:
- if (!target->HasAura(SPELL_DARK_FLAME))
- {
- if (target->HasAura(SPELL_DARK_TOUCHED))
+ case SPELL_FLAME_TOUCHED:
+ if (!target->HasAura(SPELL_DARK_FLAME))
{
- target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
- target->CastSpell(target, SPELL_DARK_FLAME, true);
- } else target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
- }
- break;
- case SPELL_DARK_TOUCHED:
- if (!target->HasAura(SPELL_DARK_FLAME))
- {
- if (target->HasAura(SPELL_FLAME_TOUCHED))
+ if (target->HasAura(SPELL_DARK_TOUCHED))
+ {
+ target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
+ target->CastSpell(target, SPELL_DARK_FLAME, true);
+ } else target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
+ }
+ break;
+ case SPELL_DARK_TOUCHED:
+ if (!target->HasAura(SPELL_DARK_FLAME))
{
- target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
- target->CastSpell(target, SPELL_DARK_FLAME, true);
- } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
- }
- break;
+ if (target->HasAura(SPELL_FLAME_TOUCHED))
+ {
+ target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
+ target->CastSpell(target, SPELL_DARK_FLAME, true);
+ } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
+ }
+ break;
}
}
@@ -221,17 +200,13 @@ public:
{
if (!SisterDeath)
{
- if (instance)
+ Unit* Temp = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ALYTHESS));
+ if (Temp && Temp->isDead())
{
- Unit* Temp = NULL;
- Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS));
- if (Temp && Temp->isDead())
- {
- Talk(YELL_SISTER_ALYTHESS_DEAD);
- DoCast(me, SPELL_EMPOWER);
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
- SisterDeath = true;
- }
+ Talk(YELL_SISTER_ALYTHESS_DEAD);
+ DoCast(me, SPELL_EMPOWER);
+ me->InterruptSpell(CURRENT_GENERIC_SPELL);
+ SisterDeath = true;
}
}
@@ -245,9 +220,7 @@ public:
if (!me->IsNonMeleeSpellCasted(false))
{
me->InterruptSpell(CURRENT_GENERIC_SPELL);
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CONFLAGRATION);
ConflagrationTimer = 30000+(rand()%5000);
}
@@ -259,8 +232,7 @@ public:
{
if (!me->IsNonMeleeSpellCasted(false))
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
if (target)
DoCast(target, SPELL_SHADOW_NOVA);
@@ -279,9 +251,7 @@ public:
{
if (!me->IsNonMeleeSpellCasted(false))
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CONFOUNDING_BLOW);
ConfoundingblowTimer = 20000 + (rand()%5000);
}
@@ -297,7 +267,7 @@ public:
temp = DoSpawnCreature(NPC_SHADOW_IMAGE, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 10000);
if (temp && target)
{
- temp->AddThreat(target, 1000000);//don't change target(healers)
+ temp->AddThreat(target, 1000000); //don't change target(healers)
temp->AI()->AttackStart(target);
}
}
@@ -333,6 +303,11 @@ public:
}
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_sacrolashAI>(creature);
+ };
};
class boss_alythess : public CreatureScript
@@ -340,11 +315,6 @@ class boss_alythess : public CreatureScript
public:
boss_alythess() : CreatureScript("boss_alythess") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_alythessAI(creature);
- };
-
struct boss_alythessAI : public ScriptedAI
{
boss_alythessAI(Creature* creature) : ScriptedAI(creature)
@@ -374,15 +344,12 @@ public:
{
Enraged = false;
- if (instance)
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH)))
{
- if (Creature* temp = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH)))
- {
- if (temp->isDead())
- temp->Respawn();
- else if (temp->GetVictim())
- me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
- }
+ if (temp->isDead())
+ temp->Respawn();
+ else if (temp->GetVictim())
+ me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
}
if (!me->IsInCombat())
@@ -398,23 +365,18 @@ public:
SisterDeath = false;
}
- if (instance)
- instance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_EREDAR_TWINS, NOT_STARTED);
}
void EnterCombat(Unit* who) OVERRIDE
{
DoZoneInCombat();
- if (instance)
- {
- Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
- if (temp && temp->IsAlive() && !temp->GetVictim())
- temp->AI()->AttackStart(who);
- }
+ Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
+ if (temp && temp->IsAlive() && !temp->GetVictim())
+ temp->AI()->AttackStart(who);
- if (instance)
- instance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_EREDAR_TWINS, IN_PROGRESS);
}
void AttackStart(Unit* who) OVERRIDE
@@ -424,7 +386,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!who || me->GetVictim())
return;
@@ -441,17 +402,13 @@ public:
}
}
else if (IntroStepCounter == 10 && me->IsWithinLOSInMap(who)&& me->IsWithinDistInMap(who, 30))
- {
IntroStepCounter = 0;
- }
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
{
if (rand()%4 == 0)
- {
Talk(YELL_ALY_KILL);
- }
}
void JustDied(Unit* /*killer*/) OVERRIDE
@@ -459,9 +416,7 @@ public:
if (SisterDeath)
{
Talk(YELL_ALY_DEAD);
-
- if (instance)
- instance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
+ instance->SetBossState(DATA_EREDAR_TWINS, DONE);
}
else
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
@@ -471,16 +426,16 @@ public:
{
switch (spell->Id)
{
- case SPELL_BLAZE:
- target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
- break;
- case SPELL_CONFLAGRATION:
- case SPELL_FLAME_SEAR:
- HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
- break;
- case SPELL_SHADOW_NOVA:
- HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
- break;
+ case SPELL_BLAZE:
+ target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
+ break;
+ case SPELL_CONFLAGRATION:
+ case SPELL_FLAME_SEAR:
+ HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
+ break;
+ case SPELL_SHADOW_NOVA:
+ HandleTouchedSpells(target, SPELL_DARK_TOUCHED);
+ break;
}
}
@@ -488,58 +443,68 @@ public:
{
switch (TouchedType)
{
- case SPELL_FLAME_TOUCHED:
- if (!target->HasAura(SPELL_DARK_FLAME))
- {
- if (target->HasAura(SPELL_DARK_TOUCHED))
- {
- target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
- target->CastSpell(target, SPELL_DARK_FLAME, true);
- }else
+ case SPELL_FLAME_TOUCHED:
+ if (!target->HasAura(SPELL_DARK_FLAME))
{
- target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
+ if (target->HasAura(SPELL_DARK_TOUCHED))
+ {
+ target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
+ target->CastSpell(target, SPELL_DARK_FLAME, true);
+ }
+ else
+ target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
}
- }
- break;
- case SPELL_DARK_TOUCHED:
- if (!target->HasAura(SPELL_DARK_FLAME))
- {
- if (target->HasAura(SPELL_FLAME_TOUCHED))
+ break;
+ case SPELL_DARK_TOUCHED:
+ if (!target->HasAura(SPELL_DARK_FLAME))
{
- target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
- target->CastSpell(target, SPELL_DARK_FLAME, true);
- } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
- }
- break;
+ if (target->HasAura(SPELL_FLAME_TOUCHED))
+ {
+ target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
+ target->CastSpell(target, SPELL_DARK_FLAME, true);
+ }
+ else
+ target->CastSpell(target, SPELL_DARK_TOUCHED, true);
+ }
+ break;
}
}
uint32 IntroStep(uint32 step)
{
- Creature* Sacrolash = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_SACROLASH) : 0);
+ Creature* Sacrolash = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
switch (step)
{
- case 0: return 0;
- case 1:
- if (Sacrolash)
- Sacrolash->AI()->Talk(YELL_INTRO_SAC_1);
- return 1000;
- case 2: Talk(YELL_INTRO_ALY_2); return 1000;
- case 3:
- if (Sacrolash)
- Sacrolash->AI()->Talk(YELL_INTRO_SAC_3);
- return 2000;
- case 4: Talk(YELL_INTRO_ALY_4); return 1000;
- case 5:
- if (Sacrolash)
- Sacrolash->AI()->Talk(YELL_INTRO_SAC_5);
- return 2000;
- case 6: Talk(YELL_INTRO_ALY_6); return 1000;
- case 7:
- if (Sacrolash)
- Sacrolash->AI()->Talk(YELL_INTRO_SAC_7);
- return 3000;
- case 8: Talk(YELL_INTRO_ALY_8); return 900000;
+ case 0:
+ return 0;
+ case 1:
+ if (Sacrolash)
+ Sacrolash->AI()->Talk(YELL_INTRO_SAC_1);
+ return 1000;
+ case 2:
+ Talk(YELL_INTRO_ALY_2);
+ return 1000;
+ case 3:
+ if (Sacrolash)
+ Sacrolash->AI()->Talk(YELL_INTRO_SAC_3);
+ return 2000;
+ case 4:
+ Talk(YELL_INTRO_ALY_4);
+ return 1000;
+ case 5:
+ if (Sacrolash)
+ Sacrolash->AI()->Talk(YELL_INTRO_SAC_5);
+ return 2000;
+ case 6:
+ Talk(YELL_INTRO_ALY_6);
+ return 1000;
+ case 7:
+ if (Sacrolash)
+ Sacrolash->AI()->Talk(YELL_INTRO_SAC_7);
+ return 3000;
+ case 8:
+ Talk(YELL_INTRO_ALY_8);
+ return 900000;
}
return 10000;
}
@@ -556,30 +521,23 @@ public:
if (!SisterDeath)
{
- if (instance)
+ Unit* Temp = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_SACROLASH));
+ if (Temp && Temp->isDead())
{
- Unit* Temp = NULL;
- Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH));
- if (Temp && Temp->isDead())
- {
- Talk(YELL_SISTER_SACROLASH_DEAD);
- DoCast(me, SPELL_EMPOWER);
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
- SisterDeath = true;
- }
+ Talk(YELL_SISTER_SACROLASH_DEAD);
+ DoCast(me, SPELL_EMPOWER);
+ me->InterruptSpell(CURRENT_GENERIC_SPELL);
+ SisterDeath = true;
}
}
if (!me->GetVictim())
{
- if (instance)
+ Creature* sisiter = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
+ if (sisiter && !sisiter->isDead() && sisiter->GetVictim())
{
- Creature* sisiter = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH));
- if (sisiter && !sisiter->isDead() && sisiter->GetVictim())
- {
- me->AddThreat(sisiter->GetVictim(), 0.0f);
- DoStartNoMovement(sisiter->GetVictim());
- me->Attack(sisiter->GetVictim(), false);
- }
+ me->AddThreat(sisiter->GetVictim(), 0.0f);
+ DoStartNoMovement(sisiter->GetVictim());
+ me->Attack(sisiter->GetVictim(), false);
}
}
@@ -592,9 +550,7 @@ public:
{
if (!me->IsNonMeleeSpellCasted(false))
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_SHADOW_NOVA);
ShadownovaTimer= 30000+(rand()%5000);
}
@@ -607,8 +563,7 @@ public:
if (!me->IsNonMeleeSpellCasted(false))
{
me->InterruptSpell(CURRENT_GENERIC_SPELL);
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
if (target)
DoCast(target, SPELL_CONFLAGRATION);
ConflagrationTimer = 30000+(rand()%5000);
@@ -661,6 +616,11 @@ public:
} else EnrageTimer -= diff;
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_alythessAI>(creature);
+ };
};
class npc_shadow_image : public CreatureScript
@@ -689,23 +649,23 @@ public:
KillTimer = 15000;
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void SpellHitTarget(Unit* target, const SpellInfo* spell) OVERRIDE
{
switch (spell->Id)
{
- case SPELL_SHADOW_FURY:
- case SPELL_DARK_STRIKE:
- if (!target->HasAura(SPELL_DARK_FLAME))
- {
- if (target->HasAura(SPELL_FLAME_TOUCHED))
+ case SPELL_SHADOW_FURY:
+ case SPELL_DARK_STRIKE:
+ if (!target->HasAura(SPELL_DARK_FLAME))
{
- target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
- target->CastSpell(target, SPELL_DARK_FLAME, true);
- } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
- }
- break;
+ if (target->HasAura(SPELL_FLAME_TOUCHED))
+ {
+ target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
+ target->CastSpell(target, SPELL_DARK_FLAME, true);
+ } else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
+ }
+ break;
}
}
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
index 561ba361f26..ca5dcf5360e 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
@@ -81,14 +81,14 @@ enum Spells
//Other
SPELL_BERSERK = 45078,
SPELL_CLOUD_VISUAL = 45212,
- SPELL_CLOUD_SUMMON = 45884,
+ SPELL_CLOUD_SUMMON = 45884
};
enum PhaseFelmyst
{
PHASE_NONE,
PHASE_GROUND,
- PHASE_FLIGHT,
+ PHASE_FLIGHT
};
enum EventFelmyst
@@ -104,7 +104,7 @@ enum EventFelmyst
EVENT_FLIGHT_SEQUENCE,
EVENT_SUMMON_DEAD,
- EVENT_SUMMON_FOG,
+ EVENT_SUMMON_FOG
};
class boss_felmyst : public CreatureScript
@@ -112,11 +112,6 @@ class boss_felmyst : public CreatureScript
public:
boss_felmyst() : CreatureScript("boss_felmyst") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_felmystAI(creature);
- }
-
struct boss_felmystAI : public ScriptedAI
{
boss_felmystAI(Creature* creature) : ScriptedAI(creature)
@@ -148,8 +143,7 @@ public:
DespawnSummons(NPC_VAPOR_TRAIL);
me->setActive(false);
- if (instance)
- instance->SetData(DATA_FELMYST_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_FELMYST, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -162,8 +156,7 @@ public:
DoCast(me, AURA_NOXIOUS_FUMES, true);
EnterPhase(PHASE_GROUND);
- if (instance)
- instance->SetData(DATA_FELMYST_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_FELMYST, IN_PROGRESS);
}
void AttackStart(Unit* who) OVERRIDE
@@ -173,7 +166,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (phase != PHASE_FLIGHT)
ScriptedAI::MoveInLineOfSight(who);
@@ -193,8 +185,7 @@ public:
{
Talk(YELL_DEATH);
- if (instance)
- instance->SetData(DATA_FELMYST_EVENT, DONE);
+ instance->SetBossState(DATA_FELMYST, DONE);
}
void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
@@ -246,26 +237,26 @@ public:
{
switch (NextPhase)
{
- case PHASE_GROUND:
- me->CastStop(SPELL_FOG_BREATH);
- me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
- me->StopMoving();
- me->SetSpeed(MOVE_RUN, 2.0f);
-
- events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
- events.ScheduleEvent(EVENT_CORROSION, urand(10000, 20000));
- events.ScheduleEvent(EVENT_GAS_NOVA, urand(15000, 20000));
- events.ScheduleEvent(EVENT_ENCAPSULATE, urand(20000, 25000));
- events.ScheduleEvent(EVENT_FLIGHT, 60000);
- break;
- case PHASE_FLIGHT:
- me->SetDisableGravity(true);
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
- uiFlightCount = 0;
- uiBreathCount = 0;
- break;
- default:
- break;
+ case PHASE_GROUND:
+ me->CastStop(SPELL_FOG_BREATH);
+ me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
+ me->StopMoving();
+ me->SetSpeed(MOVE_RUN, 2.0f);
+
+ events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
+ events.ScheduleEvent(EVENT_CORROSION, urand(10000, 20000));
+ events.ScheduleEvent(EVENT_GAS_NOVA, urand(15000, 20000));
+ events.ScheduleEvent(EVENT_ENCAPSULATE, urand(20000, 25000));
+ events.ScheduleEvent(EVENT_FLIGHT, 60000);
+ break;
+ case PHASE_FLIGHT:
+ me->SetDisableGravity(true);
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
+ uiFlightCount = 0;
+ uiBreathCount = 0;
+ break;
+ default:
+ break;
}
phase = NextPhase;
}
@@ -274,133 +265,131 @@ public:
{
switch (uiFlightCount)
{
- case 0:
- //me->AttackStop();
- me->GetMotionMaster()->Clear(false);
- me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- me->StopMoving();
- Talk(YELL_TAKEOFF);
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
- break;
- case 1:
- me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
- break;
- case 2:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
- if (!target)
- target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
-
- if (!target)
+ case 0:
+ //me->AttackStop();
+ me->GetMotionMaster()->Clear(false);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ me->StopMoving();
+ Talk(YELL_TAKEOFF);
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
+ break;
+ case 1:
+ me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
+ break;
+ case 2:
{
- EnterEvadeMode();
- return;
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
+ if (!target)
+ target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID));
+
+ if (!target)
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ if (Creature* Vapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000))
+ {
+ Vapor->AI()->AttackStart(target);
+ me->InterruptNonMeleeSpells(false);
+ DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
+ Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
+ }
+
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
+ break;
}
-
- Creature* Vapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
- if (Vapor)
+ case 3:
{
- Vapor->AI()->AttackStart(target);
- me->InterruptNonMeleeSpells(false);
- DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
- Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
+ DespawnSummons(NPC_VAPOR_TRAIL);
+ //DoCast(me, SPELL_VAPOR_SELECT); need core support
+
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
+ if (!target)
+ target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID));
+
+ if (!target)
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
+ if (Creature* pVapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000))
+ {
+ if (pVapor->AI())
+ pVapor->AI()->AttackStart(target);
+ me->InterruptNonMeleeSpells(false);
+ DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
+ pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
+ }
+
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
+ break;
}
-
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
- break;
- }
- case 3:
- {
- DespawnSummons(NPC_VAPOR_TRAIL);
- //DoCast(me, SPELL_VAPOR_SELECT); need core support
-
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
- if (!target)
- target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
-
- if (!target)
+ case 4:
+ DespawnSummons(NPC_VAPOR_TRAIL);
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
+ break;
+ case 5:
{
- EnterEvadeMode();
- return;
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
+ if (!target)
+ target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID));
+
+ if (!target)
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ breathX = target->GetPositionX();
+ breathY = target->GetPositionY();
+ float x, y, z;
+ target->GetContactPoint(me, x, y, z, 70);
+ me->GetMotionMaster()->MovePoint(0, x, y, z+10);
+ break;
}
-
- //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
- Creature* pVapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
- if (pVapor)
+ case 6:
+ me->SetOrientation(me->GetAngle(breathX, breathY));
+ me->StopMoving();
+ //DoTextEmote("takes a deep breath.", NULL);
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
+ break;
+ case 7:
{
- if (pVapor->AI())
- pVapor->AI()->AttackStart(target);
- me->InterruptNonMeleeSpells(false);
- DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
- pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
+ DoCast(me, SPELL_FOG_BREATH, true);
+ float x, y, z;
+ me->GetPosition(x, y, z);
+ x = 2 * breathX - x;
+ y = 2 * breathY - y;
+ me->GetMotionMaster()->MovePoint(0, x, y, z);
+ events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
+ break;
}
-
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
- break;
- }
- case 4:
- DespawnSummons(NPC_VAPOR_TRAIL);
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
- break;
- case 5:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
- if (!target)
- target = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0);
-
- if (!target)
- {
- EnterEvadeMode();
- return;
- }
-
- breathX = target->GetPositionX();
- breathY = target->GetPositionY();
- float x, y, z;
- target->GetContactPoint(me, x, y, z, 70);
- me->GetMotionMaster()->MovePoint(0, x, y, z+10);
- break;
- }
- case 6:
- me->SetOrientation(me->GetAngle(breathX, breathY));
- me->StopMoving();
- //DoTextEmote("takes a deep breath.", NULL);
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
- break;
- case 7:
- {
- DoCast(me, SPELL_FOG_BREATH, true);
- float x, y, z;
- me->GetPosition(x, y, z);
- x = 2 * breathX - x;
- y = 2 * breathY - y;
- me->GetMotionMaster()->MovePoint(0, x, y, z);
- events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
- break;
- }
- case 8:
- me->CastStop(SPELL_FOG_BREATH);
- me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
- ++uiBreathCount;
- events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
- if (uiBreathCount < 3)
- uiFlightCount = 4;
- break;
- case 9:
- if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
- DoStartMovement(target);
- else
- {
- EnterEvadeMode();
- return;
- }
- break;
- case 10:
- me->SetDisableGravity(false);
- me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
- EnterPhase(PHASE_GROUND);
- AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
- break;
+ case 8:
+ me->CastStop(SPELL_FOG_BREATH);
+ me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
+ ++uiBreathCount;
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
+ if (uiBreathCount < 3)
+ uiFlightCount = 4;
+ break;
+ case 9:
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO))
+ DoStartMovement(target);
+ else
+ {
+ EnterEvadeMode();
+ return;
+ }
+ break;
+ case 10:
+ me->SetDisableGravity(false);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
+ EnterPhase(PHASE_GROUND);
+ AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
+ break;
}
++uiFlightCount;
}
@@ -512,6 +501,11 @@ public:
}
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_felmystAI>(creature);
+ }
};
class npc_felmyst_vapor : public CreatureScript
@@ -531,12 +525,14 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetSpeed(MOVE_RUN, 0.8f);
}
+
void Reset() OVERRIDE { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
DoZoneInCombat();
//DoCast(me, SPELL_VAPOR_FORCE, true); core bug
}
+
void UpdateAI(uint32 /*diff*/) OVERRIDE
{
if (!me->GetVictim())
@@ -565,6 +561,7 @@ public:
me->SetTarget(me->GetGUID());
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 0.01f); // core bug
}
+
void Reset() OVERRIDE { }
void EnterCombat(Unit* /*who*/) OVERRIDE { }
void AttackStart(Unit* /*who*/) OVERRIDE { }
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 9cd929981bf..2a2574ea256 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -44,7 +44,7 @@ enum Yells
SAY_GOOD_AGGRO = 0,
SAY_GOOD_NEAR_DEATH = 1,
- SAY_GOOD_NEAR_DEATH2 = 2,
+ SAY_GOOD_NEAR_DEATH2 = 2
};
enum Spells
@@ -76,20 +76,20 @@ enum Spells
enum SWPActions
{
DO_ENRAGE = 1,
- DO_BANISH = 2,
+ DO_BANISH = 2
};
#define GO_FAILED "You are unable to use this currently."
#define EMOTE_UNABLE_TO_FIND "is unable to find Kalecgos"
-#define FLY_X 1679
-#define FLY_Y 900
-#define FLY_Z 82
+#define FLY_X 1679
+#define FLY_Y 900
+#define FLY_Z 82
-#define CENTER_X 1705
-#define CENTER_Y 930
-#define RADIUS 30
+#define CENTER_X 1705
+#define CENTER_Y 930
+#define RADIUS 30
#define DRAGON_REALM_Z 53.079f
#define DEMON_REALM_Z -74.558f
@@ -103,11 +103,6 @@ class boss_kalecgos : public CreatureScript
public:
boss_kalecgos() : CreatureScript("boss_kalecgos") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_kalecgosAI(creature);
- }
-
struct boss_kalecgosAI : public ScriptedAI
{
boss_kalecgosAI(Creature* creature) : ScriptedAI(creature)
@@ -141,13 +136,10 @@ public:
void Reset() OVERRIDE
{
- if (instance)
- {
- SathGUID = instance->GetData64(DATA_SATHROVARR);
- instance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
- }
+ SathGUID = instance->GetData64(DATA_SATHROVARR);
+ instance->SetBossState(DATA_KALECGOS, NOT_STARTED);
- if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
+ if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID))
Sath->AI()->EnterEvadeMode();
me->setFaction(14);
@@ -158,7 +150,7 @@ public:
me->SetVisible(true);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
}
- me->SetFullHealth();//dunno why it does not resets health at evade..
+ me->SetFullHealth(); //dunno why it does not resets health at evade..
ArcaneBuffetTimer = 8000;
FrostBreathTimer = 15000;
WildMagicTimer = 10000;
@@ -234,6 +226,7 @@ public:
} else ResetTimer -= diff;
return;
}
+
if (!UpdateVictim())
return;
@@ -246,13 +239,13 @@ public:
}
if (HealthBelowPct(10) && !isEnraged)
{
- if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
+ if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID))
Sath->AI()->DoAction(DO_ENRAGE);
DoAction(DO_ENRAGE);
}
if (!isBanished && HealthBelowPct(1))
{
- if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
+ if (Creature* Sath = ObjectAccessor::GetCreature(*me, SathGUID))
{
if (Sath->HasAura(SPELL_BANISH))
{
@@ -317,6 +310,7 @@ public:
SpectralBlastTimer = 1000;
return;
}
+
std::list<Unit*>::const_iterator i = targetList.begin();
advance(i, rand()%targetList.size());
if ((*i))
@@ -331,7 +325,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (bJustReset)//boss is invisible, don't attack
return;
@@ -356,8 +349,7 @@ public:
Talk(SAY_EVIL_AGGRO);
DoZoneInCombat();
- if (instance)
- instance->SetData(DATA_KALECGOS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_KALECGOS, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -396,21 +388,21 @@ public:
{
switch (TalkSequence)
{
- case 1:
- me->setFaction(35);
- TalkTimer = 1000;
- break;
- case 2:
- Talk(SAY_GOOD_PLRWIN);
- TalkTimer = 10000;
- break;
- case 3:
- me->SetDisableGravity(true);
- me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
- TalkTimer = 600000;
- break;
- default:
- break;
+ case 1:
+ me->setFaction(35);
+ TalkTimer = 1000;
+ break;
+ case 2:
+ Talk(SAY_GOOD_PLRWIN);
+ TalkTimer = 10000;
+ break;
+ case 3:
+ me->SetDisableGravity(true);
+ me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
+ TalkTimer = 600000;
+ break;
+ default:
+ break;
}
}
@@ -418,23 +410,28 @@ public:
{
switch (TalkSequence)
{
- case 1:
- Talk(SAY_EVIL_ENRAGE);
- TalkTimer = 3000;
- break;
- case 2:
- me->SetDisableGravity(true);
- me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
- TalkTimer = 15000;
- break;
- case 3:
- EnterEvadeMode();
- break;
- default:
- break;
+ case 1:
+ Talk(SAY_EVIL_ENRAGE);
+ TalkTimer = 3000;
+ break;
+ case 2:
+ me->SetDisableGravity(true);
+ me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
+ TalkTimer = 15000;
+ break;
+ case 3:
+ EnterEvadeMode();
+ break;
+ default:
+ break;
}
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_kalecgosAI>(creature);
+ }
};
class boss_kalec : public CreatureScript
@@ -490,6 +487,7 @@ public:
{
if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
+
if (!UpdateVictim())
return;
@@ -497,26 +495,26 @@ public:
{
switch (YellSequence)
{
- case 0:
- Talk(SAY_GOOD_AGGRO);
- ++YellSequence;
- break;
- case 1:
- if (HealthBelowPct(50))
- {
- Talk(SAY_GOOD_NEAR_DEATH);
+ case 0:
+ Talk(SAY_GOOD_AGGRO);
++YellSequence;
- }
- break;
- case 2:
- if (HealthBelowPct(10))
- {
- Talk(SAY_GOOD_NEAR_DEATH2);
- ++YellSequence;
- }
- break;
- default:
- break;
+ break;
+ case 1:
+ if (HealthBelowPct(50))
+ {
+ Talk(SAY_GOOD_NEAR_DEATH);
+ ++YellSequence;
+ }
+ break;
+ case 2:
+ if (HealthBelowPct(10))
+ {
+ Talk(SAY_GOOD_NEAR_DEATH2);
+ ++YellSequence;
+ }
+ break;
+ default:
+ break;
}
YellTimer = 5000;
}
@@ -610,11 +608,11 @@ public:
if (instance)
{
KalecgosGUID = instance->GetData64(DATA_KALECGOS_DRAGON);
- instance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_KALECGOS, NOT_STARTED);
}
if (KalecGUID)
{
- if (Creature* Kalec = Unit::GetCreature(*me, KalecGUID))
+ if (Creature* Kalec = ObjectAccessor::GetCreature(*me, KalecGUID))
Kalec->setDeathState(JUST_DIED);
KalecGUID = 0;
}
@@ -654,7 +652,7 @@ public:
if (target->GetGUID() == KalecGUID)
{
TeleportAllPlayersBack();
- if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
+ if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
{
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = false;
@@ -670,14 +668,14 @@ public:
Talk(SAY_SATH_DEATH);
me->SetPosition(me->GetPositionX(), me->GetPositionY(), DRAGON_REALM_Z, me->GetOrientation());
TeleportAllPlayersBack();
- if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
+ if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
{
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true;
}
if (instance)
- instance->SetData(DATA_KALECGOS_EVENT, DONE);
+ instance->SetBossState(DATA_KALECGOS, DONE);
}
void TeleportAllPlayersBack()
@@ -716,27 +714,28 @@ public:
{
if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
+
if (!UpdateVictim())
return;
if (CheckTimer <= diff)
{
- Creature* Kalec = Unit::GetCreature(*me, KalecGUID);
+ Creature* Kalec = ObjectAccessor::GetCreature(*me, KalecGUID);
if (!Kalec || !Kalec->IsAlive())
{
- if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
+ if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
Kalecgos->AI()->EnterEvadeMode();
return;
}
if (HealthBelowPct(10) && !isEnraged)
{
- if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
+ if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID))
Kalecgos->AI()->DoAction(DO_ENRAGE);
DoAction(DO_ENRAGE);
}
- Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID);
+ Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID);
if (Kalecgos && !Kalecgos->IsInCombat())
{
me->AI()->EnterEvadeMode();
@@ -778,7 +777,8 @@ public:
if (ShadowBoltTimer <= diff)
{
- if (!(rand()%5))Talk(SAY_SATH_SPELL1);
+ if (!(rand()%5))
+ Talk(SAY_SATH_SPELL1);
DoCast(me, SPELL_SHADOW_BOLT);
ShadowBoltTimer = 7000+(rand()%3000);
} else ShadowBoltTimer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index f1c0fd9cc83..b3982200a10 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -60,7 +60,7 @@ enum Yells
SAY_ANVEENA_IMPRISONED = 0,
SAY_ANVEENA_LOST = 1,
SAY_ANVEENA_KALEC = 2,
- SAY_ANVEENA_GOODBYE = 3,
+ SAY_ANVEENA_GOODBYE = 3
};
/*** Spells used during the encounter ***/
@@ -156,7 +156,7 @@ enum Phase
PHASE_NORMAL = 2, // Kil'Jaeden emerges from the sunwell
PHASE_DARKNESS = 3, // At 85%, he gains few abilities; Kalecgos joins the fight
PHASE_ARMAGEDDON = 4, // At 55%, he gains even more abilities
- PHASE_SACRIFICE = 5, // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns.
+ PHASE_SACRIFICE = 5 // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns.
};
//Timers
@@ -185,7 +185,7 @@ Position DeceiverLocations[3]=
{
{1682.045f, 631.299f, 5.936f, 0.0f},
{1684.099f, 618.848f, 0.589f, 0.0f},
- {1694.170f, 612.272f, 1.416f, 0.0f},
+ {1694.170f, 612.272f, 1.416f, 0.0f}
};
// Locations, where Shield Orbs will spawn
@@ -225,7 +225,7 @@ static Speech Speeches[]=
{SAY_KJ_PHASE5, DATA_KILJAEDEN, 5500},
// use in End sequence?
- {SAY_KALECGOS_GOODBYE, DATA_KALECGOS_KJ, 12000},
+ {SAY_KALECGOS_GOODBYE, DATA_KALECGOS_KJ, 12000}
};
//AI for Kalecgos
@@ -271,13 +271,13 @@ public:
switch (index)
{
case 0:
- return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1));
+ return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1));
case 1:
- return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2));
+ return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2));
case 2:
- return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3));
+ return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3));
case 3:
- return instance->instance->GetGameObject(instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4));
+ return ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4));
}
return NULL;
@@ -368,11 +368,11 @@ public:
if (go->GetUInt32Value(GAMEOBJECT_FACTION) == 35)
{
InstanceScript* instance = go->GetInstanceScript();
- player->SummonCreature(CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
+ player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
go->SetUInt32Value(GAMEOBJECT_FACTION, 0);
- if (Creature* pKalec = Unit::GetCreature(*player, instance->GetData64(DATA_KALECGOS_KJ)))
+ if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_KALECGOS_KJ)))
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
go->Refresh();
@@ -425,7 +425,7 @@ public:
phase = PHASE_DECEIVERS;
if (instance)
- if (Creature* pKalecKJ = Unit::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ)))
+ if (Creature* pKalecKJ = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ)))
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs();
deceiverDeathCount = 0;
bSummonedDeceivers = false;
@@ -438,15 +438,15 @@ public:
{
switch (summoned->GetEntry())
{
- case CREATURE_HAND_OF_THE_DECEIVER:
+ case NPC_HAND_OF_THE_DECEIVER:
summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false);
break;
- case CREATURE_ANVEENA:
+ case NPC_ANVEENA:
summoned->SetDisableGravity(true);
summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
break;
- case CREATURE_KILJAEDEN:
+ case NPC_KILJAEDEN:
summoned->CastSpell(summoned, SPELL_REBIRTH, false);
summoned->AddThreat(me->GetVictim(), 1.0f);
break;
@@ -458,7 +458,7 @@ public:
{
if (uiRandomSayTimer < diff)
{
- if (instance && instance->GetData(DATA_MURU_EVENT) != DONE && instance->GetData(DATA_KILJAEDEN_EVENT) == NOT_STARTED)
+ if (instance && instance->GetBossState(DATA_MURU) != DONE && instance->GetBossState(DATA_KILJAEDEN) == NOT_STARTED)
Talk(SAY_KJ_OFFCOMBAT);
uiRandomSayTimer = 30000;
} else uiRandomSayTimer -= diff;
@@ -466,9 +466,9 @@ public:
if (!bSummonedDeceivers)
{
for (uint8 i = 0; i < 3; ++i)
- me->SummonCreature(CREATURE_HAND_OF_THE_DECEIVER, DeceiverLocations[i], TEMPSUMMON_DEAD_DESPAWN, 0);
+ me->SummonCreature(NPC_HAND_OF_THE_DECEIVER, DeceiverLocations[i], TEMPSUMMON_DEAD_DESPAWN, 0);
- DoSpawnCreature(CREATURE_ANVEENA, 0, 0, 40, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
+ DoSpawnCreature(NPC_ANVEENA, 0, 0, 40, 0, TEMPSUMMON_DEAD_DESPAWN, 0);
DoCast(me, SPELL_ANVEENA_ENERGY_DRAIN);
bSummonedDeceivers = true;
}
@@ -477,7 +477,7 @@ public:
{
me->RemoveAurasDueToSpell(SPELL_ANVEENA_ENERGY_DRAIN);
phase = PHASE_NORMAL;
- DoSpawnCreature(CREATURE_KILJAEDEN, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
+ DoSpawnCreature(NPC_KILJAEDEN, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
}
}
};
@@ -489,11 +489,6 @@ class boss_kiljaeden : public CreatureScript
public:
boss_kiljaeden() : CreatureScript("boss_kiljaeden") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_kiljaedenAI(creature);
- }
-
struct boss_kiljaedenAI : public ScriptedAI
{
boss_kiljaedenAI(Creature* creature) : ScriptedAI(creature), summons(me)
@@ -559,11 +554,9 @@ public:
OrbActivated = false;
SpeechBegins = true;
- if (instance)
- {
- if (Creature* pKalec = Unit::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
- pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
- }
+ if (Creature* pKalec = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
+ pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
+
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 12);
ChangeTimers(false, 0);
summons.DespawnAll();
@@ -590,7 +583,7 @@ public:
void JustSummoned(Creature* summoned) OVERRIDE
{
- if (summoned->GetEntry() == CREATURE_ARMAGEDDON_TARGET)
+ if (summoned->GetEntry() == NPC_ARMAGEDDON_TARGET)
{
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -607,9 +600,7 @@ public:
{
Talk(SAY_KJ_DEATH);
summons.DespawnAll();
-
- if (instance)
- instance->SetData(DATA_KILJAEDEN_EVENT, DONE);
+ instance->SetBossState(DATA_KILJAEDEN, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -624,11 +615,8 @@ public:
summons.DespawnAll();
// Reset the controller
- if (instance)
- {
- if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
- CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->Reset();
- }
+ if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
+ CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->Reset();
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -657,7 +645,7 @@ public:
{
float x, y, z;
target->GetPosition(x, y, z);
- if (Creature* pSinisterReflection = me->SummonCreature(CREATURE_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0))
+ if (Creature* pSinisterReflection = me->SummonCreature(NPC_SINISTER_REFLECTION, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0))
{
pSinisterReflection->SetDisplayId(target->GetDisplayId());
pSinisterReflection->AI()->AttackStart(target);
@@ -709,15 +697,12 @@ public:
if (Speeches[speechCount].timer < SpeechTimer)
{
SpeechTimer = 0;
- if (instance)
- {
- if (Creature* speechCreature = Unit::GetCreature(*me, instance->GetData64(Speeches[speechCount].creature)))
- speechCreature->AI()->Talk(Speeches[speechCount].textid);
- if (speechCount == 12)
- if (Creature* pAnveena = Unit::GetCreature(*me, instance->GetData64(DATA_ANVEENA)))
- pAnveena->CastSpell(me, SPELL_SACRIFICE_OF_ANVEENA, false);
- // ChangeTimers(true, 10000); // Kil should do an emote while screaming without attacking for 10 seconds
- }
+ if (Creature* speechCreature = ObjectAccessor::GetCreature(*me, instance->GetData64(Speeches[speechCount].creature)))
+ speechCreature->AI()->Talk(Speeches[speechCount].textid);
+ if (speechCount == 12)
+ if (Creature* pAnveena = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ANVEENA)))
+ pAnveena->CastSpell(me, SPELL_SACRIFICE_OF_ANVEENA, false);
+ // ChangeTimers(true, 10000); // Kil should do an emote while screaming without attacking for 10 seconds
if (speechCount == speechPhaseEnd)
TimerIsDeactivated[TIMER_SPEECH]=true;
speechCount++;
@@ -769,7 +754,7 @@ public:
float sx, sy;
sx = ShieldOrbLocations[0][0] + std::sin(ShieldOrbLocations[i][0]);
sy = ShieldOrbLocations[0][1] + std::sin(ShieldOrbLocations[i][1]);
- me->SummonCreature(CREATURE_SHIELD_ORB, sx, sy, SHIELD_ORB_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
+ me->SummonCreature(NPC_SHIELD_ORB, sx, sy, SHIELD_ORB_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
}
Timer[TIMER_SUMMON_SHILEDORB] = urand(30000, 60000); // 30-60seconds cooldown
Timer[TIMER_SOUL_FLAY] = 2000;
@@ -814,19 +799,18 @@ public:
}
break;
case TIMER_ORBS_EMPOWER: //Phase 3
- if (instance)
- if (Creature* pKalec = Unit::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
+ if (Creature* pKalec = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
+ {
+ switch (Phase)
{
- switch (Phase)
- {
case PHASE_SACRIFICE:
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true);
break;
default:
CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false);
break;
- }
}
+ }
OrbActivated = true;
TimerIsDeactivated[TIMER_ORBS_EMPOWER] = true;
break;
@@ -841,7 +825,7 @@ public:
{
float x, y, z;
target->GetPosition(x, y, z);
- me->SummonCreature(CREATURE_ARMAGEDDON_TARGET, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
+ me->SummonCreature(NPC_ARMAGEDDON_TARGET, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 15000);
}
Timer[TIMER_ARMAGEDDON] = 2000; // No, I'm not kidding
break;
@@ -893,6 +877,11 @@ public:
}
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_kiljaedenAI>(creature);
+ }
};
//AI for Hand of the Deceiver
@@ -901,11 +890,6 @@ class npc_hand_of_the_deceiver : public CreatureScript
public:
npc_hand_of_the_deceiver() : CreatureScript("npc_hand_of_the_deceiver") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_hand_of_the_deceiverAI(creature);
- }
-
struct npc_hand_of_the_deceiverAI : public ScriptedAI
{
npc_hand_of_the_deceiverAI(Creature* creature) : ScriptedAI(creature)
@@ -923,8 +907,7 @@ public:
/// @todo Timers!
ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
FelfirePortalTimer = 20000;
- if (instance)
- instance->SetData(DATA_KILJAEDEN_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_KILJAEDEN, NOT_STARTED);
}
void JustSummoned(Creature* summoned) OVERRIDE
@@ -935,12 +918,10 @@ public:
void EnterCombat(Unit* who) OVERRIDE
{
- if (instance)
- {
- instance->SetData(DATA_KILJAEDEN_EVENT, IN_PROGRESS);
- if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
- pControl->AddThreat(who, 1.0f);
- }
+ instance->SetBossState(DATA_KILJAEDEN, IN_PROGRESS);
+ if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
+ pControl->AddThreat(who, 1.0f);
+
me->InterruptNonMeleeSpells(true);
}
@@ -949,7 +930,7 @@ public:
if (!instance)
return;
- if (Creature* pControl = Unit::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
+ if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER)))
++(CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount);
}
@@ -977,7 +958,7 @@ public:
// Felfire Portal - Creatres a portal, that spawns Volatile Felfire Fiends, which do suicide bombing.
if (FelfirePortalTimer <= diff)
{
- if (Creature* pPortal = DoSpawnCreature(CREATURE_FELFIRE_PORTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
+ if (Creature* pPortal = DoSpawnCreature(NPC_FELFIRE_PORTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
{
ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList();
for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
@@ -993,6 +974,11 @@ public:
DoMeleeAttackIfReady();
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<npc_hand_of_the_deceiverAI>(creature);
+ }
};
//AI for Felfire Portal
@@ -1034,7 +1020,7 @@ public:
if (uiSpawnFiendTimer <= diff)
{
- if (Creature* pFiend = DoSpawnCreature(CREATURE_VOLATILE_FELFIRE_FIEND, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000))
+ if (Creature* pFiend = DoSpawnCreature(NPC_VOLATILE_FELFIRE_FIEND, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000))
pFiend->AddThreat(SelectTarget(SELECT_TARGET_RANDOM, 0), 100000.0f);
uiSpawnFiendTimer = urand(4000, 8000);
} else uiSpawnFiendTimer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index e36310f85b1..8da162bae14 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -30,55 +30,56 @@ SDComment: all sounds, black hole effect triggers to often (46228)
// Muru & Entropius's spells
enum Spells
{
- SPELL_ENRAGE = 26662,
+ SPELL_ENRAGE = 26662,
// Muru's spells
SPELL_NEGATIVE_ENERGY = 46009, //(this trigger 46008)
- SPELL_DARKNESS = 45999,
- SPELL_OPEN_ALL_PORTALS = 46177,
+ SPELL_DARKNESS = 45999,
+ SPELL_OPEN_ALL_PORTALS = 46177,
SPELL_OPEN_PORTAL = 45977,
- SPELL_OPEN_PORTAL_2 = 45976,
- SPELL_SUMMON_BERSERKER = 46037,
- SPELL_SUMNON_FURY_MAGE = 46038,
- SPELL_SUMMON_VOID_SENTINEL = 45988,
- SPELL_SUMMON_ENTROPIUS = 46217,
+ SPELL_OPEN_PORTAL_2 = 45976,
+ SPELL_SUMMON_BERSERKER = 46037,
+ SPELL_SUMNON_FURY_MAGE = 46038,
+ SPELL_SUMMON_VOID_SENTINEL = 45988,
+ SPELL_SUMMON_ENTROPIUS = 46217,
// Entropius's spells
- SPELL_DARKNESS_E = 46269,
- SPELL_BLACKHOLE = 46282,
- SPELL_NEGATIVE_ENERGY_E = 46284,
+ SPELL_DARKNESS_E = 46269,
+ SPELL_BLACKHOLE = 46282,
+ SPELL_NEGATIVE_ENERGY_E = 46284,
SPELL_ENTROPIUS_SPAWN = 46223,
// Shadowsword Berserker's spells
- SPELL_FLURRY = 46160,
- SPELL_DUAL_WIELD = 29651,
+ SPELL_FLURRY = 46160,
+ SPELL_DUAL_WIELD = 29651,
// Shadowsword Fury Mage's spells
- SPELL_FEL_FIREBALL = 46101,
- SPELL_SPELL_FURY = 46102,
+ SPELL_FEL_FIREBALL = 46101,
+ SPELL_SPELL_FURY = 46102,
// Void Sentinel's spells
- SPELL_SHADOW_PULSE = 46087,
- SPELL_VOID_BLAST = 46161,
+ SPELL_SHADOW_PULSE = 46087,
+ SPELL_VOID_BLAST = 46161,
// Void Spawn's spells
- SPELL_SHADOW_BOLT_VOLLEY = 46082,
+ SPELL_SHADOW_BOLT_VOLLEY = 46082,
//Dark Fiend Spells
- SPELL_DARKFIEND_AOE = 45944,
- SPELL_DARKFIEND_VISUAL = 45936,
- SPELL_DARKFIEND_SKIN = 45934,
+ SPELL_DARKFIEND_AOE = 45944,
+ SPELL_DARKFIEND_VISUAL = 45936,
+ SPELL_DARKFIEND_SKIN = 45934,
//Black Hole Spells
SPELL_BLACKHOLE_SPAWN = 46242,
- SPELL_BLACKHOLE_GROW = 46228
+ SPELL_BLACKHOLE_GROW = 46228
};
-enum BossTimers{
- TIMER_DARKNESS = 0,
- TIMER_HUMANOIDES = 1,
- TIMER_PHASE = 2,
- TIMER_SENTINEL = 3
+enum BossTimers
+{
+ TIMER_DARKNESS = 0,
+ TIMER_HUMANOIDES = 1,
+ TIMER_PHASE = 2,
+ TIMER_SENTINEL = 3
};
float DarkFiends[8][4] =
@@ -88,32 +89,28 @@ float DarkFiends[8][4] =
{1801.98f, 633.62f, 69.74f, 5.71f},
{1830.88f, 629.99f, 69.73f, 3.52f},
{1800.38f, 621.41f, 69.74f, 0.22f},
- {1808.3f, 612.45f, 69.73f, 1.02f},
- {1823.9f, 639.69f, 69.74f, 4.12f},
+ {1808.3f, 612.45f, 69.73f, 1.02f},
+ {1823.9f, 639.69f, 69.74f, 4.12f},
{1811.85f, 640.46f, 69.73f, 4.97f}
};
float Humanoides[6][5] =
{
- {CREATURE_FURY_MAGE, 1780.16f, 666.83f, 71.19f, 5.21f},
- {CREATURE_FURY_MAGE, 1847.93f, 600.30f, 71.30f, 2.57f},
- {CREATURE_BERSERKER, 1779.97f, 660.64f, 71.19f, 5.28f},
- {CREATURE_BERSERKER, 1786.2f, 661.01f, 71.19f, 4.51f},
- {CREATURE_BERSERKER, 1845.17f, 602.63f, 71.28f, 2.43f},
- {CREATURE_BERSERKER, 1842.91f, 599.93f, 71.23f, 2.44f}
+ {NPC_FURY_MAGE, 1780.16f, 666.83f, 71.19f, 5.21f},
+ {NPC_FURY_MAGE, 1847.93f, 600.30f, 71.30f, 2.57f},
+ {NPC_BERSERKER, 1779.97f, 660.64f, 71.19f, 5.28f},
+ {NPC_BERSERKER, 1786.2f, 661.01f, 71.19f, 4.51f},
+ {NPC_BERSERKER, 1845.17f, 602.63f, 71.28f, 2.43f},
+ {NPC_BERSERKER, 1842.91f, 599.93f, 71.23f, 2.44f}
};
uint32 EnrageTimer = 600000;
+
class boss_entropius : public CreatureScript
{
public:
boss_entropius() : CreatureScript("boss_entropius") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_entropiusAI(creature);
- }
-
struct boss_entropiusAI : public ScriptedAI
{
boss_entropiusAI(Creature* creature) : ScriptedAI(creature), Summons(me)
@@ -133,8 +130,7 @@ public:
Summons.DespawnAll();
- if (instance)
- instance->SetData(DATA_MURU_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MURU, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -142,22 +138,21 @@ public:
DoCastAOE(SPELL_NEGATIVE_ENERGY_E, true);
DoCast(me, SPELL_ENTROPIUS_SPAWN, false);
- if (instance)
- instance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MURU, IN_PROGRESS);
}
void JustSummoned(Creature* summoned) OVERRIDE
{
switch (summoned->GetEntry())
{
- case CREATURE_DARK_FIENDS:
+ case NPC_DARK_FIENDS:
summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
break;
- case CREATURE_DARKNESS:
+ case NPC_DARKNESS:
summoned->AddUnitState(UNIT_STATE_STUNNED);
float x, y, z, o;
summoned->GetHomePosition(x, y, z, o);
- me->SummonCreature(CREATURE_DARK_FIENDS, x, y, z, o, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ me->SummonCreature(NPC_DARK_FIENDS, x, y, z, o, TEMPSUMMON_CORPSE_DESPAWN, 0);
break;
}
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
@@ -167,9 +162,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
Summons.DespawnAll();
-
- if (instance)
- instance->SetData(DATA_MURU_EVENT, DONE);
+ instance->SetBossState(DATA_MURU, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -201,6 +194,11 @@ public:
DoMeleeAttackIfReady();
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_entropiusAI>(creature);
+ }
};
class boss_muru : public CreatureScript
@@ -208,11 +206,6 @@ class boss_muru : public CreatureScript
public:
boss_muru() : CreatureScript("boss_muru") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_muruAI(creature);
- }
-
struct boss_muruAI : public ScriptedAI
{
boss_muruAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
@@ -244,17 +237,13 @@ public:
me->SetVisible(true);
Summons.DespawnAll();
-
- if (instance)
- instance->SetData(DATA_MURU_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MURU, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
DoCastAOE(SPELL_NEGATIVE_ENERGY, false);
-
- if (instance)
- instance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MURU, IN_PROGRESS);
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
@@ -275,10 +264,10 @@ public:
{
switch (summoned->GetEntry())
{
- case BOSS_ENTROPIUS:
+ case NPC_ENTROPIUS:
me->SetVisible(false);
break;
- case CREATURE_DARK_FIENDS:
+ case NPC_DARK_FIENDS:
summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
break;
}
@@ -295,9 +284,7 @@ public:
{
if (Timer[TIMER_PHASE] <= diff)
{
- if (!instance)
- return;
- switch (instance->GetData(DATA_MURU_EVENT))
+ switch (instance->GetBossState(DATA_MURU))
{
case NOT_STARTED:
Reset();
@@ -306,6 +293,8 @@ public:
Phase = 4;
me->DisappearAndDie();
break;
+ default:
+ break;
}
Timer[TIMER_PHASE] = 3000;
} else Timer[TIMER_PHASE] -= diff;
@@ -334,7 +323,7 @@ public:
{
DarkFiend = false;
for (uint8 j = 0; j < 8; ++j)
- me->SummonCreature(CREATURE_DARK_FIENDS, DarkFiends[j][0], DarkFiends[j][1], DarkFiends[j][2], DarkFiends[j][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
+ me->SummonCreature(NPC_DARK_FIENDS, DarkFiends[j][0], DarkFiends[j][1], DarkFiends[j][2], DarkFiends[j][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
Timer[TIMER_DARKNESS] = 42000;
}
break;
@@ -358,14 +347,21 @@ public:
}
}
- //Timer
+ // Timer
for (uint8 i = 0; i < 4; ++i)
{
- if (i != TIMER_PHASE)Timer[i] -= diff;
- else if (Phase == 2) Timer[i] -= diff;
+ if (i != TIMER_PHASE)
+ Timer[i] -= diff;
+ else if (Phase == 2)
+ Timer[i] -= diff;
}
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetSunwellPlateauAI<boss_muruAI>(creature);
+ }
};
class npc_muru_portal : public CreatureScript
@@ -438,7 +434,7 @@ public:
{
if (!SummonSentinel)
{
- if (InAction && instance && instance->GetData(DATA_MURU_EVENT) == NOT_STARTED)
+ if (InAction && instance && instance->GetBossState(DATA_MURU) == NOT_STARTED)
Reset();
return;
}
@@ -525,7 +521,7 @@ public:
struct npc_void_sentinelAI : public ScriptedAI
{
- npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) { }
uint32 PulseTimer;
uint32 VoidBlastTimer;
@@ -543,7 +539,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
for (uint8 i = 0; i < 8; ++i)
- me->SummonCreature(CREATURE_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
+ me->SummonCreature(NPC_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
}
void UpdateAI(uint32 diff) OVERRIDE
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
index 0f23cd67ab3..4bc42921402 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,19 +15,10 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Sunwell_Plateau
-SD%Complete: 25
-SDComment: VERIFY SCRIPT
-SDCategory: Sunwell_Plateau
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
-#include "sunwell_plateau.h"
#include "Player.h"
-
-#define MAX_ENCOUNTER 6
+#include "sunwell_plateau.h"
/* Sunwell Plateau:
0 - Kalecgos and Sathrovarr
@@ -39,268 +29,256 @@ EndScriptData */
5 - Kil'Jaeden
*/
-class instance_sunwell_plateau : public InstanceMapScript
+DoorData const doorData[] =
{
-public:
- instance_sunwell_plateau() : InstanceMapScript("instance_sunwell_plateau", 580) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_sunwell_plateau_InstanceMapScript(map);
- }
-
- struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript
- {
- instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map) { }
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- /** Creatures **/
- uint64 Kalecgos_Dragon;
- uint64 Kalecgos_Human;
- uint64 Sathrovarr;
- uint64 Brutallus;
- uint64 Madrigosa;
- uint64 Felmyst;
- uint64 Alythess;
- uint64 Sacrolash;
- uint64 Muru;
- uint64 KilJaeden;
- uint64 KilJaedenController;
- uint64 Anveena;
- uint64 KalecgosKJ;
- uint32 SpectralPlayers;
-
- /** GameObjects **/
- uint64 ForceField; // Kalecgos Encounter
- uint64 KalecgosWall[2];
- uint64 FireBarrier; // Felmysts Encounter
- uint64 MurusGate[2]; // Murus Encounter
+ { GO_FIRE_BARRIER, DATA_FELMYST, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_MURUS_GATE_1, DATA_MURU, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_MURUS_GATE_2, DATA_MURU, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_BOSS_COLLISION_1, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_BOSS_COLLISION_2, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_FORCE_FIELD, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
- /*** Misc ***/
- uint32 SpectralRealmTimer;
- std::vector<uint64> SpectralRealmList;
+class instance_sunwell_plateau : public InstanceMapScript
+{
+ public:
+ instance_sunwell_plateau() : InstanceMapScript(SunwellPlateauScriptName, 580) { }
- void Initialize() OVERRIDE
+ struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- /*** Creatures ***/
- Kalecgos_Dragon = 0;
- Kalecgos_Human = 0;
- Sathrovarr = 0;
- Brutallus = 0;
- Madrigosa = 0;
- Felmyst = 0;
- Alythess = 0;
- Sacrolash = 0;
- Muru = 0;
- KilJaeden = 0;
- KilJaedenController = 0;
- Anveena = 0;
- KalecgosKJ = 0;
- SpectralPlayers = 0;
+ instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- /*** GameObjects ***/
- ForceField = 0;
- FireBarrier = 0;
- MurusGate[0] = 0;
- MurusGate[1] = 0;
- KalecgosWall[0] = 0;
- KalecgosWall[1] = 0;
+ KalecgosDragonGUID = 0;
+ KalecgosHumanGUID = 0;
+ SathrovarrGUID = 0;
+ BrutallusGUID = 0;
+ MadrigosaGUID = 0;
+ FelmystGUID = 0;
+ AlythessGUID = 0;
+ SacrolashGUID = 0;
+ MuruGUID = 0;
+ KilJaedenGUID = 0;
+ KilJaedenControllerGUID = 0;
+ AnveenaGUID = 0;
+ KalecgosKjGUID = 0;
+ SpectralPlayers = 0;
- /*** Misc ***/
- SpectralRealmTimer = 5000;
- }
+ SpectralRealmTimer = 5000;
+ }
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
+ Player const* GetPlayerInMap() const
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
- return false;
- }
+ if (!players.isEmpty())
+ {
+ for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ {
+ Player* player = itr->GetSource();
+ if (player && !player->HasAura(45839, 0))
+ return player;
+ }
+ }
+ else
+ TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
- Player const* GetPlayerInMap() const
- {
- Map::PlayerList const& players = instance->GetPlayers();
+ return NULL;
+ }
- if (!players.isEmpty())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ switch (creature->GetEntry())
{
- Player* player = itr->GetSource();
- if (player && !player->HasAura(45839, 0))
- return player;
+ case NPC_KALECGOS:
+ KalecgosDragonGUID = creature->GetGUID();
+ break;
+ case NPC_KALEC:
+ KalecgosHumanGUID = creature->GetGUID();
+ break;
+ case NPC_SATHROVARR:
+ SathrovarrGUID = creature->GetGUID();
+ break;
+ case NPC_BRUTALLUS:
+ BrutallusGUID = creature->GetGUID();
+ break;
+ case NPC_MADRIGOSA:
+ MadrigosaGUID = creature->GetGUID();
+ break;
+ case NPC_FELMYST:
+ FelmystGUID = creature->GetGUID();
+ break;
+ case NPC_GRAND_WARLOCK_ALYTHESS:
+ AlythessGUID = creature->GetGUID();
+ break;
+ case NPC_LADY_SACROLASH:
+ SacrolashGUID = creature->GetGUID();
+ break;
+ case NPC_MURU:
+ MuruGUID = creature->GetGUID();
+ break;
+ case NPC_KILJAEDEN:
+ KilJaedenGUID = creature->GetGUID();
+ break;
+ case NPC_KILJAEDEN_CONTROLLER:
+ KilJaedenControllerGUID = creature->GetGUID();
+ break;
+ case NPC_ANVEENA:
+ AnveenaGUID = creature->GetGUID();
+ break;
+ case NPC_KALECGOS_KJ:
+ KalecgosKjGUID = creature->GetGUID();
+ break;
+ default:
+ break;
}
}
- else
- TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
-
- return NULL;
- }
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case 24850: Kalecgos_Dragon = creature->GetGUID(); break;
- case 24891: Kalecgos_Human = creature->GetGUID(); break;
- case 24892: Sathrovarr = creature->GetGUID(); break;
- case 24882: Brutallus = creature->GetGUID(); break;
- case 24895: Madrigosa = creature->GetGUID(); break;
- case 25038: Felmyst = creature->GetGUID(); break;
- case 25166: Alythess = creature->GetGUID(); break;
- case 25165: Sacrolash = creature->GetGUID(); break;
- case 25741: Muru = creature->GetGUID(); break;
- case 25315: KilJaeden = creature->GetGUID(); break;
- case 25608: KilJaedenController = creature->GetGUID(); break;
- case 26046: Anveena = creature->GetGUID(); break;
- case 25319: KalecgosKJ = creature->GetGUID(); break;
+ switch (go->GetEntry())
+ {
+ case GO_FORCE_FIELD:
+ case GO_BOSS_COLLISION_1:
+ case GO_BOSS_COLLISION_2:
+ case GO_FIRE_BARRIER:
+ case GO_MURUS_GATE_1:
+ case GO_MURUS_GATE_2:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case 188421: ForceField = go->GetGUID(); break;
- case 188523: KalecgosWall[0] = go->GetGUID(); break;
- case 188524: KalecgosWall[0] = go->GetGUID(); break;
- case 188075:
- if (m_auiEncounter[2] == DONE)
- HandleGameObject(0, true, go);
- FireBarrier = go->GetGUID();
- break;
- case 187990: MurusGate[0] = go->GetGUID(); break;
- case 188118:
- if (m_auiEncounter[4] == DONE)
- HandleGameObject(0, true, go);
- MurusGate[1]= go->GetGUID();
- break;
+ switch (go->GetEntry())
+ {
+ case GO_FIRE_BARRIER:
+ case GO_MURUS_GATE_1:
+ case GO_MURUS_GATE_2:
+ case GO_BOSS_COLLISION_1:
+ case GO_BOSS_COLLISION_2:
+ case GO_FORCE_FIELD:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- }
- uint32 GetData(uint32 id) const OVERRIDE
- {
- switch (id)
+ uint64 GetData64(uint32 id) const OVERRIDE
{
- case DATA_KALECGOS_EVENT: return m_auiEncounter[0];
- case DATA_BRUTALLUS_EVENT: return m_auiEncounter[1];
- case DATA_FELMYST_EVENT: return m_auiEncounter[2];
- case DATA_EREDAR_TWINS_EVENT: return m_auiEncounter[3];
- case DATA_MURU_EVENT: return m_auiEncounter[4];
- case DATA_KILJAEDEN_EVENT: return m_auiEncounter[5];
+ switch (id)
+ {
+ case DATA_KALECGOS_DRAGON:
+ return KalecgosDragonGUID;
+ case DATA_KALECGOS_HUMAN:
+ return KalecgosHumanGUID;
+ case DATA_SATHROVARR:
+ return SathrovarrGUID;
+ case DATA_BRUTALLUS:
+ return BrutallusGUID;
+ case DATA_MADRIGOSA:
+ return MadrigosaGUID;
+ case DATA_FELMYST:
+ return FelmystGUID;
+ case DATA_ALYTHESS:
+ return AlythessGUID;
+ case DATA_SACROLASH:
+ return SacrolashGUID;
+ case DATA_MURU:
+ return MuruGUID;
+ case DATA_KILJAEDEN:
+ return KilJaedenGUID;
+ case DATA_KILJAEDEN_CONTROLLER:
+ return KilJaedenControllerGUID;
+ case DATA_ANVEENA:
+ return AnveenaGUID;
+ case DATA_KALECGOS_KJ:
+ return KalecgosKjGUID;
+ case DATA_PLAYER_GUID:
+ {
+ Player const* target = GetPlayerInMap();
+ return target ? target->GetGUID() : 0;
+ }
+ default:
+ break;
+ }
+ return 0;
}
- return 0;
- }
- uint64 GetData64(uint32 id) const OVERRIDE
- {
- switch (id)
+ std::string GetSaveData() OVERRIDE
{
- case DATA_KALECGOS_DRAGON: return Kalecgos_Dragon;
- case DATA_KALECGOS_HUMAN: return Kalecgos_Human;
- case DATA_SATHROVARR: return Sathrovarr;
- case DATA_GO_FORCEFIELD: return ForceField;
- case DATA_BRUTALLUS: return Brutallus;
- case DATA_MADRIGOSA: return Madrigosa;
- case DATA_FELMYST: return Felmyst;
- case DATA_ALYTHESS: return Alythess;
- case DATA_SACROLASH: return Sacrolash;
- case DATA_MURU: return Muru;
- case DATA_KILJAEDEN: return KilJaeden;
- case DATA_KILJAEDEN_CONTROLLER: return KilJaedenController;
- case DATA_ANVEENA: return Anveena;
- case DATA_KALECGOS_KJ: return KalecgosKJ;
- case DATA_PLAYER_GUID:
- Player const* target = GetPlayerInMap();
- return target ? target->GetGUID() : 0;
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "S P " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- return 0;
- }
- void SetData(uint32 id, uint32 data) OVERRIDE
- {
- switch (id)
+ void Load(char const* str) OVERRIDE
{
- case DATA_KALECGOS_EVENT:
- {
- if (data == NOT_STARTED || data == DONE)
- {
- HandleGameObject(ForceField, true);
- HandleGameObject(KalecgosWall[0], true);
- HandleGameObject(KalecgosWall[1], true);
- }
- else if (data == IN_PROGRESS)
- {
- HandleGameObject(ForceField, false);
- HandleGameObject(KalecgosWall[0], false);
- HandleGameObject(KalecgosWall[1], false);
- }
- m_auiEncounter[0] = data;
- }
- break;
- case DATA_BRUTALLUS_EVENT: m_auiEncounter[1] = data; break;
- case DATA_FELMYST_EVENT:
- if (data == DONE)
- HandleGameObject(FireBarrier, true);
- m_auiEncounter[2] = data; break;
- case DATA_EREDAR_TWINS_EVENT: m_auiEncounter[3] = data; break;
- case DATA_MURU_EVENT:
- switch (data)
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'S' && dataHead2 == 'P')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
{
- case DONE:
- HandleGameObject(MurusGate[0], true);
- HandleGameObject(MurusGate[1], true);
- break;
- case IN_PROGRESS:
- HandleGameObject(MurusGate[0], false);
- HandleGameObject(MurusGate[1], false);
- break;
- case NOT_STARTED:
- HandleGameObject(MurusGate[0], true);
- HandleGameObject(MurusGate[1], false);
- break;
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
}
- m_auiEncounter[4] = data; break;
- case DATA_KILJAEDEN_EVENT: m_auiEncounter[5] = data; break;
- }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- if (data == DONE)
- SaveToDB();
- }
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
- std::ostringstream stream;
- stream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' '
- << m_auiEncounter[4] << ' ' << m_auiEncounter[5];
+ protected:
+ uint64 KalecgosDragonGUID;
+ uint64 KalecgosHumanGUID;
+ uint64 SathrovarrGUID;
+ uint64 BrutallusGUID;
+ uint64 MadrigosaGUID;
+ uint64 FelmystGUID;
+ uint64 AlythessGUID;
+ uint64 SacrolashGUID;
+ uint64 MuruGUID;
+ uint64 KilJaedenGUID;
+ uint64 KilJaedenControllerGUID;
+ uint64 AnveenaGUID;
+ uint64 KalecgosKjGUID;
+ uint32 SpectralPlayers;
- OUT_SAVE_INST_DATA_COMPLETE;
- return stream.str();
- }
+ uint32 SpectralRealmTimer;
+ std::vector<uint64> SpectralRealmList;
+ };
- void Load(char const* in) OVERRIDE
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(in);
- std::istringstream stream(in);
- stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
- >> m_auiEncounter[4] >> m_auiEncounter[5];
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
- m_auiEncounter[i] = NOT_STARTED;
- OUT_LOAD_INST_DATA_COMPLETE;
+ return new instance_sunwell_plateau_InstanceMapScript(map);
}
- };
};
void AddSC_instance_sunwell_plateau()
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
index 343720dbdb1..d2025a7b2b9 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,94 +15,105 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_SUNWELLPLATEAU_H
-#define DEF_SUNWELLPLATEAU_H
+#ifndef SUNWELL_PLATEAU_H
+#define SUNWELL_PLATEAU_H
-/*** Encounters ***/
-enum Data
-{
- DATA_KALECGOS_EVENT,
- DATA_BRUTALLUS_EVENT,
- DATA_FELMYST_EVENT,
- DATA_EREDAR_TWINS_EVENT,
- DATA_MURU_EVENT,
- DATA_KILJAEDEN_EVENT,
-};
+#define SunwellPlateauScriptName "instance_sunwell_plateau"
+
+uint32 const EncounterCount = 6;
-enum Data64
+enum DataTypes
{
- /*** Creatures ***/
+ // Encounter States/Boss GUIDs
+ DATA_KALECGOS = 0,
+ DATA_BRUTALLUS = 1,
+ DATA_FELMYST = 2,
+ DATA_EREDAR_TWINS = 3,
+ DATA_MURU = 4,
+ DATA_KILJAEDEN = 5,
+
DATA_KALECGOS_DRAGON,
DATA_KALECGOS_HUMAN,
DATA_SATHROVARR,
- DATA_BRUTALLUS,
DATA_MADRIGOSA,
- DATA_FELMYST,
DATA_ALYTHESS,
DATA_SACROLASH,
- DATA_MURU,
- DATA_KILJAEDEN,
DATA_KILJAEDEN_CONTROLLER,
DATA_ANVEENA,
DATA_KALECGOS_KJ,
- /*** GameObjects ***/
- DATA_GO_FORCEFIELD,
+ // GameObject GUIDs
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3,
DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4,
- /*** Misc ***/
- DATA_PLAYER_GUID,
+ // Misc
+ DATA_PLAYER_GUID
};
-enum Creatures
+enum CreatureIds
{
- BOSS_MURU = 25741,
- BOSS_ENTROPIUS = 25840,
- NPC_KALECGOS = 24850,
- NPC_KALEC = 24891,
- NPC_SATHROVARR = 24892,
+ NPC_MURU = 25741,
+ NPC_ENTROPIUS = 25840,
+ NPC_KALECGOS = 24850,
+ NPC_KALEC = 24891,
+ NPC_SATHROVARR = 24892,
+ NPC_BRUTALLUS = 24882,
+ NPC_MADRIGOSA = 24895,
+ NPC_FELMYST = 25038,
- NPC_DEAD = 25268,
- NPC_FLIGHT_LEFT = 25357,
- NPC_FLIGHT_RIGHT = 25358,
- NPC_DEATH_CLOUD = 25703,
- NPC_VAPOR = 25265,
- NPC_VAPOR_TRAIL = 25267,
+ NPC_DEAD = 25268,
+ NPC_FLIGHT_LEFT = 25357,
+ NPC_FLIGHT_RIGHT = 25358,
+ NPC_DEATH_CLOUD = 25703,
+ NPC_VAPOR = 25265,
+ NPC_VAPOR_TRAIL = 25267,
- NPC_GRAND_WARLOCK_ALYTHESS = 25166,
- NPC_SHADOW_IMAGE = 25214,
- NPC_LADY_SACROLASH = 25165,
+ NPC_GRAND_WARLOCK_ALYTHESS = 25166,
+ NPC_SHADOW_IMAGE = 25214,
+ NPC_LADY_SACROLASH = 25165,
- CREATURE_ANVEENA = 26046, // Embodiment of the Sunwell
- CREATURE_KALECGOS = 25319, // Helps the raid throughout the fight
- CREATURE_PROPHET = 26246, // Outro
- CREATURE_KILJAEDEN = 25315, // Give it to 'em KJ!
- CREATURE_HAND_OF_THE_DECEIVER = 25588, // Adds found before KJ emerges
- CREATURE_FELFIRE_PORTAL = 25603, // Portal spawned be Hand of the Deceivers
- CREATURE_VOLATILE_FELFIRE_FIEND = 25598, // Fiends spawned by the above portal
- CREATURE_ARMAGEDDON_TARGET = 25735, // This mob casts meteor on itself.. I think
- CREATURE_SHIELD_ORB = 25502, // Shield orbs circle the room raining shadow bolts on raid
- CREATURE_THE_CORE_OF_ENTROPIUS = 26262, // Used in the ending cinematic?
- CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT = 25653, // NPC that players possess when using the Orb of the Blue Dragonflight
- CREATURE_SPIKE_TARGET1 = 30598, // Should summon these under Shadow Spike Channel on targets place
- CREATURE_SPIKE_TARGET2 = 30614,
- CREATURE_SINISTER_REFLECTION = 25708, // Sinister Relection spawnd on Phase swichtes
+ NPC_ANVEENA = 26046, // Embodiment of the Sunwell
+ NPC_KALECGOS_KJ = 25319, // Helps the raid throughout the fight
+ NPC_PROPHET = 26246, // Outro
+ NPC_KILJAEDEN = 25315, // Give it to 'em KJ!
+ NPC_KILJAEDEN_CONTROLLER = 25608,
+ NPC_HAND_OF_THE_DECEIVER = 25588, // Adds found before KJ emerges
+ NPC_FELFIRE_PORTAL = 25603, // Portal spawned be Hand of the Deceivers
+ NPC_VOLATILE_FELFIRE_FIEND = 25598, // Fiends spawned by the above portal
+ NPC_ARMAGEDDON_TARGET = 25735, // This mob casts meteor on itself.. I think
+ NPC_SHIELD_ORB = 25502, // Shield orbs circle the room raining shadow bolts on raid
+ NPC_THE_CORE_OF_ENTROPIUS = 26262, // Used in the ending cinematic?
+ NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT = 25653, // NPC that players possess when using the Orb of the Blue Dragonflight
+ NPC_SPIKE_TARGET1 = 30598, // Should summon these under Shadow Spike Channel on targets place
+ NPC_SPIKE_TARGET2 = 30614,
+ NPC_SINISTER_REFLECTION = 25708, // Sinister Relection spawnd on Phase swichtes
- CREATURE_DARKNESS = 25879,
- CREATURE_DARK_FIENDS = 25744,
- CREATURE_BERSERKER = 25798,
- CREATURE_FURY_MAGE = 25799,
- CREATURE_VOID_SENTINEL = 25772,
- CREATURE_VOID_SPAWN = 25824,
- CREATURE_BLACK_HOLE = 25855,
+ NPC_DARKNESS = 25879,
+ NPC_DARK_FIENDS = 25744,
+ NPC_BERSERKER = 25798,
+ NPC_FURY_MAGE = 25799,
+ NPC_VOID_SENTINEL = 25772,
+ NPC_VOID_SPAWN = 25824,
+ NPC_BLACK_HOLE = 25855
};
-enum GameObjects
+enum GameObjectIds
{
- GAMEOBJECT_ORB_OF_THE_BLUE_DRAGONFLIGHT = 188415,
+ GO_ORB_OF_THE_BLUE_DRAGONFLIGHT = 188415,
+ GO_FORCE_FIELD = 188421,
+ GO_BOSS_COLLISION_1 = 188523,
+ GO_BOSS_COLLISION_2 = 188524,
+ GO_FIRE_BARRIER = 188075,
+ GO_MURUS_GATE_1 = 187990,
+ GO_MURUS_GATE_2 = 188118
};
-#endif
+template<class AI>
+AI* GetSunwellPlateauAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, SunwellPlateauScriptName);
+}
+
+#endif // SUNWELL_PLATEAU_H
diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
index aa41ee7adbb..6bc9aab3d6f 100644
--- a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
@@ -18,8 +18,8 @@
/* ScriptData
SDName: Eversong_Woods
-SD%Complete: 100
-SDComment: Quest support: 8488, 8490
+SD%Complete: 95
+SDComment: Quest support: 8487, 8488, 8490
SDCategory: Eversong Woods
EndScriptData */
@@ -37,11 +37,29 @@ EndContentData */
enum UnexpectedResults
{
// Quest
+ QUEST_CORRUPTED_SOIL = 8487,
QUEST_UNEXPECTED_RESULT = 8488,
// Creatures
- NPC_GHARZUL = 15958,
- NPC_ANGERSHADE = 15656
+ NPC_GHARZUL = 15958, // Quest 8488
+ NPC_ANGERSHADE = 15656, // Quest 8488
+
+ // Factions
+ FACTION_NORMAL = 1604, // Quest 8488
+ FACTION_COMBAT = 232, // Quest 8488
+
+ // Spells
+ SPELL_TEST_SOIL = 29535, // Quest 8487
+ SPELL_FIREBALL = 20811, // Quest 8488
+
+ // Text
+ SAY_TEST_SOIL = 0, // Quest 8487
+
+ // Events
+ EVENT_TALK = 1, // Quest 8487
+ EVENT_ADD_QUEST_GIVER_FLAG = 2, // Quest 8487
+ EVENT_SUMMON = 3, // Quest 8488
+ EVENT_FIREBALL = 4 // Quest 8488
};
class npc_apprentice_mirveda : public CreatureScript
@@ -49,47 +67,57 @@ class npc_apprentice_mirveda : public CreatureScript
public:
npc_apprentice_mirveda() : CreatureScript("npc_apprentice_mirveda") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
- {
- if (quest->GetQuestId() == QUEST_UNEXPECTED_RESULT)
- {
- CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->Summon = true;
- CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->PlayerGUID = player->GetGUID();
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_apprentice_mirvedaAI(creature);
- }
-
struct npc_apprentice_mirvedaAI : public ScriptedAI
{
npc_apprentice_mirvedaAI(Creature* creature) : ScriptedAI(creature), Summons(me) { }
uint32 KillCount;
uint64 PlayerGUID;
- bool Summon;
SummonList Summons;
+ EventMap events;
void Reset() OVERRIDE
{
+ SetCombatMovement(false);
KillCount = 0;
PlayerGUID = 0;
Summons.DespawnAll();
- Summon = false;
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) OVERRIDE
+ {
+ if (quest->GetQuestId() == QUEST_CORRUPTED_SOIL)
+ {
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ events.ScheduleEvent(EVENT_TALK, 2000);
+ }
+ }
+
+ void sQuestAccept(Player* player, Quest const* quest) OVERRIDE
+ {
+ if (quest->GetQuestId() == QUEST_UNEXPECTED_RESULT)
+ {
+ me->setFaction(FACTION_COMBAT);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ events.ScheduleEvent(EVENT_SUMMON, 1000);
+ PlayerGUID = player->GetGUID();
+ }
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ events.ScheduleEvent(EVENT_FIREBALL, 1000);
+ }
void JustSummoned(Creature* summoned) OVERRIDE
{
- summoned->AI()->AttackStart(me);
+ // This is the best I can do because AttackStart does nothing
+ summoned->GetMotionMaster()->MovePoint(1, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
+ // summoned->AI()->AttackStart(me);
Summons.Summon(summoned);
}
- void SummonedCreatureDespawn(Creature* summoned) OVERRIDE
+ void SummonedCreatureDies(Creature* summoned, Unit* /*who*/) OVERRIDE
{
Summons.Despawn(summoned);
++KillCount;
@@ -97,26 +125,60 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
+ me->setFaction(FACTION_NORMAL);
+
if (PlayerGUID)
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
player->FailQuest(QUEST_UNEXPECTED_RESULT);
}
- void UpdateAI(uint32 /*diff*/) OVERRIDE
+ void UpdateAI(uint32 diff) OVERRIDE
{
if (KillCount >= 3 && PlayerGUID)
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
- player->CompleteQuest(QUEST_UNEXPECTED_RESULT);
+ if (player->GetQuestStatus(QUEST_UNEXPECTED_RESULT) == QUEST_STATUS_INCOMPLETE)
+ {
+ player->CompleteQuest(QUEST_UNEXPECTED_RESULT);
+ me->setFaction(FACTION_NORMAL);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ }
+
+ events.Update(diff);
- if (Summon)
+ while (uint32 eventId = events.ExecuteEvent())
{
- me->SummonCreature(NPC_GHARZUL, 8745, -7134.32f, 35.22f, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
- me->SummonCreature(NPC_ANGERSHADE, 8745, -7134.32f, 35.22f, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
- me->SummonCreature(NPC_ANGERSHADE, 8745, -7134.32f, 35.22f, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
- Summon = false;
+ switch (eventId)
+ {
+ case EVENT_TALK:
+ Talk(SAY_TEST_SOIL);
+ events.ScheduleEvent(EVENT_ADD_QUEST_GIVER_FLAG, 7000);
+ break;
+ case EVENT_ADD_QUEST_GIVER_FLAG:
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ case EVENT_SUMMON:
+ me->SummonCreature(NPC_GHARZUL, 8749.505f, -7132.595f, 35.31983f, 3.816502f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 180000);
+ me->SummonCreature(NPC_ANGERSHADE, 8755.38f, -7131.521f, 35.30957f, 3.816502f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 180000);
+ me->SummonCreature(NPC_ANGERSHADE, 8753.199f, -7125.975f, 35.31986f, 3.816502f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 180000);
+ break;
+ case EVENT_FIREBALL:
+ if (!UpdateVictim())
+ continue;
+ DoCastVictim(SPELL_FIREBALL, true); // Not casting in combat
+ events.ScheduleEvent(EVENT_FIREBALL, 3000);
+ break;
+ default:
+ break;
+ }
}
+ DoMeleeAttackIfReady();
}
};
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_apprentice_mirvedaAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index cbfab9047b2..a8e46b621c2 100644
--- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
@@ -40,9 +40,9 @@ enum eOOX
{
SAY_OOX_START = 0,
SAY_OOX_AGGRO = 1,
- SAY_OOX_AMBUSH = 3,
- SAY_OOX_AMBUSH_REPLY = 4,
- SAY_OOX_END = 5,
+ SAY_OOX_AMBUSH = 2,
+ SAY_OOX_AMBUSH_REPLY = 3,
+ SAY_OOX_END = 4,
QUEST_RESQUE_OOX_09 = 836,
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index 7077e3d9a31..6b409012cb0 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -189,7 +189,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!who)
return;
@@ -393,7 +392,7 @@ public:
}
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void JustDied(Unit* /*killer*/) OVERRIDE
{
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index b21c20d3d5a..47cf00938c7 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -15,12 +15,15 @@ set(scripts_STAT_SRCS
Kalimdor/zone_moonglade.cpp
Kalimdor/RazorfenDowns/razorfen_downs.cpp
Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+ Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
+ Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
+ Kalimdor/RazorfenDowns/boss_glutton.cpp
Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
Kalimdor/RazorfenDowns/razorfen_downs.h
- Kalimdor/ZulFarrak/zulfarrak.h
Kalimdor/ZulFarrak/zulfarrak.cpp
Kalimdor/ZulFarrak/instance_zulfarrak.cpp
Kalimdor/ZulFarrak/boss_zum_rah.cpp
+ Kalimdor/ZulFarrak/zulfarrak.h
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 43d75fad876..3653aaf5770 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -186,6 +186,7 @@ hyjal_trashAI::hyjal_trashAI(Creature* creature) : npc_escortAI(creature)
faction = 0;
useFlyPath = false;
damageTaken = 0;
+ memset(DummyTarget, 0, sizeof(DummyTarget));
Reset();
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
index 4a4d7fe4b07..323fd92a8f6 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,63 +15,57 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Amnennar_the_coldbringer
-SD%Complete: 100
-SDComment:
-SDCategory: Razorfen Downs
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
-enum AmnennarTheColdbringer
+enum Say
{
SAY_AGGRO = 0,
SAY_SUMMON60 = 1,
SAY_SUMMON30 = 2,
SAY_HP = 3,
- SAY_KILL = 4,
+ SAY_KILL = 4
+};
+enum Spells
+{
SPELL_AMNENNARSWRATH = 13009,
SPELL_FROSTBOLT = 15530,
SPELL_FROST_NOVA = 15531,
SPELL_FROST_SPECTRES = 12642
};
+enum Events
+{
+ EVENT_AMNENNARSWRATH = 1,
+ EVENT_FROSTBOLT = 2,
+ EVENT_FROST_NOVA = 3
+};
+
class boss_amnennar_the_coldbringer : public CreatureScript
{
public:
boss_amnennar_the_coldbringer() : CreatureScript("boss_amnennar_the_coldbringer") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_amnennar_the_coldbringerAI(creature);
- }
-
- struct boss_amnennar_the_coldbringerAI : public ScriptedAI
+ struct boss_amnennar_the_coldbringerAI : public BossAI
{
- boss_amnennar_the_coldbringerAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 AmnenarsWrath_Timer;
- uint32 FrostBolt_Timer;
- uint32 FrostNova_Timer;
- bool Spectrals60;
- bool Spectrals30;
- bool Hp;
+ boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER) { }
void Reset() OVERRIDE
{
- AmnenarsWrath_Timer = 8000;
- FrostBolt_Timer = 1000;
- FrostNova_Timer = urand(10000, 15000);
- Spectrals30 = false;
- Spectrals60 = false;
- Hp = false;
+ _Reset();
+ hp60Spectrals = false;
+ hp30Spectrals = false;
+ hp50 = false;
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_AMNENNARSWRATH, 8000);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 1000);
+ events.ScheduleEvent(EVENT_FROST_NOVA, urand(10000, 15000));
Talk(SAY_AGGRO);
}
@@ -81,55 +74,73 @@ public:
Talk(SAY_KILL);
}
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim())
return;
- //AmnenarsWrath_Timer
- if (AmnenarsWrath_Timer <= diff)
- {
- DoCastVictim(SPELL_AMNENNARSWRATH);
- AmnenarsWrath_Timer = 12000;
- } else AmnenarsWrath_Timer -= diff;
+ events.Update(diff);
- //FrostBolt_Timer
- if (FrostBolt_Timer <= diff)
- {
- DoCastVictim(SPELL_FROSTBOLT);
- FrostBolt_Timer = 8000;
- } else FrostBolt_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (FrostNova_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me, SPELL_FROST_NOVA);
- FrostNova_Timer = 15000;
- } else FrostNova_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_AMNENNARSWRATH:
+ DoCastVictim(SPELL_AMNENNARSWRATH);
+ events.ScheduleEvent(EVENT_AMNENNARSWRATH, 12000);
+ break;
+ case EVENT_FROSTBOLT:
+ DoCastVictim(SPELL_FROSTBOLT);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 8000);
+ break;
+ case EVENT_FROST_NOVA:
+ DoCast(me, SPELL_FROST_NOVA);
+ events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
+ break;
+ }
+ }
- if (!Spectrals60 && HealthBelowPct(60))
+ if (!hp60Spectrals && HealthBelowPct(60))
{
Talk(SAY_SUMMON60);
DoCastVictim(SPELL_FROST_SPECTRES);
- Spectrals60 = true;
+ hp60Spectrals = true;
}
- if (!Hp && HealthBelowPct(50))
+ if (!hp50 && HealthBelowPct(50))
{
Talk(SAY_HP);
- Hp = true;
+ hp50 = true;
}
- if (!Spectrals30 && HealthBelowPct(30))
+ if (!hp30Spectrals && HealthBelowPct(30))
{
Talk(SAY_SUMMON30);
DoCastVictim(SPELL_FROST_SPECTRES);
- Spectrals30 = true;
+ hp30Spectrals = true;
}
DoMeleeAttackIfReady();
}
+
+ private:
+ bool hp60Spectrals;
+ bool hp30Spectrals;
+ bool hp50;
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_amnennar_the_coldbringerAI(creature);
+ }
};
void AddSC_boss_amnennar_the_coldbringer()
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
new file mode 100644
index 00000000000..a249013bd6a
--- /dev/null
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
+
+enum Say
+{
+ SAY_HP50 = 0,
+ SAY_HP15 = 1
+};
+
+enum Spells
+{
+ SPELL_DISEASE_CLOUD = 12627,
+ SPELL_FRENZY = 12795
+};
+
+class boss_glutton : public CreatureScript
+{
+public:
+ boss_glutton() : CreatureScript("boss_glutton") { }
+
+ struct boss_gluttonAI : public BossAI
+ {
+ boss_gluttonAI(Creature* creature) : BossAI(creature, DATA_GLUTTON) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ hp50 = false;
+ hp15 = false;
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void UpdateAI(uint32 /*diff*/) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (!hp50 && HealthBelowPct(50))
+ {
+ Talk(SAY_HP50);
+ hp50 = true;
+ }
+
+ if (!hp15 && HealthBelowPct(15))
+ {
+ Talk(SAY_HP15);
+ DoCast(me, SPELL_FRENZY);
+ hp15 = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool hp50;
+ bool hp15;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_gluttonAI(creature);
+ }
+};
+
+void AddSC_boss_glutton()
+{
+ new boss_glutton();
+}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
new file mode 100644
index 00000000000..1f45de3c4c6
--- /dev/null
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
+
+enum Say
+{
+ SAY_OOC_1 = 0,
+ SAY_OOC_2 = 1,
+ SAY_OOC_3 = 2,
+ SAY_AGGRO = 3
+};
+
+enum Spells
+{
+ SPELL_FIREBALL = 12466,
+ SPELL_FIRE_NOVA = 12470
+};
+
+enum Events
+{
+ EVENT_OOC_1 = 1,
+ EVENT_OOC_2 = 2,
+ EVENT_OOC_3 = 3,
+ EVENT_OOC_4 = 4,
+ EVENT_FIREBALL = 5,
+ EVENT_FIRE_NOVA = 6
+};
+
+class boss_mordresh_fire_eye : public CreatureScript
+{
+public:
+ boss_mordresh_fire_eye() : CreatureScript("boss_mordresh_fire_eye") { }
+
+ struct boss_mordresh_fire_eyeAI : public BossAI
+ {
+ boss_mordresh_fire_eyeAI(Creature* creature) : BossAI(creature, DATA_MORDRESH_FIRE_EYE) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ events.ScheduleEvent(EVENT_OOC_1, 10000);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.Reset();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_FIREBALL, 100);
+ events.ScheduleEvent(EVENT_FIRE_NOVA, urand(8000, 12000));
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_OOC_1:
+ Talk(SAY_OOC_1);
+ events.ScheduleEvent(EVENT_OOC_2, 8000);
+ break;
+ case EVENT_OOC_2:
+ Talk(SAY_OOC_2);
+ events.ScheduleEvent(EVENT_OOC_3, 3000);
+ break;
+ case EVENT_OOC_3:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
+ events.ScheduleEvent(EVENT_OOC_4, 6000);
+ break;
+ case EVENT_OOC_4:
+ Talk(SAY_OOC_3);
+ events.ScheduleEvent(EVENT_OOC_1, 14000);
+ break;
+ }
+ }
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FIREBALL:
+ DoCastVictim(SPELL_FIREBALL);
+ events.ScheduleEvent(EVENT_FIREBALL, urand(2400, 3800));
+ break;
+ case EVENT_FIRE_NOVA:
+ DoCast(me, SPELL_FIRE_NOVA);
+ events.ScheduleEvent(EVENT_FIRE_NOVA, urand(11000, 16000));
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_mordresh_fire_eyeAI(creature);
+ }
+};
+
+void AddSC_boss_mordresh_fire_eye()
+{
+ new boss_mordresh_fire_eye();
+}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
new file mode 100644
index 00000000000..5cf8a2992a3
--- /dev/null
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
+
+enum Spells
+{
+ SPELL_THRASH = 8876,
+ SPELL_WEB_SPRAY = 12252,
+ SPELL_VIRULENT_POISON = 12254,
+ SPELL_CURSE_OF_TUTENKASH = 12255
+};
+
+enum Events
+{
+ EVENT_WEB_SPRAY = 1,
+ EVENT_CURSE_OF_TUTENKASH = 2
+};
+
+class boss_tuten_kash : public CreatureScript
+{
+public:
+ boss_tuten_kash() : CreatureScript("boss_tuten_kash") { }
+
+ struct boss_tuten_kashAI : public BossAI
+ {
+ boss_tuten_kashAI(Creature* creature) : BossAI(creature, DATA_TUTEN_KASH) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ if (!me->HasAura(SPELL_THRASH))
+ DoCast(me, SPELL_THRASH);
+ if (!me->HasAura(SPELL_VIRULENT_POISON))
+ DoCast(me, SPELL_VIRULENT_POISON);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_WEB_SPRAY, urand(3000, 5000));
+ events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, urand(9000, 14000));
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_WEB_SPRAY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, false))
+ {
+ if (!target->HasAura(SPELL_WEB_SPRAY))
+ DoCast(target, SPELL_WEB_SPRAY);
+ }
+ events.ScheduleEvent(EVENT_WEB_SPRAY, urand(6000, 8000));
+ break;
+ case EVENT_CURSE_OF_TUTENKASH:
+ DoCast(me, SPELL_CURSE_OF_TUTENKASH);
+ events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, urand(15000, 25000));
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_tuten_kashAI(creature);
+ }
+};
+
+void AddSC_boss_tuten_kash()
+{
+ new boss_tuten_kash();
+}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
index 091c7e46585..097f340891a 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
@@ -16,199 +16,219 @@
*/
#include "ScriptMgr.h"
+#include "ObjectMgr.h"
#include "InstanceScript.h"
#include "razorfen_downs.h"
#include "Player.h"
#include "TemporarySummon.h"
-#define MAX_ENCOUNTER 1
+Position const PosSummonTutenkash[15] =
+{
+ // 7349 Tomb Fiend
+ { 2487.339f, 805.9111f, 43.08361f, 2.844887f },
+ { 2485.405f, 804.1145f, 43.68511f, 3.054326f },
+ { 2488.431f, 801.2809f, 42.70374f, 4.29351f },
+ { 2489.914f, 804.7949f, 43.25175f, 1.658063f },
+ { 2541.246f, 907.0941f, 46.64201f, 2.024582f },
+ { 2544.701f, 907.6331f, 46.38007f, 1.605703f },
+ { 2541.49f, 911.1756f, 46.26493f, 4.817109f },
+ { 2544.693f, 912.8887f, 46.39912f, 2.129302f },
+ { 2524.036f, 834.4852f, 48.37031f, 0.8028514f },
+ { 2527.017f, 829.9793f, 48.06498f, 0.6981317f },
+ // 7351 Tomb Reaver
+ { 2542.818f, 904.9359f, 46.80911f, 4.642576f },
+ { 2543.287f, 911.2448f, 46.32785f, 0.6806784f },
+ { 2489.083f, 806.5914f, 43.21102f, 3.682645f },
+ { 2486.828f, 802.8737f, 43.19883f, 2.9147f },
+ // 7355 Tuten'kash
+ { 2487.939f, 804.2224f, 43.10735f, 1.692969f }
+};
class instance_razorfen_downs : public InstanceMapScript
{
public:
- instance_razorfen_downs() : InstanceMapScript("instance_razorfen_downs", 129) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_razorfen_downs_InstanceMapScript(map);
- }
+ instance_razorfen_downs() : InstanceMapScript(RFDScriptName, 129) { }
struct instance_razorfen_downs_InstanceMapScript : public InstanceScript
{
instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetBossNumber(EncounterCount);
}
- uint64 uiGongGUID;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- uint16 uiGongWaves;
-
- std::string str_data;
-
void Initialize() OVERRIDE
{
- uiGongGUID = 0;
-
- uiGongWaves = 0;
-
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
-
- saveStream << "T C " << m_auiEncounter[0]
- << ' ' << uiGongWaves;
-
- str_data = saveStream.str();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
+ goGongGUID = 0;
+ gongWave = 0;
+ fiendsKilled = 0;
+ reaversKilled = 0;
+ summonLowRange = 0;
+ summonHighRange = 0;
+ summonCreature = 0;
}
- void Load(const char* in) OVERRIDE
+ void OnGameObjectCreate(GameObject* gameObject) OVERRIDE
{
- if (!in)
+ switch (gameObject->GetEntry())
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ case GO_GONG:
+ goGongGUID = gameObject->GetGUID();
+ if (GetBossState(DATA_TUTEN_KASH) == DONE)
+ gameObject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
+ case GO_IDOL_OVEN_FIRE:
+ case GO_IDOL_CUP_FIRE:
+ case GO_IDOL_MOUTH_FIRE:
+ if (GetBossState(DATA_EXTINGUISHING_THE_IDOL) == DONE)
+ gameObject->Delete();
+ break;
+ default:
+ break;
}
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
- uint16 data0, data1;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1;
-
- if (dataHead1 == 'T' && dataHead2 == 'C')
- {
- m_auiEncounter[0] = data0;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
-
- uiGongWaves = data1;
- } else OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
}
- void OnGameObjectCreate(GameObject* go) OVERRIDE
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
{
- switch (go->GetEntry())
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
{
- case GO_GONG:
- uiGongGUID = go->GetGUID();
- if (m_auiEncounter[0] == DONE)
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ case DATA_TUTEN_KASH:
+ case DATA_MORDRESH_FIRE_EYE:
+ case DATA_GLUTTON:
+ case DATA_AMNENNAR_THE_COLD_BRINGER:
+ case DATA_GONG:
+ case DATA_WAVE:
+ case DATA_EXTINGUISHING_THE_IDOL:
break;
default:
break;
}
+ return true;
}
- void SetData(uint32 uiType, uint32 uiData) OVERRIDE
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- if (uiType == DATA_GONG_WAVES)
+ if (type == DATA_WAVE)
{
- uiGongWaves = uiData;
-
- switch (uiGongWaves)
+ switch (data)
{
- case 9:
- case 14:
- if (GameObject* go = instance->GetGameObject(uiGongGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- break;
- case 1:
- case 10:
- case 16:
+ case IN_PROGRESS:
{
- GameObject* go = instance->GetGameObject(uiGongGUID);
-
- if (!go)
- return;
-
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
-
- uint32 uiCreature = 0;
- uint8 uiSummonTimes = 0;
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- switch (uiGongWaves)
+ switch (gongWave)
{
- case 1:
- uiCreature = NPC_TOMB_FIEND;
- uiSummonTimes = 7;
- break;
- case 10:
- uiCreature = NPC_TOMB_REAVER;
- uiSummonTimes = 3;
+ case 0:
+ summonLowRange = 0;
+ summonHighRange = 10;
+ summonCreature = NPC_TOMB_FIEND;
break;
- case 16:
- uiCreature = NPC_TUTEN_KASH;
+ case 1:
+ summonLowRange = 10;
+ summonHighRange = 14;
+ summonCreature = NPC_TOMB_REAVER;
break;
- default:
+ case 2:
+ summonLowRange = 14;
+ summonHighRange = 15;
+ summonCreature = NPC_TUTEN_KASH;
break;
}
- if (Creature* creature = go->SummonCreature(uiCreature, 2502.635f, 844.140f, 46.896f, 0.633f))
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
{
- if (uiGongWaves == 10 || uiGongWaves == 1)
+ for (uint8 i = summonLowRange; i < summonHighRange; ++i)
{
- for (uint8 i = 0; i < uiSummonTimes; ++i)
- {
- if (Creature* summon = go->SummonCreature(uiCreature, 2502.635f + float(irand(-5, 5)), 844.140f + float(irand(-5, 5)), 46.896f, 0.633f))
- summon->GetMotionMaster()->MovePoint(0, 2533.479f + float(irand(-5, 5)), 870.020f + float(irand(-5, 5)), 47.678f);
- }
+ Creature* creature = go->SummonCreature(summonCreature, PosSummonTutenkash[i]);
+ creature->GetMotionMaster()->MovePoint(0, 2533.479f + float(irand(-5, 5)), 870.020f + float(irand(-5, 5)), 47.678f);
}
- creature->GetMotionMaster()->MovePoint(0, 2533.479f + float(irand(-5, 5)), 870.020f + float(irand(-5, 5)), 47.678f);
}
+
+ ++gongWave;
break;
}
- default:
+ case NPC_TOMB_FIEND:
+ if (++fiendsKilled == 10)
+ {
+ fiendsKilled = 0;
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ break;
+ case NPC_TOMB_REAVER:
+ if (++reaversKilled == 4)
+ {
+ reaversKilled = 0;
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
break;
}
+
}
- if (uiType == BOSS_TUTEN_KASH)
- {
- m_auiEncounter[0] = uiData;
+ }
- if (uiData == DONE)
- SaveToDB();
- }
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "R D " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- uint32 GetData(uint32 uiType) const OVERRIDE
+ void Load(const char* str) OVERRIDE
{
- switch (uiType)
+ if (!str)
{
- case DATA_GONG_WAVES:
- return uiGongWaves;
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
}
- return 0;
- }
+ OUT_LOAD_INST_DATA(str);
- uint64 GetData64(uint32 uiType) const OVERRIDE
- {
- switch (uiType)
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'R' && dataHead2 == 'D')
{
- case DATA_GONG: return uiGongGUID;
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
}
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- return 0;
+ OUT_LOAD_INST_DATA_COMPLETE;
}
+
+ protected:
+ uint64 goGongGUID;
+ uint16 gongWave;
+ uint8 fiendsKilled;
+ uint8 reaversKilled;
+ uint8 summonLowRange;
+ uint8 summonHighRange;
+ uint32 summonCreature;
};
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_razorfen_downs_InstanceMapScript(map);
+ }
};
void AddSC_instance_razorfen_downs()
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
index 320c9970077..e2c83b9a445 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
@@ -32,6 +32,10 @@ EndContentData */
#include "ScriptedGossip.h"
#include "razorfen_downs.h"
#include "Player.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
+#include "Cell.h"
+#include "CellImpl.h"
/*###
# npc_henry_stern
@@ -101,32 +105,272 @@ public:
};
/*######
-## go_gong
+## npc_belnistrasz for Quest 3525 "Extinguishing the Idol"
######*/
-class go_gong : public GameObjectScript
+Position const PosSummonSpawner[3] =
+{
+ { 2582.789f, 954.3925f, 52.48214f, 3.787364f },
+ { 2569.42f, 956.3801f, 52.27323f, 5.427974f },
+ { 2570.62f, 942.3934f, 53.7433f, 0.715585f }
+};
+
+enum Belnistrasz
+{
+ EVENT_CHANNEL = 1,
+ EVENT_IDOL_ROOM_SPAWNER = 2,
+ EVENT_PROGRESS = 3,
+ EVENT_COMPLETE = 4,
+ EVENT_FIREBALL = 5,
+ EVENT_FROST_NOVA = 6,
+
+ FACTION_ESCORT = 250,
+
+ PATH_ESCORT = 871710,
+ POINT_REACH_IDOL = 17,
+
+ QUEST_EXTINGUISHING_THE_IDOL = 3525,
+
+ SAY_QUEST_ACCEPTED = 0,
+ SAY_EVENT_START = 1,
+ SAY_EVENT_THREE_MIN_LEFT = 2,
+ SAY_EVENT_TWO_MIN_LEFT = 3,
+ SAY_EVENT_ONE_MIN_LEFT = 4,
+ SAY_EVENT_END = 5,
+ SAY_AGGRO = 6, // Combat
+ SAY_WATCH_OUT = 7, // 25% chance to target random creature and say on wave spawn
+
+ SPELL_ARCANE_INTELLECT = 13326,
+ SPELL_FIREBALL = 9053,
+ SPELL_FROST_NOVA = 11831,
+ SPELL_IDOL_SHUTDOWN_VISUAL = 12774, // Hits Unit Entry: 8662
+ SPELL_IDOM_ROOM_CAMERA_SHAKE = 12816 // Dummy needs scripting
+};
+
+class npc_belnistrasz : public CreatureScript
{
public:
- go_gong() : GameObjectScript("go_gong") { }
+ npc_belnistrasz() : CreatureScript("npc_belnistrasz") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
+ struct npc_belnistraszAI : public ScriptedAI
{
- //basic support, not blizzlike data is missing...
- InstanceScript* instance = go->GetInstanceScript();
+ npc_belnistraszAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ eventInProgress = false;
+ }
- if (instance)
+ void Reset() OVERRIDE
{
- instance->SetData(DATA_GONG_WAVES, instance->GetData(DATA_GONG_WAVES)+1);
- return true;
+ if (!eventInProgress)
+ {
+ if (!me->HasAura(SPELL_ARCANE_INTELLECT))
+ DoCast(me, SPELL_ARCANE_INTELLECT);
+
+ channeling = false;
+ eventProgress = 0;
+ spawnerCount = 0;
+ me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
+ }
}
- return false;
+ void EnterCombat(Unit* who) OVERRIDE
+ {
+ if (channeling)
+ {
+ Talk(SAY_WATCH_OUT, who->GetGUID());
+ }
+ else
+ {
+ events.ScheduleEvent(EVENT_FIREBALL, 1000);
+ events.ScheduleEvent(EVENT_FROST_NOVA, urand(8000, 12000));
+ if (urand(0, 100) > 40)
+ Talk(SAY_AGGRO, who->GetGUID());
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ instance->SetBossState(DATA_EXTINGUISHING_THE_IDOL, DONE);
+ me->DespawnOrUnsummon(5000);
+ }
+
+ void sQuestAccept(Player* /*player*/, Quest const* quest) OVERRIDE
+ {
+ if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL)
+ {
+ eventInProgress = true;
+ Talk(SAY_QUEST_ACCEPTED);
+ me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
+ me->setFaction(FACTION_ESCORT);
+ me->GetMotionMaster()->MovePath(PATH_ESCORT, false);
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
+ {
+ if (type == WAYPOINT_MOTION_TYPE && id == POINT_REACH_IDOL)
+ {
+ channeling = true;
+ events.ScheduleEvent(EVENT_CHANNEL, 2000);
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!eventInProgress)
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHANNEL:
+ Talk(SAY_EVENT_START);
+ DoCast(me, SPELL_IDOL_SHUTDOWN_VISUAL);
+ events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 100);
+ events.ScheduleEvent(EVENT_PROGRESS, 120000);
+ break;
+ case EVENT_IDOL_ROOM_SPAWNER:
+ if (Creature* creature = me->SummonCreature(NPC_IDOL_ROOM_SPAWNER, PosSummonSpawner[urand(0,2)], TEMPSUMMON_TIMED_DESPAWN, 4000))
+ creature->AI()->SetData(0,spawnerCount);
+ if (++spawnerCount < 8)
+ events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 35000);
+ break;
+ case EVENT_PROGRESS:
+ {
+ switch (eventProgress)
+ {
+ case 0:
+ Talk(SAY_EVENT_THREE_MIN_LEFT);
+ ++eventProgress;
+ events.ScheduleEvent(EVENT_PROGRESS, 60000);
+ break;
+ case 1:
+ Talk(SAY_EVENT_TWO_MIN_LEFT);
+ ++eventProgress;
+ events.ScheduleEvent(EVENT_PROGRESS, 60000);
+ break;
+ case 2:
+ Talk(SAY_EVENT_ONE_MIN_LEFT);
+ ++eventProgress;
+ events.ScheduleEvent(EVENT_PROGRESS, 60000);
+ break;
+ case 3:
+ events.CancelEvent(EVENT_IDOL_ROOM_SPAWNER);
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ Talk(SAY_EVENT_END);
+ events.ScheduleEvent(EVENT_COMPLETE, 3000);
+ break;
+ }
+ break;
+ }
+ case EVENT_COMPLETE:
+ {
+ DoCast(me, SPELL_IDOM_ROOM_CAMERA_SHAKE);
+ me->SummonGameObject(GO_BELNISTRASZS_BRAZIER, 2577.196f, 947.0781f, 53.16757f, 2.356195f, 0, 0, 0.9238796f, 0.3826832f, 3600000);
+ std::list<WorldObject*> ClusterList;
+ Trinity::AllWorldObjectsInRange objects(me, 50.0f);
+ Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(me, ClusterList, objects);
+ me->VisitNearbyObject(50.0f, searcher);
+ for (std::list<WorldObject*>::const_iterator itr = ClusterList.begin(); itr != ClusterList.end(); ++itr)
+ {
+ if (Player* player = (*itr)->ToPlayer())
+ {
+ if (player->GetQuestStatus(QUEST_EXTINGUISHING_THE_IDOL) == QUEST_STATUS_INCOMPLETE)
+ player->CompleteQuest(QUEST_EXTINGUISHING_THE_IDOL);
+ }
+ else if (GameObject* go = (*itr)->ToGameObject())
+ {
+ if (go->GetEntry() == GO_IDOL_OVEN_FIRE || go->GetEntry() == GO_IDOL_CUP_FIRE || go->GetEntry() == GO_IDOL_MOUTH_FIRE)
+ go->Delete();
+ }
+ }
+ instance->SetBossState(DATA_EXTINGUISHING_THE_IDOL, DONE);
+ me->DespawnOrUnsummon();
+ break;
+ }
+ case EVENT_FIREBALL:
+ if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
+ return;
+ DoCastVictim(SPELL_FIREBALL);
+ events.ScheduleEvent(EVENT_FIREBALL, 8000);
+ break;
+ case EVENT_FROST_NOVA:
+ if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
+ return;
+ DoCast(me, SPELL_FROST_NOVA);
+ events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
+ break;
+ }
+ }
+ if (!channeling)
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ InstanceScript* instance;
+ EventMap events;
+ bool eventInProgress;
+ bool channeling;
+ uint8 eventProgress;
+ uint8 spawnerCount;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_belnistraszAI(creature);
}
+};
+
+class npc_idol_room_spawner : public CreatureScript
+{
+public:
+ npc_idol_room_spawner() : CreatureScript("npc_idol_room_spawner") { }
+
+ struct npc_idol_room_spawnerAI : public ScriptedAI
+ {
+ npc_idol_room_spawnerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ }
+
+ void Reset() OVERRIDE { }
+ void SetData(uint32 /*type*/, uint32 data) OVERRIDE
+ {
+ if(!instance)
+ return;
+
+ if (data < 7)
+ {
+ me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ if (data > 0 && me->GetOrientation() < 4.0f)
+ me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ me->SummonCreature(NPC_DEATHS_HEAD_GEOMANCER, me->GetPositionX() + (cos(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
+ me->SummonCreature(NPC_WITHERED_QUILGUARD, me->GetPositionX() + (cos(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
+ }
+ else if (data =7)
+ me->SummonCreature(NPC_PLAGUEMAW_THE_ROTTING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ }
+
+ private:
+ InstanceScript* instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_idol_room_spawnerAI(creature);
+ }
};
enum TombCreature
{
+ EVENT_WEB = 7,
+ SPELL_POISON_PROC = 3616,
+ SPELL_VIRULENT_POISON_PROC = 12254,
SPELL_WEB = 745
};
@@ -135,11 +379,6 @@ class npc_tomb_creature : public CreatureScript
public:
npc_tomb_creature() : CreatureScript("npc_tomb_creature") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_tomb_creatureAI(creature);
- }
-
struct npc_tomb_creatureAI : public ScriptedAI
{
npc_tomb_creatureAI(Creature* creature) : ScriptedAI(creature)
@@ -147,45 +386,86 @@ public:
instance = creature->GetInstanceScript();
}
- InstanceScript* instance;
+ void Reset() OVERRIDE
+ {
+ if (!me->HasAura(SPELL_POISON_PROC) && me->GetEntry() == NPC_TOMB_FIEND)
+ DoCast(me, SPELL_POISON_PROC);
- uint32 uiWebTimer;
+ if (!me->HasAura(SPELL_VIRULENT_POISON_PROC) && me->GetEntry() == NPC_TOMB_REAVER)
+ DoCast(me, SPELL_VIRULENT_POISON_PROC);
+ }
- void Reset() OVERRIDE
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (instance)
+ instance->SetData(DATA_WAVE, me->GetEntry());
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- uiWebTimer = urand(5000, 8000);
+ events.ScheduleEvent(EVENT_WEB, urand(5000, 8000));
}
- void UpdateAI(uint32 uiDiff) OVERRIDE
+ void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim())
return;
- //from acid
- if (me->GetEntry() == NPC_TOMB_REAVER)
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (uiWebTimer <= uiDiff)
+ switch (eventId)
{
- DoCastVictim(SPELL_WEB);
- uiWebTimer = urand(7000, 16000);
- } else uiWebTimer -= uiDiff;
+ case EVENT_WEB:
+ DoCastVictim(SPELL_WEB);
+ events.ScheduleEvent(EVENT_WEB, urand(7000, 16000));
+ break;
+ }
}
-
DoMeleeAttackIfReady();
}
- void JustDied(Unit* /*killer*/) OVERRIDE
+ private:
+ InstanceScript* instance;
+ EventMap events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_tomb_creatureAI(creature);
+ }
+};
+
+/*######
+## go_gong
+######*/
+
+class go_gong : public GameObjectScript
+{
+public:
+ go_gong() : GameObjectScript("go_gong") { }
+
+ bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
+ {
+ InstanceScript* instance = go->GetInstanceScript();
+
+ if (instance)
{
- if (instance)
- instance->SetData(DATA_GONG_WAVES, instance->GetData(DATA_GONG_WAVES)+1);
+ go->SendCustomAnim(0);
+ instance->SetData(DATA_WAVE, IN_PROGRESS);
+ return true;
}
- };
+ return false;
+ }
};
void AddSC_razorfen_downs()
{
new npc_henry_stern();
- new go_gong();
+ new npc_belnistrasz();
+ new npc_idol_room_spawner();
new npc_tomb_creature();
+ new go_gong();
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
index c0f63474f23..9fe5314fda0 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
@@ -18,27 +18,56 @@
#ifndef DEF_RAZORFEN_DOWNS_H
#define DEF_RAZORFEN_DOWNS_H
-enum Data
+#define RFDScriptName "instance_razorfen_downs"
+
+uint32 const EncounterCount = 5;
+
+enum DataTypes
{
- BOSS_TUTEN_KASH,
- DATA_GONG_WAVES
+ // Main Bosses
+ DATA_TUTEN_KASH = 0,
+ DATA_MORDRESH_FIRE_EYE = 1,
+ DATA_GLUTTON = 2,
+ DATA_AMNENNAR_THE_COLD_BRINGER = 3,
+ // Events
+ DATA_GONG = 4,
+ DATA_WAVE = 5,
+ DATA_EXTINGUISHING_THE_IDOL = 6
};
-enum Data64
+enum CreatureIds
{
- DATA_GONG
+ // Used in Tuten Kash summon event
+ NPC_TOMB_FIEND = 7349,
+ NPC_TOMB_REAVER = 7351,
+ NPC_TUTEN_KASH = 7355,
+ // Used for quest 3525 "Extinguishing the Idol"
+ NPC_IDOL_ROOM_SPAWNER = 8611,
+ NPC_WITHERED_BATTLE_BOAR = 7333,
+ NPC_DEATHS_HEAD_GEOMANCER = 7335,
+ NPC_WITHERED_QUILGUARD = 7329,
+ NPC_PLAGUEMAW_THE_ROTTING = 7356
};
enum GameObjectIds
{
- GO_GONG = 148917
+ // Used for Tuten Kash summon event
+ GO_GONG = 148917,
+ // Used for quest 3525 "Extinguishing the Idol"
+ GO_IDOL_OVEN_FIRE = 151951,
+ GO_IDOL_CUP_FIRE = 151952,
+ GO_IDOL_MOUTH_FIRE = 151973,
+ GO_BELNISTRASZS_BRAZIER = 152097
};
-enum CreatureId
+template<class AI>
+CreatureAI* GetRazorfenDownsAI(Creature* creature)
{
- NPC_TOMB_FIEND = 7349,
- NPC_TOMB_REAVER = 7351,
- NPC_TUTEN_KASH = 7355
-};
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(RFDScriptName))
+ return new AI(creature);
+ return NULL;
+}
#endif
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 697b4bee5bc..58a81c073ef 100644
--- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
@@ -457,7 +457,7 @@ public:
StartEvent();
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void StartEvent()
{
diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
index 4c22b4fc81d..f03e4516e96 100644
--- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
+++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 233c184777c..be169ef6139 100644
--- a/src/server/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
@@ -398,7 +398,7 @@ public:
}
}
- void Reset()OVERRIDE { }
+ void Reset() OVERRIDE { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
index ae57732e9e2..b1339b13119 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
@@ -43,12 +43,21 @@ class instance_forge_of_souls : public InstanceMapScript
teamInInstance = 0;
}
+ void OnPlayerEnter(Player* player) OVERRIDE
+ {
+ if (!teamInInstance)
+ teamInInstance = player->GetTeam();
+ }
+
void OnCreatureCreate(Creature* creature) OVERRIDE
{
- Map::PlayerList const &players = instance->GetPlayers();
- if (!players.isEmpty())
- if (Player* player = players.begin()->GetSource())
- teamInInstance = player->GetTeam();
+ if (!teamInInstance)
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ if (Player* player = players.begin()->GetSource())
+ teamInInstance = player->GetTeam();
+ }
switch (creature->GetEntry())
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 1b82de35f54..06355e25207 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -1089,9 +1089,9 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
break;
case EVENT_ESCAPE_27:
if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- me->SummonGameObject(GO_CAPTAIN_CHEST_1, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
+ me->SummonGameObject(IsHeroic() ? GO_CAPTAIN_CHEST_ALLIANCE_HEROIC : GO_CAPTAIN_CHEST_ALLIANCE_NORMAL, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
else
- me->SummonGameObject(GO_CAPTAIN_CHEST_3, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
+ me->SummonGameObject(IsHeroic() ? GO_CAPTAIN_CHEST_HORDE_HEROIC : GO_CAPTAIN_CHEST_HORDE_NORMAL, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
me->SummonGameObject(GO_PORTAL, FinalPortalPos.GetPositionX(), FinalPortalPos.GetPositionY(), FinalPortalPos.GetPositionZ(), FinalPortalPos.GetOrientation(), 0, 0, 0, 0, 720000);
if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
lichking->DespawnOrUnsummon(1);
@@ -1121,6 +1121,7 @@ enum TrashSpells
SPELL_FROSTBOLT = 72166,
SPELL_CHAINS_OF_ICE = 72121,
SPELL_HALLUCINATION = 72342,
+ AURA_HALLUCINATION = 72343,
// Phantom Hallucination (same as phantom mage + HALLUCINATION_2 when dies)
SPELL_HALLUCINATION_2 = 72344,
@@ -1180,10 +1181,7 @@ enum TrashEvents
struct npc_gauntlet_trash : public ScriptedAI
{
- npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
- {
- }
+ npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void Reset() OVERRIDE
{
@@ -1226,9 +1224,7 @@ public:
struct npc_ghostly_priestAI : public npc_gauntlet_trash
{
- npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
@@ -1297,8 +1293,12 @@ public:
struct npc_phantom_mageAI : public npc_gauntlet_trash
{
- npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature)
+ npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+
+ void EnterEvadeMode() OVERRIDE
{
+ if (!me->HasAura(AURA_HALLUCINATION))
+ npc_gauntlet_trash::EnterEvadeMode();
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -1342,6 +1342,8 @@ public:
_events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
break;
case EVENT_HALLUCINATION:
+ // removing any dots on mage or else the invisibility spell will break duration
+ me->RemoveAllAuras();
DoCast(SPELL_HALLUCINATION);
break;
}
@@ -1365,6 +1367,19 @@ public:
{
npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { }
+ void Reset() OVERRIDE
+ {
+ if (Unit* unit = me->SelectNearestTarget())
+ AttackStart(unit);
+ DoZoneInCombat();
+ }
+
+ void EnterEvadeMode() OVERRIDE
+ {
+ if (!me->GetOwner()->HasAura(AURA_HALLUCINATION))
+ npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode();
+ }
+
void JustDied(Unit* /*killer*/) OVERRIDE
{
DoCast(SPELL_HALLUCINATION_2);
@@ -1384,9 +1399,7 @@ public:
struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash
{
- npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
@@ -1444,9 +1457,7 @@ public:
struct npc_spectral_footmanAI : public npc_gauntlet_trash
{
- npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
@@ -1498,9 +1509,7 @@ public:
struct npc_tortured_riflemanAI : public npc_gauntlet_trash
{
- npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index d8d4f2d5524..9c40cb70141 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -95,10 +95,10 @@ enum GameObjects
GO_ORGRIM_HAMMER = 201599,
GO_PORTAL = 202079,
- GO_CAPTAIN_CHEST_1 = 202212, //3145
- GO_CAPTAIN_CHEST_2 = 201710, //30357
- GO_CAPTAIN_CHEST_3 = 202337, //3246
- GO_CAPTAIN_CHEST_4 = 202336, //3333
+ GO_CAPTAIN_CHEST_HORDE_NORMAL = 202212, //3145
+ GO_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710, //30357
+ GO_CAPTAIN_CHEST_HORDE_HEROIC = 202337, //3246
+ GO_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336, //3333
};
enum HorWorldStates
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index 0599596fc0a..955f4fb1568 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -110,10 +110,13 @@ public:
void OnCreatureCreate(Creature* creature) OVERRIDE
{
- Map::PlayerList const& players = instance->GetPlayers();
- if (!players.isEmpty())
- if (Player* player = players.begin()->GetSource())
- _teamInInstance = player->GetTeam();
+ if (!_teamInInstance)
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ if (Player* player = players.begin()->GetSource())
+ _teamInInstance = player->GetTeam();
+ }
switch (creature->GetEntry())
{
@@ -184,7 +187,7 @@ public:
case GO_ARTHAS_DOOR:
_arthasDoorGUID = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- if (GetBossState(DATA_FROSWORN_EVENT) == DONE)
+ if (GetData(DATA_FROSWORN_EVENT) == DONE)
HandleGameObject(0, true, go);
else
HandleGameObject(0, false, go);
@@ -511,13 +514,13 @@ public:
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << _escapeevent;
+ saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << ' ' << _escapeevent;
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
- void Load(char const* in) OVERRIDE OVERRIDE
+ void Load(char const* in) OVERRIDE
{
if (!in)
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 20b7d39815f..4a9a41f6f8e 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -187,7 +187,7 @@ class boss_garfrost : public CreatureScript
switch (eventId)
{
case EVENT_THROW_SARONITE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
Talk(SAY_THROW_SARONITE, target->GetGUID());
DoCast(target, SPELL_THROW_SARONITE);
@@ -199,7 +199,7 @@ class boss_garfrost : public CreatureScript
events.ScheduleEvent(EVENT_CHILLING_WAVE, 40000, 0, PHASE_TWO);
break;
case EVENT_DEEP_FREEZE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
Talk(SAY_CAST_DEEP_FREEZE, target->GetGUID());
DoCast(target, SPELL_DEEP_FREEZE);
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
index d8a4dd01f90..48cc6f89a13 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -385,32 +385,25 @@ class boss_rimefang : public CreatureScript
class player_overlord_brandAI : public PlayerAI
{
public:
- player_overlord_brandAI(Player* player) : PlayerAI(player), _tyrannus(0)
- {
- }
-
- void SetGUID(uint64 guid, int32 /*type*/) OVERRIDE
- {
- _tyrannus = guid;
- }
+ player_overlord_brandAI(Player* player, uint64 casterGUID) : PlayerAI(player), _tyrannusGUID(casterGUID) { }
void DamageDealt(Unit* /*victim*/, uint32& damage, DamageEffectType /*damageType*/) OVERRIDE
{
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannus))
- if (tyrannus->GetVictim())
- me->CastCustomSpell(SPELL_OVERLORD_BRAND_DAMAGE, SPELLVALUE_BASE_POINT0, damage, tyrannus->GetVictim(), true, NULL, NULL, tyrannus->GetGUID());
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ if (Unit* victim = tyrannus->GetVictim())
+ me->CastCustomSpell(SPELL_OVERLORD_BRAND_DAMAGE, SPELLVALUE_BASE_POINT0, damage, victim, true, NULL, NULL, tyrannus->GetGUID());
}
void HealDone(Unit* /*target*/, uint32& addHealth) OVERRIDE
{
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannus))
- me->CastCustomSpell(SPELL_OVERLORD_BRAND_HEAL, SPELLVALUE_BASE_POINT0, int32(addHealth*5.5f), tyrannus, true, NULL, NULL, tyrannus->GetGUID());
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ me->CastCustomSpell(SPELL_OVERLORD_BRAND_HEAL, SPELLVALUE_BASE_POINT0, int32(addHealth * 5.5f), tyrannus, true, NULL, NULL, tyrannus->GetGUID());
}
void UpdateAI(uint32 /*diff*/) OVERRIDE { }
private:
- uint64 _tyrannus;
+ uint64 _tyrannusGUID;
};
class spell_tyrannus_overlord_brand : public SpellScriptLoader
@@ -434,8 +427,8 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader
oldAI = GetTarget()->GetAI();
oldAIState = GetTarget()->IsAIEnabled;
- GetTarget()->SetAI(new player_overlord_brandAI(GetTarget()->ToPlayer()));
- GetTarget()->GetAI()->SetGUID(GetCasterGUID());
+ GetTarget()->SetAI(new player_overlord_brandAI(GetTarget()->ToPlayer(), GetCasterGUID()));
+ GetTarget()->IsAIEnabled = true;
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
index 7aa8b123f98..d61fc69a0ae 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
@@ -63,7 +63,7 @@ class instance_pit_of_saron : public InstanceMapScript
{
if (!_teamInInstance)
{
- Map::PlayerList const &players = instance->GetPlayers();
+ Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
if (Player* player = players.begin()->GetSource())
_teamInInstance = player->GetTeam();
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index a1511fb3dd8..4777b451e4e 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
@@ -165,7 +165,7 @@ public:
unit->SetControlled(true, UNIT_STATE_ROOT);
}
- void ProcessEvent(WorldObject* /*obj*/, uint32 eventId)
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) OVERRIDE
{
if (eventId == EVENT_FOCUSING_IRIS)
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
index 25091a457f2..d22a0bcc79f 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
@@ -52,141 +52,141 @@ enum DrakosEvents
class boss_drakos : public CreatureScript
{
-public:
- boss_drakos() : CreatureScript("boss_drakos") { }
+ public:
+ boss_drakos() : CreatureScript("boss_drakos") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_drakosAI(creature);
- }
-
- struct boss_drakosAI : public BossAI
- {
- boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS_EVENT) { }
-
- void Reset() OVERRIDE
+ struct boss_drakosAI : public BossAI
{
- _Reset();
+ boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS) { }
- events.ScheduleEvent(EVENT_MAGIC_PULL, 15000);
- events.ScheduleEvent(EVENT_STOMP, 17000);
- events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000);
+ void Reset() OVERRIDE
+ {
+ _Reset();
- postPull = false;
- }
+ events.ScheduleEvent(EVENT_MAGIC_PULL, 15000);
+ events.ScheduleEvent(EVENT_STOMP, 17000);
+ events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000);
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- _EnterCombat();
- Talk(SAY_AGGRO);
- }
+ postPull = false;
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ }
- events.Update(diff);
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ events.Update(diff);
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_BOMB_SUMMON:
- {
- Position pPosition;
- me->GetPosition(&pPosition);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- for (uint8 i = 0; i <= (postPull ? 3 : 0); i++)
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BOMB_SUMMON:
{
- me->GetRandomNearPosition(pPosition, float(urand(0, 10)));
- me->SummonCreature(NPC_UNSTABLE_SPHERE, pPosition);
+ Position position;
+ me->GetPosition(&position);
+
+ for (uint8 i = 0; i <= (postPull ? 3 : 0); i++)
+ {
+ me->GetRandomNearPosition(position, frand(0.0f, 10.0f));
+ me->SummonCreature(NPC_UNSTABLE_SPHERE, position);
+ }
}
- }
- events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000);
- break;
- case EVENT_MAGIC_PULL:
- DoCast(SPELL_MAGIC_PULL);
- postPull = true;
- events.ScheduleEvent(EVENT_MAGIC_PULL, 15000);
- break;
- case EVENT_STOMP:
- Talk(SAY_STOMP);
- DoCast(SPELL_THUNDERING_STOMP);
- events.ScheduleEvent(EVENT_STOMP, 17000);
- break;
+ events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000);
+ break;
+ case EVENT_MAGIC_PULL:
+ DoCast(SPELL_MAGIC_PULL);
+ postPull = true;
+ events.ScheduleEvent(EVENT_MAGIC_PULL, 15000);
+ break;
+ case EVENT_STOMP:
+ Talk(SAY_STOMP);
+ DoCast(SPELL_THUNDERING_STOMP);
+ events.ScheduleEvent(EVENT_STOMP, 17000);
+ break;
+ default:
+ break;
+ }
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- _JustDied();
+ Talk(SAY_DEATH);
- Talk(SAY_DEATH);
+ // start achievement timer (kill Eregos within 20 min)
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ }
- // start achievement timer (kill Eregos within 20 min)
- instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- }
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_KILL);
+ }
+
+ private:
+ bool postPull;
+ };
- void KilledUnit(Unit* /*victim*/) OVERRIDE
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- Talk(SAY_KILL);
+ return GetOculusAI<boss_drakosAI>(creature);
}
- private:
- bool postPull;
- };
};
class npc_unstable_sphere : public CreatureScript
{
-public:
- npc_unstable_sphere() : CreatureScript("npc_unstable_sphere") { }
+ public:
+ npc_unstable_sphere() : CreatureScript("npc_unstable_sphere") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_unstable_sphereAI(creature);
- }
+ struct npc_unstable_sphereAI : public ScriptedAI
+ {
+ npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature) { }
- struct npc_unstable_sphereAI : public ScriptedAI
- {
- npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature) { }
+ void Reset() OVERRIDE
+ {
+ me->SetReactState(REACT_PASSIVE);
+ me->GetMotionMaster()->MoveRandom(40.0f);
- void Reset() OVERRIDE
- {
- me->SetReactState(REACT_PASSIVE);
- me->GetMotionMaster()->MoveRandom(40.0f);
+ me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me);
+ me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me);
- me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me);
- me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me);
+ pulseTimer = 3000;
- pulseTimer = 3000;
- deathTimer = 19000;
- }
+ me->DespawnOrUnsummon(19000);
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (pulseTimer <= diff)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- DoCast(SPELL_UNSTABLE_SPHERE_PULSE);
- pulseTimer = 3*IN_MILLISECONDS;
- } else pulseTimer -= diff;
+ if (pulseTimer <= diff)
+ {
+ DoCast(SPELL_UNSTABLE_SPHERE_PULSE);
+ pulseTimer = 3 * IN_MILLISECONDS;
+ }
+ else
+ pulseTimer -= diff;
+ }
- if (deathTimer <= diff)
- me->DisappearAndDie();
- else deathTimer -= diff;
- }
- private:
- uint32 pulseTimer;
- uint32 deathTimer;
- };
+ private:
+ uint32 pulseTimer;
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_unstable_sphereAI(creature);
+ }
};
void AddSC_boss_drakos()
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
index abf0d6537c3..ca6f580633c 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
@@ -21,8 +21,8 @@
#include "SpellAuraEffects.h"
#include "oculus.h"
-//Types of drake mounts: Ruby(Tank), Amber(DPS), Emerald(Healer)
-//Two Repeating phases
+// Types of drake mounts: Ruby (Tank), Amber (DPS), Emerald (Healer)
+// Two Repeating phases
enum Events
{
@@ -61,8 +61,8 @@ enum Npcs
enum Phases
{
- PHASE_NORMAL = 1,
- PHASE_FIRST_PLANAR = 2,
+ PHASE_NORMAL = 1,
+ PHASE_FIRST_PLANAR = 2,
PHASE_SECOND_PLANAR = 3
};
@@ -80,172 +80,174 @@ enum EregosData
class boss_eregos : public CreatureScript
{
-public:
- boss_eregos() : CreatureScript("boss_eregos") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_eregosAI(creature);
- }
-
- struct boss_eregosAI : public BossAI
- {
- boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS_EVENT) { }
+ public:
+ boss_eregos() : CreatureScript("boss_eregos") { }
- void Reset() OVERRIDE
+ struct boss_eregosAI : public BossAI
{
- _Reset();
- _phase = PHASE_NORMAL;
-
- _rubyVoid = true;
- _emeraldVoid = true;
- _amberVoid = true;
+ boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS) { }
- DoAction(ACTION_SET_NORMAL_EVENTS);
- }
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ _phase = PHASE_NORMAL;
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- Talk(SAY_KILL);
- }
+ _rubyVoid = true;
+ _emeraldVoid = true;
+ _amberVoid = true;
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- _EnterCombat();
-
- Talk(SAY_AGGRO);
- /* Checks for present drakes vehicles from each type and deactivate achievement that corresponds to each found
- The checks are so big in case some party try weird things like pulling boss down or hiding out of check range, the only thing player need is to get the boss kill credit after the check /even if he or his drake die/
- Drakes mechanic would despawn all after unmount and also drakes should be auto mounted after item use, item use after Eregos is engaged leads to his despawn - based on retail data. */
- if (me->FindNearestCreature(NPC_RUBY_DRAKE_VEHICLE, 500.0f, true))
- _rubyVoid = false;
- if (me->FindNearestCreature(NPC_EMERALD_DRAKE_VEHICLE, 500.0f, true))
- _emeraldVoid = false;
- if (me->FindNearestCreature(NPC_AMBER_DRAKE_VEHICLE, 500.0f, true))
- _amberVoid = false;
- }
+ DoAction(ACTION_SET_NORMAL_EVENTS);
+ }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
- {
- case DATA_RUBY_VOID:
- return _rubyVoid;
- case DATA_EMERALD_VOID:
- return _emeraldVoid;
- case DATA_AMBER_VOID:
- return _amberVoid;
- default:
- break;
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_KILL);
}
- return 0;
- }
- void DoAction(int32 action) OVERRIDE
- {
- if (action != ACTION_SET_NORMAL_EVENTS)
- return;
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+
+ Talk(SAY_AGGRO);
+ /* Checks for present drakes vehicles from each type and deactivate achievement that corresponds to each found
+ The checks are so big in case some party try weird things like pulling boss down or hiding out of check range, the only thing player need is to get the boss kill credit after the check /even if he or his drake die/
+ Drakes mechanic would despawn all after unmount and also drakes should be auto mounted after item use, item use after Eregos is engaged leads to his despawn - based on retail data. */
+ if (me->FindNearestCreature(NPC_RUBY_DRAKE_VEHICLE, 500.0f, true))
+ _rubyVoid = false;
+ if (me->FindNearestCreature(NPC_EMERALD_DRAKE_VEHICLE, 500.0f, true))
+ _emeraldVoid = false;
+ if (me->FindNearestCreature(NPC_AMBER_DRAKE_VEHICLE, 500.0f, true))
+ _amberVoid = false;
+ }
- events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3, 10) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(10, 25) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_ENRAGED_ASSAULT, urand(35, 50) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_SUMMON_LEY_WHELP, urand(15, 30) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- }
+ uint32 GetData(uint32 type) const OVERRIDE
+ {
+ switch (type)
+ {
+ case DATA_RUBY_VOID:
+ return _rubyVoid;
+ case DATA_EMERALD_VOID:
+ return _emeraldVoid;
+ case DATA_AMBER_VOID:
+ return _amberVoid;
+ default:
+ break;
+ }
+ return 0;
+ }
- void JustSummoned(Creature* summon) OVERRIDE
- {
- BossAI::JustSummoned(summon);
+ void DoAction(int32 action) OVERRIDE
+ {
+ if (action != ACTION_SET_NORMAL_EVENTS)
+ return;
+
+ events.SetPhase(PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3, 10) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(10, 25) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_ENRAGED_ASSAULT, urand(35, 50) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_SUMMON_LEY_WHELP, urand(15, 30) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ }
- if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
- return;
+ void JustSummoned(Creature* summon) OVERRIDE
+ {
+ BossAI::JustSummoned(summon);
- summon->CombatStop(true);
- summon->SetReactState(REACT_PASSIVE);
- summon->GetMotionMaster()->MoveRandom(100.0f);
- }
+ if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
+ return;
- void SummonedCreatureDespawn(Creature* summon) OVERRIDE
- {
- if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
- return;
+ summon->CombatStop(true);
+ summon->SetReactState(REACT_PASSIVE);
+ summon->GetMotionMaster()->MoveRandom(100.0f);
+ }
- // TO-DO: See why the spell is not casted
- summon->CastSpell(summon, SPELL_PLANAR_BLAST, true);
- }
+ void SummonedCreatureDespawn(Creature* summon) OVERRIDE
+ {
+ if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
+ return;
- void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE
- {
- if (!me->GetMap()->IsHeroic())
- return;
+ /// @todo: See why the spell is not casted
+ summon->CastSpell(summon, SPELL_PLANAR_BLAST, true);
+ }
- if ( (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f && _phase < PHASE_FIRST_PLANAR)
- || (me->GetHealthPct() < 20.0f && _phase < PHASE_SECOND_PLANAR) )
+ void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE
{
- events.Reset();
- _phase = (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f) ? PHASE_FIRST_PLANAR : PHASE_SECOND_PLANAR;
+ if (!IsHeroic())
+ return;
- Talk(SAY_SHIELD);
- DoCast(SPELL_PLANAR_SHIFT);
+ if ( (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f && _phase < PHASE_FIRST_PLANAR)
+ || (me->GetHealthPct() < 20.0f && _phase < PHASE_SECOND_PLANAR) )
+ {
+ events.Reset();
+ _phase = (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f) ? PHASE_FIRST_PLANAR : PHASE_SECOND_PLANAR;
- // not sure about the amount, and if we should despawn previous spawns (dragon trashs)
- summons.DespawnAll();
- for (uint8 i = 0; i < 6; i++)
- DoCast(SPELL_PLANAR_ANOMALIES);
+ Talk(SAY_SHIELD);
+ DoCast(SPELL_PLANAR_SHIFT);
+
+ // not sure about the amount, and if we should despawn previous spawns (dragon trashs)
+ summons.DespawnAll();
+ for (uint8 i = 0; i < 6; i++)
+ DoCast(SPELL_PLANAR_ANOMALIES);
+ }
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_ARCANE_BARRAGE:
- DoCastVictim(SPELL_ARCANE_BARRAGE);
- events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3, 10) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- break;
- case EVENT_ARCANE_VOLLEY:
- DoCastAOE(SPELL_ARCANE_VOLLEY);
- events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(10, 25) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- break;
- case EVENT_ENRAGED_ASSAULT:
- Talk(SAY_ENRAGE);
- DoCast(SPELL_ENRAGED_ASSAULT);
- events.ScheduleEvent(EVENT_ENRAGED_ASSAULT, urand(35, 50) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- break;
- case EVENT_SUMMON_LEY_WHELP:
- for (uint8 i = 0; i < 3; i++)
- DoCast(SPELL_SUMMON_LEY_WHELP);
- events.ScheduleEvent(EVENT_SUMMON_LEY_WHELP, urand(15, 30) * IN_MILLISECONDS, 0, PHASE_NORMAL);
- break;
+ switch (eventId)
+ {
+ case EVENT_ARCANE_BARRAGE:
+ DoCastVictim(SPELL_ARCANE_BARRAGE);
+ events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3, 10) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ break;
+ case EVENT_ARCANE_VOLLEY:
+ DoCastAOE(SPELL_ARCANE_VOLLEY);
+ events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(10, 25) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ break;
+ case EVENT_ENRAGED_ASSAULT:
+ Talk(SAY_ENRAGE);
+ DoCast(SPELL_ENRAGED_ASSAULT);
+ events.ScheduleEvent(EVENT_ENRAGED_ASSAULT, urand(35, 50) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ break;
+ case EVENT_SUMMON_LEY_WHELP:
+ for (uint8 i = 0; i < 3; i++)
+ DoCast(SPELL_SUMMON_LEY_WHELP);
+ events.ScheduleEvent(EVENT_SUMMON_LEY_WHELP, urand(15, 30) * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ break;
+ default:
+ break;
+ }
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ Talk(SAY_DEATH);
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(SAY_DEATH);
+ _JustDied();
+ }
- _JustDied();
- }
+ private:
+ uint8 _phase;
+ bool _rubyVoid;
+ bool _emeraldVoid;
+ bool _amberVoid;
+ };
- private:
- uint8 _phase;
- bool _rubyVoid;
- bool _emeraldVoid;
- bool _amberVoid;
- };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_eregosAI(creature);
+ }
};
class spell_eregos_planar_shift : public SpellScriptLoader
@@ -259,9 +261,8 @@ class spell_eregos_planar_shift : public SpellScriptLoader
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (Unit* caster = GetCaster())
- if (Creature* creatureCaster = caster->ToCreature())
- creatureCaster->AI()->DoAction(ACTION_SET_NORMAL_EVENTS);
+ if (Creature* creature = GetTarget()->ToCreature())
+ creature->AI()->DoAction(ACTION_SET_NORMAL_EVENTS);
}
void Register() OVERRIDE
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index 678748b1f01..f7c558879d1 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
@@ -29,7 +29,6 @@ EndScriptData */
enum Spells
{
-
SPELL_ARCANE_SHIELD = 53813, //Dummy --> Channeled, shields the caster from damage.
SPELL_EMPOWERED_ARCANE_EXPLOSION = 51110,
SPELL_EMPOWERED_ARCANE_EXPLOSION_2 = 59377,
@@ -89,274 +88,242 @@ static uint32 TeleportSpells[]=
class boss_urom : public CreatureScript
{
-public:
- boss_urom() : CreatureScript("boss_urom") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_uromAI(creature);
- }
-
- struct boss_uromAI : public BossAI
- {
- boss_uromAI(Creature* creature) : BossAI(creature, DATA_UROM_EVENT) { }
+ public:
+ boss_urom() : CreatureScript("boss_urom") { }
- void Reset() OVERRIDE
+ struct boss_uromAI : public BossAI
{
- me->CastSpell(me, SPELL_EVOCATE);
-
- _Reset();
-
- if (instance->GetData(DATA_UROM_PLATAFORM) == 0)
+ boss_uromAI(Creature* creature) : BossAI(creature, DATA_UROM)
{
- for (uint8 i = 0; i < 3; i++)
- group[i] = 0;
- }
+ platform = 0;
- x = 0.0f;
- y = 0.0f;
- canCast = false;
- canGoBack = false;
+ for (uint8 i = 0; i < 3; ++i)
+ group[i] = i;
- me->GetMotionMaster()->MoveIdle();
-
- teleportTimer = urand(30000, 35000);
- arcaneExplosionTimer = 9000;
- castArcaneExplosionTimer = 2000;
- frostBombTimer = urand(5000, 8000);
- timeBombTimer = urand(20000, 25000);
- }
+ std::random_shuffle(group, group + 3);
+ }
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- _EnterCombat();
+ void Reset() OVERRIDE
+ {
+ me->CastSpell(me, SPELL_EVOCATE);
- SetGroups();
- SummonGroups();
- CastTeleport();
+ _Reset();
- if (instance->GetData(DATA_UROM_PLATAFORM) != 3)
- instance->SetData(DATA_UROM_PLATAFORM, instance->GetData(DATA_UROM_PLATAFORM)+1);
- }
+ x = 0.0f;
+ y = 0.0f;
+ canCast = false;
+ canGoBack = false;
- void AttackStart(Unit* who) OVERRIDE
- {
- if (!who)
- return;
+ me->GetMotionMaster()->MoveIdle();
- if (me->GetPositionZ() > 518.63f)
- DoStartNoMovement(who);
+ teleportTimer = urand(30000, 35000);
+ arcaneExplosionTimer = 9000;
+ castArcaneExplosionTimer = 2000;
+ frostBombTimer = urand(5000, 8000);
+ timeBombTimer = urand(20000, 25000);
+ }
- if (me->GetPositionZ() < 518.63f)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (me->Attack(who, true))
- {
- Talk(SAY_AGGRO);
-
- me->SetInCombatWith(who);
- who->SetInCombatWith(me);
+ _EnterCombat();
- me->GetMotionMaster()->MoveChase(who, 0, 0);
- }
+ StartAttack();
}
- }
-
- void SetGroups()
- {
- if (!instance || instance->GetData(DATA_UROM_PLATAFORM) != 0)
- return;
- while (group[0] == group[1] || group[0] == group[2] || group[1] == group[2])
+ void AttackStart(Unit* who) OVERRIDE
{
- for (uint8 i = 0; i < 3; i++)
- group[i] = urand(0, 2);
- }
- }
+ if (!who)
+ return;
- void SetPosition(uint8 i)
- {
- switch (i)
- {
- case 0:
- x = me->GetPositionX() + 4;
- y = me->GetPositionY() - 4;
- break;
- case 1:
- x = me->GetPositionX() + 4;
- y = me->GetPositionY() + 4;
- break;
- case 2:
- x = me->GetPositionX() - 4;
- y = me->GetPositionY() + 4;
- break;
- case 3:
- x = me->GetPositionX() - 4;
- y = me->GetPositionY() - 4;
- break;
- default:
- break;
+ if (me->GetPositionZ() > 518.63f)
+ DoStartNoMovement(who);
+ else
+ BossAI::AttackStart(who);
}
- }
- void SummonGroups()
- {
- if (!instance || instance->GetData(DATA_UROM_PLATAFORM) > 2)
- return;
-
- for (uint8 i = 0; i < 4; i++)
+ void SetPosition(uint8 i)
{
- SetPosition(i);
- me->SummonCreature(Group[group[instance->GetData(DATA_UROM_PLATAFORM)]].entry[i], x, y, me->GetPositionZ(), me->GetOrientation());
-
- // teleport to next platform and spawn adds
- switch (instance->GetData(DATA_UROM_PLATAFORM))
+ switch (i)
{
+ case 0:
+ x = me->GetPositionX() + 4;
+ y = me->GetPositionY() - 4;
+ break;
case 1:
- Talk(SAY_SUMMON_1);
+ x = me->GetPositionX() + 4;
+ y = me->GetPositionY() + 4;
break;
case 2:
- Talk(SAY_SUMMON_2);
+ x = me->GetPositionX() - 4;
+ y = me->GetPositionY() + 4;
break;
case 3:
- Talk(SAY_SUMMON_3);
+ x = me->GetPositionX() - 4;
+ y = me->GetPositionY() - 4;
break;
default:
break;
}
}
- }
- void CastTeleport()
- {
- if (!instance || instance->GetData(DATA_UROM_PLATAFORM) > 2)
- return;
-
- Talk(instance->GetData(DATA_UROM_PLATAFORM) < 5 ? instance->GetData(DATA_UROM_PLATAFORM) : 0);
- DoCast(TeleportSpells[instance->GetData(DATA_UROM_PLATAFORM)]);
- }
-
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- Talk(SAY_PLAYER_KILL);
- }
-
- void UpdateAI(uint32 uiDiff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void StartAttack()
+ {
+ if (platform > 2)
+ {
+ Talk(SAY_AGGRO);
+ return;
+ }
- if (!instance || instance->GetData(DATA_UROM_PLATAFORM) < 2)
- return;
+ // summon guards and jump to next platform
+ for (uint8 i = 0; i < 4; ++i)
+ {
+ SetPosition(i);
+ me->SummonCreature(Group[group[platform]].entry[i], x, y, me->GetPositionZ(), me->GetOrientation());
+ }
- if (teleportTimer <= uiDiff)
- {
- me->InterruptNonMeleeSpells(false);
- me->GetMotionMaster()->MoveIdle();
- DoCast(SPELL_TELEPORT);
- teleportTimer = urand(30000, 35000);
+ Talk(platform);
+ DoCast(TeleportSpells[platform]);
- } else teleportTimer -= uiDiff;
+ ++platform;
+ }
- if (canCast && !me->FindCurrentSpellBySpellId(SPELL_EMPOWERED_ARCANE_EXPLOSION))
+ void KilledUnit(Unit* who) OVERRIDE
{
- if (castArcaneExplosionTimer <= uiDiff)
- {
- canCast = false;
- canGoBack = true;
- DoCastAOE(SPELL_EMPOWERED_ARCANE_EXPLOSION);
- castArcaneExplosionTimer = 2000;
- }else castArcaneExplosionTimer -= uiDiff;
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_PLAYER_KILL);
}
- if (canGoBack)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (arcaneExplosionTimer <= uiDiff)
- {
- Position pPos;
- me->GetVictim()->GetPosition(&pPos);
+ if (!UpdateVictim())
+ return;
- me->NearTeleportTo(pPos.GetPositionX(), pPos.GetPositionY(), pPos.GetPositionZ(), pPos.GetOrientation());
- me->GetMotionMaster()->MoveChase(me->GetVictim(), 0, 0);
- me->SetWalk(true);
+ if (platform < 3)
+ return;
- Talk(EMOTE_ARCANE_EXPLOSION);
- Talk(SAY_ARCANE_EXPLOSION);
+ events.Update(diff);
- canCast = false;
- canGoBack = false;
- arcaneExplosionTimer = 9000;
- } else arcaneExplosionTimer -= uiDiff;
- }
+ if (teleportTimer <= diff)
+ {
+ me->InterruptNonMeleeSpells(false);
+ me->GetMotionMaster()->MoveIdle();
+ DoCast(SPELL_TELEPORT);
+ teleportTimer = urand(30000, 35000);
+ }
+ else
+ teleportTimer -= diff;
- if (!me->IsNonMeleeSpellCasted(false, true, true))
- {
- if (frostBombTimer <= uiDiff)
+ if (canCast && !me->FindCurrentSpellBySpellId(SPELL_EMPOWERED_ARCANE_EXPLOSION))
{
- DoCastVictim(SPELL_FROSTBOMB);
- frostBombTimer = urand(5000, 8000);
- } else frostBombTimer -= uiDiff;
+ if (castArcaneExplosionTimer <= diff)
+ {
+ canCast = false;
+ canGoBack = true;
+ DoCastAOE(SPELL_EMPOWERED_ARCANE_EXPLOSION);
+ castArcaneExplosionTimer = 2000;
+ }
+ else
+ castArcaneExplosionTimer -= diff;
+ }
- if (timeBombTimer <= uiDiff)
+ if (canGoBack)
{
- if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(unit, SPELL_TIME_BOMB);
+ if (arcaneExplosionTimer <= diff)
+ {
+ Position pos;
+ me->GetVictim()->GetPosition(&pos);
+
+ me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ me->SetWalk(true);
+
+ Talk(EMOTE_ARCANE_EXPLOSION);
+ Talk(SAY_ARCANE_EXPLOSION);
+
+ canCast = false;
+ canGoBack = false;
+ arcaneExplosionTimer = 9000;
+ }
+ else
+ arcaneExplosionTimer -= diff;
+ }
- timeBombTimer = urand(20000, 25000);
- } else timeBombTimer -= uiDiff;
- }
+ if (!me->IsNonMeleeSpellCasted(false, true, true))
+ {
+ if (frostBombTimer <= diff)
+ {
+ DoCastVictim(SPELL_FROSTBOMB);
+ frostBombTimer = urand(5000, 8000);
+ }
+ else
+ frostBombTimer -= diff;
+
+ if (timeBombTimer <= diff)
+ {
+ if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(unit, SPELL_TIME_BOMB);
+
+ timeBombTimer = urand(20000, 25000);
+ }
+ else
+ timeBombTimer -= diff;
+ }
- DoMeleeAttackIfReady();
- }
+ DoMeleeAttackIfReady();
+ }
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- _JustDied();
- Talk(SAY_DEATH);
- DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
- }
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
+ }
- void LeaveCombat()
- {
- me->RemoveAllAuras();
- me->CombatStop(false);
- me->DeleteThreatList();
- }
+ void LeaveCombat()
+ {
+ me->RemoveAllAuras();
+ me->CombatStop(false);
+ me->DeleteThreatList();
+ }
- void SpellHit(Unit* /*pCaster*/, const SpellInfo* pSpell) OVERRIDE
- {
- switch (pSpell->Id)
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) OVERRIDE
{
- case SPELL_SUMMON_MENAGERIE:
- me->SetHomePosition(968.66f, 1042.53f, 527.32f, 0.077f);
- LeaveCombat();
- me->CastSpell(me, SPELL_EVOCATE);
- break;
- case SPELL_SUMMON_MENAGERIE_2:
- me->SetHomePosition(1164.02f, 1170.85f, 527.321f, 3.66f);
- LeaveCombat();
- me->CastSpell(me, SPELL_EVOCATE);
- break;
- case SPELL_SUMMON_MENAGERIE_3:
- me->SetHomePosition(1118.31f, 1080.377f, 508.361f, 4.25f);
- LeaveCombat();
- me->CastSpell(me, SPELL_EVOCATE);
- break;
- case SPELL_TELEPORT:
- //! Unconfirmed, previous below
- me->SetDisableGravity(true);
- //me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); // with out it the npc will fall down while is casting
- canCast = true;
- break;
- default:
- break;
+ switch (spellInfo->Id)
+ {
+ case SPELL_SUMMON_MENAGERIE:
+ me->SetHomePosition(968.66f, 1042.53f, 527.32f, 0.077f);
+ LeaveCombat();
+ me->CastSpell(me, SPELL_EVOCATE);
+ break;
+ case SPELL_SUMMON_MENAGERIE_2:
+ me->SetHomePosition(1164.02f, 1170.85f, 527.321f, 3.66f);
+ LeaveCombat();
+ me->CastSpell(me, SPELL_EVOCATE);
+ break;
+ case SPELL_SUMMON_MENAGERIE_3:
+ me->SetHomePosition(1118.31f, 1080.377f, 508.361f, 4.25f);
+ LeaveCombat();
+ me->CastSpell(me, SPELL_EVOCATE);
+ break;
+ case SPELL_TELEPORT:
+ //! Unconfirmed, previous below
+ me->SetDisableGravity(true);
+ //me->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); // with out it the npc will fall down while is casting
+ canCast = true;
+ break;
+ default:
+ break;
+ }
}
- }
+
private:
float x, y;
bool canCast;
bool canGoBack;
+ uint8 platform;
+
uint8 group[3];
uint32 teleportTimer;
@@ -364,7 +331,12 @@ public:
uint32 castArcaneExplosionTimer;
uint32 frostBombTimer;
uint32 timeBombTimer;
- };
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetOculusAI<boss_uromAI>(creature);
+ }
};
void AddSC_boss_urom()
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index bc72c808a6f..385f80ae37d 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -54,105 +54,111 @@ enum Events
class boss_varos : public CreatureScript
{
-public:
- boss_varos() : CreatureScript("boss_varos") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_varosAI(creature);
- }
+ public:
+ boss_varos() : CreatureScript("boss_varos") { }
- struct boss_varosAI : public BossAI
- {
- boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS_EVENT)
+ struct boss_varosAI : public BossAI
{
- if (instance->GetBossState(DATA_DRAKOS_EVENT) != DONE)
- DoCast(me, SPELL_CENTRIFUGE_SHIELD);
- }
+ boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS) { }
- void Reset() OVERRIDE
- {
- _Reset();
+ void InitializeAI() OVERRIDE
+ {
+ BossAI::InitializeAI();
+ if (instance->GetBossState(DATA_DRAKOS) != DONE)
+ DoCast(me, SPELL_CENTRIFUGE_SHIELD);
+ }
- events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, urand(20, 25) * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
- // not sure if this is handled by a timer or hp percentage
- events.ScheduleEvent(EVENT_CALL_AZURE, urand(15, 30) * IN_MILLISECONDS);
+ void Reset() OVERRIDE
+ {
+ _Reset();
- firstCoreEnergize = false;
- coreEnergizeOrientation = 0.0f;
- }
+ events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, urand(20, 25) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
+ // not sure if this is handled by a timer or hp percentage
+ events.ScheduleEvent(EVENT_CALL_AZURE, urand(15, 30) * IN_MILLISECONDS);
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- _EnterCombat();
+ firstCoreEnergize = false;
+ coreEnergizeOrientation = 0.0f;
+ }
- Talk(SAY_AGGRO);
- }
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
- float GetCoreEnergizeOrientation()
- {
- return coreEnergizeOrientation;
- }
+ Talk(SAY_AGGRO);
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ float GetCoreEnergizeOrientation()
+ {
+ return coreEnergizeOrientation;
+ }
- events.Update(diff);
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ events.Update(diff);
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_ENERGIZE_CORES:
- DoCast(me, SPELL_ENERGIZE_CORES);
- events.CancelEvent(EVENT_ENERGIZE_CORES);
- break;
- case EVENT_ENERGIZE_CORES_VISUAL:
- if (!firstCoreEnergize)
- {
- coreEnergizeOrientation = me->GetOrientation();
- firstCoreEnergize = true;
- } else
- coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f);
-
- DoCast(me, SPELL_ENERGIZE_CORES_VISUAL);
- events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
- events.ScheduleEvent(EVENT_ENERGIZE_CORES, 4000);
- break;
- case EVENT_CALL_AZURE:
- // not sure how blizz handles this, i cant see any pattern between the differnt spells
- DoCast(me, SPELL_CALL_AZURE_RING_CAPTAIN);
- Talk(SAY_AZURE);
- Talk(SAY_AZURE_EMOTE);
- events.ScheduleEvent(EVENT_CALL_AZURE, urand(20, 25) * IN_MILLISECONDS);
- break;
- case EVENT_AMPLIFY_MAGIC:
- DoCastVictim(SPELL_CALL_AMPLIFY_MAGIC);
- events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, urand(17, 20) * IN_MILLISECONDS);
- break;
+ switch (eventId)
+ {
+ case EVENT_ENERGIZE_CORES:
+ DoCast(me, SPELL_ENERGIZE_CORES);
+ events.CancelEvent(EVENT_ENERGIZE_CORES);
+ break;
+ case EVENT_ENERGIZE_CORES_VISUAL:
+ if (!firstCoreEnergize)
+ {
+ coreEnergizeOrientation = me->GetOrientation();
+ firstCoreEnergize = true;
+ }
+ else
+ coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f);
+
+ DoCast(me, SPELL_ENERGIZE_CORES_VISUAL);
+ events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
+ events.ScheduleEvent(EVENT_ENERGIZE_CORES, 4000);
+ break;
+ case EVENT_CALL_AZURE:
+ // not sure how blizz handles this, i cant see any pattern between the differnt spells
+ DoCast(me, SPELL_CALL_AZURE_RING_CAPTAIN);
+ Talk(SAY_AZURE);
+ Talk(SAY_AZURE_EMOTE);
+ events.ScheduleEvent(EVENT_CALL_AZURE, urand(20, 25) * IN_MILLISECONDS);
+ break;
+ case EVENT_AMPLIFY_MAGIC:
+ DoCastVictim(SPELL_CALL_AMPLIFY_MAGIC);
+ events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, urand(17, 20) * IN_MILLISECONDS);
+ break;
+ default:
+ break;
+ }
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
+ }
- void JustDied(Unit* /*killer*/) OVERRIDE
+ private:
+ bool firstCoreEnergize;
+ float coreEnergizeOrientation;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- _JustDied();
- Talk(SAY_DEATH);
- DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
+ return GetOculusAI<boss_varosAI>(creature);
}
- private:
- bool firstCoreEnergize;
- float coreEnergizeOrientation;
- };
};
class npc_azure_ring_captain : public CreatureScript
@@ -259,7 +265,6 @@ class spell_varos_centrifuge_shield : public SpellScriptLoader
if (Unit* caster = GetCaster())
{
// flags taken from sniffs
- // UNIT_FLAG_UNK_9 -> means passive but it is not yet implemented in core
if (caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_UNK_6))
{
caster->ToCreature()->SetReactState(REACT_PASSIVE);
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 70424119a0a..b108378910e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -18,354 +18,336 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "InstanceScript.h"
+#include "WorldPacket.h"
#include "oculus.h"
-#include "Player.h"
-#define MAX_ENCOUNTER 4
+DoorData const doorData[] =
+{
+ { GO_DRAGON_CAGE_DOOR, DATA_DRAKOS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+};
-/* The Occulus encounters:
-0 - Drakos the Interrogator
-1 - Varos Cloudstrider
-2 - Mage-Lord Urom
-3 - Ley-Guardian Eregos */
+Position const VerdisaMove = { 949.188f, 1032.91f, 359.967f, 1.093027f };
+Position const BelgaristraszMove = { 941.453f, 1044.1f, 359.967f, 0.1984709f };
+Position const EternosMove = { 943.202f, 1059.35f, 359.967f, 5.757278f };
class instance_oculus : public InstanceMapScript
{
-public:
- instance_oculus() : InstanceMapScript("instance_oculus", 578) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_oculus_InstanceMapScript(map);
- }
-
- struct instance_oculus_InstanceMapScript : public InstanceScript
- {
- instance_oculus_InstanceMapScript(Map* map) : InstanceScript(map) { }
+ public:
+ instance_oculus() : InstanceMapScript(OculusScriptName, 578) { }
- void Initialize() OVERRIDE
+ struct instance_oculus_InstanceMapScript : public InstanceScript
{
- SetBossNumber(MAX_ENCOUNTER);
-
- drakosGUID = 0;
- varosGUID = 0;
- uromGUID = 0;
- eregosGUID = 0;
-
- platformUrom = 0;
- centrifugueConstructCounter = 0;
-
- eregosCacheGUID = 0;
-
- gwhelpList.clear();
- gameObjectList.clear();
+ instance_oculus_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- belgaristraszGUID = 0;
- eternosGUID = 0;
- verdisaGUID = 0;
-}
+ DrakosGUID = 0;
+ VarosGUID = 0;
+ UromGUID = 0;
+ EregosGUID = 0;
- void OnUnitDeath(Unit* unit) OVERRIDE
- {
- Creature* creature = unit->ToCreature();
- if (!creature)
- return;
+ CentrifugueConstructCounter = 0;
- if (creature->GetEntry() != NPC_CENTRIFUGE_CONSTRUCT)
- return;
+ EregosCacheGUID = 0;
- DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, --centrifugueConstructCounter);
+ GreaterWhelpList.clear();
- if (!centrifugueConstructCounter)
- if (Creature* varos = instance->GetCreature(varosGUID))
- varos->RemoveAllAuras();
- }
+ BelgaristraszGUID = 0;
+ EternosGUID = 0;
+ VerdisaGUID = 0;
+ }
- void OnPlayerEnter(Player* player) OVERRIDE
- {
- if (GetBossState(DATA_DRAKOS_EVENT) == DONE && GetBossState(DATA_VAROS_EVENT) != DONE)
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 1);
- player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, centrifugueConstructCounter);
- } else
+ switch (creature->GetEntry())
+ {
+ case NPC_DRAKOS:
+ DrakosGUID = creature->GetGUID();
+ break;
+ case NPC_VAROS:
+ VarosGUID = creature->GetGUID();
+ if (GetBossState(DATA_DRAKOS) == DONE)
+ creature->SetPhaseMask(1, true);
+ break;
+ case NPC_UROM:
+ UromGUID = creature->GetGUID();
+ if (GetBossState(DATA_VAROS) == DONE)
+ creature->SetPhaseMask(1, true);
+ break;
+ case NPC_EREGOS:
+ EregosGUID = creature->GetGUID();
+ if (GetBossState(DATA_UROM) == DONE)
+ creature->SetPhaseMask(1, true);
+ break;
+ case NPC_CENTRIFUGE_CONSTRUCT:
+ if (creature->IsAlive())
+ DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, ++CentrifugueConstructCounter);
+ break;
+ case NPC_BELGARISTRASZ:
+ BelgaristraszGUID = creature->GetGUID();
+ if (GetBossState(DATA_DRAKOS) == DONE)
+ {
+ creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ creature->Relocate(BelgaristraszMove);
+ }
+ break;
+ case NPC_ETERNOS:
+ EternosGUID = creature->GetGUID();
+ if (GetBossState(DATA_DRAKOS) == DONE)
+ {
+ creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ creature->Relocate(EternosMove);
+ }
+ break;
+ case NPC_VERDISA:
+ VerdisaGUID = creature->GetGUID();
+ if (GetBossState(DATA_DRAKOS) == DONE)
+ {
+ creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ creature->Relocate(VerdisaMove);
+ }
+ break;
+ case NPC_GREATER_WHELP:
+ if (GetBossState(DATA_UROM) == DONE)
+ {
+ creature->SetPhaseMask(1, true);
+ GreaterWhelpList.push_back(creature->GetGUID());
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 0);
- player->SendUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, 0);
+ switch (go->GetEntry())
+ {
+ case GO_DRAGON_CAGE_DOOR:
+ AddDoor(go, true);
+ break;
+ case GO_EREGOS_CACHE_N:
+ case GO_EREGOS_CACHE_H:
+ EregosCacheGUID = go->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void ProcessEvent(WorldObject* /*unit*/, uint32 eventId)
- {
- if (eventId != EVENT_CALL_DRAGON)
- return;
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
+ {
+ switch (go->GetEntry())
+ {
+ case GO_DRAGON_CAGE_DOOR:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
+ }
- Creature* varos = instance->GetCreature(varosGUID);
+ void OnUnitDeath(Unit* unit) OVERRIDE
+ {
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
- if (!varos)
- return;
+ if (creature->GetEntry() == NPC_CENTRIFUGE_CONSTRUCT)
+ {
+ DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, --CentrifugueConstructCounter);
- if (Creature* drake = varos->SummonCreature(NPC_AZURE_RING_GUARDIAN, varos->GetPositionX(), varos->GetPositionY(), varos->GetPositionZ()+40))
- drake->AI()->DoAction(ACTION_CALL_DRAGON_EVENT);
- }
+ if (!CentrifugueConstructCounter)
+ if (Creature* varos = instance->GetCreature(VarosGUID))
+ varos->RemoveAllAuras();
+ }
+ }
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void FillInitialWorldStates(WorldPacket& data) OVERRIDE
{
- case NPC_DRAKOS:
- drakosGUID = creature->GetGUID();
- break;
- case NPC_VAROS:
- varosGUID = creature->GetGUID();
- if (GetBossState(DATA_DRAKOS_EVENT) == DONE)
- creature->SetPhaseMask(1, true);
- break;
- case NPC_UROM:
- uromGUID = creature->GetGUID();
- if (GetBossState(DATA_VAROS_EVENT) == DONE)
- creature->SetPhaseMask(1, true);
- break;
- case NPC_EREGOS:
- eregosGUID = creature->GetGUID();
- if (GetBossState(DATA_UROM_EVENT) == DONE)
- creature->SetPhaseMask(1, true);
- break;
- case NPC_CENTRIFUGE_CONSTRUCT:
- if (creature->IsAlive())
- DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, ++centrifugueConstructCounter);
- break;
- case NPC_BELGARISTRASZ:
- belgaristraszGUID = creature->GetGUID();
- if (GetBossState(DATA_DRAKOS_EVENT) == DONE)
- {
- creature->SetWalk(true),
- creature->GetMotionMaster()->MovePoint(0, 941.453f, 1044.1f, 359.967f),
- creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- }
- break;
- case NPC_ETERNOS:
- eternosGUID = creature->GetGUID();
- if (GetBossState(DATA_DRAKOS_EVENT) == DONE)
- {
- creature->SetWalk(true),
- creature->GetMotionMaster()->MovePoint(0, 943.202f, 1059.35f, 359.967f),
- creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- }
- break;
- case NPC_VERDISA:
- verdisaGUID = creature->GetGUID();
- if (GetBossState(DATA_DRAKOS_EVENT) == DONE)
- {
- creature->SetWalk(true),
- creature->GetMotionMaster()->MovePoint(0, 949.188f, 1032.91f, 359.967f),
- creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- }
- break;
- case NPC_GREATER_WHELP:
- if (GetBossState(DATA_UROM_EVENT) == DONE)
- {
- creature->SetPhaseMask(1, true);
- gwhelpList.push_back(creature->GetGUID());
- }
- break;
+ if (GetBossState(DATA_DRAKOS) == DONE && GetBossState(DATA_VAROS) != DONE)
+ {
+ data << uint32(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW) << uint32(1);
+ data << uint32(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT) << uint32(CentrifugueConstructCounter);
+ }
+ else
+ {
+ data << uint32(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW) << uint32(0);
+ data << uint32(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT) << uint32(0);
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void ProcessEvent(WorldObject* /*unit*/, uint32 eventId) OVERRIDE
{
- case GO_DRAGON_CAGE_DOOR:
- if (GetBossState(DATA_DRAKOS_EVENT) == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- gameObjectList.push_back(go->GetGUID());
- break;
- case GO_EREGOS_CACHE_N:
- case GO_EREGOS_CACHE_H:
- eregosCacheGUID = go->GetGUID();
- break;
- default:
- break;
- }
- }
+ if (eventId != EVENT_CALL_DRAGON)
+ return;
- bool SetBossState(uint32 type, EncounterState state) OVERRIDE
- {
- if (!InstanceScript::SetBossState(type, state))
- return false;
+ if (Creature* varos = instance->GetCreature(VarosGUID))
+ if (Creature* drake = varos->SummonCreature(NPC_AZURE_RING_GUARDIAN, varos->GetPositionX(), varos->GetPositionY(), varos->GetPositionZ() + 40))
+ drake->AI()->DoAction(ACTION_CALL_DRAGON_EVENT);
+ }
- switch (type)
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
{
- case DATA_DRAKOS_EVENT:
- if (state == DONE)
- {
- DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 1);
- DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, centrifugueConstructCounter);
- OpenCageDoors();
- FreeDragons();
- if (Creature* varos = instance->GetCreature(varosGUID))
- varos->SetPhaseMask(1, true);
- }
- break;
- case DATA_VAROS_EVENT:
- if (state == DONE)
- DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 0);
- if (Creature* urom = instance->GetCreature(uromGUID))
- urom->SetPhaseMask(1, true);
- break;
- case DATA_UROM_EVENT:
- if (state == DONE)
- {
- if (Creature* eregos = instance->GetCreature(eregosGUID))
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_DRAKOS:
+ if (state == DONE)
{
- eregos->SetPhaseMask(1, true);
- GreaterWhelps();
+ DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 1);
+ DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT, CentrifugueConstructCounter);
+ FreeDragons();
+ if (Creature* varos = instance->GetCreature(VarosGUID))
+ varos->SetPhaseMask(1, true);
}
- }
- break;
- case DATA_EREGOS_EVENT:
- if (state == DONE)
- DoRespawnGameObject(eregosCacheGUID, 7*DAY);
- break;
- }
-
- return true;
- }
+ break;
+ case DATA_VAROS:
+ if (state == DONE)
+ DoUpdateWorldState(WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW, 0);
+ if (Creature* urom = instance->GetCreature(UromGUID))
+ urom->SetPhaseMask(1, true);
+ break;
+ case DATA_UROM:
+ if (state == DONE)
+ {
+ if (Creature* eregos = instance->GetCreature(EregosGUID))
+ {
+ eregos->SetPhaseMask(1, true);
+ GreaterWhelps();
+ }
+ }
+ break;
+ case DATA_EREGOS:
+ if (state == DONE)
+ {
+ if (GameObject* cache = instance->GetGameObject(EregosCacheGUID))
+ {
+ cache->SetRespawnTime(cache->GetRespawnDelay());
+ cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ }
+ break;
+ }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
- {
- case DATA_UROM_PLATAFORM:
- platformUrom = data;
- break;
+ return true;
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_UROM_PLATAFORM: return platformUrom;
- // used by condition system
- case DATA_UROM_EVENT: return GetBossState(DATA_UROM_EVENT);
- }
+ switch (type)
+ {
+ case DATA_DRAKOS:
+ return DrakosGUID;
+ case DATA_VAROS:
+ return VarosGUID;
+ case DATA_UROM:
+ return UromGUID;
+ case DATA_EREGOS:
+ return EregosGUID;
+ default:
+ break;
+ }
- return 0;
- }
+ return 0;
+ }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void FreeDragons()
{
- case DATA_DRAKOS: return drakosGUID;
- case DATA_VAROS: return varosGUID;
- case DATA_UROM: return uromGUID;
- case DATA_EREGOS: return eregosGUID;
- }
+ if (Creature* belgaristrasz = instance->GetCreature(BelgaristraszGUID))
+ {
+ belgaristrasz->SetWalk(true);
+ belgaristrasz->GetMotionMaster()->MovePoint(POINT_MOVE_OUT, BelgaristraszMove);
+ }
- return 0;
- }
+ if (Creature* eternos = instance->GetCreature(EternosGUID))
+ {
+ eternos->SetWalk(true);
+ eternos->GetMotionMaster()->MovePoint(POINT_MOVE_OUT, EternosMove);
+ }
- void OpenCageDoors()
- {
- if (gameObjectList.empty())
- return;
+ if (Creature* verdisa = instance->GetCreature(VerdisaGUID))
+ {
+ verdisa->SetWalk(true);
+ verdisa->GetMotionMaster()->MovePoint(POINT_MOVE_OUT, VerdisaMove);
+ }
+ }
- for (std::list<uint64>::const_iterator itr = gameObjectList.begin(); itr != gameObjectList.end(); ++itr)
+ void GreaterWhelps()
{
- if (GameObject* go = instance->GetGameObject(*itr))
- go->SetGoState(GO_STATE_ACTIVE);
+ for (std::list<uint64>::const_iterator itr = GreaterWhelpList.begin(); itr != GreaterWhelpList.end(); ++itr)
+ if (Creature* gwhelp = instance->GetCreature(*itr))
+ gwhelp->SetPhaseMask(1, true);
}
- }
-
- void FreeDragons()
- {
- if (Creature* belgaristrasz = instance->GetCreature(belgaristraszGUID))
- belgaristrasz->SetWalk(true),
- belgaristrasz->GetMotionMaster()->MovePoint(0, 941.453f, 1044.1f, 359.967f);
- if (Creature* eternos = instance->GetCreature(eternosGUID))
- eternos->SetWalk(true),
- eternos->GetMotionMaster()->MovePoint(0, 943.202f, 1059.35f, 359.967f);
- if (Creature* verdisa = instance->GetCreature(verdisaGUID))
- verdisa->SetWalk(true),
- verdisa->GetMotionMaster()->MovePoint(0, 949.188f, 1032.91f, 359.967f);
- }
- void GreaterWhelps()
- {
- if (gwhelpList.empty())
- return;
-
- for (std::list<uint64>::const_iterator itr = gwhelpList.begin(); itr != gwhelpList.end(); ++itr)
- if (Creature* gwhelp = instance->GetCreature(*itr))
- gwhelp->SetPhaseMask(1, true);
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "T O " << GetBossSaveData();
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
- str_data = saveStream.str();
+ std::ostringstream saveStream;
+ saveStream << "T O " << GetBossSaveData();
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- void Load(const char* in) OVERRIDE
- {
- if (!in)
+ void Load(char const* str) OVERRIDE
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- OUT_LOAD_INST_DATA(in);
+ OUT_LOAD_INST_DATA(str);
- char dataHead1, dataHead2;
+ char dataHead1, dataHead2;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2;
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- if (dataHead1 == 'T' && dataHead2 == 'O')
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (dataHead1 == 'T' && dataHead2 == 'O')
{
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
}
- } else OUT_LOAD_INST_DATA_FAIL;
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- OUT_LOAD_INST_DATA_COMPLETE;
- }
- private:
- uint64 drakosGUID;
- uint64 varosGUID;
- uint64 uromGUID;
- uint64 eregosGUID;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- uint64 belgaristraszGUID;
- uint64 eternosGUID;
- uint64 verdisaGUID;
+ protected:
+ uint64 DrakosGUID;
+ uint64 VarosGUID;
+ uint64 UromGUID;
+ uint64 EregosGUID;
- uint8 platformUrom;
- uint8 centrifugueConstructCounter;
+ uint64 BelgaristraszGUID;
+ uint64 EternosGUID;
+ uint64 VerdisaGUID;
- uint64 eregosCacheGUID;
+ uint8 CentrifugueConstructCounter;
- std::string str_data;
+ uint64 EregosCacheGUID;
- std::list<uint64> gameObjectList;
- std::list<uint64> gwhelpList;
- };
+ std::list<uint64> GreaterWhelpList;
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_oculus_InstanceMapScript(map);
+ }
};
void AddSC_instance_oculus()
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index fd15cd19b37..1230868c020 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -20,77 +20,73 @@
#include "ScriptedGossip.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
-#include "Vehicle.h"
#include "CombatAI.h"
-#include "oculus.h"
#include "Player.h"
-
-#define GOSSIP_ITEM_DRAKES "So where do we go from here?"
-#define GOSSIP_ITEM_BELGARISTRASZ1 "I want to fly on the wings of the Red Flight"
-#define GOSSIP_ITEM_BELGARISTRASZ2 "What abilities do Ruby Drakes have?"
-#define GOSSIP_ITEM_VERDISA1 "I want to fly on the wings of the Green Flight"
-#define GOSSIP_ITEM_VERDISA2 "What abilities do Emerald Drakes have?"
-#define GOSSIP_ITEM_ETERNOS1 "I want to fly on the wings of the Bronze Flight"
-#define GOSSIP_ITEM_ETERNOS2 "What abilities do Amber Drakes have?"
-
-#define HAS_ESSENCE(a) ((a)->HasItemCount(ITEM_EMERALD_ESSENCE) || (a)->HasItemCount(ITEM_AMBER_ESSENCE) || (a)->HasItemCount(ITEM_RUBY_ESSENCE))
+#include "Vehicle.h"
+#include "oculus.h"
enum GossipNPCs
{
- GOSSIP_TEXTID_DRAKES = 13267,
- GOSSIP_TEXTID_BELGARISTRASZ1 = 12916,
- GOSSIP_TEXTID_BELGARISTRASZ2 = 13466,
- GOSSIP_TEXTID_BELGARISTRASZ3 = 13254,
- GOSSIP_TEXTID_VERDISA1 = 1,
- GOSSIP_TEXTID_VERDISA2 = 1,
- GOSSIP_TEXTID_VERDISA3 = 1,
- GOSSIP_TEXTID_ETERNOS1 = 1,
- GOSSIP_TEXTID_ETERNOS2 = 1,
- GOSSIP_TEXTID_ETERNOS3 = 13256,
-
- ITEM_EMERALD_ESSENCE = 37815,
- ITEM_AMBER_ESSENCE = 37859,
- ITEM_RUBY_ESSENCE = 37860,
-
- SPELL_SHOCK_CHARGE = 49836
+ GOSSIP_MENU_VERDISA = 9573,
+ GOSSIP_MENU_ETERNOS = 9574,
+ GOSSIP_MENU_BELGARISTRASZ = 9575,
+
+ ITEM_EMERALD_ESSENCE = 37815,
+ ITEM_AMBER_ESSENCE = 37859,
+ ITEM_RUBY_ESSENCE = 37860
};
enum Drakes
{
-/*Ruby Drake,
-(npc 27756) (item 37860)
-(summoned by spell Ruby Essence = 37860 ---> Call Amber Drake == 49462 ---> Summon 27756)
-*/
- SPELL_RIDE_RUBY_DRAKE_QUE = 49463, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49464
- SPELL_RUBY_DRAKE_SADDLE = 49464, //Allows you to ride on the back of an Amber Drake. ---> Dummy
- SPELL_RUBY_SEARING_WRATH = 50232, //(60 yds) - Instant - Breathes a stream of fire at an enemy dragon, dealing 6800 to 9200 Fire damage and then jumping to additional dragons within 30 yards. Each jump increases the damage by 50%. Affects up to 5 total targets
- SPELL_RUBY_EVASIVE_AURA = 50248, //Instant - Allows the Ruby Drake to generate Evasive Charges when hit by hostile attacks and spells.
- SPELL_RUBY_EVASIVE_MANEUVERS = 50240, //Instant - 5 sec. cooldown - Allows your drake to dodge all incoming attacks and spells. Requires Evasive Charges to use. Each attack or spell dodged while this ability is active burns one Evasive Charge. Lasts 30 sec. or until all charges are exhausted.
- //you do not have acces to until you kill Mage-Lord Urom
- SPELL_RUBY_MARTYR = 50253, //Instant - 10 sec. cooldown - Redirect all harmful spells cast at friendly drakes to yourself for 10 sec.
-
-/*Amber Drake,
-(npc 27755) (item 37859)
-(summoned by spell Amber Essence = 37859 ---> Call Amber Drake == 49461 ---> Summon 27755)
-*/
-
- SPELL_RIDE_AMBER_DRAKE_QUE = 49459, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49460
- SPELL_AMBER_DRAKE_SADDLE = 49460, //Allows you to ride on the back of an Amber Drake. ---> Dummy
- SPELL_AMBER_SHOCK_LANCE = 49840, //(60 yds) - Instant - Deals 4822 to 5602 Arcane damage and detonates all Shock Charges on an enemy dragon. Damage is increased by 6525 for each detonated.
- // SPELL_AMBER_STOP_TIME //Instant - 1 min cooldown - Halts the passage of time, freezing all enemy dragons in place for 10 sec. This attack applies 5 Shock Charges to each affected target.
- //you do not have access to until you kill the Mage-Lord Urom.
- SPELL_AMBER_TEMPORAL_RIFT = 49592, //(60 yds) - Channeled - Channels a temporal rift on an enemy dragon for 10 sec. While trapped in the rift, all damage done to the target is increased by 100%. In addition, for every 15, 000 damage done to a target affected by Temporal Rift, 1 Shock Charge is generated.
-
-/*Emerald Drake,
-(npc 27692) (item 37815),
- (summoned by spell Emerald Essence = 37815 ---> Call Emerald Drake == 49345 ---> Summon 27692)
-*/
- SPELL_RIDE_EMERALD_DRAKE_QUE = 49427, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49346
- SPELL_EMERALD_DRAKE_SADDLE = 49346, //Allows you to ride on the back of an Amber Drake. ---> Dummy
- SPELL_EMERALD_LEECHING_POISON = 50328, //(60 yds) - Instant - Poisons the enemy dragon, leeching 1300 to the caster every 2 sec. for 12 sec. Stacks up to 3 times.
- SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, //(60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25, 000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec.
+/*
+ * Ruby Drake (27756)
+ * (summoned by spell Ruby Essence (37860) --> Call Amber Drake (49462) --> Summon 27756)
+ */
+ SPELL_RIDE_RUBY_DRAKE_QUE = 49463, // Apply Aura: Periodic Trigger, Interval: 3 seconds --> 49464
+ SPELL_RUBY_DRAKE_SADDLE = 49464, // Allows you to ride on the back of an Amber Drake. --> Dummy
+ SPELL_RUBY_SEARING_WRATH = 50232, // (60 yds) - Instant - Breathes a stream of fire at an enemy dragon, dealing 6800 to 9200 Fire damage and then jumping to additional dragons within 30 yards. Each jump increases the damage by 50%. Affects up to 5 total targets
+ SPELL_RUBY_EVASIVE_AURA = 50248, // Instant - Allows the Ruby Drake to generate Evasive Charges when hit by hostile attacks and spells.
+ SPELL_RUBY_EVASIVE_CHARGES = 50241,
+ SPELL_RUBY_EVASIVE_MANEUVERS = 50240, // Instant - 5 sec. cooldown - Allows your drake to dodge all incoming attacks and spells. Requires Evasive Charges to use. Each attack or spell dodged while this ability is active burns one Evasive Charge. Lasts 30 sec. or until all charges are exhausted.
+ // you do not have acces to until you kill Mage-Lord Urom
+ SPELL_RUBY_MARTYR = 50253, // Instant - 10 sec. cooldown - Redirect all harmful spells cast at friendly drakes to yourself for 10 sec.
+
+/*
+ * Amber Drake (27755)
+ * (summoned by spell Amber Essence (37859) --> Call Amber Drake (49461) --> Summon 27755)
+ */
+ SPELL_RIDE_AMBER_DRAKE_QUE = 49459, // Apply Aura: Periodic Trigger, Interval: 3 seconds --> 49460
+ SPELL_AMBER_DRAKE_SADDLE = 49460, // Allows you to ride on the back of an Amber Drake. --> Dummy
+ SPELL_AMBER_SHOCK_CHARGE = 49836,
+ SPELL_AMBER_SHOCK_LANCE = 49840, // (60 yds) - Instant - Deals 4822 to 5602 Arcane damage and detonates all Shock Charges on an enemy dragon. Damage is increased by 6525 for each detonated.
+ SPELL_AMBER_STOP_TIME = 49838, // Instant - 1 min cooldown - Halts the passage of time, freezing all enemy dragons in place for 10 sec. This attack applies 5 Shock Charges to each affected target.
+ // you do not have access to until you kill the Mage-Lord Urom.
+ SPELL_AMBER_TEMPORAL_RIFT = 49592, // (60 yds) - Channeled - Channels a temporal rift on an enemy dragon for 10 sec. While trapped in the rift, all damage done to the target is increased by 100%. In addition, for every 15, 000 damage done to a target affected by Temporal Rift, 1 Shock Charge is generated.
+
+/*
+ * Emerald Drake (27692)
+ * (summoned by spell Emerald Essence (37815) --> Call Emerald Drake (49345) --> Summon 27692)
+ */
+ SPELL_RIDE_EMERALD_DRAKE_QUE = 49427, // Apply Aura: Periodic Trigger, Interval: 3 seconds --> 49346
+ SPELL_EMERALD_DRAKE_SADDLE = 49346, // Allows you to ride on the back of an Amber Drake. --> Dummy
+ SPELL_EMERALD_LEECHING_POISON = 50328, // (60 yds) - Instant - Poisons the enemy dragon, leeching 1300 to the caster every 2 sec. for 12 sec. Stacks up to 3 times.
+ SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, // (60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25, 000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec.
// you do not have access to until you kill the Mage-Lord Urom
- SPELL_EMERALD_DREAM_FUNNEL = 50344, //(60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels.
+ SPELL_EMERALD_DREAM_FUNNEL = 50344, // (60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels.
+
+ // Misc
+ POINT_LAND = 2,
+ POINT_TAKE_OFF = 3
+};
+
+enum DrakeEvents
+{
+ EVENT_WELCOME = 1,
+ EVENT_ABILITIES,
+ EVENT_SPECIAL_ATTACK,
+ EVENT_LOW_HEALTH,
+ EVENT_RESET_LOW_HEALTH,
+ EVENT_TAKE_OFF
};
enum Says
@@ -107,420 +103,500 @@ enum Says
class npc_verdisa_beglaristrasz_eternos : public CreatureScript
{
-public:
- npc_verdisa_beglaristrasz_eternos() : CreatureScript("npc_verdisa_beglaristrasz_eternos") { }
+ public:
+ npc_verdisa_beglaristrasz_eternos() : CreatureScript("npc_verdisa_beglaristrasz_eternos") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
- {
- player->PlayerTalkClass->ClearMenus();
- switch (creature->GetEntry())
+ struct npc_verdisa_beglaristrasz_eternosAI : public ScriptedAI
{
- case NPC_VERDISA: //Verdisa
+ npc_verdisa_beglaristrasz_eternosAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void StoreEssence(Player* player, uint32 itemId)
{
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- if (!HAS_ESSENCE(player))
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VERDISA1, creature->GetGUID());
- }
- else
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VERDISA2, creature->GetGUID());
- }
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- {
- ItemPosCountVec dest;
- uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_EMERALD_ESSENCE, 1);
- if (msg == EQUIP_ERR_OK)
- player->StoreNewItem(dest, ITEM_EMERALD_ESSENCE, true);
- player->CLOSE_GOSSIP_MENU();
- break;
- }
- case GOSSIP_ACTION_INFO_DEF + 3:
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VERDISA3, creature->GetGUID());
- break;
- }
- break;
+ /// @todo: should be handled by spell, but not found in dbc (49450 and other?)
+ uint32 count = 1;
+ ItemPosCountVec dest;
+ uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count);
+ if (msg == EQUIP_ERR_OK)
+ if (Item* item = player->StoreNewItem(dest, itemId, true))
+ player->SendNewItem(item, count, true, true);
}
- case NPC_BELGARISTRASZ: //Belgaristrasz
+
+ void RemoveEssence(Player* player, uint32 itemId)
{
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- if (!HAS_ESSENCE(player))
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_BELGARISTRASZ1, creature->GetGUID());
- }
- else
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_BELGARISTRASZ2, creature->GetGUID());
- }
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- {
- ItemPosCountVec dest;
- uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_RUBY_ESSENCE, 1);
- if (msg == EQUIP_ERR_OK)
- player->StoreNewItem(dest, ITEM_RUBY_ESSENCE, true);
- player->CLOSE_GOSSIP_MENU();
- break;
- }
- case GOSSIP_ACTION_INFO_DEF + 3:
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_BELGARISTRASZ3, creature->GetGUID());
- break;
- }
- break;
+ player->DestroyItemCount(itemId, 1, true, false);
}
- case NPC_ETERNOS: //Eternos
+
+ void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) OVERRIDE
{
- switch (action)
+ switch (menuId)
{
- case GOSSIP_ACTION_INFO_DEF + 1:
- if (!HAS_ESSENCE(player))
+ case GOSSIP_MENU_VERDISA:
+ if (gossipListId >= 1 && gossipListId <= 3)
{
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ETERNOS1, creature->GetGUID());
+ if (gossipListId == 2)
+ RemoveEssence(player, ITEM_AMBER_ESSENCE);
+ else if (gossipListId == 3)
+ RemoveEssence(player, ITEM_RUBY_ESSENCE);
+
+ StoreEssence(player, ITEM_EMERALD_ESSENCE);
+ break;
}
- else
+ return;
+ case GOSSIP_MENU_ETERNOS:
+ if (gossipListId >= 1 && gossipListId <= 3)
{
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ETERNOS2, creature->GetGUID());
+ if (gossipListId == 2)
+ RemoveEssence(player, ITEM_EMERALD_ESSENCE);
+ else if (gossipListId == 3)
+ RemoveEssence(player, ITEM_RUBY_ESSENCE);
+
+ StoreEssence(player, ITEM_AMBER_ESSENCE);
+ break;
}
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- {
- ItemPosCountVec dest;
- uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_AMBER_ESSENCE, 1);
- if (msg == EQUIP_ERR_OK)
- player->StoreNewItem(dest, ITEM_AMBER_ESSENCE, true);
- player->CLOSE_GOSSIP_MENU();
- break;
- }
- case GOSSIP_ACTION_INFO_DEF + 3:
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ETERNOS3, creature->GetGUID());
- break;
+ return;
+ case GOSSIP_MENU_BELGARISTRASZ:
+ if (gossipListId <= 2)
+ {
+ if (gossipListId == 1)
+ RemoveEssence(player, ITEM_AMBER_ESSENCE);
+ else if (gossipListId == 2)
+ RemoveEssence(player, ITEM_EMERALD_ESSENCE);
+
+ StoreEssence(player, ITEM_RUBY_ESSENCE);
+ break;
+ }
+ return;
+ default:
+ return;
}
- break;
+ player->PlayerTalkClass->SendCloseGossip();
}
- }
-
- return true;
- }
- bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (InstanceScript* instance = creature->GetInstanceScript())
- {
- if (instance->GetBossState(DATA_DRAKOS_EVENT) == DONE)
+ void MovementInform(uint32 /*type*/, uint32 id) OVERRIDE
{
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_DRAKES, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_DRAKES, creature->GetGUID());
- }
- }
+ if (id != POINT_MOVE_OUT)
+ return;
- return true;
- }
+ // When Belgaristraz finish his moving say grateful text
+ if (me->GetEntry() == NPC_BELGARISTRASZ)
+ Talk(SAY_BELGARISTRASZ);
- struct npc_verdisa_beglaristrasz_eternosAI : public ScriptedAI
- {
- npc_verdisa_beglaristrasz_eternosAI(Creature* creature) : ScriptedAI(creature) { }
+ // The gossip flag should activate when Drakos die and not from DB
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
+ };
- void MovementInform(uint32 /*type*/, uint32 id) OVERRIDE
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (id)
- return;
-
- // When Belgaristraz finish his moving say grateful text
- if (me->GetEntry() == NPC_BELGARISTRASZ)
- Talk(SAY_BELGARISTRASZ);
-
- // The gossip flag should activate when Drakos die and not from DB
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ return GetOculusAI<npc_verdisa_beglaristrasz_eternosAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_verdisa_beglaristrasz_eternosAI(creature);
- }
};
class npc_image_belgaristrasz : public CreatureScript
{
-public:
- npc_image_belgaristrasz() : CreatureScript("npc_image_belgaristrasz") { }
-
- struct npc_image_belgaristraszAI : public ScriptedAI
- {
- npc_image_belgaristraszAI(Creature* creature) : ScriptedAI(creature) { }
+ public:
+ npc_image_belgaristrasz() : CreatureScript("npc_image_belgaristrasz") { }
- void IsSummonedBy(Unit* summoner) OVERRIDE
+ struct npc_image_belgaristraszAI : public ScriptedAI
{
- if (summoner->GetEntry() == NPC_VAROS)
- {
- Talk(SAY_VAROS);
- me->DespawnOrUnsummon(60000);
- }
- if (summoner->GetEntry() == NPC_UROM)
+ npc_image_belgaristraszAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void IsSummonedBy(Unit* summoner) OVERRIDE
{
- Talk(SAY_UROM);
- me->DespawnOrUnsummon(60000);
+ if (summoner->GetEntry() == NPC_VAROS)
+ {
+ Talk(SAY_VAROS);
+ me->DespawnOrUnsummon(60000);
+ }
+
+ if (summoner->GetEntry() == NPC_UROM)
+ {
+ Talk(SAY_UROM);
+ me->DespawnOrUnsummon(60000);
+ }
}
- }
- };
+ };
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_image_belgaristraszAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetOculusAI<npc_image_belgaristraszAI>(creature);
+ }
};
class npc_ruby_emerald_amber_drake : public CreatureScript
{
-public:
- npc_ruby_emerald_amber_drake() : CreatureScript("npc_ruby_emerald_amber_drake") { }
+ public:
+ npc_ruby_emerald_amber_drake() : CreatureScript("npc_ruby_emerald_amber_drake") { }
- struct npc_ruby_emerald_amber_drakeAI : public VehicleAI
- {
- npc_ruby_emerald_amber_drakeAI(Creature* creature) : VehicleAI(creature)
+ struct npc_ruby_emerald_amber_drakeAI : public VehicleAI
{
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
+ npc_ruby_emerald_amber_drakeAI(Creature* creature) : VehicleAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
- uint64 summonerGUID;
- uint32 WelcomeTimer;
- uint32 WelcomeSequelTimer;
- uint32 SpecialTimer;
- uint32 WarningTimer;
- uint32 TakeOffTimer;
+ void Reset() OVERRIDE
+ {
+ _events.Reset();
+ _healthWarning = true;
+ }
- bool WelcomeOff;
- bool WelcomeSequelOff;
- bool SpecialOff;
- bool HealthWarningOff;
- bool DisableTakeOff;
+ void IsSummonedBy(Unit* summoner) OVERRIDE
+ {
+ if (_instance->GetBossState(DATA_EREGOS) == IN_PROGRESS)
+ if (Creature* eregos = me->FindNearestCreature(NPC_EREGOS, 450.0f, true))
+ eregos->DespawnOrUnsummon(); // On retail this kills abusive call of drake during engaged Eregos
- void Reset() OVERRIDE
- {
- summonerGUID = 0;
- WelcomeTimer = 4500;
- WelcomeSequelTimer = 4500;
- SpecialTimer = 10000;
- WarningTimer = 25000;
- TakeOffTimer = 3500;
-
- WelcomeOff = false;
- WelcomeSequelOff = false;
- SpecialOff = false;
- HealthWarningOff = false;
- DisableTakeOff = false;
- }
+ me->SetFacingToObject(summoner);
- void IsSummonedBy(Unit* summoner) OVERRIDE
- {
- if (instance->GetBossState(DATA_EREGOS_EVENT) == IN_PROGRESS)
- if (Creature* eregos = me->FindNearestCreature(NPC_EREGOS, 450.0f, true))
+ switch (me->GetEntry())
{
- eregos->DespawnOrUnsummon(); // On retail this kills abusive call of drake during engaged Eregos
+ case NPC_RUBY_DRAKE_VEHICLE:
+ me->CastSpell(summoner, SPELL_RIDE_RUBY_DRAKE_QUE);
+ break;
+ case NPC_EMERALD_DRAKE_VEHICLE:
+ me->CastSpell(summoner, SPELL_RIDE_EMERALD_DRAKE_QUE);
+ break;
+ case NPC_AMBER_DRAKE_VEHICLE:
+ me->CastSpell(summoner, SPELL_RIDE_AMBER_DRAKE_QUE);
+ break;
+ default:
+ return;
}
- summonerGUID = summoner->GetGUID();
- me->SetFacingToObject(summoner);
- // TO DO: Drake Ques should be casted from vehicle to player, however the way core handle triggered spells from auras break it no matter the conditions. So this change the caster and give the same result until someone fix triggered spells from auras that involve implicit targets or make exception for this case.
- if (me->GetEntry() == NPC_RUBY_DRAKE_VEHICLE)
- summoner->CastSpell(summoner, SPELL_RIDE_RUBY_DRAKE_QUE);
- if (me->GetEntry() == NPC_EMERALD_DRAKE_VEHICLE)
- summoner->CastSpell(summoner, SPELL_RIDE_EMERALD_DRAKE_QUE);
- if (me->GetEntry() == NPC_AMBER_DRAKE_VEHICLE)
- summoner->CastSpell(summoner, SPELL_RIDE_AMBER_DRAKE_QUE);
- Position pos;
- summoner->GetPosition(&pos);
- me->GetMotionMaster()->MovePoint(0, pos);
- }
- void MovementInform(uint32 type, uint32 id) OVERRIDE
- {
- if (type == POINT_MOTION_TYPE && id == 0)
- me->SetDisableGravity(false); // Needed this for proper animation after spawn, the summon in air fall to ground bug leave no other option for now, if this isn't used the drake will only walk on move.
- }
+ Position pos;
+ summoner->GetPosition(&pos);
+ me->GetMotionMaster()->MovePoint(POINT_LAND, pos);
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!(instance->GetBossState(DATA_VAROS_EVENT) == DONE))
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
{
- if (me->HasAuraType(SPELL_AURA_CONTROL_VEHICLE))
- {
- if (!(WelcomeOff))
- {
- if (WelcomeTimer <= diff)
- {
- Talk(WHISPER_DRAKES_WELCOME, me->GetCreatorGUID());
- WelcomeOff = true;
- WelcomeSequelOff = true;
- }
- else WelcomeTimer -= diff;
- }
- }
+ if (type == POINT_MOTION_TYPE && id == POINT_LAND)
+ me->SetDisableGravity(false); // Needed this for proper animation after spawn, the summon in air fall to ground bug leave no other option for now, if this isn't used the drake will only walk on move.
}
- if (me->HasAuraType(SPELL_AURA_CONTROL_VEHICLE))
+
+ void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) OVERRIDE
{
- if (WelcomeSequelOff)
+ if (passenger->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if (apply)
{
- if (WelcomeSequelTimer <= diff)
- {
- Talk(WHISPER_DRAKES_ABILITIES, me->GetCreatorGUID());
- WelcomeSequelOff = false;
- }
- else WelcomeSequelTimer -= diff;
- }
+ if (_instance->GetBossState(DATA_VAROS) != DONE)
+ _events.ScheduleEvent(EVENT_WELCOME, 10 * IN_MILLISECONDS);
- if (instance->GetBossState(DATA_UROM_EVENT) == DONE)
+ else if (_instance->GetBossState(DATA_UROM) == DONE)
+ _events.ScheduleEvent(EVENT_SPECIAL_ATTACK, 10 * IN_MILLISECONDS);
+ }
+ else
{
- if (!(SpecialOff))
- {
- if (SpecialTimer <= diff)
- {
- Talk(WHISPER_DRAKES_SPECIAL, me->GetCreatorGUID());
- SpecialOff = true;
- }
- else SpecialTimer -= diff;
- }
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_TAKE_OFF, 2 * IN_MILLISECONDS);
}
+ }
- if (!(HealthWarningOff))
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (_healthWarning)
{
if (me->GetHealthPct() <= 40.0f)
- {
- Talk(WHISPER_DRAKES_LOWHEALTH, me->GetCreatorGUID());
- HealthWarningOff = true;
- }
+ _events.ScheduleEvent(EVENT_LOW_HEALTH, 0);
}
- if (HealthWarningOff)
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (WarningTimer <= diff)
+ switch (eventId)
{
- HealthWarningOff = false;
- WarningTimer = 25000;
+ case EVENT_WELCOME:
+ Talk(WHISPER_DRAKES_WELCOME, me->GetCreatorGUID());
+ _events.ScheduleEvent(EVENT_ABILITIES, 5 * IN_MILLISECONDS);
+ break;
+ case EVENT_ABILITIES:
+ Talk(WHISPER_DRAKES_ABILITIES, me->GetCreatorGUID());
+ break;
+ case EVENT_SPECIAL_ATTACK:
+ Talk(WHISPER_DRAKES_SPECIAL, me->GetCreatorGUID());
+ break;
+ case EVENT_LOW_HEALTH:
+ Talk(WHISPER_DRAKES_LOWHEALTH, me->GetCreatorGUID());
+ _healthWarning = false;
+ _events.ScheduleEvent(EVENT_RESET_LOW_HEALTH, 25000);
+ break;
+ case EVENT_RESET_LOW_HEALTH:
+ _healthWarning = true;
+ break;
+ case EVENT_TAKE_OFF:
+ {
+ me->DespawnOrUnsummon(2050);
+ me->SetOrientation(2.5f);
+ me->SetSpeed(MOVE_FLIGHT, 1.0f, true);
+ Talk(SAY_DRAKES_TAKEOFF);
+ Position pos;
+ me->GetPosition(&pos);
+ Position offset = { 10.0f, 10.0f, 12.0f, 0.0f };
+ pos.RelocateOffset(offset);
+ me->SetDisableGravity(true);
+ me->GetMotionMaster()->MovePoint(POINT_TAKE_OFF, pos);
+ break;
+ }
+ default:
+ break;
}
- else WarningTimer -= diff;
}
+ };
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ bool _healthWarning;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetOculusAI<npc_ruby_emerald_amber_drakeAI>(creature);
+ }
+};
+
+// 49345 - Call Emerald Drake
+// 49461 - Call Amber Drake
+// 49462 - Call Ruby Drake
+class spell_oculus_call_ruby_emerald_amber_drake : public SpellScriptLoader
+{
+ public:
+ spell_oculus_call_ruby_emerald_amber_drake() : SpellScriptLoader("spell_oculus_call_ruby_emerald_amber_drake") { }
+
+ class spell_oculus_call_ruby_emerald_amber_drake_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_oculus_call_ruby_emerald_amber_drake_SpellScript);
+
+ void ChangeSummonPos(SpellEffIndex /*effIndex*/)
+ {
+ // Adjust effect summon position
+ WorldLocation summonPos = *GetExplTargetDest();
+ Position offset = { 0.0f, 0.0f, 12.0f, 0.0f };
+ summonPos.RelocateOffset(offset);
+ SetExplTargetDest(summonPos);
+ GetHitDest()->RelocateOffset(offset);
}
- if (!(me->HasAuraType(SPELL_AURA_CONTROL_VEHICLE)))
+ void ModDestHeight(SpellEffIndex /*effIndex*/)
{
- if (!(DisableTakeOff))
- {
- if (TakeOffTimer <= diff)
- {
- me->DespawnOrUnsummon(2050);
- me->SetOrientation(2.5f);
- me->SetSpeed(MOVE_FLIGHT, 1.0f, true);
- Talk(SAY_DRAKES_TAKEOFF);
- Position pos;
- me->GetPosition(&pos);
- pos.m_positionX += 10.0f;
- pos.m_positionY += 10.0f;
- pos.m_positionZ += 12.0f;
- me->GetMotionMaster()->MovePoint(1, pos);
- DisableTakeOff = true;
- }
- else TakeOffTimer -= diff;
- }
+ // Used to cast visual effect at proper position
+ Position offset = { 0.0f, 0.0f, 12.0f, 0.0f };
+ const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHit += SpellEffectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON);
+ OnEffectLaunch += SpellEffectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON);
}
};
- };
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_ruby_emerald_amber_drakeAI(creature);
- }
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_oculus_call_ruby_emerald_amber_drake_SpellScript();
+ }
};
-class spell_gen_stop_time : public SpellScriptLoader
+// 49427 - Ride Emerald Drake Que
+// 49459 - Ride Amber Drake Que
+// 49463 - Ride Ruby Drake Que
+class spell_oculus_ride_ruby_emerald_amber_drake_que : public SpellScriptLoader
{
-public:
- spell_gen_stop_time() : SpellScriptLoader("spell_gen_stop_time") { }
+ public:
+ spell_oculus_ride_ruby_emerald_amber_drake_que() : SpellScriptLoader("spell_oculus_ride_ruby_emerald_amber_drake_que") { }
- class spell_gen_stop_time_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_stop_time_AuraScript);
+ class spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript);
+
+ void HandlePeriodic(AuraEffect const* aurEff)
+ {
+ // caster of the triggered spell is wrong for an unknown reason, handle it here correctly
+ PreventDefaultAction();
+ if (Unit* caster = GetCaster())
+ GetTarget()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true);
+ }
- void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void Register() OVERRIDE
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
{
- Unit* caster = GetCaster();
- if (!caster)
- return;
- Unit* target = GetTarget();
- for (uint32 i = 0; i < 5; ++i)
- caster->CastSpell(target, SPELL_SHOCK_CHARGE, false);
+ return new spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript();
}
+};
+
+// 50240 - Evasive Maneuvers
+class spell_oculus_evasive_maneuvers : public SpellScriptLoader
+{
+ public:
+ spell_oculus_evasive_maneuvers() : SpellScriptLoader("spell_oculus_evasive_maneuvers") { }
- void Register() OVERRIDE
+ class spell_oculus_evasive_maneuvers_AuraScript : public AuraScript
{
- AfterEffectApply += AuraEffectApplyFn(spell_gen_stop_time_AuraScript::Apply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
- }
- };
+ PrepareAuraScript(spell_oculus_evasive_maneuvers_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_RUBY_EVASIVE_CHARGES))
+ return false;
+ return true;
+ }
- AuraScript* GetAuraScript() const OVERRIDE
- {
- return new spell_gen_stop_time_AuraScript();
- }
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->RemoveAuraFromStack(SPELL_RUBY_EVASIVE_CHARGES);
+ if (!GetTarget()->HasAura(SPELL_RUBY_EVASIVE_CHARGES))
+ Remove();
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_oculus_evasive_maneuvers_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_oculus_evasive_maneuvers_AuraScript();
+ }
};
-class spell_call_ruby_emerald_amber_drake : public SpellScriptLoader
+// 49840 - Shock Lance
+class spell_oculus_shock_lance : public SpellScriptLoader
{
-public:
- spell_call_ruby_emerald_amber_drake() : SpellScriptLoader("spell_call_ruby_emerald_amber_drake") { }
+ public:
+ spell_oculus_shock_lance() : SpellScriptLoader("spell_oculus_shock_lance") { }
+
+ class spell_oculus_shock_lance_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_oculus_shock_lance_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE))
+ return false;
+ return true;
+ }
- class spell_call_ruby_emerald_amber_drake_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_call_ruby_emerald_amber_drake_SpellScript);
+ void CalcDamage()
+ {
+ int32 damage = GetHitDamage();
+ if (Unit* target = GetHitUnit())
+ if (AuraEffect const* shockCharges = target->GetAuraEffect(SPELL_AMBER_SHOCK_CHARGE, EFFECT_0, GetCaster()->GetGUID()))
+ {
+ damage += shockCharges->GetAmount();
+ shockCharges->GetBase()->Remove();
+ }
+
+ SetHitDamage(damage);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnHit += SpellHitFn(spell_oculus_shock_lance_SpellScript::CalcDamage);
+ }
+ };
- void ChangeSummonPos(SpellEffIndex /*effIndex*/)
+ SpellScript* GetSpellScript() const OVERRIDE
{
- // Adjust effect summon position
- WorldLocation summonPos = *GetExplTargetDest();
- Position offset = {0.0f, 0.0f, 12.0f, 0.0f};
- summonPos.RelocateOffset(offset);
- SetExplTargetDest(summonPos);
- GetHitDest()->RelocateOffset(offset);
+ return new spell_oculus_shock_lance_SpellScript();
}
+};
+
+// 49838 - Stop Time
+class spell_oculus_stop_time : public SpellScriptLoader
+{
+ public:
+ spell_oculus_stop_time() : SpellScriptLoader("spell_oculus_stop_time") { }
- void ModDestHeight(SpellEffIndex /*effIndex*/)
+ class spell_oculus_stop_time_AuraScript : public AuraScript
{
- // Used to cast visual effect at proper position
- Position offset = {0.0f, 0.0f, 12.0f, 0.0f};
- const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset);
- }
+ PrepareAuraScript(spell_oculus_stop_time_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE))
+ return false;
+ return true;
+ }
+
+ void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* caster = GetCaster();
+ if (!caster)
+ return;
+
+ Unit* target = GetTarget();
+ for (uint32 i = 0; i < 5; ++i)
+ caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, true);
+ }
+
+ void Register() OVERRIDE
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_oculus_stop_time_AuraScript::Apply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
- void Register() OVERRIDE
+ AuraScript* GetAuraScript() const OVERRIDE
{
- OnEffectHit += SpellEffectFn(spell_call_ruby_emerald_amber_drake_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON);
- OnEffectLaunch += SpellEffectFn(spell_call_ruby_emerald_amber_drake_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON);
+ return new spell_oculus_stop_time_AuraScript();
}
- };
-
- SpellScript* GetSpellScript() const OVERRIDE
- {
- return new spell_call_ruby_emerald_amber_drake_SpellScript();
- }
};
+// 49592 - Temporal Rift
+class spell_oculus_temporal_rift : public SpellScriptLoader
+{
+ public:
+ spell_oculus_temporal_rift() : SpellScriptLoader("spell_oculus_temporal_rift") { }
+
+ class spell_oculus_temporal_rift_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_oculus_temporal_rift_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 amount = aurEff->GetAmount() + eventInfo.GetDamageInfo()->GetDamage();
+
+ if (amount >= 15000)
+ {
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(GetTarget(), SPELL_AMBER_SHOCK_CHARGE, true);
+ amount -= 15000;
+ }
+
+ const_cast<AuraEffect*>(aurEff)->SetAmount(amount);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_oculus_temporal_rift_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_oculus_temporal_rift_AuraScript();
+ }
+};
+// 50341 - Touch the Nightmare
class spell_oculus_touch_the_nightmare : public SpellScriptLoader
{
public:
@@ -547,7 +623,8 @@ class spell_oculus_touch_the_nightmare : public SpellScriptLoader
}
};
-class spell_oculus_dream_funnel: public SpellScriptLoader
+// 50344 - Dream Funnel
+class spell_oculus_dream_funnel : public SpellScriptLoader
{
public:
spell_oculus_dream_funnel() : SpellScriptLoader("spell_oculus_dream_funnel") { }
@@ -582,8 +659,12 @@ void AddSC_oculus()
new npc_verdisa_beglaristrasz_eternos();
new npc_image_belgaristrasz();
new npc_ruby_emerald_amber_drake();
- new spell_gen_stop_time();
- new spell_call_ruby_emerald_amber_drake();
+ new spell_oculus_call_ruby_emerald_amber_drake();
+ new spell_oculus_ride_ruby_emerald_amber_drake_que();
+ new spell_oculus_evasive_maneuvers();
+ new spell_oculus_shock_lance();
+ new spell_oculus_stop_time();
+ new spell_oculus_temporal_rift();
new spell_oculus_touch_the_nightmare();
new spell_oculus_dream_funnel();
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
index 2dd5df3bc3b..6f34cfbf6e5 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
@@ -15,59 +15,55 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_OCULUS_H
-#define DEF_OCULUS_H
+#ifndef OCULUS_H_
+#define OCULUS_H_
-enum Data
-{
- DATA_DRAKOS_EVENT,
- DATA_VAROS_EVENT,
- DATA_UROM_EVENT,
- DATA_EREGOS_EVENT,
- DATA_UROM_PLATAFORM
-};
+#define OculusScriptName "instance_oculus"
+
+uint32 const EncounterCount = 4;
-enum Data64
+enum DataTypes
{
- DATA_DRAKOS,
- DATA_VAROS,
- DATA_UROM,
- DATA_EREGOS
+ // Encounter States/Boss GUIDs
+ DATA_DRAKOS = 0,
+ DATA_VAROS = 1,
+ DATA_UROM = 2,
+ DATA_EREGOS = 3
};
-enum Bosses_NPCs
+enum CreatureIds
{
NPC_DRAKOS = 27654,
NPC_VAROS = 27447,
NPC_UROM = 27655,
NPC_EREGOS = 27656,
- NPC_AZURE_RING_GUARDIAN = 28236,
- NPC_CENTRIFUGE_CONSTRUCT = 27641,
- NPC_RUBY_DRAKE_VEHICLE = 27756,
- NPC_EMERALD_DRAKE_VEHICLE = 27692,
- NPC_AMBER_DRAKE_VEHICLE = 27755,
- NPC_VERDISA = 27657,
- NPC_BELGARISTRASZ = 27658,
- NPC_ETERNOS = 27659,
- NPC_GREATER_WHELP = 28276
+ NPC_AZURE_RING_GUARDIAN = 28236,
+ NPC_CENTRIFUGE_CONSTRUCT = 27641,
+ NPC_RUBY_DRAKE_VEHICLE = 27756,
+ NPC_EMERALD_DRAKE_VEHICLE = 27692,
+ NPC_AMBER_DRAKE_VEHICLE = 27755,
+ NPC_VERDISA = 27657,
+ NPC_BELGARISTRASZ = 27658,
+ NPC_ETERNOS = 27659,
+ NPC_GREATER_WHELP = 28276
};
-enum GameObjects
+enum GameObjectIds
{
- GO_DRAGON_CAGE_DOOR = 193995,
- GO_EREGOS_CACHE_N = 191349,
- GO_EREGOS_CACHE_H = 193603
+ GO_DRAGON_CAGE_DOOR = 193995,
+ GO_EREGOS_CACHE_N = 191349,
+ GO_EREGOS_CACHE_H = 193603
};
enum SpellEvents
{
- EVENT_CALL_DRAGON = 12229
+ EVENT_CALL_DRAGON = 12229
};
enum CreatureActions
{
- ACTION_CALL_DRAGON_EVENT = 1
+ ACTION_CALL_DRAGON_EVENT = 1
};
enum OculusWorldStates
@@ -78,7 +74,19 @@ enum OculusWorldStates
enum OculusSpells
{
- SPELL_CENTRIFUGE_SHIELD = 50053,
- SPELL_DEATH_SPELL = 50415
+ SPELL_CENTRIFUGE_SHIELD = 50053,
+ SPELL_DEATH_SPELL = 50415
};
-#endif
+
+enum Misc
+{
+ POINT_MOVE_OUT = 1
+};
+
+template<class AI>
+AI* GetOculusAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, OculusScriptName);
+}
+
+#endif // OCULUS_H_
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index b70bda76d76..77c19422da0 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -58,19 +58,14 @@ enum Creatures
NPC_STASIS_CONTROLLER = 26688
};
-struct Locations
+Position const moveLocs[] =
{
- float x, y, z;
-};
-
-struct Locations moveLocs[]=
-{
- {261.6f, -449.3f, 109.5f},
- {263.3f, -454.0f, 109.5f},
- {291.5f, -450.4f, 109.5f},
- {291.5f, -454.0f, 109.5f},
- {310.0f, -453.4f, 109.5f},
- {238.6f, -460.7f, 109.5f}
+ { 261.6f, -449.3f, 109.5f, 0.0f },
+ { 263.3f, -454.0f, 109.5f, 0.0f },
+ { 291.5f, -450.4f, 109.5f, 0.0f },
+ { 291.5f, -454.0f, 109.5f, 0.0f },
+ { 310.0f, -453.4f, 109.5f, 0.0f },
+ { 238.6f, -460.7f, 109.5f, 0.0f }
};
enum Phase
@@ -83,21 +78,20 @@ enum Phase
PHASE_NONE
};
+enum Misc
+{
+ ACTION_NEXT_PHASE,
+};
+
class boss_palehoof : public CreatureScript
{
public:
boss_palehoof() : CreatureScript("boss_palehoof") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ struct boss_palehoofAI : public BossAI
{
- return new boss_palehoofAI(creature);
- }
-
- struct boss_palehoofAI : public ScriptedAI
- {
- boss_palehoofAI(Creature* creature) : ScriptedAI(creature)
+ boss_palehoofAI(Creature* creature) : BossAI(creature, DATA_GORTOK_PALEHOOF)
{
- instance = creature->GetInstanceScript();
}
uint32 uiArcingSmashTimer;
@@ -108,10 +102,10 @@ public:
uint8 AddCount;
Phase Sequence[4];
- InstanceScript* instance;
-
void Reset() OVERRIDE
{
+ _Reset();
+
/// There is a good reason to store them like this, we are going to shuffle the order.
for (uint32 i = PHASE_FRENZIED_WORGEN; i < PHASE_GORTOK_PALEHOOF; ++i)
Sequence[i] = Phase(i);
@@ -129,32 +123,15 @@ public:
currentPhase = PHASE_NONE;
- if (instance)
- {
- instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, NOT_STARTED);
-
- Creature* temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_FRENZIED_WORGEN));
- if (temp && !temp->IsAlive())
- temp->Respawn();
+ for (uint8 i = DATA_FRENZIED_WORGEN; i <= DATA_FEROCIOUS_RHINO; ++i)
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(i)))
+ if (!temp->IsAlive())
+ temp->Respawn();
- temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_FEROCIOUS_RHINO));
- if (temp && !temp->IsAlive())
- temp->Respawn();
-
- temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_MASSIVE_JORMUNGAR));
- if (temp && !temp->IsAlive())
- temp->Respawn();
-
- temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_RAVENOUS_FURBOLG));
- if (temp && !temp->IsAlive())
- temp->Respawn();
-
- GameObject* go = instance->instance->GetGameObject(instance->GetData64(DATA_GORTOK_PALEHOOF_SPHERE));
- if (go)
- {
- go->SetGoState(GO_STATE_READY);
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- }
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GORTOK_PALEHOOF_SPHERE)))
+ {
+ go->SetGoState(GO_STATE_READY);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
}
@@ -185,14 +162,9 @@ public:
if (currentPhase != PHASE_GORTOK_PALEHOOF)
return;
- //Return since we have no target
if (!UpdateVictim())
return;
- Creature* temp = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0);
- if (temp && temp->IsAlive())
- temp->DisappearAndDie();
-
if (uiArcingSmashTimer <= diff)
{
DoCast(me, SPELL_ARCING_SMASH);
@@ -217,12 +189,8 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
- //Talk(SAY_DEATH);
- if (instance)
- instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, DONE);
- Creature* temp = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0);
- if (temp && temp->IsAlive())
- temp->DisappearAndDie();
+ _JustDied();
+ //Talk(SAY_DEATH);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -230,28 +198,30 @@ public:
Talk(SAY_SLAY);
}
- void NextPhase()
+ void DoAction(int32 actionId) OVERRIDE
{
+ if (actionId != ACTION_NEXT_PHASE)
+ return;
+
if (currentPhase == PHASE_NONE)
{
- if (instance)
- instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS);
- me->SummonCreature(NPC_STASIS_CONTROLLER, moveLocs[5].x, moveLocs[5].y, moveLocs[5].z, 0, TEMPSUMMON_CORPSE_DESPAWN);
+ if (Creature* orb = me->SummonCreature(NPC_STASIS_CONTROLLER, moveLocs[5], TEMPSUMMON_CORPSE_DESPAWN))
+ orb->CastSpell(me, SPELL_ORB_VISUAL, true);
}
+
Phase move = PHASE_NONE;
if (AddCount >= DUNGEON_MODE(2, 4))
move = PHASE_GORTOK_PALEHOOF;
else
move = Sequence[AddCount++];
- //send orb to summon spot
- Creature* pOrb = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0);
- if (pOrb && pOrb->IsAlive())
- {
- if (currentPhase == PHASE_NONE)
- pOrb->CastSpell(me, SPELL_ORB_VISUAL, true);
- pOrb->GetMotionMaster()->MovePoint(move, moveLocs[move].x, moveLocs[move].y, moveLocs[move].z);
- }
+
+ // send orb to summon spot
+ if (Creature* orb = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_ORB)))
+ if (orb->IsAlive())
+ orb->GetMotionMaster()->MovePoint(move, moveLocs[move]);
+
currentPhase = move;
}
@@ -263,6 +233,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardePinnacleAI<boss_palehoofAI>(creature);
+ }
};
//ravenous furbolg's spells
@@ -305,13 +279,12 @@ public:
me->GetMotionMaster()->MoveTargetedHome();
- if (instance)
- if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof && pPalehoof->IsAlive())
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset();
- }
+ if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
+ {
+ Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF));
+ if (palehoof && palehoof->IsAlive())
+ palehoof->AI()->Reset();
+ }
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -360,12 +333,8 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof)
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase();
- }
+ if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)))
+ palehoof->AI()->DoAction(ACTION_NEXT_PHASE);
}
void JustReachedHome() OVERRIDE
@@ -418,13 +387,12 @@ public:
me->GetMotionMaster()->MoveTargetedHome();
- if (instance)
- if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof && pPalehoof->IsAlive())
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset();
- }
+ if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
+ {
+ Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF));
+ if (palehoof && palehoof->IsAlive())
+ palehoof->AI()->Reset();
+ }
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -470,17 +438,13 @@ public:
DoStartMovement(who);
}
if (instance)
- instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance->GetData64(DATA_GORTOK_PALEHOOF));
- if (pPalehoof)
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase();
- }
+ if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)))
+ palehoof->AI()->DoAction(ACTION_NEXT_PHASE);
}
void JustReachedHome() OVERRIDE
@@ -534,13 +498,12 @@ public:
me->GetMotionMaster()->MoveTargetedHome();
- if (instance)
- if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof && pPalehoof->IsAlive())
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset();
- }
+ if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
+ {
+ Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF));
+ if (palehoof && palehoof->IsAlive())
+ palehoof->AI()->Reset();
+ }
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -590,12 +553,8 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof)
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase();
- }
+ if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)))
+ palehoof->AI()->DoAction(ACTION_NEXT_PHASE);
}
void JustReachedHome() OVERRIDE
@@ -654,13 +613,12 @@ public:
me->GetMotionMaster()->MoveTargetedHome();
- if (instance)
- if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof && pPalehoof->IsAlive())
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset();
- }
+ if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
+ {
+ Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF));
+ if (palehoof && palehoof->IsAlive())
+ palehoof->AI()->Reset();
+ }
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -711,12 +669,8 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- {
- Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof)
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase();
- }
+ if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)))
+ palehoof->AI()->DoAction(ACTION_NEXT_PHASE);
}
void JustReachedHome() OVERRIDE
@@ -767,52 +721,76 @@ public:
if (SummonTimer <= diff)
{
- if (currentPhase<5&&currentPhase >= 0)
+ uint8 nextBossId = 0;
+ switch (currentPhase)
{
- Creature* pNext = NULL;
- switch (currentPhase)
- {
- case PHASE_FRENZIED_WORGEN: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FRENZIED_WORGEN) : 0); break;
- case PHASE_RAVENOUS_FURLBORG: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_RAVENOUS_FURBOLG) : 0); break;
- case PHASE_MASSIVE_JORMUNGAR: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_MASSIVE_JORMUNGAR) : 0); break;
- case PHASE_FEROCIOUS_RHINO: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FEROCIOUS_RHINO) : 0); break;
- case PHASE_GORTOK_PALEHOOF: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); break;
- default: break;
- }
-
- if (pNext)
- {
- pNext->RemoveAurasDueToSpell(SPELL_FREEZE);
- pNext->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC);
- pNext->SetStandState(UNIT_STAND_STATE_STAND);
- pNext->SetInCombatWithZone();
- pNext->Attack(pNext->SelectNearestTarget(100), true);
-
- }
- currentPhase = PHASE_NONE;
+ case PHASE_FRENZIED_WORGEN:
+ nextBossId = DATA_FRENZIED_WORGEN;
+ break;
+ case PHASE_RAVENOUS_FURLBORG:
+ nextBossId = DATA_RAVENOUS_FURBOLG;
+ break;
+ case PHASE_MASSIVE_JORMUNGAR:
+ nextBossId = DATA_MASSIVE_JORMUNGAR;
+ break;
+ case PHASE_FEROCIOUS_RHINO:
+ nextBossId = DATA_FEROCIOUS_RHINO;
+ break;
+ case PHASE_GORTOK_PALEHOOF:
+ nextBossId = DATA_GORTOK_PALEHOOF;
+ break;
+ default:
+ return;
}
- } else SummonTimer -= diff;
+
+ if (Creature* nextBoss = ObjectAccessor::GetCreature(*me, instance->GetData64(nextBossId)))
+ {
+ nextBoss->RemoveAurasDueToSpell(SPELL_FREEZE);
+ nextBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC);
+ nextBoss->SetStandState(UNIT_STAND_STATE_STAND);
+ nextBoss->SetInCombatWithZone();
+ nextBoss->Attack(nextBoss->SelectNearestTarget(100), true);
+ }
+ currentPhase = PHASE_NONE;
+
+ if (nextBossId == DATA_GORTOK_PALEHOOF)
+ me->DespawnOrUnsummon();
+ }
+ else
+ SummonTimer -= diff;
}
void MovementInform(uint32 type, uint32 id) OVERRIDE
{
if (type != POINT_MOTION_TYPE)
return;
- if (id > 4)
- return;
- Creature* pNext = NULL;
+
+ uint8 nextBossId = 0;
switch (id)
{
- case PHASE_FRENZIED_WORGEN: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FRENZIED_WORGEN) : 0); break;
- case PHASE_RAVENOUS_FURLBORG: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_RAVENOUS_FURBOLG) : 0); break;
- case PHASE_MASSIVE_JORMUNGAR: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_MASSIVE_JORMUNGAR) : 0); break;
- case PHASE_FEROCIOUS_RHINO: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FEROCIOUS_RHINO) : 0); break;
- case PHASE_GORTOK_PALEHOOF: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); break;
- default: break;
+ case PHASE_FRENZIED_WORGEN:
+ nextBossId = DATA_FRENZIED_WORGEN;
+ break;
+ case PHASE_RAVENOUS_FURLBORG:
+ nextBossId = DATA_RAVENOUS_FURBOLG;
+ break;
+ case PHASE_MASSIVE_JORMUNGAR:
+ nextBossId = DATA_MASSIVE_JORMUNGAR;
+ break;
+ case PHASE_FEROCIOUS_RHINO:
+ nextBossId = DATA_FEROCIOUS_RHINO;
+ break;
+ case PHASE_GORTOK_PALEHOOF:
+ nextBossId = DATA_GORTOK_PALEHOOF;
+ break;
+ default:
+ return;
}
- if (pNext)
- DoCast(pNext, SPELL_ORB_CHANNEL, false);
- currentPhase = (Phase)id;
+
+ if (Creature* nextBoss = ObjectAccessor::GetCreature(*me, instance->GetData64(nextBossId)))
+ DoCast(nextBoss, SPELL_ORB_CHANNEL, false);
+
+ currentPhase = Phase(id);
SummonTimer = 5000;
}
};
@@ -821,23 +799,25 @@ public:
class go_palehoof_sphere : public GameObjectScript
{
-public:
- go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { }
-
- bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
- {
- InstanceScript* instance = go->GetInstanceScript();
+ public:
+ go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { }
- Creature* pPalehoof = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
- if (pPalehoof && pPalehoof->IsAlive())
+ bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
{
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ InstanceScript* instance = go->GetInstanceScript();
+ if (!instance)
+ return false;
+
+ Creature* palehoof = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_GORTOK_PALEHOOF));
+ if (palehoof && palehoof->IsAlive())
+ {
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SetGoState(GO_STATE_ACTIVE);
- CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase();
+ palehoof->AI()->DoAction(ACTION_NEXT_PHASE);
+ }
+ return true;
}
- return true;
- }
};
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index 08670af939a..01fcd9a665d 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
@@ -210,7 +210,7 @@ public:
me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
if (instance)
{
- instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
}
@@ -237,7 +237,7 @@ public:
me->SetInCombatWithZone();
if (instance)
{
- instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f);
me->SetWalk(false);
@@ -412,7 +412,7 @@ public:
Talk(SAY_DEATH);
Summons.DespawnAll();
if (instance)
- instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, DONE);
+ instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index 818631788b6..d518747a462 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -74,7 +74,6 @@ enum Yells
enum Creatures
{
NPC_ARTHAS = 29280, // Image of Arthas
- NPC_SVALA_SORROWGRAVE = 26668, // Svala after transformation
NPC_RITUAL_CHANNELER = 27281,
NPC_SPECTATOR = 26667,
NPC_RITUAL_TARGET = 27327,
@@ -82,11 +81,6 @@ enum Creatures
NPC_SCOURGE_HULK = 26555
};
-enum GameObjects
-{
- GO_UTGARDE_MIRROR = 191745
-};
-
enum SvalaPhase
{
IDLE,
@@ -101,191 +95,159 @@ enum Misc
DATA_INCREDIBLE_HULK = 2043
};
-static const float spectatorWP[2][3] =
+Position const spectatorWP[2] =
{
- {296.95f, -312.76f, 86.36f},
- {297.69f, -275.81f, 86.36f}
+ {296.95f, -312.76f, 86.36f, 0.0f },
+ {297.69f, -275.81f, 86.36f, 0.0f }
};
-static Position ArthasPos = { 295.81f, -366.16f, 92.57f, 1.58f };
+Position const ArthasPos = { 295.81f, -366.16f, 92.57f, 1.58f };
class boss_svala : public CreatureScript
{
-public:
- boss_svala() : CreatureScript("boss_svala") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_svalaAI(creature);
- }
+ public:
+ boss_svala() : CreatureScript("boss_svala") { }
- struct boss_svalaAI : public ScriptedAI
- {
- boss_svalaAI(Creature* creature) : ScriptedAI(creature), summons(creature)
+ struct boss_svalaAI : public BossAI
{
- instance = creature->GetInstanceScript();
- Phase = IDLE;
-
- me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_RITUAL_STRIKE_EFF_1, true);
- me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_RITUAL_STRIKE_EFF_2, true);
- }
-
- InstanceScript* instance;
- SummonList summons;
- SvalaPhase Phase;
-
- Position pos;
- float x, y, z;
+ boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE)
+ {
+ Phase = IDLE;
+ }
- uint32 introTimer;
- uint8 introPhase;
- uint8 sacrePhase;
+ SvalaPhase Phase;
- TempSummon* arthas;
- uint64 arthasGUID;
+ uint32 introTimer;
+ uint8 introPhase;
+ uint8 sacrePhase;
- uint32 sinsterStrikeTimer;
- uint32 callFlamesTimer;
- uint32 sacrificeTimer;
+ uint64 arthasGUID;
- bool sacrificed;
+ uint32 sinsterStrikeTimer;
+ uint32 callFlamesTimer;
+ uint32 sacrificeTimer;
- void Reset() OVERRIDE
- {
- sacrificed = false;
- SetCombatMovement(true);
+ bool sacrificed;
- summons.DespawnAll();
- me->RemoveAllAuras();
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ sacrificed = false;
+ SetCombatMovement(true);
- if (Phase > NORMAL)
- Phase = NORMAL;
+ if (Phase > NORMAL)
+ Phase = NORMAL;
- me->SetDisableGravity(Phase == NORMAL);
+ me->SetDisableGravity(Phase == NORMAL);
- introTimer = 1 * IN_MILLISECONDS;
- introPhase = 0;
- arthasGUID = 0;
+ introTimer = 1 * IN_MILLISECONDS;
+ introPhase = 0;
+ sacrePhase = 0;
+ arthasGUID = 0;
- if (instance)
- {
- instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED);
instance->SetData64(DATA_SACRIFICED_PLAYER, 0);
}
- }
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- Talk(SAY_AGGRO);
-
- sinsterStrikeTimer = 7 * IN_MILLISECONDS;
- callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
-
- if (instance)
- instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, IN_PROGRESS);
- }
-
- void JustSummoned(Creature* summon) OVERRIDE
- {
- if (summon->GetEntry() == NPC_RITUAL_CHANNELER)
- summon->CastSpell(summon, SPELL_SUMMONED_VIS, true);
-
- summons.Summon(summon);
- }
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
- void SummonedCreatureDespawn(Creature* summon) OVERRIDE
- {
- summons.Despawn(summon);
- }
+ sinsterStrikeTimer = 7 * IN_MILLISECONDS;
+ callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
+ }
- void MoveInLineOfSight(Unit* who) OVERRIDE
+ void JustSummoned(Creature* summon) OVERRIDE
+ {
+ if (summon->GetEntry() == NPC_RITUAL_CHANNELER)
+ summon->CastSpell(summon, SPELL_SUMMONED_VIS, true);
- {
- if (!who)
- return;
+ summons.Summon(summon);
+ }
- if (Phase == IDLE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40))
+ void MoveInLineOfSight(Unit* who) OVERRIDE
{
- Phase = INTRO;
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
-
- if (GameObject* mirror = GetClosestGameObjectWithEntry(me, GO_UTGARDE_MIRROR, 100.0f))
- mirror->SetGoState(GO_STATE_READY);
+ if (!who)
+ return;
- if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN))
+ if (Phase == IDLE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40))
{
- arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- arthasGUID = arthas->GetGUID();
- }
- }
- }
+ Phase = INTRO;
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- void KilledUnit(Unit* victim) OVERRIDE
- {
- if (victim != me)
- Talk(SAY_SLAY);
- }
+ if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
+ mirror->SetGoState(GO_STATE_READY);
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- if (Phase == SACRIFICING)
- SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
+ if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN))
+ {
+ arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ arthasGUID = arthas->GetGUID();
+ }
+ }
+ }
- me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
+ void KilledUnit(Unit* who) OVERRIDE
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- summons.DespawnAll();
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (Phase == SACRIFICING)
+ SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
- if (instance)
- instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, DONE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
- Talk(SAY_DEATH);
- }
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- void SpellHitTarget(Unit* /*target*/, const SpellInfo* spell) OVERRIDE
- {
- if (spell->Id == SPELL_RITUAL_STRIKE_EFF_1 && Phase != NORMAL && Phase != SVALADEAD)
+ void SpellHitTarget(Unit* /*target*/, SpellInfo const* spellInfo) OVERRIDE
{
- Phase = NORMAL;
- SetCombatMovement(true);
+ if (spellInfo->Id == SPELL_RITUAL_STRIKE_EFF_1 && Phase != NORMAL && Phase != SVALADEAD)
+ {
+ Phase = NORMAL;
+ SetCombatMovement(true);
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f, true))
- me->GetMotionMaster()->MoveChase(target);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f, true))
+ me->GetMotionMaster()->MoveChase(target);
+ }
}
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (Phase == IDLE)
- return;
- if (Phase == INTRO)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (introTimer <= diff)
- {
- Creature* arthas = Unit::GetCreature(*me, arthasGUID);
- if (!arthas)
- return;
+ if (Phase == IDLE)
+ return;
- switch (introPhase)
+ if (Phase == INTRO)
+ {
+ if (introTimer <= diff)
{
- case 0:
- Talk(SAY_SVALA_INTRO_0);
- ++introPhase;
- introTimer = 8100;
- break;
- case 1:
- arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1);
- ++introPhase;
- introTimer = 10000;
- break;
- case 2:
- arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false);
- pos.Relocate(me);
- pos.m_positionZ += 8.0f;
- me->GetMotionMaster()->MoveTakeoff(0, pos);
- // spectators flee event
- if (instance)
+ Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID);
+ if (!arthas)
+ return;
+
+ switch (introPhase)
+ {
+ case 0:
+ Talk(SAY_SVALA_INTRO_0);
+ ++introPhase;
+ introTimer = 8100;
+ break;
+ case 1:
+ arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1);
+ ++introPhase;
+ introTimer = 10000;
+ break;
+ case 2:
{
+ arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false);
+ Position pos;
+ pos.Relocate(me);
+ pos.m_positionZ += 8.0f;
+ me->GetMotionMaster()->MoveTakeoff(0, pos);
+ // spectators flee event
std::list<Creature*> lspectatorList;
GetCreatureListWithEntryInGrid(lspectatorList, me, NPC_SPECTATOR, 100.0f);
for (std::list<Creature*>::iterator itr = lspectatorList.begin(); itr != lspectatorList.end(); ++itr)
@@ -294,257 +256,258 @@ public:
{
(*itr)->SetStandState(UNIT_STAND_STATE_STAND);
(*itr)->SetWalk(false);
- (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0][0], spectatorWP[0][1], spectatorWP[0][2]);
+ (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0]);
}
}
+
+ ++introPhase;
+ introTimer = 4200;
+ break;
}
- ++introPhase;
- introTimer = 4200;
- break;
- case 3:
- me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, false);
- ++introPhase;
- introTimer = 6200;
- break;
- case 4:
- me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, false);
- arthas->InterruptNonMeleeSpells(true);
- me->RemoveAllAuras();
- me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
- me->SetFacingToObject(arthas);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- ++introPhase;
- introTimer = 3200;
- break;
- case 5:
- Talk(SAY_SVALA_INTRO_1);
- ++introPhase;
- introTimer = 10000;
- break;
- case 6:
- arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2);
- ++introPhase;
- introTimer = 7200;
- break;
- case 7:
- Talk(SAY_SVALA_INTRO_2);
- me->SetFacingTo(1.58f);
- arthas->SetVisible(false);
- ++introPhase;
- introTimer = 13800;
- break;
- case 8:
- pos.Relocate(me);
- pos.m_positionX = me->GetHomePosition().GetPositionX();
- pos.m_positionY = me->GetHomePosition().GetPositionY();
- pos.m_positionZ = 90.6065f;
- me->GetMotionMaster()->MoveLand(0, pos);
- me->SetDisableGravity(false, true);
- me->SetHover(true);
- ++introPhase;
- introTimer = 3000;
- break;
- case 9:
- if (GameObject* mirror = GetClosestGameObjectWithEntry(me, GO_UTGARDE_MIRROR, 100.0f))
- mirror->SetGoState(GO_STATE_ACTIVE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- arthas->DespawnOrUnsummon();
- arthasGUID = 0;
- Phase = NORMAL;
- break;
+ case 3:
+ me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, false);
+ ++introPhase;
+ introTimer = 6200;
+ break;
+ case 4:
+ me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, false);
+ arthas->InterruptNonMeleeSpells(true);
+ me->RemoveAllAuras();
+ me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
+ me->SetFacingToObject(arthas);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ ++introPhase;
+ introTimer = 3200;
+ break;
+ case 5:
+ Talk(SAY_SVALA_INTRO_1);
+ ++introPhase;
+ introTimer = 10000;
+ break;
+ case 6:
+ arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2);
+ ++introPhase;
+ introTimer = 7200;
+ break;
+ case 7:
+ Talk(SAY_SVALA_INTRO_2);
+ me->SetFacingTo(1.58f);
+ arthas->SetVisible(false);
+ ++introPhase;
+ introTimer = 13800;
+ break;
+ case 8:
+ {
+ Position pos;
+ pos.Relocate(me);
+ pos.m_positionX = me->GetHomePosition().GetPositionX();
+ pos.m_positionY = me->GetHomePosition().GetPositionY();
+ pos.m_positionZ = 90.6065f;
+ me->GetMotionMaster()->MoveLand(0, pos);
+ me->SetDisableGravity(false, true);
+ me->SetHover(true);
+ ++introPhase;
+ introTimer = 3000;
+ break;
+ }
+ case 9:
+ if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
+ mirror->SetGoState(GO_STATE_ACTIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ arthas->DespawnOrUnsummon();
+ arthasGUID = 0;
+ Phase = NORMAL;
+ break;
+ }
}
- }
- else
- introTimer -= diff;
-
- return;
- }
+ else
+ introTimer -= diff;
- if (Phase == NORMAL)
- {
- //Return since we have no target
- if (!UpdateVictim())
return;
-
- if (sinsterStrikeTimer <= diff)
- {
- DoCastVictim(SPELL_SINSTER_STRIKE);
- sinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
}
- else
- sinsterStrikeTimer -= diff;
- if (callFlamesTimer <= diff)
+ if (Phase == NORMAL)
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ if (!UpdateVictim())
+ return;
+
+ if (sinsterStrikeTimer <= diff)
{
- DoCast(target, SPELL_CALL_FLAMES);
- callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
+ DoCastVictim(SPELL_SINSTER_STRIKE);
+ sinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
}
- }
- else callFlamesTimer -= diff;
+ else
+ sinsterStrikeTimer -= diff;
- if (!sacrificed)
- {
- if (HealthBelowPct(50))
+ if (callFlamesTimer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ {
+ DoCast(target, SPELL_CALL_FLAMES);
+ callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
+ }
+ }
+ else
+ callFlamesTimer -= diff;
+
+ if (!sacrificed)
{
- if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true))
+ if (HealthBelowPct(50))
{
- if (instance)
+ if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true))
+ {
instance->SetData64(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID());
- Talk(SAY_SACRIFICE_PLAYER);
+ Talk(SAY_SACRIFICE_PLAYER);
- DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION);
+ DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION);
- SetCombatMovement(false);
+ SetCombatMovement(false);
- Phase = SACRIFICING;
- sacrePhase = 0;
- sacrificeTimer = 1 * IN_MILLISECONDS;
+ Phase = SACRIFICING;
+ sacrePhase = 0;
+ sacrificeTimer = 1 * IN_MILLISECONDS;
- DoCast(me, SPELL_RITUAL_OF_THE_SWORD);
- sacrificed = true;
+ DoCast(me, SPELL_RITUAL_OF_THE_SWORD);
+ sacrificed = true;
+ }
}
}
- }
- DoMeleeAttackIfReady();
- }
- else //SACRIFICING
- {
- if (sacrificeTimer <= diff)
+ DoMeleeAttackIfReady();
+ }
+ else // SACRIFICING
{
- switch (sacrePhase)
+ if (sacrificeTimer <= diff)
{
- case 0:
- // spawn ritual channelers
- if (instance)
- {
+ switch (sacrePhase)
+ {
+ case 0:
+ // spawn ritual channelers
DoCast(me, SPELL_RITUAL_CHANNELER_1, true);
DoCast(me, SPELL_RITUAL_CHANNELER_2, true);
DoCast(me, SPELL_RITUAL_CHANNELER_3, true);
- }
- ++sacrePhase;
- sacrificeTimer = 2 * IN_MILLISECONDS;
- break;
- case 1:
- me->StopMoving();
- me->GetMotionMaster()->MoveIdle();
- me->InterruptNonMeleeSpells(true);
- DoCast(me, SPELL_RITUAL_STRIKE_TRIGGER, true);
- ++sacrePhase;
- sacrificeTimer = 200;
- break;
- case 2:
- DoCast(me, SPELL_RITUAL_DISARM);
- ++sacrePhase;
- break;
- case 3:
- break;
+ ++sacrePhase;
+ sacrificeTimer = 2 * IN_MILLISECONDS;
+ break;
+ case 1:
+ me->StopMoving();
+ me->GetMotionMaster()->MoveIdle();
+ me->InterruptNonMeleeSpells(true);
+ DoCast(me, SPELL_RITUAL_STRIKE_TRIGGER, true);
+ ++sacrePhase;
+ sacrificeTimer = 200;
+ break;
+ case 2:
+ DoCast(me, SPELL_RITUAL_DISARM);
+ ++sacrePhase;
+ break;
+ case 3:
+ break;
+ }
}
+ else
+ sacrificeTimer -= diff;
}
- else sacrificeTimer -= diff;
}
- }
- };
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardePinnacleAI<boss_svalaAI>(creature);
+ }
};
class npc_ritual_channeler : public CreatureScript
{
-public:
- npc_ritual_channeler() : CreatureScript("npc_ritual_channeler") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_ritual_channelerAI(creature);
- }
+ public:
+ npc_ritual_channeler() : CreatureScript("npc_ritual_channeler") { }
- struct npc_ritual_channelerAI : public ScriptedAI
- {
- npc_ritual_channelerAI(Creature* creature) :ScriptedAI(creature)
+ struct npc_ritual_channelerAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
+ npc_ritual_channelerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
- SetCombatMovement(false);
- }
+ SetCombatMovement(false);
+ }
- InstanceScript* instance;
- uint32 paralyzeTimer;
+ InstanceScript* instance;
+ uint32 paralyzeTimer;
+
+ void Reset() OVERRIDE
+ {
+ paralyzeTimer = 1600;
- void Reset() OVERRIDE
- {
- paralyzeTimer = 1600;
- if (instance)
if (IsHeroic())
DoCast(me, SPELL_SHADOWS_IN_THE_DARK);
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ }
- if (paralyzeTimer <= diff)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (instance)
- if (Unit* victim = me->GetUnit(*me, instance->GetData64(DATA_SACRIFICED_PLAYER)))
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ if (paralyzeTimer <= diff)
+ {
+ if (Unit* victim = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_SACRIFICED_PLAYER)))
DoCast(victim, SPELL_PARALYZE, false);
- paralyzeTimer = 200;
+ paralyzeTimer = 200;
+ }
+ else
+ paralyzeTimer -= diff;
}
- else
- paralyzeTimer -= diff;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardePinnacleAI<npc_ritual_channelerAI>(creature);
}
- };
};
class npc_spectator : public CreatureScript
{
-public:
- npc_spectator() : CreatureScript("npc_spectator") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_spectatorAI(creature);
- }
+ public:
+ npc_spectator() : CreatureScript("npc_spectator") { }
- struct npc_spectatorAI : public ScriptedAI
- {
- npc_spectatorAI(Creature* creature) : ScriptedAI(creature) { }
+ struct npc_spectatorAI : public ScriptedAI
+ {
+ npc_spectatorAI(Creature* creature) : ScriptedAI(creature) { }
- void Reset() OVERRIDE { }
+ void Reset() OVERRIDE { }
- void MovementInform(uint32 motionType, uint32 pointId) OVERRIDE
- {
- if (motionType == POINT_MOTION_TYPE)
+ void MovementInform(uint32 motionType, uint32 pointId) OVERRIDE
{
- if (pointId == 1)
- me->GetMotionMaster()->MovePoint(2, spectatorWP[1][0], spectatorWP[1][1], spectatorWP[1][2]);
- else if (pointId == 2)
- me->DespawnOrUnsummon(1000);
+ if (motionType == POINT_MOTION_TYPE)
+ {
+ if (pointId == 1)
+ me->GetMotionMaster()->MovePoint(2, spectatorWP[1]);
+ else if (pointId == 2)
+ me->DespawnOrUnsummon(1000);
+ }
}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardePinnacleAI<npc_spectatorAI>(creature);
}
- };
};
class RitualTargetCheck
{
public:
- explicit RitualTargetCheck(Unit* _caster) : caster(_caster) { }
+ explicit RitualTargetCheck() { }
- bool operator() (WorldObject* unit) const
+ bool operator() (WorldObject* obj) const
{
- if (InstanceScript* instance = caster->GetInstanceScript())
- if (instance->GetData64(DATA_SACRIFICED_PLAYER) == unit->GetGUID())
+ if (InstanceScript* instance = obj->GetInstanceScript())
+ if (instance->GetData64(DATA_SACRIFICED_PLAYER) == obj->GetGUID())
return false;
return true;
}
-
- private:
- Unit* caster;
};
class spell_paralyze_pinnacle : public SpellScriptLoader
@@ -558,7 +521,7 @@ class spell_paralyze_pinnacle : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& unitList)
{
- unitList.remove_if(RitualTargetCheck(GetCaster()));
+ unitList.remove_if(RitualTargetCheck());
}
void Register() OVERRIDE
@@ -635,7 +598,7 @@ class npc_scourge_hulk : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_scourge_hulkAI(creature);
+ return GetUtgardePinnacleAI<npc_scourge_hulkAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index f592a4b2bb2..f4c306c726a 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
@@ -103,16 +103,10 @@ class boss_ymiron : public CreatureScript
public:
boss_ymiron() : CreatureScript("boss_ymiron") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ struct boss_ymironAI : public BossAI
{
- return new boss_ymironAI(creature);
- }
-
- struct boss_ymironAI : public ScriptedAI
- {
- boss_ymironAI(Creature* creature) : ScriptedAI(creature)
+ boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON)
{
- instance = creature->GetInstanceScript();
for (int i = 0; i < 4; ++i)
m_uiActiveOrder[i] = i;
for (int i = 0; i < 3; ++i)
@@ -122,9 +116,6 @@ public:
m_uiActiveOrder[i] = m_uiActiveOrder[r];
m_uiActiveOrder[r] = temp;
}
-
- m_uiActivedCreatureGUID = 0;
- m_uiOrbGUID = 0;
}
bool m_bIsWalking;
@@ -155,10 +146,9 @@ public:
uint64 m_uiActivedCreatureGUID;
uint64 m_uiOrbGUID;
- InstanceScript* instance;
-
void Reset() OVERRIDE
{
+ _Reset();
m_bIsWalking = false;
m_bIsPause = false;
m_bIsActiveWithBJORN = false;
@@ -182,19 +172,14 @@ public:
m_uiHealthAmountModifier = 1;
m_uiHealthAmountMultipler = DUNGEON_MODE(20, 25);
- DespawnBoatGhosts(m_uiActivedCreatureGUID);
- DespawnBoatGhosts(m_uiOrbGUID);
-
- if (instance)
- instance->SetData(DATA_KING_YMIRON_EVENT, NOT_STARTED);
+ m_uiActivedCreatureGUID = 0;
+ m_uiOrbGUID = 0;
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ _EnterCombat();
Talk(SAY_AGGRO);
-
- if (instance)
- instance->SetData(DATA_KING_YMIRON_EVENT, IN_PROGRESS);
}
void SpellHitTarget(Unit* who, SpellInfo const* spell) OVERRIDE
@@ -371,21 +356,17 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
+ _JustDied();
Talk(SAY_DEATH);
-
- DespawnBoatGhosts(m_uiActivedCreatureGUID);
- DespawnBoatGhosts(m_uiOrbGUID);
-
- if (instance)
- instance->SetData(DATA_KING_YMIRON_EVENT, DONE);
}
- void KilledUnit(Unit* /*victim*/) OVERRIDE
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(SAY_SLAY);
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
}
- void DespawnBoatGhosts(uint64 m_uiCreatureGUID)
+ void DespawnBoatGhosts(uint64& m_uiCreatureGUID)
{
if (m_uiCreatureGUID)
if (Creature* temp = Unit::GetCreature(*me, m_uiCreatureGUID))
@@ -395,14 +376,16 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardePinnacleAI<boss_ymironAI>(creature);
+ }
};
class achievement_kings_bane : public AchievementCriteriaScript
{
public:
- achievement_kings_bane() : AchievementCriteriaScript("achievement_kings_bane")
- {
- }
+ achievement_kings_bane() : AchievementCriteriaScript("achievement_kings_bane") { }
bool OnCheck(Player* /*player*/, Unit* target) OVERRIDE
{
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
index 4959b3a6b58..46fabe41086 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
@@ -19,246 +19,235 @@
#include "InstanceScript.h"
#include "utgarde_pinnacle.h"
-#define MAX_ENCOUNTER 4
-
-/* Utgarde Pinnacle encounters:
-0 - Svala Sorrowgrave
-1 - Gortok Palehoof
-2 - Skadi the Ruthless
-3 - King Ymiron
-*/
-
-enum GameObjects
+DoorData const doorData[] =
{
- ENTRY_SKADI_THE_RUTHLESS_DOOR = 192173,
- ENTRY_KING_YMIRON_DOOR = 192174,
- ENTRY_GORK_PALEHOOF_SPHERE = 188593
+ { GO_SKADI_THE_RUTHLESS_DOOR, DATA_SKADI_THE_RUTHLESS, DOOR_TYPE_PASSAGE, BOUNDARY_W },
+ { GO_KING_YMIRON_DOOR, DATA_KING_YMIRON, DOOR_TYPE_PASSAGE, BOUNDARY_N },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_utgarde_pinnacle : public InstanceMapScript
{
-public:
- instance_utgarde_pinnacle() : InstanceMapScript("instance_utgarde_pinnacle", 575) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_pinnacle(map);
- }
-
- struct instance_pinnacle : public InstanceScript
- {
- instance_pinnacle(Map* map) : InstanceScript(map) { }
-
- uint64 uiSvalaSorrowgrave;
- uint64 uiGortokPalehoof;
- uint64 uiSkadiTheRuthless;
- uint64 uiKingYmiron;
-
- uint64 uiSkadiTheRuthlessDoor;
- uint64 uiKingYmironDoor;
- uint64 uiGortokPalehoofSphere;
+ public:
+ instance_utgarde_pinnacle() : InstanceMapScript(UPScriptName, 575) { }
- uint64 uiFrenziedWorgen;
- uint64 uiRavenousFurbolg;
- uint64 uiFerociousRhino;
- uint64 uiMassiveJormungar;
- uint64 uiPalehoofOrb;
-
- uint64 uiSvala;
- uint64 uiSacrificedPlayer;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- std::string str_data;
-
- void Initialize() OVERRIDE
+ struct instance_utgarde_pinnacle_InstanceMapScript : public InstanceScript
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- m_auiEncounter[i] = NOT_STARTED;
-
- uiSvalaSorrowgrave = 0;
- uiGortokPalehoof = 0;
- uiSkadiTheRuthless = 0;
- uiKingYmiron = 0;
-
- uiSkadiTheRuthlessDoor = 0;
- uiKingYmironDoor = 0;
- uiGortokPalehoofSphere = 0;
+ instance_utgarde_pinnacle_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- uiFrenziedWorgen = 0;
- uiRavenousFurbolg = 0;
- uiFerociousRhino = 0;
- uiMassiveJormungar = 0;
- uiPalehoofOrb = 0;
+ SvalaSorrowgraveGUID = 0;
+ GortokPalehoofGUID = 0;
+ SkadiTheRuthlessGUID = 0;
+ KingYmironGUID = 0;
- uiSvala = 0;
- uiSacrificedPlayer = 0;
- }
+ UtgardeMirrorGUID = 0;
+ GortokPalehoofSphereGUID = 0;
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
+ FrenziedWorgenGUID = 0;
+ RavenousFurbolgGUID = 0;
+ FerociousRhinoGUID = 0;
+ MassiveJormungarGUID = 0;
+ PalehoofOrbGUID = 0;
- return false;
- }
+ SvalaGUID = 0;
+ SacrificedPlayerGUID = 0;
+ }
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- case BOSS_SVALA_SORROWGRAVE: uiSvalaSorrowgrave = creature->GetGUID(); break;
- case BOSS_GORTOK_PALEHOOF: uiGortokPalehoof = creature->GetGUID(); break;
- case BOSS_SKADI_RUTHLESS: uiSkadiTheRuthless = creature->GetGUID(); break;
- case BOSS_KING_YMIRON: uiKingYmiron = creature->GetGUID(); break;
- case NPC_FRENZIED_WORGEN: uiFrenziedWorgen = creature->GetGUID(); break;
- case NPC_RAVENOUS_FURBOLG: uiRavenousFurbolg = creature->GetGUID(); break;
- case NPC_MASSIVE_JORMUNGAR: uiMassiveJormungar = creature->GetGUID(); break;
- case NPC_FEROCIOUS_RHINO: uiFerociousRhino = creature->GetGUID(); break;
- case NPC_SVALA: uiSvala = creature->GetGUID(); break;
- case NPC_PALEHOOF_ORB: uiPalehoofOrb = creature->GetGUID(); break;
+ switch (creature->GetEntry())
+ {
+ case NPC_SVALA_SORROWGRAVE:
+ SvalaSorrowgraveGUID = creature->GetGUID();
+ break;
+ case NPC_GORTOK_PALEHOOF:
+ GortokPalehoofGUID = creature->GetGUID();
+ break;
+ case NPC_SKADI_THE_RUTHLESS:
+ SkadiTheRuthlessGUID = creature->GetGUID();
+ break;
+ case NPC_KING_YMIRON:
+ KingYmironGUID = creature->GetGUID();
+ break;
+ case NPC_FRENZIED_WORGEN:
+ FrenziedWorgenGUID = creature->GetGUID();
+ break;
+ case NPC_RAVENOUS_FURBOLG:
+ RavenousFurbolgGUID = creature->GetGUID();
+ break;
+ case NPC_MASSIVE_JORMUNGAR:
+ MassiveJormungarGUID = creature->GetGUID();
+ break;
+ case NPC_FEROCIOUS_RHINO:
+ FerociousRhinoGUID = creature->GetGUID();
+ break;
+ case NPC_SVALA:
+ SvalaGUID = creature->GetGUID();
+ break;
+ case NPC_PALEHOOF_ORB:
+ PalehoofOrbGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case ENTRY_SKADI_THE_RUTHLESS_DOOR:
- uiSkadiTheRuthlessDoor = go->GetGUID();
- if (m_auiEncounter[2] == DONE) HandleGameObject(0, true, go);
- break;
- case ENTRY_KING_YMIRON_DOOR:
- uiKingYmironDoor = go->GetGUID();
- if (m_auiEncounter[3] == DONE) HandleGameObject(0, true, go);
- break;
- case ENTRY_GORK_PALEHOOF_SPHERE:
- uiGortokPalehoofSphere = go->GetGUID();
- if (m_auiEncounter[1] == DONE)
- {
- HandleGameObject(0, true, go);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- }
- break;
+ switch (go->GetEntry())
+ {
+ case GO_UTGARDE_MIRROR:
+ UtgardeMirrorGUID = go->GetGUID();
+ break;
+ case GO_GORTOK_PALEHOOF_SPHERE:
+ GortokPalehoofSphereGUID = go->GetGUID();
+ if (GetBossState(DATA_GORTOK_PALEHOOF) == DONE)
+ {
+ HandleGameObject(0, true, go);
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ break;
+ case GO_SKADI_THE_RUTHLESS_DOOR:
+ case GO_KING_YMIRON_DOOR:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_SVALA_SORROWGRAVE_EVENT:
- m_auiEncounter[0] = data;
- break;
- case DATA_GORTOK_PALEHOOF_EVENT:
- m_auiEncounter[1] = data;
- break;
- case DATA_SKADI_THE_RUTHLESS_EVENT:
- if (data == DONE)
- HandleGameObject(uiSkadiTheRuthlessDoor, true);
- m_auiEncounter[2] = data;
- break;
- case DATA_KING_YMIRON_EVENT:
- if (data == DONE)
- HandleGameObject(uiKingYmironDoor, true);
- m_auiEncounter[3] = data;
- break;
+ switch (go->GetEntry())
+ {
+ case GO_SKADI_THE_RUTHLESS_DOOR:
+ case GO_KING_YMIRON_DOOR:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- if (data == DONE)
- SaveToDB();
- }
-
- void SetData64(uint32 type, uint64 data) OVERRIDE
- {
- switch (type)
+ void SetData64(uint32 type, uint64 data) OVERRIDE
{
- case DATA_SACRIFICED_PLAYER:
- uiSacrificedPlayer = data;
- break;
+ switch (type)
+ {
+ case DATA_SACRIFICED_PLAYER:
+ SacrificedPlayerGUID = data;
+ break;
+ default:
+ break;
+ }
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_SVALA_SORROWGRAVE_EVENT: return m_auiEncounter[0];
- case DATA_GORTOK_PALEHOOF_EVENT: return m_auiEncounter[1];
- case DATA_SKADI_THE_RUTHLESS_EVENT: return m_auiEncounter[2];
- case DATA_KING_YMIRON_EVENT: return m_auiEncounter[3];
+ switch (type)
+ {
+ case DATA_SVALA_SORROWGRAVE:
+ return SvalaSorrowgraveGUID;
+ case DATA_GORTOK_PALEHOOF:
+ return GortokPalehoofGUID;
+ case DATA_SKADI_THE_RUTHLESS:
+ return SkadiTheRuthlessGUID;
+ case DATA_KING_YMIRON:
+ return KingYmironGUID;
+ case DATA_FRENZIED_WORGEN:
+ return FrenziedWorgenGUID;
+ case DATA_RAVENOUS_FURBOLG:
+ return RavenousFurbolgGUID;
+ case DATA_MASSIVE_JORMUNGAR:
+ return MassiveJormungarGUID;
+ case DATA_FEROCIOUS_RHINO:
+ return FerociousRhinoGUID;
+ case DATA_GORTOK_ORB:
+ return PalehoofOrbGUID;
+ case DATA_GORTOK_PALEHOOF_SPHERE:
+ return GortokPalehoofSphereGUID;
+ case DATA_UTGARDE_MIRROR:
+ return UtgardeMirrorGUID;
+ case DATA_SVALA:
+ return SvalaGUID;
+ case DATA_SACRIFICED_PLAYER:
+ return SacrificedPlayerGUID;
+ default:
+ break;
+ }
+
+ return 0;
}
- return 0;
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ std::string GetSaveData() OVERRIDE
{
- case DATA_SVALA_SORROWGRAVE: return uiSvalaSorrowgrave;
- case DATA_GORTOK_PALEHOOF: return uiGortokPalehoof;
- case DATA_SKADI_THE_RUTHLESS: return uiSkadiTheRuthless;
- case DATA_KING_YMIRON: return uiKingYmiron;
- case DATA_NPC_FRENZIED_WORGEN: return uiFrenziedWorgen;
- case DATA_NPC_RAVENOUS_FURBOLG: return uiRavenousFurbolg;
- case DATA_NPC_MASSIVE_JORMUNGAR: return uiMassiveJormungar;
- case DATA_NPC_FEROCIOUS_RHINO: return uiFerociousRhino;
- case DATA_NPC_ORB: return uiPalehoofOrb;
- case DATA_SVALA: return uiSvala;
- case DATA_GORTOK_PALEHOOF_SPHERE: return uiGortokPalehoofSphere;
- case DATA_SACRIFICED_PLAYER: return uiSacrificedPlayer;
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "U P " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- return 0;
- }
+ void Load(char const* str) OVERRIDE
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
+ OUT_LOAD_INST_DATA(str);
- std::ostringstream saveStream;
- saveStream << "U P " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << m_auiEncounter[3];
+ char dataHead1, dataHead2;
- str_data = saveStream.str();
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ if (dataHead1 == 'U' && dataHead2 == 'P')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- void Load(const char* in) OVERRIDE
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ OUT_LOAD_INST_DATA_COMPLETE;
}
- OUT_LOAD_INST_DATA(in);
+ protected:
+ uint64 SvalaSorrowgraveGUID;
+ uint64 GortokPalehoofGUID;
+ uint64 SkadiTheRuthlessGUID;
+ uint64 KingYmironGUID;
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3;
+ uint64 UtgardeMirrorGUID;
+ uint64 GortokPalehoofSphereGUID;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
+ uint64 FrenziedWorgenGUID;
+ uint64 RavenousFurbolgGUID;
+ uint64 FerociousRhinoGUID;
+ uint64 MassiveJormungarGUID;
- if (dataHead1 == 'U' && dataHead2 == 'P')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
+ uint64 PalehoofOrbGUID;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ uint64 SvalaGUID;
+ uint64 SacrificedPlayerGUID;
+ };
- } else OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_utgarde_pinnacle_InstanceMapScript(map);
}
- };
};
void AddSC_instance_utgarde_pinnacle()
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
index 6166b7c4891..ddf1d1e512a 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
@@ -15,46 +15,64 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_PINNACLE_H
-#define DEF_PINNACLE_H
+#ifndef UTGARDE_PINNACLE_H_
+#define UTGARDE_PINNACLE_H_
-enum Data
+#define UPScriptName "instance_utgarde_pinnacle"
+
+uint32 const EncounterCount = 4;
+
+enum DataTypes
{
- DATA_SVALA_SORROWGRAVE_EVENT,
- DATA_GORTOK_PALEHOOF_EVENT,
- DATA_SKADI_THE_RUTHLESS_EVENT,
- DATA_KING_YMIRON_EVENT
+ // Encounter States/Boss GUIDs
+ DATA_SVALA_SORROWGRAVE = 0,
+ DATA_GORTOK_PALEHOOF = 1,
+ DATA_SKADI_THE_RUTHLESS = 2,
+ DATA_KING_YMIRON = 3,
+
+ // Additional Data
+ DATA_UTGARDE_MIRROR = 4,
+ DATA_SVALA = 5,
+ DATA_SACRIFICED_PLAYER = 6,
+
+ DATA_FRENZIED_WORGEN = 7,
+ DATA_RAVENOUS_FURBOLG = 8,
+ DATA_MASSIVE_JORMUNGAR = 9,
+ DATA_FEROCIOUS_RHINO = 10,
+ DATA_GORTOK_ORB = 11,
+ DATA_GORTOK_PALEHOOF_SPHERE = 12
};
-enum Data64
+enum CreatureIds
{
- DATA_SVALA,
- DATA_SVALA_SORROWGRAVE,
- DATA_GORTOK_PALEHOOF,
- DATA_SKADI_THE_RUTHLESS,
- DATA_NPC_GRAUF,
- DATA_KING_YMIRON,
- DATA_NPC_FRENZIED_WORGEN,
- DATA_NPC_RAVENOUS_FURBOLG,
- DATA_NPC_MASSIVE_JORMUNGAR,
- DATA_NPC_FEROCIOUS_RHINO,
- DATA_NPC_ORB,
- DATA_GORTOK_PALEHOOF_SPHERE,
- DATA_SACRIFICED_PLAYER
+ NPC_SVALA_SORROWGRAVE = 26668,
+ NPC_GORTOK_PALEHOOF = 26687,
+ NPC_SKADI_THE_RUTHLESS = 26693,
+ NPC_KING_YMIRON = 26861,
+
+ // Svala
+ NPC_SVALA = 29281,
+
+ // Gortok Palehoof
+ NPC_FRENZIED_WORGEN = 26683,
+ NPC_RAVENOUS_FURBOLG = 26684,
+ NPC_MASSIVE_JORMUNGAR = 26685,
+ NPC_FEROCIOUS_RHINO = 26686,
+ NPC_PALEHOOF_ORB = 26688
};
-enum CreatureID
+enum GameObjectIds
{
- BOSS_SVALA_SORROWGRAVE = 26668,
- BOSS_GORTOK_PALEHOOF = 26687,
- BOSS_SKADI_RUTHLESS = 26693,
- BOSS_KING_YMIRON = 26861,
- NPC_FRENZIED_WORGEN = 26683,
- NPC_RAVENOUS_FURBOLG = 26684,
- NPC_MASSIVE_JORMUNGAR = 26685,
- NPC_FEROCIOUS_RHINO = 26686,
- NPC_SVALA = 29281,
- NPC_PALEHOOF_ORB = 26688
+ GO_GORTOK_PALEHOOF_SPHERE = 188593,
+ GO_UTGARDE_MIRROR = 191745,
+ GO_SKADI_THE_RUTHLESS_DOOR = 192173,
+ GO_KING_YMIRON_DOOR = 192174
};
-#endif
+template<class AI>
+AI* GetUtgardePinnacleAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, UPScriptName);
+}
+
+#endif // UTGARDE_PINNACLE_H_
diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index 99dd9569504..3a0984e4c44 100644
--- a/src/server/scripts/Northrend/zone_dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
@@ -64,11 +64,11 @@ public:
creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
}
- void Reset()OVERRIDE { }
+ void Reset() OVERRIDE { }
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
- void AttackStart(Unit* /*who*/)OVERRIDE { }
+ void AttackStart(Unit* /*who*/) OVERRIDE { }
void MoveInLineOfSight(Unit* who) OVERRIDE
@@ -118,7 +118,7 @@ public:
return;
}
- void UpdateAI(uint32 /*diff*/)OVERRIDE { }
+ void UpdateAI(uint32 /*diff*/) OVERRIDE { }
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp
index 0357ea075f4..76ce586aa9d 100644
--- a/src/server/scripts/Northrend/zone_dragonblight.cpp
+++ b/src/server/scripts/Northrend/zone_dragonblight.cpp
@@ -303,10 +303,111 @@ class npc_wyrmrest_defender : public CreatureScript
}
};
+/*#####
+# npc_torturer_lecraft
+#####*/
+
+enum TorturerLeCraft
+{
+ SPELL_HEMORRHAGE = 30478,
+ SPELL_KIDNEY_SHOT = 30621,
+ SPELL_HIGH_EXECUTORS_BRANDING_IRON = 48603,
+ NPC_TORTURER_LECRAFT = 27394,
+ EVENT_HEMORRHAGE = 1,
+ EVENT_KIDNEY_SHOT = 2,
+ SAY_AGGRO = 0
+};
+
+class npc_torturer_lecraft : public CreatureScript
+{
+ public: npc_torturer_lecraft() : CreatureScript("npc_torturer_lecraft") {}
+
+ struct npc_torturer_lecraftAI : public ScriptedAI
+ {
+ npc_torturer_lecraftAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ _textCounter = 1;
+ _playerGUID = 0;
+ }
+
+ void EnterCombat(Unit* who) OVERRIDE
+ {
+ _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(5000, 8000));
+ _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(12000, 15000));
+
+ if (Player* player = who->ToPlayer())
+ Talk (SAY_AGGRO, player->GetGUID());
+ }
+
+ void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
+ {
+ if (spell->Id != SPELL_HIGH_EXECUTORS_BRANDING_IRON)
+ return;
+
+ if (Player* player = caster->ToPlayer())
+ {
+ if (_textCounter == 1)
+ _playerGUID = player->GetGUID();
+
+ if (_playerGUID != player->GetGUID())
+ return;
+
+ Talk(_textCounter, player->GetGUID());
+
+ if (_textCounter == 5)
+ player->KilledMonsterCredit(NPC_TORTURER_LECRAFT, 0);
+
+ ++_textCounter;
+
+ if (_textCounter == 13)
+ _textCounter = 6;
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_HEMORRHAGE:
+ DoCastVictim(SPELL_HEMORRHAGE);
+ _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(12000, 168000));
+ break;
+ case EVENT_KIDNEY_SHOT:
+ DoCastVictim(SPELL_KIDNEY_SHOT);
+ _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(20000, 26000));
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ private:
+ EventMap _events;
+ uint8 _textCounter;
+ uint64 _playerGUID;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_torturer_lecraftAI(creature);
+ }
+};
+
void AddSC_dragonblight()
{
new npc_alexstrasza_wr_gate;
new spell_q12096_q12092_dummy;
new spell_q12096_q12092_bark;
new npc_wyrmrest_defender;
+ new npc_torturer_lecraft;
}
diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index 9ea3023de01..6587f0536b3 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -20,7 +20,9 @@
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "Player.h"
+#include "Spell.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
#include "CreatureTextMgr.h"
/*######
@@ -749,6 +751,43 @@ public:
}
};
+enum ShredderDelivery
+{
+ NPC_BROKEN_DOWN_SHREDDER = 27354
+};
+
+class spell_shredder_delivery : public SpellScriptLoader
+{
+ public:
+ spell_shredder_delivery() : SpellScriptLoader("spell_shredder_delivery") { }
+
+ class spell_shredder_delivery_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_shredder_delivery_SpellScript);
+
+ bool Load() OVERRIDE
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (GetCaster()->ToCreature()->GetEntry() == NPC_BROKEN_DOWN_SHREDDER)
+ GetCaster()->ToCreature()->DespawnOrUnsummon();
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shredder_delivery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_shredder_delivery_SpellScript();
+ }
+};
+
void AddSC_grizzly_hills()
{
new npc_emily();
@@ -759,4 +798,5 @@ void AddSC_grizzly_hills()
new npc_wounded_skirmisher();
new npc_venture_co_straggler();
new npc_lake_frog();
+ new spell_shredder_delivery();
}
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index d952321c749..5c65be982e0 100644
--- a/src/server/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
@@ -25,91 +25,6 @@
#include "CombatAI.h"
/*######
-## npc_arete
-######*/
-
-#define GOSSIP_ARETE_ITEM1 "Lord-Commander, I would hear your tale."
-#define GOSSIP_ARETE_ITEM2 "<You nod slightly but do not complete the motion as the Lord-Commander narrows his eyes before he continues.>"
-#define GOSSIP_ARETE_ITEM3 "I thought that they now called themselves the Scarlet Onslaught?"
-#define GOSSIP_ARETE_ITEM4 "Where did the grand admiral go?"
-#define GOSSIP_ARETE_ITEM5 "That's fine. When do I start?"
-#define GOSSIP_ARETE_ITEM6 "Let's finish this!"
-#define GOSSIP_ARETE_ITEM7 "That's quite a tale, Lord-Commander."
-
-enum Arete
-{
- GOSSIP_TEXTID_ARETE1 = 13525,
- GOSSIP_TEXTID_ARETE2 = 13526,
- GOSSIP_TEXTID_ARETE3 = 13527,
- GOSSIP_TEXTID_ARETE4 = 13528,
- GOSSIP_TEXTID_ARETE5 = 13529,
- GOSSIP_TEXTID_ARETE6 = 13530,
- GOSSIP_TEXTID_ARETE7 = 13531,
-
- QUEST_THE_STORY_THUS_FAR = 12807
-};
-
-class npc_arete : public CreatureScript
-{
-public:
- npc_arete() : CreatureScript("npc_arete") { }
-
- bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(QUEST_THE_STORY_THUS_FAR) == QUEST_STATUS_INCOMPLETE)
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE1, creature->GetGUID());
- return true;
- }
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE2, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE3, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE4, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE5, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE6, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE7, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(QUEST_THE_STORY_THUS_FAR);
- break;
- }
-
- return true;
- }
-};
-
-/*######
## npc_squire_david
######*/
@@ -483,7 +398,7 @@ class npc_tournament_training_dummy : public CreatureScript
me->SetControlled(true, UNIT_STATE_STUNNED);
}
- void MoveInLineOfSight(Unit* /*who*/)OVERRIDE { }
+ void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
};
@@ -1149,7 +1064,6 @@ class npc_morbidus : public CreatureScript
void AddSC_icecrown()
{
- new npc_arete;
new npc_squire_david;
new npc_argent_valiant;
new npc_guardian_pavilion;
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 77b85037a01..a0b6524bd89 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -1082,6 +1082,57 @@ public:
}
};
+/*######
+## Quest Dreadsaber Mastery: Stalking the Prey (12550)
+######*/
+
+enum ShangoTracks
+{
+ SPELL_CORRECT_TRACKS = 52160,
+ SPELL_INCORRECT_TRACKS = 52163,
+ SAY_CORRECT_TRACKS = 28634,
+ SAY_INCORRECT_TRACKS = 28635
+};
+
+class spell_shango_tracks : public SpellScriptLoader
+{
+public:
+ spell_shango_tracks() : SpellScriptLoader("spell_shango_tracks") { }
+
+ class spell_shango_tracks_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_shango_tracks_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* player = GetHitUnit()->ToPlayer())
+ {
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_CORRECT_TRACKS:
+ player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_CORRECT_TRACKS), LANG_UNIVERSAL, player->GetGUID());
+ break;
+ case SPELL_INCORRECT_TRACKS:
+ player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_INCORRECT_TRACKS), LANG_UNIVERSAL, player->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shango_tracks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_shango_tracks_SpellScript();
+ }
+};
+
void AddSC_sholazar_basin()
{
new npc_injured_rainspeaker_oracle();
@@ -1095,4 +1146,5 @@ void AddSC_sholazar_basin()
new spell_q12589_shoot_rjr();
new npc_haiphoon();
new npc_vics_flying_machine();
+ new spell_shango_tracks();
}
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index 83d49045eff..825981ba5c5 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -460,6 +460,52 @@ class spell_close_rift : public SpellScriptLoader
}
};
+/*#####
+# spell_jokkum_scriptcast
+#####*/
+
+enum JokkumScriptcast
+{
+ SPELL_JOKKUM_KILL_CREDIT = 56545,
+ SPELL_JOKKUM_SUMMON = 56541
+};
+
+class spell_jokkum_scriptcast : public SpellScriptLoader
+{
+ public: spell_jokkum_scriptcast() : SpellScriptLoader("spell_jokkum_scriptcast") { }
+
+ class spell_jokkum_scriptcast_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_jokkum_scriptcast_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_JOKKUM_KILL_CREDIT) || !sSpellMgr->GetSpellInfo(SPELL_JOKKUM_SUMMON))
+ return false;
+ return true;
+ }
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Player* player = GetTarget()->ToPlayer())
+ {
+ player->CastSpell(player, SPELL_JOKKUM_KILL_CREDIT, true);
+ player->CastSpell(player, SPELL_JOKKUM_SUMMON, true);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_jokkum_scriptcast_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_jokkum_scriptcast_AuraScript();
+ }
+};
+
void AddSC_storm_peaks()
{
new npc_injured_goblin();
@@ -469,4 +515,5 @@ void AddSC_storm_peaks()
new npc_icefang();
new npc_hyldsmeet_protodrake();
new spell_close_rift();
+ new spell_jokkum_scriptcast();
}
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 66415448d32..00adfa59d8d 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -57,16 +57,15 @@ public:
float x, y, z;
me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 0.1f);
- if (Unit* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000))
+ if (Creature* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000))
{
_rageclawGUID = summon->GetGUID();
- LockRageclaw();
+ LockRageclaw(summon);
}
}
- void LockRageclaw()
+ void LockRageclaw(Creature* rageclaw)
{
- Unit* rageclaw = Unit::GetCreature(*me, _rageclawGUID);
// pointer check not needed
me->SetInFront(rageclaw);
rageclaw->SetInFront(me);
@@ -75,12 +74,11 @@ public:
DoCast(rageclaw, SPELL_RIGHT_CHAIN, true);
}
- void UnlockRageclaw(Unit* who)
+ void UnlockRageclaw(Unit* who, Creature* rageclaw)
{
if (!who)
return;
- Creature* rageclaw = Unit::GetCreature(*me, _rageclawGUID);
// pointer check not needed
DoCast(rageclaw, SPELL_FREE_RAGECLAW, true);
@@ -95,7 +93,7 @@ public:
{
if (Creature* rageclaw = Unit::GetCreature(*me, _rageclawGUID))
{
- UnlockRageclaw(caster);
+ UnlockRageclaw(caster, rageclaw);
caster->ToPlayer()->KilledMonster(rageclaw->GetCreatureTemplate(), _rageclawGUID);
me->DespawnOrUnsummon();
}
@@ -141,8 +139,7 @@ public:
DoCast(me, SPELL_KNEEL, true); // Little Hack for kneel - Thanks Illy :P
}
- void MoveInLineOfSight(Unit* /*who*/)OVERRIDE { }
-
+ void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE
{
@@ -166,982 +163,6 @@ public:
}
};
-/*####
-## npc_gurgthock
-####*/
-
-enum Gurgthock
-{
- QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON = 12935,
- QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER = 12936,
- QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2 = 12954,
- QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1 = 12932,
- QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR = 12933,
- QUEST_AMPHITHEATER_ANGUISH_FROM_BEYOND = 12934,
-
- NPC_ORINOKO_TUSKBREAKER = 30020,
- NPC_KORRAK_BLOODRAGER = 30023,
- NPC_YGGDRAS = 30014,
- NPC_STINKBEARD = 30017,
- NPC_AZ_BARIN = 30026, // air
- NPC_DUKE_SINGEN = 30019, // fire
- NPC_ERATHIUS = 30025, // earth
- NPC_GARGORAL = 30024, // water
- NPC_FIEND_WATER = 30044,
- NPC_FIEND_AIR = 30045,
- NPC_FIEND_FIRE = 30042,
- NPC_FIEND_EARTH = 30043,
-
- SAY_QUEST_ACCEPT_TUSKARRMAGEDON = 0,
- SAY_QUEST_ACCEPT_KORRAK_1 = 1,
- SAY_QUEST_ACCEPT_KORRAK_2 = 2,
- SAY_QUEST_ACCEPT_MAGNATAUR = 3,
- EMOTE_YGGDRAS_SPAWN = 4,
- SAY_STINKBEARD_SPAWN = 5,
- SAY_GURGTHOCK_ELEMENTAL_SPAWN = 6,
- SAY_GURGTHOCK_7 = 7,
- SAY_QUEST_AMPHITHEATER_ANGUISH_YGGDRAS = 8,
- SAY_GURGTHOCK_9 = 9,
-
- SAY_CALL_FOR_HELP = 0,
- SAY_RECRUIT = 0,
-
- SPELL_CRASHING_WAVE = 55909, // water
- SPELL_SHOCKWAVE = 55918, // earth
- SPELL_BLAST_OF_AIR = 55912, // air
- SPELL_MAGMA_WAVE = 55916, // fire
-
- SPELL_ORB_OF_WATER = 55888, // fiend of water spell
- SPELL_ORB_OF_STORMS = 55882, // fiend of air spell
- SPELL_BOULDER = 55886, // fiend of earth spell
- SPELL_ORB_OF_FLAME = 55872, // fiend of fire spell
-};
-
-struct BossAndAdd
-{
- uint32 uiBoss;
- uint32 uiAdd;
- uint32 uiSpell;
- uint32 uiAddSpell;
-};
-
-static BossAndAdd Boss[]=
-{
- {NPC_GARGORAL, NPC_FIEND_WATER, SPELL_CRASHING_WAVE, SPELL_ORB_OF_WATER},
- {NPC_AZ_BARIN, NPC_FIEND_AIR, SPELL_BLAST_OF_AIR, SPELL_ORB_OF_STORMS},
- {NPC_DUKE_SINGEN, NPC_FIEND_FIRE, SPELL_MAGMA_WAVE, SPELL_ORB_OF_FLAME},
- {NPC_ERATHIUS, NPC_FIEND_EARTH, SPELL_SHOCKWAVE, SPELL_BOULDER},
-};
-
-const Position SpawnPosition[] =
-{
- {5754.692f, -2939.46f, 286.276123f, 5.156380f}, // stinkbeard || orinoko || korrak
- {5762.054199f, -2954.385010f, 273.826955f, 5.108289f}, //yggdras
- {5776.855f, -2989.77979f, 272.96814f, 5.194f} // elementals
-};
-
-const Position AddSpawnPosition[] =
-{
- {5722.487f, -3010.75f, 312.751648f, 0.478f}, // caster location
- {5724.983f, -2969.89551f, 286.359619f, 0.478f},
- {5733.76025f, -3000.34644f, 286.359619f, 0.478f},
- {5739.8125f, -2981.524f, 290.7671f, 0.478f}, // caster location
- {5742.101f, -2950.75586f, 286.2643f, 5.21f},
- {5743.305f, -3011.29736f, 290.7671f, 0.478f}, // caster location
- {5744.417f, -3025.528f, 286.35965f, 0.478f},
- {5763.189f, -3029.67529f, 290.7671f, 0.478f},
- {5769.401f, -2935.121f, 286.335754f, 5.21f},
- {5793.061f, -2934.593f, 286.359619f, 3.53f},
- {5797.32129f, -2955.26855f, 290.7671f, 3.53f}, // caster location
- {5813.94531f, -2956.74683f, 286.359619f, 3.53f},
- {5816.85547f, -2974.476f, 290.7671f, 3.53f}, // caster location
- {5820.30859f, -3002.83716f, 290.7671f, 3.53f}, // caster location
- {5828.50244f, -2981.737f, 286.359619f, 3.53f},
- {5828.899f, -2960.15479f, 312.751648f, 3.53f}, // caster location
-};
-
-class npc_gurgthock : public CreatureScript
-{
-public:
- npc_gurgthock() : CreatureScript("npc_gurgthock") { }
-
- struct npc_gurgthockAI : public ScriptedAI
- {
- npc_gurgthockAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() OVERRIDE
- {
- _summonGUID = 0;
- _playerGUID = 0;
-
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
- uiTimer = 0;
- uiPhase = 0;
- uiQuest = 0;
- uiRemoveFlagTimer = 5000;
-
- _bossRandom = 0;
-
- _removeFlag = false;
- }
-
- void SetGUID(uint64 guid, int32 /*id*/) OVERRIDE
- {
- _playerGUID = guid;
- }
-
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- _removeFlag = true;
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
-
- switch (type)
- {
- case 1:
- switch (data)
- {
- case QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON:
- Talk(SAY_QUEST_ACCEPT_TUSKARRMAGEDON);
- uiPhase = 1;
- uiTimer = 4000;
- break;
- case QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER:
- Talk(SAY_QUEST_ACCEPT_KORRAK_1);
- uiPhase = 3;
- uiTimer = 3000;
- break;
- case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2:
- case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1:
- uiPhase = 6;
- uiTimer = 3000;
- break;
- case QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR:
- uiTimer = 5000;
- uiPhase = 7;
- break;
- case QUEST_AMPHITHEATER_ANGUISH_FROM_BEYOND:
- uiTimer = 2000;
- uiPhase = 12;
- break;
- }
- break;
- }
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- ScriptedAI::UpdateAI(diff);
-
- if (_removeFlag)
- {
- if (uiRemoveFlagTimer <= diff)
- {
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
- _removeFlag = false;
-
- uiRemoveFlagTimer = 10000;
- } else uiRemoveFlagTimer -= diff;
- }
-
- if (uiPhase)
- {
- if (uiTimer <= diff)
- {
- switch (uiPhase)
- {
- case 1:
- if (Creature* summon = me->SummonCreature(NPC_ORINOKO_TUSKBREAKER, SpawnPosition[0], TEMPSUMMON_CORPSE_DESPAWN, 1000))
- _summonGUID = summon->GetGUID();
- uiPhase = 2;
- uiTimer = 4000;
- break;
- case 2:
- if (Creature* summon = Unit::GetCreature(*me, _summonGUID))
- summon->GetMotionMaster()->MoveJump(5776.319824f, -2981.005371f, 273.100037f, 10.0f, 20.0f);
- uiPhase = 0;
- _summonGUID = 0;
- break;
- case 3:
- Talk(SAY_QUEST_ACCEPT_KORRAK_2);
- uiTimer = 3000;
- uiPhase = 4;
- break;
- case 4:
- if (Creature* summon = me->SummonCreature(NPC_KORRAK_BLOODRAGER, SpawnPosition[0], TEMPSUMMON_CORPSE_DESPAWN, 1000))
- _summonGUID = summon->GetGUID();
- uiTimer = 3000;
- uiPhase = 0;
- break;
- case 6:
- Talk(SAY_GURGTHOCK_7, _playerGUID);
- uiTimer = 5000;
- uiPhase = 9;
- break;
- case 7:
- Talk(SAY_GURGTHOCK_9, _playerGUID);
- uiTimer = 3000;
- uiPhase = 8;
- break;
- case 8:
- Talk(SAY_QUEST_ACCEPT_MAGNATAUR);
- uiTimer = 5000;
- uiPhase = 11;
- break;
- case 9:
- Talk(SAY_QUEST_AMPHITHEATER_ANGUISH_YGGDRAS, _playerGUID);
- uiTimer = 10000;
- uiPhase = 10;
- break;
- case 10:
- me->SummonCreature(NPC_YGGDRAS, SpawnPosition[1], TEMPSUMMON_CORPSE_DESPAWN, 1000);
- Talk(EMOTE_YGGDRAS_SPAWN);
- uiPhase = 0;
- break;
- case 11:
- if (Creature* creature = me->SummonCreature(NPC_STINKBEARD, SpawnPosition[0], TEMPSUMMON_CORPSE_DESPAWN, 1000))
- creature->AI()->Talk(SAY_STINKBEARD_SPAWN);
- uiPhase = 0;
- break;
- case 12:
- Talk(SAY_GURGTHOCK_9, _playerGUID);
- uiTimer = 5000;
- uiPhase = 13;
- break;
- case 13:
- Talk(SAY_GURGTHOCK_ELEMENTAL_SPAWN);
- uiTimer = 3000;
- uiPhase = 14;
- break;
- case 14:
- _bossRandom = urand(0, 3);
- if (Creature* creature = me->SummonCreature(Boss[_bossRandom].uiBoss, SpawnPosition[2], TEMPSUMMON_CORPSE_DESPAWN, 1000))
- creature->AI()->SetData(1, _bossRandom);
- uiPhase = 0;
- break;
- }
- }
- else
- uiTimer -= diff;
- }
- }
-
- private:
- bool _removeFlag;
- uint8 _bossRandom;
- uint64 _summonGUID;
- uint64 _playerGUID;
-
- uint32 uiTimer;
- uint32 uiPhase;
- uint32 uiRemoveFlagTimer;
- uint32 uiQuest;
-
- };
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
- {
- switch (quest->GetQuestId())
- {
- case QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON:
- creature->AI()->SetData(1, quest->GetQuestId());
- break;
- case QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER:
- creature->AI()->SetData(1, quest->GetQuestId());
- break;
- case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2:
- case QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1:
- creature->AI()->SetData(1, quest->GetQuestId());
- break;
- case QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR:
- creature->AI()->SetData(1, quest->GetQuestId());
- break;
- case QUEST_AMPHITHEATER_ANGUISH_FROM_BEYOND:
- creature->AI()->SetData(1, quest->GetQuestId());
- break;
- }
-
- creature->AI()->SetGUID(player->GetGUID());
-
- return false;
- }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_gurgthockAI(creature);
- }
-};
-
-/*####
-## npc_orinoko_tuskbreaker
-####*/
-
-enum OrinokoTuskbreaker
-{
- NPC_WHISKER = 30113,
- NPC_HUNGRY_PENGUIN = 30110,
-
- SPELL_BATTLE_SHOUT = 32064,
- SPELL_FISHY_SCENT = 55937,
- SPELL_IMPALE = 55929,
- SPELL_SUMMON_WHISKER = 55946
-};
-
-class npc_orinoko_tuskbreaker : public CreatureScript
-{
-public:
- npc_orinoko_tuskbreaker() : CreatureScript("npc_orinoko_tuskbreaker") { }
-
- struct npc_orinoko_tuskbreakerAI : public ScriptedAI
- {
- npc_orinoko_tuskbreakerAI(Creature* creature) : ScriptedAI(creature)
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetReactState(REACT_PASSIVE);
- }
-
- void Reset() OVERRIDE
- {
- _summoned = false;
- _battleShout = false;
- _fishyScent = false;
- uiBattleShoutTimer = 0;
- uiFishyScentTimer = 20000;
- _whiskerGUID = 0;
- _affectedGUID = 0;
- }
-
- void EnterEvadeMode() OVERRIDE
- {
- if (Creature* whisker = me->GetCreature(*me, _whiskerGUID))
- whisker->RemoveFromWorld();
- }
-
- void MovementInform(uint32 type, uint32 /*pointId*/) OVERRIDE
- {
- if (type != EFFECT_MOTION_TYPE)
- return;
-
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetReactState(REACT_AGGRESSIVE);
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- uiBattleShoutTimer = 7000;
- }
-
- void EnterCombat(Unit* who) OVERRIDE
- {
- DoCast(who, SPELL_IMPALE);
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
-
- if (!_battleShout && uiBattleShoutTimer <= diff)
- {
- DoCast(me, SPELL_BATTLE_SHOUT);
- _battleShout = true;
- } else uiBattleShoutTimer -= diff;
-
- if (uiFishyScentTimer <= diff)
- {
- if (Unit* affected = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(affected, SPELL_FISHY_SCENT);
- _affectedGUID = affected->GetGUID();
- }
- uiFishyScentTimer = 20000;
- } else uiFishyScentTimer -= diff;
-
- if (!_summoned && !HealthAbovePct(50))
- {
- Talk(SAY_CALL_FOR_HELP);
- //DoCastVictim(SPELL_SUMMON_WHISKER); petai is not working correctly???
-
- if (Creature* whisker = me->SummonCreature(NPC_WHISKER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0))
- _whiskerGUID = whisker->GetGUID();
- _summoned = true;
- }
-
- DoMeleeAttackIfReady();
- }
-
- void JustSummoned(Creature* summon) OVERRIDE
- {
- switch (summon->GetEntry())
- {
- case NPC_WHISKER:
- summon->AI()->AttackStart(me->GetVictim());
- break;
- case NPC_HUNGRY_PENGUIN:
- if (Unit* affected = Unit::GetUnit(*me, _affectedGUID))
- {
- if (affected->IsAlive())
- summon->AI()->AttackStart(affected);
- }
- break;
- }
- }
-
- void JustDied(Unit* killer) OVERRIDE
- {
- if (_whiskerGUID)
- if (Creature* whisker = me->GetCreature(*me, _whiskerGUID))
- whisker->RemoveFromWorld();
-
- if (killer->GetTypeId() == TYPEID_PLAYER)
- killer->GetCharmerOrOwnerPlayerOrPlayerItself()->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON, killer);
-
- }
-
- private:
- bool _summoned;
- bool _battleShout;
- bool _fishyScent;
- uint32 uiBattleShoutTimer;
- uint32 uiFishyScentTimer;
- uint64 _affectedGUID;
- uint64 _whiskerGUID;
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_orinoko_tuskbreakerAI(creature);
- }
-};
-
-/*####
-## npc_korrak_bloodrager
-####*/
-
-enum KorrakBloodrager
-{
- SPELL_GROW = 55948,
- SPELL_CHARGE = 24193,
- SPELL_UPPERCUT = 30471,
- SPELL_ENRAGE = 42745
-};
-
-class npc_korrak_bloodrager : public CreatureScript
-{
-public:
- npc_korrak_bloodrager() : CreatureScript("npc_korrak_bloodrager") { }
-
- struct npc_korrak_bloodragerAI : public npc_escortAI
- {
- npc_korrak_bloodragerAI(Creature* creature) : npc_escortAI(creature)
- {
- Start(true, true, 0, NULL);
- SetDespawnAtEnd(false);
- }
-
- void Reset() OVERRIDE
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetReactState(REACT_PASSIVE);
- _enrage = false;
- _chargeTimer = 15000;
- _uppercutTimer = 12000;
-
- }
-
- void WaypointReached(uint32 waypointId) OVERRIDE
- {
- switch (waypointId)
- {
- case 6:
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetReactState(REACT_AGGRESSIVE);
- break;
- }
- }
-
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- DoCast(me, SPELL_GROW);
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- npc_escortAI::UpdateAI(diff);
-
- if (!UpdateVictim())
- return;
-
- if (_uppercutTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0))
- DoCast(target, SPELL_UPPERCUT);
- _uppercutTimer = 12000;
- } else _uppercutTimer -= diff;
-
- if (_chargeTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0))
- DoCast(target, SPELL_CHARGE);
- _chargeTimer = 15000;
- } else _chargeTimer -= diff;
-
- if (!_enrage && !HealthAbovePct(20))
- {
- DoCast(me, SPELL_ENRAGE);
- _enrage = true;
- }
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* killer) OVERRIDE
- {
- if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
- player->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER, killer);
- }
- private:
- bool _enrage;
- uint32 _chargeTimer;
- uint32 _uppercutTimer;
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_korrak_bloodragerAI(creature);
- }
-};
-
-/*####
-## npc_yggdras
-####*/
-
-enum Yggdras
-{
- SPELL_CLEAVE = 40504,
- SPELL_CORRODE_FLESH = 57076,
- SPELL_JORMUNGAR_SPAWN = 55859
-};
-
-class npc_yggdras : public CreatureScript
-{
-public:
- npc_yggdras() : CreatureScript("npc_yggdras") { }
-
- struct npc_yggdrasAI : public ScriptedAI
- {
- npc_yggdrasAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() OVERRIDE
- {
- _cleaveTimer = 9000;
- _corrodeFleshTimer = 6000;
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
-
- if (me->GetVictim()->GetPositionZ() >= 286.276f)
- {
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
- {
- if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
- {
- if (unit->GetPositionZ() <= 286.276f)
- {
- me->getThreatManager().resetAllAggro();
- me->AddThreat(unit, 5.0f);
- break;
- }
- EnterEvadeMode();
- }
- }
- }
-
- if (_cleaveTimer <= diff)
- {
- DoCastVictim(SPELL_CLEAVE);
- _cleaveTimer = 9000;
- } else _cleaveTimer -= diff;
-
- if (_corrodeFleshTimer <= diff)
- {
- DoCastVictim(SPELL_CORRODE_FLESH);
- _corrodeFleshTimer = 6000;
- } else _corrodeFleshTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* killer) OVERRIDE
- {
- if (Unit* summoner = me->ToTempSummon()->GetSummoner())
- {
- std::string sText = (std::string(killer->GetName()) + " has defeated Yg.. Yggg-really big worm!");
- summoner->MonsterYell(sText.c_str(), LANG_UNIVERSAL, 0);
- }
-
- if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
- {
- player->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1, killer);
- player->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2, killer);
- }
-
- for (uint8 i = 0; i < 3; ++i)
- DoCast(killer, SPELL_JORMUNGAR_SPAWN, true);
- }
- private:
- uint32 _cleaveTimer;
- uint32 _corrodeFleshTimer;
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_yggdrasAI(creature);
- }
-};
-
-/*####
-## npc_stinkbeard
-####*/
-
-enum Stinkbeard
-{
- SPELL_ENRAGE_STINKBEARD = 50420,
- SPELL_KNOCK_AWAY = 31389,
- SPELL_STINKY_BEARD = 55867,
- SPELL_THUNDERBLADE = 55866,
- SPELL_THUNDERCLAP = 15588
-};
-
-class npc_stinkbeard : public CreatureScript
-{
-public:
- npc_stinkbeard() : CreatureScript("npc_stinkbeard") { }
-
- struct npc_stinkbeardAI : public npc_escortAI
- {
- npc_stinkbeardAI(Creature* creature) : npc_escortAI(creature)
- {
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetReactState(REACT_PASSIVE);
- Start(true, true, 0, NULL);
- SetDespawnAtEnd(false);
- }
-
- void Reset() OVERRIDE
- {
- me->AddAura(SPELL_THUNDERBLADE, me);
- uiKnockAwayTimer = 10000;
- uiStinkyBeardTimer = 15000;
- _enrage = false;
- _thunderClap = false;
- }
-
- void WaypointReached(uint32 waypointId) OVERRIDE
- {
- switch (waypointId)
- {
- case 7:
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetReactState(REACT_AGGRESSIVE);
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- break;
- }
- }
-
- void UpdateAI(uint32 uiDiff) OVERRIDE
- {
- npc_escortAI::UpdateAI(uiDiff);
-
- if (!UpdateVictim())
- return;
-
- if (Unit* victim = me->GetVictim())
- {
- if (victim->GetPositionZ() >= 286.276f)
- {
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
- {
- if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
- {
- if (unit->GetPositionZ() <= 286.276f)
- {
- me->getThreatManager().resetAllAggro();
- me->AddThreat(unit, 5.0f);
- break;
- }
- EnterEvadeMode();
- }
- }
- }
- }
-
- if (_thunderClap && !HealthAbovePct(10))
- {
- DoCastAOE(SPELL_THUNDERCLAP);
- _thunderClap = true;
- }
-
- if (uiKnockAwayTimer <= uiDiff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- if (target && target->IsAlive())
- DoCast(target, SPELL_KNOCK_AWAY);
- }
- uiKnockAwayTimer = 10000;
- } else uiKnockAwayTimer -= uiDiff;
-
- if (uiStinkyBeardTimer <= uiDiff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- if (target && target->IsAlive())
- DoCast(target, SPELL_STINKY_BEARD);
- }
- uiStinkyBeardTimer = 15000;
- } else uiStinkyBeardTimer -= uiDiff;
-
- if (!_enrage && !HealthAbovePct(20))
- {
- DoCast(me, SPELL_ENRAGE_STINKBEARD);
- _enrage = true;
- }
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* killer) OVERRIDE
- {
- if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
- player->GetCharmerOrOwnerPlayerOrPlayerItself()->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR, killer);
-
- std::string sText = ("And with AUTHORITY, " + std::string(killer->GetName()) + " dominates the magnataur lord! Stinkbeard's clan is gonna miss him back home in the Dragonblight!");
- me->MonsterYell(sText.c_str(), LANG_UNIVERSAL, 0);
- }
- private:
- bool _enrage;
- bool _thunderClap;
- uint32 uiKnockAwayTimer;
- uint32 uiStinkyBeardTimer;
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_stinkbeardAI(creature);
- }
-};
-
-/*####
-## npc_elemental_lord
-####*/
-
-class npc_elemental_lord : public CreatureScript
-{
-public:
- npc_elemental_lord() : CreatureScript("npc_elemental_lord") { }
-
- struct npc_elemental_lordAI : public ScriptedAI
- {
- npc_elemental_lordAI(Creature* creature) : ScriptedAI(creature) { }
-
- std::list<uint64> SummonList;
-
- uint32 uiElementalSpellTimer;
-
- uint8 uiBossRandom;
- uint32 uiSpellInfo;
-
- bool bAddAttack;
-
- void Reset() OVERRIDE
- {
- uiBossRandom = 0;
- uiSpellInfo = 0;
- uiElementalSpellTimer = urand(5000, 8000);
-
- bAddAttack = false;
- }
-
- void SetData(uint32 uiData, uint32 uiValue) OVERRIDE
- {
- if (uiData == 1)
- {
- uiBossRandom = uiValue;
- SummonAdds();
- }
- }
-
- void SummonAdds()
- {
- if (!Boss[uiBossRandom].uiAdd)
- return;
-
- SummonList.clear();
-
- for (uint8 uiI = 0; uiI < 16; uiI++)
- {
- if (Creature* summon = me->SummonCreature(Boss[uiBossRandom].uiAdd, AddSpawnPosition[uiI]))
- {
- summon->AI()->SetData(1, uiBossRandom);
- SummonList.push_back(summon->GetGUID());
- }
- }
-
- }
-
- void EnterCombat(Unit* unit) OVERRIDE
- {
- if (!SummonList.empty())
- for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
- {
- if (Creature* temp = Unit::GetCreature(*me, *itr))
- {
- temp->m_CombatDistance = 100.0f; // ugly hack? we are not in a instance sorry. :(
- temp->AI()->AttackStart(unit);
- }
- }
- }
-
- void UpdateAI(uint32 uiDiff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
-
- if (me->GetVictim()->GetPositionZ() >= 286.276f)
- {
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
- {
- if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
- {
- if (unit->GetPositionZ() <= 286.276f)
- {
- me->getThreatManager().resetAllAggro();
- me->AddThreat(unit, 5.0f);
- break;
- }
- EnterEvadeMode();
- }
- }
- }
-
- if (uiElementalSpellTimer <= uiDiff)
- {
- DoCastVictim(Boss[uiBossRandom].uiSpell);
-
- uiElementalSpellTimer = urand(5000, 8000);
- } else uiElementalSpellTimer -= uiDiff;
-
- if (!bAddAttack && !HealthAbovePct(20))
- {
- if (!SummonList.empty())
- for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
- {
- if (Creature* temp = Unit::GetCreature(*me, *itr))
- {
- if (temp->GetPositionZ() >= 287.00f)
- continue;
-
- if (temp->GetVictim())
- temp->GetMotionMaster()->MoveChase(temp->GetVictim());
- }
- }
-
- bAddAttack = true;
- }
-
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* killer) OVERRIDE
- {
- if (!SummonList.empty())
- for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
- if (Creature* temp = Unit::GetCreature(*me, *itr))
- temp->DespawnOrUnsummon();
-
- if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
- player->GetCharmerOrOwnerPlayerOrPlayerItself()->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_FROM_BEYOND, killer);
-
- std::string sText = (std::string(killer->GetName()) + " is victorious once more!");
-
- if (Unit* summoner = me->ToTempSummon()->GetSummoner())
- summoner->MonsterYell(sText.c_str(), LANG_UNIVERSAL, 0);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_elemental_lordAI(creature);
- }
-};
-
-/*####
-## npc_fiend_elemental
-####*/
-
-class npc_fiend_elemental : public CreatureScript
-{
-public:
- npc_fiend_elemental() : CreatureScript("npc_fiend_elemental") { }
-
- struct npc_fiend_elementalAI : public ScriptedAI
- {
- npc_fiend_elementalAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() OVERRIDE
- {
- if (me->GetPositionZ() >= 287.0f)
- me->GetMotionMaster()->MoveIdle();
-
- _spell = 0;
- _missleTimer = urand(2000, 7000);
- }
-
- void AttackStart(Unit* who) OVERRIDE
- {
- if (!who)
- return;
-
- AttackStartNoMove(who);
- }
-
- void SetData(uint32 Data, uint32 Value) OVERRIDE
- {
- if (Data == 1)
- _spell = Boss[Value].uiAddSpell;
-
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
-
- if (me->GetPositionZ() >= 287.0f)
- {
- if (_missleTimer <= diff)
- {
- if (_spell) // Sometimes it is 0, why?
- DoCast(me, _spell); // this spell (what spell) is not supported ... YET!
- _missleTimer = urand(2000, 7000);
- } else _missleTimer -= diff;
- }
-
- DoMeleeAttackIfReady();
- }
-
- private:
- uint32 _missleTimer;
- uint32 _spell;
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_fiend_elementalAI(creature);
- }
-};
/*####
## npc_released_offspring_harkoa
@@ -1184,7 +205,8 @@ public:
enum CrusadeRecruit
{
SPELL_QUEST_CREDIT = 50633,
- QUEST_TROLL_PATROL_INTESTINAL_FORTITUDE = 12509
+ QUEST_TROLL_PATROL_INTESTINAL_FORTITUDE = 12509,
+ SAY_RECRUIT = 0
};
enum CrusadeRecruitEvents
@@ -1867,15 +889,8 @@ void AddSC_zuldrak()
{
new npc_drakuru_shackles();
new npc_captured_rageclaw();
- new npc_gurgthock();
- new npc_orinoko_tuskbreaker();
- new npc_korrak_bloodrager();
- new npc_yggdras();
- new npc_stinkbeard();
new npc_released_offspring_harkoa();
new npc_crusade_recruit();
- new npc_elemental_lord();
- new npc_fiend_elemental();
new go_scourge_enclosure();
new npc_alchemist_finklestein();
new go_finklesteins_cauldron();
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 3a790ec683b..3f90118ec8b 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -1990,7 +1990,7 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void MoveInLineOfSight(Unit* who) OVERRIDE
diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt
index 84cbbc3c30c..ab10ee2dfe4 100644
--- a/src/server/scripts/Outland/CMakeLists.txt
+++ b/src/server/scripts/Outland/CMakeLists.txt
@@ -43,9 +43,13 @@ set(scripts_STAT_SRCS
Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
+ Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
+ Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp
+ Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp
+ Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp
+ Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp
Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp
Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp
- Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp
Outland/zone_shattrath_city.cpp
Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
@@ -68,6 +72,9 @@ set(scripts_STAT_SRCS
Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
Outland/TempestKeep/botanica/boss_warp_splinter.cpp
Outland/TempestKeep/botanica/boss_laj.cpp
+ Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
+ Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
+ Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
Outland/TempestKeep/arcatraz/arcatraz.h
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp
new file mode 100644
index 00000000000..ba59aa3b463
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_mennu_the_betrayer
+SD%Complete: 95%
+SDComment:
+SDCategory: Coilfang Reservoir, The Slave Pens
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "the_slave_pens.h"
+
+enum Say
+{
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2
+};
+
+enum Spells
+{
+ SPELL_TAINTED_STONESKIN_TOTEM = 31985, // every 30 sec if health below 100%
+ SPELL_TAINTED_EARTHGRAB_TOTEM = 31981, // ?
+ SPELL_CORRUPTED_NOVA_TOTEM = 31991, // ?
+ SPELL_MENNUS_HEALING_WARD = 34980, // every 14 - 25 sec
+ SPELL_LIGHTNING_BOLT = 35010 // every 14 - 19 sec
+};
+
+enum Events
+{
+ EVENT_TAINTED_STONESKIN_TOTEM = 1,
+ EVENT_TAINTED_EARTHGRAB_TOTEM = 2,
+ EVENT_CORRUPTED_NOVA_TOTEM = 3,
+ EVENT_MENNUS_HEALING_WARD = 4,
+ EVENT_LIGHTNING_BOLT = 5
+};
+
+class boss_mennu_the_betrayer : public CreatureScript
+{
+ public:
+ boss_mennu_the_betrayer() : CreatureScript("boss_mennu_the_betrayer") { }
+
+ struct boss_mennu_the_betrayerAI : public BossAI
+ {
+ boss_mennu_the_betrayerAI(Creature* creature) : BossAI(creature, DATA_MENNU_THE_BETRAYER) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30000);
+ events.ScheduleEvent(EVENT_TAINTED_EARTHGRAB_TOTEM, 20000);
+ events.ScheduleEvent(EVENT_CORRUPTED_NOVA_TOTEM, 60000);
+ events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, urand(14000, 25000));
+ events.ScheduleEvent(EVENT_LIGHTNING_BOLT, urand(14000, 19000));
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_TAINTED_STONESKIN_TOTEM:
+ if (HealthBelowPct(100))
+ DoCast(me, SPELL_TAINTED_STONESKIN_TOTEM);
+ events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30000);
+ break;
+ case EVENT_TAINTED_EARTHGRAB_TOTEM:
+ DoCast(me, SPELL_TAINTED_EARTHGRAB_TOTEM);
+ break;
+ case EVENT_CORRUPTED_NOVA_TOTEM:
+ DoCast(me, SPELL_CORRUPTED_NOVA_TOTEM);
+ break;
+ case EVENT_MENNUS_HEALING_WARD:
+ DoCast(me, SPELL_MENNUS_HEALING_WARD);
+ events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, urand(14000, 25000));
+ break;
+ case EVENT_LIGHTNING_BOLT:
+ DoCastVictim(SPELL_LIGHTNING_BOLT, true);
+ events.ScheduleEvent(EVENT_LIGHTNING_BOLT, urand(14000, 25000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_mennu_the_betrayerAI(creature);
+ }
+};
+
+void AddSC_boss_mennu_the_betrayer()
+{
+ new boss_mennu_the_betrayer();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp
new file mode 100644
index 00000000000..6cef7291542
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_quagmirran
+SD%Complete: 100%
+SDComment:
+SDCategory: Coilfang Reservoir, The Slave Pens
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "the_slave_pens.h"
+
+enum Spells
+{
+ SPELL_ACID_SPRAY = 38153,
+ SPELL_CLEAVE = 40504,
+ SPELL_UPPERCUT = 32055,
+ SPELL_POISON_BOLT_VOLLEY = 34780 // 39340
+};
+
+enum Events
+{
+ EVENT_ACID_SPRAY = 1,
+ EVENT_CLEAVE = 2,
+ EVENT_UPPERCUT = 3,
+ EVENT_POISON_BOLT_VOLLEY = 4
+};
+
+class boss_quagmirran : public CreatureScript
+{
+ public:
+ boss_quagmirran() : CreatureScript("boss_quagmirran") { }
+
+ struct boss_quagmirranAI : public BossAI
+ {
+ boss_quagmirranAI(Creature* creature) : BossAI(creature, DATA_QUAGMIRRAN) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_ACID_SPRAY, 25000);
+ events.ScheduleEvent(EVENT_CLEAVE, 9000);
+ events.ScheduleEvent(EVENT_UPPERCUT, 20000);
+ events.ScheduleEvent(EVENT_POISON_BOLT_VOLLEY, 31000);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE { }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ACID_SPRAY:
+ DoCastAOE(SPELL_ACID_SPRAY);
+ events.ScheduleEvent(EVENT_ACID_SPRAY, urand(20000, 25000));
+ break;
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE, true);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(18000, 34000));
+ break;
+ case EVENT_UPPERCUT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f, true))
+ DoCast(target, SPELL_UPPERCUT);
+ events.ScheduleEvent(EVENT_UPPERCUT, 22000);
+ break;
+ case EVENT_POISON_BOLT_VOLLEY:
+ DoCast(me, SPELL_POISON_BOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_POISON_BOLT_VOLLEY, 24000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_quagmirranAI(creature);
+ }
+};
+
+void AddSC_boss_quagmirran()
+{
+ new boss_quagmirran();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp
new file mode 100644
index 00000000000..a025df5c3ae
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_rokmar_the_crackler
+SD%Complete: 100%
+SDComment:
+SDCategory: Coilfang Reservoir, The Slave Pens
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "the_slave_pens.h"
+
+enum Spells
+{
+ SPELL_GRIEVOUS_WOUND = 31956,
+ SPELL_ENSNARING_MOSS = 31948,
+ SPELL_WATER_SPIT = 35008,
+ SPELL_FRENZY = 34970
+};
+
+enum Events
+{
+ EVENT_GRIEVOUS_WOUND = 1,
+ EVENT_ENSNARING_MOSS = 2,
+ EVENT_WATER_SPIT = 3
+};
+
+class boss_rokmar_the_crackler : public CreatureScript
+{
+ public:
+ boss_rokmar_the_crackler() : CreatureScript("boss_rokmar_the_crackler") { }
+
+ struct boss_rokmar_the_cracklerAI : public BossAI
+ {
+ boss_rokmar_the_cracklerAI(Creature* creature) : BossAI(creature, DATA_MENNU_THE_BETRAYER) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ rokmarFrenzy = false;
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_GRIEVOUS_WOUND, 10000);
+ events.ScheduleEvent(EVENT_ENSNARING_MOSS, 20000);
+ events.ScheduleEvent(EVENT_WATER_SPIT, 14000);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE { }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_GRIEVOUS_WOUND:
+ DoCastVictim(SPELL_GRIEVOUS_WOUND, true);
+ events.ScheduleEvent(EVENT_GRIEVOUS_WOUND, urand(20000, 30000));
+ break;
+ case EVENT_ENSNARING_MOSS:
+ DoCastAOE(SPELL_ENSNARING_MOSS);
+ events.ScheduleEvent(EVENT_ENSNARING_MOSS, urand(20000, 30000));
+ break;
+ case EVENT_WATER_SPIT:
+ DoCastAOE(SPELL_WATER_SPIT);
+ events.ScheduleEvent(EVENT_WATER_SPIT, urand(14000, 18000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(10) && !rokmarFrenzy)
+ {
+ DoCast(me, SPELL_FRENZY);
+ rokmarFrenzy = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool rokmarFrenzy;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_rokmar_the_cracklerAI(creature);
+ }
+};
+
+void AddSC_boss_rokmar_the_crackler()
+{
+ new boss_rokmar_the_crackler();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
index cd11e2e1bf1..1c31bee7d4f 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
@@ -24,11 +24,12 @@ gets instead the deserter debuff.
#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "the_slave_pens.h"
class instance_the_slave_pens : public InstanceMapScript
{
public:
- instance_the_slave_pens() : InstanceMapScript("instance_the_slave_pens", 547) { }
+ instance_the_slave_pens() : InstanceMapScript(SPScriptName, 547) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
new file mode 100644
index 00000000000..624ead7ef08
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SLAVE_PENS_H
+#define SLAVE_PENS_H
+
+uint32 const EncounterCount = 3;
+
+#define SPScriptName "instance_the_slave_pens"
+
+enum DataTypes
+{
+ DATA_MENNU_THE_BETRAYER = 1,
+ DATA_ROKMAR_THE_CRACKLER = 2,
+ DATA_QUAGMIRRAN = 3
+};
+
+#endif // SLAVE_PENS_H
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index 9c60c16d0af..c293a995467 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
@@ -16,7 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "mechanar.h"
@@ -26,7 +25,7 @@ static DoorData const doorData[] =
{ GO_DOOR_MOARG_1, DATA_GATEWATCHER_IRON_HAND, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_DOOR_MOARG_2, DATA_GATEWATCHER_GYROKILL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_DOOR_NETHERMANCER, DATA_NETHERMANCER_SEPRETHREA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
};
class instance_mechanar : public InstanceMapScript
@@ -42,7 +41,6 @@ class instance_mechanar : public InstanceMapScript
LoadDoorData(doorData);
}
-
void OnGameObjectCreate(GameObject* gameObject)
{
switch (gameObject->GetEntry())
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index 9206636893c..ff3145c5c78 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -69,11 +69,8 @@ enum MillhouseSpells
class npc_millhouse_manastorm : public CreatureScript
{
public:
+ npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { }
- npc_millhouse_manastorm()
- : CreatureScript("npc_millhouse_manastorm")
- {
- }
struct npc_millhouse_manastormAI : public ScriptedAI
{
npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature)
@@ -101,14 +98,11 @@ class npc_millhouse_manastorm : public CreatureScript
Pyroblast_Timer = 1000;
Fireball_Timer = 2500;
- if (instance)
- {
- if (instance->GetData(TYPE_WARDEN_2) == DONE)
- Init = true;
+ if (instance->GetData(DATA_WARDEN_2) == DONE)
+ Init = true;
- if (instance->GetData(TYPE_HARBINGERSKYRISS) == DONE)
- Talk(SAY_COMPLETE);
- }
+ if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE)
+ Talk(SAY_COMPLETE);
}
void AttackStart(Unit* who) OVERRIDE
@@ -122,7 +116,7 @@ class npc_millhouse_manastorm : public CreatureScript
}
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void KilledUnit(Unit* /*victim*/) OVERRIDE
{
@@ -134,7 +128,7 @@ class npc_millhouse_manastorm : public CreatureScript
Talk(SAY_DEATH);
/*for questId 10886 (heroic mode only)
- if (instance && instance->GetData(TYPE_HARBINGERSKYRISS) != DONE)
+ if (instance->GetBossState(DATA_HARBINGER_SKYRISS) != DONE)
->FailQuest();*/
}
@@ -176,8 +170,7 @@ class npc_millhouse_manastorm : public CreatureScript
EventProgress_Timer = 6000;
break;
case 7:
- if (instance)
- instance->SetData(TYPE_WARDEN_2, DONE);
+ instance->SetData(DATA_WARDEN_2, DONE);
Init = true;
break;
}
@@ -223,7 +216,7 @@ class npc_millhouse_manastorm : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_millhouse_manastormAI(creature);
+ return GetArcatrazAI<npc_millhouse_manastormAI>(creature);
}
};
/*#####
@@ -273,10 +266,7 @@ enum WardenSpells
class npc_warden_mellichar : public CreatureScript
{
public:
-
- npc_warden_mellichar() : CreatureScript("npc_warden_mellichar")
- {
- }
+ npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { }
struct npc_warden_mellicharAI : public ScriptedAI
{
@@ -304,14 +294,12 @@ class npc_warden_mellichar : public CreatureScript
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoCast(me, SPELL_TARGET_OMEGA);
- if (instance)
- instance->SetData(TYPE_HARBINGERSKYRISS, NOT_STARTED);
+ instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED);
}
void AttackStart(Unit* /*who*/) OVERRIDE { }
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (IsRunning)
return;
@@ -334,69 +322,60 @@ class npc_warden_mellichar : public CreatureScript
Talk(YELL_INTRO1);
DoCast(me, SPELL_BUBBLE_VISUAL);
- if (instance)
- {
- instance->SetData(TYPE_HARBINGERSKYRISS, IN_PROGRESS);
- instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false);
- IsRunning = true;
- }
+ instance->SetBossState(DATA_HARBINGER_SKYRISS, IN_PROGRESS);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
+ IsRunning = true;
}
bool CanProgress()
{
- if (instance)
- {
- if (Phase == 7 && instance->GetData(TYPE_WARDEN_4) == DONE)
- return true;
- if (Phase == 6 && instance->GetData(TYPE_WARDEN_3) == DONE)
- return true;
- if (Phase == 5 && instance->GetData(TYPE_WARDEN_2) == DONE)
- return true;
- if (Phase == 4)
- return true;
- if (Phase == 3 && instance->GetData(TYPE_WARDEN_1) == DONE)
- return true;
- if (Phase == 2 && instance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS)
- return true;
- if (Phase == 1 && instance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS)
- return true;
- return false;
- }
+ if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE)
+ return true;
+ if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE)
+ return true;
+ if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE)
+ return true;
+ if (Phase == 4)
+ return true;
+ if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE)
+ return true;
+ if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS)
+ return true;
+ if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS)
+ return true;
+
return false;
}
void DoPrepareForPhase()
{
- if (instance)
- {
- me->InterruptNonMeleeSpells(true);
- me->RemoveAurasByType(SPELL_AURA_DUMMY);
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAurasByType(SPELL_AURA_DUMMY);
- switch (Phase)
- {
+ switch (Phase)
+ {
case 2:
DoCast(me, SPELL_TARGET_ALPHA);
- instance->SetData(TYPE_WARDEN_1, IN_PROGRESS);
- instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false);
+ instance->SetData(DATA_WARDEN_1, IN_PROGRESS);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
break;
case 3:
DoCast(me, SPELL_TARGET_BETA);
- instance->SetData(TYPE_WARDEN_2, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_2, IN_PROGRESS);
break;
case 5:
DoCast(me, SPELL_TARGET_DELTA);
- instance->SetData(TYPE_WARDEN_3, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_3, IN_PROGRESS);
break;
case 6:
DoCast(me, SPELL_TARGET_GAMMA);
- instance->SetData(TYPE_WARDEN_4, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_4, IN_PROGRESS);
break;
case 7:
- instance->SetData(TYPE_WARDEN_5, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_5, IN_PROGRESS);
break;
- }
- CanSpawn = true;
}
+ CanSpawn = true;
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -406,13 +385,10 @@ class npc_warden_mellichar : public CreatureScript
if (EventProgress_Timer <= diff)
{
- if (instance)
+ if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == FAIL)
{
- if (instance->GetData(TYPE_HARBINGERSKYRISS) == FAIL)
- {
- Reset();
- return;
- }
+ Reset();
+ return;
}
if (CanSpawn)
@@ -517,7 +493,7 @@ class npc_warden_mellichar : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_warden_mellicharAI(creature);
+ return GetArcatrazAI<npc_warden_mellicharAI>(creature);
}
};
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
index 37839d4794d..1ebfad4dfeb 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,23 +15,56 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef ARCATRAZ_H_
-#define ARCATRAZ_H_
+#ifndef ARCATRAZ_H
+#define ARCATRAZ_H
+
+#define ArcatrazScriptName "instance_arcatraz"
+
+uint32 const EncounterCount = 4;
enum DataTypes
{
- TYPE_ZEREKETH = 1,
- TYPE_DALLIAH = 2,
- TYPE_SOCCOTHRATES = 3,
- TYPE_HARBINGERSKYRISS = 4,
- TYPE_WARDEN_1 = 5,
- TYPE_WARDEN_2 = 6,
- TYPE_WARDEN_3 = 7,
- TYPE_WARDEN_4 = 8,
- TYPE_WARDEN_5 = 9,
- DATA_MELLICHAR = 10,
- TYPE_SHIELD_OPEN = 11,
- DATA_SPHERE_SHIELD = 12
+ // Encounter States/Boss GUIDs
+ DATA_ZEREKETH = 0,
+ DATA_DALLIAH = 1,
+ DATA_SOCCOTHRATES = 2,
+ DATA_HARBINGER_SKYRISS = 3,
+
+ // Additional Data
+ DATA_CONVERSATION = 4,
+ DATA_WARDEN_1 = 5, // used by EventAI
+ DATA_WARDEN_2 = 6, // used by EventAI
+ DATA_WARDEN_3 = 7, // used by EventAI
+ DATA_WARDEN_4 = 8, // used by EventAI
+ DATA_WARDEN_5 = 9, // used by EventAI
+ DATA_MELLICHAR = 10,
+ DATA_WARDENS_SHIELD = 11
+};
+
+enum CreatureIds
+{
+ NPC_DALLIAH = 20885,
+ NPC_SOCCOTHRATES = 20886,
+ NPC_MELLICHAR = 20904, // skyriss will kill this unit
+ NPC_ALPHA_POD_TARGET = 21436
};
-#endif // ARCATRAZ_H_
+enum GameObjectIds
+{
+ GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA = 184318, // door opened when Wrath-Scryer Soccothrates dies
+ GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA = 184319, // door opened when Dalliah the Doomsayer dies
+ GO_STASIS_POD_ALPHA = 183961, // pod first boss wave
+ GO_STASIS_POD_BETA = 183963, // pod second boss wave
+ GO_STASIS_POD_DELTA = 183964, // pod third boss wave
+ GO_STASIS_POD_GAMMA = 183962, // pod fourth boss wave
+ GO_STASIS_POD_OMEGA = 183965, // pod fifth boss wave
+ GO_WARDENS_SHIELD = 184802 // shield 'protecting' mellichar
+};
+
+template<class AI>
+AI* GetArcatrazAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, ArcatrazScriptName);
+}
+
+#endif // ARCATRAZ_H
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
new file mode 100644
index 00000000000..36377b4d715
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "arcatraz.h"
+
+enum Say
+{
+ // Dalliah the Doomsayer
+ SAY_AGGRO = 1,
+ SAY_SLAY = 2,
+ SAY_WHIRLWIND = 3,
+ SAY_HEAL = 4,
+ SAY_DEATH = 5,
+ SAY_SOCCOTHRATES_DEATH = 7,
+
+ // Wrath-Scryer Soccothrates
+ SAY_AGGRO_DALLIAH_FIRST = 0,
+ SAY_DALLIAH_25_PERCENT = 5
+};
+
+enum Spells
+{
+ SPELL_GIFT_OF_THE_DOOMSAYER = 36173,
+ SPELL_WHIRLWIND = 36142,
+ SPELL_HEAL = 36144,
+ SPELL_SHADOW_WAVE = 39016 // Heroic only
+};
+
+enum Events
+{
+ EVENT_GIFT_OF_THE_DOOMSAYER = 1,
+ EVENT_WHIRLWIND = 2,
+ EVENT_HEAL = 3,
+ EVENT_SHADOW_WAVE = 4, // Heroic only
+ EVENT_ME_FIRST = 5,
+ EVENT_SOCCOTHRATES_DEATH = 6
+};
+
+class boss_dalliah_the_doomsayer : public CreatureScript
+{
+ public:
+ boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { }
+
+ struct boss_dalliah_the_doomsayerAI : public BossAI
+ {
+ boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ soccothratesDeath = false;
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
+ if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
+ soccothrates->AI()->SetData(1, 1);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000));
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000));
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
+ events.ScheduleEvent(EVENT_ME_FIRST, 6000);
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void SetData(uint32 /*type*/, uint32 data) OVERRIDE
+ {
+ switch (data)
+ {
+ case 1:
+ events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000);
+ soccothratesDeath = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ {
+ if (soccothratesDeath)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SOCCOTHRATES_DEATH:
+ Talk(SAY_SOCCOTHRATES_DEATH);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ return;
+ }
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_GIFT_OF_THE_DOOMSAYER:
+ DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true);
+ events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000));
+ break;
+ case EVENT_WHIRLWIND:
+ DoCast(me, SPELL_WHIRLWIND);
+ Talk(SAY_WHIRLWIND);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000));
+ events.ScheduleEvent(EVENT_HEAL, 6000);
+ break;
+ case EVENT_HEAL:
+ DoCast(me, SPELL_HEAL);
+ Talk(SAY_HEAL);
+ break;
+ case EVENT_SHADOW_WAVE:
+ DoCastVictim(SPELL_SHADOW_WAVE, true);
+ events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
+ break;
+ case EVENT_ME_FIRST:
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
+ if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
+ soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(25) && !soccothratesTaunt)
+ {
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
+ soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT);
+ soccothratesTaunt = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool soccothratesTaunt;
+ bool soccothratesDeath;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetArcatrazAI<boss_dalliah_the_doomsayerAI>(creature);
+ }
+};
+
+void AddSC_boss_dalliah_the_doomsayer()
+{
+ new boss_dalliah_the_doomsayer();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
index eda90d3b734..48d955acbc3 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
@@ -61,21 +61,15 @@ enum Spells
class boss_harbinger_skyriss : public CreatureScript
{
public:
+ boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { }
- boss_harbinger_skyriss()
- : CreatureScript("boss_harbinger_skyriss")
+ struct boss_harbinger_skyrissAI : public BossAI
{
- }
- struct boss_harbinger_skyrissAI : public ScriptedAI
- {
- boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature)
+ boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS)
{
- instance = creature->GetInstanceScript();
Intro = false;
}
- InstanceScript* instance;
-
bool Intro;
bool IsImage33;
bool IsImage66;
@@ -104,7 +98,6 @@ class boss_harbinger_skyriss : public CreatureScript
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!Intro)
return;
@@ -117,8 +110,7 @@ class boss_harbinger_skyriss : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
Talk(SAY_DEATH);
- if (instance)
- instance->SetData(TYPE_HARBINGERSKYRISS, DONE);
+ _JustDied();
}
void JustSummoned(Creature* summon) OVERRIDE
@@ -137,7 +129,7 @@ class boss_harbinger_skyriss : public CreatureScript
void KilledUnit(Unit* victim) OVERRIDE
{
//won't yell killing pet/other unit
- if (victim->GetEntry() == 21436)
+ if (victim->GetEntry() == NPC_ALPHA_POD_TARGET)
return;
Talk(SAY_KILL);
@@ -160,27 +152,24 @@ class boss_harbinger_skyriss : public CreatureScript
{
if (!Intro)
{
- if (!instance)
- return;
-
if (Intro_Timer <= diff)
{
switch (Intro_Phase)
{
case 1:
Talk(SAY_INTRO);
- instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), true);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true);
++Intro_Phase;
Intro_Timer = 25000;
break;
case 2:
Talk(SAY_AGGRO);
- if (Unit* mellic = Unit::GetUnit(*me, instance->GetData64(DATA_MELLICHAR)))
+ if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MELLICHAR)))
{
//should have a better way to do this. possibly spell exist.
mellic->setDeathState(JUST_DIED);
mellic->SetHealth(0);
- instance->SetData(TYPE_SHIELD_OPEN, IN_PROGRESS);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
}
++Intro_Phase;
Intro_Timer = 3000;
@@ -275,18 +264,15 @@ class boss_harbinger_skyriss : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_harbinger_skyrissAI(creature);
+ return GetArcatrazAI<boss_harbinger_skyrissAI>(creature);
}
};
class boss_harbinger_skyriss_illusion : public CreatureScript
{
public:
+ boss_harbinger_skyriss_illusion() : CreatureScript("boss_harbinger_skyriss_illusion") { }
- boss_harbinger_skyriss_illusion()
- : CreatureScript("boss_harbinger_skyriss_illusion")
- {
- }
struct boss_harbinger_skyriss_illusionAI : public ScriptedAI
{
boss_harbinger_skyriss_illusionAI(Creature* creature) : ScriptedAI(creature) { }
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
new file mode 100644
index 00000000000..2d9bfc92583
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_wrath_scryer_soccothrates
+SD%Complete: 95%
+SDComment: charge left to script
+SDCategory: Tempest Keep, The Arcatraz
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "arcatraz.h"
+
+enum Say
+{
+ // Wrath-Scryer Soccothrates
+ SAY_AGGRO = 1,
+ SAY_SLAY = 2,
+ SAY_KNOCK_AWAY = 3,
+ SAY_DEATH = 4,
+ SAY_DALLIAH_DEATH = 6,
+ SAY_SOCCOTHRATES_CONVO_1 = 7,
+ SAY_SOCCOTHRATES_CONVO_2 = 8,
+ SAY_SOCCOTHRATES_CONVO_3 = 9,
+ SAY_SOCCOTHRATES_CONVO_4 = 10,
+
+ // Dalliah the Doomsayer
+ SAY_AGGRO_SOCCOTHRATES_FIRST = 0,
+ SAY_SOCCOTHRATES_25_PERCENT = 6,
+ SAY_DALLIAH_CONVO_1 = 8,
+ SAY_DALLIAH_CONVO_2 = 9,
+ SAY_DALLIAH_CONVO_3 = 10
+};
+
+enum Spells
+{
+ SPELL_FEL_IMMOLATION = 36051,
+ SPELL_FELFIRE_SHOCK = 35759,
+ SPELL_KNOCK_AWAY = 36512,
+ SPELL_FELFIRE_LINE_UP = 35770,
+ SPELL_CHARGE_TARGETING = 36038,
+ SPELL_CHARGE = 35754
+};
+
+enum Events
+{
+ EVENT_FELFIRE_SHOCK = 1,
+ EVENT_KNOCK_AWAY = 2,
+
+ EVENT_PREFIGHT_1 = 3,
+ EVENT_PREFIGHT_2 = 4,
+ EVENT_PREFIGHT_3 = 5,
+ EVENT_PREFIGHT_4 = 6,
+ EVENT_PREFIGHT_5 = 7,
+ EVENT_PREFIGHT_6 = 8,
+ EVENT_PREFIGHT_7 = 9,
+ EVENT_PREFIGHT_8 = 10,
+ EVENT_PREFIGHT_9 = 11,
+ EVENT_ME_FIRST = 12,
+ EVENT_DALLIAH_DEATH = 13
+};
+
+class boss_wrath_scryer_soccothrates : public CreatureScript
+{
+ public:
+ boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { }
+
+ struct boss_wrath_scryer_soccothratesAI : public BossAI
+ {
+ boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ preFight = false;
+ dalliahTaunt = false;
+ dalliahDeath = false;
+ DoCast(me, SPELL_FEL_IMMOLATION);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ if (dalliah->IsAlive() && !dalliah->IsInCombat())
+ dalliah->AI()->SetData(1, 1);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
+ events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
+ events.ScheduleEvent(EVENT_ME_FIRST, 6000);
+ Talk(SAY_AGGRO);
+ preFight = false;
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void MoveInLineOfSight(Unit* who) OVERRIDE
+ {
+ if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f))
+ {
+ Talk(SAY_SOCCOTHRATES_CONVO_1);
+ instance->SetData(DATA_CONVERSATION, DONE);
+
+ preFight = true;
+ events.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
+ }
+ }
+
+ void SetData(uint32 /*type*/, uint32 data) OVERRIDE
+ {
+ switch (data)
+ {
+ case 1:
+ events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6000);
+ dalliahDeath = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ {
+ if (preFight)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_PREFIGHT_1:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
+ events.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
+ break;
+ case EVENT_PREFIGHT_2:
+ Talk(SAY_SOCCOTHRATES_CONVO_2);
+ events.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
+ break;
+ case EVENT_PREFIGHT_3:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
+ events.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
+ break;
+ case EVENT_PREFIGHT_4:
+ Talk(SAY_SOCCOTHRATES_CONVO_3);
+ events.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
+ break;
+ case EVENT_PREFIGHT_5:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
+ events.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
+ break;
+ case EVENT_PREFIGHT_6:
+ Talk(SAY_SOCCOTHRATES_CONVO_4);
+ events.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
+ break;
+ case EVENT_PREFIGHT_7:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
+ events.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
+ break;
+ case EVENT_PREFIGHT_8:
+ me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f);
+ events.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
+ break;
+ case EVENT_PREFIGHT_9:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ {
+ dalliah->SetFacingToObject(me);
+ me->SetFacingToObject(dalliah);
+ dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f);
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f);
+ preFight = false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (dalliahDeath)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_DALLIAH_DEATH:
+ Talk(SAY_DALLIAH_DEATH);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ return;
+ }
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FELFIRE_SHOCK:
+ DoCastVictim(SPELL_FELFIRE_SHOCK, true);
+ events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
+ break;
+ case EVENT_KNOCK_AWAY:
+ DoCast(me, SPELL_KNOCK_AWAY);
+ Talk(SAY_KNOCK_AWAY);
+ events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
+ break;
+ case EVENT_ME_FIRST:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ if (dalliah->IsAlive() && !dalliah->IsInCombat())
+ dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(25) && !dalliahTaunt)
+ {
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
+ dalliahTaunt = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool preFight;
+ bool dalliahTaunt;
+ bool dalliahDeath;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature);
+ }
+};
+
+void AddSC_boss_wrath_scryer_soccothrates()
+{
+ new boss_wrath_scryer_soccothrates();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
new file mode 100644
index 00000000000..7659f191ff7
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "arcatraz.h"
+
+enum Say
+{
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_SHADOW_NOVA = 2,
+ SAY_DEATH = 3
+};
+
+enum Spells
+{
+ SPELL_VOID_ZONE = 36119,
+ SPELL_SHADOW_NOVA = 36127,
+ SPELL_SEED_OF_CORRUPTION = 36123
+};
+
+enum Events
+{
+ EVENT_VOID_ZONE = 1,
+ EVENT_SHADOW_NOVA = 2,
+ EVENT_SEED_OF_CORRUPTION = 3
+};
+
+class boss_zereketh_the_unbound : public CreatureScript
+{
+ public:
+ boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { }
+
+ struct boss_zereketh_the_unboundAI : public BossAI
+ {
+ boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_VOID_ZONE, urand (6000, 10000));
+ events.ScheduleEvent(EVENT_SHADOW_NOVA, urand (6000, 10000));
+ events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, urand(12000, 20000));
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_VOID_ZONE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
+ DoCast(target, SPELL_VOID_ZONE);
+ events.ScheduleEvent(EVENT_VOID_ZONE, urand (6000, 10000));
+ break;
+ case EVENT_SHADOW_NOVA:
+ DoCastVictim(SPELL_SHADOW_NOVA, true);
+ Talk(SAY_SHADOW_NOVA);
+ events.ScheduleEvent(EVENT_SHADOW_NOVA, urand (6000, 10000));
+ break;
+ case EVENT_SEED_OF_CORRUPTION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
+ DoCast(target, SPELL_SEED_OF_CORRUPTION);
+ events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, urand(12000, 20000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_zereketh_the_unboundAI(creature);
+ }
+};
+
+void AddSC_boss_zereketh_the_unbound()
+{
+ new boss_zereketh_the_unbound();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index e836c5c4bf9..cb7cd3828e2 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,217 +15,120 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Arcatraz
-SD%Complete: 80
-SDComment: Mainly Harbringer Skyriss event
-SDCategory: Tempest Keep, The Arcatraz
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "arcatraz.h"
-#define MAX_ENCOUNTER 9
-
-enum Units
+DoorData const doorData[] =
{
- CONTAINMENT_CORE_SECURITY_FIELD_ALPHA = 184318, //door opened when Wrath-Scryer Soccothrates dies
- CONTAINMENT_CORE_SECURITY_FIELD_BETA = 184319, //door opened when Dalliah the Doomsayer dies
- POD_ALPHA = 183961, //pod first boss wave
- POD_BETA = 183963, //pod second boss wave
- POD_DELTA = 183964, //pod third boss wave
- POD_GAMMA = 183962, //pod fourth boss wave
- POD_OMEGA = 183965, //pod fifth boss wave
- WARDENS_SHIELD = 184802, // warden shield
- SEAL_SPHERE = 184802, //shield 'protecting' mellichar
-
- MELLICHAR = 20904, //skyriss will kill this unit
+ { GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA, DATA_SOCCOTHRATES, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA, DATA_DALLIAH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
-/* Arcatraz encounters:
-1 - Zereketh the Unbound event
-2 - Dalliah the Doomsayer event
-3 - Wrath-Scryer Soccothrates event
-4 - Harbinger Skyriss event, 5 sub-events
-*/
-
class instance_arcatraz : public InstanceMapScript
{
public:
- instance_arcatraz()
- : InstanceMapScript("instance_arcatraz", 552)
- {
- }
+ instance_arcatraz() : InstanceMapScript(ArcatrazScriptName, 552) { }
+
struct instance_arcatraz_InstanceMapScript : public InstanceScript
{
- instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) { }
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
+ instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- uint64 Containment_Core_Security_Field_AlphaGUID;
- uint64 Containment_Core_Security_Field_BetaGUID;
- uint64 Pod_AlphaGUID;
- uint64 Pod_GammaGUID;
- uint64 Pod_BetaGUID;
- uint64 Pod_DeltaGUID;
- uint64 Pod_OmegaGUID;
- uint64 Wardens_ShieldGUID;
- uint64 GoSphereGUID;
- uint64 MellicharGUID;
+ DalliahGUID = 0;
+ SoccothratesGUID = 0;
+ MellicharGUID = 0;
+ WardensShieldGUID = 0;
- void Initialize() OVERRIDE
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ ConversationState = NOT_STARTED;
- Containment_Core_Security_Field_AlphaGUID = 0;
- Containment_Core_Security_Field_BetaGUID = 0;
- Pod_AlphaGUID = 0;
- Pod_GammaGUID = 0;
- Pod_BetaGUID = 0;
- Pod_DeltaGUID = 0;
- Pod_OmegaGUID = 0;
- Wardens_ShieldGUID = 0;
- GoSphereGUID = 0;
- MellicharGUID = 0;
+ memset(StasisPodGUIDs, 0, 5 * sizeof(uint64));
+ memset(StasisPodStates, NOT_STARTED, 5 * sizeof(uint8));
}
- bool IsEncounterInProgress() const OVERRIDE
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
+ switch (creature->GetEntry())
+ {
+ case NPC_DALLIAH:
+ DalliahGUID = creature->GetGUID();
+ break;
+ case NPC_SOCCOTHRATES:
+ SoccothratesGUID = creature->GetGUID();
+ break;
+ case NPC_MELLICHAR:
+ MellicharGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
- case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
- Containment_Core_Security_Field_AlphaGUID = go->GetGUID();
- break;
-
- case CONTAINMENT_CORE_SECURITY_FIELD_BETA:
- Containment_Core_Security_Field_BetaGUID = go->GetGUID();
- break;
-
- case POD_ALPHA:
- Pod_AlphaGUID = go->GetGUID();
- break;
-
- case POD_GAMMA:
- Pod_GammaGUID = go->GetGUID();
- break;
-
- case POD_BETA:
- Pod_BetaGUID = go->GetGUID();
- break;
-
- case POD_DELTA:
- Pod_DeltaGUID = go->GetGUID();
- break;
-
- case POD_OMEGA:
- Pod_OmegaGUID = go->GetGUID();
- break;
-
- case SEAL_SPHERE:
- GoSphereGUID = go->GetGUID();
- break;
-
- /*case WARDENS_SHIELD:
- Wardens_ShieldGUID = go->GetGUID();
- break;*/
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
+ AddDoor(go, true);
+ break;
+ case GO_STASIS_POD_ALPHA:
+ StasisPodGUIDs[0] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_BETA:
+ StasisPodGUIDs[1] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_DELTA:
+ StasisPodGUIDs[2] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_GAMMA:
+ StasisPodGUIDs[3] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_OMEGA:
+ StasisPodGUIDs[4] = go->GetGUID();
+ break;
+ case GO_WARDENS_SHIELD:
+ WardensShieldGUID = go->GetGUID();
+ break;
+ default:
+ break;
}
}
- void OnCreatureCreate(Creature* creature) OVERRIDE
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- if (creature->GetEntry() == MELLICHAR)
- MellicharGUID = creature->GetGUID();
+ switch (go->GetEntry())
+ {
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
{
- case TYPE_ZEREKETH:
- m_auiEncounter[0] = data;
- break;
- case TYPE_DALLIAH:
- if (data == DONE)
- {
- if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[1] = data;
- break;
- case TYPE_SOCCOTHRATES:
- if (data == DONE)
- {
- if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[2] = data;
- break;
- case TYPE_HARBINGERSKYRISS:
- if (data == NOT_STARTED || data == FAIL)
- {
- m_auiEncounter[4] = NOT_STARTED;
- m_auiEncounter[5] = NOT_STARTED;
- m_auiEncounter[6] = NOT_STARTED;
- m_auiEncounter[7] = NOT_STARTED;
- m_auiEncounter[8] = NOT_STARTED;
- }
- m_auiEncounter[3] = data;
- break;
- case TYPE_WARDEN_1:
- if (data == IN_PROGRESS)
- if (GameObject* go = instance->GetGameObject(Pod_AlphaGUID))
- go->UseDoorOrButton();
- m_auiEncounter[4] = data;
- break;
- case TYPE_WARDEN_2:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_BetaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[5] = data;
- break;
- case TYPE_WARDEN_3:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_DeltaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[6] = data;
- break;
- case TYPE_WARDEN_4:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_GammaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[7] = data;
- break;
- case TYPE_WARDEN_5:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_OmegaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[8] = data;
- break;
- case TYPE_SHIELD_OPEN:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Wardens_ShieldGUID))
- go->UseDoorOrButton();
- }
- break;
+ case DATA_WARDEN_1:
+ case DATA_WARDEN_2:
+ case DATA_WARDEN_3:
+ case DATA_WARDEN_4:
+ case DATA_WARDEN_5:
+ if (data == IN_PROGRESS)
+ HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], true);
+ StasisPodStates[type - DATA_WARDEN_1] = uint8(data);
+ break;
+ case DATA_CONVERSATION:
+ ConversationState = uint8(data);
+ break;
+ default:
+ break;
}
}
@@ -234,12 +136,16 @@ class instance_arcatraz : public InstanceMapScript
{
switch (type)
{
- case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3];
- case TYPE_WARDEN_1: return m_auiEncounter[4];
- case TYPE_WARDEN_2: return m_auiEncounter[5];
- case TYPE_WARDEN_3: return m_auiEncounter[6];
- case TYPE_WARDEN_4: return m_auiEncounter[7];
- case TYPE_WARDEN_5: return m_auiEncounter[8];
+ case DATA_WARDEN_1:
+ case DATA_WARDEN_2:
+ case DATA_WARDEN_3:
+ case DATA_WARDEN_4:
+ case DATA_WARDEN_5:
+ return StasisPodStates[type - DATA_WARDEN_1];
+ case DATA_CONVERSATION:
+ return ConversationState;
+ default:
+ break;
}
return 0;
}
@@ -248,11 +154,95 @@ class instance_arcatraz : public InstanceMapScript
{
switch (data)
{
- case DATA_MELLICHAR: return MellicharGUID;
- case DATA_SPHERE_SHIELD: return GoSphereGUID;
+ case DATA_DALLIAH:
+ return DalliahGUID;
+ case DATA_SOCCOTHRATES:
+ return SoccothratesGUID;
+ case DATA_MELLICHAR:
+ return MellicharGUID;
+ case DATA_WARDENS_SHIELD:
+ return WardensShieldGUID;
+ default:
+ break;
}
return 0;
}
+
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_HARBINGER_SKYRISS:
+ if (state == NOT_STARTED || state == FAIL)
+ {
+ SetData(DATA_WARDEN_1, NOT_STARTED);
+ SetData(DATA_WARDEN_2, NOT_STARTED);
+ SetData(DATA_WARDEN_3, NOT_STARTED);
+ SetData(DATA_WARDEN_4, NOT_STARTED);
+ SetData(DATA_WARDEN_5, NOT_STARTED);
+ }
+ break;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "A Z " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(char const* str) OVERRIDE
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'A' && dataHead2 == 'Z')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ protected:
+ uint64 DalliahGUID;
+ uint64 SoccothratesGUID;
+ uint64 StasisPodGUIDs[5];
+ uint64 MellicharGUID;
+ uint64 WardensShieldGUID;
+
+ uint8 ConversationState;
+ uint8 StasisPodStates[5];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
@@ -263,6 +253,6 @@ class instance_arcatraz : public InstanceMapScript
void AddSC_instance_arcatraz()
{
- new instance_arcatraz;
+ new instance_arcatraz();
}
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index a005153a4fc..167fd7f2074 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Blades_Edge_Mountains
SD%Complete: 90
-SDComment: Quest support: 10503, 10504, 10556, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
+SDComment: Quest support: 10503, 10504, 10556, 10594, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
SDCategory: Blade's Edge Mountains
EndScriptData */
@@ -40,6 +40,10 @@ EndContentData */
#include "GridNotifiersImpl.h"
#include "Cell.h"
#include "CellImpl.h"
+#include "SpellInfo.h"
+#include "SpellScript.h"
+#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
//Support for quest: You're Fired! (10821)
bool obelisk_one, obelisk_two, obelisk_three, obelisk_four, obelisk_five;
@@ -1143,6 +1147,99 @@ class go_apexis_relic : public GameObjectScript
}
};
+/*######
+## npc_oscillating_frequency_scanner_master_bunny used for quest 10594 "Gauging the Resonant Frequency"
+######*/
+
+enum ScannerMasterBunny
+{
+ NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY = 21759,
+ SPELL_OSCILLATION_FIELD = 37408,
+ QUEST_GAUGING_THE_RESONANT_FREQUENCY = 10594
+};
+
+class npc_oscillating_frequency_scanner_master_bunny : public CreatureScript
+{
+public:
+ npc_oscillating_frequency_scanner_master_bunny() : CreatureScript("npc_oscillating_frequency_scanner_master_bunny") { }
+
+ struct npc_oscillating_frequency_scanner_master_bunnyAI : public ScriptedAI
+ {
+ npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ if (GetClosestCreatureWithEntry(me, NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY, 25.0f))
+ me->DespawnOrUnsummon();
+ else
+ {
+ // Spell 37392 does not exist in dbc, manually spawning
+ me->SummonCreature(21759, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.5f, me->GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 50000);
+ me->SummonGameObject(184926, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 50000);
+ me->DespawnOrUnsummon(50000);
+ }
+
+ timer = 500;
+ }
+
+ void IsSummonedBy(Unit* summoner) OVERRIDE
+ {
+ if (summoner->isType(TYPEMASK_PLAYER))
+ playerGuid = summoner->GetGUID();
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (timer <= diff)
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
+ DoCast(player, SPELL_OSCILLATION_FIELD);
+
+ timer = 3000;
+ }
+ else
+ timer -= diff;
+ }
+
+ private:
+ uint64 playerGuid;
+ uint32 timer;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_oscillating_frequency_scanner_master_bunnyAI(creature);
+ }
+};
+
+class spell_oscillating_field : public SpellScriptLoader
+{
+ public:
+ spell_oscillating_field() : SpellScriptLoader("spell_oscillating_field") { }
+
+ class spell_oscillating_field_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_oscillating_field_SpellScript);
+
+ void HandleEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* player = GetHitPlayer())
+ if (player->GetAuraCount(SPELL_OSCILLATION_FIELD) == 5 && player->GetQuestStatus(QUEST_GAUGING_THE_RESONANT_FREQUENCY) == QUEST_STATUS_INCOMPLETE)
+ player->CompleteQuest(QUEST_GAUGING_THE_RESONANT_FREQUENCY);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_oscillating_field_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_oscillating_field_SpellScript();
+ }
+};
+
void AddSC_blades_edge_mountains()
{
new npc_bladespire_ogre();
@@ -1157,4 +1254,6 @@ void AddSC_blades_edge_mountains()
new npc_simon_bunny();
new go_simon_cluster();
new go_apexis_relic();
+ new npc_oscillating_frequency_scanner_master_bunny();
+ new spell_oscillating_field();
}
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index db25f9f6158..41abc490d2b 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -1286,7 +1286,7 @@ public:
me->SetTarget(0);
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void HandleAnimation()
{
@@ -1818,7 +1818,7 @@ public:
void Reset() OVERRIDE { }
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void JustDied(Unit* /*killer*/) OVERRIDE
{
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index ef2cd0a3a31..27236be5812 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -458,7 +458,7 @@ public:
}
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void ReceiveEmote(Player* player, uint32 emote) OVERRIDE
{
@@ -753,7 +753,7 @@ public:
}
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void SpellHit(Unit* caster, SpellInfo const* spell) OVERRIDE
{
diff --git a/src/server/shared/Cryptography/HMACSHA1.cpp b/src/server/shared/Cryptography/HMACSHA1.cpp
index c6c49f14a8e..2585fa64ea1 100644
--- a/src/server/shared/Cryptography/HMACSHA1.cpp
+++ b/src/server/shared/Cryptography/HMACSHA1.cpp
@@ -24,6 +24,7 @@ HmacHash::HmacHash(uint32 len, uint8 *seed)
{
HMAC_CTX_init(&m_ctx);
HMAC_Init_ex(&m_ctx, seed, len, EVP_sha1(), NULL);
+ memset(m_digest, 0, sizeof(m_digest));
}
HmacHash::~HmacHash()
diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp
index 356cf15007e..f9c6574ba43 100644
--- a/src/server/shared/DataStores/DBCFileLoader.cpp
+++ b/src/server/shared/DataStores/DBCFileLoader.cpp
@@ -23,7 +23,7 @@
#include "DBCFileLoader.h"
#include "Errors.h"
-DBCFileLoader::DBCFileLoader() : fieldsOffset(NULL), data(NULL), stringTable(NULL) { }
+DBCFileLoader::DBCFileLoader() : recordSize(0), recordCount(0), fieldCount(0), stringSize(0), fieldsOffset(NULL), data(NULL), stringTable(NULL) { }
bool DBCFileLoader::Load(const char* filename, const char* fmt)
{
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 01f059ade0c..e7b4c9fae97 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -178,8 +178,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_INS_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?", CONNECTION_ASYNC); // 0: uint32
PrepareStatement(CHAR_DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
- // 0: uint32, 1: uint8, 3: string, 4: uint32
- PrepareStatement(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ // 0: uint32, 1: uint8, 3: string, 4: uint32, 5: uint32
+ PrepareStatement(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
PrepareStatement(CHAR_DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
PrepareStatement(CHAR_INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)", CONNECTION_ASYNC); // 0: uint32, 1: uint8
@@ -370,16 +370,16 @@ void CharacterDatabaseConnection::DoPrepareStatements()
// Player saving
PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
- "map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, "
+ "map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, "
"taximask, cinematic, "
"totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, talentTree, "
"extra_flags, stable_slots, at_login, zone, "
"death_expire_time, taxi_path, totalKills, "
"todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, "
"power4, power5, latency, speccount, activespec, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES "
- "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
+ "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?,"
- "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
+ "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
"logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,talentTree=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
"totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,"
"watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,latency=?,speccount=?,activespec=?,exploredZones=?,"
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index cfb5eecc5f1..f6754629e38 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -36,7 +36,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC);
- PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s, a.token_key FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH);
PrepareStatement(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC);
diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h
index f5a8d4cd435..437c301ea6b 100644
--- a/src/server/shared/Logging/Appender.h
+++ b/src/server/shared/Logging/Appender.h
@@ -75,7 +75,7 @@ struct LogMessage
///@ Returns size of the log message content in bytes
uint32 Size() const
{
- return prefix.size() + text.size();
+ return static_cast<uint32>(prefix.size() + text.size());
}
};
diff --git a/src/server/shared/Logging/AppenderConsole.cpp b/src/server/shared/Logging/AppenderConsole.cpp
index a1212bd135b..78350029205 100644
--- a/src/server/shared/Logging/AppenderConsole.cpp
+++ b/src/server/shared/Logging/AppenderConsole.cpp
@@ -59,7 +59,7 @@ void AppenderConsole::InitColors(std::string const& str)
void AppenderConsole::SetColor(bool stdout_stream, ColorTypes color)
{
- #if PLATFORM == PLATFORM_WINDOWS
+#if PLATFORM == PLATFORM_WINDOWS
static WORD WinColorFG[MaxColors] =
{
0, // BLACK
@@ -87,7 +87,7 @@ void AppenderConsole::SetColor(bool stdout_stream, ColorTypes color)
HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE);
SetConsoleTextAttribute(hConsole, WinColorFG[color]);
- #else
+#else
enum ANSITextAttr
{
TA_NORMAL = 0,
@@ -156,7 +156,7 @@ void AppenderConsole::ResetColor(bool stdout_stream)
void AppenderConsole::_write(LogMessage const& message)
{
- bool stdout_stream = message.level == LOG_LEVEL_ERROR || message.level == LOG_LEVEL_FATAL;
+ bool stdout_stream = !(message.level == LOG_LEVEL_ERROR || message.level == LOG_LEVEL_FATAL);
if (_colored)
{
diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp
index 54458346bb9..d5410112b97 100644
--- a/src/server/shared/Logging/AppenderFile.cpp
+++ b/src/server/shared/Logging/AppenderFile.cpp
@@ -16,7 +16,10 @@
*/
#include "AppenderFile.h"
-#include "Common.h"
+
+#if PLATFORM == PLATFORM_WINDOWS
+# include <Windows.h>
+#endif
AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* _filename, const char* _logDir, const char* _mode, AppenderFlags _flags, uint64 fileSize):
Appender(id, name, APPENDER_FILE, level, _flags),
@@ -28,7 +31,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, co
fileSize(0)
{
dynamicName = std::string::npos != filename.find("%s");
- backup = _flags & APPENDER_FLAGS_MAKE_FILE_BACKUP;
+ backup = (_flags & APPENDER_FLAGS_MAKE_FILE_BACKUP) != 0;
logfile = !dynamicName ? OpenFile(_filename, _mode, mode == "w" && backup) : NULL;
}
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index 58c22d19df1..bca150b7059 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -75,9 +75,11 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName)
// if type = File. optional1 = file and option2 = mode
// if type = Console. optional1 = Color
std::string options = sConfigMgr->GetStringDefault(appenderName.c_str(), "");
+
Tokenizer tokens(options, ',');
Tokenizer::const_iterator iter = tokens.begin();
- uint8 size = tokens.size();
+
+ size_t size = tokens.size();
std::string name = appenderName.substr(9);
if (size < 2)
@@ -87,8 +89,9 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName)
}
AppenderFlags flags = APPENDER_FLAGS_NONE;
- AppenderType type = AppenderType(atoi(*iter));
- LogLevel level = LogLevel(atoi(*(++iter)));
+ AppenderType type = AppenderType(atoi(*iter++));
+ LogLevel level = LogLevel(atoi(*iter++));
+
if (level > LOG_LEVEL_FATAL)
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name.c_str());
@@ -96,7 +99,7 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName)
}
if (size > 2)
- flags = AppenderFlags(atoi(*(++iter)));
+ flags = AppenderFlags(atoi(*iter++));
switch (type)
{
@@ -105,7 +108,7 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName)
AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags);
appenders[appender->getId()] = appender;
if (size > 3)
- appender->InitColors(*(++iter));
+ appender->InitColors(*iter++);
//fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type CONSOLE, Mask %u\n", appender->getName().c_str(), appender->getId(), appender->getLogLevel());
break;
}
@@ -120,10 +123,10 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName)
return;
}
- filename = *(++iter);
+ filename = *iter++;
if (size > 4)
- mode = *(++iter);
+ mode = *iter++;
if (flags & APPENDER_FLAGS_USE_TIMESTAMP)
{
@@ -136,7 +139,7 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName)
uint64 maxFileSize = 0;
if (size > 5)
- maxFileSize = atoi(*(++iter));
+ maxFileSize = atoi(*iter++);
uint8 id = NextAppenderId();
appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags, maxFileSize);
@@ -188,7 +191,7 @@ void Log::CreateLoggerFromConfig(std::string const& appenderName)
return;
}
- level = LogLevel(atoi(*iter));
+ level = LogLevel(atoi(*iter++));
if (level > LOG_LEVEL_FATAL)
{
fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong Log Level %u for logger %s\n", type, name.c_str());
@@ -198,7 +201,6 @@ void Log::CreateLoggerFromConfig(std::string const& appenderName)
logger.Create(name, level);
//fprintf(stdout, "Log::CreateLoggerFromConfig: Created Logger %s, Level %u\n", name.c_str(), level);
- ++iter;
std::istringstream ss(*iter);
std::string str;
@@ -320,67 +322,8 @@ bool Log::SetLogLevel(std::string const& name, const char* newLevelc, bool isLog
appender->setLogLevel(newLevel);
}
- return true;
-}
-
-void Log::outTrace(std::string const& filter, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
- vlog(filter, LOG_LEVEL_TRACE, str, ap);
-
- va_end(ap);
-}
-
-void Log::outDebug(std::string const& filter, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
-
- vlog(filter, LOG_LEVEL_DEBUG, str, ap);
-
- va_end(ap);
-}
-
-void Log::outInfo(std::string const& filter, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
-
- vlog(filter, LOG_LEVEL_INFO, str, ap);
-
- va_end(ap);
-}
-
-void Log::outWarn(std::string const& filter, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
-
- vlog(filter, LOG_LEVEL_WARN, str, ap);
-
- va_end(ap);
-}
-
-void Log::outError(std::string const& filter, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
-
- vlog(filter, LOG_LEVEL_ERROR, str, ap);
-
- va_end(ap);
-}
-
-void Log::outFatal(std::string const& filter, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
-
- vlog(filter, LOG_LEVEL_FATAL, str, ap);
-
- va_end(ap);
+ return true;
}
void Log::outCharDump(char const* str, uint32 accountId, uint32 guid, char const* name)
@@ -453,6 +396,7 @@ void Log::LoadFromConfig()
if (!m_logsDir.empty())
if ((m_logsDir.at(m_logsDir.length() - 1) != '/') && (m_logsDir.at(m_logsDir.length() - 1) != '\\'))
m_logsDir.push_back('/');
+
ReadAppendersFromConfig();
ReadLoggersFromConfig();
}
diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h
index e2e942d7e9b..af522a6745f 100644
--- a/src/server/shared/Logging/Log.h
+++ b/src/server/shared/Logging/Log.h
@@ -21,8 +21,8 @@
#include "Define.h"
#include "Appender.h"
-#include "LogWorker.h"
#include "Logger.h"
+#include "LogWorker.h"
#include "Dynamic/UnorderedMap.h"
#include <string>
@@ -46,20 +46,15 @@ class Log
bool ShouldLog(std::string const& type, LogLevel level) const;
bool SetLogLevel(std::string const& name, char const* level, bool isLogger = true);
- void outTrace(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4);
- void outDebug(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4);
- void outInfo(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4);
- void outWarn(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4);
- void outError(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4);
- void outFatal(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4);
+ void outMessage(std::string const& f, LogLevel level, char const* str, ...) ATTR_PRINTF(4, 5);
void outCommand(uint32 account, const char * str, ...) ATTR_PRINTF(3, 4);
void outCharDump(char const* str, uint32 account_id, uint32 guid, char const* name);
- static std::string GetTimestampStr();
void SetRealmId(uint32 id);
private:
+ static std::string GetTimestampStr();
void vlog(std::string const& f, LogLevel level, char const* str, va_list argptr);
void write(LogMessage* msg) const;
@@ -112,41 +107,51 @@ inline bool Log::ShouldLog(std::string const& type, LogLevel level) const
return logLevel != LOG_LEVEL_DISABLED && logLevel <= level;
}
+inline void Log::outMessage(std::string const& filter, LogLevel level, const char * str, ...)
+{
+ va_list ap;
+ va_start(ap, str);
+
+ vlog(filter, level, str, ap);
+
+ va_end(ap);
+}
+
#define sLog ACE_Singleton<Log, ACE_Thread_Mutex>::instance()
#if COMPILER != COMPILER_MICROSOFT
-#define TC_LOG_MESSAGE_BODY(level__, call__, filterType__, ...) \
- do { \
- if (sLog->ShouldLog(filterType__, level__)) \
- sLog->call__(filterType__, __VA_ARGS__); \
+#define TC_LOG_MESSAGE_BODY(filterType__, level__, ...) \
+ do { \
+ if (sLog->ShouldLog(filterType__, level__)) \
+ sLog->outMessage(filterType__, level__, __VA_ARGS__); \
} while (0)
#else
-#define TC_LOG_MESSAGE_BODY(level__, call__, filterType__, ...) \
- __pragma(warning(push)) \
- __pragma(warning(disable:4127)) \
- do { \
- if (sLog->ShouldLog(filterType__, level__)) \
- sLog->call__(filterType__, __VA_ARGS__); \
- } while (0) \
+#define TC_LOG_MESSAGE_BODY(filterType__, level__, ...) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable:4127)) \
+ do { \
+ if (sLog->ShouldLog(filterType__, level__)) \
+ sLog->outMessage(filterType__, level__, __VA_ARGS__); \
+ } while (0) \
__pragma(warning(pop))
#endif
#define TC_LOG_TRACE(filterType__, ...) \
- TC_LOG_MESSAGE_BODY(LOG_LEVEL_TRACE, outTrace, filterType__, __VA_ARGS__)
+ TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_TRACE, __VA_ARGS__)
#define TC_LOG_DEBUG(filterType__, ...) \
- TC_LOG_MESSAGE_BODY(LOG_LEVEL_DEBUG, outDebug, filterType__, __VA_ARGS__)
+ TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_DEBUG, __VA_ARGS__)
#define TC_LOG_INFO(filterType__, ...) \
- TC_LOG_MESSAGE_BODY(LOG_LEVEL_INFO, outInfo, filterType__, __VA_ARGS__)
+ TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_INFO, __VA_ARGS__)
#define TC_LOG_WARN(filterType__, ...) \
- TC_LOG_MESSAGE_BODY(LOG_LEVEL_WARN, outWarn, filterType__, __VA_ARGS__)
+ TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_WARN, __VA_ARGS__)
#define TC_LOG_ERROR(filterType__, ...) \
- TC_LOG_MESSAGE_BODY(LOG_LEVEL_ERROR, outError, filterType__, __VA_ARGS__)
+ TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_ERROR, __VA_ARGS__)
#define TC_LOG_FATAL(filterType__, ...) \
- TC_LOG_MESSAGE_BODY(LOG_LEVEL_FATAL, outFatal, filterType__, __VA_ARGS__)
+ TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_FATAL, __VA_ARGS__)
#endif
diff --git a/src/server/shared/Logging/Logger.cpp b/src/server/shared/Logging/Logger.cpp
index ea8ed27ed03..6fff993e2ae 100644
--- a/src/server/shared/Logging/Logger.cpp
+++ b/src/server/shared/Logging/Logger.cpp
@@ -25,13 +25,6 @@ void Logger::Create(std::string const& _name, LogLevel _level)
level = _level;
}
-Logger::~Logger()
-{
- for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it)
- it->second = NULL;
- appenders.clear();
-}
-
std::string const& Logger::getName() const
{
return name;
@@ -49,12 +42,7 @@ void Logger::addAppender(uint8 id, Appender* appender)
void Logger::delAppender(uint8 id)
{
- AppenderMap::iterator it = appenders.find(id);
- if (it != appenders.end())
- {
- it->second = NULL;
- appenders.erase(it);
- }
+ appenders.erase(id);
}
void Logger::setLogLevel(LogLevel _level)
@@ -66,7 +54,7 @@ void Logger::write(LogMessage& message) const
{
if (!level || level > message.level || message.text.empty())
{
- //fprintf(stderr, "Logger::write: Logger %s, Level %u. Msg %s Level %u WRONG LEVEL MASK OR EMPTY MSG\n", getName().c_str(), messge.level, message.text.c_str(), .message.level); // DEBUG - RemoveMe
+ //fprintf(stderr, "Logger::write: Logger %s, Level %u. Msg %s Level %u WRONG LEVEL MASK OR EMPTY MSG\n", getName().c_str(), getLogLevel(), message.text.c_str(), message.level);
return;
}
diff --git a/src/server/shared/Logging/Logger.h b/src/server/shared/Logging/Logger.h
index e9d39830ce6..24727ce1016 100644
--- a/src/server/shared/Logging/Logger.h
+++ b/src/server/shared/Logging/Logger.h
@@ -24,7 +24,6 @@ class Logger
{
public:
Logger();
- ~Logger();
void Create(std::string const& name, LogLevel level);
void addAppender(uint8 type, Appender *);
diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index ffeeafc8951..3fcd4c28f0f 100644
--- a/src/server/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
@@ -86,7 +86,12 @@ private:
uint32 _lastChange;
uint32 _delaytime;
public:
- FreezeDetectorRunnable() { _delaytime = 0; }
+ FreezeDetectorRunnable()
+ {
+ _loops = 0;
+ _lastChange = 0;
+ _delaytime = 0;
+ }
void SetDelayTime(uint32 t) { _delaytime = t; }